opencode-swarm 7.200.6 → 7.200.7

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 (70) hide show
  1. package/binaries/win32-arm64/swarm-sandbox-runner.exe +0 -0
  2. package/binaries/win32-x64/swarm-sandbox-runner.exe +0 -0
  3. package/dist/cli/{attest-task-10qxnfg0.js → attest-task-rp4xn5wh.js} +31 -27
  4. package/dist/cli/{auto-checkpoint-n4wjv3c3.js → auto-checkpoint-a6x7bw5k.js} +4 -4
  5. package/dist/cli/{checkpoint-hce4bjpa.js → checkpoint-kpgmse11.js} +8 -8
  6. package/dist/cli/{coder-settlement-wzccs5q0.js → coder-settlement-f54sfmaj.js} +4 -3
  7. package/dist/cli/{config-doctor-zmrk4e62.js → config-doctor-hpakt9zz.js} +7 -7
  8. package/dist/cli/{core-91vc3hm8.js → core-m2x9w49f.js} +1 -1
  9. package/dist/cli/{curator-drift-jnnfryzt.js → curator-drift-hxfzkkhg.js} +5 -5
  10. package/dist/cli/{curator-mx34qmvj.js → curator-ghjq55v7.js} +25 -25
  11. package/dist/cli/{curator-llm-factory-mj9nwpqy.js → curator-llm-factory-b3hk73vd.js} +25 -25
  12. package/dist/cli/{doctor-knowledge-receipt-phase-id-wsv9av6b.js → doctor-knowledge-receipt-phase-id-wk9vry5a.js} +4 -4
  13. package/dist/cli/{evidence-summary-service-t8jxvzse.js → evidence-summary-service-gf50zpwx.js} +9 -9
  14. package/dist/cli/{gate-evidence-13evayfx.js → gate-evidence-7my0f82h.js} +7 -2
  15. package/dist/cli/{guardrail-explain-w69nx4h3.js → guardrail-explain-e1ck0csp.js} +26 -26
  16. package/dist/cli/{guardrail-log-em42cpeg.js → guardrail-log-hkkkwmj1.js} +3 -3
  17. package/dist/cli/{guardrail-reset-1z11c474.js → guardrail-reset-wwnbcexb.js} +25 -25
  18. package/dist/cli/{hive-promoter-et6yf4e4.js → hive-promoter-4nzbfwcd.js} +25 -25
  19. package/dist/cli/{index-yd8k2081.js → index-0fbtnkyw.js} +25 -25
  20. package/dist/cli/{index-fjh70sfg.js → index-223g5dj9.js} +5 -5
  21. package/dist/cli/{index-kdp4rk4p.js → index-39pge60a.js} +1 -1
  22. package/dist/cli/{index-qxse4xm5.js → index-5djd4vrn.js} +1 -1
  23. package/dist/cli/{index-w747vv23.js → index-6e75mvmn.js} +1 -1
  24. package/dist/cli/{index-6cgh59z6.js → index-6phyfsvn.js} +3 -3
  25. package/dist/cli/{index-ehcp9r1f.js → index-7r9yg7h1.js} +1 -1
  26. package/dist/cli/{index-50h4hrhe.js → index-87kk5dqm.js} +60 -60
  27. package/dist/cli/{index-e5b0ayxw.js → index-8k6jd7a9.js} +3 -3
  28. package/dist/cli/{index-wxh0624z.js → index-bgcanr26.js} +1 -1
  29. package/dist/cli/{index-n2vx9eb0.js → index-c0dbzf9v.js} +3 -3
  30. package/dist/cli/{index-zq1gna9j.js → index-f3ed5wde.js} +1 -1
  31. package/dist/cli/{index-zv45anwx.js → index-f4tht67a.js} +1 -1
  32. package/dist/cli/{index-bkdkkxxe.js → index-g5hghxgw.js} +1 -1
  33. package/dist/cli/{index-1j9g90y9.js → index-h9hgxbsw.js} +1 -1
  34. package/dist/cli/{index-z4qhqws0.js → index-jfkzhyqs.js} +3 -3
  35. package/dist/cli/{index-tw0bn65v.js → index-k69vjyfm.js} +1 -1
  36. package/dist/cli/{index-ykwya5ff.js → index-kmnyh4r1.js} +2 -2
  37. package/dist/cli/{index-r9x74612.js → index-mkkwhrtn.js} +2 -2
  38. package/dist/cli/{index-cbhkyfmm.js → index-mnpcwcqf.js} +2 -2
  39. package/dist/cli/{index-yy7hq6c5.js → index-p61vaebj.js} +2 -2
  40. package/dist/cli/{index-k3nhzhkz.js → index-q8fy8cxa.js} +3 -3
  41. package/dist/cli/{index-zfzgt2hj.js → index-qc3qqknb.js} +4 -4
  42. package/dist/cli/{index-j2736j97.js → index-ramxwbtt.js} +6 -6
  43. package/dist/cli/{index-gjzfy7zw.js → index-rjtf507t.js} +48 -3
  44. package/dist/cli/{index-he1xpa9h.js → index-sy15gtjr.js} +3 -3
  45. package/dist/cli/{index-hfzyp68b.js → index-vhkk8grb.js} +27 -27
  46. package/dist/cli/{index-h21p9f69.js → index-vsqc38a0.js} +1 -1
  47. package/dist/cli/{index-9ww8f1e9.js → index-wkz6w3yy.js} +3 -3
  48. package/dist/cli/{index-n61daqkj.js → index-y76sev7j.js} +2 -2
  49. package/dist/cli/index.js +26 -26
  50. package/dist/cli/{knowledge-escalator-6h3bwf6q.js → knowledge-escalator-cx03qhmc.js} +7 -7
  51. package/dist/cli/{knowledge-events-wp1j51h6.js → knowledge-events-cfdd3syn.js} +5 -5
  52. package/dist/cli/{knowledge-store-98jhzs3k.js → knowledge-store-fgwc40g2.js} +1 -1
  53. package/dist/cli/{knowledge-validator-jttph6bb.js → knowledge-validator-hvah3jxx.js} +2 -2
  54. package/dist/cli/{mcp-3fbk6v7e.js → mcp-1crekab3.js} +1 -1
  55. package/dist/cli/{model-preflight-vps41qvj.js → model-preflight-knjgtnwb.js} +25 -25
  56. package/dist/cli/{pending-delegations-f3yj2qxg.js → pending-delegations-3a2tgmgq.js} +2 -2
  57. package/dist/cli/{pr-subscriptions-ash398n1.js → pr-subscriptions-8yprtmt7.js} +1 -1
  58. package/dist/cli/{pr-workflow-gate-6za22msz.js → pr-workflow-gate-fcpvkwg8.js} +25 -25
  59. package/dist/cli/{scan-cursor-15x71ymh.js → scan-cursor-a776c7b6.js} +2 -2
  60. package/dist/cli/{schema-69za4986.js → schema-evj1vbxz.js} +1 -1
  61. package/dist/cli/{scope-persistence-6qnvpm85.js → scope-persistence-s1e120ba.js} +5 -5
  62. package/dist/cli/{server-cdpsjzsp.js → server-exd3q95h.js} +25 -25
  63. package/dist/cli/{skill-generator-q77jzyw0.js → skill-generator-6r8pxx5z.js} +8 -8
  64. package/dist/cli/{snapshot-coordination-init-gz9ak1be.js → snapshot-coordination-init-z8b9twvf.js} +25 -25
  65. package/dist/cli/{speckit-checkoff-59xs6f5t.js → speckit-checkoff-hhbcq87w.js} +3 -3
  66. package/dist/cli/{worktree-collision-ownership-8zm5z35p.js → worktree-collision-ownership-waf8d48d.js} +2 -2
  67. package/dist/cli/{worktree-isolation-f7khy039.js → worktree-isolation-ea4qe5f5.js} +25 -25
  68. package/dist/gate-evidence.d.ts +20 -0
  69. package/dist/index.js +5 -5
  70. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import{createRequire}from"node:module";var __create=Object.create;var{getPrototypeOf:__getProtoOf,defineProperty:__defProp,getOwnPropertyNames:__getOwnPropNames,getOwnPropertyDescriptor:__getOwnPropDesc}=Object,__hasOwnProp=Object.prototype.hasOwnProperty;function __accessProp(key){return this[key]}var __toESMCache_node,__toESMCache_esm,__toESM=(mod,isNodeMode,target)=>{var canCache=mod!=null&&typeof mod==="object";if(canCache){var cache=isNodeMode?__toESMCache_node??=new WeakMap:__toESMCache_esm??=new WeakMap,cached=cache.get(mod);if(cached)return cached}target=mod!=null?__create(__getProtoOf(mod)):{};let to=isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target;for(let key of __getOwnPropNames(mod))if(!__hasOwnProp.call(to,key))__defProp(to,key,{get:__accessProp.bind(mod,key),enumerable:!0});if(canCache)cache.set(mod,to);return to},__toCommonJS=(from)=>{var entry=(__moduleCache??=new WeakMap).get(from),desc;if(entry)return entry;if(entry=__defProp({},"__esModule",{value:!0}),from&&typeof from==="object"||typeof from==="function"){for(var key of __getOwnPropNames(from))if(!__hasOwnProp.call(entry,key))__defProp(entry,key,{get:__accessProp.bind(from,key),enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable})}return __moduleCache.set(from,entry),entry},__moduleCache,__commonJS=(cb,mod)=>()=>(mod||cb((mod={exports:{}}).exports,mod),mod.exports);var __returnValue=(v)=>v;function __exportSetter(name,newValue){this[name]=__returnValue.bind(null,newValue)}var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0,configurable:!0,set:__exportSetter.bind(all,name)})};var __esm=(fn2,res)=>()=>(fn2&&(res=fn2(fn2=0)),res);var __require=createRequire(import.meta.url);var package_default;var init_package=__esm(()=>{package_default={name:"opencode-swarm",version:"7.200.6",description:"Architect-centric agentic swarm plugin for OpenCode - hub-and-spoke orchestration with SME consultation, code generation, and QA review",main:"dist/index.js",types:"dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",default:"./dist/index.js"},"./package.json":"./package.json"},bin:{"opencode-swarm":"./dist/cli/index.js"},type:"module",engines:{bun:">=1.3.13",node:">=22.13"},license:"MIT",repository:{type:"git",url:"https://github.com/ZaxbyHub/opencode-swarm.git"},publishConfig:{access:"public",registry:"https://registry.npmjs.org/"},keywords:["opencode","opencode-plugin","ai","agents","orchestration","swarm","multi-agent","llm"],files:["dist","dist/lang/grammars","binaries","evaluation-fixtures",".opencode/skills/brainstorm",".opencode/skills/specify",".opencode/skills/clarify-spec",".opencode/skills/swarm-resume",".opencode/skills/clarify",".opencode/skills/discover",".opencode/skills/consult",".opencode/skills/pre-phase-briefing",".opencode/skills/council",".opencode/skills/deep-dive",".opencode/skills/deep-research",".opencode/skills/codebase-review-swarm",".opencode/skills/swarm-implement",".opencode/skills/design-docs",".opencode/skills/swarm-pr-review",".opencode/skills/swarm",".opencode/skills/swarm-pr-feedback",".opencode/skills/swarm-pr-subscribe",".opencode/skills/swarm-ci-monitor",".opencode/skills/issue-ingest",".opencode/skills/swarm-plan",".opencode/skills/critic-gate",".opencode/skills/execute",".opencode/skills/phase-wrap",".opencode/skills/loop",".opencode/skills/writing-tests",".opencode/skills/running-tests",".opencode/skills/engineering-conventions",".opencode/skills/commit-pr",".opencode/skills/ci-failure-batching",".opencode/skills/gate-attribution",".opencode/skills/merge-queue-readiness",".opencode/skills/skill-edit-validation",".opencode/skills/worktree-retry-cleanup",".opencode/skills/test-file-split",".opencode/skills/fork-pr-operations",".opencode/skills/parallel-work-check",".opencode/skills/ci-fix-monitor",".opencode/skills/issue-tracer",".opencode/skills/orchestrating-subagents",".opencode/skills/durable-session-state","tests/fixtures/memory-recall","tests/fixtures/memory-recall-heldout","opencode-swarm.schema.json","README.md","LICENSE"],scripts:{clean:`bun -e "require('fs').rmSync('dist',{recursive:true,force:true})"`,build:"bun run clean && bun run scripts/generate-config-schema.ts && bun run scripts/copy-grammars.ts && bun build src/index.ts --outdir dist --target node --format esm --external web-tree-sitter --minify-whitespace --minify-syntax && bun build src/cli/index.ts --outdir dist/cli --target bun --format esm --external bash-parser --splitting && bun run scripts/copy-grammars.ts --to-dist && tsc --emitDeclarationOnly",typecheck:"tsc --noEmit",test:"bun test",lint:"biome lint .","lint:ci":"biome ci .","test:unit:ci":"bun scripts/ci/run-unit-tests-local.ts","validate:repo":"bun scripts/ci/repository-validation.ts","drift:check":"bun run scripts/drift-check.ts","check:pre-push":"bun run scripts/drift-check.ts --enforce --no-report && bun run check:registry-citations","schema:generate":"bun run scripts/generate-config-schema.ts","generate:commands-docs":"bun run scripts/generate-commands-docs.ts","check:runtime-src-refs":"bun run scripts/check-runtime-src-refs.ts","drift:fix":"bun run scripts/drift-check.ts --fix --confirm","skills:sync":"bun run scripts/sync-qa-gate-skills.ts",format:"biome format . --write",check:"biome check --write .",dev:"bun run build && opencode","package:smoke":"node scripts/package-smoke.mjs",prepare:"bun run build","repro:704":"node scripts/repro-704.mjs","repro:2669":"node scripts/repro-2669.mjs","repro:2670":"node scripts/repro-2670.mjs","repro:1144":"bun scripts/repro-1144.mjs","repro:1873":"bun build scripts/repro-1873-entry.ts --outdir dist-build-test/repro-1873 --target node --format esm && node scripts/repro-1873.mjs","repro:2487":"bun build scripts/repro-2487-parity-entry.ts --outdir dist-build-test/repro-2487 --target node --format esm && node scripts/repro-2487-parity.mjs","check:events":"bun run scripts/check-event-contract.ts","check:retention":"bun run scripts/check-retention-registry.ts","check:core-events":"bun run scripts/check-core-events-usage.ts","check:shell-audit":"bun run scripts/check-shell-audit-usage.ts","check:trajectory-store":"bun run scripts/check-trajectory-store-usage.ts","check:mock-cleanup":"bun run scripts/check-mock-cleanup.ts","check:invariants":"bun run scripts/check-invariants.ts","check:token-formula":"bun run scripts/check-token-formula.ts","check:cross-contamination":"bun run scripts/check-cross-contamination.ts","check:test-clock":"bun run scripts/check-test-clock.ts","check:test-file-cap":"bun run scripts/check-test-file-cap.ts","check:test-tmpdir":"bun run scripts/check-test-tmpdir.ts","check:bash-portability":"bun run scripts/check-bash-portability.ts","check:pending-fragment":"bun run scripts/check-pending-fragment.ts","check:gate-portability":"bun run scripts/check-gate-portability.ts","check:bare-spawn":"bun run scripts/check-bare-executable-spawn.ts","check:error-channel-discard":"bun run scripts/check-error-channel-discard.ts","check:path-identity":"bun run scripts/check-path-identity.ts","check:registry-citations":"bun run scripts/check-registry-citations.ts","check:memory-recall":"bun run scripts/memory-recall-regression.ts","check:retrieval-quality":"bun run scripts/retrieval-quality-regression.ts"},dependencies:{"@modelcontextprotocol/sdk":"^1.30.0","@opencode-ai/plugin":"^1.18.3","@opencode-ai/sdk":"^1.18.3","@vscode/tree-sitter-wasm":"^0.3.0","bash-parser":"^0.5.0","p-limit":"^7.3.0",picomatch:"^4.0.4","proper-lockfile":"^4.1.2","quick-lru":"^7.3.0","web-tree-sitter":"^0.25.0",zod:"4.3.6"},devDependencies:{"@biomejs/biome":"2.3.14","@types/picomatch":"^4.0.3","bun-types":"1.3.8","js-yaml":"^4.1.1",typescript:"^5.7.3"},peerDependencies:{"@xenova/transformers":"^2.17.2"},peerDependenciesMeta:{"@xenova/transformers":{optional:!0}}}});var QA_AGENTS,PIPELINE_AGENTS,ORCHESTRATOR_NAME="architect",ALL_SUBAGENT_NAMES,ALL_AGENT_NAMES;var init_agent_names=__esm(()=>{QA_AGENTS=["reviewer","critic","critic_oversight","critic_finding_validator"],PIPELINE_AGENTS=["explorer","coder","test_engineer"],ALL_SUBAGENT_NAMES=["sme","researcher","docs","docs_design","designer","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic_architecture_supervisor","curator_init","curator_phase","curator_postmortem","curator_consolidation","council_generalist","council_skeptic","council_domain_expert","skill_improver","spec_writer",...QA_AGENTS,...PIPELINE_AGENTS],ALL_AGENT_NAMES=["architect",...ALL_SUBAGENT_NAMES]});function getPrWorkflowToolCapability(toolName,mode){let metadata=TOOL_METADATA[toolName];if(!metadata?.prWorkflow?.modes.includes(mode))return null;return metadata.prWorkflow.capability}var TOOL_METADATA,TOOL_NAMES,TOOL_NAME_SET,TOOL_DESCRIPTIONS,AGENT_TOOL_MAP;var init_tool_metadata=__esm(()=>{init_agent_names();TOOL_METADATA={diff:{description:"structured git diff with contract change detection",agents:["architect","reviewer","critic_finding_validator","critic_oversight","coder","test_engineer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},diff_summary:{description:"filter classified AST changes by category, risk level, or file for reviewer drill-down",agents:["architect","reviewer","critic_finding_validator","critic_oversight"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},syntax_check:{description:"check syntax of source files using tree-sitter parsers across multiple languages, returning per-file errors",agents:["architect","coder","test_engineer"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},placeholder_scan:{description:"todo and FIXME comment detection",agents:["architect","reviewer","critic_finding_validator"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},imports:{description:"find all consumers that import from a given file — use before refactoring shared modules to avoid breaking unseen dependents",agents:["architect","sme","researcher","docs","docs_design","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","reviewer","critic_finding_validator","critic","coder","test_engineer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},lint:{description:"run project linter in check or fix mode; supports biome, eslint, ruff, clippy, and more, returns structured results",agents:["architect","reviewer","critic_finding_validator","coder"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},secretscan:{description:"scan for secrets (API keys, tokens, passwords) via regex and entropy; returns redacted previews, excludes common dirs",agents:["architect","reviewer","critic_finding_validator","critic_oversight"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},sast_scan:{description:"static analysis security scan",agents:["architect","reviewer","critic_finding_validator","critic_oversight"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},build_check:{description:"discover and run build, typecheck, and test commands for various project ecosystems in the working directory",agents:["architect","coder","test_engineer"]},pre_check_batch:{description:"parallel verification: lint:check + secretscan + sast_scan + quality_budget",agents:["architect","reviewer","critic_finding_validator"]},quality_budget:{description:"code quality budget check",agents:["architect"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},symbols:{description:"extract exported symbols (functions, classes, interfaces, types) from source files; supports TypeScript, JavaScript, Python, Rust, Go, Dart, Ruby, PHP, and Java",agents:["architect","sme","researcher","docs","docs_design","designer","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","spec_writer","reviewer","critic_finding_validator","critic","coder","test_engineer"]},complexity_hotspots:{description:"git churn × complexity risk map",agents:["architect","sme","researcher","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","reviewer","critic_finding_validator","critic","critic_oversight","explorer","test_engineer"]},schema_drift:{description:"OpenAPI spec vs route drift",agents:["architect","sme","researcher","docs","explorer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},todo_extract:{description:"structured TODO/FIXME extraction; with task_id, records the high-priority count as todo_scan gate evidence",agents:["architect","researcher","docs","explorer","coder"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},evidence_check:{description:"verify task evidence completeness",agents:["architect","critic_oversight"]},check_gate_status:{description:"check the gate status of a specific task",agents:["architect","critic_oversight"]},completion_verify:{description:"verify completed tasks have required evidence",agents:["architect","critic_oversight"]},complete_pr_workflow:{description:"validate terminal PR workflow evidence and clear its durable session gate",agents:["architect"]},abort_pr_workflow:{description:"abort an unrecoverable PR_REVIEW/PR_FEEDBACK mechanical gate and clear its durable session state",agents:["architect"]},authorize_pr_review_reentry:{description:"issue a one-use, identity-bound reviewer/test_engineer re-entry authorization for the active PR_REVIEW workflow (issue #2383)",agents:["architect"]},submit_pr_review_result:{description:"submit one child-bound typed result for an active PR-review base or micro discovery lane",agents:[],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},approve_plan_critic:{description:"record a MANUAL plan_critic_gate approval snapshot to unblock the ratchet-tighter critic_pre_plan execution gate when the critic already returned APPROVED but the mechanical recorder failed to persist it (issue #2012), or as the sanctioned recovery for a bookkeeping-grade hashed-field repair under the critic-gate PLAN FREEZE rule (the reason must state which case applies)",agents:["architect"]},approve_retry_sounding_board:{description:"record a MANUAL critic_sounding_board gate entry to unblock the coder retry circuit-breaker gate when the sounding board returned APPROVED but the mechanical recorder missed it (issue #2703)",agents:["architect"]},recover_rework_task:{description:"recover a task wedged at rework_required when the reviewer/test_engineer verdict did not require a code change: write a supervised stage_a_passed so those gates can be re-dispatched without re-running the coder (issue #2755)",agents:["architect"]},recover_stage_a_task:{description:"recover a task wedged in the settlement-backed Stage A deadlock — workflow at idle/blocked while a COMMITTED accepted coder settlement and green post-settlement pre-check proof justify Stage A: write a settlement-backed stage_a_passed so reviewer/test_engineer can be dispatched, without re-running the coder (issue #2828)",agents:["architect"]},prepare_pr_workflow_checkout:{description:"prepare an auditable PR workflow checkout or restore its exact original branch/HEAD and preserved stash after terminal cleanup",agents:["architect"]},invalidate_pr_feedback_publication:{description:"invalidate the armed PR_FEEDBACK publication generation so approved content can change, superseding every content-dependent approval and reopening the exact scoped rework + fresh-review path (issue #2108)",agents:["architect"]},record_implementation_review:{description:"record fresh-context reviewer + critic APPROVE verdicts for the implementation diff so the /swarm issue --trace workflow can satisfy its review gate before commit-pr handoff",agents:["architect"]},record_issue_publication:{description:"record a publication receipt so the /swarm issue --trace workflow reaches its terminal published state after the PR is created/updated",agents:["architect"]},record_issue_reproduction:{description:"record the reproduction outcome for the current traced issue so the /swarm issue --trace workflow can satisfy its reproduction gate and transition to PLAN",agents:["architect"]},record_recurrence_sweep:{description:"record the recurrence sweep (defect class, predicates, hit dispositions, guardrail proof, related-problems results) so the /swarm issue --trace workflow can satisfy its recurrence gate before commit-pr handoff",agents:["architect"]},record_branch_freshness:{description:"record the Phase 0 branch-freshness outcome (synced / behind:<n> / fetch-failed:<reason> plus optional user override) so the /swarm issue --trace workflow can pass its freshness gate before transitioning to PLAN (issue #2564)",agents:["architect"]},record_trace_validation:{description:"record one per-phase trace-check.sh validator outcome (phase, pass/fail, reviewedCommit, treeId) so the /swarm issue --trace workflow can satisfy its validator-receipt gate before commit-pr handoff (issue #2564)",agents:["architect"]},record_merge_approval:{description:"record the human merge approval bound to the exact PR head SHA so the /swarm issue --trace workflow reaches its terminal merge_approval_recorded state — recorded for audit only, never certified or driven by the plugin (issue #2564)",agents:["architect"]},rebind_pr_feedback_head:{description:"rebind a PR_FEEDBACK workflow to a new verified remote PR head after merge/rebase/conflict repair, invalidating ancestry-bound receipts so the mechanical ladder re-runs",agents:["architect"]},run_pr_feedback_stage_a:{description:"execute and persist mandatory PR-feedback Stage A checks on a content-bound revision",agents:["architect"]},submit_council_verdicts:{description:"submit pre-collected council member verdicts for synthesis (architect MUST dispatch critic/reviewer/sme/test_engineer/explorer as Agent tasks first; this tool synthesizes only, it does not contact members)",agents:[]},submit_phase_council_verdicts:{description:"submit pre-collected phase-level council member verdicts for holistic phase synthesis (architect MUST dispatch all 5 council members with phase-scoped context first; this tool synthesizes only, it does not contact members)",agents:[]},declare_council_criteria:{description:"pre-declare acceptance criteria for a task before the coder starts work; criteria are read back during council evaluation",agents:[]},sbom_generate:{description:"SBOM generation for dependency inventory",agents:["architect"]},checkpoint:{description:"create named git checkpoints for save, restore, and delete — use before risky operations to enable rollback; a destructive restore previews first and requires the confirm_token issued in the preview (#2946)",agents:["architect"]},pkg_audit:{description:"dependency vulnerability scan — npm/pip/cargo",agents:["architect","critic_hallucination_verifier","reviewer","critic_finding_validator","critic_oversight","test_engineer"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},parse_lane_candidates:{description:"Parse [CANDIDATE] rows from a dispatch_lanes or collect_lane_results artifact (by output_ref), produce structured records with provenance, optionally persist to a per-batch sidecar JSONL. Pure-parser variant exists as internal module.",agents:["architect"]},plan_conflict_check:{description:"read-only advisory check (#1656): compute a pairwise file-conflict matrix for N proposed parallel task groups using declared scopes and optional git co-change; returns a verdict (all_disjoint / conflicts_present / unknown_scopes), per-pair evidence, and a suggested serialization order. Writes nothing — the execution gate independently recomputes the verdict inline at dispatch time via the same helper. Call BEFORE attempting parallel dispatch to confirm disjointness.",agents:["architect"]},write_pr_review_trigger_eval:{description:"persist the complete PR-review trigger evaluation with exact-set validation, dispatch provenance, and live merge-base verification",agents:["architect"]},write_pr_review_artifact:{description:"persist schema-validated PR-review findings checkpoints and exact actionable feedback handoffs under the active run; reviewer verdicts marked `UNVERIFIED` persist to the findings ledger as `PENDING` records routed back to the reviewer — do not resubmit a row whose verdict is already recorded",agents:["architect"]},pr_review_submission:{description:"submit a settled, head-bound PR review to GitHub through the gh PR Review API after the PR_REVIEW gate clears; architect-only, refuses while a gate is active or the run was aborted after settlement",agents:["architect"]},export_pr_review_partial_results:{description:"export the validated partial results of an ABORTED PR_REVIEW run as a partial, non-authoritative artifact bound per-item to receipt-authenticated findings; architect-only, requires the gate cleared and an abort event binding session and head, never implies completion or feedback consent",agents:["architect"]},prepare_pr_feedback_scope:{description:"prepare an exact file scope for one PR-feedback coder Task after immutable feedback verification settles",agents:["architect"]},prepare_pr_feedback_commit_message:{description:"author a PR_FEEDBACK commit message that cannot go inline (e.g. a Co-Authored-By trailer) into a file OUTSIDE the repository; returns the path for git commit -F",agents:["architect"]},test_runner:{description:"auto-detect and run tests",agents:["architect","reviewer","critic_finding_validator","test_engineer"]},test_impact:{description:"identify test files impacted by changed source files via import analysis",agents:["architect","reviewer","critic_finding_validator","critic_oversight","test_engineer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},mutation_test:{description:"executes pre-generated mutation patches against tests, evaluates kill rate against quality gate thresholds; test selection comes from explicit files (override) or source_files derived via the impact analyzer with a typed bounded fallback",agents:["architect","test_engineer"]},generate_mutants:{description:"generate LLM-based mutation testing patches for source files; returns MutationPatch[] for direct consumption by the mutation_test tool",agents:["architect"]},detect_domains:{description:"detect which SME domains are relevant for a given text",agents:["architect","sme","docs","docs_design","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic","critic_oversight","explorer"]},git_blame:{description:"per-line git blame metadata: sha, author, date, summary for each line in a file",agents:["reviewer","critic_finding_validator","explorer","architect"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},gitingest:{description:"fetch a GitHub repository full content via gitingest.com",agents:["architect","docs","explorer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},retrieve_summary:{description:"retrieve the full content of a stored tool output summary",agents:["architect","sme","docs","docs_design","designer","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic_architecture_supervisor","spec_writer","reviewer","critic_finding_validator","critic","coder","test_engineer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},retrieve_lane_output:{description:"retrieve paged full dispatch lane output by output_ref; use before consuming truncated lane previews or routing candidates from lane results",agents:["architect"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},extract_code_blocks:{description:"extract code blocks from text content and save them to files",agents:["docs","docs_design","designer","spec_writer","coder","test_engineer"]},phase_complete:{description:"preflight every applicable phase gate, report all blockers, and atomically commit a current passing snapshot",agents:["architect"]},run_phase_review:{description:"run the bounded phase-final review engine and persist complete content-addressed review evidence",agents:["architect"]},repair_gate_evidence:{description:"quarantine recoverable exact-task gate evidence, rebuild from durable requirements, recover receipt-backed legacy marker wedges or the exact sentinel-only historical reset, and refuse every other receipt-less reconstruction",agents:["architect"]},repair_knowledge_receipt_ledger:{description:"validate or repair authoritative knowledge receipts, preserve corrupt authority in bounded quarantine, require scoped re-evaluation, and backfill stable phase ids across the whole ledger (operation backfill_phase_id; phase/session_id do not scope the backfill)",agents:["architect"]},record_directive_override:{description:"record an audited architect override for identified critical-directive violations without bypassing unreadable authority",agents:["architect"]},save_plan:{description:"save a structured implementation plan",agents:["architect"]},update_task_status:{description:"mark tasks complete, track phase progress",agents:["architect"]},lint_spec:{description:"validate .swarm/spec.md format and required fields",agents:["architect","spec_writer"]},write_retro:{description:"document phase retrospectives via phase_complete workflow, capture lessons learned",agents:["architect"]},write_drift_evidence:{description:"write drift verification evidence for a completed phase",agents:["architect"]},write_hallucination_evidence:{description:"write hallucination verification evidence for a completed phase",agents:["architect"]},write_mutation_evidence:{description:"write mutation gate evidence for a completed phase; normalizes PASS/WARN/FAIL/SKIP verdicts and writes .swarm/evidence/{phase}/mutation-gate.json",agents:["architect"]},declare_scope:{description:"declare file scope for next coder delegation",agents:["architect"]},scope_validate:{description:"validate shell writes against an inline file scope",agents:["architect"]},knowledge_query:{description:"query swarm or hive knowledge with optional filters",agents:["architect","skill_improver","spec_writer"]},doc_scan:{description:"scan project documentation files and build an index manifest",agents:["architect","docs_design","skill_improver","spec_writer","explorer"]},doc_extract:{description:"extract actionable constraints from project documentation",agents:["architect","docs_design","skill_improver","spec_writer"]},curator_analyze:{description:"run curator phase analysis and optionally apply knowledge recommendations",agents:["architect"]},consensus_mine:{description:"mine cross-run consensus from existing .swarm evidence into an immutable proposals-only report; also deletes its own reports past consensus.report_retention, appends to the shared recommendation dedup ledger (in the shared cohort root, outside this project, when a knowledge link is active), and mirrors proposals into pending swarm-memory proposals when memory is enabled",agents:["architect","curator_phase","curator_postmortem"]},knowledge_add:{description:"store a new lesson in the knowledge base",agents:["architect","coder"]},knowledge_recall:{description:"search the knowledge base for relevant past decisions",agents:["architect","sme","docs","docs_design","designer","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic_architecture_supervisor","curator_init","curator_phase","skill_improver","spec_writer","reviewer","critic_finding_validator","critic","critic_oversight","explorer","coder","test_engineer"]},knowledge_remove:{description:"delete an outdated swarm knowledge entry by ID (swarm tier only)",agents:["architect"]},co_change_analyzer:{description:"detect hidden couplings by analyzing git history",agents:["architect"]},context_status:{description:"report current context-window headroom for the active session — returns tokens-used, usageSource (provider|estimated), model-limit with provenance (modelLimitSource: host|override|provider_cap|native|fallback; modelLimitResolution: user_provider_model|user_model|user_default|live_model_limit|static_provider_cap|static_native|static_default; fallbackActive: true when the denominator came from a static table or the flat 128k default — treat headroom as uncertain), usage-percent, threshold-state (none/warn/critical), model name, and provider. Pure read-only: no state mutation, no warning injection. Works whether context_budget.enabled is true or false.",agents:["architect"]},search:{description:"Workspace-scoped ripgrep-style text search with structured JSON output. Supports literal and regex modes, glob filtering, and result limits. NOTE: This is text search, not structural AST search — use symbols and imports tools for structural queries.",agents:["architect","sme","docs","docs_design","designer","critic_hallucination_verifier","skill_improver","spec_writer","reviewer","critic_finding_validator","critic_oversight","explorer","coder","test_engineer","researcher"]},ast_grep:{description:"Read-only structural AST search using ast-grep patterns with optional language and glob filters. Use for syntax-aware code pattern searches; does not rewrite files.",agents:["architect","sme","docs","docs_design","critic_hallucination_verifier","spec_writer","explorer","coder","test_engineer","researcher"]},actionlint_scan:{description:"Run actionlint against GitHub Actions workflow YAML files with structured findings. Resolves actionlint lazily and does not modify files.",agents:["architect","test_engineer"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},osv_scan:{description:"Run OSV-Scanner against a workspace path and return structured dependency vulnerability findings. Resolves osv-scanner lazily and does not modify files.",agents:["architect","test_engineer"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},gh_evidence:{description:"Fetch bounded GitHub pull request or issue metadata through gh for review and CI evidence. Resolves gh lazily and is read-only.",agents:["architect","researcher"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},pr_workflow_status:{description:"Read-only architect observation of local git state (HEAD, branch, clean/dirty with a bounded changed-file list, remotes) plus a session-pinned PR workflow gate summary and the PR_FEEDBACK publication-generation section (state, attempts, invalidation reason, recovery guidance). For an active PR_REVIEW gate it also projects that derived state read-only: per-boundary settlement (post_explorer / post_reviewer / post_critic), per-lane coverage (accepted, rejected, one-line latest finding), and the bounded candidate inventory, each degrading to a typed unavailable state rather than an absence claim. Use to observe state under the fail-closed PR_REVIEW/PR_FEEDBACK gate. Never executes PR-controlled scripts and never reads another session gate.",agents:["architect"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},batch_symbols:{description:"Batched symbol extraction across multiple files. Returns per-file symbol summaries with isolated error handling.",agents:["architect","critic_hallucination_verifier","reviewer","critic_finding_validator","critic_oversight","explorer"]},suggest_patch:{description:"Reviewer-safe structured patch suggestion tool. Produces context-anchored patch artifacts without file modification. Returns structured diagnostics on context mismatch.",agents:["architect","reviewer","critic_finding_validator"]},req_coverage:{description:"query requirement coverage status for tracked functional requirements",agents:["critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","spec_writer","critic","critic_oversight"]},get_approved_plan:{description:"retrieve the last critic-approved immutable plan snapshot for baseline drift comparison",agents:["critic_drift_verifier","critic","critic_oversight"]},repo_map:{description:"query the repo code graph: importers, dependencies, blast radius, localization, ontology facts, package boundaries, and heuristic preflight packets before refactoring; ontology findings are advisory, not formal proofs",agents:["architect","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic_architecture_supervisor","reviewer","critic_finding_validator","critic","critic_oversight","explorer","coder","test_engineer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},get_qa_gate_profile:{description:"retrieve the QA gate profile for the current or exact future plan identity: gates (reviewer, test_engineer, sme_enabled, critic_pre_plan, sast_enabled, council_mode, hallucination_guard, mutation_test, phase_council, drift_check, final_council), lock state, profile hash, the calling session’s ratchet-tighter overrides, and the EFFECTIVE gates (profile merged with those overrides; durable across restart). Read-only and never creates state.",agents:["architect"]},set_qa_gates:{description:"configure the QA gate profile for the current plan or bootstrap an exact future plan with swarm_id and plan_title. Architect-only. The initial selection may set explicit true/false values over defaults; later changes are ratchet-tighter and rejected once locked after critic approval. Supports: reviewer, test_engineer, sme_enabled, critic_pre_plan, sast_enabled, council_mode, hallucination_guard, mutation_test, phase_council, drift_check, final_council, plus adopt_legacy_binding_only for exact-binding recovery without mutating gates.",agents:["architect"]},web_search:{description:"External web search (Tavily or Brave) for architect-driven council research, SME domain research, researcher auto-research, and skill-improver research. Returns titled results with snippets, URLs, normalized query metadata, temporal intent, freshness, and removed stale years. Config-gated on council.general.enabled in the resolved config: global ~/.config/opencode/opencode-swarm.json, then project .opencode/opencode-swarm.json overrides. Requires a search API key. Used by the architect in MODE: COUNCIL to gather a RESEARCH CONTEXT before dispatching council agents, by SME for opt-in external skill/source evaluation, and by the researcher agent for multi-source auto-research.",agents:["sme","researcher","skill_improver"]},web_fetch:{description:"Fetch the readable text of a single http(s) URL (architect-only). Returns decoded page text, document title, final URL after redirects, and an evidence reference. Reads primary sources that web_search only surfaces as snippets. Config-gated on council.general.enabled. Blocks private/loopback/link-local/metadata addresses (re-validated and re-pinned across redirects); enforces timeout and body size cap.",agents:[]},convene_general_council:{description:"Synthesize responses from a multi-model General Council. Accepts parallel member responses (Round 1, optionally Round 2), detects disagreements, and returns consensus points, persisting disagreements, and a structured synthesis. Architect-only. Config-gated on council.general.enabled in the resolved config: global ~/.config/opencode/opencode-swarm.json, then project .opencode/opencode-swarm.json overrides.",agents:[]},write_final_council_evidence:{description:"Persist project-scoped final council evidence to .swarm/evidence/final-council.json. PREREQUISITE: dispatch critic, reviewer, sme, test_engineer, and explorer as project-scoped Agent tasks and collect their CouncilMemberVerdict JSON — this tool synthesizes only. Rejects on insufficient quorum or CONCERNS with unresolved requiredFixes; normalizes verdicts to approved/concerns/rejected. Architect-only.",agents:[]},skill_generate:{description:"compile knowledge entries into a structured SKILL.md draft",agents:["skill_improver"]},skill_list:{description:"list generated skill files and their status",agents:["skill_improver"]},skill_apply:{description:"activate a draft skill proposal",agents:[]},skill_inspect:{description:"inspect the content and source entries of a skill file",agents:["skill_improver"]},run_stale_reconciliation:{description:"reconcile skills against the knowledge store: mark skills stale when source knowledge is archived or deleted, or clear stale markers",agents:["architect"]},skill_regenerate:{description:"regenerate an active skill by re-clustering its source knowledge entries and updating the SKILL.md in place",agents:[]},skill_retire:{description:"retire a generated skill by adding a retired.marker file; retired skills are excluded from scoring and injection",agents:[]},skill_improve:{description:"run the skill_improver agent to review and refine skills",agents:["skill_improver"]},spec_write:{description:"author or update .swarm/spec.md for the current project",agents:["spec_writer"]},knowledge_receipt:{description:"file a receipt for retrieved knowledge (applied/ignored/contradicted + new lessons), recorded as immutable knowledge events",agents:["architect","sme","docs","docs_design","designer","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic_architecture_supervisor","curator_init","curator_phase","skill_improver","spec_writer","reviewer","critic_finding_validator","critic","coder","test_engineer"]},knowledge_receipt_status:{description:"receipt status",agents:["architect"]},knowledge_archive:{description:"archive (default), quarantine, or purge a swarm or hive knowledge entry by ID with an immutable audit tombstone; purge requires an admin flag",agents:["architect"]},swarm_memory_recall:{description:"recall scoped Swarm memory for the current repository as untrusted background",agents:[]},swarm_memory_propose:{description:"create a pending Swarm memory proposal; does not write durable memory directly",agents:[]},swarm_memory_outcome:{description:"record useful, dead-end, or corrected outcomes and, when enabled, synchronously refresh deterministic memory lessons",agents:[]},swarm_command:{description:"run supported /swarm commands through the canonical command registry",agents:["architect","sme","researcher","docs","docs_design","designer","reviewer","critic_finding_validator","critic","explorer","coder","test_engineer"]},dispatch_lanes:{description:"dispatch read-only exploration/review lanes concurrently and BLOCK until all finish; prefer dispatch_lanes_async for non-blocking dispatch, use this only when promptAsync is unavailable",agents:["architect"]},dispatch_lanes_async:{description:"launch read-only advisory lanes non-blockingly and return a batch id plus lane session handles immediately; each lane agent must be a registered generated agent name (unregistered bare roles are refused on multi-swarm hosts); launch_timeout_ms is only a promptAsync acceptance budget, not a lane runtime timeout; poll incrementally with collect_lane_results (wait omitted), or join with wait: true for all results",agents:["architect"]},collect_lane_results:{description:"collect/poll a dispatch_lanes_async batch — OBSERVATION ONLY; it can never cancel or abort a lane. A presumed-stale sweep runs on every call, settling lanes past the horizon: idle host to stale, unobservable host to a typed liveness error. The wait budget (timeout_ms) bounds this observer call only — its expiry, a missing messages client, or a degraded liveness probe never kills a lane, never proves it died, and never settles anything. If a collection returns pending lanes, poll again first; busy/retry host status is live evidence, not failure. Cancellation is a distinct, explicit, authorized, potentially destructive action: use cancel_lane_batch (confirm: true + reason), never this tool. An explicit operator cancellation settles as the distinct operator_cancelled class — not liveness. Unsettled lanes are reported in pending_lanes (batch_id, lane_id, status, output_ref) regardless of include_pending. Does not advance workflow gates. Settled-lane inline output is delivered once: later polls set output_omitted_repeat: true and omit output but keep output_ref for retrieval via retrieve_lane_output.",agents:["architect"]},cancel_lane_batch:{description:"cancel ACTIVE lanes of a dispatch_lanes_async batch — the only cancellation surface (collect_lane_results cannot cancel). Destructive and authorization-gated: requires confirm: true + a bounded reason, recorded on cancelled terminals as the distinct operator_cancelled class (never liveness; not auto-retryable, never consumes retry budget — re-dispatch explicitly). Race-safe per lane: busy/retry refused (live work is never destroyed — human force path: /swarm abort-pr-workflow); degraded/absent status probe refuses the whole batch fail-closed; idle or host-unknown sessions may be cancelled; a child completing in the race window is preserved; an abort timeout never claims cancellation.",agents:["architect"]},summarize_work:{description:"emit a short structured summary of completed work (key decisions, assumptions, risks, constraints) at task completion; rolls up per phase for architecture-supervisor review. Advisory, never blocks.",agents:["architect","sme","researcher","docs","docs_design","designer","explorer","coder","test_engineer"]},write_architecture_supervisor_evidence:{description:"persist the architecture supervisor verdict for a phase (architect MUST dispatch critic_architecture_supervisor first and collect its JSON verdict; this tool persists only, it does not contact the supervisor)",agents:["architect"]},lean_turbo_plan_lanes:{description:"partition phase tasks into parallel lanes based on file-scope conflicts for Lean Turbo execution",agents:[]},lean_turbo_acquire_locks:{description:"acquire file locks for all files in a lane (all-or-nothing) before lane execution",agents:[]},lean_turbo_runner_status:{description:"read Lean Turbo run state from .swarm/turbo-state.json",agents:[]},lean_turbo_critic:{description:"dispatch a read-only critic agent to evaluate boundary conditions for a completed Lean Turbo phase (satisfies the turbo.lean.phase_critic gate)",agents:[]},lean_turbo_review:{description:"dispatch a read-only reviewer agent to evaluate a completed Lean Turbo phase",agents:[]},lean_turbo_run_phase:{description:"Execute a phase using Lean Turbo parallel lane execution. Plans lanes, acquires file locks, and dispatches coder agents concurrently. Use when Lean Turbo is active and you want to execute all tasks in a phase in parallel lanes.",agents:[]},lean_turbo_status:{description:"returns Lean Turbo configuration and active status for the current session",agents:[]},swarm_apply_patch:{description:"Apply a unified diff patch to workspace files with exact context matching, atomic writes, and path validation. Use standard unified diff format only — does NOT support *** Begin Patch / *** Update File payloads (use native apply_patch for those).",agents:["coder","test_engineer"]},external_skill_discover:{description:"Discover external skill candidates from configured sources. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_list:{description:"List external skill candidates in the quarantine store. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_inspect:{description:"Inspect a specific external skill candidate by ID. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_promote:{description:"Promote a validated external skill candidate to an active generated skill. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_reject:{description:"Reject an external skill candidate after evaluation. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_delete:{description:"Delete an external skill candidate from the quarantine store. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_revoke:{description:"Revoke a previously promoted external skill. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},epic_next_wave:{description:"Epic Mode: the single, idempotent way forward while an epic is open. Closes the active wave once every task is resolved (recording per-task outcomes and declared-vs-actual divergence, which Epic learning uses to plan later waves), keeps phases in order, and issues the next wave of disjoint tasks with dispatch instructions. Returns a status: dispatch | declare-scopes | in-progress | blocked | phase-ready-for-review | epic-complete | refused. Requires `epic.mode.enabled: true` and an epic opened by `/swarm epic start`.",agents:[]},epic_phase_review:{description:"Epic Mode phase readiness: dispatch a read-only phase reviewer, then (only if it APPROVES) a read-only phase critic over the completed phase; parse both verdicts from the agents and record them to .swarm/evidence/{phase}/epic-phase-review.json. Required by phase_complete while an epic is open for the current plan; re-run after any fix (evidence is bound to the plan and phase task evidence).",agents:[]}},TOOL_NAMES=Object.keys(TOOL_METADATA),TOOL_NAME_SET=new Set(TOOL_NAMES);TOOL_DESCRIPTIONS=Object.fromEntries(Object.entries(TOOL_METADATA).map(([name,meta])=>[name,meta.description])),AGENT_TOOL_MAP=(()=>{let map=Object.fromEntries(ALL_AGENT_NAMES.map((agent)=>[agent,[]]));for(let[name,meta]of Object.entries(TOOL_METADATA))for(let agent of meta.agents)map[agent].push(name);return map})()});function scanOverrideForDangerousKeys(value,path,depth){if(depth>=10)return;if(Array.isArray(value)){for(let i=0;i<value.length;i++)scanOverrideForDangerousKeys(value[i],`${path}[${i}]`,depth+1);return}if(typeof value!=="object"||value===null)return;for(let key of Object.keys(value)){if(DANGEROUS_MERGE_KEYS.has(key))throw new DangerousMergeKeyError(key,path);scanOverrideForDangerousKeys(value[key],`${path}.${key}`,depth+1)}}function deepMergeInternal(base,override,depth,path){if(depth>=10)throw Error("deepMerge exceeded maximum depth of 10");let result={...base};for(let key of Object.keys(override)){let baseVal=base[key],overrideVal=override[key];if(typeof baseVal==="object"&&baseVal!==null&&typeof overrideVal==="object"&&overrideVal!==null&&!Array.isArray(baseVal)&&!Array.isArray(overrideVal))result[key]=deepMergeInternal(baseVal,overrideVal,depth+1,`${path}.${key}`);else result[key]=overrideVal}return result}function deepMerge(base,override){if(!base)return override;if(!override)return base;return scanOverrideForDangerousKeys(override,"$",0),deepMergeInternal(base,override,0,"$")}var MAX_MERGE_DEPTH=10,DANGEROUS_MERGE_KEYS,DangerousMergeKeyError;var init_merge=__esm(()=>{DANGEROUS_MERGE_KEYS=new Set(["__proto__","constructor","prototype"]);DangerousMergeKeyError=class DangerousMergeKeyError extends Error{key;path;constructor(key,path){super(`deepMerge refused dangerous key "${key}" at "${path}": prototype-pollution carriers (__proto__/constructor/prototype) are never merged`);this.key=key;this.path=path;this.name="DangerousMergeKeyError"}}});function freezeSet(items,name="CLAUDE_CODE_NATIVE_COMMANDS"){let set=new Set(items),proxy=new Proxy(set,{get(target,prop){if(prop==="add"||prop==="delete"||prop==="clear")return()=>{throw TypeError(`${name} is readonly`)};if(prop==="forEach")return(callback,thisArg)=>{let wrapped=(v,k)=>callback.call(thisArg??void 0,v,k,proxy);return set.forEach(wrapped)};let value=Reflect.get(target,prop);return typeof value==="function"?value.bind(target):value},set(){throw TypeError(`${name} is readonly`)},deleteProperty(){throw TypeError(`${name} is readonly`)},defineProperty(){throw TypeError(`${name} is readonly`)},setPrototypeOf(){throw TypeError(`${name} is readonly`)}});return proxy}function isQAAgent(name){return QA_AGENTS.includes(name)}function isSubagent(name){return ALL_SUBAGENT_NAMES.includes(name)}function isLowCapabilityModel(modelId){let lower=(modelId||"").toLowerCase();return LOW_CAPABILITY_MODELS.some((substr)=>lower.includes(substr))}var OPENCODE_NATIVE_AGENTS,CLAUDE_CODE_NATIVE_COMMANDS,OPENCODE_NATIVE_COMMANDS,MEMORY_AGENT_TOOL_MAP,EXTERNAL_SKILL_TOOL_NAMES,EXTERNAL_SKILL_AGENT_TOOL_MAP,COUNCIL_TOOL_NAMES,COUNCIL_AGENT_TOOL_MAP,GENERAL_COUNCIL_TOOL_NAMES,GENERAL_COUNCIL_AGENT_TOOL_MAP,TURBO_TOOL_NAMES,TURBO_AGENT_TOOL_MAP,EPIC_TOOL_NAMES,EPIC_AGENT_TOOL_MAP,SKILL_TOOL_NAMES,SKILL_AGENT_TOOL_MAP,PR_REVIEW_CHILD_TOOL_NAMES,PR_REVIEW_CHILD_AGENT_TOOL_MAP,WRITE_TOOL_NAMES,SUMMARIZER_EXEMPT_TOOL_NAMES,DEFAULT_MODELS,DEFAULT_AGENT_CONFIGS,DEFAULT_SCORING_CONFIG,LOW_CAPABILITY_MODELS,TURBO_MODE_BANNER=`## \uD83D\uDE80 TURBO MODE ACTIVE
1
+ import{createRequire}from"node:module";var __create=Object.create;var{getPrototypeOf:__getProtoOf,defineProperty:__defProp,getOwnPropertyNames:__getOwnPropNames,getOwnPropertyDescriptor:__getOwnPropDesc}=Object,__hasOwnProp=Object.prototype.hasOwnProperty;function __accessProp(key){return this[key]}var __toESMCache_node,__toESMCache_esm,__toESM=(mod,isNodeMode,target)=>{var canCache=mod!=null&&typeof mod==="object";if(canCache){var cache=isNodeMode?__toESMCache_node??=new WeakMap:__toESMCache_esm??=new WeakMap,cached=cache.get(mod);if(cached)return cached}target=mod!=null?__create(__getProtoOf(mod)):{};let to=isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target;for(let key of __getOwnPropNames(mod))if(!__hasOwnProp.call(to,key))__defProp(to,key,{get:__accessProp.bind(mod,key),enumerable:!0});if(canCache)cache.set(mod,to);return to},__toCommonJS=(from)=>{var entry=(__moduleCache??=new WeakMap).get(from),desc;if(entry)return entry;if(entry=__defProp({},"__esModule",{value:!0}),from&&typeof from==="object"||typeof from==="function"){for(var key of __getOwnPropNames(from))if(!__hasOwnProp.call(entry,key))__defProp(entry,key,{get:__accessProp.bind(from,key),enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable})}return __moduleCache.set(from,entry),entry},__moduleCache,__commonJS=(cb,mod)=>()=>(mod||cb((mod={exports:{}}).exports,mod),mod.exports);var __returnValue=(v)=>v;function __exportSetter(name,newValue){this[name]=__returnValue.bind(null,newValue)}var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0,configurable:!0,set:__exportSetter.bind(all,name)})};var __esm=(fn2,res)=>()=>(fn2&&(res=fn2(fn2=0)),res);var __require=createRequire(import.meta.url);var package_default;var init_package=__esm(()=>{package_default={name:"opencode-swarm",version:"7.200.7",description:"Architect-centric agentic swarm plugin for OpenCode - hub-and-spoke orchestration with SME consultation, code generation, and QA review",main:"dist/index.js",types:"dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",default:"./dist/index.js"},"./package.json":"./package.json"},bin:{"opencode-swarm":"./dist/cli/index.js"},type:"module",engines:{bun:">=1.3.13",node:">=22.13"},license:"MIT",repository:{type:"git",url:"https://github.com/ZaxbyHub/opencode-swarm.git"},publishConfig:{access:"public",registry:"https://registry.npmjs.org/"},keywords:["opencode","opencode-plugin","ai","agents","orchestration","swarm","multi-agent","llm"],files:["dist","dist/lang/grammars","binaries","evaluation-fixtures",".opencode/skills/brainstorm",".opencode/skills/specify",".opencode/skills/clarify-spec",".opencode/skills/swarm-resume",".opencode/skills/clarify",".opencode/skills/discover",".opencode/skills/consult",".opencode/skills/pre-phase-briefing",".opencode/skills/council",".opencode/skills/deep-dive",".opencode/skills/deep-research",".opencode/skills/codebase-review-swarm",".opencode/skills/swarm-implement",".opencode/skills/design-docs",".opencode/skills/swarm-pr-review",".opencode/skills/swarm",".opencode/skills/swarm-pr-feedback",".opencode/skills/swarm-pr-subscribe",".opencode/skills/swarm-ci-monitor",".opencode/skills/issue-ingest",".opencode/skills/swarm-plan",".opencode/skills/critic-gate",".opencode/skills/execute",".opencode/skills/phase-wrap",".opencode/skills/loop",".opencode/skills/writing-tests",".opencode/skills/running-tests",".opencode/skills/engineering-conventions",".opencode/skills/commit-pr",".opencode/skills/ci-failure-batching",".opencode/skills/gate-attribution",".opencode/skills/merge-queue-readiness",".opencode/skills/skill-edit-validation",".opencode/skills/worktree-retry-cleanup",".opencode/skills/test-file-split",".opencode/skills/fork-pr-operations",".opencode/skills/parallel-work-check",".opencode/skills/ci-fix-monitor",".opencode/skills/issue-tracer",".opencode/skills/orchestrating-subagents",".opencode/skills/durable-session-state","tests/fixtures/memory-recall","tests/fixtures/memory-recall-heldout","opencode-swarm.schema.json","README.md","LICENSE"],scripts:{clean:`bun -e "require('fs').rmSync('dist',{recursive:true,force:true})"`,build:"bun run clean && bun run scripts/generate-config-schema.ts && bun run scripts/copy-grammars.ts && bun build src/index.ts --outdir dist --target node --format esm --external web-tree-sitter --minify-whitespace --minify-syntax && bun build src/cli/index.ts --outdir dist/cli --target bun --format esm --external bash-parser --splitting && bun run scripts/copy-grammars.ts --to-dist && tsc --emitDeclarationOnly",typecheck:"tsc --noEmit",test:"bun test",lint:"biome lint .","lint:ci":"biome ci .","test:unit:ci":"bun scripts/ci/run-unit-tests-local.ts","validate:repo":"bun scripts/ci/repository-validation.ts","drift:check":"bun run scripts/drift-check.ts","check:pre-push":"bun run scripts/drift-check.ts --enforce --no-report && bun run check:registry-citations","schema:generate":"bun run scripts/generate-config-schema.ts","generate:commands-docs":"bun run scripts/generate-commands-docs.ts","check:runtime-src-refs":"bun run scripts/check-runtime-src-refs.ts","drift:fix":"bun run scripts/drift-check.ts --fix --confirm","skills:sync":"bun run scripts/sync-qa-gate-skills.ts",format:"biome format . --write",check:"biome check --write .",dev:"bun run build && opencode","package:smoke":"node scripts/package-smoke.mjs",prepare:"bun run build","repro:704":"node scripts/repro-704.mjs","repro:2669":"node scripts/repro-2669.mjs","repro:2670":"node scripts/repro-2670.mjs","repro:1144":"bun scripts/repro-1144.mjs","repro:1873":"bun build scripts/repro-1873-entry.ts --outdir dist-build-test/repro-1873 --target node --format esm && node scripts/repro-1873.mjs","repro:2487":"bun build scripts/repro-2487-parity-entry.ts --outdir dist-build-test/repro-2487 --target node --format esm && node scripts/repro-2487-parity.mjs","check:events":"bun run scripts/check-event-contract.ts","check:retention":"bun run scripts/check-retention-registry.ts","check:core-events":"bun run scripts/check-core-events-usage.ts","check:shell-audit":"bun run scripts/check-shell-audit-usage.ts","check:trajectory-store":"bun run scripts/check-trajectory-store-usage.ts","check:mock-cleanup":"bun run scripts/check-mock-cleanup.ts","check:invariants":"bun run scripts/check-invariants.ts","check:token-formula":"bun run scripts/check-token-formula.ts","check:cross-contamination":"bun run scripts/check-cross-contamination.ts","check:test-clock":"bun run scripts/check-test-clock.ts","check:test-file-cap":"bun run scripts/check-test-file-cap.ts","check:test-tmpdir":"bun run scripts/check-test-tmpdir.ts","check:bash-portability":"bun run scripts/check-bash-portability.ts","check:pending-fragment":"bun run scripts/check-pending-fragment.ts","check:gate-portability":"bun run scripts/check-gate-portability.ts","check:bare-spawn":"bun run scripts/check-bare-executable-spawn.ts","check:error-channel-discard":"bun run scripts/check-error-channel-discard.ts","check:path-identity":"bun run scripts/check-path-identity.ts","check:registry-citations":"bun run scripts/check-registry-citations.ts","check:memory-recall":"bun run scripts/memory-recall-regression.ts","check:retrieval-quality":"bun run scripts/retrieval-quality-regression.ts"},dependencies:{"@modelcontextprotocol/sdk":"^1.30.0","@opencode-ai/plugin":"^1.18.3","@opencode-ai/sdk":"^1.18.3","@vscode/tree-sitter-wasm":"^0.3.0","bash-parser":"^0.5.0","p-limit":"^7.3.0",picomatch:"^4.0.4","proper-lockfile":"^4.1.2","quick-lru":"^7.3.0","web-tree-sitter":"^0.25.0",zod:"4.3.6"},devDependencies:{"@biomejs/biome":"2.3.14","@types/picomatch":"^4.0.3","bun-types":"1.3.8","js-yaml":"^4.1.1",typescript:"^5.7.3"},peerDependencies:{"@xenova/transformers":"^2.17.2"},peerDependenciesMeta:{"@xenova/transformers":{optional:!0}}}});var QA_AGENTS,PIPELINE_AGENTS,ORCHESTRATOR_NAME="architect",ALL_SUBAGENT_NAMES,ALL_AGENT_NAMES;var init_agent_names=__esm(()=>{QA_AGENTS=["reviewer","critic","critic_oversight","critic_finding_validator"],PIPELINE_AGENTS=["explorer","coder","test_engineer"],ALL_SUBAGENT_NAMES=["sme","researcher","docs","docs_design","designer","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic_architecture_supervisor","curator_init","curator_phase","curator_postmortem","curator_consolidation","council_generalist","council_skeptic","council_domain_expert","skill_improver","spec_writer",...QA_AGENTS,...PIPELINE_AGENTS],ALL_AGENT_NAMES=["architect",...ALL_SUBAGENT_NAMES]});function getPrWorkflowToolCapability(toolName,mode){let metadata=TOOL_METADATA[toolName];if(!metadata?.prWorkflow?.modes.includes(mode))return null;return metadata.prWorkflow.capability}var TOOL_METADATA,TOOL_NAMES,TOOL_NAME_SET,TOOL_DESCRIPTIONS,AGENT_TOOL_MAP;var init_tool_metadata=__esm(()=>{init_agent_names();TOOL_METADATA={diff:{description:"structured git diff with contract change detection",agents:["architect","reviewer","critic_finding_validator","critic_oversight","coder","test_engineer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},diff_summary:{description:"filter classified AST changes by category, risk level, or file for reviewer drill-down",agents:["architect","reviewer","critic_finding_validator","critic_oversight"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},syntax_check:{description:"check syntax of source files using tree-sitter parsers across multiple languages, returning per-file errors",agents:["architect","coder","test_engineer"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},placeholder_scan:{description:"todo and FIXME comment detection",agents:["architect","reviewer","critic_finding_validator"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},imports:{description:"find all consumers that import from a given file — use before refactoring shared modules to avoid breaking unseen dependents",agents:["architect","sme","researcher","docs","docs_design","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","reviewer","critic_finding_validator","critic","coder","test_engineer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},lint:{description:"run project linter in check or fix mode; supports biome, eslint, ruff, clippy, and more, returns structured results",agents:["architect","reviewer","critic_finding_validator","coder"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},secretscan:{description:"scan for secrets (API keys, tokens, passwords) via regex and entropy; returns redacted previews, excludes common dirs",agents:["architect","reviewer","critic_finding_validator","critic_oversight"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},sast_scan:{description:"static analysis security scan",agents:["architect","reviewer","critic_finding_validator","critic_oversight"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},build_check:{description:"discover and run build, typecheck, and test commands for various project ecosystems in the working directory",agents:["architect","coder","test_engineer"]},pre_check_batch:{description:"parallel verification: lint:check + secretscan + sast_scan + quality_budget",agents:["architect","reviewer","critic_finding_validator"]},quality_budget:{description:"code quality budget check",agents:["architect"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},symbols:{description:"extract exported symbols (functions, classes, interfaces, types) from source files; supports TypeScript, JavaScript, Python, Rust, Go, Dart, Ruby, PHP, and Java",agents:["architect","sme","researcher","docs","docs_design","designer","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","spec_writer","reviewer","critic_finding_validator","critic","coder","test_engineer"]},complexity_hotspots:{description:"git churn × complexity risk map",agents:["architect","sme","researcher","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","reviewer","critic_finding_validator","critic","critic_oversight","explorer","test_engineer"]},schema_drift:{description:"OpenAPI spec vs route drift",agents:["architect","sme","researcher","docs","explorer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},todo_extract:{description:"structured TODO/FIXME extraction; with task_id, records the high-priority count as todo_scan gate evidence",agents:["architect","researcher","docs","explorer","coder"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},evidence_check:{description:"verify task evidence completeness",agents:["architect","critic_oversight"]},check_gate_status:{description:"check the gate status of a specific task",agents:["architect","critic_oversight"]},completion_verify:{description:"verify completed tasks have required evidence",agents:["architect","critic_oversight"]},complete_pr_workflow:{description:"validate terminal PR workflow evidence and clear its durable session gate",agents:["architect"]},abort_pr_workflow:{description:"abort an unrecoverable PR_REVIEW/PR_FEEDBACK mechanical gate and clear its durable session state",agents:["architect"]},authorize_pr_review_reentry:{description:"issue a one-use, identity-bound reviewer/test_engineer re-entry authorization for the active PR_REVIEW workflow (issue #2383)",agents:["architect"]},submit_pr_review_result:{description:"submit one child-bound typed result for an active PR-review base or micro discovery lane",agents:[],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},approve_plan_critic:{description:"record a MANUAL plan_critic_gate approval snapshot to unblock the ratchet-tighter critic_pre_plan execution gate when the critic already returned APPROVED but the mechanical recorder failed to persist it (issue #2012), or as the sanctioned recovery for a bookkeeping-grade hashed-field repair under the critic-gate PLAN FREEZE rule (the reason must state which case applies)",agents:["architect"]},approve_retry_sounding_board:{description:"record a MANUAL critic_sounding_board gate entry to unblock the coder retry circuit-breaker gate when the sounding board returned APPROVED but the mechanical recorder missed it (issue #2703)",agents:["architect"]},recover_rework_task:{description:"recover a task wedged at rework_required when the reviewer/test_engineer verdict did not require a code change: write a supervised stage_a_passed so those gates can be re-dispatched without re-running the coder (issue #2755)",agents:["architect"]},recover_stage_a_task:{description:"recover a task wedged in the settlement-backed Stage A deadlock — workflow at idle/blocked while a COMMITTED accepted coder settlement and green post-settlement pre-check proof justify Stage A: write a settlement-backed stage_a_passed so reviewer/test_engineer can be dispatched, without re-running the coder (issue #2828)",agents:["architect"]},prepare_pr_workflow_checkout:{description:"prepare an auditable PR workflow checkout or restore its exact original branch/HEAD and preserved stash after terminal cleanup",agents:["architect"]},invalidate_pr_feedback_publication:{description:"invalidate the armed PR_FEEDBACK publication generation so approved content can change, superseding every content-dependent approval and reopening the exact scoped rework + fresh-review path (issue #2108)",agents:["architect"]},record_implementation_review:{description:"record fresh-context reviewer + critic APPROVE verdicts for the implementation diff so the /swarm issue --trace workflow can satisfy its review gate before commit-pr handoff",agents:["architect"]},record_issue_publication:{description:"record a publication receipt so the /swarm issue --trace workflow reaches its terminal published state after the PR is created/updated",agents:["architect"]},record_issue_reproduction:{description:"record the reproduction outcome for the current traced issue so the /swarm issue --trace workflow can satisfy its reproduction gate and transition to PLAN",agents:["architect"]},record_recurrence_sweep:{description:"record the recurrence sweep (defect class, predicates, hit dispositions, guardrail proof, related-problems results) so the /swarm issue --trace workflow can satisfy its recurrence gate before commit-pr handoff",agents:["architect"]},record_branch_freshness:{description:"record the Phase 0 branch-freshness outcome (synced / behind:<n> / fetch-failed:<reason> plus optional user override) so the /swarm issue --trace workflow can pass its freshness gate before transitioning to PLAN (issue #2564)",agents:["architect"]},record_trace_validation:{description:"record one per-phase trace-check.sh validator outcome (phase, pass/fail, reviewedCommit, treeId) so the /swarm issue --trace workflow can satisfy its validator-receipt gate before commit-pr handoff (issue #2564)",agents:["architect"]},record_merge_approval:{description:"record the human merge approval bound to the exact PR head SHA so the /swarm issue --trace workflow reaches its terminal merge_approval_recorded state — recorded for audit only, never certified or driven by the plugin (issue #2564)",agents:["architect"]},rebind_pr_feedback_head:{description:"rebind a PR_FEEDBACK workflow to a new verified remote PR head after merge/rebase/conflict repair, invalidating ancestry-bound receipts so the mechanical ladder re-runs",agents:["architect"]},run_pr_feedback_stage_a:{description:"execute and persist mandatory PR-feedback Stage A checks on a content-bound revision",agents:["architect"]},submit_council_verdicts:{description:"submit pre-collected council member verdicts for synthesis (architect MUST dispatch critic/reviewer/sme/test_engineer/explorer as Agent tasks first; this tool synthesizes only, it does not contact members)",agents:[]},submit_phase_council_verdicts:{description:"submit pre-collected phase-level council member verdicts for holistic phase synthesis (architect MUST dispatch all 5 council members with phase-scoped context first; this tool synthesizes only, it does not contact members)",agents:[]},declare_council_criteria:{description:"pre-declare acceptance criteria for a task before the coder starts work; criteria are read back during council evaluation",agents:[]},sbom_generate:{description:"SBOM generation for dependency inventory",agents:["architect"]},checkpoint:{description:"create named git checkpoints for save, restore, and delete — use before risky operations to enable rollback; a destructive restore previews first and requires the confirm_token issued in the preview (#2946)",agents:["architect"]},pkg_audit:{description:"dependency vulnerability scan — npm/pip/cargo",agents:["architect","critic_hallucination_verifier","reviewer","critic_finding_validator","critic_oversight","test_engineer"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},parse_lane_candidates:{description:"Parse [CANDIDATE] rows from a dispatch_lanes or collect_lane_results artifact (by output_ref), produce structured records with provenance, optionally persist to a per-batch sidecar JSONL. Pure-parser variant exists as internal module.",agents:["architect"]},plan_conflict_check:{description:"read-only advisory check (#1656): compute a pairwise file-conflict matrix for N proposed parallel task groups using declared scopes and optional git co-change; returns a verdict (all_disjoint / conflicts_present / unknown_scopes), per-pair evidence, and a suggested serialization order. Writes nothing — the execution gate independently recomputes the verdict inline at dispatch time via the same helper. Call BEFORE attempting parallel dispatch to confirm disjointness.",agents:["architect"]},write_pr_review_trigger_eval:{description:"persist the complete PR-review trigger evaluation with exact-set validation, dispatch provenance, and live merge-base verification",agents:["architect"]},write_pr_review_artifact:{description:"persist schema-validated PR-review findings checkpoints and exact actionable feedback handoffs under the active run; reviewer verdicts marked `UNVERIFIED` persist to the findings ledger as `PENDING` records routed back to the reviewer — do not resubmit a row whose verdict is already recorded",agents:["architect"]},pr_review_submission:{description:"submit a settled, head-bound PR review to GitHub through the gh PR Review API after the PR_REVIEW gate clears; architect-only, refuses while a gate is active or the run was aborted after settlement",agents:["architect"]},export_pr_review_partial_results:{description:"export the validated partial results of an ABORTED PR_REVIEW run as a partial, non-authoritative artifact bound per-item to receipt-authenticated findings; architect-only, requires the gate cleared and an abort event binding session and head, never implies completion or feedback consent",agents:["architect"]},prepare_pr_feedback_scope:{description:"prepare an exact file scope for one PR-feedback coder Task after immutable feedback verification settles",agents:["architect"]},prepare_pr_feedback_commit_message:{description:"author a PR_FEEDBACK commit message that cannot go inline (e.g. a Co-Authored-By trailer) into a file OUTSIDE the repository; returns the path for git commit -F",agents:["architect"]},test_runner:{description:"auto-detect and run tests",agents:["architect","reviewer","critic_finding_validator","test_engineer"]},test_impact:{description:"identify test files impacted by changed source files via import analysis",agents:["architect","reviewer","critic_finding_validator","critic_oversight","test_engineer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},mutation_test:{description:"executes pre-generated mutation patches against tests, evaluates kill rate against quality gate thresholds; test selection comes from explicit files (override) or source_files derived via the impact analyzer with a typed bounded fallback",agents:["architect","test_engineer"]},generate_mutants:{description:"generate LLM-based mutation testing patches for source files; returns MutationPatch[] for direct consumption by the mutation_test tool",agents:["architect"]},detect_domains:{description:"detect which SME domains are relevant for a given text",agents:["architect","sme","docs","docs_design","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic","critic_oversight","explorer"]},git_blame:{description:"per-line git blame metadata: sha, author, date, summary for each line in a file",agents:["reviewer","critic_finding_validator","explorer","architect"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},gitingest:{description:"fetch a GitHub repository full content via gitingest.com",agents:["architect","docs","explorer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},retrieve_summary:{description:"retrieve the full content of a stored tool output summary",agents:["architect","sme","docs","docs_design","designer","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic_architecture_supervisor","spec_writer","reviewer","critic_finding_validator","critic","coder","test_engineer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},retrieve_lane_output:{description:"retrieve paged full dispatch lane output by output_ref; use before consuming truncated lane previews or routing candidates from lane results",agents:["architect"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},extract_code_blocks:{description:"extract code blocks from text content and save them to files",agents:["docs","docs_design","designer","spec_writer","coder","test_engineer"]},phase_complete:{description:"preflight every applicable phase gate, report all blockers, and atomically commit a current passing snapshot",agents:["architect"]},run_phase_review:{description:"run the bounded phase-final review engine and persist complete content-addressed review evidence",agents:["architect"]},repair_gate_evidence:{description:"quarantine recoverable exact-task gate evidence, rebuild from durable requirements, recover receipt-backed legacy marker wedges or the exact sentinel-only historical reset, and refuse every other receipt-less reconstruction",agents:["architect"]},repair_knowledge_receipt_ledger:{description:"validate or repair authoritative knowledge receipts, preserve corrupt authority in bounded quarantine, require scoped re-evaluation, and backfill stable phase ids across the whole ledger (operation backfill_phase_id; phase/session_id do not scope the backfill)",agents:["architect"]},record_directive_override:{description:"record an audited architect override for identified critical-directive violations without bypassing unreadable authority",agents:["architect"]},save_plan:{description:"save a structured implementation plan",agents:["architect"]},update_task_status:{description:"mark tasks complete, track phase progress",agents:["architect"]},lint_spec:{description:"validate .swarm/spec.md format and required fields",agents:["architect","spec_writer"]},write_retro:{description:"document phase retrospectives via phase_complete workflow, capture lessons learned",agents:["architect"]},write_drift_evidence:{description:"write drift verification evidence for a completed phase",agents:["architect"]},write_hallucination_evidence:{description:"write hallucination verification evidence for a completed phase",agents:["architect"]},write_mutation_evidence:{description:"write mutation gate evidence for a completed phase; normalizes PASS/WARN/FAIL/SKIP verdicts and writes .swarm/evidence/{phase}/mutation-gate.json",agents:["architect"]},declare_scope:{description:"declare file scope for next coder delegation",agents:["architect"]},scope_validate:{description:"validate shell writes against an inline file scope",agents:["architect"]},knowledge_query:{description:"query swarm or hive knowledge with optional filters",agents:["architect","skill_improver","spec_writer"]},doc_scan:{description:"scan project documentation files and build an index manifest",agents:["architect","docs_design","skill_improver","spec_writer","explorer"]},doc_extract:{description:"extract actionable constraints from project documentation",agents:["architect","docs_design","skill_improver","spec_writer"]},curator_analyze:{description:"run curator phase analysis and optionally apply knowledge recommendations",agents:["architect"]},consensus_mine:{description:"mine cross-run consensus from existing .swarm evidence into an immutable proposals-only report; also deletes its own reports past consensus.report_retention, appends to the shared recommendation dedup ledger (in the shared cohort root, outside this project, when a knowledge link is active), and mirrors proposals into pending swarm-memory proposals when memory is enabled",agents:["architect","curator_phase","curator_postmortem"]},knowledge_add:{description:"store a new lesson in the knowledge base",agents:["architect","coder"]},knowledge_recall:{description:"search the knowledge base for relevant past decisions",agents:["architect","sme","docs","docs_design","designer","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic_architecture_supervisor","curator_init","curator_phase","skill_improver","spec_writer","reviewer","critic_finding_validator","critic","critic_oversight","explorer","coder","test_engineer"]},knowledge_remove:{description:"delete an outdated swarm knowledge entry by ID (swarm tier only)",agents:["architect"]},co_change_analyzer:{description:"detect hidden couplings by analyzing git history",agents:["architect"]},context_status:{description:"report current context-window headroom for the active session — returns tokens-used, usageSource (provider|estimated), model-limit with provenance (modelLimitSource: host|override|provider_cap|native|fallback; modelLimitResolution: user_provider_model|user_model|user_default|live_model_limit|static_provider_cap|static_native|static_default; fallbackActive: true when the denominator came from a static table or the flat 128k default — treat headroom as uncertain), usage-percent, threshold-state (none/warn/critical), model name, and provider. Pure read-only: no state mutation, no warning injection. Works whether context_budget.enabled is true or false.",agents:["architect"]},search:{description:"Workspace-scoped ripgrep-style text search with structured JSON output. Supports literal and regex modes, glob filtering, and result limits. NOTE: This is text search, not structural AST search — use symbols and imports tools for structural queries.",agents:["architect","sme","docs","docs_design","designer","critic_hallucination_verifier","skill_improver","spec_writer","reviewer","critic_finding_validator","critic_oversight","explorer","coder","test_engineer","researcher"]},ast_grep:{description:"Read-only structural AST search using ast-grep patterns with optional language and glob filters. Use for syntax-aware code pattern searches; does not rewrite files.",agents:["architect","sme","docs","docs_design","critic_hallucination_verifier","spec_writer","explorer","coder","test_engineer","researcher"]},actionlint_scan:{description:"Run actionlint against GitHub Actions workflow YAML files with structured findings. Resolves actionlint lazily and does not modify files.",agents:["architect","test_engineer"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},osv_scan:{description:"Run OSV-Scanner against a workspace path and return structured dependency vulnerability findings. Resolves osv-scanner lazily and does not modify files.",agents:["architect","test_engineer"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},gh_evidence:{description:"Fetch bounded GitHub pull request or issue metadata through gh for review and CI evidence. Resolves gh lazily and is read-only.",agents:["architect","researcher"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},pr_workflow_status:{description:"Read-only architect observation of local git state (HEAD, branch, clean/dirty with a bounded changed-file list, remotes) plus a session-pinned PR workflow gate summary and the PR_FEEDBACK publication-generation section (state, attempts, invalidation reason, recovery guidance). For an active PR_REVIEW gate it also projects that derived state read-only: per-boundary settlement (post_explorer / post_reviewer / post_critic), per-lane coverage (accepted, rejected, one-line latest finding), and the bounded candidate inventory, each degrading to a typed unavailable state rather than an absence claim. Use to observe state under the fail-closed PR_REVIEW/PR_FEEDBACK gate. Never executes PR-controlled scripts and never reads another session gate.",agents:["architect"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},batch_symbols:{description:"Batched symbol extraction across multiple files. Returns per-file symbol summaries with isolated error handling.",agents:["architect","critic_hallucination_verifier","reviewer","critic_finding_validator","critic_oversight","explorer"]},suggest_patch:{description:"Reviewer-safe structured patch suggestion tool. Produces context-anchored patch artifacts without file modification. Returns structured diagnostics on context mismatch.",agents:["architect","reviewer","critic_finding_validator"]},req_coverage:{description:"query requirement coverage status for tracked functional requirements",agents:["critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","spec_writer","critic","critic_oversight"]},get_approved_plan:{description:"retrieve the last critic-approved immutable plan snapshot for baseline drift comparison",agents:["critic_drift_verifier","critic","critic_oversight"]},repo_map:{description:"query the repo code graph: importers, dependencies, blast radius, localization, ontology facts, package boundaries, and heuristic preflight packets before refactoring; ontology findings are advisory, not formal proofs",agents:["architect","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic_architecture_supervisor","reviewer","critic_finding_validator","critic","critic_oversight","explorer","coder","test_engineer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},get_qa_gate_profile:{description:"retrieve the QA gate profile for the current or exact future plan identity: gates (reviewer, test_engineer, sme_enabled, critic_pre_plan, sast_enabled, council_mode, hallucination_guard, mutation_test, phase_council, drift_check, final_council), lock state, profile hash, the calling session’s ratchet-tighter overrides, and the EFFECTIVE gates (profile merged with those overrides; durable across restart). Read-only and never creates state.",agents:["architect"]},set_qa_gates:{description:"configure the QA gate profile for the current plan or bootstrap an exact future plan with swarm_id and plan_title. Architect-only. The initial selection may set explicit true/false values over defaults; later changes are ratchet-tighter and rejected once locked after critic approval. Supports: reviewer, test_engineer, sme_enabled, critic_pre_plan, sast_enabled, council_mode, hallucination_guard, mutation_test, phase_council, drift_check, final_council, plus adopt_legacy_binding_only for exact-binding recovery without mutating gates.",agents:["architect"]},web_search:{description:"External web search (Tavily or Brave) for architect-driven council research, SME domain research, researcher auto-research, and skill-improver research. Returns titled results with snippets, URLs, normalized query metadata, temporal intent, freshness, and removed stale years. Config-gated on council.general.enabled in the resolved config: global ~/.config/opencode/opencode-swarm.json, then project .opencode/opencode-swarm.json overrides. Requires a search API key. Used by the architect in MODE: COUNCIL to gather a RESEARCH CONTEXT before dispatching council agents, by SME for opt-in external skill/source evaluation, and by the researcher agent for multi-source auto-research.",agents:["sme","researcher","skill_improver"]},web_fetch:{description:"Fetch the readable text of a single http(s) URL (architect-only). Returns decoded page text, document title, final URL after redirects, and an evidence reference. Reads primary sources that web_search only surfaces as snippets. Config-gated on council.general.enabled. Blocks private/loopback/link-local/metadata addresses (re-validated and re-pinned across redirects); enforces timeout and body size cap.",agents:[]},convene_general_council:{description:"Synthesize responses from a multi-model General Council. Accepts parallel member responses (Round 1, optionally Round 2), detects disagreements, and returns consensus points, persisting disagreements, and a structured synthesis. Architect-only. Config-gated on council.general.enabled in the resolved config: global ~/.config/opencode/opencode-swarm.json, then project .opencode/opencode-swarm.json overrides.",agents:[]},write_final_council_evidence:{description:"Persist project-scoped final council evidence to .swarm/evidence/final-council.json. PREREQUISITE: dispatch critic, reviewer, sme, test_engineer, and explorer as project-scoped Agent tasks and collect their CouncilMemberVerdict JSON — this tool synthesizes only. Rejects on insufficient quorum or CONCERNS with unresolved requiredFixes; normalizes verdicts to approved/concerns/rejected. Architect-only.",agents:[]},skill_generate:{description:"compile knowledge entries into a structured SKILL.md draft",agents:["skill_improver"]},skill_list:{description:"list generated skill files and their status",agents:["skill_improver"]},skill_apply:{description:"activate a draft skill proposal",agents:[]},skill_inspect:{description:"inspect the content and source entries of a skill file",agents:["skill_improver"]},run_stale_reconciliation:{description:"reconcile skills against the knowledge store: mark skills stale when source knowledge is archived or deleted, or clear stale markers",agents:["architect"]},skill_regenerate:{description:"regenerate an active skill by re-clustering its source knowledge entries and updating the SKILL.md in place",agents:[]},skill_retire:{description:"retire a generated skill by adding a retired.marker file; retired skills are excluded from scoring and injection",agents:[]},skill_improve:{description:"run the skill_improver agent to review and refine skills",agents:["skill_improver"]},spec_write:{description:"author or update .swarm/spec.md for the current project",agents:["spec_writer"]},knowledge_receipt:{description:"file a receipt for retrieved knowledge (applied/ignored/contradicted + new lessons), recorded as immutable knowledge events",agents:["architect","sme","docs","docs_design","designer","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic_architecture_supervisor","curator_init","curator_phase","skill_improver","spec_writer","reviewer","critic_finding_validator","critic","coder","test_engineer"]},knowledge_receipt_status:{description:"receipt status",agents:["architect"]},knowledge_archive:{description:"archive (default), quarantine, or purge a swarm or hive knowledge entry by ID with an immutable audit tombstone; purge requires an admin flag",agents:["architect"]},swarm_memory_recall:{description:"recall scoped Swarm memory for the current repository as untrusted background",agents:[]},swarm_memory_propose:{description:"create a pending Swarm memory proposal; does not write durable memory directly",agents:[]},swarm_memory_outcome:{description:"record useful, dead-end, or corrected outcomes and, when enabled, synchronously refresh deterministic memory lessons",agents:[]},swarm_command:{description:"run supported /swarm commands through the canonical command registry",agents:["architect","sme","researcher","docs","docs_design","designer","reviewer","critic_finding_validator","critic","explorer","coder","test_engineer"]},dispatch_lanes:{description:"dispatch read-only exploration/review lanes concurrently and BLOCK until all finish; prefer dispatch_lanes_async for non-blocking dispatch, use this only when promptAsync is unavailable",agents:["architect"]},dispatch_lanes_async:{description:"launch read-only advisory lanes non-blockingly and return a batch id plus lane session handles immediately; each lane agent must be a registered generated agent name (unregistered bare roles are refused on multi-swarm hosts); launch_timeout_ms is only a promptAsync acceptance budget, not a lane runtime timeout; poll incrementally with collect_lane_results (wait omitted), or join with wait: true for all results",agents:["architect"]},collect_lane_results:{description:"collect/poll a dispatch_lanes_async batch — OBSERVATION ONLY; it can never cancel or abort a lane. A presumed-stale sweep runs on every call, settling lanes past the horizon: idle host to stale, unobservable host to a typed liveness error. The wait budget (timeout_ms) bounds this observer call only — its expiry, a missing messages client, or a degraded liveness probe never kills a lane, never proves it died, and never settles anything. If a collection returns pending lanes, poll again first; busy/retry host status is live evidence, not failure. Cancellation is a distinct, explicit, authorized, potentially destructive action: use cancel_lane_batch (confirm: true + reason), never this tool. An explicit operator cancellation settles as the distinct operator_cancelled class — not liveness. Unsettled lanes are reported in pending_lanes (batch_id, lane_id, status, output_ref) regardless of include_pending. Does not advance workflow gates. Settled-lane inline output is delivered once: later polls set output_omitted_repeat: true and omit output but keep output_ref for retrieval via retrieve_lane_output.",agents:["architect"]},cancel_lane_batch:{description:"cancel ACTIVE lanes of a dispatch_lanes_async batch — the only cancellation surface (collect_lane_results cannot cancel). Destructive and authorization-gated: requires confirm: true + a bounded reason, recorded on cancelled terminals as the distinct operator_cancelled class (never liveness; not auto-retryable, never consumes retry budget — re-dispatch explicitly). Race-safe per lane: busy/retry refused (live work is never destroyed — human force path: /swarm abort-pr-workflow); degraded/absent status probe refuses the whole batch fail-closed; idle or host-unknown sessions may be cancelled; a child completing in the race window is preserved; an abort timeout never claims cancellation.",agents:["architect"]},summarize_work:{description:"emit a short structured summary of completed work (key decisions, assumptions, risks, constraints) at task completion; rolls up per phase for architecture-supervisor review. Advisory, never blocks.",agents:["architect","sme","researcher","docs","docs_design","designer","explorer","coder","test_engineer"]},write_architecture_supervisor_evidence:{description:"persist the architecture supervisor verdict for a phase (architect MUST dispatch critic_architecture_supervisor first and collect its JSON verdict; this tool persists only, it does not contact the supervisor)",agents:["architect"]},lean_turbo_plan_lanes:{description:"partition phase tasks into parallel lanes based on file-scope conflicts for Lean Turbo execution",agents:[]},lean_turbo_acquire_locks:{description:"acquire file locks for all files in a lane (all-or-nothing) before lane execution",agents:[]},lean_turbo_runner_status:{description:"read Lean Turbo run state from .swarm/turbo-state.json",agents:[]},lean_turbo_critic:{description:"dispatch a read-only critic agent to evaluate boundary conditions for a completed Lean Turbo phase (satisfies the turbo.lean.phase_critic gate)",agents:[]},lean_turbo_review:{description:"dispatch a read-only reviewer agent to evaluate a completed Lean Turbo phase",agents:[]},lean_turbo_run_phase:{description:"Execute a phase using Lean Turbo parallel lane execution. Plans lanes, acquires file locks, and dispatches coder agents concurrently. Use when Lean Turbo is active and you want to execute all tasks in a phase in parallel lanes.",agents:[]},lean_turbo_status:{description:"returns Lean Turbo configuration and active status for the current session",agents:[]},swarm_apply_patch:{description:"Apply a unified diff patch to workspace files with exact context matching, atomic writes, and path validation. Use standard unified diff format only — does NOT support *** Begin Patch / *** Update File payloads (use native apply_patch for those).",agents:["coder","test_engineer"]},external_skill_discover:{description:"Discover external skill candidates from configured sources. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_list:{description:"List external skill candidates in the quarantine store. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_inspect:{description:"Inspect a specific external skill candidate by ID. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_promote:{description:"Promote a validated external skill candidate to an active generated skill. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_reject:{description:"Reject an external skill candidate after evaluation. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_delete:{description:"Delete an external skill candidate from the quarantine store. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_revoke:{description:"Revoke a previously promoted external skill. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},epic_next_wave:{description:"Epic Mode: the single, idempotent way forward while an epic is open. Closes the active wave once every task is resolved (recording per-task outcomes and declared-vs-actual divergence, which Epic learning uses to plan later waves), keeps phases in order, and issues the next wave of disjoint tasks with dispatch instructions. Returns a status: dispatch | declare-scopes | in-progress | blocked | phase-ready-for-review | epic-complete | refused. Requires `epic.mode.enabled: true` and an epic opened by `/swarm epic start`.",agents:[]},epic_phase_review:{description:"Epic Mode phase readiness: dispatch a read-only phase reviewer, then (only if it APPROVES) a read-only phase critic over the completed phase; parse both verdicts from the agents and record them to .swarm/evidence/{phase}/epic-phase-review.json. Required by phase_complete while an epic is open for the current plan; re-run after any fix (evidence is bound to the plan and phase task evidence).",agents:[]}},TOOL_NAMES=Object.keys(TOOL_METADATA),TOOL_NAME_SET=new Set(TOOL_NAMES);TOOL_DESCRIPTIONS=Object.fromEntries(Object.entries(TOOL_METADATA).map(([name,meta])=>[name,meta.description])),AGENT_TOOL_MAP=(()=>{let map=Object.fromEntries(ALL_AGENT_NAMES.map((agent)=>[agent,[]]));for(let[name,meta]of Object.entries(TOOL_METADATA))for(let agent of meta.agents)map[agent].push(name);return map})()});function scanOverrideForDangerousKeys(value,path,depth){if(depth>=10)return;if(Array.isArray(value)){for(let i=0;i<value.length;i++)scanOverrideForDangerousKeys(value[i],`${path}[${i}]`,depth+1);return}if(typeof value!=="object"||value===null)return;for(let key of Object.keys(value)){if(DANGEROUS_MERGE_KEYS.has(key))throw new DangerousMergeKeyError(key,path);scanOverrideForDangerousKeys(value[key],`${path}.${key}`,depth+1)}}function deepMergeInternal(base,override,depth,path){if(depth>=10)throw Error("deepMerge exceeded maximum depth of 10");let result={...base};for(let key of Object.keys(override)){let baseVal=base[key],overrideVal=override[key];if(typeof baseVal==="object"&&baseVal!==null&&typeof overrideVal==="object"&&overrideVal!==null&&!Array.isArray(baseVal)&&!Array.isArray(overrideVal))result[key]=deepMergeInternal(baseVal,overrideVal,depth+1,`${path}.${key}`);else result[key]=overrideVal}return result}function deepMerge(base,override){if(!base)return override;if(!override)return base;return scanOverrideForDangerousKeys(override,"$",0),deepMergeInternal(base,override,0,"$")}var MAX_MERGE_DEPTH=10,DANGEROUS_MERGE_KEYS,DangerousMergeKeyError;var init_merge=__esm(()=>{DANGEROUS_MERGE_KEYS=new Set(["__proto__","constructor","prototype"]);DangerousMergeKeyError=class DangerousMergeKeyError extends Error{key;path;constructor(key,path){super(`deepMerge refused dangerous key "${key}" at "${path}": prototype-pollution carriers (__proto__/constructor/prototype) are never merged`);this.key=key;this.path=path;this.name="DangerousMergeKeyError"}}});function freezeSet(items,name="CLAUDE_CODE_NATIVE_COMMANDS"){let set=new Set(items),proxy=new Proxy(set,{get(target,prop){if(prop==="add"||prop==="delete"||prop==="clear")return()=>{throw TypeError(`${name} is readonly`)};if(prop==="forEach")return(callback,thisArg)=>{let wrapped=(v,k)=>callback.call(thisArg??void 0,v,k,proxy);return set.forEach(wrapped)};let value=Reflect.get(target,prop);return typeof value==="function"?value.bind(target):value},set(){throw TypeError(`${name} is readonly`)},deleteProperty(){throw TypeError(`${name} is readonly`)},defineProperty(){throw TypeError(`${name} is readonly`)},setPrototypeOf(){throw TypeError(`${name} is readonly`)}});return proxy}function isQAAgent(name){return QA_AGENTS.includes(name)}function isSubagent(name){return ALL_SUBAGENT_NAMES.includes(name)}function isLowCapabilityModel(modelId){let lower=(modelId||"").toLowerCase();return LOW_CAPABILITY_MODELS.some((substr)=>lower.includes(substr))}var OPENCODE_NATIVE_AGENTS,CLAUDE_CODE_NATIVE_COMMANDS,OPENCODE_NATIVE_COMMANDS,MEMORY_AGENT_TOOL_MAP,EXTERNAL_SKILL_TOOL_NAMES,EXTERNAL_SKILL_AGENT_TOOL_MAP,COUNCIL_TOOL_NAMES,COUNCIL_AGENT_TOOL_MAP,GENERAL_COUNCIL_TOOL_NAMES,GENERAL_COUNCIL_AGENT_TOOL_MAP,TURBO_TOOL_NAMES,TURBO_AGENT_TOOL_MAP,EPIC_TOOL_NAMES,EPIC_AGENT_TOOL_MAP,SKILL_TOOL_NAMES,SKILL_AGENT_TOOL_MAP,PR_REVIEW_CHILD_TOOL_NAMES,PR_REVIEW_CHILD_AGENT_TOOL_MAP,WRITE_TOOL_NAMES,SUMMARIZER_EXEMPT_TOOL_NAMES,DEFAULT_MODELS,DEFAULT_AGENT_CONFIGS,DEFAULT_SCORING_CONFIG,LOW_CAPABILITY_MODELS,TURBO_MODE_BANNER=`## \uD83D\uDE80 TURBO MODE ACTIVE
2
2
 
3
3
  **Speed optimization enabled for this session.**
4
4
 
@@ -610,7 +610,7 @@ ${squashResult.stdout}`,restore=await runGit3(["checkout","-q","HEAD","--",...in
610
610
  `.split(`
611
611
  `)){let line=rawLine.endsWith("\r")?rawLine.slice(0,-1):rawLine;if(line.startsWith("worktree ")){worktreePath=line.slice(9);continue}if(!line.startsWith("branch ")||!worktreePath)continue;try{fs22.statSync(worktreePath)}catch(error49){let code=error49.code;if(code==="ENOENT"||code==="ENOTDIR")continue;return{status:"uncertain",reason:`registered worktree path "${worktreePath}" is unreadable: ${error49 instanceof Error?error49.message:String(error49)}`}}let branch=line.slice(7);liveBranches.push(branch.startsWith("refs/heads/")?branch.slice(11):branch)}return{status:"ok",liveBranches}}async function readLaneBranchHead(branchName,primaryDir){return runGit3(["rev-parse","--verify","--quiet",`refs/heads/${branchName}`],primaryDir)}async function captureLaneSourceHead(worktreePath,branchName,primaryDir,knownMissing){if(!knownMissing){let fromWorktree=await runGit3(["rev-parse","HEAD"],worktreePath);if(fromWorktree.spawnFailure?.kind!=="cwd-missing")return{result:fromWorktree,sourceWorktreeMissing:!1}}return{result:await readLaneBranchHead(branchName,primaryDir),sourceWorktreeMissing:!0}}async function handleSourceWorktreeGone(branchHead,worktreePath,branchName,primaryDir,provenance){if(!(branchHead.spawnFailure===void 0&&branchHead.exitCode===0&&branchHead.stdout.trim().length>0)){let definitelyAbsent=branchHead.spawnFailure===void 0&&branchHead.exitCode===1;return{failed:!0,stage:definitelyAbsent?SOURCE_WORKTREE_GONE_STAGE:SOURCE_WORKTREE_UNCERTAIN_STAGE,message:definitelyAbsent?`Lane worktree "${worktreePath}" is gone and branch "${branchName}" no longer exists; nothing is recoverable`:`Lane worktree "${worktreePath}" is gone and branch "${branchName}" existence could not be determined: ${branchHead.stderr.trim()||`git exited ${branchHead.exitCode}`}`,...provenance?{provenance}:{}}}let prune=await runGit3(["worktree","prune"],primaryDir);if(prune.exitCode!==0)log(`[worktree] attemptMergeBackFromDirty: worktree prune failed for "${worktreePath}": ${prune.stderr.trim()||prune.stdout.trim()}`);return advisoryWarn(`STALE_LANE_WORKTREE_DETECTED: lane worktree "${worktreePath}" no longer exists. Its stale git registration was pruned, and the merge-back for branch "${branchName}" is being taken from "${primaryDir}" instead. Any uncommitted work in that worktree is unrecoverable; every commit on the branch is preserved.`),null}async function attemptMergeBackFromDirty(worktreePath,branchName,primaryDir,strategy,options={}){let autoCommitted=!1,cleaned=!1,autoCommitFailed=!1,cleanFailed=!1,provenance=options.resume,sourceWorktreeMissing=!1;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:reconciliation.method==="worktree-match"?"squash-unstaged":strategy,autoCommitted:!1,cleaned:!1,reconciled:!0,provenance};let source=await captureLaneSourceHead(worktreePath,branchName,primaryDir,!1);if(source.sourceWorktreeMissing){let unrecoverable=await handleSourceWorktreeGone(source.result,worktreePath,branchName,primaryDir,provenance);if(unrecoverable)return unrecoverable;sourceWorktreeMissing=!0}let sourceHead=source.result,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&&!sourceWorktreeMissing){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}`)}if(!sourceWorktreeMissing){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)if((await runGit3(["rev-parse","--git-dir"],worktreePath)).spawnFailure?.kind==="cwd-missing"){let unrecoverable=await handleSourceWorktreeGone(await readLaneBranchHead(branchName,primaryDir),worktreePath,branchName,primaryDir,provenance);if(unrecoverable)return unrecoverable;sourceWorktreeMissing=!0,autoCommitFailed=!1,cleanFailed=!1,cleaned=!1}else return{failed:!0,stage:"cleanup",message:"Auto-commit and clean both failed; abandoning worktree",...provenance?{provenance}:{}};let initialOverlapSnapshot=await _internals36.captureMergeOverlapSnapshot(primaryDir,branchName);if("error"in initialOverlapSnapshot)return{failed:!0,stage:"pre-merge",message:initialOverlapSnapshot.error,...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"};if(provenance={operationId:options.operationId,sourceHead:initialOverlapSnapshot.snapshot.laneHead,targetHeadBefore:initialOverlapSnapshot.snapshot.targetHead,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 finalOverlapSnapshot=await _internals36.captureMergeOverlapSnapshot(primaryDir,branchName);if("error"in finalOverlapSnapshot)return{failed:!0,stage:"pre-merge",message:finalOverlapSnapshot.error,...provenance?{provenance}:{}};if(finalOverlapSnapshot.snapshot.overlapPaths.length>0)return{partial:!0,stage:"pre-merge-overlap",autoCommitted,cleaned,message:`Primary checkout has overlapping dirty paths with incoming lane changes: ${finalOverlapSnapshot.snapshot.overlapPaths.join(", ")}`,conflictFiles:finalOverlapSnapshot.snapshot.overlapPaths,code:"SETTLEMENT_OVERLAP_BLOCKED",recoveryHint:`ACTION: commit or stash your local changes to the overlapping paths (or run /swarm recover for the preserved lane), then re-dispatch the lane. Overlapping paths: ${finalOverlapSnapshot.snapshot.overlapPaths.join(", ")}`,...provenance?{provenance}:{}};if(!sameOverlapSnapshot(initialOverlapSnapshot.snapshot,finalOverlapSnapshot.snapshot))return{failed:!0,stage:"pre-merge",message:"Primary or lane state changed during overlap preflight; refusing merge-back",...provenance?{provenance}:{}};let landingStrategy=strategy==="merge"&&!options.commitLanding?"squash-unstaged":strategy,mergeResult=await mergeLaneBranch(primaryDir,branchName,landingStrategy,landingStrategy==="merge"&&options.commitLanding?options.landingCommitMessage:void 0);if("merged"in mergeResult&&mergeResult.merged)return{merged:!0,strategy:landingStrategy,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(`
612
612
  `)){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=[],options={}){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);await runGit3(["worktree","prune"],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",options.preserveUnmerged?"-d":"-D",branch],directory);if(deleteResult.exitCode===0)removed.push(branch);else errors3.push({branch,error:deleteResult.stderr.trim()||deleteResult.stdout.trim()})}return{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 _internals36,MERGE_TIMEOUT_MS=30000,GIT_SPAWN_FAILURE_EXIT_CODE2=1,SOURCE_WORKTREE_GONE_STAGE="source-worktree-gone",SOURCE_WORKTREE_UNCERTAIN_STAGE="source-worktree-uncertain",GIT_OBJECT_ID_PATTERN;var init_merge2=__esm(()=>{init_warning_buffer();init_recovery();init_utils();init_bun_compat();init_git_binary_missing_error();init_git_executable();init_core3();_internals36={bunSpawn,platform:process.platform,sleep:(ms)=>new Promise((resolve22)=>setTimeout(resolve22,ms)),cleanupOrphanedBranches,startupOrphanRecovery,captureMergeOverlapSnapshot,extractSessionId,resolveGitExecutable};GIT_OBJECT_ID_PATTERN=/^[0-9a-f]{40}$|^[0-9a-f]{64}$/});function isSafeGitBranchName(value){if(typeof value!=="string"||!BRANCH_NAME_PATTERN.test(value))return!1;if(value.includes("..")||value.endsWith("/")||value.endsWith("."))return!1;return!value.split("/").some((segment)=>segment.length===0||segment.startsWith(".")||segment.endsWith(".lock"))}function isSafeWorktreePath(value){return typeof value==="string"&&value.length>0&&value.length<=4096&&!value.startsWith("-")&&unsafePathTextReason(value)===null}function formatUnreadableMessage(code,filePath,detail,remediation){throw Error(`${code}: ${filePath} ${detail}. ${remediation}`)}function parseWalObject(raw,filePath,code,remediation){let parsed;try{parsed=JSON.parse(raw)}catch(error49){formatUnreadableMessage(code,filePath,`is not valid JSON (${error49 instanceof Error?error49.message:String(error49)})`,remediation)}if(typeof parsed!=="object"||parsed===null||Array.isArray(parsed))formatUnreadableMessage(code,filePath,"is not a JSON object",remediation);return parsed}function parseCoderSettlementWal(raw,filePath,expectedTaskId){let parsed=parseWalObject(raw,filePath,"CODER_SETTLEMENT_WAL_UNREADABLE","Preserve this file, reconcile the task lane, and only then move it aside."),context=parsed.context,baseline=context?.baseline,worktree=parsed.worktree,provenance=parsed.mergeProvenance;if(parsed.version!==1||!["ABORTED","COMMITTED","DISPATCHED","PREPARED"].includes(String(parsed.state))||typeof parsed.taskId!=="string"||!TASK_ID_PATTERN.test(parsed.taskId)||typeof parsed.transitionId!=="string"||parsed.transitionId.length===0||parsed.transitionId.length>512||typeof parsed.actor!=="string"||parsed.actor.length===0||parsed.actor.length>512||!Number.isInteger(parsed.processId)||(parsed.processId??0)<=0||typeof parsed.runtimeId!=="string"||parsed.runtimeId.length===0||!Number.isInteger(parsed.expectedGeneration)||(parsed.expectedGeneration??-1)<0||!context||!baseline||typeof baseline.directory!=="string"||baseline.directory.length===0||baseline.directory.length>4096||typeof baseline.gitHead!=="string"&&baseline.gitHead!==null||typeof baseline.dirtyHash!=="string"&&baseline.dirtyHash!==null||typeof baseline.prHeadSha!=="string"&&baseline.prHeadSha!==null||typeof baseline.scope!=="string"&&baseline.scope!==null||!Array.isArray(baseline.changedFiles)&&baseline.changedFiles!==null&&baseline.changedFiles!==void 0||Array.isArray(baseline.changedFiles)&&(baseline.changedFiles.length>50000||baseline.changedFiles.some((candidatePath)=>typeof candidatePath!=="string"||candidatePath.length>4096))||!Array.isArray(context.declaredFiles)&&context.declaredFiles!==null||Array.isArray(context.declaredFiles)&&(context.declaredFiles.length>50000||context.declaredFiles.some((candidatePath)=>typeof candidatePath!=="string"||candidatePath.length>4096))||parsed.observedFiles!==void 0&&(!Array.isArray(parsed.observedFiles)||parsed.observedFiles.length>50000||parsed.observedFiles.some((candidatePath)=>typeof candidatePath!=="string"||candidatePath.length>4096||Array.isArray(context.declaredFiles)&&context.declaredFiles.length>0&&!isPathWithinDeclaredScope(candidatePath,context.declaredFiles,baseline.directory)))||worktree!==void 0&&(typeof worktree.callID!=="string"||typeof worktree.parentSessionId!=="string"||typeof worktree.taskId!=="string"||worktree.taskId!==parsed.taskId||!isSafeWorktreePath(worktree.worktreePath)||!isSafeGitBranchName(worktree.branchName)||typeof worktree.worktreeId!=="string"||typeof worktree.worktreeSessionId!=="string"||!["merge","rebase","cherry-pick"].includes(String(worktree.mergeStrategy))||!Number.isInteger(worktree.laneIndex))||provenance!==void 0&&(typeof provenance.operationId!=="string"||provenance.operationId!==parsed.transitionId||typeof provenance.sourceHead!=="string"||!GIT_OBJECT_ID_PATTERN.test(provenance.sourceHead)||typeof provenance.targetHeadBefore!=="string"||!GIT_OBJECT_ID_PATTERN.test(provenance.targetHeadBefore)||!isSafeGitBranchName(provenance.branchName)||worktree!==void 0&&(provenance.branchName!==worktree.branchName||provenance.strategy!==worktree.mergeStrategy)||!["merge","rebase","cherry-pick"].includes(String(provenance.strategy)))||typeof parsed.recordedAt!=="string"||parsed.state==="PREPARED"&&typeof parsed.accepted!=="boolean"||parsed.cleanupComplete!==void 0&&typeof parsed.cleanupComplete!=="boolean"||parsed.settlementFailed!==void 0&&typeof parsed.settlementFailed!=="boolean"||parsed.abortReason!==void 0&&(typeof parsed.abortReason!=="string"||parsed.abortReason.length===0||parsed.abortReason.length>512))formatUnreadableMessage("CODER_SETTLEMENT_WAL_UNREADABLE",filePath,"is not a valid v1 coder-settlement WAL","Preserve this file, reconcile the task lane, and only then move it aside.");if(expectedTaskId&&parsed.taskId!==expectedTaskId)formatUnreadableMessage("CODER_SETTLEMENT_WAL_TASK_MISMATCH",filePath,`records task ${parsed.taskId} but was read for task ${expectedTaskId}`,"Preserve this file, reconcile the task lane, and only then move it aside.");return parsed}function parseTaskRepairWal(raw,filePath,expectedTaskId){let parsed=parseWalObject(raw,filePath,"TASK_REPAIR_WAL_UNREADABLE","Preserve this file, reconcile the repair transition, and only then move it aside.");if(parsed.version!==1||parsed.state!=="PREPARED"&&parsed.state!=="COMMITTED"&&parsed.state!=="ABORTED"||typeof parsed.taskId!=="string"||!TASK_ID_PATTERN.test(parsed.taskId)||typeof parsed.transitionId!=="string"||parsed.transitionId.length===0||parsed.transitionId.length>512||typeof parsed.reason!=="string"||parsed.reason.length===0||parsed.reason.length>4096||typeof parsed.actor!=="string"||parsed.actor.length===0||parsed.actor.length>512||typeof parsed.oldPlanStatus!=="string"||parsed.oldPlanStatus.length===0||parsed.oldPlanStatus.length>128||parsed.newPlanStatus!=="in_progress"||typeof parsed.oldWorkflowState!=="string"||!WORKFLOW_STATES.has(parsed.oldWorkflowState)||parsed.newWorkflowState!=="idle"||!Number.isInteger(parsed.generation)||(parsed.generation??-1)<0||!Number.isInteger(parsed.oldGeneration)||(parsed.oldGeneration??-1)<0||parsed.generation!==(parsed.oldGeneration??-1)+1||typeof parsed.recordedAt!=="string"||!Number.isFinite(Date.parse(parsed.recordedAt)))formatUnreadableMessage("TASK_REPAIR_WAL_UNREADABLE",filePath,"is not a valid v1 repair WAL (unexpected shape or version)","Preserve this file, reconcile the repair transition, and only then move it aside.");if(expectedTaskId&&parsed.taskId!==expectedTaskId)formatUnreadableMessage("TASK_REPAIR_WAL_TASK_MISMATCH",filePath,`records task ${parsed.taskId} but was read for task ${expectedTaskId}`,"Preserve this file, reconcile the repair transition, and only then move it aside.");return parsed}function parseTaskTerminalWal(raw,filePath,expectedTaskId){let parsed=parseWalObject(raw,filePath,"TASK_TERMINAL_WAL_UNREADABLE","Preserve this file and reconcile the task terminal transition before moving it aside.");if(parsed.version!==1&&parsed.version!==2||parsed.state!=="PREPARED"&&parsed.state!=="COMMITTED"&&parsed.state!=="ABORTED"||typeof parsed.taskId!=="string"||!TASK_ID_PATTERN.test(parsed.taskId)||typeof parsed.transitionId!=="string"||parsed.transitionId.length===0||parsed.transitionId.length>512||typeof parsed.actor!=="string"||parsed.actor.length===0||parsed.actor.length>512||typeof parsed.oldPlanStatus!=="string"||parsed.oldPlanStatus.length===0||parsed.oldPlanStatus.length>128||parsed.newPlanStatus!=="completed"&&parsed.newPlanStatus!=="blocked"&&parsed.newPlanStatus!=="closed"||typeof parsed.oldWorkflowState!=="string"||!WORKFLOW_STATES.has(parsed.oldWorkflowState)||parsed.newWorkflowState!=="complete"&&parsed.newWorkflowState!=="blocked"&&parsed.newWorkflowState!=="closed"||!Number.isInteger(parsed.generation)||(parsed.generation??-1)<0||typeof parsed.qaExempt!=="boolean"||parsed.readOnlyNoMutation!==void 0&&typeof parsed.readOnlyNoMutation!=="boolean"||parsed.externalEvidence!==void 0&&typeof parsed.externalEvidence!=="boolean"||typeof parsed.recordedAt!=="string"||!Number.isFinite(Date.parse(parsed.recordedAt)))formatUnreadableMessage("TASK_TERMINAL_WAL_UNREADABLE",filePath,"is not a valid terminal WAL","Preserve this file and reconcile the task terminal transition before moving it aside.");if(parsed.version===2&&(typeof parsed.planIdentityHash!=="string"||!SHA256_PATTERN.test(parsed.planIdentityHash)||typeof parsed.planEpoch!=="string"||!UUID_PATTERN.test(parsed.planEpoch)))formatUnreadableMessage("TASK_TERMINAL_WAL_UNREADABLE",filePath,"is missing the v2 plan identity fields","Preserve this file and reconcile the task terminal transition before moving it aside.");if(parsed.version===1&&(parsed.newPlanStatus==="closed"||parsed.newWorkflowState==="closed"))formatUnreadableMessage("TASK_TERMINAL_WAL_UNREADABLE",filePath,"claims a closed transition in a legacy v1 terminal WAL","Preserve this file and reconcile the task terminal transition before moving it aside.");if(parsed.readOnlyNoMutation===!0&&(parsed.newPlanStatus!=="completed"||parsed.newWorkflowState!=="complete"||parsed.generation!==0||parsed.qaExempt!==!1))throw Error(`TASK_TERMINAL_WAL_STATE_MISMATCH: ${filePath} claims read-only no-mutation completion outside generation 0`);if(!(parsed.newPlanStatus==="completed"&&parsed.newWorkflowState==="complete"||parsed.newPlanStatus==="blocked"&&parsed.newWorkflowState==="blocked"||parsed.newPlanStatus==="closed"&&parsed.newWorkflowState==="closed"))throw Error(`TASK_TERMINAL_WAL_STATE_MISMATCH: ${filePath} encodes ${String(parsed.newPlanStatus)} -> ${String(parsed.newWorkflowState)}`);if(expectedTaskId&&parsed.taskId!==expectedTaskId)formatUnreadableMessage("TASK_TERMINAL_WAL_TASK_MISMATCH",filePath,`records task ${parsed.taskId} but was read for task ${expectedTaskId}`,"Preserve this file and reconcile the task terminal transition before moving it aside.");return parsed}var TASK_ID_PATTERN,SHA256_PATTERN,BRANCH_NAME_PATTERN,UUID_PATTERN,WORKFLOW_STATES;var init_workflow_wal_schema=__esm(()=>{init_path_identity();init_merge2();TASK_ID_PATTERN=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,SHA256_PATTERN=/^[0-9a-f]{64}$/,BRANCH_NAME_PATTERN=/^[A-Za-z0-9_][A-Za-z0-9._/-]{0,1023}$/;UUID_PATTERN=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,WORKFLOW_STATES=new Set(["idle","coder_delegated","pre_check_passed","reviewer_run","tests_run","rework_required","complete","blocked","closed"])});import*as fs23 from"node:fs";import{mkdir as mkdir9,open as open4}from"node:fs/promises";import{dirname as dirname19}from"node:path";function maxBytesFor(kind){return kind==="coder-settlement"?CODER_SETTLEMENT_MAX_BYTES:SMALL_WORKFLOW_WAL_MAX_BYTES}function remediationFor(kind){switch(kind){case"coder-settlement":return"Preserve this file, reconcile the task lane, and only then move it aside.";case"task-repair":return"Preserve this file, reconcile the repair transition, and only then move it aside.";case"task-terminal":return"Preserve this file and reconcile the task terminal transition before moving it aside."}}function unreadableCode(kind){switch(kind){case"coder-settlement":return"CODER_SETTLEMENT_WAL_UNREADABLE";case"task-repair":return"TASK_REPAIR_WAL_UNREADABLE";case"task-terminal":return"TASK_TERMINAL_WAL_UNREADABLE"}}function walIoError(kind,filePath,action,error49){let detail=error49 instanceof Error?error49.message:String(error49);return Error(`${unreadableCode(kind)}: could not ${action} ${filePath} (${detail}). ${remediationFor(kind)}`,{cause:error49})}function oversizeCode(kind){switch(kind){case"coder-settlement":return"CODER_SETTLEMENT_WAL_OVERSIZE";case"task-repair":return"TASK_REPAIR_WAL_OVERSIZE";case"task-terminal":return"TASK_TERMINAL_WAL_OVERSIZE"}}function oversizeMessage(kind,filePath,maxBytes){if(kind==="coder-settlement")throw Error(`${oversizeCode(kind)}: ${filePath} exceeds the 64 MiB safety limit. Preserve this file, reconcile the lane, reduce or partition the declared scope, and only then move the WAL aside.`);throw Error(`${oversizeCode(kind)}: ${filePath} exceeds the ${maxBytes} byte safety limit. ${remediationFor(kind)}`)}function decodeUtf8(kind,filePath,bytes){try{return UTF8_FATAL_DECODER.decode(bytes)}catch(error49){throw Error(`${unreadableCode(kind)}: ${filePath} is not valid UTF-8 (${error49 instanceof Error?error49.message:String(error49)}). ${remediationFor(kind)}`)}}function validateWal(kind,raw,filePath,expectedTaskId){switch(kind){case"coder-settlement":return parseCoderSettlementWal(raw,filePath,expectedTaskId);case"task-repair":return parseTaskRepairWal(raw,filePath,expectedTaskId);case"task-terminal":return parseTaskTerminalWal(raw,filePath,expectedTaskId)}}async function readBoundedBytes(kind,filePath,maxBytes){let handle;try{handle=await _internals37.openFile(filePath,"r")}catch(error49){if(error49.code==="ENOENT")return null;throw walIoError(kind,filePath,"open",error49)}let result=new Uint8Array,failure=null;try{let limit=maxBytes+1,chunks=[],total=0;while(!0){let remaining=limit-total;if(remaining<=0)break;let buffer=Buffer.alloc(Math.min(CHUNK_BYTES,remaining)),{bytesRead}=await handle.read(buffer,0,buffer.length,null);if(bytesRead===0)break;if(total+=bytesRead,chunks.push(buffer.subarray(0,bytesRead)),total>maxBytes)break}result=Buffer.concat(chunks,total)}catch(error49){failure=walIoError(kind,filePath,"read",error49)}try{await handle.close()}catch(error49){failure??=walIoError(kind,filePath,"close",error49)}if(failure)throw failure;return result}function readBoundedBytesSync(kind,filePath,maxBytes){let fd;try{fd=_internals37.openFileSync(filePath,"r")}catch(error49){if(error49.code==="ENOENT")return null;throw walIoError(kind,filePath,"open",error49)}let result=new Uint8Array,failure=null;try{let limit=maxBytes+1,chunks=[],total=0;while(!0){let remaining=limit-total;if(remaining<=0)break;let buffer=Buffer.alloc(Math.min(CHUNK_BYTES,remaining)),bytesRead=_internals37.readFileSync(fd,buffer,0,buffer.length,null);if(bytesRead===0)break;if(total+=bytesRead,chunks.push(buffer.subarray(0,bytesRead)),total>maxBytes)break}result=Buffer.concat(chunks,total)}catch(error49){failure=walIoError(kind,filePath,"read",error49)}try{_internals37.closeFileSync(fd)}catch(error49){failure??=walIoError(kind,filePath,"close",error49)}if(failure)throw failure;return result}async function readWorkflowWalFile(kind,filePath,expectedTaskId){let maxBytes=maxBytesFor(kind),bytes=await readBoundedBytes(kind,filePath,maxBytes);if(bytes===null)return null;if(bytes.length===0)throw Error(`${unreadableCode(kind)}: ${filePath} is empty. ${remediationFor(kind)}`);if(bytes.length>maxBytes)oversizeMessage(kind,filePath,maxBytes);return validateWal(kind,decodeUtf8(kind,filePath,bytes),filePath,expectedTaskId)}function readWorkflowWalFileSync(kind,filePath,expectedTaskId){let maxBytes=maxBytesFor(kind),bytes=readBoundedBytesSync(kind,filePath,maxBytes);if(bytes===null)return null;if(bytes.length===0)throw Error(`${unreadableCode(kind)}: ${filePath} is empty. ${remediationFor(kind)}`);if(bytes.length>maxBytes)oversizeMessage(kind,filePath,maxBytes);return validateWal(kind,decodeUtf8(kind,filePath,bytes),filePath,expectedTaskId)}async function writeWorkflowWalFile(kind,filePath,wal){let serialized=`${JSON.stringify(wal,null,2)}
613
- `,maxBytes=maxBytesFor(kind);if(Buffer.byteLength(serialized,"utf8")>maxBytes)oversizeMessage(kind,filePath,maxBytes);validateWal(kind,serialized,filePath,wal.taskId),await mkdir9(dirname19(filePath),{recursive:!0}),await atomicWriteFile(filePath,serialized)}var UTF8_FATAL_DECODER,CODER_SETTLEMENT_MAX_BYTES=67108864,SMALL_WORKFLOW_WAL_MAX_BYTES=1048576,CHUNK_BYTES=65536,_internals37;var init_workflow_wal_file=__esm(()=>{init_task_file();init_workflow_wal_schema();UTF8_FATAL_DECODER=new TextDecoder("utf-8",{fatal:!0}),_internals37={openFile:open4,openFileSync:fs23.openSync,readFileSync:fs23.readSync,closeFileSync:fs23.closeSync}});var exports_gate_evidence={};__export(exports_gate_evidence,{withTaskEvidenceTransaction:()=>withTaskEvidenceTransaction,transitionTaskWorkflowEvidenceWithStatus:()=>transitionTaskWorkflowEvidenceWithStatus,transitionTaskWorkflowEvidence:()=>transitionTaskWorkflowEvidence,reduceTaskWorkflowSnapshot:()=>reduceTaskWorkflowSnapshot,recordTodoScanEvidence:()=>recordTodoScanEvidence,recordGateEvidence:()=>recordGateEvidence,recordAgentDispatch:()=>recordAgentDispatch,readTaskEvidenceState:()=>readTaskEvidenceState,readTaskEvidenceRaw:()=>readTaskEvidenceRaw,readTaskEvidence:()=>readTaskEvidence,readCurrentTaskDeclaredFiles:()=>readCurrentTaskDeclaredFiles,parseTaskEvidence:()=>parseTaskEvidence,isValidTaskId:()=>isValidTaskId,isReadOnlyNoMutationEligible:()=>isReadOnlyNoMutationEligible,isExternalEvidenceInitialCompletionEligible:()=>isExternalEvidenceInitialCompletionEligible,hasPassedAllGates:()=>hasPassedAllGates,getTaskWorkflowSnapshot:()=>getTaskWorkflowSnapshot,externalProofCurrent:()=>externalProofCurrent,expandRequiredGates:()=>expandRequiredGates,ensureTaskGateRequirementsReceiptForSettledTransition:()=>ensureTaskGateRequirementsReceiptForSettledTransition,deriveRequiredGates:()=>deriveRequiredGates,deriveApplicableGateSet:()=>deriveApplicableGateSet,computeExternalDeclarationDigest:()=>computeExternalDeclarationDigest,compareTaskWorkflowStateRank:()=>compareTaskWorkflowStateRank,assertTaskEvidenceWriteAllowed:()=>assertTaskEvidenceWriteAllowed,_internals:()=>_internals38,TASK_WORKFLOW_SCHEMA_MARKER:()=>TASK_WORKFLOW_SCHEMA_MARKER,TASK_GATE_REQUIREMENTS_RECONSTRUCTION_SENTINEL:()=>TASK_GATE_REQUIREMENTS_RECONSTRUCTION_SENTINEL,ExternalEvidenceBundleSchema:()=>ExternalEvidenceBundleSchema,DEFAULT_REQUIRED_GATES:()=>DEFAULT_REQUIRED_GATES});import{createHash as createHash22}from"node:crypto";import{mkdirSync as mkdirSync15,readFileSync as readFileSync13,realpathSync as realpathSync10,statSync as statSync13}from"node:fs";import*as path40 from"node:path";function readCurrentTaskDeclaredFiles(directory,taskId){try{let planPath=validateSwarmPath(directory,"plan.json"),stat8=statSync13(planPath);if(!stat8.isFile()||stat8.size>MAX_PLAN_SCOPE_INSPECTION_BYTES)return null;let parsed=JSON.parse(readFileSync13(planPath,"utf8"));if(!Array.isArray(parsed.phases))return null;let declaredFiles=null;for(let phase of parsed.phases){if(!phase||typeof phase!=="object")return null;let tasks=phase.tasks;if(!Array.isArray(tasks))return null;for(let task of tasks){if(!task||typeof task!=="object")return null;let record2=task;if(record2.id!==taskId)continue;if(!Array.isArray(record2.files_touched)||!record2.files_touched.every((file2)=>typeof file2==="string"))return null;if(declaredFiles!==null)return null;declaredFiles=[...record2.files_touched]}}return declaredFiles}catch{return null}}function assertTaskEvidenceWriteAllowed(directory,taskId,event){assertValidTaskId(taskId);let coderWalPath=validateSwarmPath(directory,`coder-settlements/${taskId}.json`),coderWal=readWorkflowWalFileSync("coder-settlement",coderWalPath,taskId);if((coderWal?.state==="DISPATCHED"||coderWal?.state==="PREPARED")&&!(event!=null&&event.transitionId===coderWal.transitionId&&(event.type==="dispatch_attempted"||event.type==="dispatch_no_mutation"||event.type==="accepted_mutation")))throw Error(`CODER_SETTLEMENT_IN_PROGRESS: transition ${String(coderWal.transitionId)} owns evidence for task ${taskId}. Wait for the owning transition to settle or run /swarm recover ${taskId} (or /swarm reset-session), then retry; do not remove the WAL by hand.`);let terminalWalPath=validateSwarmPath(directory,`task-terminals/${taskId}.json`),terminalWal=readWorkflowWalFileSync("task-terminal",terminalWalPath,taskId);if(terminalWal?.state==="PREPARED"){if(!(event!=null&&event.transitionId===terminalWal.transitionId&&(event.type==="task_completed"&&terminalWal.newPlanStatus==="completed"||event.type==="task_blocked"&&terminalWal.newPlanStatus==="blocked"||event.type==="task_closed"&&terminalWal.newPlanStatus==="closed")))throw Error(`TASK_TERMINAL_PREPARED: transition ${String(terminalWal.transitionId)} owns evidence for task ${taskId}`)}let repairWalPath=validateSwarmPath(directory,`task-repairs/${taskId}.json`),repairWal=readWorkflowWalFileSync("task-repair",repairWalPath,taskId);if(repairWal?.state==="PREPARED"&&!(event?.type==="repair_idle"&&event.transitionId===repairWal.transitionId))throw Error(`TASK_REPAIR_PREPARED: transition ${String(repairWal.transitionId)} owns evidence for task ${taskId}`)}function parseTaskEvidence(raw,expectedTaskId){let parsed=TaskEvidenceSchema.parse(JSON.parse(raw));if(parsed.taskId!==expectedTaskId)throw Error(`TASK_EVIDENCE_IDENTITY_MISMATCH: expected ${expectedTaskId}, found ${parsed.taskId}`);return parsed}function isValidTaskId(taskId){return isStrictTaskId(taskId)}function assertValidTaskId(taskId){assertStrictTaskId(taskId)}function createDefaultWorkflowMetadata(nowIso2){return{schema:TASK_WORKFLOW_SCHEMA_MARKER,generation:0,state:DEFAULT_WORKFLOW_STATE,retryCount:0,retryHistory:[],retryEpoch:0,lastOutcome:"none",lastTransitionId:null,updatedAt:nowIso2}}function getEventOutcome(event){switch(event.type){case"dispatch_attempted":return"dispatch_attempted";case"dispatch_no_mutation":return"dispatch_no_mutation";case"accepted_mutation":return event.context?.settlementFailed===!0?"accepted_mutation_failed":"accepted_mutation";case"stage_a_passed":return"stage_a_passed";case"stage_a_failed":return"stage_a_failed";case"stage_b_completed":return"stage_b_completed";case"stage_b_failed":return"stage_b_failed";case"gate_recorded":return"gate_recorded";case"task_completed":return"task_completed";case"task_blocked":return"task_blocked";case"task_closed":return"task_closed";case"repair_idle":return"repair_idle";case"external_evidence_attested":return"external_evidence_attested";case"external_evidence_revoked":return"external_evidence_revoked"}}function isAuthoritativeWorkflowMetadata(workflow){return workflow?.schema===TASK_WORKFLOW_SCHEMA_MARKER}function getTaskWorkflowSnapshot(evidence){if(isAuthoritativeWorkflowMetadata(evidence?.workflow))return{...evidence.workflow,authoritative:!0};return{...createDefaultWorkflowMetadata(""),authoritative:!1}}function maybeExpandRequiredGates(existing,event){if(event.type==="accepted_mutation"){let agentType=event.agentType;if(typeof agentType==="string"&&agentType.trim()!=="")return existing?expandRequiredGates(existing.required_gates.filter((gate)=>gate!==TASK_GATE_REQUIREMENTS_RECONSTRUCTION_SENTINEL),agentType,event.context??{}):deriveRequiredGates(agentType,event.context??{})}if(event.type==="stage_b_completed"&&event.ensureDefaultStageB===!0)return expandRequiredGates(existing?.required_gates??[],"coder",{testEngineerExempt:!1});if(event.type==="stage_b_completed"||event.type==="gate_recorded")return existing?expandRequiredGates(existing.required_gates,event.gate):deriveRequiredGates(event.gate);return existing?.required_gates??[]}function hasAllRequiredGatesPassed(requiredGates,gates){return requiredGates.length>0&&requiredGates.every((gate)=>gates[gate]!=null)}function shouldTreatGateAsStageB(gate){return gate==="reviewer"||gate==="test_engineer"}function clearWorkflowGateProof(gates){let retained={...gates};return delete retained.pre_check,delete retained.reviewer,delete retained.test_engineer,delete retained.council,delete retained.critic,delete retained.critic_sounding_board,retained}function assertExpectedGeneration(snapshot,event){if(typeof event.expectedGeneration==="number"&&event.expectedGeneration!==snapshot.generation)throw Error(`TASK_WORKFLOW_GENERATION_MISMATCH: expected ${event.expectedGeneration}, current ${snapshot.generation}`)}function isDuplicateTransition(snapshot,event){if(event.type==="dispatch_no_mutation"&&event.context?.declaredFiles?.length===0&&event.context.settlementTransitionId===event.transitionId&&!snapshot.noMutationSettlement)return!1;return snapshot.authoritative&&typeof event.transitionId==="string"&&event.transitionId.length>0&&snapshot.lastTransitionId===event.transitionId&&snapshot.lastOutcome===getEventOutcome(event)}function isNoMutationSettlementMetadata(workflow){let settlement=workflow.noMutationSettlement;if(!workflow.authoritative||workflow.generation!==0||settlement?.generation!==0||typeof settlement.transitionId!=="string"||settlement.transitionId.length===0||!Array.isArray(settlement.declaredFiles)||settlement.declaredFiles.length!==0)return!1;return workflow.state==="idle"||workflow.state==="complete"}function deriveApplicableGateSet(evidence,options){if(!evidence)return{requiredGates:["pre_check"],satisfiedGates:[],missingGates:["pre_check"],readOnlyNoMutation:!1};let workflow=getTaskWorkflowSnapshot(evidence),readOnlyNoMutation=isNoMutationSettlementMetadata(workflow)&&(options?.currentDeclaredFiles===void 0?!0:options.currentDeclaredFiles!==null&&options.currentDeclaredFiles.length===0),externalEvidenceMatched=workflow.lastOutcome==="external_evidence_attested"&&(workflow.externalEvidence?.anchors.length??0)>0&&workflow.externalEvidence.anchors.every((anchor)=>anchor.matched),requiredGates=[...new Set(evidence.required_gates??[])];if(!readOnlyNoMutation&&!externalEvidenceMatched&&!requiredGates.includes("pre_check"))requiredGates.unshift("pre_check");let satisfiedGates=requiredGates.filter((gate)=>evidence.gates?.[gate]!=null);return{requiredGates,satisfiedGates,missingGates:requiredGates.filter((gate)=>evidence.gates?.[gate]==null),readOnlyNoMutation}}function isReadOnlyNoMutationEligible(evidence,options){return deriveApplicableGateSet(evidence,options).readOnlyNoMutation}function computeExternalDeclarationDigest(input){let canonical={taskId:input.taskId,evidence_class:input.evidence_class,evidence_anchors:input.evidence_anchors.map((anchor)=>({command:anchor.command,expect:anchor.expect,expect_prefix:anchor.expect_prefix})),plan_title:input.plan_title,plan_swarm:input.plan_swarm,generation:input.generation};return createHash22("sha256").update(JSON.stringify(canonical)).digest("hex")}function externalProofCurrent(plan,planTask,evidence){if(planTask.evidence_class!=="external_git")return!1;let workflow=evidence?.workflow;if(!workflow)return!1;let bundle=workflow.externalEvidence;if(!bundle||bundle.anchors.length===0)return!1;if(!bundle.anchors.every((anchor)=>anchor.matched))return!1;return bundle.declarationDigest===computeExternalDeclarationDigest({taskId:planTask.id,evidence_class:"external_git",evidence_anchors:planTask.evidence_anchors??[],plan_title:plan.title,plan_swarm:plan.swarm,generation:workflow.generation})}function isExternalEvidenceInitialCompletionEligible(plan,planTask,evidence){if(!externalProofCurrent(plan,planTask,evidence))return!1;let snapshot=getTaskWorkflowSnapshot(evidence);return snapshot.authoritative&&snapshot.state==="idle"}function reduceTaskWorkflowSnapshot(current,event,context){if((current.state==="complete"||current.state==="blocked"||current.state==="closed")&&event.type!=="repair_idle"&&!(current.state==="complete"&&event.type==="task_completed"||current.state==="blocked"&&event.type==="task_blocked"||current.state==="blocked"&&event.type==="task_closed"||current.state==="blocked"&&event.type==="stage_a_passed"&&event.settlementRecovery===!0))throw Error(`TASK_WORKFLOW_TERMINAL: cannot apply ${event.type} from ${current.state}`);let outcome=getEventOutcome(event),base={schema:TASK_WORKFLOW_SCHEMA_MARKER,generation:current.generation,state:current.state,retryCount:current.retryCount,retryHistory:current.retryHistory,retryEpoch:current.retryEpoch,lastOutcome:outcome,lastTransitionId:event.transitionId??current.lastTransitionId,updatedAt:context.nowIso,...current.forcedCompletion===!0?{forcedCompletion:!0}:{},...current.supervisedRecovery===!0?{supervisedRecovery:!0}:{},...current.settlementRecovery===!0?{settlementRecovery:!0}:{},...current.noMutationSettlement?{noMutationSettlement:current.noMutationSettlement}:{},...current.externalEvidence?{externalEvidence:current.externalEvidence}:{}};switch(event.type){case"dispatch_attempted":{let{noMutationSettlement:_clearedSettlement,externalEvidence:_clearedExternalEvidence,...withoutSettlement}=base;return withoutSettlement}case"dispatch_no_mutation":{let{noMutationSettlement:_clearedSettlement,externalEvidence:_clearedExternalEvidence,...withoutSettlement}=base;return{...withoutSettlement,retryCount:Math.min(current.retryCount+1,3),retryHistory:[...current.retryHistory,outcome].slice(-3),retryEpoch:current.retryEpoch||current.generation+1,...current.generation===0&&event.transitionId&&Array.isArray(event.context?.declaredFiles)&&event.context.declaredFiles.length===0&&event.context.settlementTransitionId===event.transitionId?{noMutationSettlement:{generation:0,transitionId:event.transitionId,declaredFiles:[]}}:{}}}case"stage_b_failed":if(current.state!=="pre_check_passed"&&current.state!=="reviewer_run"&&current.state!=="tests_run"&&current.state!=="rework_required")throw Error(`TASK_WORKFLOW_STAGE_A_REQUIRED: cannot reject ${event.gate} from ${current.state}`);return{...base,state:"rework_required",retryCount:Math.min(current.retryCount+1,3),retryHistory:[...current.retryHistory,outcome].slice(-3),retryEpoch:current.retryEpoch||current.generation+1};case"accepted_mutation":{let{noMutationSettlement:_clearedSettlement,externalEvidence:_clearedExternalEvidence,...withoutSettlement}=base;if(event.context?.settlementFailed===!0)return{...withoutSettlement,generation:current.generation+1,state:"rework_required",retryCount:Math.min(current.retryCount+1,3),retryHistory:[...current.retryHistory,outcome].slice(-3),retryEpoch:current.retryEpoch||current.generation+1,supervisedRecovery:void 0,settlementRecovery:void 0};return{...withoutSettlement,generation:current.generation+1,state:"coder_delegated",supervisedRecovery:void 0,settlementRecovery:void 0}}case"stage_a_passed":if(current.state!=="coder_delegated"&&current.state!=="pre_check_passed"&&!(current.state==="rework_required"&&event.supervisedRecovery===!0)&&!(event.settlementRecovery===!0&&(current.state==="idle"||current.state==="blocked")))throw Error(`TASK_WORKFLOW_CODER_MUTATION_REQUIRED: cannot pass Stage A from ${current.state}`);return{...base,...event.supervisedRecovery===!0?{supervisedRecovery:!0}:{},...event.settlementRecovery===!0?{settlementRecovery:!0}:{},state:"pre_check_passed"};case"stage_a_failed":if(current.state!=="coder_delegated"&&current.state!=="pre_check_passed"&&current.state!=="rework_required")throw Error(`TASK_WORKFLOW_CODER_MUTATION_REQUIRED: cannot fail Stage A from ${current.state}`);return{...base,state:"rework_required",retryCount:Math.min(current.retryCount+1,3),retryHistory:[...current.retryHistory,outcome].slice(-3),retryEpoch:current.retryEpoch||current.generation+1};case"stage_b_completed":if(current.state!=="pre_check_passed"&&current.state!=="reviewer_run"&&current.state!=="tests_run")throw Error(`TASK_WORKFLOW_STAGE_A_REQUIRED: cannot record ${event.gate} from ${current.state}`);if(event.routeComplete===!1)return{...base,state:event.gate==="reviewer"||current.state==="reviewer_run"?"reviewer_run":current.state};if(event.routeComplete===!0)return{...base,state:"tests_run"};return{...base,state:hasAllRequiredGatesPassed(context.requiredGates,context.gates)?"tests_run":"reviewer_run"};case"gate_recorded":return{...base,state:current.state};case"external_evidence_attested":{if(current.state!=="idle")throw Error(`TASK_WORKFLOW_EXTERNAL_ATTEST_STATE: external evidence can only be attested from idle (task never entered the coder QA lifecycle), not ${current.state}`);if(current.externalEvidence?.transitionId===event.bundle.transitionId)return{...base};return{...base,externalEvidence:event.bundle}}case"external_evidence_revoked":{let{externalEvidence:_revokedExternalEvidence,...withoutExternalEvidence}=base;return withoutExternalEvidence}case"task_completed":{let readOnlyNoMutation=event.readOnlyNoMutation===!0&&current.state==="idle"&&current.generation===0&&isNoMutationSettlementMetadata(current)&&context.requiredGates.every((gate)=>context.gates[gate]!=null),externalAdmitted=event.externalEvidence===!0&&current.externalEvidence!==void 0&&current.externalEvidence.anchors.length>0&&current.externalEvidence.anchors.every((anchor)=>anchor.matched)&&(current.state==="idle"||current.state==="complete");if(event.qaExempt!==!0&&current.state!=="tests_run"&&current.state!=="complete"&&!(current.state==="pre_check_passed"&&context.gates.council!=null)&&!readOnlyNoMutation&&!externalAdmitted)throw Error(`TASK_WORKFLOW_QA_REQUIRED: cannot complete from ${current.state}`);return{...base,state:"complete",...event.qaExempt===!0?{forcedCompletion:!0}:{}}}case"task_blocked":return{...base,state:"blocked"};case"task_closed":return{...base,state:"closed"};case"repair_idle":{let{forcedCompletion:_cleared,supervisedRecovery:_clearedMarker,settlementRecovery:_clearedSettlementMarker,noMutationSettlement:_clearedSettlement,externalEvidence:_clearedExternalEvidence,...withoutForced}=base;return{...withoutForced,generation:current.generation+1,state:"idle",retryCount:0,retryHistory:[],retryEpoch:0}}}}function getEvidenceDir(directory){let swarmDir=path40.resolve(directory,".swarm"),evidenceDir=path40.join(swarmDir,"evidence");mkdirSync15(evidenceDir,{recursive:!0});let resolvedSwarmDir,resolvedEvidenceDir;try{resolvedSwarmDir=path40.normalize(realpathSync10(swarmDir)),resolvedEvidenceDir=path40.normalize(realpathSync10(evidenceDir))}catch(error49){throw Error(`Unable to resolve evidence directory: ${error49.message}`)}let swarmPrefix=`${resolvedSwarmDir}${path40.sep}`;if(!(process.platform==="win32"?resolvedEvidenceDir.toLowerCase().startsWith(swarmPrefix.toLowerCase()):resolvedEvidenceDir.startsWith(swarmPrefix)))throw Error(`Evidence path escapes .swarm boundary: ${resolvedEvidenceDir}`);return resolvedEvidenceDir}function getEvidencePath(directory,taskId){return assertValidTaskId(taskId),taskEvidencePath(directory,taskId)}function bindTrustedNoMutationSettlement(directory,taskId,event){if(event.type!=="dispatch_no_mutation")return event;let context=event.context;if(!context||event.transitionId===void 0)return{...event,context:void 0};try{let wal=readWorkflowWalFileSync("coder-settlement",validateSwarmPath(directory,`coder-settlements/${taskId}.json`),taskId),declaredFiles=wal?.context?.declaredFiles,trusted=wal!==null&&(wal.state==="PREPARED"||wal.state==="COMMITTED")&&wal.accepted===!1&&wal.transitionId===event.transitionId&&Array.isArray(declaredFiles)&&declaredFiles.length===0&&Array.isArray(context.declaredFiles)&&context.declaredFiles.length===0;return{...event,context:trusted?{...context,declaredFiles,settlementTransitionId:wal.transitionId}:{...context,settlementTransitionId:void 0}}}catch{return{...event,context:{...context,settlementTransitionId:void 0}}}}function readExisting(evidencePath,taskId){try{let raw=readFileSync13(evidencePath,"utf-8");return parseTaskEvidence(raw,taskId)}catch(error49){if(error49.code==="ENOENT")return null;throw telemetry.gateParseError(taskId,error49),error49}}function deriveRequiredGates(agentType,context={}){switch(agentType){case"coder":return context.testEngineerExempt===!0?["reviewer"]:["reviewer","test_engineer"];case"docs":return["docs"];case"designer":return["designer","reviewer","test_engineer"];case"explorer":return["explorer"];case"sme":return["sme"];case"reviewer":return["reviewer"];case"test_engineer":return["test_engineer"];case"critic":return["critic"];case"critic_sounding_board":return["critic_sounding_board"];case"critic_drift_verifier":return["critic_drift_verifier"];case"critic_hallucination_verifier":return["critic_hallucination_verifier"];case"critic_architecture_supervisor":return["critic_architecture_supervisor"];default:return["reviewer","test_engineer"]}}function expandRequiredGates(existingGates,newAgentType,context={}){let newGates=deriveRequiredGates(newAgentType,context);return[...new Set([...existingGates??[],...newGates])].sort()}function updateEvidenceForTransition(existing,event){let nowIso2=new Date().toISOString(),requiredGates=maybeExpandRequiredGates(existing,event),gates={...existing?.gates??{}};if(event.type==="accepted_mutation"||event.type==="repair_idle")gates=clearWorkflowGateProof(gates);if(event.type==="stage_a_passed")gates={...gates,pre_check:{sessionId:"system",timestamp:nowIso2,agent:"pre_check"}};if(event.type==="stage_a_failed")delete gates.pre_check;if(event.type==="stage_b_failed")delete gates.reviewer,delete gates.test_engineer;if(event.type==="stage_b_completed"||event.type==="gate_recorded")gates={...gates,[event.gate]:{sessionId:event.sessionId,timestamp:nowIso2,agent:event.gate}};let snapshot=getTaskWorkflowSnapshot(existing);if(assertExpectedGeneration(snapshot,event),isDuplicateTransition(snapshot,event)&&existing)return existing;let workflow=reduceTaskWorkflowSnapshot(snapshot,event,{requiredGates,gates,nowIso:nowIso2});return{taskId:existing?.taskId??"",required_gates:requiredGates,gates,turbo:"turbo"in event&&event.turbo===!0?!0:("turbo"in event)&&event.turbo===!1?existing?.turbo:existing?.turbo,test_engineer_exempt:(event.type==="dispatch_attempted"||event.type==="dispatch_no_mutation"||event.type==="accepted_mutation")&&event.agentType==="coder"?event.context?.testEngineerExempt===!0&&!requiredGates.includes("test_engineer"):existing?.test_engineer_exempt,workflow,requirements_state:existing?.requirements_state,...existing?.repair_provenance?{repair_provenance:existing.repair_provenance}:{},...existing?.todo_scan?{todo_scan:existing.todo_scan}:{}}}async function transitionTaskWorkflowEvidence(directory,taskId,event){let{evidence}=await transitionTaskWorkflowEvidenceWithStatus(directory,taskId,event);return evidence}async function transitionTaskWorkflowEvidenceWithStatus(directory,taskId,event){assertValidTaskId(taskId);let updatedEvidence=null,duplicated=!1;return await withTaskEvidenceTransaction(directory,taskId,event.type,async(transaction)=>{if(transaction.transitionWithStatus){let result=await transaction.transitionWithStatus(event);updatedEvidence=result.evidence,duplicated=result.duplicated;return}updatedEvidence=await transaction.transition(event)}),{evidence:updatedEvidence??{taskId,required_gates:[],gates:{},workflow:createDefaultWorkflowMetadata(new Date().toISOString())},duplicated}}async function withTaskEvidenceTransaction(directory,taskId,agent,callback){return assertValidTaskId(taskId),withTaskEvidenceLock(directory,taskId,agent,async()=>{let resolvedEvidenceDir=getEvidenceDir(directory),evidencePath=path40.join(resolvedEvidenceDir,`${taskId}.json`),current=null;try{current=readExisting(evidencePath,taskId)}catch(error49){throw telemetry.gateParseError(taskId,error49),error49}let persist=async(nextEvidence,event)=>{let validated=TaskEvidenceSchema.parse({...nextEvidence,taskId});if(await atomicWriteFile(evidencePath,JSON.stringify(validated,null,2)),event)await _internals38.appendTaskGateRequirementsReceiptIfNeeded(directory,taskId,current,validated,event);return current=validated,validated},transitionWithStatusImpl=async(event)=>{let boundEvent=bindTrustedNoMutationSettlement(directory,taskId,event);assertTaskEvidenceWriteAllowed(directory,taskId,boundEvent);let nextEvidence=updateEvidenceForTransition(current,boundEvent),duplicated=nextEvidence===current;return nextEvidence.taskId=taskId,{evidence:await persist(nextEvidence,boundEvent),duplicated}};return callback({taskId,read:()=>current,transition:async(event)=>{let{evidence}=await transitionWithStatusImpl(event);return evidence},transitionWithStatus:transitionWithStatusImpl,save:async(nextEvidence)=>{return assertTaskEvidenceWriteAllowed(directory,taskId,void 0),nextEvidence.taskId=taskId,persist(nextEvidence)}})})}async function ensureTaskGateRequirementsReceiptForSettledTransition(directory,taskId,evidence,event){assertValidTaskId(taskId);let validated=TaskEvidenceSchema.parse({...evidence,taskId});await _internals38.appendTaskGateRequirementsReceiptIfNeeded(directory,taskId,null,validated,event)}async function recordGateEvidence(directory,taskId,gate,sessionId,turbo,options={}){if(assertValidTaskId(taskId),shouldTreatGateAsStageB(gate)&&typeof options.expectedGeneration!=="number")throw Error(`TASK_WORKFLOW_GENERATION_REQUIRED: ${gate} for task ${taskId} must be bound at dispatch`);await transitionTaskWorkflowEvidence(directory,taskId,shouldTreatGateAsStageB(gate)?{type:"stage_b_completed",gate,sessionId,routeBinding:options.routeBinding,routeComplete:options.routeComplete,turbo,ensureDefaultStageB:options.ensureDefaultStageB,expectedGeneration:options.expectedGeneration,transitionId:options.transitionId}:{type:"gate_recorded",gate,sessionId,turbo,expectedGeneration:options.expectedGeneration,transitionId:options.transitionId}),telemetry.gatePassed(sessionId,gate,taskId)}async function recordTodoScanEvidence(directory,taskId,scan){assertValidTaskId(taskId),await withTaskEvidenceTransaction(directory,taskId,"todo_scan_recorded",async(transaction)=>{let base=transaction.read()??{taskId,required_gates:[],gates:{},workflow:createDefaultWorkflowMetadata(new Date().toISOString())};if(!transaction.save)throw Error(`TASK_EVIDENCE_SAVE_UNAVAILABLE: transaction for task ${taskId} does not support supplementary writes`);await transaction.save({...base,todo_scan:scan})})}async function recordAgentDispatch(directory,taskId,agentType,turbo,context={}){assertValidTaskId(taskId);let expectedGeneration=getTaskWorkflowSnapshot(await readTaskEvidence(directory,taskId)).generation;await transitionTaskWorkflowEvidence(directory,taskId,agentType==="coder"?{type:"accepted_mutation",agentType,turbo,context,expectedGeneration}:{type:"dispatch_attempted",agentType,turbo,context,expectedGeneration})}async function readTaskEvidence(directory,taskId){let state2=await readTaskEvidenceState(directory,taskId);return state2.kind==="ok"?state2.evidence:null}async function readTaskEvidenceState(directory,taskId){try{assertValidTaskId(taskId)}catch{return{kind:"missing"}}try{let evidencePath=getEvidencePath(directory,taskId),raw=readFileSync13(evidencePath,"utf-8");return{kind:"ok",evidence:parseTaskEvidence(raw,taskId)}}catch(error49){let evidencePath=getEvidencePathSafe(directory,taskId),code=error49.code;if(code==="ENOENT"||code==="ENAMETOOLONG")return{kind:"missing"};return telemetry.gateParseError(taskId,error49),{kind:"unparseable",evidencePath,error:error49}}}function getEvidencePathSafe(directory,taskId){try{return getEvidencePath(directory,taskId)}catch{return`${directory}/.swarm/evidence/${taskId}.json`}}function readTaskEvidenceRaw(directory,taskId){assertValidTaskId(taskId);let evidencePath=getEvidencePath(directory,taskId);try{let raw=readFileSync13(evidencePath,"utf-8");return parseTaskEvidence(raw,taskId)}catch(error49){let code=error49.code;if(code==="ENOENT"||code==="ENAMETOOLONG")return null;throw error49}}async function hasPassedAllGates(directory,taskId,currentDeclaredFiles){let evidence=await readTaskEvidence(directory,taskId);if(!evidence)return!1;if(!Array.isArray(evidence.required_gates))return!1;if(currentDeclaredFiles===void 0){if(deriveApplicableGateSet(evidence).readOnlyNoMutation)return!1;return hasAllRequiredGatesPassed(evidence.required_gates,evidence.gates)}return deriveApplicableGateSet(evidence,{currentDeclaredFiles}).missingGates.length===0}function compareTaskWorkflowStateRank(left,right){return WORKFLOW_STATE_RANK[left]-WORKFLOW_STATE_RANK[right]}var _internals38,TASK_WORKFLOW_SCHEMA_MARKER="exact-task-v1",TASK_WORKFLOW_STATES,TASK_WORKFLOW_OUTCOMES,MAX_PLAN_SCOPE_INSPECTION_BYTES=4194304,TASK_GATE_REQUIREMENTS_RECONSTRUCTION_SENTINEL="requirements_reconstruction",GateEvidenceSchema,ExternalEvidenceBundleSchema,TaskWorkflowMetadataSchema,TaskEvidenceSchema,DEFAULT_REQUIRED_GATES,DEFAULT_WORKFLOW_STATE="idle",WORKFLOW_STATE_RANK;var init_gate_evidence=__esm(()=>{init_zod();init_task_file();init_task_gate_requirements();init_utils2();init_telemetry();init_task_id();init_workflow_wal_file();_internals38={appendTaskGateRequirementsReceiptIfNeeded},TASK_WORKFLOW_STATES=["idle","coder_delegated","pre_check_passed","reviewer_run","tests_run","rework_required","complete","blocked","closed"],TASK_WORKFLOW_OUTCOMES=["none","dispatch_attempted","dispatch_no_mutation","accepted_mutation","accepted_mutation_failed","stage_a_passed","stage_a_failed","stage_b_completed","stage_b_failed","gate_recorded","task_completed","task_blocked","task_closed","repair_idle","external_evidence_attested","external_evidence_revoked"];GateEvidenceSchema=exports_external.object({sessionId:exports_external.string(),timestamp:exports_external.string(),agent:exports_external.string()}).passthrough(),ExternalEvidenceBundleSchema=exports_external.object({class:exports_external.literal("external_git"),transitionId:exports_external.string().min(1).max(512),declarationDigest:exports_external.string().regex(/^[a-f0-9]{64}$/),anchors:exports_external.array(exports_external.object({command:exports_external.string().min(1).max(400),expect:exports_external.string().max(4096).optional(),expect_prefix:exports_external.string().min(1).max(4096).optional(),matched:exports_external.boolean(),exit_code:exports_external.number().int(),stdout:exports_external.string().max(4096)})).min(1).max(16).superRefine((anchors,ctx)=>{anchors.forEach((anchor,index)=>{if(anchor.expect===void 0&&anchor.expect_prefix===void 0)ctx.addIssue({code:exports_external.ZodIssueCode.custom,message:`anchor ${index} must carry expect and/or a non-empty expect_prefix`,path:[index]})})}),attestedAt:exports_external.string().min(1)}),TaskWorkflowMetadataSchema=exports_external.object({schema:exports_external.literal(TASK_WORKFLOW_SCHEMA_MARKER),generation:exports_external.number().int().min(0),state:exports_external.enum(TASK_WORKFLOW_STATES),retryCount:exports_external.number().int().min(0).default(0),retryHistory:exports_external.array(exports_external.enum(TASK_WORKFLOW_OUTCOMES)).max(3).default([]),retryEpoch:exports_external.number().int().min(0).default(0),lastOutcome:exports_external.enum(TASK_WORKFLOW_OUTCOMES).default("none"),lastTransitionId:exports_external.string().min(1).nullable().optional().default(null),updatedAt:exports_external.string(),forcedCompletion:exports_external.boolean().optional(),supervisedRecovery:exports_external.boolean().optional(),settlementRecovery:exports_external.boolean().optional(),noMutationSettlement:exports_external.object({generation:exports_external.literal(0),transitionId:exports_external.string().min(1).max(512),declaredFiles:exports_external.array(exports_external.string()).length(0)}).optional(),externalEvidence:ExternalEvidenceBundleSchema.optional()}),TaskEvidenceSchema=exports_external.object({taskId:exports_external.string(),required_gates:exports_external.array(exports_external.string()).default([]),gates:exports_external.record(exports_external.string(),GateEvidenceSchema),turbo:exports_external.boolean().optional(),requirements_state:exports_external.enum(["known","unknown"]).optional(),test_engineer_exempt:exports_external.boolean().optional(),workflow:TaskWorkflowMetadataSchema.optional(),repair_provenance:exports_external.object({source_sha256:exports_external.string().regex(/^[a-f0-9]{64}$/).nullable(),source_generation:exports_external.number().int().min(0).nullable(),requirements_receipt_hash:exports_external.string().regex(/^[a-f0-9]{64}$/).nullable()}).optional(),todo_scan:exports_external.object({priority:exports_external.string(),count:exports_external.number().int().min(0),details:exports_external.array(exports_external.string()).max(200).optional(),recorded_at:exports_external.string().optional()}).optional()});DEFAULT_REQUIRED_GATES=["reviewer","test_engineer"],WORKFLOW_STATE_RANK={idle:0,coder_delegated:1,pre_check_passed:2,reviewer_run:3,tests_run:4,rework_required:5,blocked:6,closed:7,complete:8}});import*as path41 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(path41.win32.isAbsolute(value)||path41.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&&path41.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=()=>{};import{createHash as createHash23}from"node:crypto";import*as fs24 from"node:fs";import*as path42 from"node:path";function ownerDirectory(directory){return path42.dirname(validateSwarmPath(directory,path42.join(PROVISIONING_OWNER_DIR,".containment-anchor")))}function ownerPath(directory,callID){let digest2=createHash23("sha256").update(callID).digest("hex");return validateSwarmPath(directory,path42.join(PROVISIONING_OWNER_DIR,`${digest2}.json`))}function journalPath(directory){return validateSwarmPath(directory,PROVISIONING_JOURNAL_PATH)}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&&candidate.reservationId===void 0&&candidate.generation===void 0&&candidate.branchName===void 0:schemaVersion===2&&typeof candidate.taskId==="string"&&candidate.taskId.length>0&&candidate.taskId.length<=512&&candidate.reservationId===void 0&&candidate.generation===void 0&&candidate.branchName===void 0,validV3Identity=schemaVersion===3&&typeof candidate.taskId==="string"&&candidate.taskId.length>0&&candidate.taskId.length<=512&&typeof candidate.reservationId==="string"&&candidate.reservationId.length>0&&candidate.reservationId.length<=512&&typeof candidate.generation==="number"&&Number.isInteger(candidate.generation)&&candidate.generation>0&&typeof candidate.branchName==="string"&&candidate.branchName.length>0&&candidate.branchName.length<=1024;return(schemaVersion===1||schemaVersion===2||schemaVersion===3)&&(validTaskIdentity||validV3Identity)&&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 isLifecycleEntry(value){if(!value||typeof value!=="object"||Array.isArray(value))return!1;let candidate=value,validState=WORKTREE_PROVISIONING_LIFECYCLE_STATES.includes(candidate.state);return candidate.schemaVersion===1&&validState&&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&&(candidate.taskId===void 0||typeof candidate.taskId==="string"&&candidate.taskId.length>0&&candidate.taskId.length<=512)&&(candidate.reservationId===void 0||typeof candidate.reservationId==="string"&&candidate.reservationId.length>0&&candidate.reservationId.length<=512)&&(candidate.generation===void 0||typeof candidate.generation==="number"&&Number.isInteger(candidate.generation)&&candidate.generation>0)&&(candidate.branchName===void 0||typeof candidate.branchName==="string"&&candidate.branchName.length>0&&candidate.branchName.length<=1024)&&typeof candidate.recordedAt==="number"&&Number.isFinite(candidate.recordedAt)&&candidate.recordedAt>=0}function readBoundedJsonFile(filePath,maxBytes){try{if(fs24.statSync(filePath).size>maxBytes)return{ok:!1,reason:`${path42.basename(filePath)} exceeds the ${maxBytes}-byte safety bound`};let raw=fs24.readFileSync(filePath,"utf8");if(Buffer.byteLength(raw,"utf8")>maxBytes)return{ok:!1,reason:`${path42.basename(filePath)} changed beyond the ${maxBytes}-byte safety bound`};return{ok:!0,value:JSON.parse(raw)}}catch(error49){if(error49.code==="ENOENT")return{ok:!0,value:void 0};return{ok:!1,reason:`${path42.basename(filePath)} is unreadable or malformed: ${error49 instanceof Error?error49.message:String(error49)}`}}}function readOwner(directory,callID){let absolutePath=ownerPath(directory,callID),loaded=readBoundedJsonFile(absolutePath,MAX_PROVISIONING_OWNER_BYTES);if(!loaded.ok||loaded.value===void 0)return null;return isOwner(loaded.value)?loaded.value:null}function loadLifecycleJournal(directory){let loaded=readBoundedJsonFile(journalPath(directory),MAX_PROVISIONING_JOURNAL_BYTES);if(!loaded.ok)return{status:"uncertain",reason:loaded.reason};if(loaded.value===void 0)return{status:"ok",entries:[]};let parsed=loaded.value;if(parsed.schemaVersion!==1||!Array.isArray(parsed.entries))return{status:"uncertain",reason:"worktree provisioning lifecycle journal is malformed"};if(parsed.entries.length>MAX_PROVISIONING_JOURNAL_ENTRIES)return{status:"uncertain",reason:`worktree provisioning lifecycle journal exceeds the ${MAX_PROVISIONING_JOURNAL_ENTRIES}-entry safety bound`};let entries=[];for(let entry of parsed.entries){if(!isLifecycleEntry(entry))return{status:"uncertain",reason:"worktree provisioning lifecycle journal contains an invalid entry"};entries.push(entry)}return{status:"ok",entries}}function appendLifecycleEntry(directory,owner,state2){let loaded=loadLifecycleJournal(directory);if(loaded.status==="uncertain")throw Error(loaded.reason);let journal={schemaVersion:1,entries:[...loaded.entries,{schemaVersion:1,state:state2,callID:owner.callID,parentSessionId:owner.parentSessionId,worktreeSessionId:owner.worktreeSessionId,...owner.taskId?{taskId:owner.taskId}:{},...owner.reservationId?{reservationId:owner.reservationId}:{},...owner.generation!==void 0?{generation:owner.generation}:{},...owner.branchName?{branchName:owner.branchName}:{},recordedAt:Date.now()}].slice(-MAX_PROVISIONING_JOURNAL_ENTRIES)};atomicWriteSwarmFileSync(journalPath(directory),JSON.stringify(journal,null,2))}function recordWorktreeProvisioningOwner(directory,input){let wantsV3=input.reservationId!==void 0||input.generation!==void 0||input.branchName!==void 0;if(wantsV3&&(!input.taskId||!input.reservationId||input.generation===void 0||!input.branchName))throw Error("worktree provisioning owner v3 requires taskId, reservationId, generation, and branchName");let owner={schemaVersion:wantsV3?3:input.taskId?2:1,callID:input.callID,parentSessionId:input.parentSessionId,worktreeSessionId:input.worktreeSessionId,...input.taskId?{taskId:input.taskId}:{},...input.reservationId?{reservationId:input.reservationId}:{},...input.generation!==void 0?{generation:input.generation}:{},...input.branchName?{branchName:input.branchName}:{},createdAt:Date.now()};if(!isOwner(owner))throw Error("invalid worktree provisioning owner");let absolutePath=ownerPath(directory,input.callID);return fs24.mkdirSync(path42.dirname(absolutePath),{recursive:!0}),atomicWriteSwarmFileSync(absolutePath,`${JSON.stringify(owner)}
613
+ `,maxBytes=maxBytesFor(kind);if(Buffer.byteLength(serialized,"utf8")>maxBytes)oversizeMessage(kind,filePath,maxBytes);validateWal(kind,serialized,filePath,wal.taskId),await mkdir9(dirname19(filePath),{recursive:!0}),await atomicWriteFile(filePath,serialized)}var UTF8_FATAL_DECODER,CODER_SETTLEMENT_MAX_BYTES=67108864,SMALL_WORKFLOW_WAL_MAX_BYTES=1048576,CHUNK_BYTES=65536,_internals37;var init_workflow_wal_file=__esm(()=>{init_task_file();init_workflow_wal_schema();UTF8_FATAL_DECODER=new TextDecoder("utf-8",{fatal:!0}),_internals37={openFile:open4,openFileSync:fs23.openSync,readFileSync:fs23.readSync,closeFileSync:fs23.closeSync}});var exports_gate_evidence={};__export(exports_gate_evidence,{withTaskEvidenceTransaction:()=>withTaskEvidenceTransaction,transitionTaskWorkflowEvidenceWithStatus:()=>transitionTaskWorkflowEvidenceWithStatus,transitionTaskWorkflowEvidence:()=>transitionTaskWorkflowEvidence,resolveCurrentPlanIdentitySync:()=>resolveCurrentPlanIdentitySync,reduceTaskWorkflowSnapshot:()=>reduceTaskWorkflowSnapshot,recordTodoScanEvidence:()=>recordTodoScanEvidence,recordGateEvidence:()=>recordGateEvidence,recordAgentDispatch:()=>recordAgentDispatch,readTaskEvidenceState:()=>readTaskEvidenceState,readTaskEvidenceRaw:()=>readTaskEvidenceRaw,readTaskEvidence:()=>readTaskEvidence,readCurrentTaskDeclaredFiles:()=>readCurrentTaskDeclaredFiles,parseTaskEvidence:()=>parseTaskEvidence,isValidTaskId:()=>isValidTaskId,isReadOnlyNoMutationEligible:()=>isReadOnlyNoMutationEligible,isExternalEvidenceInitialCompletionEligible:()=>isExternalEvidenceInitialCompletionEligible,hasPassedAllGates:()=>hasPassedAllGates,getTaskWorkflowSnapshot:()=>getTaskWorkflowSnapshot,externalProofCurrent:()=>externalProofCurrent,expandRequiredGates:()=>expandRequiredGates,evidenceStampedForDifferentPlan:()=>evidenceStampedForDifferentPlan,ensureTaskGateRequirementsReceiptForSettledTransition:()=>ensureTaskGateRequirementsReceiptForSettledTransition,deriveRequiredGates:()=>deriveRequiredGates,deriveApplicableGateSet:()=>deriveApplicableGateSet,computeExternalDeclarationDigest:()=>computeExternalDeclarationDigest,compareTaskWorkflowStateRank:()=>compareTaskWorkflowStateRank,assertTaskEvidenceWriteAllowed:()=>assertTaskEvidenceWriteAllowed,_internals:()=>_internals38,TASK_WORKFLOW_SCHEMA_MARKER:()=>TASK_WORKFLOW_SCHEMA_MARKER,TASK_GATE_REQUIREMENTS_RECONSTRUCTION_SENTINEL:()=>TASK_GATE_REQUIREMENTS_RECONSTRUCTION_SENTINEL,ExternalEvidenceBundleSchema:()=>ExternalEvidenceBundleSchema,DEFAULT_REQUIRED_GATES:()=>DEFAULT_REQUIRED_GATES});import{createHash as createHash22}from"node:crypto";import{mkdirSync as mkdirSync15,readFileSync as readFileSync13,realpathSync as realpathSync10,statSync as statSync13}from"node:fs";import*as path40 from"node:path";function readCurrentTaskDeclaredFiles(directory,taskId){try{let planPath=validateSwarmPath(directory,"plan.json"),stat8=statSync13(planPath);if(!stat8.isFile()||stat8.size>MAX_PLAN_SCOPE_INSPECTION_BYTES)return null;let parsed=JSON.parse(readFileSync13(planPath,"utf8"));if(!Array.isArray(parsed.phases))return null;let declaredFiles=null;for(let phase of parsed.phases){if(!phase||typeof phase!=="object")return null;let tasks=phase.tasks;if(!Array.isArray(tasks))return null;for(let task of tasks){if(!task||typeof task!=="object")return null;let record2=task;if(record2.id!==taskId)continue;if(!Array.isArray(record2.files_touched)||!record2.files_touched.every((file2)=>typeof file2==="string"))return null;if(declaredFiles!==null)return null;declaredFiles=[...record2.files_touched]}}return declaredFiles}catch{return null}}function assertTaskEvidenceWriteAllowed(directory,taskId,event){assertValidTaskId(taskId);let coderWalPath=validateSwarmPath(directory,`coder-settlements/${taskId}.json`),coderWal=readWorkflowWalFileSync("coder-settlement",coderWalPath,taskId);if((coderWal?.state==="DISPATCHED"||coderWal?.state==="PREPARED")&&!(event!=null&&event.transitionId===coderWal.transitionId&&(event.type==="dispatch_attempted"||event.type==="dispatch_no_mutation"||event.type==="accepted_mutation")))throw Error(`CODER_SETTLEMENT_IN_PROGRESS: transition ${String(coderWal.transitionId)} owns evidence for task ${taskId}. Wait for the owning transition to settle or run /swarm recover ${taskId} (or /swarm reset-session), then retry; do not remove the WAL by hand.`);let terminalWalPath=validateSwarmPath(directory,`task-terminals/${taskId}.json`),terminalWal=readWorkflowWalFileSync("task-terminal",terminalWalPath,taskId);if(terminalWal?.state==="PREPARED"){if(!(event!=null&&event.transitionId===terminalWal.transitionId&&(event.type==="task_completed"&&terminalWal.newPlanStatus==="completed"||event.type==="task_blocked"&&terminalWal.newPlanStatus==="blocked"||event.type==="task_closed"&&terminalWal.newPlanStatus==="closed")))throw Error(`TASK_TERMINAL_PREPARED: transition ${String(terminalWal.transitionId)} owns evidence for task ${taskId}`)}let repairWalPath=validateSwarmPath(directory,`task-repairs/${taskId}.json`),repairWal=readWorkflowWalFileSync("task-repair",repairWalPath,taskId);if(repairWal?.state==="PREPARED"&&!(event?.type==="repair_idle"&&event.transitionId===repairWal.transitionId))throw Error(`TASK_REPAIR_PREPARED: transition ${String(repairWal.transitionId)} owns evidence for task ${taskId}`)}function parseTaskEvidence(raw,expectedTaskId){let parsed=TaskEvidenceSchema.parse(JSON.parse(raw));if(parsed.taskId!==expectedTaskId)throw Error(`TASK_EVIDENCE_IDENTITY_MISMATCH: expected ${expectedTaskId}, found ${parsed.taskId}`);return parsed}function resolveCurrentPlanIdentitySync(directory){if(!directory)return null;try{let planPath=path40.join(directory,".swarm","plan.json"),raw=readFileSync13(planPath,"utf8"),plan=JSON.parse(raw);if(typeof plan.swarm!=="string"||typeof plan.title!=="string")return null;return{planId:derivePlanId(plan),planIdentityHash:derivePlanIdentityHash(plan)}}catch{return null}}function evidenceStampedForDifferentPlan(evidence,currentPlanIdentityHash){if(evidence==null||currentPlanIdentityHash==null)return!1;return typeof evidence.planIdentityHash==="string"&&evidence.planIdentityHash!==currentPlanIdentityHash}function planStampForPersist(nextEvidence,previous,planIdentity,campaignRestart){if(nextEvidence.planIdentityHash!==void 0)return{};if(Object.keys(nextEvidence.gates??{}).length>0&&previous!=null&&!campaignRestart)return previous.planIdentityHash!==void 0?{...previous.planId!==void 0?{planId:previous.planId}:{},planIdentityHash:previous.planIdentityHash}:{};return planIdentity?{planId:planIdentity.planId,planIdentityHash:planIdentity.planIdentityHash}:{}}function isValidTaskId(taskId){return isStrictTaskId(taskId)}function assertValidTaskId(taskId){assertStrictTaskId(taskId)}function createDefaultWorkflowMetadata(nowIso2){return{schema:TASK_WORKFLOW_SCHEMA_MARKER,generation:0,state:DEFAULT_WORKFLOW_STATE,retryCount:0,retryHistory:[],retryEpoch:0,lastOutcome:"none",lastTransitionId:null,updatedAt:nowIso2}}function getEventOutcome(event){switch(event.type){case"dispatch_attempted":return"dispatch_attempted";case"dispatch_no_mutation":return"dispatch_no_mutation";case"accepted_mutation":return event.context?.settlementFailed===!0?"accepted_mutation_failed":"accepted_mutation";case"stage_a_passed":return"stage_a_passed";case"stage_a_failed":return"stage_a_failed";case"stage_b_completed":return"stage_b_completed";case"stage_b_failed":return"stage_b_failed";case"gate_recorded":return"gate_recorded";case"task_completed":return"task_completed";case"task_blocked":return"task_blocked";case"task_closed":return"task_closed";case"repair_idle":return"repair_idle";case"external_evidence_attested":return"external_evidence_attested";case"external_evidence_revoked":return"external_evidence_revoked"}}function isAuthoritativeWorkflowMetadata(workflow){return workflow?.schema===TASK_WORKFLOW_SCHEMA_MARKER}function getTaskWorkflowSnapshot(evidence){if(isAuthoritativeWorkflowMetadata(evidence?.workflow))return{...evidence.workflow,authoritative:!0};return{...createDefaultWorkflowMetadata(""),authoritative:!1}}function maybeExpandRequiredGates(existing,event){if(event.type==="accepted_mutation"){let agentType=event.agentType;if(typeof agentType==="string"&&agentType.trim()!=="")return existing?expandRequiredGates(existing.required_gates.filter((gate)=>gate!==TASK_GATE_REQUIREMENTS_RECONSTRUCTION_SENTINEL),agentType,event.context??{}):deriveRequiredGates(agentType,event.context??{})}if(event.type==="stage_b_completed"&&event.ensureDefaultStageB===!0)return expandRequiredGates(existing?.required_gates??[],"coder",{testEngineerExempt:!1});if(event.type==="stage_b_completed"||event.type==="gate_recorded")return existing?expandRequiredGates(existing.required_gates,event.gate):deriveRequiredGates(event.gate);return existing?.required_gates??[]}function hasAllRequiredGatesPassed(requiredGates,gates){return requiredGates.length>0&&requiredGates.every((gate)=>gates[gate]!=null)}function shouldTreatGateAsStageB(gate){return gate==="reviewer"||gate==="test_engineer"}function clearWorkflowGateProof(gates){let retained={...gates};return delete retained.pre_check,delete retained.reviewer,delete retained.test_engineer,delete retained.council,delete retained.critic,delete retained.critic_sounding_board,retained}function assertExpectedGeneration(snapshot,event){if(typeof event.expectedGeneration==="number"&&event.expectedGeneration!==snapshot.generation)throw Error(`TASK_WORKFLOW_GENERATION_MISMATCH: expected ${event.expectedGeneration}, current ${snapshot.generation}`)}function isDuplicateTransition(snapshot,event){if(event.type==="dispatch_no_mutation"&&event.context?.declaredFiles?.length===0&&event.context.settlementTransitionId===event.transitionId&&!snapshot.noMutationSettlement)return!1;return snapshot.authoritative&&typeof event.transitionId==="string"&&event.transitionId.length>0&&snapshot.lastTransitionId===event.transitionId&&snapshot.lastOutcome===getEventOutcome(event)}function isNoMutationSettlementMetadata(workflow){let settlement=workflow.noMutationSettlement;if(!workflow.authoritative||workflow.generation!==0||settlement?.generation!==0||typeof settlement.transitionId!=="string"||settlement.transitionId.length===0||!Array.isArray(settlement.declaredFiles)||settlement.declaredFiles.length!==0)return!1;return workflow.state==="idle"||workflow.state==="complete"}function deriveApplicableGateSet(evidence,options){if(!evidence)return{requiredGates:["pre_check"],satisfiedGates:[],missingGates:["pre_check"],readOnlyNoMutation:!1};let workflow=getTaskWorkflowSnapshot(evidence),readOnlyNoMutation=isNoMutationSettlementMetadata(workflow)&&(options?.currentDeclaredFiles===void 0?!0:options.currentDeclaredFiles!==null&&options.currentDeclaredFiles.length===0),externalEvidenceMatched=workflow.lastOutcome==="external_evidence_attested"&&(workflow.externalEvidence?.anchors.length??0)>0&&workflow.externalEvidence.anchors.every((anchor)=>anchor.matched),requiredGates=[...new Set(evidence.required_gates??[])];if(!readOnlyNoMutation&&!externalEvidenceMatched&&!requiredGates.includes("pre_check"))requiredGates.unshift("pre_check");let satisfiedGates=requiredGates.filter((gate)=>evidence.gates?.[gate]!=null);return{requiredGates,satisfiedGates,missingGates:requiredGates.filter((gate)=>evidence.gates?.[gate]==null),readOnlyNoMutation}}function isReadOnlyNoMutationEligible(evidence,options){return deriveApplicableGateSet(evidence,options).readOnlyNoMutation}function computeExternalDeclarationDigest(input){let canonical={taskId:input.taskId,evidence_class:input.evidence_class,evidence_anchors:input.evidence_anchors.map((anchor)=>({command:anchor.command,expect:anchor.expect,expect_prefix:anchor.expect_prefix})),plan_title:input.plan_title,plan_swarm:input.plan_swarm,generation:input.generation};return createHash22("sha256").update(JSON.stringify(canonical)).digest("hex")}function externalProofCurrent(plan,planTask,evidence){if(planTask.evidence_class!=="external_git")return!1;let workflow=evidence?.workflow;if(!workflow)return!1;let bundle=workflow.externalEvidence;if(!bundle||bundle.anchors.length===0)return!1;if(!bundle.anchors.every((anchor)=>anchor.matched))return!1;return bundle.declarationDigest===computeExternalDeclarationDigest({taskId:planTask.id,evidence_class:"external_git",evidence_anchors:planTask.evidence_anchors??[],plan_title:plan.title,plan_swarm:plan.swarm,generation:workflow.generation})}function isExternalEvidenceInitialCompletionEligible(plan,planTask,evidence){if(!externalProofCurrent(plan,planTask,evidence))return!1;let snapshot=getTaskWorkflowSnapshot(evidence);return snapshot.authoritative&&snapshot.state==="idle"}function reduceTaskWorkflowSnapshot(current,event,context){if((current.state==="complete"||current.state==="blocked"||current.state==="closed")&&event.type!=="repair_idle"&&!(current.state==="complete"&&event.type==="task_completed"||current.state==="blocked"&&event.type==="task_blocked"||current.state==="blocked"&&event.type==="task_closed"||current.state==="blocked"&&event.type==="stage_a_passed"&&event.settlementRecovery===!0))throw Error(`TASK_WORKFLOW_TERMINAL: cannot apply ${event.type} from ${current.state}`);let outcome=getEventOutcome(event),base={schema:TASK_WORKFLOW_SCHEMA_MARKER,generation:current.generation,state:current.state,retryCount:current.retryCount,retryHistory:current.retryHistory,retryEpoch:current.retryEpoch,lastOutcome:outcome,lastTransitionId:event.transitionId??current.lastTransitionId,updatedAt:context.nowIso,...current.forcedCompletion===!0?{forcedCompletion:!0}:{},...current.supervisedRecovery===!0?{supervisedRecovery:!0}:{},...current.settlementRecovery===!0?{settlementRecovery:!0}:{},...current.noMutationSettlement?{noMutationSettlement:current.noMutationSettlement}:{},...current.externalEvidence?{externalEvidence:current.externalEvidence}:{}};switch(event.type){case"dispatch_attempted":{let{noMutationSettlement:_clearedSettlement,externalEvidence:_clearedExternalEvidence,...withoutSettlement}=base;return withoutSettlement}case"dispatch_no_mutation":{let{noMutationSettlement:_clearedSettlement,externalEvidence:_clearedExternalEvidence,...withoutSettlement}=base;return{...withoutSettlement,retryCount:Math.min(current.retryCount+1,3),retryHistory:[...current.retryHistory,outcome].slice(-3),retryEpoch:current.retryEpoch||current.generation+1,...current.generation===0&&event.transitionId&&Array.isArray(event.context?.declaredFiles)&&event.context.declaredFiles.length===0&&event.context.settlementTransitionId===event.transitionId?{noMutationSettlement:{generation:0,transitionId:event.transitionId,declaredFiles:[]}}:{}}}case"stage_b_failed":if(current.state!=="pre_check_passed"&&current.state!=="reviewer_run"&&current.state!=="tests_run"&&current.state!=="rework_required")throw Error(`TASK_WORKFLOW_STAGE_A_REQUIRED: cannot reject ${event.gate} from ${current.state}`);return{...base,state:"rework_required",retryCount:Math.min(current.retryCount+1,3),retryHistory:[...current.retryHistory,outcome].slice(-3),retryEpoch:current.retryEpoch||current.generation+1};case"accepted_mutation":{let{noMutationSettlement:_clearedSettlement,externalEvidence:_clearedExternalEvidence,...withoutSettlement}=base;if(event.context?.settlementFailed===!0)return{...withoutSettlement,generation:current.generation+1,state:"rework_required",retryCount:Math.min(current.retryCount+1,3),retryHistory:[...current.retryHistory,outcome].slice(-3),retryEpoch:current.retryEpoch||current.generation+1,supervisedRecovery:void 0,settlementRecovery:void 0};return{...withoutSettlement,generation:current.generation+1,state:"coder_delegated",supervisedRecovery:void 0,settlementRecovery:void 0}}case"stage_a_passed":if(current.state!=="coder_delegated"&&current.state!=="pre_check_passed"&&!(current.state==="rework_required"&&event.supervisedRecovery===!0)&&!(event.settlementRecovery===!0&&(current.state==="idle"||current.state==="blocked")))throw Error(`TASK_WORKFLOW_CODER_MUTATION_REQUIRED: cannot pass Stage A from ${current.state}`);return{...base,...event.supervisedRecovery===!0?{supervisedRecovery:!0}:{},...event.settlementRecovery===!0?{settlementRecovery:!0}:{},state:"pre_check_passed"};case"stage_a_failed":if(current.state!=="coder_delegated"&&current.state!=="pre_check_passed"&&current.state!=="rework_required")throw Error(`TASK_WORKFLOW_CODER_MUTATION_REQUIRED: cannot fail Stage A from ${current.state}`);return{...base,state:"rework_required",retryCount:Math.min(current.retryCount+1,3),retryHistory:[...current.retryHistory,outcome].slice(-3),retryEpoch:current.retryEpoch||current.generation+1};case"stage_b_completed":if(current.state!=="pre_check_passed"&&current.state!=="reviewer_run"&&current.state!=="tests_run")throw Error(`TASK_WORKFLOW_STAGE_A_REQUIRED: cannot record ${event.gate} from ${current.state}`);if(event.routeComplete===!1)return{...base,state:event.gate==="reviewer"||current.state==="reviewer_run"?"reviewer_run":current.state};if(event.routeComplete===!0)return{...base,state:"tests_run"};return{...base,state:hasAllRequiredGatesPassed(context.requiredGates,context.gates)?"tests_run":"reviewer_run"};case"gate_recorded":return{...base,state:current.state};case"external_evidence_attested":{if(current.state!=="idle")throw Error(`TASK_WORKFLOW_EXTERNAL_ATTEST_STATE: external evidence can only be attested from idle (task never entered the coder QA lifecycle), not ${current.state}`);if(current.externalEvidence?.transitionId===event.bundle.transitionId)return{...base};return{...base,externalEvidence:event.bundle}}case"external_evidence_revoked":{let{externalEvidence:_revokedExternalEvidence,...withoutExternalEvidence}=base;return withoutExternalEvidence}case"task_completed":{let readOnlyNoMutation=event.readOnlyNoMutation===!0&&current.state==="idle"&&current.generation===0&&isNoMutationSettlementMetadata(current)&&context.requiredGates.every((gate)=>context.gates[gate]!=null),externalAdmitted=event.externalEvidence===!0&&current.externalEvidence!==void 0&&current.externalEvidence.anchors.length>0&&current.externalEvidence.anchors.every((anchor)=>anchor.matched)&&(current.state==="idle"||current.state==="complete");if(event.qaExempt!==!0&&current.state!=="tests_run"&&current.state!=="complete"&&!(current.state==="pre_check_passed"&&context.gates.council!=null)&&!readOnlyNoMutation&&!externalAdmitted)throw Error(`TASK_WORKFLOW_QA_REQUIRED: cannot complete from ${current.state}`);return{...base,state:"complete",...event.qaExempt===!0?{forcedCompletion:!0}:{}}}case"task_blocked":return{...base,state:"blocked"};case"task_closed":return{...base,state:"closed"};case"repair_idle":{let{forcedCompletion:_cleared,supervisedRecovery:_clearedMarker,settlementRecovery:_clearedSettlementMarker,noMutationSettlement:_clearedSettlement,externalEvidence:_clearedExternalEvidence,...withoutForced}=base;return{...withoutForced,generation:current.generation+1,state:"idle",retryCount:0,retryHistory:[],retryEpoch:0}}}}function getEvidenceDir(directory){let swarmDir=path40.resolve(directory,".swarm"),evidenceDir=path40.join(swarmDir,"evidence");mkdirSync15(evidenceDir,{recursive:!0});let resolvedSwarmDir,resolvedEvidenceDir;try{resolvedSwarmDir=path40.normalize(realpathSync10(swarmDir)),resolvedEvidenceDir=path40.normalize(realpathSync10(evidenceDir))}catch(error49){throw Error(`Unable to resolve evidence directory: ${error49.message}`)}let swarmPrefix=`${resolvedSwarmDir}${path40.sep}`;if(!(process.platform==="win32"?resolvedEvidenceDir.toLowerCase().startsWith(swarmPrefix.toLowerCase()):resolvedEvidenceDir.startsWith(swarmPrefix)))throw Error(`Evidence path escapes .swarm boundary: ${resolvedEvidenceDir}`);return resolvedEvidenceDir}function getEvidencePath(directory,taskId){return assertValidTaskId(taskId),taskEvidencePath(directory,taskId)}function bindTrustedNoMutationSettlement(directory,taskId,event){if(event.type!=="dispatch_no_mutation")return event;let context=event.context;if(!context||event.transitionId===void 0)return{...event,context:void 0};try{let wal=readWorkflowWalFileSync("coder-settlement",validateSwarmPath(directory,`coder-settlements/${taskId}.json`),taskId),declaredFiles=wal?.context?.declaredFiles,trusted=wal!==null&&(wal.state==="PREPARED"||wal.state==="COMMITTED")&&wal.accepted===!1&&wal.transitionId===event.transitionId&&Array.isArray(declaredFiles)&&declaredFiles.length===0&&Array.isArray(context.declaredFiles)&&context.declaredFiles.length===0;return{...event,context:trusted?{...context,declaredFiles,settlementTransitionId:wal.transitionId}:{...context,settlementTransitionId:void 0}}}catch{return{...event,context:{...context,settlementTransitionId:void 0}}}}function readExisting(evidencePath,taskId){try{let raw=readFileSync13(evidencePath,"utf-8");return parseTaskEvidence(raw,taskId)}catch(error49){if(error49.code==="ENOENT")return null;throw telemetry.gateParseError(taskId,error49),error49}}function deriveRequiredGates(agentType,context={}){switch(agentType){case"coder":return context.testEngineerExempt===!0?["reviewer"]:["reviewer","test_engineer"];case"docs":return["docs"];case"designer":return["designer","reviewer","test_engineer"];case"explorer":return["explorer"];case"sme":return["sme"];case"reviewer":return["reviewer"];case"test_engineer":return["test_engineer"];case"critic":return["critic"];case"critic_sounding_board":return["critic_sounding_board"];case"critic_drift_verifier":return["critic_drift_verifier"];case"critic_hallucination_verifier":return["critic_hallucination_verifier"];case"critic_architecture_supervisor":return["critic_architecture_supervisor"];default:return["reviewer","test_engineer"]}}function expandRequiredGates(existingGates,newAgentType,context={}){let newGates=deriveRequiredGates(newAgentType,context);return[...new Set([...existingGates??[],...newGates])].sort()}function updateEvidenceForTransition(existing,event){let nowIso2=new Date().toISOString(),requiredGates=maybeExpandRequiredGates(existing,event),gates={...existing?.gates??{}};if(event.type==="accepted_mutation"||event.type==="repair_idle")gates=clearWorkflowGateProof(gates);if(event.type==="stage_a_passed")gates={...gates,pre_check:{sessionId:"system",timestamp:nowIso2,agent:"pre_check"}};if(event.type==="stage_a_failed")delete gates.pre_check;if(event.type==="stage_b_failed")delete gates.reviewer,delete gates.test_engineer;if(event.type==="stage_b_completed"||event.type==="gate_recorded")gates={...gates,[event.gate]:{sessionId:event.sessionId,timestamp:nowIso2,agent:event.gate}};let snapshot=getTaskWorkflowSnapshot(existing);if(assertExpectedGeneration(snapshot,event),isDuplicateTransition(snapshot,event)&&existing)return existing;let workflow=reduceTaskWorkflowSnapshot(snapshot,event,{requiredGates,gates,nowIso:nowIso2});return{taskId:existing?.taskId??"",required_gates:requiredGates,gates,turbo:"turbo"in event&&event.turbo===!0?!0:("turbo"in event)&&event.turbo===!1?existing?.turbo:existing?.turbo,test_engineer_exempt:(event.type==="dispatch_attempted"||event.type==="dispatch_no_mutation"||event.type==="accepted_mutation")&&event.agentType==="coder"?event.context?.testEngineerExempt===!0&&!requiredGates.includes("test_engineer"):existing?.test_engineer_exempt,workflow,requirements_state:existing?.requirements_state,...existing?.repair_provenance?{repair_provenance:existing.repair_provenance}:{},...existing?.todo_scan?{todo_scan:existing.todo_scan}:{}}}async function transitionTaskWorkflowEvidence(directory,taskId,event){let{evidence}=await transitionTaskWorkflowEvidenceWithStatus(directory,taskId,event);return evidence}async function transitionTaskWorkflowEvidenceWithStatus(directory,taskId,event){assertValidTaskId(taskId);let updatedEvidence=null,duplicated=!1;return await withTaskEvidenceTransaction(directory,taskId,event.type,async(transaction)=>{if(transaction.transitionWithStatus){let result=await transaction.transitionWithStatus(event);updatedEvidence=result.evidence,duplicated=result.duplicated;return}updatedEvidence=await transaction.transition(event)}),{evidence:updatedEvidence??{taskId,required_gates:[],gates:{},workflow:createDefaultWorkflowMetadata(new Date().toISOString())},duplicated}}async function withTaskEvidenceTransaction(directory,taskId,agent,callback){return assertValidTaskId(taskId),withTaskEvidenceLock(directory,taskId,agent,async()=>{let resolvedEvidenceDir=getEvidenceDir(directory),evidencePath=path40.join(resolvedEvidenceDir,`${taskId}.json`),current=null;try{current=readExisting(evidencePath,taskId)}catch(error49){throw telemetry.gateParseError(taskId,error49),error49}let persist=async(nextEvidence,event)=>{let planIdentity=resolveCurrentPlanIdentitySync(directory),validated=TaskEvidenceSchema.parse({...nextEvidence,taskId,...planStampForPersist(nextEvidence,current,planIdentity,event?.type==="accepted_mutation"&&event.agentType==="coder"&&nextEvidence!==current)});if(await atomicWriteFile(evidencePath,JSON.stringify(validated,null,2)),event)await _internals38.appendTaskGateRequirementsReceiptIfNeeded(directory,taskId,current,validated,event);return current=validated,validated},transitionWithStatusImpl=async(event)=>{let boundEvent=bindTrustedNoMutationSettlement(directory,taskId,event);assertTaskEvidenceWriteAllowed(directory,taskId,boundEvent);let nextEvidence=updateEvidenceForTransition(current,boundEvent),duplicated=nextEvidence===current;return nextEvidence.taskId=taskId,{evidence:await persist(nextEvidence,boundEvent),duplicated}};return callback({taskId,read:()=>current,transition:async(event)=>{let{evidence}=await transitionWithStatusImpl(event);return evidence},transitionWithStatus:transitionWithStatusImpl,save:async(nextEvidence)=>{return assertTaskEvidenceWriteAllowed(directory,taskId,void 0),nextEvidence.taskId=taskId,persist(nextEvidence)}})})}async function ensureTaskGateRequirementsReceiptForSettledTransition(directory,taskId,evidence,event){assertValidTaskId(taskId);let validated=TaskEvidenceSchema.parse({...evidence,taskId});await _internals38.appendTaskGateRequirementsReceiptIfNeeded(directory,taskId,null,validated,event)}async function recordGateEvidence(directory,taskId,gate,sessionId,turbo,options={}){if(assertValidTaskId(taskId),shouldTreatGateAsStageB(gate)&&typeof options.expectedGeneration!=="number")throw Error(`TASK_WORKFLOW_GENERATION_REQUIRED: ${gate} for task ${taskId} must be bound at dispatch`);await transitionTaskWorkflowEvidence(directory,taskId,shouldTreatGateAsStageB(gate)?{type:"stage_b_completed",gate,sessionId,routeBinding:options.routeBinding,routeComplete:options.routeComplete,turbo,ensureDefaultStageB:options.ensureDefaultStageB,expectedGeneration:options.expectedGeneration,transitionId:options.transitionId}:{type:"gate_recorded",gate,sessionId,turbo,expectedGeneration:options.expectedGeneration,transitionId:options.transitionId}),telemetry.gatePassed(sessionId,gate,taskId)}async function recordTodoScanEvidence(directory,taskId,scan){assertValidTaskId(taskId),await withTaskEvidenceTransaction(directory,taskId,"todo_scan_recorded",async(transaction)=>{let base=transaction.read()??{taskId,required_gates:[],gates:{},workflow:createDefaultWorkflowMetadata(new Date().toISOString())};if(!transaction.save)throw Error(`TASK_EVIDENCE_SAVE_UNAVAILABLE: transaction for task ${taskId} does not support supplementary writes`);await transaction.save({...base,todo_scan:scan})})}async function recordAgentDispatch(directory,taskId,agentType,turbo,context={}){assertValidTaskId(taskId);let expectedGeneration=getTaskWorkflowSnapshot(await readTaskEvidence(directory,taskId)).generation;await transitionTaskWorkflowEvidence(directory,taskId,agentType==="coder"?{type:"accepted_mutation",agentType,turbo,context,expectedGeneration}:{type:"dispatch_attempted",agentType,turbo,context,expectedGeneration})}async function readTaskEvidence(directory,taskId){let state2=await readTaskEvidenceState(directory,taskId);return state2.kind==="ok"?state2.evidence:null}async function readTaskEvidenceState(directory,taskId){try{assertValidTaskId(taskId)}catch{return{kind:"missing"}}try{let evidencePath=getEvidencePath(directory,taskId),raw=readFileSync13(evidencePath,"utf-8");return{kind:"ok",evidence:parseTaskEvidence(raw,taskId)}}catch(error49){let evidencePath=getEvidencePathSafe(directory,taskId),code=error49.code;if(code==="ENOENT"||code==="ENAMETOOLONG")return{kind:"missing"};return telemetry.gateParseError(taskId,error49),{kind:"unparseable",evidencePath,error:error49}}}function getEvidencePathSafe(directory,taskId){try{return getEvidencePath(directory,taskId)}catch{return`${directory}/.swarm/evidence/${taskId}.json`}}function readTaskEvidenceRaw(directory,taskId){assertValidTaskId(taskId);let evidencePath=getEvidencePath(directory,taskId);try{let raw=readFileSync13(evidencePath,"utf-8");return parseTaskEvidence(raw,taskId)}catch(error49){let code=error49.code;if(code==="ENOENT"||code==="ENAMETOOLONG")return null;throw error49}}async function hasPassedAllGates(directory,taskId,currentDeclaredFiles){let evidence=await readTaskEvidence(directory,taskId);if(!evidence)return!1;if(!Array.isArray(evidence.required_gates))return!1;if(currentDeclaredFiles===void 0){if(deriveApplicableGateSet(evidence).readOnlyNoMutation)return!1;return hasAllRequiredGatesPassed(evidence.required_gates,evidence.gates)}return deriveApplicableGateSet(evidence,{currentDeclaredFiles}).missingGates.length===0}function compareTaskWorkflowStateRank(left,right){return WORKFLOW_STATE_RANK[left]-WORKFLOW_STATE_RANK[right]}var _internals38,TASK_WORKFLOW_SCHEMA_MARKER="exact-task-v1",TASK_WORKFLOW_STATES,TASK_WORKFLOW_OUTCOMES,MAX_PLAN_SCOPE_INSPECTION_BYTES=4194304,TASK_GATE_REQUIREMENTS_RECONSTRUCTION_SENTINEL="requirements_reconstruction",GateEvidenceSchema,ExternalEvidenceBundleSchema,TaskWorkflowMetadataSchema,TaskEvidenceSchema,DEFAULT_REQUIRED_GATES,DEFAULT_WORKFLOW_STATE="idle",WORKFLOW_STATE_RANK;var init_gate_evidence=__esm(()=>{init_zod();init_task_file();init_task_gate_requirements();init_utils2();init_utils3();init_telemetry();init_task_id();init_workflow_wal_file();_internals38={appendTaskGateRequirementsReceiptIfNeeded},TASK_WORKFLOW_STATES=["idle","coder_delegated","pre_check_passed","reviewer_run","tests_run","rework_required","complete","blocked","closed"],TASK_WORKFLOW_OUTCOMES=["none","dispatch_attempted","dispatch_no_mutation","accepted_mutation","accepted_mutation_failed","stage_a_passed","stage_a_failed","stage_b_completed","stage_b_failed","gate_recorded","task_completed","task_blocked","task_closed","repair_idle","external_evidence_attested","external_evidence_revoked"];GateEvidenceSchema=exports_external.object({sessionId:exports_external.string(),timestamp:exports_external.string(),agent:exports_external.string()}).passthrough(),ExternalEvidenceBundleSchema=exports_external.object({class:exports_external.literal("external_git"),transitionId:exports_external.string().min(1).max(512),declarationDigest:exports_external.string().regex(/^[a-f0-9]{64}$/),anchors:exports_external.array(exports_external.object({command:exports_external.string().min(1).max(400),expect:exports_external.string().max(4096).optional(),expect_prefix:exports_external.string().min(1).max(4096).optional(),matched:exports_external.boolean(),exit_code:exports_external.number().int(),stdout:exports_external.string().max(4096)})).min(1).max(16).superRefine((anchors,ctx)=>{anchors.forEach((anchor,index)=>{if(anchor.expect===void 0&&anchor.expect_prefix===void 0)ctx.addIssue({code:exports_external.ZodIssueCode.custom,message:`anchor ${index} must carry expect and/or a non-empty expect_prefix`,path:[index]})})}),attestedAt:exports_external.string().min(1)}),TaskWorkflowMetadataSchema=exports_external.object({schema:exports_external.literal(TASK_WORKFLOW_SCHEMA_MARKER),generation:exports_external.number().int().min(0),state:exports_external.enum(TASK_WORKFLOW_STATES),retryCount:exports_external.number().int().min(0).default(0),retryHistory:exports_external.array(exports_external.enum(TASK_WORKFLOW_OUTCOMES)).max(3).default([]),retryEpoch:exports_external.number().int().min(0).default(0),lastOutcome:exports_external.enum(TASK_WORKFLOW_OUTCOMES).default("none"),lastTransitionId:exports_external.string().min(1).nullable().optional().default(null),updatedAt:exports_external.string(),forcedCompletion:exports_external.boolean().optional(),supervisedRecovery:exports_external.boolean().optional(),settlementRecovery:exports_external.boolean().optional(),noMutationSettlement:exports_external.object({generation:exports_external.literal(0),transitionId:exports_external.string().min(1).max(512),declaredFiles:exports_external.array(exports_external.string()).length(0)}).optional(),externalEvidence:ExternalEvidenceBundleSchema.optional()}),TaskEvidenceSchema=exports_external.object({taskId:exports_external.string(),required_gates:exports_external.array(exports_external.string()).default([]),gates:exports_external.record(exports_external.string(),GateEvidenceSchema),turbo:exports_external.boolean().optional(),requirements_state:exports_external.enum(["known","unknown"]).optional(),test_engineer_exempt:exports_external.boolean().optional(),planId:exports_external.string().optional(),planIdentityHash:exports_external.string().regex(/^[a-f0-9]{64}$/).optional(),workflow:TaskWorkflowMetadataSchema.optional(),repair_provenance:exports_external.object({source_sha256:exports_external.string().regex(/^[a-f0-9]{64}$/).nullable(),source_generation:exports_external.number().int().min(0).nullable(),requirements_receipt_hash:exports_external.string().regex(/^[a-f0-9]{64}$/).nullable()}).optional(),todo_scan:exports_external.object({priority:exports_external.string(),count:exports_external.number().int().min(0),details:exports_external.array(exports_external.string()).max(200).optional(),recorded_at:exports_external.string().optional()}).optional()});DEFAULT_REQUIRED_GATES=["reviewer","test_engineer"],WORKFLOW_STATE_RANK={idle:0,coder_delegated:1,pre_check_passed:2,reviewer_run:3,tests_run:4,rework_required:5,blocked:6,closed:7,complete:8}});import*as path41 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(path41.win32.isAbsolute(value)||path41.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&&path41.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=()=>{};import{createHash as createHash23}from"node:crypto";import*as fs24 from"node:fs";import*as path42 from"node:path";function ownerDirectory(directory){return path42.dirname(validateSwarmPath(directory,path42.join(PROVISIONING_OWNER_DIR,".containment-anchor")))}function ownerPath(directory,callID){let digest2=createHash23("sha256").update(callID).digest("hex");return validateSwarmPath(directory,path42.join(PROVISIONING_OWNER_DIR,`${digest2}.json`))}function journalPath(directory){return validateSwarmPath(directory,PROVISIONING_JOURNAL_PATH)}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&&candidate.reservationId===void 0&&candidate.generation===void 0&&candidate.branchName===void 0:schemaVersion===2&&typeof candidate.taskId==="string"&&candidate.taskId.length>0&&candidate.taskId.length<=512&&candidate.reservationId===void 0&&candidate.generation===void 0&&candidate.branchName===void 0,validV3Identity=schemaVersion===3&&typeof candidate.taskId==="string"&&candidate.taskId.length>0&&candidate.taskId.length<=512&&typeof candidate.reservationId==="string"&&candidate.reservationId.length>0&&candidate.reservationId.length<=512&&typeof candidate.generation==="number"&&Number.isInteger(candidate.generation)&&candidate.generation>0&&typeof candidate.branchName==="string"&&candidate.branchName.length>0&&candidate.branchName.length<=1024;return(schemaVersion===1||schemaVersion===2||schemaVersion===3)&&(validTaskIdentity||validV3Identity)&&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 isLifecycleEntry(value){if(!value||typeof value!=="object"||Array.isArray(value))return!1;let candidate=value,validState=WORKTREE_PROVISIONING_LIFECYCLE_STATES.includes(candidate.state);return candidate.schemaVersion===1&&validState&&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&&(candidate.taskId===void 0||typeof candidate.taskId==="string"&&candidate.taskId.length>0&&candidate.taskId.length<=512)&&(candidate.reservationId===void 0||typeof candidate.reservationId==="string"&&candidate.reservationId.length>0&&candidate.reservationId.length<=512)&&(candidate.generation===void 0||typeof candidate.generation==="number"&&Number.isInteger(candidate.generation)&&candidate.generation>0)&&(candidate.branchName===void 0||typeof candidate.branchName==="string"&&candidate.branchName.length>0&&candidate.branchName.length<=1024)&&typeof candidate.recordedAt==="number"&&Number.isFinite(candidate.recordedAt)&&candidate.recordedAt>=0}function readBoundedJsonFile(filePath,maxBytes){try{if(fs24.statSync(filePath).size>maxBytes)return{ok:!1,reason:`${path42.basename(filePath)} exceeds the ${maxBytes}-byte safety bound`};let raw=fs24.readFileSync(filePath,"utf8");if(Buffer.byteLength(raw,"utf8")>maxBytes)return{ok:!1,reason:`${path42.basename(filePath)} changed beyond the ${maxBytes}-byte safety bound`};return{ok:!0,value:JSON.parse(raw)}}catch(error49){if(error49.code==="ENOENT")return{ok:!0,value:void 0};return{ok:!1,reason:`${path42.basename(filePath)} is unreadable or malformed: ${error49 instanceof Error?error49.message:String(error49)}`}}}function readOwner(directory,callID){let absolutePath=ownerPath(directory,callID),loaded=readBoundedJsonFile(absolutePath,MAX_PROVISIONING_OWNER_BYTES);if(!loaded.ok||loaded.value===void 0)return null;return isOwner(loaded.value)?loaded.value:null}function loadLifecycleJournal(directory){let loaded=readBoundedJsonFile(journalPath(directory),MAX_PROVISIONING_JOURNAL_BYTES);if(!loaded.ok)return{status:"uncertain",reason:loaded.reason};if(loaded.value===void 0)return{status:"ok",entries:[]};let parsed=loaded.value;if(parsed.schemaVersion!==1||!Array.isArray(parsed.entries))return{status:"uncertain",reason:"worktree provisioning lifecycle journal is malformed"};if(parsed.entries.length>MAX_PROVISIONING_JOURNAL_ENTRIES)return{status:"uncertain",reason:`worktree provisioning lifecycle journal exceeds the ${MAX_PROVISIONING_JOURNAL_ENTRIES}-entry safety bound`};let entries=[];for(let entry of parsed.entries){if(!isLifecycleEntry(entry))return{status:"uncertain",reason:"worktree provisioning lifecycle journal contains an invalid entry"};entries.push(entry)}return{status:"ok",entries}}function appendLifecycleEntry(directory,owner,state2){let loaded=loadLifecycleJournal(directory);if(loaded.status==="uncertain")throw Error(loaded.reason);let journal={schemaVersion:1,entries:[...loaded.entries,{schemaVersion:1,state:state2,callID:owner.callID,parentSessionId:owner.parentSessionId,worktreeSessionId:owner.worktreeSessionId,...owner.taskId?{taskId:owner.taskId}:{},...owner.reservationId?{reservationId:owner.reservationId}:{},...owner.generation!==void 0?{generation:owner.generation}:{},...owner.branchName?{branchName:owner.branchName}:{},recordedAt:Date.now()}].slice(-MAX_PROVISIONING_JOURNAL_ENTRIES)};atomicWriteSwarmFileSync(journalPath(directory),JSON.stringify(journal,null,2))}function recordWorktreeProvisioningOwner(directory,input){let wantsV3=input.reservationId!==void 0||input.generation!==void 0||input.branchName!==void 0;if(wantsV3&&(!input.taskId||!input.reservationId||input.generation===void 0||!input.branchName))throw Error("worktree provisioning owner v3 requires taskId, reservationId, generation, and branchName");let owner={schemaVersion:wantsV3?3:input.taskId?2:1,callID:input.callID,parentSessionId:input.parentSessionId,worktreeSessionId:input.worktreeSessionId,...input.taskId?{taskId:input.taskId}:{},...input.reservationId?{reservationId:input.reservationId}:{},...input.generation!==void 0?{generation:input.generation}:{},...input.branchName?{branchName:input.branchName}:{},createdAt:Date.now()};if(!isOwner(owner))throw Error("invalid worktree provisioning owner");let absolutePath=ownerPath(directory,input.callID);return fs24.mkdirSync(path42.dirname(absolutePath),{recursive:!0}),atomicWriteSwarmFileSync(absolutePath,`${JSON.stringify(owner)}
614
614
  `),appendLifecycleEntry(directory,owner,"OWNER_PUBLISHED"),owner}function removeWorktreeProvisioningOwner(directory,callID,expected){try{let owner=readOwner(directory,callID);if(owner?.schemaVersion===3&&(!expected||expected.reservationId!==owner.reservationId||expected.generation!==owner.generation||expected.branchName!==owner.branchName))return!1;if(fs24.unlinkSync(ownerPath(directory,callID)),owner)appendLifecycleEntry(directory,owner,"OWNER_REMOVED");return!0}catch(error49){return error49.code==="ENOENT"}}function scanWorktreeProvisioningOwnersForRecovery(directory){let directoryPath,entries;try{directoryPath=ownerDirectory(directory),entries=fs24.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=path42.join(directoryPath,entry.name);try{if(fs24.statSync(absolutePath).size>MAX_PROVISIONING_OWNER_BYTES)return{status:"uncertain",reason:`worktree provisioning owner "${entry.name}" exceeds the recovery size bound`};let raw=fs24.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}}function scanWorktreeProvisioningLifecycleJournalForRecovery(directory){return loadLifecycleJournal(directory)}var PROVISIONING_OWNER_DIR="worktree-provisioning-owners",MAX_PROVISIONING_OWNERS=512,MAX_PROVISIONING_OWNER_BYTES=16384,PROVISIONING_JOURNAL_PATH,MAX_PROVISIONING_JOURNAL_BYTES=262144,MAX_PROVISIONING_JOURNAL_ENTRIES=512,WORKTREE_PROVISIONING_OWNER_LEASE_MS=300000,WORKTREE_LIFECYCLE_LOCK_FILE=".swarm/locks/init-orphan-recovery.lock",WORKTREE_PROVISIONING_LIFECYCLE_STATES;var init_worktree_provisioning_owner=__esm(()=>{init_atomic_write();init_utils2();PROVISIONING_JOURNAL_PATH=path42.join(".swarm","worktree-provisioning-lifecycle.json"),WORKTREE_PROVISIONING_LIFECYCLE_STATES=["OWNER_PUBLISHED","OWNER_REMOVED"]});import{spawnSync as spawnSync3}from"node:child_process";import{existsSync as existsSync21}from"node:fs";import{tmpdir as tmpdir4}from"node:os";function resolveBwrapBinary(){try{if(existsSync21(BWRAP_ABSOLUTE))return BWRAP_ABSOLUTE}catch{}return"bwrap"}function shellQuote(s){return`'${shellEscape(s)}'`}function buildBwrapArgs(input){let{quote}=input,roBindArgs=input.readonlyRoots.flatMap((p)=>["--ro-bind",quote(p),quote(p)]),bindArgs=input.scopes.flatMap((p)=>["--bind",quote(p),quote(p)]),args2=["--unshare-user","--unshare-ipc","--die-with-parent","--new-session","--cap-drop","ALL",...roBindArgs,...bindArgs,"--dev","/dev","--size",String(TMPFS_SIZE_BYTES),"--tmpfs",quote(input.temp),"--ro-bind","/etc","/etc","--ro-bind","/usr","/usr","--ro-bind","/lib","/lib","--ro-bind","/lib64","/lib64","--proc","/proc","--unshare-pid",...input.envArgs,"--","bash","-c",quote(input.command)];if((input.networkMode??"off")==="off")args2.splice(1,0,"--unshare-net");return args2}function probeBwrapNamespace(binary){try{let result=spawnSync3(binary,[...BWRAP_NAMESPACE_SMOKE_ARGS],{cwd:tmpdir4(),windowsHide:!0,encoding:"utf-8",timeout:5000,stdio:["ignore","ignore","pipe"]});if(!result.error&&result.status===0)return{ok:!0};return{ok:!1,reason:result.error?.message??(result.stderr?.trim().split(`
615
615
  `)[0]||`exit ${result.status}`)}}catch(err){return{ok:!1,reason:err instanceof Error?err.message:String(err)}}}function probeBwrap(){try{let binary=_internals39.resolveBwrapBinary(),result=spawnSync3(binary,["--version"],{cwd:tmpdir4(),windowsHide:!0,encoding:"utf-8",timeout:5000,stdio:["ignore","pipe","ignore"]});if(result.error){let code=result.error.code;if(code&&BWRAP_UNAVAILABLE_CODES.has(code))return warn(`Sandbox disabled: bwrap error (${code}). Falling through to tool-layer enforcement.`),!1;return warn(`Sandbox disabled: bwrap spawn error (${result.error.message}). Falling through to tool-layer enforcement.`),!1}if(result.status!==BWRAP_VERSION_EXIT||result.stdout.trim().length===0)return!1;let smoke=_internals39.probeBwrapNamespace(binary);if(!smoke.ok)return warn(`Sandbox disabled: bwrap cannot create a sandbox on this host (${smoke.reason}). Unprivileged user namespaces may be restricted (Ubuntu 24.04+: kernel.apparmor_restrict_unprivileged_userns=1). Falling through to tool-layer enforcement.`),!1;return!0}catch(err){let message=err instanceof Error?err.message:String(err);return warn(`Sandbox disabled: probe threw (${message}). Falling through to tool-layer enforcement.`),!1}}function shellEscape(s){return s.replace(/'/g,"'\\''")}class BubblewrapSandboxExecutor{mechanism="Bubblewrap";_scopePaths;_tempDir;_available;_disabledReason;constructor(scopePaths=[],tempDir){this._scopePaths=scopePaths,this._tempDir=tempDir,this._available=!1,this._disabledReason=null;try{if(!_internals39.probeBwrap())this._disabledReason="bwrap not available or not functional",warn(`Sandbox disabled: ${this._disabledReason}. Falling through to tool-layer enforcement.`);else this._available=!0}catch(err){let message=err instanceof Error?err.message:String(err);this._disabledReason=`constructor threw: ${message}`,this._available=!1,warn(`Sandbox disabled: ${this._disabledReason}. Falling through to tool-layer enforcement.`)}}isAvailable(){return this._available}disable(reason){this._available=!1,this._disabledReason=reason,warn(`Sandbox disabled: ${reason}. Falling through to tool-layer enforcement.`)}wrapCommand(command,scopePaths,tempDir,envOverrides,policy){if(!this._available)throw new SandboxError("Sandbox not available","SANDBOX_UNAVAILABLE");let temp=tempDir??this._tempDir??"/tmp",allScopes=[...this._scopePaths,...scopePaths],readonlyRoots=[...new Set((policy?.readonly_roots??[]).filter((p)=>typeof p==="string"&&p.startsWith("/")&&p!=="/"))],envArgs=[];if(envOverrides)for(let[key,value]of Object.entries(envOverrides)){if(!isValidEnvKey(key))continue;if(value===null)envArgs.push("--unsetenv",key);else envArgs.push("--setenv",key,shellQuote(value))}let args2=buildBwrapArgs({quote:shellQuote,temp,readonlyRoots,scopes:allScopes,envArgs,networkMode:policy?.network_mode,command});return`${_internals39.resolveBwrapBinary()} ${args2.join(" ")}`}getEnvOverrides(){return{}}}var BWRAP_VERSION_EXIT=0,BWRAP_UNAVAILABLE_CODES,BWRAP_ABSOLUTE="/usr/bin/bwrap",TMPFS_SIZE_BYTES=524288000,BWRAP_NAMESPACE_SMOKE_ARGS,_internals39;var init_bubblewrap_executor=__esm(()=>{init_logger();init_executor();BWRAP_UNAVAILABLE_CODES=new Set(["ENOENT","EACCES","ENOSPC"]);BWRAP_NAMESPACE_SMOKE_ARGS=buildBwrapArgs({quote:(value)=>value,temp:"/tmp",readonlyRoots:[],scopes:[],envArgs:[],networkMode:"off",command:"true"});_internals39={probeBwrap,probeBwrapNamespace,resolveBwrapBinary}});import{spawnSync as spawnSync4}from"node:child_process";import{existsSync as existsSync22,mkdtempSync,writeFileSync as writeFileSync9}from"node:fs";import*as os9 from"node:os";import*as path43 from"node:path";function resolveBinary(absolutePath,bareName){try{if(_internals40.exists(absolutePath))return absolutePath}catch{}return bareName}function resolveSandboxExecBinary(){return resolveBinary(SANDBOX_EXEC_ABSOLUTE,"sandbox-exec")}function resolveProbeTargetBinary(){return resolveBinary(TRUE_ABSOLUTE,"true")}function buildProbeProfile(tempDir){return`(version 1)
616
616
  (allow default)
@@ -1363,7 +1363,7 @@ Ignoring will not affect already-tracked files. To stop tracking them, run:
1363
1363
  echo ".swarm/" >> .gitignore
1364
1364
  git commit -m "Stop tracking opencode-swarm runtime state"`)}catch{}}var _internals114,_swarmGitExcludedChecked=!1,ENSURE_SWARM_GIT_EXCLUDED_OUTER_TIMEOUT_MS=3000,ENSURE_SWARM_GIT_EXCLUDED_PER_CALL_TIMEOUT_MS=1500,GIT_SPAWN_OPTIONS;var init_gitignore_warning=__esm(()=>{init_warning_buffer();init_bun_compat();init_git_executable();_internals114={bunSpawn,resolveGitExecutableAsync};GIT_SPAWN_OPTIONS={timeout:ENSURE_SWARM_GIT_EXCLUDED_PER_CALL_TIMEOUT_MS,stdin:"ignore",stdout:"pipe",stderr:"pipe"}});import*as fs77 from"node:fs";import*as path122 from"node:path";function getDeclaredScope(taskId,directory){try{let planPath=path122.join(directory,".swarm","plan.json");if(!fs77.existsSync(planPath))return null;let raw=fs77.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)return ft;if(typeof ft==="string"&&ft.length>0)return[ft];return null}return null}catch{return null}}async function getChangedFiles(directory){try{let gitExecutable=_internals115.resolveGitExecutable(),proc=_internals115.bunSpawn([gitExecutable,"diff","--name-only","HEAD~1"],{cwd:directory,...GIT_DIFF_SPAWN_OPTIONS}),exitCode,stdout;try{[exitCode,stdout]=await Promise.all([proc.exited,proc.stdout.text()])}finally{try{proc.kill()}catch{}}if(exitCode===0)return{files:stdout.trim().split(`
1365
1365
  `).map((f)=>f.trim()).filter((f)=>f.length>0),basis:"HEAD~1"};let proc2=_internals115.bunSpawn([gitExecutable,"diff","--name-only","HEAD"],{cwd:directory,...GIT_DIFF_SPAWN_OPTIONS}),exitCode2,stdout2;try{[exitCode2,stdout2]=await Promise.all([proc2.exited,proc2.stdout.text()])}finally{try{proc2.kill()}catch{}}if(exitCode2===0)return{files:stdout2.trim().split(`
1366
- `).map((f)=>f.trim()).filter((f)=>f.length>0),basis:"HEAD"};return{files:null,basis:"HEAD~1"}}catch{return{files:null,basis:"HEAD~1"}}}async function getLatestCommitShortSha(directory){try{let gitExecutable=_internals115.resolveGitExecutable(),proc=_internals115.bunSpawn([gitExecutable,"rev-parse","--short","HEAD"],{cwd:directory,...GIT_DIFF_SPAWN_OPTIONS}),exitCode,stdout;try{[exitCode,stdout]=await Promise.all([proc.exited,proc.stdout.text()])}finally{try{proc.kill()}catch{}}if(exitCode===0){let sha=stdout.trim();if(sha.length>0&&!/\s/.test(sha))return sha}return""}catch{return""}}function hasDeclaredDiffScope(taskId,directory){try{return getDeclaredScope(taskId,directory)!==null}catch{return!1}}async function validateDiffScope(taskId,directory,attribution){try{let declaredScope=getDeclaredScope(taskId,directory);if(!declaredScope)return null;let normalise=(p)=>p.replace(/\\/g,"/").replace(/^\.\//,""),isSwarmPath2=(p)=>normalise(p).startsWith(".swarm/"),normScope=new Set(declaredScope.map(normalise)),canonicaliseAttributionEntry=(raw)=>{let resolved=path122.isAbsolute(raw)?path122.normalize(raw):path122.resolve(directory,raw),relative33=path122.relative(directory,resolved);if(!relative33)return null;if(relative33.startsWith("..")||path122.isAbsolute(relative33))return null;return relative33},attributed=attribution?.attributedFiles,undeclared,evidence2;if(Array.isArray(attributed)&&attributed.length>0){let normScopeAttribution=new Set(declaredScope.map(normalizePath));undeclared=attributed.filter((f)=>typeof f==="string"&&f.length>0).map(canonicaliseAttributionEntry).filter((entry)=>entry!==null).map(normalise).filter((f)=>!isSwarmPath2(f)).filter((f)=>!normScopeAttribution.has(normalizePath(f))),evidence2="task attribution record"}else{let{files,basis}=await getChangedFiles(directory);if(!files)return null;if(undeclared=files.filter((f)=>!isSwarmPath2(f)).map(normalise).filter((f)=>!normScope.has(f)),undeclared.length===0)return null;let sha=await getLatestCommitShortSha(directory),shaSuffix=sha?` ${sha}`:"";evidence2=basis==="HEAD"?`repository-wide uncommitted diff vs HEAD${shaSuffix}`:`repository-wide diff vs latest commit${shaSuffix}`}if(undeclared.length===0)return null;let scopeStr=declaredScope.join(", "),undeclaredStr=undeclared.slice(0,5).join(", "),extra=undeclared.length>5?` (+${undeclared.length-5} more)`:"";return`SCOPE WARNING: Task ${taskId} declared scope [${scopeStr}] but also modified [${undeclaredStr}${extra}] (evidence: ${evidence2}). Reviewer should verify these changes are intentional.`}catch{return null}}var _internals115,GIT_DIFF_SPAWN_OPTIONS;var init_diff_scope=__esm(()=>{init_bun_compat();init_git_executable();init_gitignore_warning();init_path();_internals115={bunSpawn,resolveGitExecutable};GIT_DIFF_SPAWN_OPTIONS={timeout:ENSURE_SWARM_GIT_EXCLUDED_PER_CALL_TIMEOUT_MS,stdin:"ignore",stdout:"pipe",stderr:"pipe"}});import*as fs78 from"node:fs";import*as path123 from"node:path";function verifyLeanTurboTaskCompletion(directory,taskId,sessionID){let persisted=null;try{let statePath2=path123.join(directory,".swarm","turbo-state.json");if(!fs78.existsSync(statePath2))return{ok:!1,reason:"Lean Turbo state file not found"};let raw=fs78.readFileSync(statePath2,"utf-8");persisted=JSON.parse(raw)}catch{return{ok:!1,reason:"Lean Turbo state file unreadable or malformed"}}if(typeof persisted!=="object"||persisted===null||typeof persisted.sessions!=="object"||persisted.sessions===null||Array.isArray(persisted.sessions))return{ok:!1,reason:"Lean Turbo state malformed: missing expected fields"};let runState=null;for(let sessionState of Object.values(persisted.sessions))if(typeof sessionState==="object"&&sessionState!==null&&sessionState.strategy==="lean"&&sessionState.status==="running"){if(sessionID!==void 0&&sessionState.sessionID!==sessionID)continue;runState=sessionState;break}if(!runState)return{ok:!1,reason:"No active Lean Turbo run state found"};if(!Array.isArray(runState.lanes)||!Array.isArray(runState.degradedTasks))return{ok:!1,reason:"Lean Turbo state malformed: missing expected fields"};let lane=runState.lanes.find((l)=>typeof l==="object"&&l!==null&&Array.isArray(l.taskIds)&&typeof l.laneId==="string"&&l.taskIds.includes(taskId));if(!lane)return{ok:!1,reason:`Task ${taskId} not found in any Lean Turbo lane`,laneFound:!1};let degradedTask=runState.degradedTasks.find((dt)=>typeof dt==="object"&&dt!==null&&dt.taskId===taskId);if(degradedTask)return{ok:!1,reason:`Task ${taskId} is degraded: ${degradedTask.reason}`,laneFound:!0};if(lane.status!=="completed")return{ok:!1,reason:`Lane ${lane.laneId} is not completed (status: ${lane.status})`,laneFound:!0,evidence:{laneId:lane.laneId,laneStatus:lane.status,taskIds:lane.taskIds}};if(lane.laneId.length===0||lane.laneId.includes("/")||lane.laneId.includes("\\")||lane.laneId.includes(".."))return{ok:!1,reason:`Lane ID contains invalid characters: ${lane.laneId}`,laneFound:!0,evidence:{laneId:lane.laneId,laneStatus:lane.status,taskIds:lane.taskIds}};let phase=runState.phase??0,evidencePath=path123.join(directory,".swarm","evidence",String(phase),"lean-turbo",`${lane.laneId}.json`),expectedDir=path123.join(directory,".swarm","evidence",String(phase),"lean-turbo"),resolvedPath=path123.resolve(evidencePath),resolvedDir=path123.resolve(expectedDir);if(!resolvedPath.startsWith(resolvedDir+path123.sep)&&resolvedPath!==resolvedDir)return{ok:!1,reason:`Lane ID causes path traversal: ${lane.laneId}`,laneFound:!0,evidence:{laneId:lane.laneId,laneStatus:lane.status,taskIds:lane.taskIds}};if(!fs78.existsSync(evidencePath))return{ok:!1,reason:`Lane ${lane.laneId} evidence file not found: ${evidencePath}`,laneFound:!0,evidence:{laneId:lane.laneId,laneStatus:lane.status,taskIds:lane.taskIds}};let laneLocks=_internals116.listActiveLocks(directory).filter((lock)=>lock.laneId===lane.laneId);if(laneLocks.length>0)return{ok:!1,reason:`Active file locks exist for lane ${lane.laneId}: ${laneLocks.map((l)=>l.filePath).join(", ")}`,laneFound:!0,evidence:{laneId:lane.laneId,laneStatus:lane.status,taskIds:lane.taskIds}};let filesTouched=[];try{let planPath=path123.join(directory,".swarm","plan.json"),planRaw=fs78.readFileSync(planPath,"utf-8"),plan=JSON.parse(planRaw);for(let planPhase of plan.phases??[])for(let task of planPhase.tasks??[])if(task.id===taskId&&task.files_touched){filesTouched=task.files_touched;break}}catch{return{ok:!1,reason:`Cannot verify Tier-3 patterns for task ${taskId}: plan.json unreadable`,laneFound:!0,evidence:{laneId:lane.laneId,laneStatus:lane.status,taskIds:lane.taskIds}}}if(filesTouched.length>0&&matchesTier3(filesTouched))return{ok:!1,reason:`Task ${taskId} touches Tier-3 security-sensitive files and cannot bypass Stage B`,laneFound:!0,evidence:{laneId:lane.laneId,laneStatus:lane.status,taskIds:lane.taskIds}};return{ok:!0,reason:`Task ${taskId} in completed lane ${lane.laneId}`,laneFound:!0,evidence:{laneId:lane.laneId,laneStatus:lane.status,taskIds:lane.taskIds}}}var _internals116;var init_task_completion=__esm(()=>{init_file_locks();init_tier3_classifier();_internals116={listActiveLocks,verifyLeanTurboTaskCompletion}});function applySessionWorkflowView(session,taskId,workflow){session.taskWorkflowStates.set(taskId,workflow.state),session.stageBCompletion?.delete(taskId),session.taskCouncilApproved?.delete(taskId),session.taskCouncilWorkflowGeneration?.delete(taskId),updateTaskWorkflowCache(session,taskId,workflow)}function isStageARecoveredState(state2){return STAGE_A_RECOVERED_STATES.includes(state2)}function shouldRefreshStageARecoveryView(view,recoveredState){if(view===void 0)return!0;if(view==="rework_required"||view==="blocked")return!0;if(view==="tests_run"||view==="closed"||view==="complete")return!1;return compareTaskWorkflowStateRank(recoveredState,view)>0}var STAGE_A_RECOVERED_STATES;var init_session_view=__esm(()=>{init_gate_evidence();init_state();STAGE_A_RECOVERED_STATES=["pre_check_passed","reviewer_run","tests_run"]});import*as fs79 from"node:fs";import*as path124 from"node:path";async function recordRunMemoryOutcome(directory,input){try{await _internals117.recordTaskAttempt(directory,input)}catch(_error){}}function syncCallerWorkflowFromEvidence(sessionId,taskId,evidence2){if(!sessionId)return;let callerSession=ensureAgentSession(sessionId),workflow=getTaskWorkflowSnapshot(evidence2);applySessionWorkflowView(callerSession,taskId,workflow)}async function hasPreparedWorkflowWal(directory,taskId,kind){return await readPreparedWorkflowWal(directory,taskId,kind)!==null}async function readPreparedWorkflowWal(directory,taskId,kind){let walPath2=validateSwarmPath(directory,kind==="task-repair"?`task-repairs/${taskId}.json`:`task-terminals/${taskId}.json`),wal=await readWorkflowWalFile(kind,walPath2,taskId);return wal?.state==="PREPARED"?wal:null}function resolveRunMemoryFileTargets(plan,taskId){return plan?.phases.flatMap((phase)=>phase.tasks).find((candidate)=>candidate.id===taskId)?.files_touched??[]}function validateStatus(status2){if(!VALID_STATUSES.includes(status2))return`Invalid status "${status2}". Must be one of: ${VALID_STATUSES.join(", ")}`;return}function validateTaskId(taskId){if(validateTaskIdFormat(taskId))return`Invalid task_id "${taskId}". Must match pattern N.M or N.M.P (e.g., "1.1", "1.2.3")`;return}function getSettledTransitionRejection(taskId,currentStatus,nextStatus,force){if(currentStatus!=="pending"&&currentStatus!=="in_progress"&&nextStatus!==currentStatus){if(nextStatus!=="in_progress"||force!==!0)return{success:!1,message:`Task ${taskId} is settled (${currentStatus}); backward transitions require the audited in_progress repair path.`,errors:[`Task ${taskId} is settled (${currentStatus}); use force:true with exact CAS and audit fields to repair it to in_progress.`]}}return null}function isRepairRetryShape(args2){return args2.status==="in_progress"&&args2.force===!0&&typeof args2.transition_id==="string"}function reviewerGateDecision(taskId,sessionID,result,reasonCode,evidenceKind){try{_internals117.emitReviewerGateDecision(sessionID??"",taskId,result.blocked,reasonCode,evidenceKind)}catch(_error){}return result}function hasPassedDurableGateEvidence(workingDirectory,taskId){let evidence2=readTaskEvidenceRaw(workingDirectory,taskId);if(!evidence2||!Array.isArray(evidence2.required_gates)||evidence2.required_gates.length===0)return!1;return evidence2.required_gates.every((gate)=>evidence2.gates?.[gate]!=null)}function routeGateAllowsTask(directory,taskId,sessionID){if(!directory)return!0;if(!(()=>{try{return loadPluginConfig(directory).review_routing?.enforce_receipts??!0}catch{return!0}})())return!0;let requirementReceipts=(()=>{try{return readTaskGateRequirementsReceiptsSync(directory,taskId)}catch{return null}})();if(!requirementReceipts)return!1;let session=sessionID?swarmState.agentSessions.get(sessionID):void 0,routeRequired=sessionID?session?isStageBRouteRequired(session,taskId):!1:[...swarmState.agentSessions.values()].some((candidate)=>isStageBRouteRequired(candidate,taskId)),legacyUnrouted=isLegacyTaskGateRequirementsChain(requirementReceipts)&&!routeRequired;if(!routeRequired&&requirementReceipts.length===0)return!0;let durableEvidence=routeEvidenceFromTaskGateRequirements(requirementReceipts),routeAllowsSession=(candidateSessionID,candidateSession)=>{try{readReviewRouteReceiptSync({projectRoot:directory,sessionId:candidateSessionID,taskId})}catch{return!1}let liveEvidence=candidateSession?getStageBRouteEvidence(candidateSession,taskId):[];return enforcePersistedReviewRouteReceipt({projectRoot:directory,sessionId:candidateSessionID,taskId,receipts:liveEvidence.length>0?liveEvidence:durableEvidence,enforcementEnabled:!0,legacyUnrouted:!1,requireEvidenceBindings:!0}).canAdvance};if(sessionID)return routeAllowsSession(sessionID,session);if(!routeRequired)return legacyUnrouted;let evidenceSessionIDs=new Set(durableEvidence.map((evidence2)=>evidence2.sessionId).filter((value)=>Boolean(value)));for(let[candidateSessionID,candidateSession]of swarmState.agentSessions){if(!isStageBRouteRequired(candidateSession,taskId)&&!evidenceSessionIDs.has(candidateSessionID))continue;if(routeAllowsSession(candidateSessionID,candidateSession))return!0}return!1}function checkReviewerGate(taskId,workingDirectory,stageBParallelEnabled=!1,sessionID,fallbackDir,currentDeclaredFiles){try{let skipStandardTurboBypass=!1;if(!fallbackDir&&!sessionID&&_internals117.hasActiveLeanTurbo(sessionID)){let resolvedDir2=workingDirectory;try{let leanCheck=_internals117.verifyLeanTurboTaskCompletion(resolvedDir2,taskId,sessionID);if(leanCheck.ok)return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:`Lean Turbo bypass: ${leanCheck.reason}`},"lean_turbo_completed_lane","fallback");if(leanCheck.laneFound!==!1)skipStandardTurboBypass=!0}catch{skipStandardTurboBypass=!0}}if(!fallbackDir&&!sessionID&&!skipStandardTurboBypass&&_internals117.hasActiveTurboMode(sessionID)){let resolvedDir2=workingDirectory;try{let planPath=path124.join(resolvedDir2,".swarm","plan.json"),planRaw=fs79.readFileSync(planPath,"utf-8"),plan=JSON.parse(planRaw);for(let planPhase of plan.phases??[])for(let task of planPhase.tasks??[])if(task.id===taskId&&Array.isArray(task.files_touched)&&task.files_touched.length>0){if(!matchesTier3(task.files_touched))return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:"Turbo Mode bypass"},"standard_turbo_non_tier3","fallback");break}}catch{}}let authoritativeDir;if(fallbackDir){let resolved=_internals117.resolveWorkingDirectory(workingDirectory,fallbackDir);authoritativeDir=resolved.success?resolved.directory:fallbackDir}else if(workingDirectory)authoritativeDir=workingDirectory;if(authoritativeDir){let legacyDirectCaller=Symbol("legacy-direct-reviewer-gate");try{let evidence2=_internals117.readTaskEvidenceRaw(authoritativeDir,taskId);if(!fallbackDir&&!sessionID&&!evidence2?.workflow)throw legacyDirectCaller;try{let planPath=path124.join(authoritativeDir,".swarm","plan.json"),planRaw=fs79.readFileSync(planPath,"utf-8"),plan=JSON.parse(planRaw),declaredTask=(plan.phases??[]).flatMap((phase)=>phase.tasks??[]).find((task)=>task.id===taskId);if(declaredTask&&declaredTask.evidence_class==="external_git"&&typeof plan.title==="string"&&typeof plan.swarm==="string"){let planIdentity={title:plan.title,swarm:plan.swarm},workflow2=getTaskWorkflowSnapshot(evidence2);if(isExternalEvidenceInitialCompletionEligible(planIdentity,declaredTask,evidence2)||workflow2.state==="complete"&&externalProofCurrent(planIdentity,declaredTask,evidence2))return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:`External evidence attested: task ${taskId} completed via the pinned external_git anchors (issue #3422)`,requiredGates:[],satisfiedGates:[],missingGates:[],source:"external_attest",generation:workflow2.generation},"durable_evidence_complete","fallback");return reviewerGateDecision(taskId,sessionID,{blocked:!0,reason:`Task ${taskId} declares external_git evidence but no matched attestation exists yet. Run /swarm attest ${taskId} (or re-plan it as a thin coder dispatch).`,requiredGates:[],satisfiedGates:[],missingGates:["external_attest"],source:"durable_exact_task",generation:workflow2.generation,nextAction:`Run /swarm attest ${taskId} (or re-plan it as a thin coder dispatch).`},"required_gates_missing","block")}}catch{}if(!evidence2)return reviewerGateDecision(taskId,sessionID,{blocked:!0,reason:`Task ${taskId} has no exact-task QA evidence. Delegate the required Stage B agents, then retry completion.`,requiredGates:[],satisfiedGates:[],missingGates:["reviewer","test_engineer"],source:"durable_exact_task",generation:0,nextAction:"Delegate reviewer and test_engineer for this exact task generation."},"required_gates_missing","block");if(!evidence2.workflow){let derivedGates2=deriveApplicableGateSet(evidence2);return reviewerGateDecision(taskId,sessionID,{blocked:!0,reason:`Task ${taskId} has legacy QA evidence without an authoritative workflow generation. Run a fresh exact-task workflow transition before completion.`,requiredGates:derivedGates2.requiredGates,satisfiedGates:derivedGates2.satisfiedGates,missingGates:derivedGates2.missingGates,source:"durable_exact_task",generation:0,nextAction:"Re-run the exact-task coder/Stage A/Stage B workflow to migrate evidence."},"required_gates_missing","block")}let workflow=getTaskWorkflowSnapshot(evidence2),derivedGates=deriveApplicableGateSet(evidence2,{currentDeclaredFiles:currentDeclaredFiles===void 0?readCurrentTaskDeclaredFiles(authoritativeDir,taskId):currentDeclaredFiles}),requiredGates=derivedGates.requiredGates,satisfiedGates=derivedGates.satisfiedGates,missingGates=derivedGates.missingGates;if(requiredGates.includes(TASK_GATE_REQUIREMENTS_RECONSTRUCTION_SENTINEL)){let recovery=`Task ${taskId} contains a legacy receipt-less gate-repair marker that no agent can satisfy. Call repair_gate_evidence for task ${taskId}, then delegate coder for a fresh accepted mutation before rerunning Stage A and Stage B.`;return reviewerGateDecision(taskId,sessionID,{blocked:!0,reason:recovery,requiredGates,satisfiedGates,missingGates,source:"durable_exact_task",generation:workflow.generation,nextAction:recovery},"required_gates_missing","data_quality")}let contradictorySignals=[];if((workflow.state==="tests_run"||workflow.state==="complete")&&missingGates.length>0)contradictorySignals.push(`workflow state ${workflow.state} claims completion readiness while required proof is missing`);if(workflow.state!=="tests_run"&&workflow.state!=="complete"&&evidence2.gates.pre_check!=null&&requiredGates.length>0&&missingGates.length===0)contradictorySignals.push(`all required proof exists but workflow state is ${workflow.state}`);let workflowComplete=workflow.state==="tests_run"||workflow.state==="complete";if(missingGates.length===0&&contradictorySignals.length===0&&(workflowComplete||derivedGates.readOnlyNoMutation)){if(!derivedGates.readOnlyNoMutation&&!routeGateAllowsTask(authoritativeDir,taskId,sessionID))return reviewerGateDecision(taskId,sessionID,{blocked:!0,reason:`Task ${taskId} has not satisfied its exact v1 review route receipt. Missing or mismatched route evidence fails closed.`,requiredGates,satisfiedGates,missingGates:["review_route_receipt"],source:"durable_exact_task",generation:workflow.generation,nextAction:"Recover the exact route receipt and independent Stage-B bindings before completing this task."},"required_gates_missing","block");return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:"",requiredGates,satisfiedGates,missingGates,contradictorySignals,source:"durable_exact_task",generation:workflow.generation},"durable_evidence_complete","genuine")}return reviewerGateDecision(taskId,sessionID,{blocked:!0,reason:`Task ${taskId} generation ${workflow.generation} has not passed exact-task QA. State: ${workflow.state}. Missing gates: [${missingGates.join(", ")}]. Contradictions: [${contradictorySignals.join("; ")}].`,requiredGates,satisfiedGates,missingGates,contradictorySignals,source:"durable_exact_task",generation:workflow.generation,nextAction:workflow.state==="rework_required"?"Delegate the same task to coder for repair, then rerun Stage A and Stage B.":"Complete the missing exact-task Stage A/Stage B transitions."},"required_gates_missing","block")}catch(error93){if(error93===legacyDirectCaller);else return reviewerGateDecision(taskId,sessionID,{blocked:!0,reason:`Evidence file for task ${taskId} is corrupt or unreadable: ${error93 instanceof Error?error93.message:String(error93)}. Call repair_gate_evidence for task ${taskId}; corrupt evidence fails closed until the repair completes.`,requiredGates:[],satisfiedGates:[],missingGates:["reviewer","test_engineer"],source:"durable_exact_task",corrupt:!0,nextAction:`Call repair_gate_evidence for task ${taskId}; corrupt evidence fails closed until the repair completes.`},"corrupt_evidence","data_quality")}}let resolvedDir;if(fallbackDir){let resolveResult=_internals117.resolveWorkingDirectory(workingDirectory,fallbackDir);if(resolveResult.success)resolvedDir=resolveResult.directory;else resolvedDir=fallbackDir}else if(workingDirectory)resolvedDir=workingDirectory;let routeAllowsStageB=(sessionId,_session)=>routeGateAllowsTask(resolvedDir,taskId,sessionId),evidenceIncompleteReason=null;try{if(!resolvedDir);else{let evidence2=_internals117.readTaskEvidenceRaw(resolvedDir,taskId);if(evidence2===null);else if(evidence2.required_gates&&Array.isArray(evidence2.required_gates)&&evidence2.gates){if(evidence2.required_gates.length>0&&evidence2.required_gates.every((gate)=>evidence2.gates[gate]!=null)){let routeSession=sessionID?swarmState.agentSessions.get(sessionID):void 0;if(!resolvedDir||routeAllowsStageB(sessionID,routeSession))return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:""},"durable_evidence_complete","genuine")}let missingGates=evidence2.required_gates.filter((gate)=>evidence2.gates[gate]==null);evidenceIncompleteReason=evidence2.required_gates.length===0?`Task ${taskId} has an evidence file with no required gates. Delegate reviewer and test_engineer before marking task as completed.`:`Task ${taskId} is missing required gates: [${missingGates.join(", ")}]. Required: [${evidence2.required_gates.join(", ")}]. Completed: [${Object.keys(evidence2.gates).join(", ")}]. Delegate the missing gate agents before marking task as completed.`}}}catch(error93){return log(`[gate-evidence] Evidence file for task ${taskId} is corrupt or unreadable:`,error93 instanceof Error?error93.message:String(error93)),telemetry.gateFailed("","qa_gate",taskId,"Evidence file corrupt or unreadable"),reviewerGateDecision(taskId,sessionID,{blocked:!0,reason:`Evidence file for task ${taskId} is corrupt or unreadable. Call repair_gate_evidence for task ${taskId}; corrupt evidence fails closed until the repair completes.`},"corrupt_evidence","data_quality")}if(swarmState.agentSessions.size===0&&!evidenceIncompleteReason)return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:""},"no_active_sessions","fallback");let validSessionCount=0;for(let[_sessionId,session]of swarmState.agentSessions){if(!(session.taskWorkflowStates instanceof Map))continue;validSessionCount++;let state2=getTaskState(session,taskId);if(state2==="tests_run"||state2==="complete"){if(resolvedDir&&!routeAllowsStageB(_sessionId,session))continue;return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:""},"workflow_state_complete","genuine")}if(stageBParallelEnabled&&hasBothStageBCompletions(session,taskId)&&(!resolvedDir||routeAllowsStageB(_sessionId,session)))return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:""},"stage_b_parallel_complete","genuine")}if(validSessionCount===0&&!evidenceIncompleteReason)return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:""},"zero_valid_sessions","data_quality");let stateEntries=[];for(let[sessionId,session]of swarmState.agentSessions){if(!(session.taskWorkflowStates instanceof Map))continue;let state2=getTaskState(session,taskId);stateEntries.push(`${sessionId}: ${state2}`)}if(resolvedDir)try{let planPath=path124.join(resolvedDir,".swarm","plan.json"),planRaw=fs79.readFileSync(planPath,"utf-8"),plan=JSON.parse(planRaw);for(let planPhase of plan.phases??[])for(let task of planPhase.tasks??[])if(task.id===taskId&&task.status==="completed"&&_internals117.hasPassedDurableGateEvidence(resolvedDir,taskId))return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:""},"restart_recovery_complete","genuine")}catch{}{let hasReviewer=!1,hasTestEngineer=!1;for(let[sessionId,chain]of swarmState.delegationChains){let session=swarmState.agentSessions.get(sessionId);if(session&&(session.currentTaskId===taskId||session.lastCoderDelegationTaskId===taskId))for(let delegation of chain){let target=stripKnownSwarmPrefix(delegation.to);if(target==="reviewer")hasReviewer=!0;if(target==="test_engineer")hasTestEngineer=!0}}if(hasReviewer&&hasTestEngineer)return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:""},"scoped_delegation_complete","genuine");if(!evidenceIncompleteReason&&(!hasReviewer||!hasTestEngineer)){for(let[sessionId,chain]of swarmState.delegationChains){if(chain.some((d)=>stripKnownSwarmPrefix(d.to)==="coder"))continue;let chainSession=swarmState.agentSessions.get(sessionId);if(chainSession){let chainTaskId=chainSession.currentTaskId||chainSession.lastCoderDelegationTaskId;if(chainTaskId&&chainTaskId!==taskId)continue}for(let delegation of chain){let target=stripKnownSwarmPrefix(delegation.to);if(target==="reviewer")hasReviewer=!0;if(target==="test_engineer")hasTestEngineer=!0}}if(hasReviewer&&hasTestEngineer)return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:""},"unscoped_delegation_complete","genuine")}}let currentStateStr=stateEntries.length>0?stateEntries.join(", "):"no active sessions",chainEntries=[];for(let[sessionId,chain]of swarmState.delegationChains){let session=swarmState.agentSessions.get(sessionId);if(session&&(session.currentTaskId===taskId||session.lastCoderDelegationTaskId===taskId)){let targets=chain.map((d)=>stripKnownSwarmPrefix(d.to));chainEntries.push(`${sessionId}: [${targets.join(", ")}]`)}}let chainSummary=chainEntries.length>0?chainEntries.join("; "):"no chains for this task",rehydratedSessionCount=[...swarmState.agentSessions.values()].filter((s)=>s.sessionRehydratedAt>0).length,finalReason=[`Task ${taskId} has not passed QA gates.`,` Session states: [${currentStateStr}].`,` Delegation chains: [${chainSummary}].`,` Evidence: [${evidenceIncompleteReason??"no evidence file found"}].`,` Rehydrated sessions: ${rehydratedSessionCount}.`," Missing required state: tests_run or complete."].join(`
1366
+ `).map((f)=>f.trim()).filter((f)=>f.length>0),basis:"HEAD"};return{files:null,basis:"HEAD~1"}}catch{return{files:null,basis:"HEAD~1"}}}async function getLatestCommitShortSha(directory){try{let gitExecutable=_internals115.resolveGitExecutable(),proc=_internals115.bunSpawn([gitExecutable,"rev-parse","--short","HEAD"],{cwd:directory,...GIT_DIFF_SPAWN_OPTIONS}),exitCode,stdout;try{[exitCode,stdout]=await Promise.all([proc.exited,proc.stdout.text()])}finally{try{proc.kill()}catch{}}if(exitCode===0){let sha=stdout.trim();if(sha.length>0&&!/\s/.test(sha))return sha}return""}catch{return""}}function hasDeclaredDiffScope(taskId,directory){try{return getDeclaredScope(taskId,directory)!==null}catch{return!1}}async function validateDiffScope(taskId,directory,attribution){try{let declaredScope=getDeclaredScope(taskId,directory);if(!declaredScope)return null;let normalise=(p)=>p.replace(/\\/g,"/").replace(/^\.\//,""),isSwarmPath2=(p)=>normalise(p).startsWith(".swarm/"),normScope=new Set(declaredScope.map(normalise)),canonicaliseAttributionEntry=(raw)=>{let resolved=path122.isAbsolute(raw)?path122.normalize(raw):path122.resolve(directory,raw),relative33=path122.relative(directory,resolved);if(!relative33)return null;if(relative33.startsWith("..")||path122.isAbsolute(relative33))return null;return relative33},attributed=attribution?.attributedFiles,undeclared,evidence2;if(Array.isArray(attributed)&&attributed.length>0){let normScopeAttribution=new Set(declaredScope.map(normalizePath));undeclared=attributed.filter((f)=>typeof f==="string"&&f.length>0).map(canonicaliseAttributionEntry).filter((entry)=>entry!==null).map(normalise).filter((f)=>!isSwarmPath2(f)).filter((f)=>!normScopeAttribution.has(normalizePath(f))),evidence2="task attribution record"}else{let{files,basis}=await getChangedFiles(directory);if(!files)return null;if(undeclared=files.filter((f)=>!isSwarmPath2(f)).map(normalise).filter((f)=>!normScope.has(f)),undeclared.length===0)return null;let sha=await getLatestCommitShortSha(directory),shaSuffix=sha?` ${sha}`:"";evidence2=basis==="HEAD"?`repository-wide uncommitted diff vs HEAD${shaSuffix}`:`repository-wide diff vs latest commit${shaSuffix}`}if(undeclared.length===0)return null;let scopeStr=declaredScope.join(", "),undeclaredStr=undeclared.slice(0,5).join(", "),extra=undeclared.length>5?` (+${undeclared.length-5} more)`:"";return`SCOPE WARNING: Task ${taskId} declared scope [${scopeStr}] but also modified [${undeclaredStr}${extra}] (evidence: ${evidence2}). Reviewer should verify these changes are intentional.`}catch{return null}}var _internals115,GIT_DIFF_SPAWN_OPTIONS;var init_diff_scope=__esm(()=>{init_bun_compat();init_git_executable();init_gitignore_warning();init_path();_internals115={bunSpawn,resolveGitExecutable};GIT_DIFF_SPAWN_OPTIONS={timeout:ENSURE_SWARM_GIT_EXCLUDED_PER_CALL_TIMEOUT_MS,stdin:"ignore",stdout:"pipe",stderr:"pipe"}});import*as fs78 from"node:fs";import*as path123 from"node:path";function verifyLeanTurboTaskCompletion(directory,taskId,sessionID){let persisted=null;try{let statePath2=path123.join(directory,".swarm","turbo-state.json");if(!fs78.existsSync(statePath2))return{ok:!1,reason:"Lean Turbo state file not found"};let raw=fs78.readFileSync(statePath2,"utf-8");persisted=JSON.parse(raw)}catch{return{ok:!1,reason:"Lean Turbo state file unreadable or malformed"}}if(typeof persisted!=="object"||persisted===null||typeof persisted.sessions!=="object"||persisted.sessions===null||Array.isArray(persisted.sessions))return{ok:!1,reason:"Lean Turbo state malformed: missing expected fields"};let runState=null;for(let sessionState of Object.values(persisted.sessions))if(typeof sessionState==="object"&&sessionState!==null&&sessionState.strategy==="lean"&&sessionState.status==="running"){if(sessionID!==void 0&&sessionState.sessionID!==sessionID)continue;runState=sessionState;break}if(!runState)return{ok:!1,reason:"No active Lean Turbo run state found"};if(!Array.isArray(runState.lanes)||!Array.isArray(runState.degradedTasks))return{ok:!1,reason:"Lean Turbo state malformed: missing expected fields"};let lane=runState.lanes.find((l)=>typeof l==="object"&&l!==null&&Array.isArray(l.taskIds)&&typeof l.laneId==="string"&&l.taskIds.includes(taskId));if(!lane)return{ok:!1,reason:`Task ${taskId} not found in any Lean Turbo lane`,laneFound:!1};let degradedTask=runState.degradedTasks.find((dt)=>typeof dt==="object"&&dt!==null&&dt.taskId===taskId);if(degradedTask)return{ok:!1,reason:`Task ${taskId} is degraded: ${degradedTask.reason}`,laneFound:!0};if(lane.status!=="completed")return{ok:!1,reason:`Lane ${lane.laneId} is not completed (status: ${lane.status})`,laneFound:!0,evidence:{laneId:lane.laneId,laneStatus:lane.status,taskIds:lane.taskIds}};if(lane.laneId.length===0||lane.laneId.includes("/")||lane.laneId.includes("\\")||lane.laneId.includes(".."))return{ok:!1,reason:`Lane ID contains invalid characters: ${lane.laneId}`,laneFound:!0,evidence:{laneId:lane.laneId,laneStatus:lane.status,taskIds:lane.taskIds}};let phase=runState.phase??0,evidencePath=path123.join(directory,".swarm","evidence",String(phase),"lean-turbo",`${lane.laneId}.json`),expectedDir=path123.join(directory,".swarm","evidence",String(phase),"lean-turbo"),resolvedPath=path123.resolve(evidencePath),resolvedDir=path123.resolve(expectedDir);if(!resolvedPath.startsWith(resolvedDir+path123.sep)&&resolvedPath!==resolvedDir)return{ok:!1,reason:`Lane ID causes path traversal: ${lane.laneId}`,laneFound:!0,evidence:{laneId:lane.laneId,laneStatus:lane.status,taskIds:lane.taskIds}};if(!fs78.existsSync(evidencePath))return{ok:!1,reason:`Lane ${lane.laneId} evidence file not found: ${evidencePath}`,laneFound:!0,evidence:{laneId:lane.laneId,laneStatus:lane.status,taskIds:lane.taskIds}};let laneLocks=_internals116.listActiveLocks(directory).filter((lock)=>lock.laneId===lane.laneId);if(laneLocks.length>0)return{ok:!1,reason:`Active file locks exist for lane ${lane.laneId}: ${laneLocks.map((l)=>l.filePath).join(", ")}`,laneFound:!0,evidence:{laneId:lane.laneId,laneStatus:lane.status,taskIds:lane.taskIds}};let filesTouched=[];try{let planPath=path123.join(directory,".swarm","plan.json"),planRaw=fs78.readFileSync(planPath,"utf-8"),plan=JSON.parse(planRaw);for(let planPhase of plan.phases??[])for(let task of planPhase.tasks??[])if(task.id===taskId&&task.files_touched){filesTouched=task.files_touched;break}}catch{return{ok:!1,reason:`Cannot verify Tier-3 patterns for task ${taskId}: plan.json unreadable`,laneFound:!0,evidence:{laneId:lane.laneId,laneStatus:lane.status,taskIds:lane.taskIds}}}if(filesTouched.length>0&&matchesTier3(filesTouched))return{ok:!1,reason:`Task ${taskId} touches Tier-3 security-sensitive files and cannot bypass Stage B`,laneFound:!0,evidence:{laneId:lane.laneId,laneStatus:lane.status,taskIds:lane.taskIds}};return{ok:!0,reason:`Task ${taskId} in completed lane ${lane.laneId}`,laneFound:!0,evidence:{laneId:lane.laneId,laneStatus:lane.status,taskIds:lane.taskIds}}}var _internals116;var init_task_completion=__esm(()=>{init_file_locks();init_tier3_classifier();_internals116={listActiveLocks,verifyLeanTurboTaskCompletion}});function applySessionWorkflowView(session,taskId,workflow){session.taskWorkflowStates.set(taskId,workflow.state),session.stageBCompletion?.delete(taskId),session.taskCouncilApproved?.delete(taskId),session.taskCouncilWorkflowGeneration?.delete(taskId),updateTaskWorkflowCache(session,taskId,workflow)}function isStageARecoveredState(state2){return STAGE_A_RECOVERED_STATES.includes(state2)}function shouldRefreshStageARecoveryView(view,recoveredState){if(view===void 0)return!0;if(view==="rework_required"||view==="blocked")return!0;if(view==="tests_run"||view==="closed"||view==="complete")return!1;return compareTaskWorkflowStateRank(recoveredState,view)>0}var STAGE_A_RECOVERED_STATES;var init_session_view=__esm(()=>{init_gate_evidence();init_state();STAGE_A_RECOVERED_STATES=["pre_check_passed","reviewer_run","tests_run"]});import*as fs79 from"node:fs";import*as path124 from"node:path";async function recordRunMemoryOutcome(directory,input){try{await _internals117.recordTaskAttempt(directory,input)}catch(_error){}}function syncCallerWorkflowFromEvidence(sessionId,taskId,evidence2){if(!sessionId)return;let callerSession=ensureAgentSession(sessionId),workflow=getTaskWorkflowSnapshot(evidence2);applySessionWorkflowView(callerSession,taskId,workflow)}async function hasPreparedWorkflowWal(directory,taskId,kind){return await readPreparedWorkflowWal(directory,taskId,kind)!==null}async function readPreparedWorkflowWal(directory,taskId,kind){let walPath2=validateSwarmPath(directory,kind==="task-repair"?`task-repairs/${taskId}.json`:`task-terminals/${taskId}.json`),wal=await readWorkflowWalFile(kind,walPath2,taskId);return wal?.state==="PREPARED"?wal:null}function resolveRunMemoryFileTargets(plan,taskId){return plan?.phases.flatMap((phase)=>phase.tasks).find((candidate)=>candidate.id===taskId)?.files_touched??[]}function validateStatus(status2){if(!VALID_STATUSES.includes(status2))return`Invalid status "${status2}". Must be one of: ${VALID_STATUSES.join(", ")}`;return}function validateTaskId(taskId){if(validateTaskIdFormat(taskId))return`Invalid task_id "${taskId}". Must match pattern N.M or N.M.P (e.g., "1.1", "1.2.3")`;return}function getSettledTransitionRejection(taskId,currentStatus,nextStatus,force){if(currentStatus!=="pending"&&currentStatus!=="in_progress"&&nextStatus!==currentStatus){if(nextStatus!=="in_progress"||force!==!0)return{success:!1,message:`Task ${taskId} is settled (${currentStatus}); backward transitions require the audited in_progress repair path.`,errors:[`Task ${taskId} is settled (${currentStatus}); use force:true with exact CAS and audit fields to repair it to in_progress.`]}}return null}function isRepairRetryShape(args2){return args2.status==="in_progress"&&args2.force===!0&&typeof args2.transition_id==="string"}function reviewerGateDecision(taskId,sessionID,result,reasonCode,evidenceKind){try{_internals117.emitReviewerGateDecision(sessionID??"",taskId,result.blocked,reasonCode,evidenceKind)}catch(_error){}return result}function hasPassedDurableGateEvidence(workingDirectory,taskId){let evidence2=readTaskEvidenceRaw(workingDirectory,taskId);if(!evidence2||!Array.isArray(evidence2.required_gates)||evidence2.required_gates.length===0)return!1;return evidence2.required_gates.every((gate)=>evidence2.gates?.[gate]!=null)}function routeGateAllowsTask(directory,taskId,sessionID){if(!directory)return!0;if(!(()=>{try{return loadPluginConfig(directory).review_routing?.enforce_receipts??!0}catch{return!0}})())return!0;let requirementReceipts=(()=>{try{return readTaskGateRequirementsReceiptsSync(directory,taskId)}catch{return null}})();if(!requirementReceipts)return!1;let session=sessionID?swarmState.agentSessions.get(sessionID):void 0,routeRequired=sessionID?session?isStageBRouteRequired(session,taskId):!1:[...swarmState.agentSessions.values()].some((candidate)=>isStageBRouteRequired(candidate,taskId)),legacyUnrouted=isLegacyTaskGateRequirementsChain(requirementReceipts)&&!routeRequired;if(!routeRequired&&requirementReceipts.length===0)return!0;let durableEvidence=routeEvidenceFromTaskGateRequirements(requirementReceipts),routeAllowsSession=(candidateSessionID,candidateSession)=>{try{readReviewRouteReceiptSync({projectRoot:directory,sessionId:candidateSessionID,taskId})}catch{return!1}let liveEvidence=candidateSession?getStageBRouteEvidence(candidateSession,taskId):[];return enforcePersistedReviewRouteReceipt({projectRoot:directory,sessionId:candidateSessionID,taskId,receipts:liveEvidence.length>0?liveEvidence:durableEvidence,enforcementEnabled:!0,legacyUnrouted:!1,requireEvidenceBindings:!0}).canAdvance};if(sessionID)return routeAllowsSession(sessionID,session);if(!routeRequired)return legacyUnrouted;let evidenceSessionIDs=new Set(durableEvidence.map((evidence2)=>evidence2.sessionId).filter((value)=>Boolean(value)));for(let[candidateSessionID,candidateSession]of swarmState.agentSessions){if(!isStageBRouteRequired(candidateSession,taskId)&&!evidenceSessionIDs.has(candidateSessionID))continue;if(routeAllowsSession(candidateSessionID,candidateSession))return!0}return!1}function checkReviewerGate(taskId,workingDirectory,stageBParallelEnabled=!1,sessionID,fallbackDir,currentDeclaredFiles){try{let skipStandardTurboBypass=!1;if(!fallbackDir&&!sessionID&&_internals117.hasActiveLeanTurbo(sessionID)){let resolvedDir2=workingDirectory;try{let leanCheck=_internals117.verifyLeanTurboTaskCompletion(resolvedDir2,taskId,sessionID);if(leanCheck.ok)return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:`Lean Turbo bypass: ${leanCheck.reason}`},"lean_turbo_completed_lane","fallback");if(leanCheck.laneFound!==!1)skipStandardTurboBypass=!0}catch{skipStandardTurboBypass=!0}}if(!fallbackDir&&!sessionID&&!skipStandardTurboBypass&&_internals117.hasActiveTurboMode(sessionID)){let resolvedDir2=workingDirectory;try{let planPath=path124.join(resolvedDir2,".swarm","plan.json"),planRaw=fs79.readFileSync(planPath,"utf-8"),plan=JSON.parse(planRaw);for(let planPhase of plan.phases??[])for(let task of planPhase.tasks??[])if(task.id===taskId&&Array.isArray(task.files_touched)&&task.files_touched.length>0){if(!matchesTier3(task.files_touched))return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:"Turbo Mode bypass"},"standard_turbo_non_tier3","fallback");break}}catch{}}let authoritativeDir;if(fallbackDir){let resolved=_internals117.resolveWorkingDirectory(workingDirectory,fallbackDir);authoritativeDir=resolved.success?resolved.directory:fallbackDir}else if(workingDirectory)authoritativeDir=workingDirectory;if(authoritativeDir){let legacyDirectCaller=Symbol("legacy-direct-reviewer-gate");try{let evidence2=_internals117.readTaskEvidenceRaw(authoritativeDir,taskId);if(!fallbackDir&&!sessionID&&!evidence2?.workflow)throw legacyDirectCaller;try{let planPath=path124.join(authoritativeDir,".swarm","plan.json"),planRaw=fs79.readFileSync(planPath,"utf-8"),plan=JSON.parse(planRaw),declaredTask=(plan.phases??[]).flatMap((phase)=>phase.tasks??[]).find((task)=>task.id===taskId);if(declaredTask&&declaredTask.evidence_class==="external_git"&&typeof plan.title==="string"&&typeof plan.swarm==="string"){let planIdentity={title:plan.title,swarm:plan.swarm},workflow2=getTaskWorkflowSnapshot(evidence2);if(isExternalEvidenceInitialCompletionEligible(planIdentity,declaredTask,evidence2)||workflow2.state==="complete"&&externalProofCurrent(planIdentity,declaredTask,evidence2))return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:`External evidence attested: task ${taskId} completed via the pinned external_git anchors (issue #3422)`,requiredGates:[],satisfiedGates:[],missingGates:[],source:"external_attest",generation:workflow2.generation},"durable_evidence_complete","fallback");return reviewerGateDecision(taskId,sessionID,{blocked:!0,reason:`Task ${taskId} declares external_git evidence but no matched attestation exists yet. Run /swarm attest ${taskId} (or re-plan it as a thin coder dispatch).`,requiredGates:[],satisfiedGates:[],missingGates:["external_attest"],source:"durable_exact_task",generation:workflow2.generation,nextAction:`Run /swarm attest ${taskId} (or re-plan it as a thin coder dispatch).`},"required_gates_missing","block")}}catch{}if(!evidence2)return reviewerGateDecision(taskId,sessionID,{blocked:!0,reason:`Task ${taskId} has no exact-task QA evidence. Delegate the required Stage B agents, then retry completion.`,requiredGates:[],satisfiedGates:[],missingGates:["reviewer","test_engineer"],source:"durable_exact_task",generation:0,nextAction:"Delegate reviewer and test_engineer for this exact task generation."},"required_gates_missing","block");if(!evidence2.workflow){let derivedGates2=deriveApplicableGateSet(evidence2);return reviewerGateDecision(taskId,sessionID,{blocked:!0,reason:`Task ${taskId} has legacy QA evidence without an authoritative workflow generation. Run a fresh exact-task workflow transition before completion.`,requiredGates:derivedGates2.requiredGates,satisfiedGates:derivedGates2.satisfiedGates,missingGates:derivedGates2.missingGates,source:"durable_exact_task",generation:0,nextAction:"Re-run the exact-task coder/Stage A/Stage B workflow to migrate evidence."},"required_gates_missing","block")}let workflow=getTaskWorkflowSnapshot(evidence2),derivedGates=deriveApplicableGateSet(evidence2,{currentDeclaredFiles:currentDeclaredFiles===void 0?readCurrentTaskDeclaredFiles(authoritativeDir,taskId):currentDeclaredFiles}),requiredGates=derivedGates.requiredGates,satisfiedGates=derivedGates.satisfiedGates,missingGates=derivedGates.missingGates;if(requiredGates.includes(TASK_GATE_REQUIREMENTS_RECONSTRUCTION_SENTINEL)){let recovery=`Task ${taskId} contains a legacy receipt-less gate-repair marker that no agent can satisfy. Call repair_gate_evidence for task ${taskId}, then delegate coder for a fresh accepted mutation before rerunning Stage A and Stage B.`;return reviewerGateDecision(taskId,sessionID,{blocked:!0,reason:recovery,requiredGates,satisfiedGates,missingGates,source:"durable_exact_task",generation:workflow.generation,nextAction:recovery},"required_gates_missing","data_quality")}let contradictorySignals=[];if((workflow.state==="tests_run"||workflow.state==="complete")&&missingGates.length>0)contradictorySignals.push(`workflow state ${workflow.state} claims completion readiness while required proof is missing`);if(workflow.state!=="tests_run"&&workflow.state!=="complete"&&evidence2.gates.pre_check!=null&&requiredGates.length>0&&missingGates.length===0)contradictorySignals.push(`all required proof exists but workflow state is ${workflow.state}`);let currentPlanIdentity=resolveCurrentPlanIdentitySync(authoritativeDir),priorCampaignEvidence=evidenceStampedForDifferentPlan(evidence2,currentPlanIdentity?.planIdentityHash),workflowComplete=workflow.state==="tests_run"||workflow.state==="complete";if(missingGates.length===0&&contradictorySignals.length===0&&(workflowComplete||derivedGates.readOnlyNoMutation)){if(!derivedGates.readOnlyNoMutation&&!routeGateAllowsTask(authoritativeDir,taskId,sessionID))return reviewerGateDecision(taskId,sessionID,{blocked:!0,reason:priorCampaignEvidence?`Task ${taskId}'s exact-task evidence predates the current plan campaign (plan-identity stamp names a different plan). Run repair_gate_evidence for task ${taskId} to rebuild current-campaign evidence, then re-run the QA chain.`:`Task ${taskId} has not satisfied its exact v1 review route receipt. Missing or mismatched route evidence fails closed.`,requiredGates,satisfiedGates,missingGates:["review_route_receipt"],source:"durable_exact_task",generation:workflow.generation,nextAction:priorCampaignEvidence?"Run repair_gate_evidence for this task to rebuild current-campaign evidence, then re-run Stage A and Stage B.":"Recover the exact route receipt and independent Stage-B bindings before completing this task."},"required_gates_missing","block");return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:"",requiredGates,satisfiedGates,missingGates,contradictorySignals,source:"durable_exact_task",generation:workflow.generation},"durable_evidence_complete","genuine")}return reviewerGateDecision(taskId,sessionID,{blocked:!0,reason:`Task ${taskId} generation ${workflow.generation} has not passed exact-task QA. State: ${workflow.state}. Missing gates: [${missingGates.join(", ")}]. Contradictions: [${contradictorySignals.join("; ")}].`,requiredGates,satisfiedGates,missingGates,contradictorySignals,source:"durable_exact_task",generation:workflow.generation,nextAction:workflow.state==="rework_required"?"Delegate the same task to coder for repair, then rerun Stage A and Stage B.":"Complete the missing exact-task Stage A/Stage B transitions."},"required_gates_missing","block")}catch(error93){if(error93===legacyDirectCaller);else return reviewerGateDecision(taskId,sessionID,{blocked:!0,reason:`Evidence file for task ${taskId} is corrupt or unreadable: ${error93 instanceof Error?error93.message:String(error93)}. Call repair_gate_evidence for task ${taskId}; corrupt evidence fails closed until the repair completes.`,requiredGates:[],satisfiedGates:[],missingGates:["reviewer","test_engineer"],source:"durable_exact_task",corrupt:!0,nextAction:`Call repair_gate_evidence for task ${taskId}; corrupt evidence fails closed until the repair completes.`},"corrupt_evidence","data_quality")}}let resolvedDir;if(fallbackDir){let resolveResult=_internals117.resolveWorkingDirectory(workingDirectory,fallbackDir);if(resolveResult.success)resolvedDir=resolveResult.directory;else resolvedDir=fallbackDir}else if(workingDirectory)resolvedDir=workingDirectory;let routeAllowsStageB=(sessionId,_session)=>routeGateAllowsTask(resolvedDir,taskId,sessionId),evidenceIncompleteReason=null;try{if(!resolvedDir);else{let evidence2=_internals117.readTaskEvidenceRaw(resolvedDir,taskId);if(evidence2===null);else if(evidence2.required_gates&&Array.isArray(evidence2.required_gates)&&evidence2.gates){if(evidence2.required_gates.length>0&&evidence2.required_gates.every((gate)=>evidence2.gates[gate]!=null)){let routeSession=sessionID?swarmState.agentSessions.get(sessionID):void 0;if(!resolvedDir||routeAllowsStageB(sessionID,routeSession))return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:""},"durable_evidence_complete","genuine")}let missingGates=evidence2.required_gates.filter((gate)=>evidence2.gates[gate]==null);evidenceIncompleteReason=evidence2.required_gates.length===0?`Task ${taskId} has an evidence file with no required gates. Delegate reviewer and test_engineer before marking task as completed.`:`Task ${taskId} is missing required gates: [${missingGates.join(", ")}]. Required: [${evidence2.required_gates.join(", ")}]. Completed: [${Object.keys(evidence2.gates).join(", ")}]. Delegate the missing gate agents before marking task as completed.`}}}catch(error93){return log(`[gate-evidence] Evidence file for task ${taskId} is corrupt or unreadable:`,error93 instanceof Error?error93.message:String(error93)),telemetry.gateFailed("","qa_gate",taskId,"Evidence file corrupt or unreadable"),reviewerGateDecision(taskId,sessionID,{blocked:!0,reason:`Evidence file for task ${taskId} is corrupt or unreadable. Call repair_gate_evidence for task ${taskId}; corrupt evidence fails closed until the repair completes.`},"corrupt_evidence","data_quality")}if(swarmState.agentSessions.size===0&&!evidenceIncompleteReason)return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:""},"no_active_sessions","fallback");let validSessionCount=0;for(let[_sessionId,session]of swarmState.agentSessions){if(!(session.taskWorkflowStates instanceof Map))continue;validSessionCount++;let state2=getTaskState(session,taskId);if(state2==="tests_run"||state2==="complete"){if(resolvedDir&&!routeAllowsStageB(_sessionId,session))continue;return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:""},"workflow_state_complete","genuine")}if(stageBParallelEnabled&&hasBothStageBCompletions(session,taskId)&&(!resolvedDir||routeAllowsStageB(_sessionId,session)))return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:""},"stage_b_parallel_complete","genuine")}if(validSessionCount===0&&!evidenceIncompleteReason)return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:""},"zero_valid_sessions","data_quality");let stateEntries=[];for(let[sessionId,session]of swarmState.agentSessions){if(!(session.taskWorkflowStates instanceof Map))continue;let state2=getTaskState(session,taskId);stateEntries.push(`${sessionId}: ${state2}`)}if(resolvedDir)try{let planPath=path124.join(resolvedDir,".swarm","plan.json"),planRaw=fs79.readFileSync(planPath,"utf-8"),plan=JSON.parse(planRaw);for(let planPhase of plan.phases??[])for(let task of planPhase.tasks??[])if(task.id===taskId&&task.status==="completed"&&_internals117.hasPassedDurableGateEvidence(resolvedDir,taskId))return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:""},"restart_recovery_complete","genuine")}catch{}{let hasReviewer=!1,hasTestEngineer=!1;for(let[sessionId,chain]of swarmState.delegationChains){let session=swarmState.agentSessions.get(sessionId);if(session&&(session.currentTaskId===taskId||session.lastCoderDelegationTaskId===taskId))for(let delegation of chain){let target=stripKnownSwarmPrefix(delegation.to);if(target==="reviewer")hasReviewer=!0;if(target==="test_engineer")hasTestEngineer=!0}}if(hasReviewer&&hasTestEngineer)return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:""},"scoped_delegation_complete","genuine");if(!evidenceIncompleteReason&&(!hasReviewer||!hasTestEngineer)){for(let[sessionId,chain]of swarmState.delegationChains){if(chain.some((d)=>stripKnownSwarmPrefix(d.to)==="coder"))continue;let chainSession=swarmState.agentSessions.get(sessionId);if(chainSession){let chainTaskId=chainSession.currentTaskId||chainSession.lastCoderDelegationTaskId;if(chainTaskId&&chainTaskId!==taskId)continue}for(let delegation of chain){let target=stripKnownSwarmPrefix(delegation.to);if(target==="reviewer")hasReviewer=!0;if(target==="test_engineer")hasTestEngineer=!0}}if(hasReviewer&&hasTestEngineer)return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:""},"unscoped_delegation_complete","genuine")}}let currentStateStr=stateEntries.length>0?stateEntries.join(", "):"no active sessions",chainEntries=[];for(let[sessionId,chain]of swarmState.delegationChains){let session=swarmState.agentSessions.get(sessionId);if(session&&(session.currentTaskId===taskId||session.lastCoderDelegationTaskId===taskId)){let targets=chain.map((d)=>stripKnownSwarmPrefix(d.to));chainEntries.push(`${sessionId}: [${targets.join(", ")}]`)}}let chainSummary=chainEntries.length>0?chainEntries.join("; "):"no chains for this task",rehydratedSessionCount=[...swarmState.agentSessions.values()].filter((s)=>s.sessionRehydratedAt>0).length,finalReason=[`Task ${taskId} has not passed QA gates.`,` Session states: [${currentStateStr}].`,` Delegation chains: [${chainSummary}].`,` Evidence: [${evidenceIncompleteReason??"no evidence file found"}].`,` Rehydrated sessions: ${rehydratedSessionCount}.`," Missing required state: tests_run or complete."].join(`
1367
1367
  `);return telemetry.gateFailed("","qa_gate",taskId,evidenceIncompleteReason?"Missing gates: evidence incomplete":"Missing state: tests_run or complete"),reviewerGateDecision(taskId,sessionID,{blocked:!0,reason:finalReason},"required_gates_missing","block")}catch{return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:""},"inspection_error","fallback")}}function hasForeignAttributionRecord(taskId,checkingSessionId){try{let checkerProject=swarmState.agentSessions.get(checkingSessionId)?.owningProjectKey??null;for(let[sessionId,session]of swarmState.agentSessions){if(sessionId===checkingSessionId)continue;if(!(session.modifiedFilesByTask instanceof Map))continue;if((session.owningProjectKey??null)!==checkerProject)continue;let entry=session.modifiedFilesByTask.get(taskId);if(Array.isArray(entry)&&entry.length>0)return!0}return!1}catch{return!1}}async function checkReviewerGateWithScope(taskId,workingDirectory,sessionID,fallbackDir){let result=checkReviewerGate(taskId,workingDirectory,!0,sessionID,fallbackDir),session=sessionID?getAgentSession(sessionID):void 0,attributedFiles=session?getModifiedFilesForTask(session,taskId):[],scopeAdvisoryLine=!!sessionID&&!hasModifiedFilesForTask(session,taskId)&&!!workingDirectory&&hasDeclaredDiffScope(taskId,workingDirectory)?hasForeignAttributionRecord(taskId,sessionID)?`SCOPE ADVISORY: attribution record for task ${taskId} exists under another session — not used for scope verification`:"SCOPE ADVISORY: no attribution record in this session — not used for scope verification":null,scopeWarning=await validateDiffScope(taskId,workingDirectory,sessionID&&attributedFiles.length>0?{attributedFiles}:void 0).catch(()=>null);if(!scopeWarning&&!scopeAdvisoryLine)return result;return{...result,reason:[result.reason,scopeWarning,scopeAdvisoryLine].filter((part)=>typeof part==="string"&&part.length>0).join(`
1368
1368
  `)}}function recoverTaskStateFromDelegations(taskId,directory){let hasReviewer=!1,hasTestEngineer=!1;for(let[sessionId,chain]of swarmState.delegationChains){let session=swarmState.agentSessions.get(sessionId);if(session&&(session.currentTaskId===taskId||session.lastCoderDelegationTaskId===taskId))for(let delegation of chain){let target=stripKnownSwarmPrefix(delegation.to);if(target==="reviewer")hasReviewer=!0;if(target==="test_engineer")hasTestEngineer=!0}}let hasDurableIncompleteGates=!1;if(directory)try{let taskEvidence=readTaskEvidenceRaw(directory,taskId);if(taskEvidence?.gates&&Array.isArray(taskEvidence.required_gates)&&taskEvidence.required_gates.length>0){let gates=taskEvidence.gates;hasDurableIncompleteGates=taskEvidence.required_gates.some((g)=>gates[g]==null)}}catch{hasDurableIncompleteGates=!0}if(!hasDurableIncompleteGates&&(!hasReviewer||!hasTestEngineer))for(let[sessionId,chain]of swarmState.delegationChains){if(chain.some((d)=>stripKnownSwarmPrefix(d.to)==="coder"))continue;let chainSession=swarmState.agentSessions.get(sessionId);if(chainSession){let chainTaskId=chainSession.currentTaskId||chainSession.lastCoderDelegationTaskId;if(chainTaskId&&chainTaskId!==taskId)continue}for(let delegation of chain){let target=stripKnownSwarmPrefix(delegation.to);if(target==="reviewer")hasReviewer=!0;if(target==="test_engineer")hasTestEngineer=!0}}if((!hasReviewer||!hasTestEngineer)&&directory)try{let evidence2=readTaskEvidenceRaw(directory,taskId);if(evidence2?.gates&&Array.isArray(evidence2.required_gates)){if(evidence2.gates.reviewer!=null)hasReviewer=!0;if(evidence2.gates.test_engineer!=null)hasTestEngineer=!0}}catch{}if(!hasReviewer&&!hasTestEngineer)return;if(swarmState.agentSessions.size===0)try{startAgentSession("recovery-session","architect")}catch{}let recoveryRouteEnforcementEnabled=directory?(()=>{try{return loadPluginConfig(directory).review_routing?.enforce_receipts??!0}catch{return!0}})():!1;for(let[sessionId,session]of swarmState.agentSessions){if(!(session.taskWorkflowStates instanceof Map))continue;let routeEvidence=(()=>{let live=getStageBRouteEvidence(session,taskId);if(live.length>0)return live;try{return routeEvidenceFromTaskGateRequirements(readTaskGateRequirementsReceiptsSync(directory,taskId))}catch{return[]}})(),routeRequired=isStageBRouteRequired(session,taskId)||routeEvidence.length>0;if(directory&&recoveryRouteEnforcementEnabled&&routeRequired&&!enforcePersistedReviewRouteReceipt({projectRoot:directory,sessionId,taskId,receipts:routeEvidence,enforcementEnabled:!0,legacyUnrouted:(()=>{try{return!isStageBRouteRequired(session,taskId)&&isLegacyTaskGateRequirementsChain(readTaskGateRequirementsReceiptsSync(directory,taskId))}catch{return!1}})(),requireEvidenceBindings:!0}).canAdvance)continue;let currentState=getTaskState(session,taskId);if(currentState==="tests_run"||currentState==="complete")continue;if(hasReviewer&&currentState==="idle")try{advanceTaskState(session,taskId,"coder_delegated")}catch{}if(hasReviewer)recordStageBCompletion(session,taskId,"reviewer");if(hasTestEngineer)recordStageBCompletion(session,taskId,"test_engineer");if(hasReviewer){let stateNow=getTaskState(session,taskId);if(stateNow==="coder_delegated"||stateNow==="pre_check_passed")try{advanceTaskState(session,taskId,"reviewer_run")}catch{}}if(hasTestEngineer){if(getTaskState(session,taskId)==="reviewer_run")try{advanceTaskState(session,taskId,"tests_run")}catch{}}}}function checkCouncilGate(workingDirectory,taskId){let councilEnabled=!1,effectiveMinimum=3;try{let config3=loadPluginConfig(workingDirectory);councilEnabled=config3.council?.enabled===!0,effectiveMinimum=config3.council?.requireAllMembers?5:config3.council?.minimumMembers??3}catch{return{blocked:!1,reason:"",active:!1}}if(!councilEnabled)return{blocked:!1,reason:"",active:!1};try{let planPath=path124.join(workingDirectory,".swarm","plan.json"),planRaw=fs79.readFileSync(planPath,"utf-8"),planObj=JSON.parse(planRaw);if(planObj.swarm&&planObj.title){let lookup=getProfileLookupForIdentity(workingDirectory,planObj);if(lookup.kind==="bound"){if(!lookup.profile.gates.council_mode)return{blocked:!1,reason:"",active:!1}}else if(lookup.kind==="unbound_legacy"){if(lookup.profile.gates.council_mode)return{blocked:!0,reason:`council gate required but the QA gate profile is not exact-bound to the current raw swarm_id/plan_title. ${formatLegacyQaBindingRecovery({swarm:planObj.swarm,title:planObj.title},"retry advancing this task")}`,active:!0};return{blocked:!1,reason:"",active:!1}}else return{blocked:!1,reason:"",active:!1}}}catch{return{blocked:!1,reason:"",active:!1}}let evidence2;try{evidence2=readTaskEvidenceRaw(workingDirectory,taskId)}catch{return{blocked:!0,reason:"council gate required but not yet run — architect must call submit_council_verdicts before advancing this task",active:!0}}let councilGate=evidence2?.gates?.council;if(!councilGate)return{blocked:!0,reason:"council gate required but not yet run — architect must call submit_council_verdicts before advancing this task",active:!0};let councilWorkflow=getTaskWorkflowSnapshot(evidence2);if(!councilWorkflow.authoritative||councilWorkflow.state!=="pre_check_passed"||councilGate.workflowGeneration!==councilWorkflow.generation)return{blocked:!0,reason:`council gate evidence is stale or unbound: expected pre_check_passed@${councilWorkflow.generation}, recorded generation ${String(councilGate.workflowGeneration)}`,active:!0};if(councilGate.verdict==="REJECT")return{blocked:!0,reason:"council gate blocked advancement — resolve requiredFixes and re-run submit_council_verdicts",active:!0};let rawQuorumSize=councilGate.quorumSize,quorumSize=typeof rawQuorumSize==="number"&&Number.isFinite(rawQuorumSize)&&rawQuorumSize>=1?rawQuorumSize:1;if(quorumSize<effectiveMinimum)return{blocked:!0,reason:`council gate blocked advancement — recorded verdict has insufficient quorum (${quorumSize} of ${effectiveMinimum} required members). Re-run submit_council_verdicts with the missing council members.`,active:!0};return{blocked:!1,reason:"",active:!0}}async function executeUpdateTaskStatus(args2,fallbackDir,ctx){let statusError=validateStatus(args2.status);if(statusError)return{success:!1,message:"Validation failed",errors:[statusError]};let taskIdError=validateTaskId(args2.task_id);if(taskIdError)return{success:!1,message:"Validation failed",errors:[taskIdError]};let directory,resolveResult=_internals117.resolveWorkingDirectory(args2.working_directory,fallbackDir);if(!resolveResult.success)return{success:!1,message:resolveResult.message,errors:[resolveResult.message]};directory=resolveResult.directory;try{assertProjectRoot(directory)}catch(error93){let message=error93 instanceof Error?error93.message:String(error93);return{success:!1,message,errors:[message]}}let planPath=path124.join(directory,".swarm","plan.json");if(!fs79.existsSync(planPath))return{success:!1,message:`Invalid working_directory: plan not found in "${directory}"`,errors:[`Invalid working_directory: plan not found in "${directory}"`]};if(fallbackDir&&directory!==fallbackDir){let canonicalDir=fs79.realpathSync(path124.resolve(directory)),canonicalRoot=fs79.realpathSync(path124.resolve(fallbackDir));if(isStrictPathDescendant(canonicalDir,canonicalRoot)&&!hasExplicitProjectBoundary(canonicalDir))return{success:!1,message:`Invalid working_directory: "${directory}" is a subdirectory of the project root "${fallbackDir}". Pass the project root path or omit working_directory entirely.`,errors:[`Subdirectory rejected: use project root "${fallbackDir}" instead`]}}let exactRepairRetry=!1;if(isRepairRetryShape(args2))try{let repairWal=await readWorkflowWalFile("task-repair",validateSwarmPath(directory,`task-repairs/${args2.task_id}.json`),args2.task_id);exactRepairRetry=repairWal?.state==="PREPARED"&&repairWal.transitionId===args2.transition_id}catch(error93){return{success:!1,message:"Task operation paused while recovering an interrupted task repair",errors:[error93 instanceof Error?error93.message:String(error93)]}}try{let recoveredCoder=await recoverCoderSettlement(directory,args2.task_id);if(recoveredCoder&&ctx?.sessionID){let callerSession=ensureAgentSession(ctx.sessionID),workflow=getTaskWorkflowSnapshot(recoveredCoder.evidence);callerSession.taskWorkflowStates.set(args2.task_id,workflow.state),callerSession.stageBCompletion?.delete(args2.task_id),updateTaskWorkflowCache(callerSession,args2.task_id,workflow)}}catch(error93){return{success:!1,message:"Task operation paused while recovering an interrupted coder settlement",errors:[error93 instanceof Error?error93.message:String(error93)]}}try{let recoveredTerminal=await recoverPreparedTaskTerminal(directory,args2.task_id,ctx?.sessionID??"update-task-status");if(recoveredTerminal)syncCallerWorkflowFromEvidence(ctx?.sessionID,args2.task_id,recoveredTerminal.evidence)}catch(error93){return{success:!1,message:"Task operation paused while recovering an interrupted terminal status transition",errors:[error93 instanceof Error?error93.message:String(error93)]}}if(!exactRepairRetry)try{if(await recoverPreparedTaskRepair(directory,args2.task_id,ctx?.sessionID??"update-task-status"))syncCallerWorkflowFromEvidence(ctx?.sessionID,args2.task_id,readTaskEvidenceRaw(directory,args2.task_id))}catch(error93){if(error93 instanceof Error&&error93.message.startsWith("TASK_REPAIR_AUDIT_LOCKED"))criticalWarn(`[update-task-status] task-repair audit recovery deferred for ${args2.task_id}: ${error93.message}`);else return{success:!1,message:"Task operation paused while recovering an interrupted task repair",errors:[error93 instanceof Error?error93.message:String(error93)]}}let loadedPlan=null;try{loadedPlan=await _internals117.loadPlan(directory)}catch(error93){return{success:!1,message:"Failed to load plan for task validation",errors:[error93 instanceof Error?error93.message:String(error93)]}}if(!loadedPlan)return{success:!1,message:"Failed to load plan for task validation",errors:["Plan could not be loaded"]};if(loadedPlan._ledgerReplayStale===!0){let staleReason=loadedPlan._ledgerReplayStaleReason??"plan.json is stale relative to the active plan-ledger authority";return{success:!1,message:`Task status update refused: plan.json is stale relative to the ledger (ledger replay failed). ${staleReason}`,errors:[staleReason],recovery_guidance:"Plan state could not be reconciled with the active plan-ledger authority. Retry save_plan with the unchanged loaded plan so it can reconverge the projections and authority metadata, then retry update_task_status."}}let currentTask=loadedPlan.phases.flatMap((phase)=>phase.tasks).find((task)=>task.id===args2.task_id);if(!currentTask)return{success:!1,message:"Failed to update task status",errors:[`Task not found: ${args2.task_id}`]};{let settledRejection=getSettledTransitionRejection(args2.task_id,currentTask.status,args2.status,args2.force);if(settledRejection)return settledRejection}if(args2.status==="in_progress"&&args2.force===!0){if(!(typeof args2.expected_state==="string"&&args2.expected_state.length>0&&Number.isInteger(args2.expected_generation)&&(args2.expected_generation??-1)>=0&&args2.target_state==="idle"&&typeof args2.reason==="string"&&args2.reason.trim().length>0&&args2.reason.length<=2000&&typeof args2.transition_id==="string"&&args2.transition_id.trim().length>0&&args2.transition_id.length<=200))return{success:!1,message:"TASK_REPAIR_INVALID: force repair requires an exact CAS and audit identity",errors:['Provide expected_state, expected_generation, target_state="idle", a non-empty reason (max 2000 chars), and a non-empty transition_id (max 200 chars).']};log(`[update-task-status] Force-override: attempting audited repair for task ${args2.task_id} (settled task, or in_progress at the retry-escalation rung per issue #3389; admission is verified under the plan lock) to in_progress`)}let agentName=(ctx?.sessionID?swarmState.activeAgent.get(ctx.sessionID):void 0)??"update-task-status",scopeAdvisories;if(args2.status==="completed"){if(!fallbackDir&&!ctx?.sessionID)recoverTaskStateFromDelegations(args2.task_id,directory);let phaseRequiresReviewer=!0,taskDeclaresExternalEvidence=!1;try{let planPath2=path124.join(directory,".swarm","plan.json"),planRaw=fs79.readFileSync(planPath2,"utf-8"),taskPhase=JSON.parse(planRaw).phases.find((p)=>p.tasks.some((t)=>t.id===args2.task_id));if(taskPhase?.required_agents&&!taskPhase.required_agents.includes("reviewer"))phaseRequiresReviewer=!1;taskDeclaresExternalEvidence=taskPhase?.tasks.find((t)=>t.id===args2.task_id)?.evidence_class==="external_git"}catch{}let councilCheck=taskDeclaresExternalEvidence?{blocked:!1,active:!1}:checkCouncilGate(directory,args2.task_id);if(councilCheck.blocked)return await recordRunMemoryOutcome(directory,{taskId:args2.task_id,agent:agentName,outcome:"fail",failureReason:`council gate: ${councilCheck.reason}`,fileTargets:resolveRunMemoryFileTargets(loadedPlan,args2.task_id)}),{success:!1,message:"Gate check failed: council gate not yet satisfied for task "+args2.task_id,errors:[councilCheck.reason]};if(phaseRequiresReviewer&&!councilCheck.active&&!taskDeclaresExternalEvidence){let reviewerCheck=await checkReviewerGateWithScope(args2.task_id,directory,ctx?.sessionID,ctx?.sessionID?fallbackDir:void 0);if(reviewerCheck.reason){let advisoryLines=reviewerCheck.reason.split(`
1369
1369
  `).filter((line)=>line.length>0);if(advisoryLines.length>0)scopeAdvisories=advisoryLines}if(reviewerCheck.blocked)return await recordRunMemoryOutcome(directory,{taskId:args2.task_id,agent:agentName,outcome:"fail",failureReason:`QA gate: ${reviewerCheck.reason}`,fileTargets:resolveRunMemoryFileTargets(loadedPlan,args2.task_id)}),{success:!1,message:"Gate check failed: required QA gates not yet satisfied for task "+args2.task_id,errors:[reviewerCheck.reason]}}}let lockTaskId=`update-task-status-${args2.task_id}-${Date.now()}`,planFilePath="plan.json",lockResult;try{lockResult=await _internals117.tryAcquireLock(directory,planFilePath,agentName,lockTaskId)}catch(error93){return{success:!1,message:"Failed to acquire lock for task status update",errors:[error93 instanceof Error?error93.message:String(error93)]}}if(!lockResult.acquired)return{success:!1,message:`Task status write blocked: plan.json is locked by ${lockResult.existing?.agent??"another agent"} (task: ${lockResult.existing?.taskId??"unknown"})`,errors:["Concurrent plan write detected — retry after the current write completes"],recovery_guidance:"Wait a moment and retry update_task_status. The lock will expire automatically if the holding agent fails."};try{let lockedPlan=await _internals117.loadPlan(directory);if(lockedPlan?._ledgerReplayStale===!0)return{success:!1,message:"Task status update refused: plan became ledger-stale while waiting for the lock",errors:[lockedPlan._ledgerReplayStaleReason??"plan.json is stale relative to the authoritative ledger"],recovery_guidance:"Retry save_plan with the unchanged loaded plan to reconverge the projection/hash, then retry update_task_status."};if(!lockedPlan)return{success:!1,message:"Failed to update task status",errors:["No approved plan is available under the plan lock"]};let authoritativePlan=lockedPlan,lockedPreparedRepairWal=await readPreparedWorkflowWal(directory,args2.task_id,"task-repair"),lockedExactRepairRetry=isRepairRetryShape(args2)&&lockedPreparedRepairWal?.transitionId===args2.transition_id;if(lockedPreparedRepairWal&&!lockedExactRepairRetry)try{let recoveredRepair=await recoverPreparedTaskRepairUnderPlanLock(directory,args2.task_id,ctx?.sessionID??"update-task-status",authoritativePlan);if(recoveredRepair)authoritativePlan=recoveredRepair.plan,syncCallerWorkflowFromEvidence(ctx?.sessionID,args2.task_id,readTaskEvidenceRaw(directory,args2.task_id))}catch(error93){if(error93 instanceof Error&&error93.message.startsWith("TASK_REPAIR_AUDIT_LOCKED"))criticalWarn(`[update-task-status] task-repair audit recovery deferred for ${args2.task_id}: ${error93.message}`);else return{success:!1,message:"Task operation paused while recovering an interrupted task repair",errors:[error93 instanceof Error?error93.message:String(error93)]}}if(await hasPreparedWorkflowWal(directory,args2.task_id,"task-terminal"))try{let recoveredTerminal=await recoverPreparedTaskTerminalUnderPlanLock(directory,args2.task_id,ctx?.sessionID??"update-task-status",authoritativePlan);if(recoveredTerminal)authoritativePlan=recoveredTerminal.plan,syncCallerWorkflowFromEvidence(ctx?.sessionID,args2.task_id,recoveredTerminal.evidence)}catch(error93){return{success:!1,message:"Task operation paused while recovering an interrupted terminal status transition",errors:[error93 instanceof Error?error93.message:String(error93)]}}let lockedTask=authoritativePlan.phases.flatMap((phase)=>phase.tasks).find((task)=>task.id===args2.task_id);if(!lockedTask)return{success:!1,message:"Failed to update task status",errors:[`Task not found: ${args2.task_id}`]};let lockedSettledRejection=getSettledTransitionRejection(args2.task_id,lockedTask.status,args2.status,args2.force);if(lockedSettledRejection)return lockedSettledRejection;let repairResult=args2.status==="in_progress"&&args2.force===!0?await repairTaskWorkflowUnderPlanLock({directory,taskId:args2.task_id,actor:agentName,reason:args2.reason,transitionId:args2.transition_id,expectedState:args2.expected_state,expectedGeneration:args2.expected_generation,currentPlanStatus:lockedTask.status,currentPlan:authoritativePlan,updatePlan:()=>_internals117.updateTaskStatus(directory,args2.task_id,"in_progress",{force:!0,planLockAlreadyHeld:!0})}):null,updatedPlan,terminalEvidence=null;if(args2.status==="completed"){let lockedTaskPhase=authoritativePlan.phases.find((phase)=>phase.tasks.some((task)=>task.id===args2.task_id)),lockedPhaseRequiresReviewer=!lockedTaskPhase?.required_agents||lockedTaskPhase.required_agents.includes("reviewer"),lockedTaskDeclaresExternal=lockedTask.evidence_class==="external_git",terminalResult=await commitTaskTerminalUnderPlanLock({directory,taskId:args2.task_id,actor:agentName,transitionId:`plan-status:${args2.task_id}:completed:${Date.now()}`,currentPlanStatus:lockedTask.status,targetStatus:"completed",qaExempt:!lockedPhaseRequiresReviewer&&!lockedTaskDeclaresExternal,resolveTerminal:(evidence2)=>({targetStatus:"completed",qaExempt:!lockedPhaseRequiresReviewer&&!lockedTaskDeclaresExternal,readOnlyNoMutation:!lockedPhaseRequiresReviewer?!1:isReadOnlyNoMutationEligible(evidence2,{currentDeclaredFiles:lockedTask.files_touched}),externalEvidence:lockedTaskDeclaresExternal}),currentPlan:authoritativePlan,validateEvidence:async()=>{if(lockedTaskDeclaresExternal){let externalTaskEvidence=_internals117.readTaskEvidenceRaw(directory,args2.task_id),planIdentity={title:authoritativePlan.title,swarm:authoritativePlan.swarm},externalWorkflow=getTaskWorkflowSnapshot(externalTaskEvidence);if(!isExternalEvidenceInitialCompletionEligible(planIdentity,lockedTask,externalTaskEvidence)&&!(externalWorkflow.state==="complete"&&externalProofCurrent(planIdentity,lockedTask,externalTaskEvidence)))throw Error(`TASK_COMPLETION_CAS_MISMATCH: Task ${args2.task_id} declares external_git evidence but has no current matched attestation; run /swarm attest ${args2.task_id} first`);return}let lockedGate=checkReviewerGate(args2.task_id,directory,!1,ctx?.sessionID,fallbackDir??directory,lockedTask.files_touched??null),lockedCouncil=checkCouncilGate(directory,args2.task_id);if(lockedCouncil.blocked||lockedPhaseRequiresReviewer&&!lockedCouncil.active&&lockedGate.blocked)throw Error(`TASK_COMPLETION_CAS_MISMATCH: ${lockedCouncil.blocked?lockedCouncil.reason:lockedGate.reason}`)},updatePlan:async()=>{let next=await _internals117.updateTaskStatus(directory,args2.task_id,"completed",{force:!1,planLockAlreadyHeld:!0});if(next.phases.flatMap((phase)=>phase.tasks).find((task)=>task.id===args2.task_id)?.status!=="completed")throw Error("TASK_STATUS_WRITE_NOT_APPLIED");return next}});updatedPlan=terminalResult.plan,terminalEvidence=terminalResult.evidence}else if(args2.status==="blocked"){let terminalResult=await commitTaskTerminalUnderPlanLock({directory,taskId:args2.task_id,actor:agentName,transitionId:`plan-status:${args2.task_id}:blocked:${Date.now()}`,currentPlanStatus:lockedTask.status,targetStatus:"blocked",qaExempt:!1,currentPlan:authoritativePlan,updatePlan:async()=>{let next=await _internals117.updateTaskStatus(directory,args2.task_id,"blocked",{force:!1,planLockAlreadyHeld:!0});if(next.phases.flatMap((phase)=>phase.tasks).find((task)=>task.id===args2.task_id)?.status!=="blocked")throw Error("TASK_STATUS_WRITE_NOT_APPLIED");return next}});updatedPlan=terminalResult.plan,terminalEvidence=terminalResult.evidence}else if(updatedPlan=repairResult?.plan??await _internals117.updateTaskStatus(directory,args2.task_id,args2.status,{force:!1,planLockAlreadyHeld:!0}),updatedPlan.phases.flatMap((phase)=>phase.tasks).find((task)=>task.id===args2.task_id)?.status!==args2.status)throw Error("TASK_STATUS_WRITE_NOT_APPLIED");if(terminalEvidence){let terminal=getTaskWorkflowSnapshot(terminalEvidence),callerSession=ctx?.sessionID?swarmState.agentSessions.get(ctx.sessionID):void 0;if(callerSession){let session=callerSession;session.taskWorkflowStates.set(args2.task_id,terminal.state),session.stageBCompletion?.delete(args2.task_id),updateTaskWorkflowCache(session,args2.task_id,terminal)}}if(args2.status==="in_progress"){if(ctx?.sessionID)ensureAgentSession(ctx.sessionID).currentTaskId=args2.task_id;if(repairResult){let callerSession=ctx?.sessionID?swarmState.agentSessions.get(ctx.sessionID):void 0;if(callerSession){let session=callerSession;session.taskWorkflowStates.set(args2.task_id,"idle"),session.stageBCompletion?.delete(args2.task_id),session.taskCouncilApproved?.delete(args2.task_id),session.taskCouncilWorkflowGeneration?.delete(args2.task_id),updateTaskWorkflowCache(session,args2.task_id,{generation:repairResult.generation})}}}return{success:!0,message:"Task status updated successfully",task_id:args2.task_id,new_status:args2.status,current_phase:updatedPlan.current_phase,...scopeAdvisories&&scopeAdvisories.length>0?{warnings:scopeAdvisories}:{}}}catch(error93){return{success:!1,message:"Failed to update task status",errors:[error93 instanceof Error?error93.message:String(error93)]}}finally{if(lockResult?.acquired&&lockResult.lock._release)try{await lockResult.lock._release()}catch(releaseError){log("[update-task-status] Lock release failed:",releaseError)}}}var _internals117,VALID_STATUSES,update_task_status;var init_update_task_status=__esm(()=>{init_zod();init_loader();init_schema();init_qa_gate_profile();init_task_gate_requirements();init_gate_evidence();init_diff_scope();init_utils2();init_file_locks();init_tier3_classifier();init_manager();init_routing_enforcement();init_run_memory();init_state();init_telemetry();init_task_completion();init_logger();init_project_boundary();init_task_id();init_coder_settlement();init_session_view();init_task_repair();init_task_terminal();init_workflow_wal_file();init_create_tool();init_resolve_working_directory();_internals117={tryAcquireLock,updateTaskStatus,resolveWorkingDirectory,loadPlan,readTaskEvidenceRaw,hasActiveLeanTurbo,hasActiveTurboMode,verifyLeanTurboTaskCompletion,hasPassedDurableGateEvidence,emitReviewerGateDecision:telemetry.reviewerGateDecision,recordTaskAttempt};VALID_STATUSES=["pending","in_progress","completed","blocked"];update_task_status=createSwarmTool({description:"Update the status of a specific task in the implementation plan. Task status can be one of: pending, in_progress, completed, blocked.",args:{task_id:exports_external.string().min(1).regex(/^\d+\.\d+(\.\d+)*$/,"Task ID must be in N.M or N.M.P format").describe('Task ID in N.M format, e.g. "1.1", "1.2.3"'),status:exports_external.enum(["pending","in_progress","completed","blocked"]).describe("New status for the task: pending, in_progress, completed, or blocked"),working_directory:exports_external.string().optional().describe("Working directory where the plan is located"),force:exports_external.boolean().optional().default(!1).describe('Enable the audited repair contract: re-open a settled task, or an in_progress task that reached the retry ladder user_escalation rung (issue #3389). Requires expected_state, expected_generation, target_state="idle", reason, and transition_id.'),expected_state:exports_external.string().optional().describe("CAS workflow state expected by a force repair."),expected_generation:exports_external.number().int().min(0).optional().describe("ABA-safe workflow generation expected by a force repair."),target_state:exports_external.literal("idle").optional().describe("Repair target state. The only valid target is idle (re-opens the task for new work)."),reason:exports_external.string().min(1).max(2000).optional().describe("Required human-readable audit reason for a force repair."),transition_id:exports_external.string().min(1).max(200).optional().describe("Caller-generated idempotency key for an audited force repair.")},execute:async(args2,_directory2,_ctx)=>{return JSON.stringify(await executeUpdateTaskStatus(args2,_directory2,_ctx),null,2)}})});var exports_attest_task={};__export(exports_attest_task,{executeAttestTask:()=>executeAttestTask,buildAnchorArgv:()=>buildAnchorArgv,_internals:()=>_internals118});import*as fs80 from"node:fs";import*as path125 from"node:path";function anchorEnv(){let env={PATH:process.env.PATH,HOME:process.env.HOME,LANG:process.env.LANG,LC_ALL:process.env.LC_ALL,GIT_CONFIG_NOSYSTEM:"1"};if(process.platform==="win32")env.SYSTEMROOT=process.env.SYSTEMROOT,env.WINDIR=process.env.WINDIR,env.COMSPEC=process.env.COMSPEC;return{env,envOverrides:{GIT_EXTERNAL_DIFF:null,GIT_CONFIG_PARAMETERS:null,GIT_CONFIG_COUNT:null,GIT_DIR:null,GIT_WORK_TREE:null,GIT_INDEX_FILE:null,GIT_SSH_COMMAND:null,GIT_ASKPASS:null,GIT_EXEC_PATH:null,GIT_PAGER:null}}}function buildAnchorArgv(command){let tokens2=command.trim().split(/\s+/).filter(Boolean);if(tokens2[0]!=="git"||tokens2.length<2)return{argv:null,refusal:`anchor command is not an allowed read-only git invocation: "${command}"`};let subcommand=tokens2[1];if(subcommand.startsWith("-"))return{argv:null,refusal:`anchor command smuggles a git global option ("${subcommand}"); only bare read-only git subcommands are allowed`};let allowed=READ_ONLY_GIT_FLAGS[subcommand];if(!allowed)return{argv:null,refusal:`git "${subcommand}" is not in the read-only git subcommand allowlist (rev-list, log, rev-parse, show, diff)`};let finalTokens=[subcommand];for(let i=2;i<tokens2.length;i++){let token=tokens2[i];if(token.startsWith("-")){let eq=token.indexOf("="),flag=eq>=0?token.slice(0,eq):token,inlineValue=eq>=0?token.slice(eq+1):void 0,arity2=allowed[flag];if(arity2===void 0)return{argv:null,refusal:`flag "${flag}" is not in the read-only git allowlist for git ${subcommand}`};if(arity2===0){if(inlineValue!==void 0)return{argv:null,refusal:`flag "${flag}" takes no value; =-joined forms are not valid for it`};finalTokens.push(flag)}else{let value=inlineValue;if(value===void 0){let next=tokens2[i+1];if(next===void 0||next.startsWith("--"))return{argv:null,refusal:`flag "${flag}" requires a value token`};value=next,i++}finalTokens.push(flag.startsWith("--")?`${flag}=${value}`:`${flag}${value}`)}continue}let hasControlByte=Array.from(token).some((ch)=>ch.charCodeAt(0)<32||ch.charCodeAt(0)===127);if(token.length>400||hasControlByte)return{argv:null,refusal:"anchor argument is too long or contains control bytes"};if(REMOTE_HELPER_PATTERN.test(token))return{argv:null,refusal:`anchor argument "${token.slice(0,32)}" looks like a remote-helper URL; remote helpers can execute commands and are not read-only git invocations`};finalTokens.push(token)}if(subcommand==="diff"||subcommand==="show"||subcommand==="log")finalTokens.push("--no-ext-diff","--no-textconv");return{argv:[resolveGitExecutable(),"--no-pager","-c","diff.external=","-c","core.pager=cat","-c","core.fsmonitor=","-c","gpg.program=","-c","credential.helper=",...finalTokens],refusal:null}}async function runAnchor(argv,cwd,timeoutMs){let{env,envOverrides}=anchorEnv(),proc=bunSpawn(argv,{cwd,env,envOverrides,stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:timeoutMs,maxBuffer:ANCHOR_SPAWN_MAX_BUFFER_BYTES});try{let exited=await proc.exited,stdout;try{stdout=await proc.stdout.text()}catch{return{exitCode:exited,stdout:"",refusal:`anchor output exceeded the ${Math.floor(ANCHOR_SPAWN_MAX_BUFFER_BYTES/1024)}KB spawn capture buffer; refusing rather than truncating`}}if(exited!==0){let detail=(await proc.stderr.text()).trim().slice(0,200);return{exitCode:exited,stdout,refusal:`anchor command exited with code ${exited}${detail?`: ${detail}`:""}`}}return{exitCode:exited,stdout,refusal:null}}finally{try{proc.kill()}catch{}}}function validateAnchorExpectations(anchors){for(let anchor of anchors){if(anchor.expect===void 0&&anchor.expect_prefix===void 0)return`anchor "${anchor.command.slice(0,60)}" declares neither expect nor expect_prefix`;if(anchor.expect_prefix!==void 0&&anchor.expect_prefix.length===0)return`anchor "${anchor.command.slice(0,60)}" declares an empty expect_prefix, which would match any output`}return null}async function executeAttestTask(args2,fallbackDir){let resolveResult=_internals117.resolveWorkingDirectory(args2.working_directory,fallbackDir);if(!resolveResult.success)return{success:!1,message:resolveResult.message,errors:[resolveResult.message]};let directory=resolveResult.directory;try{assertProjectRoot(directory)}catch(error93){let message=error93 instanceof Error?error93.message:String(error93);return{success:!1,message,errors:[message]}}let found;try{found=_internals118.loadPlanTask(directory,args2.task_id)}catch(error93){let message=error93 instanceof Error?error93.message:String(error93);if(message.includes("expect_prefix")||message.includes("evidence_anchors"))return{success:!1,message:"the plan declares an invalid external-evidence anchor: every anchor must carry expect and/or a non-empty expect_prefix (an empty prefix would match any output)",errors:["the plan declares an invalid external-evidence anchor: every anchor must carry expect and/or a non-empty expect_prefix (an empty prefix would match any output)"],task_id:args2.task_id};let refusal=`the plan at ${directory} is invalid or unreadable; fix or re-save the plan before attesting`;return{success:!1,message:refusal,errors:[`${refusal} (${message.slice(0,160)})`],task_id:args2.task_id}}if(!found){let message=`Task ${args2.task_id} not found in the plan at ${directory}`;return{success:!1,message,errors:[message],task_id:args2.task_id}}if(found.task.evidence_class!=="external_git"){let message=`Task ${args2.task_id} does not declare evidence_class external_git; the attest path is fail-closed to explicitly declared external-evidence tasks (issue #3422)`;return{success:!1,message,errors:[message],task_id:args2.task_id}}let anchors=found.task.evidence_anchors??[];if(anchors.length===0){let message=`Task ${args2.task_id} declares external_git evidence but pins no evidence_anchors`;return{success:!1,message,errors:[message],task_id:args2.task_id}}let malformed=validateAnchorExpectations(anchors);if(malformed)return{success:!1,message:malformed,errors:[malformed],task_id:args2.task_id};let startedAt=Date.now(),outcomes=[];for(let anchor of anchors){let{argv,refusal}=_internals118.buildAnchorArgv(anchor.command);if(refusal!==null||argv===null){let message=`anchor not admitted: ${refusal??"not an allowed read-only git invocation"}`;return{success:!1,message,errors:[message],task_id:args2.task_id}}let remaining=ATTEST_TOTAL_DEADLINE_MS-(Date.now()-startedAt);if(remaining<=0)return{success:!1,message:"attest total deadline (30s) exhausted before all anchors ran",errors:["attest total deadline (30s) exhausted before all anchors ran"],task_id:args2.task_id};let run=await _internals118.runAnchor(argv,directory,Math.min(ANCHOR_SPAWN_TIMEOUT_MS,remaining));if(run.refusal!==null){let message=`anchor "${anchor.command.slice(0,60)}" failed: ${run.refusal}`;return{success:!1,message,errors:[message],task_id:args2.task_id}}if(run.stdout.length>ANCHOR_STDOUT_MAX_CHARS){let message=`anchor "${anchor.command.slice(0,60)}" produced ${run.stdout.length} chars of stdout, exceeding the ${ANCHOR_STDOUT_MAX_CHARS}-char evidence storage bound; refusing rather than truncating`;return{success:!1,message,errors:[message],task_id:args2.task_id}}let trimmed=run.stdout.trim(),matched=anchor.expect!==void 0?trimmed===anchor.expect&&(anchor.expect_prefix===void 0||trimmed.startsWith(anchor.expect_prefix)):trimmed.startsWith(anchor.expect_prefix);outcomes.push({command:anchor.command,expect:anchor.expect,expect_prefix:anchor.expect_prefix,matched,exit_code:run.exitCode,stdout:run.stdout})}if(!outcomes.every((outcome)=>outcome.matched)){let failed=outcomes.find((outcome)=>!outcome.matched),message=`anchor "${failed?.command.slice(0,60)??"?"}" did not match its expectation (stdout: ${JSON.stringify(failed?.stdout.slice(0,120)??"")})`;return{success:!1,message,errors:[message],task_id:args2.task_id}}let current;try{current=_internals118.loadPlanTask(directory,args2.task_id)}catch{return{success:!1,message:"the plan became unreadable while anchors were running; re-run attest against the current declaration",errors:["the plan became unreadable while anchors were running; re-run attest against the current declaration"],task_id:args2.task_id}}let anchorsUnchanged=JSON.stringify(current?.task.evidence_anchors??null)===JSON.stringify(anchors);if(!current||current.task.evidence_class!=="external_git"||current.title!==found.title||current.swarm!==found.swarm||!anchorsUnchanged)return{success:!1,message:"the plan changed while anchors were running; re-run attest against the current declaration",errors:["the plan changed while anchors were running; re-run attest against the current declaration"],task_id:args2.task_id};let existingEvidence=null;try{existingEvidence=readTaskEvidenceRaw(directory,args2.task_id)}catch(error93){let message=`the existing evidence file for task ${args2.task_id} is unreadable (corrupt): ${error93 instanceof Error?error93.message.slice(0,160):String(error93).slice(0,160)}; inspect the file before attesting`;return{success:!1,message,errors:[message],task_id:args2.task_id}}let generation=existingEvidence?.workflow?.generation??0,transitionId=`attest:${args2.task_id}:${startedAt}:${Math.random().toString(36).slice(2,10)}`,bundle={class:"external_git",transitionId,declarationDigest:computeExternalDeclarationDigest({taskId:args2.task_id,evidence_class:"external_git",evidence_anchors:anchors,plan_title:current.title,plan_swarm:current.swarm,generation}),anchors:outcomes,attestedAt:new Date().toISOString()};try{await transitionTaskWorkflowEvidence(directory,args2.task_id,{type:"external_evidence_attested",bundle,expectedGeneration:generation,transitionId})}catch(error93){let message=error93 instanceof Error?error93.message:String(error93);return{success:!1,message,errors:[message],task_id:args2.task_id}}return{success:!0,message:`Task ${args2.task_id}: ${outcomes.length} external evidence anchor(s) attested and recorded; completion is now admissible for this declared task`,task_id:args2.task_id}}var ANCHOR_STDOUT_MAX_CHARS=4096,ANCHOR_SPAWN_TIMEOUT_MS=1e4,ANCHOR_SPAWN_MAX_BUFFER_BYTES=262144,ATTEST_TOTAL_DEADLINE_MS=30000,READ_ONLY_GIT_FLAGS,REMOTE_HELPER_PATTERN,_internals118;var init_attest_task=__esm(()=>{init_plan_schema();init_gate_evidence();init_bun_compat();init_git_executable();init_project_boundary();init_update_task_status();READ_ONLY_GIT_FLAGS={"rev-list":{"--count":0,"--max-count":1,"--format":1,"--skip":1},log:{"--format":1,"--max-count":1,"-n":1,"--oneline":0,"--no-patch":0,"--stat":0,"--name-only":0,"-1":0,"-2":0,"-3":0,"-4":0,"-5":0,"-9":0},show:{"--format":1,"--stat":0,"--name-only":0,"--no-patch":0,"--quiet":0},diff:{"--stat":0,"--name-only":0,"--quiet":0},"rev-parse":{"--verify":0,"--short":0}},REMOTE_HELPER_PATTERN=/^(ext::|[a-z+.-]+::)/;_internals118={runAnchor,buildAnchorArgv,loadPlanTask:(directory,taskId)=>{let planPath=path125.join(directory,".swarm","plan.json");if(!fs80.existsSync(planPath))return null;let plan=PlanSchema.parse(JSON.parse(fs80.readFileSync(planPath,"utf-8")));for(let phase of plan.phases)for(let task of phase.tasks)if(task.id===taskId)return{title:plan.title,swarm:plan.swarm,task};return null}}});async function handleAttestCommand(directory,args2,sessionID){let unknownOptions=args2.filter((arg)=>arg.startsWith("--"));if(unknownOptions.length>0)return["## External Evidence Attestation","",`❌ Unsupported option(s): ${unknownOptions.join(" ")}. Usage: /swarm attest <task_id>`].join(`
@@ -7637,7 +7637,7 @@ ${hint}`}]}return{file:targetPath,status:"error",hunks:hunksTotal,hunksApplied:0
7637
7637
  Evidence:
7638
7638
  ${evidence2}`:""}`;if(blockOnThreshold)return{status:"exceeded",blocked:!0,advisory:!1,count:count4,max,message:`${summary}
7639
7639
  ${repairStep()}`};return{status:"exceeded",blocked:!1,advisory:!0,count:count4,max,message:`${summary}
7640
- ${repairStep()}`}}init_logger();init_task_id();init_create_tool();init_resolve_working_directory();var EVIDENCE_DIR=".swarm/evidence";function isValidTaskId4(taskId){return isStrictTaskId(taskId)}function isPathWithinSwarm(filePath,workspaceRoot){let normalizedWorkspace=path332.resolve(workspaceRoot),swarmPath3=path332.join(normalizedWorkspace,".swarm","evidence");return path332.resolve(filePath).startsWith(swarmPath3)}function readEvidenceFile(evidencePath2){if(!fs195.existsSync(evidencePath2))return null;let content;try{content=fs195.readFileSync(evidencePath2,"utf-8")}catch{return null}let parsed;try{parsed=JSON.parse(content)}catch{return null}if(parsed&&typeof parsed==="object"&&Array.isArray(parsed.required_gates)&&typeof parsed.gates==="object"&&parsed.gates!==null)return parsed;return null}var check_gate_status=createSwarmTool({description:"Read-only tool to check the gate status of a specific task. Reads .swarm/evidence/{taskId}.json and returns structured JSON describing required, passed, and missing gates.",args:{task_id:exports_external.string().min(1).regex(/^\d+\.\d+(\.\d+)*$/,'Task ID must be in N.M or N.M.P format (e.g., "1.1", "1.2.3", "1.2.3.4")').describe('The task ID to check gate status for (e.g., "1.1", "2.3.1")'),working_directory:exports_external.string().optional().describe("Explicit project root directory. When provided, .swarm/evidence/ is resolved relative to this path instead of the plugin context directory. Use this when CWD differs from the actual project root.")},async execute(args2,directory){let taskIdInput,workingDirInput;try{if(args2&&typeof args2==="object"){let obj=args2;taskIdInput=typeof obj.task_id==="string"?obj.task_id:void 0,workingDirInput=typeof obj.working_directory==="string"?obj.working_directory:void 0}}catch{}let dirResult=resolveWorkingDirectory(workingDirInput,directory);if(!dirResult.success){let errorResult={taskId:taskIdInput??"",status:"no_evidence",required_gates:[],passed_gates:[],missing_gates:[],gates:{},message:dirResult.message,todo_scan:null};return JSON.stringify(errorResult,null,2)}directory=dirResult.directory;let todoGateConfig;try{todoGateConfig=loadPluginConfigWithMeta(directory).config.todo_gate}catch(configError){log("check_gate_status: todo_gate config load threw; TODO gate evaluation skipped",configError)}if(!taskIdInput)return JSON.stringify({taskId:"",status:"no_evidence",required_gates:[],passed_gates:[],missing_gates:[],gates:{},message:"Invalid task_id: task_id is required",todo_scan:null},null,2);if(!isValidTaskId4(taskIdInput)){let errorResult={taskId:taskIdInput,status:"no_evidence",required_gates:[],passed_gates:[],missing_gates:[],gates:{},message:`Invalid task_id format: "${taskIdInput}". Must match N.M or N.M.P (e.g. "1.1", "1.2.3", "1.2.3.4")`,todo_scan:null};return JSON.stringify(errorResult,null,2)}let evidencePath2=path332.join(directory,EVIDENCE_DIR,`${taskIdInput}.json`);if(!isPathWithinSwarm(evidencePath2,directory))return JSON.stringify({taskId:taskIdInput,status:"no_evidence",required_gates:[],passed_gates:[],missing_gates:[],gates:{},message:"Invalid path: evidence path validation failed",todo_scan:null},null,2);let evidenceData=readEvidenceFile(evidencePath2);if(!evidenceData){let errorResult={taskId:taskIdInput,status:"no_evidence",required_gates:[],passed_gates:[],missing_gates:[],gates:{},message:`No evidence file found for task "${taskIdInput}" at ${evidencePath2}. Evidence file may be missing or invalid.`,todo_scan:null};return JSON.stringify(errorResult,null,2)}let gatesMap=evidenceData.gates||{},authoritativeWorkflow=evidenceData.workflow?.schema===TASK_WORKFLOW_SCHEMA_MARKER,derivedGates=deriveApplicableGateSet(evidenceData,authoritativeWorkflow?{currentDeclaredFiles:readCurrentTaskDeclaredFiles(directory,taskIdInput)}:void 0),requiredGates=derivedGates.requiredGates,passedGates=derivedGates.satisfiedGates,missingGates=derivedGates.missingGates,readOnlyNoMutation=derivedGates.readOnlyNoMutation;try{let externalPlanPath=path332.join(directory,".swarm","plan.json"),externalPlanRaw=fs195.readFileSync(externalPlanPath,"utf-8"),externalPlan=JSON.parse(externalPlanRaw),declaredTask=(externalPlan.phases??[]).flatMap((phase)=>phase.tasks??[]).find((task2)=>task2.id===taskIdInput);if(declaredTask&&declaredTask.evidence_class==="external_git"&&typeof externalPlan.title==="string"&&typeof externalPlan.swarm==="string"){let proofCurrent=externalProofCurrent({title:externalPlan.title,swarm:externalPlan.swarm},declaredTask,evidenceData),externalWorkflowMeta=evidenceData.workflow&&typeof evidenceData.workflow==="object"&&typeof evidenceData.workflow.state==="string"?{state:evidenceData.workflow.state,generation:typeof evidenceData.workflow.generation==="number"?evidenceData.workflow.generation:0}:null,externalResult=proofCurrent?{taskId:taskIdInput,status:"all_passed",required_gates:["external_attest"],passed_gates:["external_attest"],missing_gates:[],gates:gatesMap,message:`External evidence attested: task "${taskIdInput}" is satisfied by its pinned external_git anchors (issue #3422).`,todo_scan:evidenceData.todo_scan??null,workflow:externalWorkflowMeta}:{taskId:taskIdInput,status:"incomplete",required_gates:["external_attest"],passed_gates:[],missing_gates:["external_attest"],gates:gatesMap,message:`Task "${taskIdInput}" declares external_git evidence but no matched attestation exists yet. Run /swarm attest ${taskIdInput} (or re-plan it as a thin coder dispatch).`,todo_scan:evidenceData.todo_scan??null,workflow:externalWorkflowMeta};return JSON.stringify(externalResult,null,2)}}catch{}let status2=missingGates.length===0&&(readOnlyNoMutation||evidenceData.workflow?.state==="tests_run"||evidenceData.workflow?.state==="complete")?"all_passed":"incomplete",message;if(status2==="all_passed")message=`All required gates have passed for task "${taskIdInput}".`;else if(requiredGates.length===0)message=`Task "${taskIdInput}" is incomplete. No required gates are configured for this task generation.`;else message=`Task "${taskIdInput}" is incomplete. Missing gates: ${missingGates.join(", ")}.`;let secretscanVerdict="not_run";try{let evidenceResult=await loadEvidence(directory,taskIdInput);if(evidenceResult.status==="found"){let secretscanEntries=evidenceResult.bundle.entries.filter((entry)=>entry.type==="secretscan");if(secretscanEntries.length>0){let lastSecretscan=secretscanEntries[secretscanEntries.length-1];if(isSecretscanEvidence(lastSecretscan)){let{incomplete_files:incompleteFiles,incomplete_paths:incompletePaths}=lastSecretscan,findingsCount=lastSecretscan.findings_count??0,hasIncompleteCoverage=incompleteFiles>0||incompletePaths.length>0,newFindingsRaw=lastSecretscan.new_findings_count,preexistingRaw=lastSecretscan.preexisting_findings_count,newFindingsValid=typeof newFindingsRaw==="number"&&Number.isSafeInteger(newFindingsRaw)&&newFindingsRaw>=0,preexistingValid=typeof preexistingRaw==="number"&&Number.isSafeInteger(preexistingRaw)&&preexistingRaw>=0,newFindingsBasis=newFindingsValid?newFindingsRaw:findingsCount;if(newFindingsValid&&preexistingValid&&newFindingsRaw+preexistingRaw!==findingsCount)newFindingsBasis=findingsCount;let hasNewFindings=newFindingsBasis>0,policySkipped=lastSecretscan.policy_skipped_files,requestedFilesCount=lastSecretscan.requested_files,vacuousCoverage=lastSecretscan.files_scanned===0&&typeof policySkipped==="number"&&Number.isSafeInteger(policySkipped)&&policySkipped>=0&&typeof requestedFilesCount==="number"&&Number.isSafeInteger(requestedFilesCount)&&requestedFilesCount>0&&policySkipped>=requestedFilesCount&&findingsCount===0&&incompleteFiles===0&&incompletePaths.length===0,hasZeroCoverage=lastSecretscan.files_scanned===0&&!vacuousCoverage;if(hasIncompleteCoverage||hasNewFindings||hasZeroCoverage||lastSecretscan.verdict==="fail"||lastSecretscan.verdict==="rejected")if(secretscanVerdict="fail",hasIncompleteCoverage&&!hasNewFindings){if(missingGates.push("secretscan (BLOCKED — incomplete coverage)"),status2==="all_passed")status2="incomplete";message=`BLOCKED: Secretscan incomplete coverage in prior scan. ${message}`}else if(hasNewFindings&&hasIncompleteCoverage){if(missingGates.push("secretscan (BLOCKED — secrets detected; incomplete coverage)"),status2==="all_passed")status2="incomplete";message=`BLOCKED: Secretscan found secrets and incomplete coverage in prior scan (${newFindingsBasis} new on changed lines). ${message}`}else if(hasNewFindings){if(missingGates.push("secretscan (BLOCKED — secrets detected)"),status2==="all_passed")status2="incomplete";message=`BLOCKED: Secretscan found secrets in prior scan (${newFindingsBasis} new on changed lines${findingsCount>newFindingsBasis?`, ${findingsCount} total`:""}). ${message}`}else if(hasZeroCoverage){if(missingGates.push("secretscan (BLOCKED — zero coverage)"),status2==="all_passed")status2="incomplete";message=`BLOCKED: Secretscan scanned zero files in prior scan. ${message}`}else{if(missingGates.push("secretscan (BLOCKED — zero coverage)"),status2==="all_passed")status2="incomplete";message=`BLOCKED: Secretscan verdict failed without new findings or coverage gaps (possible truncation or tampering). ${message}`}else if(lastSecretscan.verdict==="pass"||lastSecretscan.verdict==="approved"||lastSecretscan.verdict==="info"){if(secretscanVerdict="pass",vacuousCoverage)message+=` Advisory: Secretscan coverage was vacuous (${lastSecretscan.policy_skipped_files} of ${lastSecretscan.requested_files} requested file(s) skipped by scan policy).`;else if(findingsCount>0)message+=` Advisory: ${findingsCount} pre-existing secret finding(s) remain visible (non-gating; secretscan green = zero new secrets on changed lines).`}}}else message+=" Advisory: No secretscan evidence found for this task. Consider running secretscan."}else if(evidenceResult.status==="invalid_schema")secretscanVerdict="fail",missingGates.push("secretscan (BLOCKED — invalid evidence)"),status2="incomplete",message=`BLOCKED: Secretscan evidence is invalid and cannot prove complete coverage. ${message}`}catch{}let todoScan=evidenceData.todo_scan,todoVerdict=evaluateTodoGate(todoScan,todoGateConfig);if(todoVerdict.status==="exceeded")if(todoVerdict.blocked){if(missingGates.push(`todo_gate (BLOCKED — ${todoVerdict.count} high-priority TODOs exceed max ${todoVerdict.max})`),status2==="all_passed")status2="incomplete";message=`BLOCKED: TODO gate threshold exceeded. ${todoVerdict.message} ${message}`}else message+=` Advisory: todo_gate threshold exceeded — ${todoVerdict.count} high-priority TODOs (FIXME/HACK/XXX) exceed max_high_priority=${todoVerdict.max}.`;let workflowMeta=evidenceData.workflow&&typeof evidenceData.workflow==="object"&&typeof evidenceData.workflow.state==="string"?{state:evidenceData.workflow.state,generation:typeof evidenceData.workflow.generation==="number"?evidenceData.workflow.generation:0}:null,workflowAttributionHint;if(status2==="incomplete"&&workflowMeta?.state==="coder_delegated"&&!gatesMap.pre_check)workflowAttributionHint="Task is settled at coder_delegated but Stage A (pre_check_batch) was never attributed — "+`reviewer/test_engineer dispatches will be denied with TASK_WORKFLOW_STAGE_A_REQUIRED. Run pre_check_batch on the task's changed files; if it passes without advancing this task, run /swarm recover ${taskIdInput}.`,message+=` ${workflowAttributionHint}`;let result={taskId:taskIdInput,status:status2,required_gates:requiredGates,passed_gates:passedGates,missing_gates:missingGates,gates:gatesMap,message,todo_scan:todoScan??null,secretscan_verdict:secretscanVerdict,workflow:workflowMeta,...workflowAttributionHint?{workflow_attribution_hint:workflowAttributionHint}:{}};return JSON.stringify(result,null,2)}});init_checkpoint();init_co_change_analyzer();init_zod();init_loader();init_pr_workflow_gate();init_create_tool();var CompletePrWorkflowArgsSchema=exports_external.object({mode:exports_external.enum(["PR_REVIEW","PR_FEEDBACK"]),pr_head_sha:exports_external.string().trim().min(1).max(80),report_verdict:exports_external.enum(["APPROVE","REQUEST_CHANGES","INCOMPLETE"]).optional()}).strict().superRefine((value,ctx)=>{if(value.mode==="PR_REVIEW"&&value.report_verdict===void 0)ctx.addIssue({code:"custom",path:["report_verdict"],message:"is required for PR_REVIEW completion (issue #2383 terminal report)"})});async function executeCompletePrWorkflow(args2,directory,context={}){let parsed=CompletePrWorkflowArgsSchema.safeParse(args2);if(!parsed.success)return JSON.stringify({success:!1,message:`Invalid PR workflow completion: ${parsed.error.issues.map((issue3)=>`${issue3.path.join(".")}: ${issue3.message}`).join("; ")}`});if(!context.sessionID?.trim())return JSON.stringify({success:!1,message:"PR workflow completion requires an active sessionID"});let staleDisclosure={},laneLiveness;try{let config3=loadPluginConfig(directory),hooks2=config3.hooks;laneLiveness={laneLivenessWatchdog:config3.lane_liveness_watchdog,backgroundPendingTimeoutMs:hooks2?.background_pending_timeout_minutes!==void 0?hooks2.background_pending_timeout_minutes*60000:void 0}}catch{}try{let settlement=await _internals288.settlePresumedStalePrWorkflowLanes(directory,context.sessionID,laneLiveness);if(settlement.presumedStaleLaneIds.length>0)staleDisclosure={presumed_stale_lanes:settlement.presumedStaleLaneIds,presumed_stale_disclosure:settlement.disclosure};if(settlement.probedAliveLaneIds?.length)staleDisclosure.probe_retained_lanes=settlement.probedAliveLaneIds;if(settlement.probeDegradedReason)staleDisclosure.probe_status=settlement.probeDegradedReason;if(settlement.horizonConflictNote)staleDisclosure.horizon_conflict=settlement.horizonConflictNote}catch{}let amendmentDisclosure={};try{let gateState=await _internals288.readPrWorkflowGateState(directory,context.sessionID);if(gateState?.prFeedbackInventoryAmendments?.length)amendmentDisclosure={inventory_amendments:gateState.prFeedbackInventoryAmendments}}catch{}try{let terminalReport;if(parsed.data.mode==="PR_REVIEW"){let coverage=null;try{coverage=await _internals288.readPrReviewTerminalCoverageForReport(directory,context.sessionID)}catch{}if(coverage){let findingPolicy;try{findingPolicy=await _internals288.readPrReviewFinalFindingPolicyForReport(directory,context.sessionID)}catch{}terminalReport={kind:coverage.kind,covered_dimensions:coverage.coveredDimensions,unresolved_dimensions:coverage.unresolvedDimensions,live_dimensions:coverage.liveDimensions,allowed_verdicts:findingPolicy?.permittedVerdicts??coverage.allowedVerdicts,...findingPolicy?{finding_policy_version:findingPolicy.policyVersion,blocking_finding_ids:findingPolicy.blockingFindingIds}:{},report_verdict:parsed.data.report_verdict,...((summary)=>summary?{findings_summary:summary}:{})(await findingsSummaryForReportSafe(directory,context.sessionID)),coverage_degradations:await coverageDegradationsForReportSafe(directory,context.sessionID),verdict_settlement:await verdictSettlementSummaryForReportSafe(directory,context.sessionID)}}}let status2=await _internals288.completePrWorkflow(directory,context.sessionID,parsed.data.mode,parsed.data.pr_head_sha,parsed.data.mode==="PR_REVIEW"?{reportVerdict:parsed.data.report_verdict,...laneLiveness?{laneLiveness}:{}}:laneLiveness?{laneLiveness}:void 0),checkoutRestoreRequired=!1,checkoutRestoreReceipts=[];if(status2==="completed"){if(parsed.data.mode==="PR_REVIEW"&&parsed.data.report_verdict==="INCOMPLETE"&&terminalReport)terminalReport.allowed_verdicts=["INCOMPLETE"];try{checkoutRestoreReceipts=await _internals288.listPendingPrWorkflowCheckoutRestores(directory,context.sessionID),checkoutRestoreRequired=checkoutRestoreReceipts.length>0}catch{checkoutRestoreRequired=!0}}return JSON.stringify({success:!0,mode:parsed.data.mode,pr_head_sha:parsed.data.pr_head_sha,status:status2,ready_to_publish:status2==="ready-to-publish",verified_no_change:status2==="verified-no-change",gate_cleared:status2==="completed"||status2==="verified-no-change",checkout_restore_required:checkoutRestoreRequired,checkout_restore_receipts:checkoutRestoreReceipts,...terminalReport?{terminal_report:terminalReport}:{},...staleDisclosure,...amendmentDisclosure})}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:String(error93),...staleDisclosure,...amendmentDisclosure})}}var complete_pr_workflow=createSwarmTool({description:"Validate terminal PR workflow coverage. After the ordered PR_FEEDBACK gates permit one standalone commit, the first call requires a clean tree and a non-merge direct child of intake HEAD, then binds its structured upstream target; the second clears only after both the local tracking ref and an actual-remote query point to that exact commit. A cleared result reports checkout_restore_required when preserved pre-workflow changes must be restored.",args:{mode:CompletePrWorkflowArgsSchema.shape.mode,pr_head_sha:CompletePrWorkflowArgsSchema.shape.pr_head_sha,report_verdict:CompletePrWorkflowArgsSchema.shape.report_verdict},execute:executeCompletePrWorkflow}),_internals288={completePrWorkflow,listPendingPrWorkflowCheckoutRestores,readPrWorkflowGateState,readPrReviewTerminalCoverageForReport,readPrReviewFinalFindingPolicyForReport,settlePresumedStalePrWorkflowLanes,verdictSettlementSummaryForReportSafe};async function verdictSettlementSummaryForReport(directory,sessionID){let{readPrReviewVerdictSettlementReceiptItems:readPrReviewVerdictSettlementReceiptItems2}=await Promise.resolve().then(() => (init_pr_workflow_gate(),exports_pr_workflow_gate));return readPrReviewVerdictSettlementReceiptItems2(directory,sessionID)}async function verdictSettlementSummaryForReportSafe(directory,sessionID){try{return await verdictSettlementSummaryForReport(directory,sessionID)}catch{return}}async function findingsSummaryForReport(directory,sessionID){let{readAuthoritativeFindingPolicy:readAuthoritativeFindingPolicy2}=await Promise.resolve().then(() => (init_pr_workflow_gate(),exports_pr_workflow_gate)),state2=await readPrWorkflowGateState(directory,sessionID);if(!state2)throw Error("BLOCKED: no active PR workflow gate state");let{policyFindings}=await readAuthoritativeFindingPolicy2(directory,state2),severityAxes=new Set(["CRITICAL","HIGH","MEDIUM","LOW","INFO","NONE"]),bySeverity={};for(let finding of policyFindings){let axis=severityAxes.has(finding.severity)?finding.severity:"OTHER";bySeverity[axis]=(bySeverity[axis]??0)+1}return{total:policyFindings.length,by_severity:bySeverity}}async function findingsSummaryForReportSafe(directory,sessionID){try{return await findingsSummaryForReport(directory,sessionID)}catch{return}}var MAX_TERMINAL_COVERAGE_DEGRADATIONS=10,MAX_TERMINAL_DEGRADATION_REASON_CHARS=200,MAX_TERMINAL_DEGRADATION_ID_CHARS=200;function boundTerminalText(value,max){return value.slice(0,max)}function redactTerminalCleanLiteral(value){return value.includes("CLEAN")?value.split("CLEAN").join("clean-attestation"):value}async function coverageDegradationsForReport(directory,sessionID){let state2=await readPrWorkflowGateState(directory,sessionID);if(!state2)return[];let{readPrReviewTriggerReceiptForGate:readPrReviewTriggerReceiptForGate2}=await Promise.resolve().then(() => (init_pr_review_trigger_receipt_reader(),exports_pr_review_trigger_receipt_reader)),read=readPrReviewTriggerReceiptForGate2(directory,state2.prReviewTriggerEvalPath??null);if("noReceipt"in read)return[];return read.receipt.coverageDegradations.slice(0,MAX_TERMINAL_COVERAGE_DEGRADATIONS).map((degradation)=>({trigger_id:degradation.trigger_id,source_batch_id:boundTerminalText(redactTerminalCleanLiteral(degradation.source_batch_id),MAX_TERMINAL_DEGRADATION_ID_CHARS),source_lane_id:boundTerminalText(redactTerminalCleanLiteral(degradation.source_lane_id),MAX_TERMINAL_DEGRADATION_ID_CHARS),reason:boundTerminalText(redactTerminalCleanLiteral(degradation.reason),MAX_TERMINAL_DEGRADATION_REASON_CHARS)}))}async function coverageDegradationsForReportSafe(directory,sessionID){try{return await coverageDegradationsForReport(directory,sessionID)}catch{return[]}}init_zod();init_utils2();init_state();init_swarm_artifact_cache();init_create_tool();init_resolve_working_directory();import*as fs196 from"node:fs";import*as path333 from"node:path";function extractMatches(regex,text){return Array.from(text.matchAll(regex))}function parseIdentifiers(description){let identifiers=new Set,backtickRegex=/`([^`]+)`/g;for(let match of extractMatches(backtickRegex,description))identifiers.add(match[1]);let camelCaseRegex=/\b([a-z][a-zA-Z0-9]{2,})\b/g;for(let match of extractMatches(camelCaseRegex,description)){let word=match[1];if(word==="the"||word==="and"||word==="for"||word==="have"||word==="this"||word==="with"||word==="from"||word==="they"||word==="been"||word==="will"||word==="your"||word==="also")continue;identifiers.add(word)}let pascalCaseRegex=/\b([A-Z][a-zA-Z0-9]{2,})\b/g;for(let match of extractMatches(pascalCaseRegex,description))identifiers.add(match[1]);let configKeyRegex=/\b([a-z][a-zA-Z0-9]*(?:\.[a-z][a-zA-Z0-9]*)+)\b/g;for(let match of extractMatches(configKeyRegex,description))identifiers.add(match[1]);let quotedPathRegex=/['"](\.{0,3}(?:src|lib|test)[/\\][^'"]+)['"]/g;for(let match of extractMatches(quotedPathRegex,description))identifiers.add(match[1]);return Array.from(identifiers)}function parseFilePaths(description,filesTouched){if(filesTouched&&Array.isArray(filesTouched)&&filesTouched.length>0)return filesTouched;let filePaths=[],srcPathRegex=/\b(?:src|lib|test|app|packages?)[/\\][a-zA-Z0-9_./-]+\.(?:ts|tsx|js|jsx|mjs|cjs)\b/g;for(let match of extractMatches(srcPathRegex,description))filePaths.push(match[0]);let genericPathRegex=/\b[a-zA-Z0-9_./-]+[/\\][a-zA-Z0-9_./-]+\.[a-zA-Z0-9]+(?=\s|$|[.,;])/g;for(let match of extractMatches(genericPathRegex,description)){let pathStr=match[0];if(pathStr.includes("src/")||pathStr.includes("src\\")||pathStr.includes("lib/")||pathStr.includes("lib\\")||pathStr.includes("test/")||pathStr.includes("test\\"))filePaths.push(pathStr)}return filePaths}function buildVerifySummary(tasksChecked,tasksSkipped,tasksBlocked){if(tasksBlocked>0)return`Blocked: ${tasksBlocked} task(s) with missing identifiers`;let verified=tasksChecked-tasksSkipped;if(tasksSkipped===tasksChecked)return`All ${tasksChecked} completed task(s) skipped — research/inventory tasks`;if(tasksSkipped>0)return`${verified} task(s) verified, ${tasksSkipped} skipped (research tasks)`;return`All ${tasksChecked} completed tasks verified successfully`}async function executeCompletionVerify(args2,directory){let phase=Number(args2.phase);if(Number.isNaN(phase)||phase<1||!Number.isFinite(phase))return JSON.stringify({success:!1,phase,status:"blocked",reason:"Invalid phase number",tasksChecked:0,tasksSkipped:0,tasksBlocked:0,blockedTasks:[]},null,2);if(hasActiveTurboMode(args2.sessionID))return JSON.stringify({success:!0,phase,status:"passed",reason:"Turbo Mode active — completion verification bypassed",tasksChecked:0,tasksSkipped:0,tasksBlocked:0,blockedTasks:[]},null,2);let plan;try{let planPath=validateSwarmPath(directory,"plan.json"),planRaw=fs196.readFileSync(planPath,"utf-8");plan=JSON.parse(planRaw)}catch{return JSON.stringify({success:!0,phase,status:"passed",reason:"Cannot verify without plan.json",tasksChecked:0,tasksSkipped:0,tasksBlocked:0,blockedTasks:[]},null,2)}let targetPhase=plan.phases.find((p)=>p.id===phase);if(!targetPhase){let result2={success:!1,phase,status:"blocked",reason:`Phase ${phase} not found in plan.json`,tasksChecked:0,tasksSkipped:0,tasksBlocked:0,blockedTasks:[]};return JSON.stringify(result2,null,2)}let tasksChecked=0,tasksSkipped=0,tasksBlocked=0,blockedTasks=[];for(let task2 of targetPhase.tasks){if(task2.status!=="completed")continue;tasksChecked++;let fileTargets=parseFilePaths(task2.description,task2.files_touched),identifiers=parseIdentifiers(task2.description);if(fileTargets.length===0){tasksSkipped++;continue}if(identifiers.length===0){blockedTasks.push({task_id:task2.id,identifier:"",file_path:"",reason:"No identifiers — cannot verify completion without identifiers"}),tasksBlocked++;continue}let foundIdentifiers=new Set,hasFileReadFailure=!1;for(let filePath of fileTargets){let normalizedPath=filePath.replace(/\\/g,"/"),resolvedPath=path333.resolve(directory,normalizedPath),projectRoot=path333.resolve(directory),relative88=path333.relative(projectRoot,resolvedPath);if(!(relative88===""||!relative88.startsWith("..")&&!path333.isAbsolute(relative88))){blockedTasks.push({task_id:task2.id,identifier:"",file_path:filePath,reason:`File path '${filePath}' escapes the project directory — cannot verify completion`}),hasFileReadFailure=!0;continue}let fileContent;try{fileContent=fs196.readFileSync(resolvedPath,"utf-8")}catch{blockedTasks.push({task_id:task2.id,identifier:"",file_path:filePath,reason:`File '${filePath}' not found — cannot verify completion`}),hasFileReadFailure=!0;continue}for(let identifier of identifiers)if(fileContent.includes(identifier))foundIdentifiers.add(identifier)}let foundCount=foundIdentifiers.size;if(hasFileReadFailure||foundCount===0){if(!hasFileReadFailure)blockedTasks.push({task_id:task2.id,identifier:"",file_path:"",reason:"No identifiers found in target files"});tasksBlocked++}}let now2=new Date().toISOString(),result={success:tasksBlocked===0,phase,status:tasksBlocked===0?"passed":"blocked",reason:tasksBlocked>0?`COMPLETION_INCOMPLETE: ${tasksBlocked} task(s) blocked — missing identifiers or target files`:void 0,tasksChecked,tasksSkipped,tasksBlocked,blockedTasks};if(args2.writeEvidence!==!1)try{let evidenceDir=path333.join(directory,".swarm","evidence",`${phase}`),evidencePath2=path333.join(evidenceDir,"completion-verify.json");fs196.mkdirSync(evidenceDir,{recursive:!0});let evidenceBundle={schema_version:"1.0.0",task_id:"completion-verify",created_at:now2,entries:[{task_id:"completion-verify",type:"completion_verify",timestamp:now2,agent:"completion_verify",verdict:tasksBlocked===0?"pass":"fail",summary:buildVerifySummary(tasksChecked,tasksSkipped,tasksBlocked),phase,tasks_checked:tasksChecked,tasks_skipped:tasksSkipped,tasks_blocked:tasksBlocked,blocked_tasks:blockedTasks}]};fs196.writeFileSync(evidencePath2,JSON.stringify(evidenceBundle,null,2),"utf-8"),invalidateCachedArtifact(evidencePath2)}catch{}return JSON.stringify(result,null,2)}var completion_verify=createSwarmTool({description:"Deterministic pre-check verifying that plan task identifiers exist in their target source files before phase completion. Blocks if obviously incomplete.",args:{phase:exports_external.number().describe("The phase number to check"),sessionID:exports_external.string().optional().describe("Session ID for tracking state (auto-provided by plugin context)"),working_directory:exports_external.string().optional().describe("Explicit project root directory. When provided, .swarm/ is resolved relative to this path instead of the plugin context directory. Use this when CWD differs from the actual project root.")},execute:async(args2,directory)=>{let parsedArgs;try{if(args2&&typeof args2==="object"){let obj=args2;parsedArgs={phase:typeof obj.phase==="number"?obj.phase:typeof obj.phase==="string"?Number(obj.phase):0,sessionID:typeof obj.sessionID==="string"?obj.sessionID:void 0,working_directory:typeof obj.working_directory==="string"?obj.working_directory:void 0}}else parsedArgs={phase:0}}catch{return JSON.stringify({success:!1,phase:0,status:"blocked",reason:"Invalid arguments",tasksChecked:0,tasksSkipped:0,tasksBlocked:0,blockedTasks:[]},null,2)}let dirResult=resolveWorkingDirectory(parsedArgs.working_directory,directory);if(!dirResult.success)return JSON.stringify({success:!1,phase:parsedArgs.phase,status:"blocked",reason:dirResult.message,tasksChecked:0,tasksSkipped:0,tasksBlocked:0,blockedTasks:[]},null,2);return executeCompletionVerify(parsedArgs,dirResult.directory)}});init_zod();init_metrics();init_bun_compat();init_git_executable();init_create_tool();init_path_security();import{Buffer as Buffer4}from"node:buffer";import*as fs197 from"node:fs";import*as path334 from"node:path";var MAX_FILE_SIZE_BYTES5=262144,DEFAULT_DAYS=90,DEFAULT_TOP_N2=20,DEFAULT_EXTENSIONS="ts,tsx,js,jsx,py,rs,ps1",SHELL_METACHAR_REGEX=/[;&|%$`\\]/;function validateDays(days){if(typeof days>"u")return{valid:!0,value:DEFAULT_DAYS,error:null};if(typeof days!=="number"||!Number.isInteger(days))return{valid:!1,value:0,error:"days must be an integer"};if(days<1||days>365)return{valid:!1,value:0,error:"days must be between 1 and 365"};return{valid:!0,value:days,error:null}}function validateTopN(topN){if(typeof topN>"u")return{valid:!0,value:DEFAULT_TOP_N2,error:null};if(typeof topN!=="number"||!Number.isInteger(topN))return{valid:!1,value:0,error:"top_n must be an integer"};if(topN<1||topN>100)return{valid:!1,value:0,error:"top_n must be between 1 and 100"};return{valid:!0,value:topN,error:null}}function validateExtensions(extensions){if(typeof extensions>"u")return{valid:!0,value:DEFAULT_EXTENSIONS,error:null};if(typeof extensions!=="string")return{valid:!1,value:"",error:"extensions must be a string"};if(containsControlChars(extensions))return{valid:!1,value:"",error:"extensions contains control characters"};if(SHELL_METACHAR_REGEX.test(extensions))return{valid:!1,value:"",error:"extensions contains shell metacharacters (;|&%$`\\)"};if(!/^[a-zA-Z0-9,.]+$/.test(extensions))return{valid:!1,value:"",error:"extensions contains invalid characters (only alphanumeric, commas, dots allowed)"};return{valid:!0,value:extensions,error:null}}var _internals289={bunSpawn,resolveGitExecutable},GIT_CHURN_TIMEOUT_MS=1e4,GIT_CHURN_MAX_BUFFER_BYTES=5242880;async function getGitChurn(days,directory,abortSignal){let churnMap=new Map,proc=_internals289.bunSpawn([_internals289.resolveGitExecutable(),"log",`--since=${days} days ago`,"--name-only","--pretty=format:"],{stdout:"pipe",stderr:"pipe",stdin:"ignore",cwd:directory,timeout:GIT_CHURN_TIMEOUT_MS,maxBuffer:GIT_CHURN_MAX_BUFFER_BYTES,killProcessTree:!0,env:{...process.env,GIT_TERMINAL_PROMPT:"0"}}),churnTimeout,churnAbortCleanup,racers=[Promise.all([proc.stdout.text(),proc.exited]).then((churnOutput)=>churnOutput),new Promise((resolve132)=>{churnTimeout=setTimeout(()=>resolve132([null,"timeout"]),GIT_CHURN_TIMEOUT_MS)})];if(abortSignal!==void 0)racers.push(new Promise((resolve132)=>{let settle2=()=>resolve132([null,"aborted"]);if(abortSignal.aborted){settle2();return}let onAbort=()=>settle2();abortSignal.addEventListener("abort",onAbort,{once:!0}),churnAbortCleanup=()=>{abortSignal.removeEventListener("abort",onAbort)}}));try{let[stdout,outcome]=await Promise.race(racers);if(typeof churnTimeout<"u")clearTimeout(churnTimeout);if(outcome==="timeout")throw Error(`git churn analysis failed: git log did not finish within ${GIT_CHURN_TIMEOUT_MS} ms (bounded; child tree killed)`);if(outcome==="aborted")throw Error(`git churn analysis failed: aborted by host cancellation (ctx.abort fired before the ${GIT_CHURN_TIMEOUT_MS} ms deadline; child tree killed)`);if(proc.spawnError)throw Error(`git churn analysis failed: ${proc.spawnError.message}`);if(proc.signalCode)throw Error(`git churn analysis failed: git log was killed by ${proc.signalCode} after exceeding the ${GIT_CHURN_TIMEOUT_MS} ms / ${GIT_CHURN_MAX_BUFFER_BYTES}-byte bound`);if(Buffer4.byteLength(stdout)>=GIT_CHURN_MAX_BUFFER_BYTES)throw Error(`git churn analysis failed: git log output reached the ${GIT_CHURN_MAX_BUFFER_BYTES}-byte buffer limit`);let lines=stdout.split(/\r?\n/);for(let line of lines){let normalizedPath=line.replace(/\\/g,"/");if(!normalizedPath||normalizedPath.trim()==="")continue;if(normalizedPath.includes("node_modules")||normalizedPath.includes("/.git/")||normalizedPath.includes("/dist/")||normalizedPath.includes("/build/")||normalizedPath.includes("__tests__"))continue;if(normalizedPath.includes(".test.")||normalizedPath.includes(".spec."))continue;churnMap.set(normalizedPath,(churnMap.get(normalizedPath)||0)+1)}}finally{if(typeof churnTimeout<"u")clearTimeout(churnTimeout);churnAbortCleanup?.();try{proc.kill()}catch{}}return churnMap}function getComplexityForFile2(filePath){try{if(fs197.statSync(filePath).size>MAX_FILE_SIZE_BYTES5)return null;let content=fs197.readFileSync(filePath,"utf-8");return estimateCyclomaticComplexity(content)}catch{return null}}async function analyzeHotspots(days,topN,extensions,directory,abortSignal){let churnMap=await getGitChurn(days,directory,abortSignal),extSet=new Set(extensions.map((e)=>e.startsWith(".")?e:`.${e}`)),filteredChurn=new Map;for(let[file3,count4]of churnMap){let ext=path334.extname(file3).toLowerCase();if(extSet.has(ext))filteredChurn.set(file3,count4)}let hotspots=[],cwd=directory,analyzedFiles=0;for(let[file3,churnCount]of filteredChurn){let fullPath=file3;if(!fs197.existsSync(fullPath))fullPath=path334.join(cwd,file3);let complexity=getComplexityForFile2(fullPath);if(complexity!==null){analyzedFiles++;let riskScore=Math.round(churnCount*Math.log2(Math.max(complexity,1))*10)/10,recommendation;if(riskScore>=50)recommendation="full_gates";else if(riskScore>=30)recommendation="security_review";else if(riskScore>=15)recommendation="enhanced_review";else recommendation="standard";hotspots.push({file:file3,churnCount,complexity,riskScore,recommendation})}}hotspots.sort((a,b)=>b.riskScore-a.riskScore);let topHotspots=hotspots.slice(0,topN),summary={fullGates:topHotspots.filter((h)=>h.recommendation==="full_gates").length,securityReview:topHotspots.filter((h)=>h.recommendation==="security_review").length,enhancedReview:topHotspots.filter((h)=>h.recommendation==="enhanced_review").length,standard:topHotspots.filter((h)=>h.recommendation==="standard").length};return{analyzedFiles,period:`${days} days`,hotspots:topHotspots,summary}}var complexity_hotspots=createSwarmTool({description:"Identify high-risk code hotspots by combining git churn frequency with cyclomatic complexity estimates. Returns files with their churn count, complexity score, risk score, and recommended review level.",args:{days:exports_external.number().optional().describe("Number of days of git history to analyze (default: 90, valid range: 1-365)"),top_n:exports_external.number().optional().describe("Number of top hotspots to return (default: 20, valid range: 1-100)"),extensions:exports_external.string().optional().describe('Comma-separated extensions to include (default: "ts,tsx,js,jsx,py,rs,ps1")')},async execute(args2,directory,ctx){if(!directory||typeof directory!=="string"||directory.trim()==="")return JSON.stringify({error:"project directory is required but was not provided",analyzedFiles:0,period:"0 days",hotspots:[],summary:{fullGates:0,securityReview:0,enhancedReview:0,standard:0}},null,2);let daysInput,topNInput,extensionsInput;try{if(args2&&typeof args2==="object"){let obj=args2;daysInput=typeof obj.days==="number"?obj.days:void 0,topNInput=typeof obj.top_n==="number"?obj.top_n:void 0,extensionsInput=typeof obj.extensions==="string"?obj.extensions:void 0}}catch{}let daysValidation=validateDays(daysInput);if(!daysValidation.valid){let errorResult={error:`invalid days: ${daysValidation.error}`,analyzedFiles:0,period:"0 days",hotspots:[],summary:{fullGates:0,securityReview:0,enhancedReview:0,standard:0}};return JSON.stringify(errorResult,null,2)}let topNValidation=validateTopN(topNInput);if(!topNValidation.valid){let errorResult={error:`invalid top_n: ${topNValidation.error}`,analyzedFiles:0,period:"0 days",hotspots:[],summary:{fullGates:0,securityReview:0,enhancedReview:0,standard:0}};return JSON.stringify(errorResult,null,2)}let extensionsValidation=validateExtensions(extensionsInput);if(!extensionsValidation.valid){let errorResult={error:`invalid extensions: ${extensionsValidation.error}`,analyzedFiles:0,period:"0 days",hotspots:[],summary:{fullGates:0,securityReview:0,enhancedReview:0,standard:0}};return JSON.stringify(errorResult,null,2)}let days=daysValidation.value,topN=topNValidation.value,extensions=extensionsValidation.value.split(",").map((e)=>e.trim());try{let result=await analyzeHotspots(days,topN,extensions,directory,ctx?.abort);return JSON.stringify(result,null,2)}catch(e){let errorResult={error:e instanceof Error?`analysis failed: ${e.message}`:"analysis failed: unknown error",analyzedFiles:0,period:`${days} days`,hotspots:[],summary:{fullGates:0,securityReview:0,enhancedReview:0,standard:0}};return JSON.stringify(errorResult,null,2)}}});init_zod();init_config2();init_schema();init_miner();init_miner();init_store4();async function mineAndStoreConsensusV1(options){let priorFingerprints=options.deps.priorFingerprints??await listConsensusProposalFingerprints(options.directory),result=await mineConsensus(options.directory,options.request,{...options.deps,priorFingerprints}),report=await writeConsensusReport(options.directory,result.report);return{...result,report}}init_store4();init_memory();init_recommendation_ledger();init_state();init_logger();init_create_tool();var MAX_FILTER_ENTRIES=200,FilterListSchema=exports_external.array(exports_external.string().min(1).max(512)).max(MAX_FILTER_ENTRIES),MAX_INLINE_ATTRIBUTES=25;function countSummaries(attributes,inlineLimit){let total=0,shown=0;for(let[index,attribute]of attributes.entries()){if(attribute.llmSummary===void 0)continue;if(total+=1,index<inlineLimit)shown+=1}return{total,hidden:total-shown}}function buildMinerRecommendationCandidates(report,sessionId){return report.proposals.map((proposal)=>({kind:"miner",target:proposal.target,statement:proposal.intent,scopeKeys:[],provenance:{mechanism:"consensus_mine",sourceEvidenceRefs:proposal.evidenceRefs,sourceRunIds:proposal.provenance.sourceRunIds,sourceModelIds:proposal.provenance.sourceModelIds,sourceTaskIds:proposal.provenance.sourceTaskIds},origin:{agentRole:"consensus_mine",...sessionId?{sessionId}:{},producedAt:report.generatedAt}}))}var MIRRORED_PROPOSAL_KIND="todo";async function mirrorProposalsToMemory(options){if(options.memoryConfig?.enabled!==!0)return{enabled:!1,attempted:0,proposed:0,rejected:0,failed:0};let proposals=options.report.proposals;if(proposals.length===0)return{enabled:!0,attempted:0,proposed:0,rejected:0,failed:0};let gateway;try{gateway=_internals290.createMemoryGateway({directory:options.directory,...options.sessionId?{sessionID:options.sessionId,runId:options.sessionId}:{},agentRole:"consensus_mine"},{config:options.memoryConfig})}catch(err){let message=err instanceof Error?err.message:String(err);return warn(`[consensus_mine] memory mirror unavailable (fail-open): ${message}`),{enabled:!0,attempted:proposals.length,proposed:0,rejected:0,failed:proposals.length,error:message}}let proposed=0,rejected2=0,failed=0,error93;try{for(let proposal of proposals)try{if((await gateway.propose({operation:"add",kind:MIRRORED_PROPOSAL_KIND,text:proposal.intent,rationale:`consensus_mine proposal from report ${options.report.reportId}, attribute ${proposal.sourceAttributeId} (target ${proposal.target}, confidence ${proposal.confidence})`,evidenceRefs:proposal.evidenceRefs})).status==="rejected")rejected2+=1;else proposed+=1}catch(err){failed+=1,error93??=err instanceof Error?err.message:String(err)}}finally{try{await gateway.dispose()}catch(err){warn(`[consensus_mine] memory gateway dispose failed: ${err instanceof Error?err.message:String(err)}`)}}if(error93!==void 0)warn(`[consensus_mine] memory mirror partially failed: ${error93}`);return{enabled:!0,attempted:proposals.length,proposed,rejected:rejected2,failed,...error93?{error:error93}:{}}}var _internals290={createMemoryGateway};var consensus_mine=createSwarmTool({description:"Mine cross-run consensus from existing .swarm evidence — evaluation runs, gate audits, gate "+"ground truth, task trajectories, PRM sessions, skill usage, knowledge outcomes, evidence "+"bundles, and curated failures (nine sources) — and persist an immutable report of "+`agreed-upon attributes plus proposals-only recommendations. It never activates a skill, writes a knowledge entry, admits a durable memory record, edits a project file, or mutates any evidence it reads. It is NOT otherwise write-minimal, so plan for these effects: it DELETES its own older reports past consensus.report_retention (default 50) on every run; it rewrites the shared recommendation dedup ledger whole, with FIFO eviction that can drop another producer's oldest entries; it leaves one never-removed lock sentinel per report id under .swarm/locks/; when memory.enabled is true it mirrors each proposal into a PENDING swarm-memory proposal (curator review still required); and when consensus.llm_summarization_enabled is true (the default) it issues up to ${MAX_LLM_SUMMARIES} session.create plus session.prompt calls. Under a knowledge or memory link the ledger and the memory store resolve to the shared cohort root, outside this project's .swarm/.`,args:{run_ids:FilterListSchema.optional().describe("Restrict mining to these run ids (raw or namespaced). Omit for all runs."),task_categories:FilterListSchema.optional().describe("Restrict to these evaluation task categories. Omit for all categories."),agent_roles:FilterListSchema.optional().describe("Restrict to these agent roles. Omit for all roles."),model_ids:FilterListSchema.optional().describe("Restrict to these model ids. Omit for all models."),min_support:exports_external.number().int().min(1).max(1e4).optional().describe("Distinct runs required to emit an attribute. Defaults to consensus.default_min_support."),min_successful_runs:exports_external.number().int().min(0).max(1e4).optional().describe("Successful runs required. Defaults to consensus.default_min_successful_runs."),max_evidence_items:exports_external.number().int().min(1).max(1e4).optional().describe("Cap on corpus observations read. Defaults to consensus.default_max_evidence_items.")},execute:async(args2,directory,ctx)=>{let input=args2??{},loaded=loadPluginConfigWithMeta(directory),config3=ConsensusConfigSchema.parse(loaded.config.consensus??{});if(!config3.enabled)return JSON.stringify({success:!1,disabled:!0,message:"Consensus mining is disabled (consensus.enabled = false). No report was written."},null,2);let request={...input.run_ids?{runIds:input.run_ids}:{},...input.task_categories?{taskCategories:input.task_categories}:{},...input.agent_roles?{agentRoles:input.agent_roles}:{},...input.model_ids?{modelIds:input.model_ids}:{},minSupport:input.min_support??config3.default_min_support,minSuccessfulRuns:input.min_successful_runs??config3.default_min_successful_runs,maxEvidenceItems:input.max_evidence_items??config3.default_max_evidence_items},client=swarmState.opencodeClient,dispatcher=config3.llm_summarization_enabled&&client?createEvaluationModelDispatcher(client):void 0,result=await mineAndStoreConsensusV1({directory,request,deps:{config:config3,...dispatcher?{dispatcher}:{},...ctx?.sessionID?{sessionId:ctx.sessionID}:{},agentRole:"consensus_mine"}}),report=result.report,ledger=await recordEmittedRecommendations(directory,buildMinerRecommendationCandidates(report,ctx?.sessionID),{producedAt:report.generatedAt});if(ledger.degraded)warn("[consensus_mine] recommendation ledger write degraded; proposals were not recorded for cross-producer dedup");let memoryMirror=await mirrorProposalsToMemory({directory,memoryConfig:loaded.config.memory,report,...ctx?.sessionID?{sessionId:ctx.sessionID}:{}}),pruned=await pruneConsensusReports(directory,config3.report_retention),pruningEnabled=config3.report_retention>0,summaries=countSummaries(report.attributes,MAX_INLINE_ATTRIBUTES);return JSON.stringify({success:!0,report_id:report.reportId,report_path:`.swarm/evolution/consensus/${report.reportId}.json`,generated_at:report.generatedAt,integrity_hash:report.integrityHash,config_hash:report.configHash,redaction_policy_version:report.redactionPolicyVersion,thresholds:{min_support:request.minSupport,min_successful_runs:request.minSuccessfulRuns,max_evidence_items:request.maxEvidenceItems,min_task_diversity:MIN_TASK_DIVERSITY_FOR_PROPOSAL,min_support_for_proposal:MIN_SUPPORT_FOR_PROPOSAL},input_run_count:report.inputIds.length,corpus:report.corpusHashes.map((entry)=>({source:entry.source,observations:entry.observations})),corpus_truncated:result.truncated,truncation:{corpus:report.truncation.corpus,observations_tallied:report.truncation.observations,input_ids_truncated:report.truncation.inputIds,total_input_ids:report.truncation.totalInputIds,attributes_dropped:report.truncation.attributesDropped},unreadable_sources:result.unreadableSources,attribute_count:report.attributes.length,investigation_note_count:result.investigationNoteCount,proposal_count:report.proposals.length,deduped_proposal_count:result.dedupedProposalCount,recommendation_ledger:{recorded:ledger.recorded,duplicate_recommendation_count:ledger.suppressed,evicted:ledger.evicted,degraded:ledger.degraded},memory_mirror:memoryMirror,summarized_count:summaries.total,summarized_but_not_shown:summaries.hidden,restatements_accepted_this_run:result.summarizedCount,...result.summarizationSkippedReason?{summarization_skipped_reason:result.summarizationSkippedReason}:{},attributes:report.attributes.slice(0,MAX_INLINE_ATTRIBUTES).map((attribute)=>({id:attribute.id,statement:attribute.statement,...attribute.llmSummary?{llm_summary:attribute.llmSummary}:{},support:attribute.support,success_support:attribute.successSupport,failure_support:attribute.failureSupport,task_diversity:attribute.taskDiversity,model_diversity:attribute.modelDiversity,confidence:attribute.confidence,proposed_target:attribute.proposedTarget,counterexample_count:attribute.counterexampleRefs.length})),attributes_truncated:report.attributes.length>MAX_INLINE_ATTRIBUTES,retention:pruningEnabled?{configured:config3.report_retention,pruning_enabled:!0,deleted:pruned.deleted.length,retained:pruned.retained.length,failed:pruned.failed.length,corrupt:pruned.corrupt.length}:{configured:config3.report_retention,pruning_enabled:!1,deleted:0,failed:0},guarantees:["proposals only — no skill activation, no knowledge write, no durable memory record, and no mutation of any evidence read",'model_diversity 0 means "not measurable from this corpus", never "measured as none"',`attributes below task diversity ${MIN_TASK_DIVERSITY_FOR_PROPOSAL} or below support ${MIN_SUPPORT_FOR_PROPOSAL} are investigation notes, never proposals`,"an attribute counting failing runs always carries counterexample refs (schema-enforced)","truncation is not biased toward successes, but it is still a cut: it balances per source, and drops whole sources once the budget is spent","statement is deterministic; llm_summary is an optional restatement excluded from integrity_hash","reproducible: identical corpus, request, config_hash, and prior proposals yield the same integrity_hash and report_id; model wording never moves it",'truncation is declared on the report; read failure_support 0 on a truncated report as "none survived the cut"']},null,2)}});init_config2();init_model_limits();init_state();init_create_tool();var _internals291={loadPluginConfig,fetchSessionMessages:async(sessionID,directory,limit=100)=>{if(!swarmState.opencodeClient?.session)return null;try{return(await swarmState.opencodeClient.session.messages({path:{id:sessionID},query:{directory,limit}})).data??null}catch{return null}}};function computeContextHeadroom(messages,warnThreshold=0.7,criticalThreshold=0.9,modelLimitsConfig={},liveContextLimit,modelIdentity,directory){let{modelID,providerID}=modelIdentity??extractModelInfo(messages),modelLimitResolution=resolveModelLimit(modelID,providerID,modelLimitsConfig,liveContextLimit,directory),modelLimit=modelLimitResolution.limit,usage=computeContextUsage(messages),usagePercent=usage.tokensUsed/modelLimit,thresholdCrossed="none";if(usagePercent>criticalThreshold)thresholdCrossed="critical";else if(usagePercent>warnThreshold)thresholdCrossed="warn";return{tokensUsed:usage.tokensUsed,usageSource:usage.source,modelLimit,modelLimitSource:modelLimitResolution.source,modelLimitResolution:modelLimitResolution.resolution,fallbackActive:modelLimitResolution.source==="provider_cap"||modelLimitResolution.source==="native"||modelLimitResolution.source==="fallback",usagePercent,thresholdCrossed,modelId:modelID??null,provider:providerID??null}}var context_status=createSwarmTool({allowWorkingDirectoryOverride:!0,description:"Report current context-window headroom for the active session. Returns tokens-used, usageSource (provider|estimated), model-limit with provenance (modelLimitSource: host|override|provider_cap|native|fallback; modelLimitResolution: user_provider_model|user_model|user_default|live_model_limit|static_provider_cap|static_native|static_default; fallbackActive: true when the denominator came from a static table or the flat 128k default — treat headroom as uncertain), usage-percent, threshold-state (none|warn|critical), model name, and provider. Pure read-only — no state mutation, no warning injection. Works whether context_budget.enabled is true or false.",args:{},async execute(_args,directory,ctx){let config3=_internals291.loadPluginConfig(directory),warnThreshold=config3.context_budget?.warn_threshold??0.7,criticalThreshold=config3.context_budget?.critical_threshold??0.9,modelLimitsConfig=config3.context_budget?.model_limits??{},messages=[];if(ctx?.sessionID){let sessionMessages=await _internals291.fetchSessionMessages(ctx.sessionID,directory);if(sessionMessages)messages=sessionMessages}let{modelID,providerID}=getLiveContextModelIdentity(ctx?.sessionID)??extractModelInfo(messages),headroom=computeContextHeadroom(messages,warnThreshold,criticalThreshold,modelLimitsConfig,getLiveContextWindow(ctx?.sessionID,{modelID,providerID}),{modelID,providerID},directory);return JSON.stringify(headroom,null,2)}});init_zod();init_loader();function pushCouncilAdvisory(session,synthesis){let dedupKey=`council:${synthesis.taskId}:${synthesis.roundNumber}`;if(synthesis.overallVerdict==="APPROVE"&&synthesis.advisoryFindings.length===0)return;if(session.pendingAdvisoryMessages??=[],session.pendingAdvisoryMessages.some((m)=>m.includes(dedupKey)))return;let blocking=synthesis.overallVerdict==="REJECT",header=`[${dedupKey}] (priority=HIGH, blocking=${blocking})`,body=synthesis.unifiedFeedbackMd;pushAdvisory(session,`${header}
7640
+ ${repairStep()}`}}init_logger();init_task_id();init_create_tool();init_resolve_working_directory();var EVIDENCE_DIR=".swarm/evidence";function isValidTaskId4(taskId){return isStrictTaskId(taskId)}function isPathWithinSwarm(filePath,workspaceRoot){let normalizedWorkspace=path332.resolve(workspaceRoot),swarmPath3=path332.join(normalizedWorkspace,".swarm","evidence");return path332.resolve(filePath).startsWith(swarmPath3)}function readEvidenceFile(evidencePath2){if(!fs195.existsSync(evidencePath2))return null;let content;try{content=fs195.readFileSync(evidencePath2,"utf-8")}catch{return null}let parsed;try{parsed=JSON.parse(content)}catch{return null}if(parsed&&typeof parsed==="object"&&Array.isArray(parsed.required_gates)&&typeof parsed.gates==="object"&&parsed.gates!==null)return parsed;return null}var check_gate_status=createSwarmTool({description:"Read-only tool to check the gate status of a specific task. Reads .swarm/evidence/{taskId}.json and returns structured JSON describing required, passed, and missing gates.",args:{task_id:exports_external.string().min(1).regex(/^\d+\.\d+(\.\d+)*$/,'Task ID must be in N.M or N.M.P format (e.g., "1.1", "1.2.3", "1.2.3.4")').describe('The task ID to check gate status for (e.g., "1.1", "2.3.1")'),working_directory:exports_external.string().optional().describe("Explicit project root directory. When provided, .swarm/evidence/ is resolved relative to this path instead of the plugin context directory. Use this when CWD differs from the actual project root.")},async execute(args2,directory){let taskIdInput,workingDirInput;try{if(args2&&typeof args2==="object"){let obj=args2;taskIdInput=typeof obj.task_id==="string"?obj.task_id:void 0,workingDirInput=typeof obj.working_directory==="string"?obj.working_directory:void 0}}catch{}let dirResult=resolveWorkingDirectory(workingDirInput,directory);if(!dirResult.success){let errorResult={taskId:taskIdInput??"",status:"no_evidence",required_gates:[],passed_gates:[],missing_gates:[],gates:{},message:dirResult.message,todo_scan:null};return JSON.stringify(errorResult,null,2)}directory=dirResult.directory;let todoGateConfig;try{todoGateConfig=loadPluginConfigWithMeta(directory).config.todo_gate}catch(configError){log("check_gate_status: todo_gate config load threw; TODO gate evaluation skipped",configError)}if(!taskIdInput)return JSON.stringify({taskId:"",status:"no_evidence",required_gates:[],passed_gates:[],missing_gates:[],gates:{},message:"Invalid task_id: task_id is required",todo_scan:null},null,2);if(!isValidTaskId4(taskIdInput)){let errorResult={taskId:taskIdInput,status:"no_evidence",required_gates:[],passed_gates:[],missing_gates:[],gates:{},message:`Invalid task_id format: "${taskIdInput}". Must match N.M or N.M.P (e.g. "1.1", "1.2.3", "1.2.3.4")`,todo_scan:null};return JSON.stringify(errorResult,null,2)}let evidencePath2=path332.join(directory,EVIDENCE_DIR,`${taskIdInput}.json`);if(!isPathWithinSwarm(evidencePath2,directory))return JSON.stringify({taskId:taskIdInput,status:"no_evidence",required_gates:[],passed_gates:[],missing_gates:[],gates:{},message:"Invalid path: evidence path validation failed",todo_scan:null},null,2);let evidenceData=readEvidenceFile(evidencePath2);if(!evidenceData){let errorResult={taskId:taskIdInput,status:"no_evidence",required_gates:[],passed_gates:[],missing_gates:[],gates:{},message:`No evidence file found for task "${taskIdInput}" at ${evidencePath2}. Evidence file may be missing or invalid.`,todo_scan:null};return JSON.stringify(errorResult,null,2)}let gatesMap=evidenceData.gates||{},authoritativeWorkflow=evidenceData.workflow?.schema===TASK_WORKFLOW_SCHEMA_MARKER,derivedGates=deriveApplicableGateSet(evidenceData,authoritativeWorkflow?{currentDeclaredFiles:readCurrentTaskDeclaredFiles(directory,taskIdInput)}:void 0),requiredGates=derivedGates.requiredGates,passedGates=derivedGates.satisfiedGates,missingGates=derivedGates.missingGates,readOnlyNoMutation=derivedGates.readOnlyNoMutation;try{let externalPlanPath=path332.join(directory,".swarm","plan.json"),externalPlanRaw=fs195.readFileSync(externalPlanPath,"utf-8"),externalPlan=JSON.parse(externalPlanRaw),declaredTask=(externalPlan.phases??[]).flatMap((phase)=>phase.tasks??[]).find((task2)=>task2.id===taskIdInput);if(declaredTask&&declaredTask.evidence_class==="external_git"&&typeof externalPlan.title==="string"&&typeof externalPlan.swarm==="string"){let proofCurrent=externalProofCurrent({title:externalPlan.title,swarm:externalPlan.swarm},declaredTask,evidenceData),externalWorkflowMeta=evidenceData.workflow&&typeof evidenceData.workflow==="object"&&typeof evidenceData.workflow.state==="string"?{state:evidenceData.workflow.state,generation:typeof evidenceData.workflow.generation==="number"?evidenceData.workflow.generation:0}:null,externalResult=proofCurrent?{taskId:taskIdInput,status:"all_passed",required_gates:["external_attest"],passed_gates:["external_attest"],missing_gates:[],gates:gatesMap,message:`External evidence attested: task "${taskIdInput}" is satisfied by its pinned external_git anchors (issue #3422).`,todo_scan:evidenceData.todo_scan??null,workflow:externalWorkflowMeta}:{taskId:taskIdInput,status:"incomplete",required_gates:["external_attest"],passed_gates:[],missing_gates:["external_attest"],gates:gatesMap,message:`Task "${taskIdInput}" declares external_git evidence but no matched attestation exists yet. Run /swarm attest ${taskIdInput} (or re-plan it as a thin coder dispatch).`,todo_scan:evidenceData.todo_scan??null,workflow:externalWorkflowMeta};return JSON.stringify(externalResult,null,2)}}catch{}let status2=missingGates.length===0&&(readOnlyNoMutation||evidenceData.workflow?.state==="tests_run"||evidenceData.workflow?.state==="complete")?"all_passed":"incomplete",message;if(status2==="all_passed")message=`All required gates have passed for task "${taskIdInput}".`;else if(requiredGates.length===0)message=`Task "${taskIdInput}" is incomplete. No required gates are configured for this task generation.`;else message=`Task "${taskIdInput}" is incomplete. Missing gates: ${missingGates.join(", ")}.`;let secretscanVerdict="not_run";try{let evidenceResult=await loadEvidence(directory,taskIdInput);if(evidenceResult.status==="found"){let secretscanEntries=evidenceResult.bundle.entries.filter((entry)=>entry.type==="secretscan");if(secretscanEntries.length>0){let lastSecretscan=secretscanEntries[secretscanEntries.length-1];if(isSecretscanEvidence(lastSecretscan)){let{incomplete_files:incompleteFiles,incomplete_paths:incompletePaths}=lastSecretscan,findingsCount=lastSecretscan.findings_count??0,hasIncompleteCoverage=incompleteFiles>0||incompletePaths.length>0,newFindingsRaw=lastSecretscan.new_findings_count,preexistingRaw=lastSecretscan.preexisting_findings_count,newFindingsValid=typeof newFindingsRaw==="number"&&Number.isSafeInteger(newFindingsRaw)&&newFindingsRaw>=0,preexistingValid=typeof preexistingRaw==="number"&&Number.isSafeInteger(preexistingRaw)&&preexistingRaw>=0,newFindingsBasis=newFindingsValid?newFindingsRaw:findingsCount;if(newFindingsValid&&preexistingValid&&newFindingsRaw+preexistingRaw!==findingsCount)newFindingsBasis=findingsCount;let hasNewFindings=newFindingsBasis>0,policySkipped=lastSecretscan.policy_skipped_files,requestedFilesCount=lastSecretscan.requested_files,vacuousCoverage=lastSecretscan.files_scanned===0&&typeof policySkipped==="number"&&Number.isSafeInteger(policySkipped)&&policySkipped>=0&&typeof requestedFilesCount==="number"&&Number.isSafeInteger(requestedFilesCount)&&requestedFilesCount>0&&policySkipped>=requestedFilesCount&&findingsCount===0&&incompleteFiles===0&&incompletePaths.length===0,hasZeroCoverage=lastSecretscan.files_scanned===0&&!vacuousCoverage;if(hasIncompleteCoverage||hasNewFindings||hasZeroCoverage||lastSecretscan.verdict==="fail"||lastSecretscan.verdict==="rejected")if(secretscanVerdict="fail",hasIncompleteCoverage&&!hasNewFindings){if(missingGates.push("secretscan (BLOCKED — incomplete coverage)"),status2==="all_passed")status2="incomplete";message=`BLOCKED: Secretscan incomplete coverage in prior scan. ${message}`}else if(hasNewFindings&&hasIncompleteCoverage){if(missingGates.push("secretscan (BLOCKED — secrets detected; incomplete coverage)"),status2==="all_passed")status2="incomplete";message=`BLOCKED: Secretscan found secrets and incomplete coverage in prior scan (${newFindingsBasis} new on changed lines). ${message}`}else if(hasNewFindings){if(missingGates.push("secretscan (BLOCKED — secrets detected)"),status2==="all_passed")status2="incomplete";message=`BLOCKED: Secretscan found secrets in prior scan (${newFindingsBasis} new on changed lines${findingsCount>newFindingsBasis?`, ${findingsCount} total`:""}). ${message}`}else if(hasZeroCoverage){if(missingGates.push("secretscan (BLOCKED — zero coverage)"),status2==="all_passed")status2="incomplete";message=`BLOCKED: Secretscan scanned zero files in prior scan. ${message}`}else{if(missingGates.push("secretscan (BLOCKED — zero coverage)"),status2==="all_passed")status2="incomplete";message=`BLOCKED: Secretscan verdict failed without new findings or coverage gaps (possible truncation or tampering). ${message}`}else if(lastSecretscan.verdict==="pass"||lastSecretscan.verdict==="approved"||lastSecretscan.verdict==="info"){if(secretscanVerdict="pass",vacuousCoverage)message+=` Advisory: Secretscan coverage was vacuous (${lastSecretscan.policy_skipped_files} of ${lastSecretscan.requested_files} requested file(s) skipped by scan policy).`;else if(findingsCount>0)message+=` Advisory: ${findingsCount} pre-existing secret finding(s) remain visible (non-gating; secretscan green = zero new secrets on changed lines).`}}}else message+=" Advisory: No secretscan evidence found for this task. Consider running secretscan."}else if(evidenceResult.status==="invalid_schema")secretscanVerdict="fail",missingGates.push("secretscan (BLOCKED — invalid evidence)"),status2="incomplete",message=`BLOCKED: Secretscan evidence is invalid and cannot prove complete coverage. ${message}`}catch{}let todoScan=evidenceData.todo_scan,todoVerdict=evaluateTodoGate(todoScan,todoGateConfig);if(todoVerdict.status==="exceeded")if(todoVerdict.blocked){if(missingGates.push(`todo_gate (BLOCKED — ${todoVerdict.count} high-priority TODOs exceed max ${todoVerdict.max})`),status2==="all_passed")status2="incomplete";message=`BLOCKED: TODO gate threshold exceeded. ${todoVerdict.message} ${message}`}else message+=` Advisory: todo_gate threshold exceeded — ${todoVerdict.count} high-priority TODOs (FIXME/HACK/XXX) exceed max_high_priority=${todoVerdict.max}.`;let workflowMeta=evidenceData.workflow&&typeof evidenceData.workflow==="object"&&typeof evidenceData.workflow.state==="string"?{state:evidenceData.workflow.state,generation:typeof evidenceData.workflow.generation==="number"?evidenceData.workflow.generation:0}:null,currentPlanIdentity=resolveCurrentPlanIdentitySync(dirResult.directory),evidencePlanIdentityHash=evidenceData?.planIdentityHash,priorCampaignEvidence;if(currentPlanIdentity!=null&&evidencePlanIdentityHash!==void 0&&evidencePlanIdentityHash!==currentPlanIdentity.planIdentityHash)priorCampaignEvidence="Evidence for this task predates the current plan campaign (plan-identity stamp names a different plan). Its gates may not satisfy the current campaign receipts (status above is unchanged and advisory only); run repair_gate_evidence for this task to rebuild current-campaign evidence.",message+=` ${priorCampaignEvidence}`;let workflowAttributionHint;if(status2==="incomplete"&&workflowMeta?.state==="coder_delegated"&&!gatesMap.pre_check)workflowAttributionHint="Task is settled at coder_delegated but Stage A (pre_check_batch) was never attributed — "+`reviewer/test_engineer dispatches will be denied with TASK_WORKFLOW_STAGE_A_REQUIRED. Run pre_check_batch on the task's changed files; if it passes without advancing this task, run /swarm recover ${taskIdInput}.`,message+=` ${workflowAttributionHint}`;let result={taskId:taskIdInput,status:status2,required_gates:requiredGates,passed_gates:passedGates,missing_gates:missingGates,gates:gatesMap,message,todo_scan:todoScan??null,secretscan_verdict:secretscanVerdict,workflow:workflowMeta,...workflowAttributionHint?{workflow_attribution_hint:workflowAttributionHint}:{},...priorCampaignEvidence?{prior_campaign_evidence:priorCampaignEvidence}:{}};return JSON.stringify(result,null,2)}});init_checkpoint();init_co_change_analyzer();init_zod();init_loader();init_pr_workflow_gate();init_create_tool();var CompletePrWorkflowArgsSchema=exports_external.object({mode:exports_external.enum(["PR_REVIEW","PR_FEEDBACK"]),pr_head_sha:exports_external.string().trim().min(1).max(80),report_verdict:exports_external.enum(["APPROVE","REQUEST_CHANGES","INCOMPLETE"]).optional()}).strict().superRefine((value,ctx)=>{if(value.mode==="PR_REVIEW"&&value.report_verdict===void 0)ctx.addIssue({code:"custom",path:["report_verdict"],message:"is required for PR_REVIEW completion (issue #2383 terminal report)"})});async function executeCompletePrWorkflow(args2,directory,context={}){let parsed=CompletePrWorkflowArgsSchema.safeParse(args2);if(!parsed.success)return JSON.stringify({success:!1,message:`Invalid PR workflow completion: ${parsed.error.issues.map((issue3)=>`${issue3.path.join(".")}: ${issue3.message}`).join("; ")}`});if(!context.sessionID?.trim())return JSON.stringify({success:!1,message:"PR workflow completion requires an active sessionID"});let staleDisclosure={},laneLiveness;try{let config3=loadPluginConfig(directory),hooks2=config3.hooks;laneLiveness={laneLivenessWatchdog:config3.lane_liveness_watchdog,backgroundPendingTimeoutMs:hooks2?.background_pending_timeout_minutes!==void 0?hooks2.background_pending_timeout_minutes*60000:void 0}}catch{}try{let settlement=await _internals288.settlePresumedStalePrWorkflowLanes(directory,context.sessionID,laneLiveness);if(settlement.presumedStaleLaneIds.length>0)staleDisclosure={presumed_stale_lanes:settlement.presumedStaleLaneIds,presumed_stale_disclosure:settlement.disclosure};if(settlement.probedAliveLaneIds?.length)staleDisclosure.probe_retained_lanes=settlement.probedAliveLaneIds;if(settlement.probeDegradedReason)staleDisclosure.probe_status=settlement.probeDegradedReason;if(settlement.horizonConflictNote)staleDisclosure.horizon_conflict=settlement.horizonConflictNote}catch{}let amendmentDisclosure={};try{let gateState=await _internals288.readPrWorkflowGateState(directory,context.sessionID);if(gateState?.prFeedbackInventoryAmendments?.length)amendmentDisclosure={inventory_amendments:gateState.prFeedbackInventoryAmendments}}catch{}try{let terminalReport;if(parsed.data.mode==="PR_REVIEW"){let coverage=null;try{coverage=await _internals288.readPrReviewTerminalCoverageForReport(directory,context.sessionID)}catch{}if(coverage){let findingPolicy;try{findingPolicy=await _internals288.readPrReviewFinalFindingPolicyForReport(directory,context.sessionID)}catch{}terminalReport={kind:coverage.kind,covered_dimensions:coverage.coveredDimensions,unresolved_dimensions:coverage.unresolvedDimensions,live_dimensions:coverage.liveDimensions,allowed_verdicts:findingPolicy?.permittedVerdicts??coverage.allowedVerdicts,...findingPolicy?{finding_policy_version:findingPolicy.policyVersion,blocking_finding_ids:findingPolicy.blockingFindingIds}:{},report_verdict:parsed.data.report_verdict,...((summary)=>summary?{findings_summary:summary}:{})(await findingsSummaryForReportSafe(directory,context.sessionID)),coverage_degradations:await coverageDegradationsForReportSafe(directory,context.sessionID),verdict_settlement:await verdictSettlementSummaryForReportSafe(directory,context.sessionID)}}}let status2=await _internals288.completePrWorkflow(directory,context.sessionID,parsed.data.mode,parsed.data.pr_head_sha,parsed.data.mode==="PR_REVIEW"?{reportVerdict:parsed.data.report_verdict,...laneLiveness?{laneLiveness}:{}}:laneLiveness?{laneLiveness}:void 0),checkoutRestoreRequired=!1,checkoutRestoreReceipts=[];if(status2==="completed"){if(parsed.data.mode==="PR_REVIEW"&&parsed.data.report_verdict==="INCOMPLETE"&&terminalReport)terminalReport.allowed_verdicts=["INCOMPLETE"];try{checkoutRestoreReceipts=await _internals288.listPendingPrWorkflowCheckoutRestores(directory,context.sessionID),checkoutRestoreRequired=checkoutRestoreReceipts.length>0}catch{checkoutRestoreRequired=!0}}return JSON.stringify({success:!0,mode:parsed.data.mode,pr_head_sha:parsed.data.pr_head_sha,status:status2,ready_to_publish:status2==="ready-to-publish",verified_no_change:status2==="verified-no-change",gate_cleared:status2==="completed"||status2==="verified-no-change",checkout_restore_required:checkoutRestoreRequired,checkout_restore_receipts:checkoutRestoreReceipts,...terminalReport?{terminal_report:terminalReport}:{},...staleDisclosure,...amendmentDisclosure})}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:String(error93),...staleDisclosure,...amendmentDisclosure})}}var complete_pr_workflow=createSwarmTool({description:"Validate terminal PR workflow coverage. After the ordered PR_FEEDBACK gates permit one standalone commit, the first call requires a clean tree and a non-merge direct child of intake HEAD, then binds its structured upstream target; the second clears only after both the local tracking ref and an actual-remote query point to that exact commit. A cleared result reports checkout_restore_required when preserved pre-workflow changes must be restored.",args:{mode:CompletePrWorkflowArgsSchema.shape.mode,pr_head_sha:CompletePrWorkflowArgsSchema.shape.pr_head_sha,report_verdict:CompletePrWorkflowArgsSchema.shape.report_verdict},execute:executeCompletePrWorkflow}),_internals288={completePrWorkflow,listPendingPrWorkflowCheckoutRestores,readPrWorkflowGateState,readPrReviewTerminalCoverageForReport,readPrReviewFinalFindingPolicyForReport,settlePresumedStalePrWorkflowLanes,verdictSettlementSummaryForReportSafe};async function verdictSettlementSummaryForReport(directory,sessionID){let{readPrReviewVerdictSettlementReceiptItems:readPrReviewVerdictSettlementReceiptItems2}=await Promise.resolve().then(() => (init_pr_workflow_gate(),exports_pr_workflow_gate));return readPrReviewVerdictSettlementReceiptItems2(directory,sessionID)}async function verdictSettlementSummaryForReportSafe(directory,sessionID){try{return await verdictSettlementSummaryForReport(directory,sessionID)}catch{return}}async function findingsSummaryForReport(directory,sessionID){let{readAuthoritativeFindingPolicy:readAuthoritativeFindingPolicy2}=await Promise.resolve().then(() => (init_pr_workflow_gate(),exports_pr_workflow_gate)),state2=await readPrWorkflowGateState(directory,sessionID);if(!state2)throw Error("BLOCKED: no active PR workflow gate state");let{policyFindings}=await readAuthoritativeFindingPolicy2(directory,state2),severityAxes=new Set(["CRITICAL","HIGH","MEDIUM","LOW","INFO","NONE"]),bySeverity={};for(let finding of policyFindings){let axis=severityAxes.has(finding.severity)?finding.severity:"OTHER";bySeverity[axis]=(bySeverity[axis]??0)+1}return{total:policyFindings.length,by_severity:bySeverity}}async function findingsSummaryForReportSafe(directory,sessionID){try{return await findingsSummaryForReport(directory,sessionID)}catch{return}}var MAX_TERMINAL_COVERAGE_DEGRADATIONS=10,MAX_TERMINAL_DEGRADATION_REASON_CHARS=200,MAX_TERMINAL_DEGRADATION_ID_CHARS=200;function boundTerminalText(value,max){return value.slice(0,max)}function redactTerminalCleanLiteral(value){return value.includes("CLEAN")?value.split("CLEAN").join("clean-attestation"):value}async function coverageDegradationsForReport(directory,sessionID){let state2=await readPrWorkflowGateState(directory,sessionID);if(!state2)return[];let{readPrReviewTriggerReceiptForGate:readPrReviewTriggerReceiptForGate2}=await Promise.resolve().then(() => (init_pr_review_trigger_receipt_reader(),exports_pr_review_trigger_receipt_reader)),read=readPrReviewTriggerReceiptForGate2(directory,state2.prReviewTriggerEvalPath??null);if("noReceipt"in read)return[];return read.receipt.coverageDegradations.slice(0,MAX_TERMINAL_COVERAGE_DEGRADATIONS).map((degradation)=>({trigger_id:degradation.trigger_id,source_batch_id:boundTerminalText(redactTerminalCleanLiteral(degradation.source_batch_id),MAX_TERMINAL_DEGRADATION_ID_CHARS),source_lane_id:boundTerminalText(redactTerminalCleanLiteral(degradation.source_lane_id),MAX_TERMINAL_DEGRADATION_ID_CHARS),reason:boundTerminalText(redactTerminalCleanLiteral(degradation.reason),MAX_TERMINAL_DEGRADATION_REASON_CHARS)}))}async function coverageDegradationsForReportSafe(directory,sessionID){try{return await coverageDegradationsForReport(directory,sessionID)}catch{return[]}}init_zod();init_utils2();init_state();init_swarm_artifact_cache();init_create_tool();init_resolve_working_directory();import*as fs196 from"node:fs";import*as path333 from"node:path";function extractMatches(regex,text){return Array.from(text.matchAll(regex))}function parseIdentifiers(description){let identifiers=new Set,backtickRegex=/`([^`]+)`/g;for(let match of extractMatches(backtickRegex,description))identifiers.add(match[1]);let camelCaseRegex=/\b([a-z][a-zA-Z0-9]{2,})\b/g;for(let match of extractMatches(camelCaseRegex,description)){let word=match[1];if(word==="the"||word==="and"||word==="for"||word==="have"||word==="this"||word==="with"||word==="from"||word==="they"||word==="been"||word==="will"||word==="your"||word==="also")continue;identifiers.add(word)}let pascalCaseRegex=/\b([A-Z][a-zA-Z0-9]{2,})\b/g;for(let match of extractMatches(pascalCaseRegex,description))identifiers.add(match[1]);let configKeyRegex=/\b([a-z][a-zA-Z0-9]*(?:\.[a-z][a-zA-Z0-9]*)+)\b/g;for(let match of extractMatches(configKeyRegex,description))identifiers.add(match[1]);let quotedPathRegex=/['"](\.{0,3}(?:src|lib|test)[/\\][^'"]+)['"]/g;for(let match of extractMatches(quotedPathRegex,description))identifiers.add(match[1]);return Array.from(identifiers)}function parseFilePaths(description,filesTouched){if(filesTouched&&Array.isArray(filesTouched)&&filesTouched.length>0)return filesTouched;let filePaths=[],srcPathRegex=/\b(?:src|lib|test|app|packages?)[/\\][a-zA-Z0-9_./-]+\.(?:ts|tsx|js|jsx|mjs|cjs)\b/g;for(let match of extractMatches(srcPathRegex,description))filePaths.push(match[0]);let genericPathRegex=/\b[a-zA-Z0-9_./-]+[/\\][a-zA-Z0-9_./-]+\.[a-zA-Z0-9]+(?=\s|$|[.,;])/g;for(let match of extractMatches(genericPathRegex,description)){let pathStr=match[0];if(pathStr.includes("src/")||pathStr.includes("src\\")||pathStr.includes("lib/")||pathStr.includes("lib\\")||pathStr.includes("test/")||pathStr.includes("test\\"))filePaths.push(pathStr)}return filePaths}function buildVerifySummary(tasksChecked,tasksSkipped,tasksBlocked){if(tasksBlocked>0)return`Blocked: ${tasksBlocked} task(s) with missing identifiers`;let verified=tasksChecked-tasksSkipped;if(tasksSkipped===tasksChecked)return`All ${tasksChecked} completed task(s) skipped — research/inventory tasks`;if(tasksSkipped>0)return`${verified} task(s) verified, ${tasksSkipped} skipped (research tasks)`;return`All ${tasksChecked} completed tasks verified successfully`}async function executeCompletionVerify(args2,directory){let phase=Number(args2.phase);if(Number.isNaN(phase)||phase<1||!Number.isFinite(phase))return JSON.stringify({success:!1,phase,status:"blocked",reason:"Invalid phase number",tasksChecked:0,tasksSkipped:0,tasksBlocked:0,blockedTasks:[]},null,2);if(hasActiveTurboMode(args2.sessionID))return JSON.stringify({success:!0,phase,status:"passed",reason:"Turbo Mode active — completion verification bypassed",tasksChecked:0,tasksSkipped:0,tasksBlocked:0,blockedTasks:[]},null,2);let plan;try{let planPath=validateSwarmPath(directory,"plan.json"),planRaw=fs196.readFileSync(planPath,"utf-8");plan=JSON.parse(planRaw)}catch{return JSON.stringify({success:!0,phase,status:"passed",reason:"Cannot verify without plan.json",tasksChecked:0,tasksSkipped:0,tasksBlocked:0,blockedTasks:[]},null,2)}let targetPhase=plan.phases.find((p)=>p.id===phase);if(!targetPhase){let result2={success:!1,phase,status:"blocked",reason:`Phase ${phase} not found in plan.json`,tasksChecked:0,tasksSkipped:0,tasksBlocked:0,blockedTasks:[]};return JSON.stringify(result2,null,2)}let tasksChecked=0,tasksSkipped=0,tasksBlocked=0,blockedTasks=[];for(let task2 of targetPhase.tasks){if(task2.status!=="completed")continue;tasksChecked++;let fileTargets=parseFilePaths(task2.description,task2.files_touched),identifiers=parseIdentifiers(task2.description);if(fileTargets.length===0){tasksSkipped++;continue}if(identifiers.length===0){blockedTasks.push({task_id:task2.id,identifier:"",file_path:"",reason:"No identifiers — cannot verify completion without identifiers"}),tasksBlocked++;continue}let foundIdentifiers=new Set,hasFileReadFailure=!1;for(let filePath of fileTargets){let normalizedPath=filePath.replace(/\\/g,"/"),resolvedPath=path333.resolve(directory,normalizedPath),projectRoot=path333.resolve(directory),relative88=path333.relative(projectRoot,resolvedPath);if(!(relative88===""||!relative88.startsWith("..")&&!path333.isAbsolute(relative88))){blockedTasks.push({task_id:task2.id,identifier:"",file_path:filePath,reason:`File path '${filePath}' escapes the project directory — cannot verify completion`}),hasFileReadFailure=!0;continue}let fileContent;try{fileContent=fs196.readFileSync(resolvedPath,"utf-8")}catch{blockedTasks.push({task_id:task2.id,identifier:"",file_path:filePath,reason:`File '${filePath}' not found — cannot verify completion`}),hasFileReadFailure=!0;continue}for(let identifier of identifiers)if(fileContent.includes(identifier))foundIdentifiers.add(identifier)}let foundCount=foundIdentifiers.size;if(hasFileReadFailure||foundCount===0){if(!hasFileReadFailure)blockedTasks.push({task_id:task2.id,identifier:"",file_path:"",reason:"No identifiers found in target files"});tasksBlocked++}}let now2=new Date().toISOString(),result={success:tasksBlocked===0,phase,status:tasksBlocked===0?"passed":"blocked",reason:tasksBlocked>0?`COMPLETION_INCOMPLETE: ${tasksBlocked} task(s) blocked — missing identifiers or target files`:void 0,tasksChecked,tasksSkipped,tasksBlocked,blockedTasks};if(args2.writeEvidence!==!1)try{let evidenceDir=path333.join(directory,".swarm","evidence",`${phase}`),evidencePath2=path333.join(evidenceDir,"completion-verify.json");fs196.mkdirSync(evidenceDir,{recursive:!0});let evidenceBundle={schema_version:"1.0.0",task_id:"completion-verify",created_at:now2,entries:[{task_id:"completion-verify",type:"completion_verify",timestamp:now2,agent:"completion_verify",verdict:tasksBlocked===0?"pass":"fail",summary:buildVerifySummary(tasksChecked,tasksSkipped,tasksBlocked),phase,tasks_checked:tasksChecked,tasks_skipped:tasksSkipped,tasks_blocked:tasksBlocked,blocked_tasks:blockedTasks}]};fs196.writeFileSync(evidencePath2,JSON.stringify(evidenceBundle,null,2),"utf-8"),invalidateCachedArtifact(evidencePath2)}catch{}return JSON.stringify(result,null,2)}var completion_verify=createSwarmTool({description:"Deterministic pre-check verifying that plan task identifiers exist in their target source files before phase completion. Blocks if obviously incomplete.",args:{phase:exports_external.number().describe("The phase number to check"),sessionID:exports_external.string().optional().describe("Session ID for tracking state (auto-provided by plugin context)"),working_directory:exports_external.string().optional().describe("Explicit project root directory. When provided, .swarm/ is resolved relative to this path instead of the plugin context directory. Use this when CWD differs from the actual project root.")},execute:async(args2,directory)=>{let parsedArgs;try{if(args2&&typeof args2==="object"){let obj=args2;parsedArgs={phase:typeof obj.phase==="number"?obj.phase:typeof obj.phase==="string"?Number(obj.phase):0,sessionID:typeof obj.sessionID==="string"?obj.sessionID:void 0,working_directory:typeof obj.working_directory==="string"?obj.working_directory:void 0}}else parsedArgs={phase:0}}catch{return JSON.stringify({success:!1,phase:0,status:"blocked",reason:"Invalid arguments",tasksChecked:0,tasksSkipped:0,tasksBlocked:0,blockedTasks:[]},null,2)}let dirResult=resolveWorkingDirectory(parsedArgs.working_directory,directory);if(!dirResult.success)return JSON.stringify({success:!1,phase:parsedArgs.phase,status:"blocked",reason:dirResult.message,tasksChecked:0,tasksSkipped:0,tasksBlocked:0,blockedTasks:[]},null,2);return executeCompletionVerify(parsedArgs,dirResult.directory)}});init_zod();init_metrics();init_bun_compat();init_git_executable();init_create_tool();init_path_security();import{Buffer as Buffer4}from"node:buffer";import*as fs197 from"node:fs";import*as path334 from"node:path";var MAX_FILE_SIZE_BYTES5=262144,DEFAULT_DAYS=90,DEFAULT_TOP_N2=20,DEFAULT_EXTENSIONS="ts,tsx,js,jsx,py,rs,ps1",SHELL_METACHAR_REGEX=/[;&|%$`\\]/;function validateDays(days){if(typeof days>"u")return{valid:!0,value:DEFAULT_DAYS,error:null};if(typeof days!=="number"||!Number.isInteger(days))return{valid:!1,value:0,error:"days must be an integer"};if(days<1||days>365)return{valid:!1,value:0,error:"days must be between 1 and 365"};return{valid:!0,value:days,error:null}}function validateTopN(topN){if(typeof topN>"u")return{valid:!0,value:DEFAULT_TOP_N2,error:null};if(typeof topN!=="number"||!Number.isInteger(topN))return{valid:!1,value:0,error:"top_n must be an integer"};if(topN<1||topN>100)return{valid:!1,value:0,error:"top_n must be between 1 and 100"};return{valid:!0,value:topN,error:null}}function validateExtensions(extensions){if(typeof extensions>"u")return{valid:!0,value:DEFAULT_EXTENSIONS,error:null};if(typeof extensions!=="string")return{valid:!1,value:"",error:"extensions must be a string"};if(containsControlChars(extensions))return{valid:!1,value:"",error:"extensions contains control characters"};if(SHELL_METACHAR_REGEX.test(extensions))return{valid:!1,value:"",error:"extensions contains shell metacharacters (;|&%$`\\)"};if(!/^[a-zA-Z0-9,.]+$/.test(extensions))return{valid:!1,value:"",error:"extensions contains invalid characters (only alphanumeric, commas, dots allowed)"};return{valid:!0,value:extensions,error:null}}var _internals289={bunSpawn,resolveGitExecutable},GIT_CHURN_TIMEOUT_MS=1e4,GIT_CHURN_MAX_BUFFER_BYTES=5242880;async function getGitChurn(days,directory,abortSignal){let churnMap=new Map,proc=_internals289.bunSpawn([_internals289.resolveGitExecutable(),"log",`--since=${days} days ago`,"--name-only","--pretty=format:"],{stdout:"pipe",stderr:"pipe",stdin:"ignore",cwd:directory,timeout:GIT_CHURN_TIMEOUT_MS,maxBuffer:GIT_CHURN_MAX_BUFFER_BYTES,killProcessTree:!0,env:{...process.env,GIT_TERMINAL_PROMPT:"0"}}),churnTimeout,churnAbortCleanup,racers=[Promise.all([proc.stdout.text(),proc.exited]).then((churnOutput)=>churnOutput),new Promise((resolve132)=>{churnTimeout=setTimeout(()=>resolve132([null,"timeout"]),GIT_CHURN_TIMEOUT_MS)})];if(abortSignal!==void 0)racers.push(new Promise((resolve132)=>{let settle2=()=>resolve132([null,"aborted"]);if(abortSignal.aborted){settle2();return}let onAbort=()=>settle2();abortSignal.addEventListener("abort",onAbort,{once:!0}),churnAbortCleanup=()=>{abortSignal.removeEventListener("abort",onAbort)}}));try{let[stdout,outcome]=await Promise.race(racers);if(typeof churnTimeout<"u")clearTimeout(churnTimeout);if(outcome==="timeout")throw Error(`git churn analysis failed: git log did not finish within ${GIT_CHURN_TIMEOUT_MS} ms (bounded; child tree killed)`);if(outcome==="aborted")throw Error(`git churn analysis failed: aborted by host cancellation (ctx.abort fired before the ${GIT_CHURN_TIMEOUT_MS} ms deadline; child tree killed)`);if(proc.spawnError)throw Error(`git churn analysis failed: ${proc.spawnError.message}`);if(proc.signalCode)throw Error(`git churn analysis failed: git log was killed by ${proc.signalCode} after exceeding the ${GIT_CHURN_TIMEOUT_MS} ms / ${GIT_CHURN_MAX_BUFFER_BYTES}-byte bound`);if(Buffer4.byteLength(stdout)>=GIT_CHURN_MAX_BUFFER_BYTES)throw Error(`git churn analysis failed: git log output reached the ${GIT_CHURN_MAX_BUFFER_BYTES}-byte buffer limit`);let lines=stdout.split(/\r?\n/);for(let line of lines){let normalizedPath=line.replace(/\\/g,"/");if(!normalizedPath||normalizedPath.trim()==="")continue;if(normalizedPath.includes("node_modules")||normalizedPath.includes("/.git/")||normalizedPath.includes("/dist/")||normalizedPath.includes("/build/")||normalizedPath.includes("__tests__"))continue;if(normalizedPath.includes(".test.")||normalizedPath.includes(".spec."))continue;churnMap.set(normalizedPath,(churnMap.get(normalizedPath)||0)+1)}}finally{if(typeof churnTimeout<"u")clearTimeout(churnTimeout);churnAbortCleanup?.();try{proc.kill()}catch{}}return churnMap}function getComplexityForFile2(filePath){try{if(fs197.statSync(filePath).size>MAX_FILE_SIZE_BYTES5)return null;let content=fs197.readFileSync(filePath,"utf-8");return estimateCyclomaticComplexity(content)}catch{return null}}async function analyzeHotspots(days,topN,extensions,directory,abortSignal){let churnMap=await getGitChurn(days,directory,abortSignal),extSet=new Set(extensions.map((e)=>e.startsWith(".")?e:`.${e}`)),filteredChurn=new Map;for(let[file3,count4]of churnMap){let ext=path334.extname(file3).toLowerCase();if(extSet.has(ext))filteredChurn.set(file3,count4)}let hotspots=[],cwd=directory,analyzedFiles=0;for(let[file3,churnCount]of filteredChurn){let fullPath=file3;if(!fs197.existsSync(fullPath))fullPath=path334.join(cwd,file3);let complexity=getComplexityForFile2(fullPath);if(complexity!==null){analyzedFiles++;let riskScore=Math.round(churnCount*Math.log2(Math.max(complexity,1))*10)/10,recommendation;if(riskScore>=50)recommendation="full_gates";else if(riskScore>=30)recommendation="security_review";else if(riskScore>=15)recommendation="enhanced_review";else recommendation="standard";hotspots.push({file:file3,churnCount,complexity,riskScore,recommendation})}}hotspots.sort((a,b)=>b.riskScore-a.riskScore);let topHotspots=hotspots.slice(0,topN),summary={fullGates:topHotspots.filter((h)=>h.recommendation==="full_gates").length,securityReview:topHotspots.filter((h)=>h.recommendation==="security_review").length,enhancedReview:topHotspots.filter((h)=>h.recommendation==="enhanced_review").length,standard:topHotspots.filter((h)=>h.recommendation==="standard").length};return{analyzedFiles,period:`${days} days`,hotspots:topHotspots,summary}}var complexity_hotspots=createSwarmTool({description:"Identify high-risk code hotspots by combining git churn frequency with cyclomatic complexity estimates. Returns files with their churn count, complexity score, risk score, and recommended review level.",args:{days:exports_external.number().optional().describe("Number of days of git history to analyze (default: 90, valid range: 1-365)"),top_n:exports_external.number().optional().describe("Number of top hotspots to return (default: 20, valid range: 1-100)"),extensions:exports_external.string().optional().describe('Comma-separated extensions to include (default: "ts,tsx,js,jsx,py,rs,ps1")')},async execute(args2,directory,ctx){if(!directory||typeof directory!=="string"||directory.trim()==="")return JSON.stringify({error:"project directory is required but was not provided",analyzedFiles:0,period:"0 days",hotspots:[],summary:{fullGates:0,securityReview:0,enhancedReview:0,standard:0}},null,2);let daysInput,topNInput,extensionsInput;try{if(args2&&typeof args2==="object"){let obj=args2;daysInput=typeof obj.days==="number"?obj.days:void 0,topNInput=typeof obj.top_n==="number"?obj.top_n:void 0,extensionsInput=typeof obj.extensions==="string"?obj.extensions:void 0}}catch{}let daysValidation=validateDays(daysInput);if(!daysValidation.valid){let errorResult={error:`invalid days: ${daysValidation.error}`,analyzedFiles:0,period:"0 days",hotspots:[],summary:{fullGates:0,securityReview:0,enhancedReview:0,standard:0}};return JSON.stringify(errorResult,null,2)}let topNValidation=validateTopN(topNInput);if(!topNValidation.valid){let errorResult={error:`invalid top_n: ${topNValidation.error}`,analyzedFiles:0,period:"0 days",hotspots:[],summary:{fullGates:0,securityReview:0,enhancedReview:0,standard:0}};return JSON.stringify(errorResult,null,2)}let extensionsValidation=validateExtensions(extensionsInput);if(!extensionsValidation.valid){let errorResult={error:`invalid extensions: ${extensionsValidation.error}`,analyzedFiles:0,period:"0 days",hotspots:[],summary:{fullGates:0,securityReview:0,enhancedReview:0,standard:0}};return JSON.stringify(errorResult,null,2)}let days=daysValidation.value,topN=topNValidation.value,extensions=extensionsValidation.value.split(",").map((e)=>e.trim());try{let result=await analyzeHotspots(days,topN,extensions,directory,ctx?.abort);return JSON.stringify(result,null,2)}catch(e){let errorResult={error:e instanceof Error?`analysis failed: ${e.message}`:"analysis failed: unknown error",analyzedFiles:0,period:`${days} days`,hotspots:[],summary:{fullGates:0,securityReview:0,enhancedReview:0,standard:0}};return JSON.stringify(errorResult,null,2)}}});init_zod();init_config2();init_schema();init_miner();init_miner();init_store4();async function mineAndStoreConsensusV1(options){let priorFingerprints=options.deps.priorFingerprints??await listConsensusProposalFingerprints(options.directory),result=await mineConsensus(options.directory,options.request,{...options.deps,priorFingerprints}),report=await writeConsensusReport(options.directory,result.report);return{...result,report}}init_store4();init_memory();init_recommendation_ledger();init_state();init_logger();init_create_tool();var MAX_FILTER_ENTRIES=200,FilterListSchema=exports_external.array(exports_external.string().min(1).max(512)).max(MAX_FILTER_ENTRIES),MAX_INLINE_ATTRIBUTES=25;function countSummaries(attributes,inlineLimit){let total=0,shown=0;for(let[index,attribute]of attributes.entries()){if(attribute.llmSummary===void 0)continue;if(total+=1,index<inlineLimit)shown+=1}return{total,hidden:total-shown}}function buildMinerRecommendationCandidates(report,sessionId){return report.proposals.map((proposal)=>({kind:"miner",target:proposal.target,statement:proposal.intent,scopeKeys:[],provenance:{mechanism:"consensus_mine",sourceEvidenceRefs:proposal.evidenceRefs,sourceRunIds:proposal.provenance.sourceRunIds,sourceModelIds:proposal.provenance.sourceModelIds,sourceTaskIds:proposal.provenance.sourceTaskIds},origin:{agentRole:"consensus_mine",...sessionId?{sessionId}:{},producedAt:report.generatedAt}}))}var MIRRORED_PROPOSAL_KIND="todo";async function mirrorProposalsToMemory(options){if(options.memoryConfig?.enabled!==!0)return{enabled:!1,attempted:0,proposed:0,rejected:0,failed:0};let proposals=options.report.proposals;if(proposals.length===0)return{enabled:!0,attempted:0,proposed:0,rejected:0,failed:0};let gateway;try{gateway=_internals290.createMemoryGateway({directory:options.directory,...options.sessionId?{sessionID:options.sessionId,runId:options.sessionId}:{},agentRole:"consensus_mine"},{config:options.memoryConfig})}catch(err){let message=err instanceof Error?err.message:String(err);return warn(`[consensus_mine] memory mirror unavailable (fail-open): ${message}`),{enabled:!0,attempted:proposals.length,proposed:0,rejected:0,failed:proposals.length,error:message}}let proposed=0,rejected2=0,failed=0,error93;try{for(let proposal of proposals)try{if((await gateway.propose({operation:"add",kind:MIRRORED_PROPOSAL_KIND,text:proposal.intent,rationale:`consensus_mine proposal from report ${options.report.reportId}, attribute ${proposal.sourceAttributeId} (target ${proposal.target}, confidence ${proposal.confidence})`,evidenceRefs:proposal.evidenceRefs})).status==="rejected")rejected2+=1;else proposed+=1}catch(err){failed+=1,error93??=err instanceof Error?err.message:String(err)}}finally{try{await gateway.dispose()}catch(err){warn(`[consensus_mine] memory gateway dispose failed: ${err instanceof Error?err.message:String(err)}`)}}if(error93!==void 0)warn(`[consensus_mine] memory mirror partially failed: ${error93}`);return{enabled:!0,attempted:proposals.length,proposed,rejected:rejected2,failed,...error93?{error:error93}:{}}}var _internals290={createMemoryGateway};var consensus_mine=createSwarmTool({description:"Mine cross-run consensus from existing .swarm evidence — evaluation runs, gate audits, gate "+"ground truth, task trajectories, PRM sessions, skill usage, knowledge outcomes, evidence "+"bundles, and curated failures (nine sources) — and persist an immutable report of "+`agreed-upon attributes plus proposals-only recommendations. It never activates a skill, writes a knowledge entry, admits a durable memory record, edits a project file, or mutates any evidence it reads. It is NOT otherwise write-minimal, so plan for these effects: it DELETES its own older reports past consensus.report_retention (default 50) on every run; it rewrites the shared recommendation dedup ledger whole, with FIFO eviction that can drop another producer's oldest entries; it leaves one never-removed lock sentinel per report id under .swarm/locks/; when memory.enabled is true it mirrors each proposal into a PENDING swarm-memory proposal (curator review still required); and when consensus.llm_summarization_enabled is true (the default) it issues up to ${MAX_LLM_SUMMARIES} session.create plus session.prompt calls. Under a knowledge or memory link the ledger and the memory store resolve to the shared cohort root, outside this project's .swarm/.`,args:{run_ids:FilterListSchema.optional().describe("Restrict mining to these run ids (raw or namespaced). Omit for all runs."),task_categories:FilterListSchema.optional().describe("Restrict to these evaluation task categories. Omit for all categories."),agent_roles:FilterListSchema.optional().describe("Restrict to these agent roles. Omit for all roles."),model_ids:FilterListSchema.optional().describe("Restrict to these model ids. Omit for all models."),min_support:exports_external.number().int().min(1).max(1e4).optional().describe("Distinct runs required to emit an attribute. Defaults to consensus.default_min_support."),min_successful_runs:exports_external.number().int().min(0).max(1e4).optional().describe("Successful runs required. Defaults to consensus.default_min_successful_runs."),max_evidence_items:exports_external.number().int().min(1).max(1e4).optional().describe("Cap on corpus observations read. Defaults to consensus.default_max_evidence_items.")},execute:async(args2,directory,ctx)=>{let input=args2??{},loaded=loadPluginConfigWithMeta(directory),config3=ConsensusConfigSchema.parse(loaded.config.consensus??{});if(!config3.enabled)return JSON.stringify({success:!1,disabled:!0,message:"Consensus mining is disabled (consensus.enabled = false). No report was written."},null,2);let request={...input.run_ids?{runIds:input.run_ids}:{},...input.task_categories?{taskCategories:input.task_categories}:{},...input.agent_roles?{agentRoles:input.agent_roles}:{},...input.model_ids?{modelIds:input.model_ids}:{},minSupport:input.min_support??config3.default_min_support,minSuccessfulRuns:input.min_successful_runs??config3.default_min_successful_runs,maxEvidenceItems:input.max_evidence_items??config3.default_max_evidence_items},client=swarmState.opencodeClient,dispatcher=config3.llm_summarization_enabled&&client?createEvaluationModelDispatcher(client):void 0,result=await mineAndStoreConsensusV1({directory,request,deps:{config:config3,...dispatcher?{dispatcher}:{},...ctx?.sessionID?{sessionId:ctx.sessionID}:{},agentRole:"consensus_mine"}}),report=result.report,ledger=await recordEmittedRecommendations(directory,buildMinerRecommendationCandidates(report,ctx?.sessionID),{producedAt:report.generatedAt});if(ledger.degraded)warn("[consensus_mine] recommendation ledger write degraded; proposals were not recorded for cross-producer dedup");let memoryMirror=await mirrorProposalsToMemory({directory,memoryConfig:loaded.config.memory,report,...ctx?.sessionID?{sessionId:ctx.sessionID}:{}}),pruned=await pruneConsensusReports(directory,config3.report_retention),pruningEnabled=config3.report_retention>0,summaries=countSummaries(report.attributes,MAX_INLINE_ATTRIBUTES);return JSON.stringify({success:!0,report_id:report.reportId,report_path:`.swarm/evolution/consensus/${report.reportId}.json`,generated_at:report.generatedAt,integrity_hash:report.integrityHash,config_hash:report.configHash,redaction_policy_version:report.redactionPolicyVersion,thresholds:{min_support:request.minSupport,min_successful_runs:request.minSuccessfulRuns,max_evidence_items:request.maxEvidenceItems,min_task_diversity:MIN_TASK_DIVERSITY_FOR_PROPOSAL,min_support_for_proposal:MIN_SUPPORT_FOR_PROPOSAL},input_run_count:report.inputIds.length,corpus:report.corpusHashes.map((entry)=>({source:entry.source,observations:entry.observations})),corpus_truncated:result.truncated,truncation:{corpus:report.truncation.corpus,observations_tallied:report.truncation.observations,input_ids_truncated:report.truncation.inputIds,total_input_ids:report.truncation.totalInputIds,attributes_dropped:report.truncation.attributesDropped},unreadable_sources:result.unreadableSources,attribute_count:report.attributes.length,investigation_note_count:result.investigationNoteCount,proposal_count:report.proposals.length,deduped_proposal_count:result.dedupedProposalCount,recommendation_ledger:{recorded:ledger.recorded,duplicate_recommendation_count:ledger.suppressed,evicted:ledger.evicted,degraded:ledger.degraded},memory_mirror:memoryMirror,summarized_count:summaries.total,summarized_but_not_shown:summaries.hidden,restatements_accepted_this_run:result.summarizedCount,...result.summarizationSkippedReason?{summarization_skipped_reason:result.summarizationSkippedReason}:{},attributes:report.attributes.slice(0,MAX_INLINE_ATTRIBUTES).map((attribute)=>({id:attribute.id,statement:attribute.statement,...attribute.llmSummary?{llm_summary:attribute.llmSummary}:{},support:attribute.support,success_support:attribute.successSupport,failure_support:attribute.failureSupport,task_diversity:attribute.taskDiversity,model_diversity:attribute.modelDiversity,confidence:attribute.confidence,proposed_target:attribute.proposedTarget,counterexample_count:attribute.counterexampleRefs.length})),attributes_truncated:report.attributes.length>MAX_INLINE_ATTRIBUTES,retention:pruningEnabled?{configured:config3.report_retention,pruning_enabled:!0,deleted:pruned.deleted.length,retained:pruned.retained.length,failed:pruned.failed.length,corrupt:pruned.corrupt.length}:{configured:config3.report_retention,pruning_enabled:!1,deleted:0,failed:0},guarantees:["proposals only — no skill activation, no knowledge write, no durable memory record, and no mutation of any evidence read",'model_diversity 0 means "not measurable from this corpus", never "measured as none"',`attributes below task diversity ${MIN_TASK_DIVERSITY_FOR_PROPOSAL} or below support ${MIN_SUPPORT_FOR_PROPOSAL} are investigation notes, never proposals`,"an attribute counting failing runs always carries counterexample refs (schema-enforced)","truncation is not biased toward successes, but it is still a cut: it balances per source, and drops whole sources once the budget is spent","statement is deterministic; llm_summary is an optional restatement excluded from integrity_hash","reproducible: identical corpus, request, config_hash, and prior proposals yield the same integrity_hash and report_id; model wording never moves it",'truncation is declared on the report; read failure_support 0 on a truncated report as "none survived the cut"']},null,2)}});init_config2();init_model_limits();init_state();init_create_tool();var _internals291={loadPluginConfig,fetchSessionMessages:async(sessionID,directory,limit=100)=>{if(!swarmState.opencodeClient?.session)return null;try{return(await swarmState.opencodeClient.session.messages({path:{id:sessionID},query:{directory,limit}})).data??null}catch{return null}}};function computeContextHeadroom(messages,warnThreshold=0.7,criticalThreshold=0.9,modelLimitsConfig={},liveContextLimit,modelIdentity,directory){let{modelID,providerID}=modelIdentity??extractModelInfo(messages),modelLimitResolution=resolveModelLimit(modelID,providerID,modelLimitsConfig,liveContextLimit,directory),modelLimit=modelLimitResolution.limit,usage=computeContextUsage(messages),usagePercent=usage.tokensUsed/modelLimit,thresholdCrossed="none";if(usagePercent>criticalThreshold)thresholdCrossed="critical";else if(usagePercent>warnThreshold)thresholdCrossed="warn";return{tokensUsed:usage.tokensUsed,usageSource:usage.source,modelLimit,modelLimitSource:modelLimitResolution.source,modelLimitResolution:modelLimitResolution.resolution,fallbackActive:modelLimitResolution.source==="provider_cap"||modelLimitResolution.source==="native"||modelLimitResolution.source==="fallback",usagePercent,thresholdCrossed,modelId:modelID??null,provider:providerID??null}}var context_status=createSwarmTool({allowWorkingDirectoryOverride:!0,description:"Report current context-window headroom for the active session. Returns tokens-used, usageSource (provider|estimated), model-limit with provenance (modelLimitSource: host|override|provider_cap|native|fallback; modelLimitResolution: user_provider_model|user_model|user_default|live_model_limit|static_provider_cap|static_native|static_default; fallbackActive: true when the denominator came from a static table or the flat 128k default — treat headroom as uncertain), usage-percent, threshold-state (none|warn|critical), model name, and provider. Pure read-only — no state mutation, no warning injection. Works whether context_budget.enabled is true or false.",args:{},async execute(_args,directory,ctx){let config3=_internals291.loadPluginConfig(directory),warnThreshold=config3.context_budget?.warn_threshold??0.7,criticalThreshold=config3.context_budget?.critical_threshold??0.9,modelLimitsConfig=config3.context_budget?.model_limits??{},messages=[];if(ctx?.sessionID){let sessionMessages=await _internals291.fetchSessionMessages(ctx.sessionID,directory);if(sessionMessages)messages=sessionMessages}let{modelID,providerID}=getLiveContextModelIdentity(ctx?.sessionID)??extractModelInfo(messages),headroom=computeContextHeadroom(messages,warnThreshold,criticalThreshold,modelLimitsConfig,getLiveContextWindow(ctx?.sessionID,{modelID,providerID}),{modelID,providerID},directory);return JSON.stringify(headroom,null,2)}});init_zod();init_loader();function pushCouncilAdvisory(session,synthesis){let dedupKey=`council:${synthesis.taskId}:${synthesis.roundNumber}`;if(synthesis.overallVerdict==="APPROVE"&&synthesis.advisoryFindings.length===0)return;if(session.pendingAdvisoryMessages??=[],session.pendingAdvisoryMessages.some((m)=>m.includes(dedupKey)))return;let blocking=synthesis.overallVerdict==="REJECT",header=`[${dedupKey}] (priority=HIGH, blocking=${blocking})`,body=synthesis.unifiedFeedbackMd;pushAdvisory(session,`${header}
7641
7641
  ${body}`,{dedupeKey:dedupKey})}init_zod();init_task_file();init_gate_evidence();init_project_boundary();init_council_review_identity();import{existsSync as existsSync172,mkdirSync as mkdirSync92,readFileSync as readFileSync148}from"node:fs";import{join as join266}from"node:path";var EVIDENCE_DIR2=".swarm/evidence",VALID_TASK_ID=/^\d+\.\d+(\.\d+)*$/,COUNCIL_GATE_NAME="council",COUNCIL_AGENT_ID="architect",EvidenceFileSchema=exports_external.record(exports_external.string(),exports_external.unknown()),_internals292={withTaskEvidenceLock},FORBIDDEN_KEYS=new Set(["__proto__","constructor","prototype"]);function safeAssignOwnProps(target,source){for(let key3 of Object.keys(source)){if(FORBIDDEN_KEYS.has(key3))continue;let value=source[key3];if(value!==null&&typeof value==="object"&&!Array.isArray(value)){let nested=Object.create(null);safeAssignOwnProps(nested,value),target[key3]=nested}else if(Array.isArray(value))target[key3]=value.map((item)=>{if(item!==null&&typeof item==="object"&&!Array.isArray(item)){let nested=Object.create(null);return safeAssignOwnProps(nested,item),nested}return item});else target[key3]=value}return target}async function writeCouncilEvidence(workingDir,synthesis,attemptId,expectedGeneration,identity){if(!VALID_TASK_ID.test(synthesis.taskId))throw Error(`writeCouncilEvidence: invalid taskId "${synthesis.taskId}" — must match N.M or N.M.P format`);let dir=join266(workingDir,EVIDENCE_DIR2);assertProjectRoot(workingDir),mkdirSync92(dir,{recursive:!0});let filePath=taskEvidencePath(workingDir,synthesis.taskId);await _internals292.withTaskEvidenceLock(workingDir,synthesis.taskId,COUNCIL_AGENT_ID,async()=>{assertTaskEvidenceWriteAllowed(workingDir,synthesis.taskId);let existingRoot=Object.create(null);if(existsSync172(filePath))try{let raw=readFileSync148(filePath,"utf-8");if(expectedGeneration!==void 0){let exactEvidence=parseTaskEvidence(raw,synthesis.taskId),workflow=getTaskWorkflowSnapshot(exactEvidence);if(!workflow.authoritative||workflow.generation!==expectedGeneration||workflow.state!=="pre_check_passed")throw Error(`TASK_COUNCIL_GENERATION_MISMATCH: expected pre_check_passed@${expectedGeneration}, found ${workflow.state}@${workflow.generation}`)}let parsed=EvidenceFileSchema.parse(JSON.parse(raw));safeAssignOwnProps(existingRoot,parsed)}catch(error93){if(expectedGeneration!==void 0)throw error93}else if(expectedGeneration!==void 0)throw Error(`TASK_COUNCIL_GENERATION_MISMATCH: no exact evidence exists for generation ${expectedGeneration}`);let existingGatesRaw=existingRoot.gates,mergedGates=Object.create(null);if(existingGatesRaw&&typeof existingGatesRaw==="object"&&!Array.isArray(existingGatesRaw))safeAssignOwnProps(mergedGates,existingGatesRaw);mergedGates[COUNCIL_GATE_NAME]={sessionId:synthesis.swarmId,timestamp:synthesis.timestamp,agent:COUNCIL_AGENT_ID,verdict:synthesis.overallVerdict,vetoedBy:synthesis.vetoedBy,roundNumber:synthesis.roundNumber,allCriteriaMet:synthesis.allCriteriaMet,quorumSize:synthesis.quorumSize,...identity?councilIdentityEvidenceFields(identity):{},...expectedGeneration!==void 0?{workflowGeneration:expectedGeneration}:{},...attemptId?{attemptId}:{}};let updated=Object.create(null);if(safeAssignOwnProps(updated,existingRoot),updated.gates=mergedGates,!updated.taskId)updated.taskId=synthesis.taskId;if(!Array.isArray(updated.required_gates))updated.required_gates=[];await atomicWriteFile(filePath,JSON.stringify(updated,null,2))})}function hasCouncilEvidenceAttempt(workingDir,taskId,attemptId,roundNumber){if(!VALID_TASK_ID.test(taskId))return!1;try{let council=EvidenceFileSchema.parse(JSON.parse(readFileSync148(taskEvidencePath(workingDir,taskId),"utf-8"))).gates?.[COUNCIL_GATE_NAME];return council?.attemptId===attemptId&&council.roundNumber===roundNumber}catch{return!1}}init_council_review_identity();init_lock();init_task_file();import{createHash as createHash109,randomUUID as randomUUID43}from"node:crypto";import{closeSync as closeSync41,existsSync as existsSync173,fsyncSync as fsyncSync11,mkdirSync as mkdirSync93,openSync as openSync41,readFileSync as readFileSync149,readSync as readSync29,statSync as statSync106,writeSync as writeSync7}from"node:fs";import{dirname as dirname124,join as join267}from"node:path";init_telemetry();function scopeIdentityPayload(scope){return{level:scope.kind,...scope.kind==="task"&&scope.taskId!==void 0?{taskId:scope.taskId}:{},...scope.kind==="phase"&&scope.phaseNumber!==void 0?{phase:scope.phaseNumber}:{},identityDigest:scope.identityDigest}}function observeCouncilAuditAppend(scope,sessionID,councilRoundId,record3){try{emit("council_attempt",{...sessionID!==void 0?{sessionId:sessionID}:{},councilRoundId,...scopeIdentityPayload(scope),stage:record3.event,attemptId:record3.attemptId,disposition:record3.disposition,authoritativeRound:record3.authoritativeRound,...record3.clientRound!==void 0?{clientRound:record3.clientRound}:{},verdictCount:record3.verdictCount,memberCount:record3.members.length,...record3.quorumSize!==void 0?{quorumSize:record3.quorumSize}:{},...record3.verdict!==void 0?{verdict:record3.verdict}:{},...record3.transition!==void 0?{transition:record3.transition}:{},...record3.gateEffect!==void 0?{gateEffect:record3.gateEffect}:{}});let next=record3.nextState;if(record3.event!=="received"&&(record3.transition==="advance"||record3.transition==="close")&&next!==void 0)emit("council_round_transition",{...sessionID!==void 0?{sessionId:sessionID}:{},councilRoundId,...scopeIdentityPayload(scope),attemptId:record3.attemptId,transition:record3.transition,gateEffect:record3.gateEffect,round:record3.authoritativeRound,nextRound:next.currentRound,roundStatus:next.status,maxRoundsExhausted:next.maxRoundsExhausted,...record3.verdict!==void 0?{verdict:record3.verdict}:{},...record3.quorumSize!==void 0?{quorumSize:record3.quorumSize}:{}})}catch{}}function emitUnscopedCouncilAttemptObservation(sessionID,level,disposition,fingerprint2,attemptId){try{emit("council_attempt_unscoped",{...sessionID!==void 0?{sessionId:sessionID}:{},level,disposition,fingerprint:fingerprint2,attemptId})}catch{}}init_council_review_identity();var VERSION=2,MAX_ROUND=10,MAX_AUDIT_TAIL=262144,STATE_AGENT="council-round-state",EXHAUSTION_EVENT_RELATIVE_PATH="council/events/max-rounds-exhaustion.jsonl";class CouncilRoundStateUncertainError extends Error{constructor(message){super(message);this.name="CouncilRoundStateUncertainError"}}function sha25613(value){return createHash109("sha256").update(value).digest("hex")}var UUID_PATTERN2=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,DIGEST_PATTERN2=/^[a-f0-9]{64}$/;function isUuid2(value){return typeof value==="string"&&UUID_PATTERN2.test(value)}function isDigest(value){return typeof value==="string"&&DIGEST_PATTERN2.test(value)}function isRound(value){return Number.isInteger(value)&&Number(value)>=1&&Number(value)<=MAX_ROUND}function isDisposition(value){return typeof value==="string"&&value.length>0&&value.length<=80}function isEvidenceRef(value){return typeof value==="string"&&value.length>0&&value.length<=240&&value.startsWith(".swarm/")&&!value.includes("..")}function scopeToken(scope){if(scope.kind==="task"){if(!/^\d+\.\d+(\.\d+)*$/.test(scope.taskId))throw Error("invalid task council scope");if(!isIdentityDigest(scope.identityDigest))throw Error("invalid task council scope identity");return`task-${sha25613(JSON.stringify({k:"task",taskId:scope.taskId,id:scope.identityDigest}))}`}if(scope.kind==="phase"){if(!Number.isInteger(scope.phaseNumber)||scope.phaseNumber<1||scope.phaseNumber>1000)throw Error("invalid phase council scope");if(!isIdentityDigest(scope.identityDigest))throw Error("invalid phase council scope identity");return`phase-${sha25613(JSON.stringify({k:"phase",phaseNumber:scope.phaseNumber,id:scope.identityDigest}))}`}if(!isIdentityDigest(scope.identityDigest))throw Error("invalid final council scope identity");return`final-${sha25613(JSON.stringify({k:"final",id:scope.identityDigest}))}`}function auditScope(scope){if(scopeToken(scope),scope.kind==="task")return{kind:"task",scopeHash:sha25613(scope.taskId),identityDigest:scope.identityDigest};if(scope.kind==="phase")return{kind:"phase",phaseNumber:scope.phaseNumber,identityDigest:scope.identityDigest};return{kind:"final",scopeHash:sha25613(scope.identityDigest),identityDigest:scope.identityDigest}}function sameAuditScope(left,right){if(left.kind!==right.kind)return!1;if(left.identityDigest!==right.identityDigest)return!1;if(left.kind==="phase"&&right.kind==="phase")return left.phaseNumber===right.phaseNumber;if(left.kind!=="phase"&&right.kind!=="phase")return left.scopeHash===right.scopeHash;return!1}function councilRoundStatePaths(directory,scope){let token=scopeToken(scope);return{state:join267(directory,".swarm","council","round-state",`${token}.json`),audit:join267(directory,".swarm","council","attempts",`${token}.jsonl`),lock:join267("council","round-state",`${token}.json`)}}function canonicalize3(value){if(Array.isArray(value))return value.map(canonicalize3);if(value&&typeof value==="object"){let result=Object.create(null);for(let key3 of Object.keys(value).sort()){if(key3==="working_directory"||key3==="roundNumber"||key3==="provenanceAgentName"||key3==="provenanceSessionId")continue;result[key3]=canonicalize3(value[key3])}return result}return value}function councilRequestDigest(request,round){return sha25613(JSON.stringify({round,request:canonicalize3(request)}))}function isSnapshot(value){if(!value||typeof value!=="object")return!1;let state2=value;return state2.version===VERSION&&isIdentityDigest(state2.identityDigest)&&isRound(state2.currentRound)&&(state2.status==="open"||state2.status==="closed")&&typeof state2.maxRoundsExhausted==="boolean"&&(state2.lastAttemptId===void 0||isUuid2(state2.lastAttemptId))&&(state2.lastDigest===void 0||isDigest(state2.lastDigest))&&state2.lastAttemptId===void 0===(state2.lastDigest===void 0)}function isTransition(value){return value==="stay"||value==="advance"||value==="close"}function isGateEffect(value){return value==="none"||value==="blocked"||value==="allowed"}function isVerdict(value){return value==="APPROVE"||value==="CONCERNS"||value==="REJECT"}function auditTransitionIsConsistent(record3){if(!record3.nextState||!record3.transition)return!1;if(record3.transition==="close")return record3.nextState.status==="closed"&&record3.nextState.currentRound===record3.authoritativeRound;if(record3.transition==="stay"){if(record3.nextState.status==="closed"&&!["duplicate_submission","council_round_closed","council_round_mismatch"].includes(record3.disposition))return!1;return(record3.nextState.status==="open"||record3.nextState.status==="closed")&&record3.nextState.currentRound===record3.authoritativeRound}return record3.nextState.status==="open"&&(record3.nextState.currentRound===record3.authoritativeRound+1&&record3.nextState.maxRoundsExhausted===!1||record3.nextState.currentRound===record3.authoritativeRound&&record3.nextState.maxRoundsExhausted===!0)}function recoverAuditHistory(tail2,identityDigest){let current=tail2.truncated?void 0:initialState(identityDigest),awaiting,sawTransition=!1;for(let record3 of tail2.records){if(record3.event==="received"){if(awaiting)throw new CouncilRoundStateUncertainError("council audit contains overlapping attempts");if(current&&record3.authoritativeRound!==current.currentRound||!current&&!tail2.truncated&&record3.authoritativeRound!==1)throw new CouncilRoundStateUncertainError("council audit round history is not monotonic");awaiting=record3;continue}if(!record3.nextState||!record3.transition)throw new CouncilRoundStateUncertainError("council audit transition is incomplete");if(awaiting){if(awaiting.attemptId!==record3.attemptId||awaiting.digest!==record3.digest||awaiting.authoritativeRound!==record3.authoritativeRound)throw new CouncilRoundStateUncertainError("council audit attempt pairing is inconsistent");awaiting=void 0}else if(!tail2.truncated||sawTransition)throw new CouncilRoundStateUncertainError("council audit transition has no matching received record");if(current){if(record3.authoritativeRound!==current.currentRound)throw new CouncilRoundStateUncertainError("council audit transition regresses the authoritative round");if(record3.transition==="stay"&&record3.nextState.status!==current.status)throw new CouncilRoundStateUncertainError("council audit stay transition changes scope status");if((record3.transition==="stay"||record3.transition==="close")&&record3.nextState.maxRoundsExhausted!==current.maxRoundsExhausted)throw new CouncilRoundStateUncertainError("council audit changes exhaustion without advancing");if(current.status==="closed"&&(record3.transition!=="stay"||record3.nextState.status!=="closed"))throw new CouncilRoundStateUncertainError("council audit reopens a closed scope")}current=record3.nextState,sawTransition=!0}if(awaiting)throw new CouncilRoundStateUncertainError("council audit ends with an unresolved received attempt");return current}function pendingMatchesParent(state2,pending){if(state2.status!=="open"||pending.round!==state2.currentRound)return!1;if(pending.nextState.lastAttemptId!==pending.attemptId||pending.nextState.lastDigest!==pending.digest)return!1;if(pending.transition==="stay")return pending.nextState.status==="open"&&pending.nextState.currentRound===state2.currentRound&&pending.nextState.maxRoundsExhausted===state2.maxRoundsExhausted;if(pending.transition==="close")return pending.nextState.status==="closed"&&pending.nextState.currentRound===state2.currentRound&&pending.nextState.maxRoundsExhausted===state2.maxRoundsExhausted;return pending.nextState.status==="open"&&(pending.nextState.currentRound===state2.currentRound+1&&pending.nextState.maxRoundsExhausted===!1||pending.nextState.currentRound===state2.currentRound&&pending.nextState.maxRoundsExhausted===!0)}function parseState(raw,expectedIdentityDigest){let value;try{value=JSON.parse(raw)}catch{throw new CouncilRoundStateUncertainError("council round state is corrupt")}if(!isSnapshot(value))throw new CouncilRoundStateUncertainError("council round state is invalid");let state2=value;if(state2.identityDigest!==expectedIdentityDigest)throw new CouncilRoundStateUncertainError("council round state identity does not match the request scope");if(state2.pending){let pending=state2.pending;if(!isUuid2(pending.attemptId)||!isDigest(pending.digest)||!isRound(pending.round)||!isSnapshot(pending.nextState)||!isTransition(pending.transition)||!isDisposition(pending.disposition)||!isGateEffect(pending.gateEffect)||typeof pending.evidenceExpected!=="boolean"||pending.evidenceExpected!==(pending.evidenceRef!==void 0)||pending.evidenceRef!==void 0&&!isEvidenceRef(pending.evidenceRef)||pending.verdict!==void 0&&!isVerdict(pending.verdict)||pending.quorumSize!==void 0&&(!Number.isInteger(pending.quorumSize)||pending.quorumSize<0||pending.quorumSize>5)||pending.verdict===void 0!==(pending.quorumSize===void 0)||!pendingMatchesParent(state2,pending))throw new CouncilRoundStateUncertainError("pending council state is invalid")}return state2}function parseAuditRecord(line,expectedScope){try{let record3=JSON.parse(line);if(record3.version!==VERSION||!["received","finalized","recovered"].includes(record3.event)||!isUuid2(record3.attemptId)||typeof record3.timestamp!=="string"||record3.timestamp.length>40||!Number.isFinite(Date.parse(record3.timestamp))||!sameAuditScope(record3.scope,expectedScope)||record3.clientRound!==void 0&&!isRound(record3.clientRound)||!isRound(record3.authoritativeRound)||!isDigest(record3.digest)||record3.sessionHash!==void 0&&!isDigest(record3.sessionHash)||!isDisposition(record3.disposition)||!Number.isInteger(record3.verdictCount)||record3.verdictCount<0||record3.verdictCount>5||!Array.isArray(record3.members)||record3.members.length>5||record3.members.some((member)=>typeof member!=="string"||member.length===0||member.length>32)||new Set(record3.members).size!==record3.members.length)throw Error("invalid");if(record3.event==="received"){if(record3.disposition!=="received"||record3.transition!==void 0||record3.gateEffect!==void 0||record3.nextState!==void 0||record3.evidenceRef!==void 0)throw Error("invalid")}else if(!isTransition(record3.transition)||!isGateEffect(record3.gateEffect)||!isSnapshot(record3.nextState)||record3.nextState.lastAttemptId!==record3.attemptId||record3.nextState.lastDigest!==record3.digest||!auditTransitionIsConsistent(record3))throw Error("invalid");if(record3.verdict!==void 0&&!isVerdict(record3.verdict))throw Error("invalid");if(record3.quorumSize!==void 0&&(!Number.isInteger(record3.quorumSize)||record3.quorumSize<0||record3.quorumSize>5))throw Error("invalid");if(record3.verdict===void 0!==(record3.quorumSize===void 0))throw Error("invalid");if(record3.evidenceRef!==void 0&&!isEvidenceRef(record3.evidenceRef))throw Error("invalid");return record3}catch{throw new CouncilRoundStateUncertainError("council attempt audit is corrupt")}}function appendAudit2(path335,record3){mkdirSync93(dirname124(path335),{recursive:!0});let descriptor=openSync41(path335,"a");try{writeSync7(descriptor,`${JSON.stringify(record3)}
7642
7642
  `,void 0,"utf8"),fsyncSync11(descriptor)}finally{closeSync41(descriptor)}}function appendAuditAndObserve(input,paths,councilRoundId,record3){_internals293.appendAudit(paths.audit,record3),observeCouncilAuditAppend(input.scope,input.sessionID,councilRoundId,record3)}function readAuditTail(path335,scope){if(!existsSync173(path335))return{records:[],truncated:!1};let size=statSync106(path335).size;if(size===0)return{records:[],truncated:!1};let offset=Math.max(0,size-MAX_AUDIT_TAIL),length=size-offset,descriptor=openSync41(path335,"r"),buffer=Buffer.alloc(length);try{readSync29(descriptor,buffer,0,length,offset)}finally{closeSync41(descriptor)}let text=buffer.toString("utf8");if(!text.endsWith(`
7643
7643
  `))throw new CouncilRoundStateUncertainError("council attempt audit has a partial tail");if(offset>0){let firstNewline=text.indexOf(`
@@ -7852,7 +7852,7 @@ ${jsdocContent}`;else if(line.includes("*/"))break;else if(functionKeywords.test
7852
7852
  `)){let trimmed=line.trim();if(!trimmed)continue;let[name,rest]=trimmed.split(/\s+/,2);if(!name||!rest||byName.has(name))continue;let url3=rest.replace(/\s+\((?:fetch|push)\)\s*$/i,"");byName.set(boundUntrusted(name,64),boundUntrusted(url3,MAX_REMOTE_URL_LEN))}let entries2=[...byName.entries()],remotes=entries2.slice(0,MAX_REMOTES).map(([name,url3])=>({name,url:url3}));return{remotes,remotesTruncated:entries2.length>remotes.length}}async function countCheckoutReceiptFiles(directory,sessionID){try{let receiptDirectory=validateSwarmPath(directory,path367.join(RECEIPT_DIR2,prWorkflowSessionFileStem(sessionID)));return(await fsp12.readdir(receiptDirectory,{withFileTypes:!0})).filter((entry)=>entry.isFile()&&/^[0-9a-f]{40,64}\.json$/i.test(entry.name)).length}catch(error93){if(error93.code==="ENOENT")return 0;return null}}function describeDelegationRead(directory){try{let outcome=_internals317.readDelegationsDetailed(directory);if(outcome.status==="ok")return{state:"ok"};return{state:"uncertain",reasonCode:boundUntrusted(outcome.reason,MAX_RECOVERY_REASON_CODE_LEN)}}catch{return{state:"uncertain",reasonCode:"reader-threw"}}}function describeRecoveryNextStep(delegationReadState){if(delegationReadState==="uncertain")return"Delegation store read is uncertain: repair the store, then re-run pr_workflow_status; if abandoning the workflow, abort via abort_pr_workflow.";return"Re-run pr_workflow_status after any store repair; if abandoning the workflow, abort via abort_pr_workflow."}function describeNextStep(gate,git2,checkout){if(checkout.kind==="recovery-required"||checkout.kind==="indeterminate")return`Manual Git recovery required. code=${checkout.code} retryable=false required_action=${checkout.requiredAction}`;if(!gate.active){if(gate.reason==="delegation-chain-uncertain")return"PR workflow gate ownership could not be resolved from this session delegation chain (cycle, depth limit, or missing ancestor). Treat the workflow state as unknown and use read-only recovery inspection; do not perform PR-workflow writes.";return"No active PR workflow gate for this session. Activate with `/swarm pr-review <pr-ref>` or `/swarm pr-feedback <pr-ref>` before PR-workflow tool calls are admitted."}if(!gate.prHeadBound)return gate.mode==="PR_FEEDBACK"?"PR_FEEDBACK gate active; PR head not yet bound. If the working tree is dirty, preserve it with prepare_pr_workflow_checkout (omit paths to include tracked and untracked changes). Prefer the intended exact tracking checkout, then bind; if this workflow inherited an already-detached exact intake head, bind it directly and the controller will attach the unique exact local/remote tracking ref. Ambiguity or an existing mismatched upstream fails closed.":"PR_REVIEW gate active; PR head not yet bound. If the working tree is dirty, preserve it with prepare_pr_workflow_checkout (omit paths to include tracked and untracked changes), then bind the exact detached PR head.";if(git2.isClean===!1)return`${gate.mode} gate active and head bound, but the working tree is dirty. Read-only observation only; the gate keeps writes and non-tracking fetches fail-closed.`;if(git2.isClean===null)return`${gate.mode} gate active and head bound, but this session could not determine whether the working tree is clean (git status failed). Treat the tree state as unknown and verify manually before assuming it is clean; read-only observation only.`;return`${gate.mode} gate active and head bound. Continue read-only review using the admitted observe/validate tools (diff, gh_evidence, repo_map, lint check, etc.).`}function summarizeGate(state2,receiptFiles,salvage){if(!state2)return{active:!1,reason:"no-active-gate"};return{active:!0,...salvage?.salvaged?{stateSalvaged:!0,stateSalvageDisclosure:salvage.disclosure}:{},mode:state2.mode,prHeadBound:Boolean(state2.prHeadSha),prHeadSha:state2.prHeadSha??null,prFeedbackTargetUrl:state2.prFeedbackTargetUrl?boundUntrusted(state2.prFeedbackTargetUrl,MAX_FIELD_LEN):null,prReviewBaseRef:state2.prReviewBaseRef?boundUntrusted(state2.prReviewBaseRef,MAX_FIELD_LEN):null,prReviewBaseSha:state2.prReviewBaseSha??null,prReviewDepthTier:state2.prReviewDepthTier??null,baseDispatchBatches:state2.prReviewBaseDispatches?.length??0,validationBatches:state2.prReviewValidationBatches?.length??0,feedbackVerificationBatches:state2.prFeedbackVerifications?.length??0,...state2.prFeedbackInventoryAmendments?.length?{inventoryAmendments:state2.prFeedbackInventoryAmendments}:{},checkoutReceiptFiles:receiptFiles,activatedAt:state2.activatedAt,updatedAt:state2.updatedAt,revision:state2.revision}}function boundFindingLine(line){let cleaned=line.replace(/[\p{Cc}]/gu," ").replace(/[`<>]/g," ").replace(/\s+/g," ").trim(),chars=Array.from(cleaned);if(chars.length<=PR_REVIEW_STATUS_FINDING_LINE_MAX)return cleaned;return`${chars.slice(0,PR_REVIEW_STATUS_FINDING_LINE_MAX-1).join("")}…`}async function buildPrReviewProjection(directory,state2,projectionDropped){let settledPhases=new Set(state2.prReviewArtifactBoundaries??[]),runId=state2.prReviewArtifactRunId??null,findingsPath=state2.prReviewFindingsPath??null,digests=state2.prReviewVerdictSettlementDigests??{},boundaries=PR_REVIEW_BOUNDARY_ORDER.map((phase)=>{let settlementPhase=PR_REVIEW_BOUNDARY_SETTLEMENT_PHASE[phase],settled=settledPhases.has(phase);return{phase,status:settled?"settled":"pending",runId,findingsPath,settlementDigest:settled&&settlementPhase?digests[settlementPhase]??null:null}}),declaredLanes=[];for(let batch of state2.prReviewBaseDispatches??[])for(let lane of batch.lanes??[])declaredLanes.push({laneId:lane.laneId,workflowLane:lane.workflowLane,batchId:batch.batchId});let laneCoverageTruncated=declaredLanes.length>PR_REVIEW_STATUS_LANE_ROWS_CAP,emittedLanes=declaredLanes.slice(0,PR_REVIEW_STATUS_LANE_ROWS_CAP),rejectionCounts=new Map;for(let entry of state2.prReviewSubmitRejections??[]){if(!entry.laneId)continue;rejectionCounts.set(entry.laneId,(rejectionCounts.get(entry.laneId)??0)+1)}let receiptsByLane=new Map,uncertainBatches=new Set,headSha=state2.prHeadSha;for(let batchId of new Set(emittedLanes.map((lane)=>lane.batchId)))try{let outcome=_internals317.findByBatchIdDetailed(directory,batchId,{parentSessionId:state2.sessionID});if(outcome.status==="uncertain"){uncertainBatches.add(batchId);continue}for(let record3 of outcome.value){if(record3.laneId==null||record3.mode!=="swarm-pr-review:base")continue;if(record3.workspace?.prHeadSha!==headSha||record3.workspace?.gitHead!==headSha)continue;let receipt=recordedPrReviewResultReceipt(record3);if(!receipt)continue;let key3=`${batchId}\x00${record3.laneId}`;if(!receiptsByLane.has(key3))receiptsByLane.set(key3,receipt)}}catch{uncertainBatches.add(batchId)}let laneCoverage=emittedLanes.map((lane)=>{let uncertain=uncertainBatches.has(lane.batchId),receipt=uncertain?void 0:receiptsByLane.get(`${lane.batchId}\x00${lane.laneId}`),findings=receipt?.envelope.findings??[],lastFinding=findings[findings.length-1],latestFinding=uncertain?"receipt-uncertain":receipt?lastFinding?boundFindingLine(`${lastFinding.severity} ${lastFinding.id}: ${lastFinding.title}`):receipt.envelope.outcome==="CLEAN"?"clean":"incomplete":"no-receipt",findingsTruncated=findings.length>PR_REVIEW_STATUS_FINDINGS_PER_LANE,findingSummaries=findings.slice(0,PR_REVIEW_STATUS_FINDINGS_PER_LANE).map((finding)=>({id:boundUntrusted(finding.id,PR_REVIEW_STATUS_FINDING_ID_MAX),severity:boundUntrusted(finding.severity,PR_REVIEW_STATUS_FINDING_SEVERITY_MAX),title:boundUntrusted(finding.title,PR_REVIEW_STATUS_FINDING_LINE_MAX)}));return{laneId:lane.laneId,workflowLane:lane.workflowLane,batchId:lane.batchId,accepted:findings.length,rejected:rejectionCounts.get(lane.laneId)??0,latestFinding,findings:findingSummaries,findingsTruncated}}),inventory=projectionDropped?{state:"unavailable",reason:SALVAGED_PROJECTION_REASON}:await(async()=>{let derived=await derivePrReviewCandidateInventoryForStatus(directory,state2);if(derived.state==="unavailable")return{state:"unavailable",reason:boundUntrusted(derived.reason,PR_REVIEW_STATUS_FINDING_LINE_MAX)};return{state:"available",ids:derived.inventory.slice(0,PR_REVIEW_STATUS_INVENTORY_CAP).map((id)=>boundUntrusted(id,PR_REVIEW_STATUS_FINDING_ID_MAX)),truncated:derived.inventory.length>PR_REVIEW_STATUS_INVENTORY_CAP,total:derived.inventory.length,cap:PR_REVIEW_STATUS_INVENTORY_CAP}})(),salvagedSource=()=>projectionDropped?{state:"unavailable",reason:SALVAGED_PROJECTION_REASON}:{state:"ok"},verdictAttempts=["reviewer","critic"].flatMap((phase)=>deriveVerdictAttemptCounts({window:prReviewPhaseWindowForStatus(state2,phase),unclaimed:[...new Set(prReviewPhaseWindowForStatus(state2,phase).flatMap((batch)=>batch.lanes.flatMap((lane)=>lane.reviewItemIds??[])))]}).map((row)=>({...row,phase})));return{boundaries,checkpointScope:"shared-last-write-wins",laneCoverage,laneCoverageTruncated,laneCoverageAdmission:"lane-record-only",inventory,verdictAttempts,sources:{boundaries:salvagedSource(),laneCoverage:salvagedSource()}}}async function resolveWorkflowGate(directory,sessionID){let outcome=await _internals317.resolvePrWorkflowControllerSession({directory,sessionID,readGate:(candidate2)=>_internals317.readPrWorkflowGateStateForRecovery(directory,candidate2)});if(outcome.kind==="gate-owner")return{sessionID:outcome.sessionID,recovery:outcome.gate};if(outcome.kind==="no-gate")return{sessionID:outcome.sessionID,recovery:null};return{sessionID:null,recovery:null}}async function resolveWorkflowGateSession(directory,sessionID){return(await resolveWorkflowGate(directory,sessionID)).sessionID}async function executePrWorkflowStatus(directory,rawSessionID){let sessionID=rawSessionID?.trim()?rawSessionID.trim():null,resolvedGate=sessionID?await resolveWorkflowGate(directory,sessionID):null,gateSessionID=resolvedGate?.sessionID??null,[head2,isClean,branchInfo,porcelain,remoteOutput,liveCheckout]=await Promise.all([_internals317.resolveCurrentGitHeadAsync(directory),_internals317.resolveIsWorkingTreeCleanAsync(directory),resolveBranch(directory),_internals317.runGitCapture(directory,["status","--porcelain=v1","--untracked-files=all"]),_internals317.runGitCapture(directory,["remote","-v"]),_internals317.classifyGitState(directory)]),dirty=parseDirtyFiles(porcelain),{remotes,remotesTruncated}=parseRemotes(remoteOutput),git2={head:head2,branch:branchInfo.branch,detached:branchInfo.detached,isClean,dirtyFileCount:dirty.dirtyFileCount,dirtyFiles:dirty.dirtyFiles,dirtyFilesTruncated:dirty.dirtyFilesTruncated,remotes,remotesTruncated},gate,activeState=null;if(!gateSessionID)gate={active:!1,reason:sessionID?"delegation-chain-uncertain":"no-session-context"};else{let recovery2=resolvedGate?.recovery??null;activeState=recovery2?.state??null;let receiptFiles=activeState?await countCheckoutReceiptFiles(directory,gateSessionID):null;if(gate=summarizeGate(activeState,receiptFiles,recovery2?{salvaged:recovery2.salvaged,disclosure:recovery2.disclosure}:void 0),activeState?.mode==="PR_REVIEW")gate.prReviewProjection=await buildPrReviewProjection(directory,activeState,recovery2?.prReviewProjectionDropped??!1)}let recovery=activeState?.checkoutRecovery,checkout=recovery?{kind:recovery.code==="GIT_STATE_INDETERMINATE"?"indeterminate":"recovery-required",code:recovery.code,retryable:!1,requiredAction:recovery.requiredAction,evidence:recovery.evidence}:liveCheckout,delegationRead=describeDelegationRead(directory),recoverySection={controllerSessionID:gateSessionID,delegationRead,lastProgress:activeState?{revision:activeState.revision,updatedAt:activeState.updatedAt}:null,wakeSuspension:{suspended:sessionID?_internals317.isPrWorkflowAutoWakeSuppressed(directory,sessionID):!1},actionCircuits:{state:"unavailable"},nextStep:describeRecoveryNextStep(delegationRead.state)},result={success:!0,sessionID,git:git2,checkout,gate,publication:activeState?describePrWorkflowPublicationSection(activeState):null,nextStep:describeNextStep(gate,git2,checkout),recovery:recoverySection};return JSON.stringify(result,null,2)}var pr_workflow_status=createSwarmTool({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 (mode, bound PR head, base ref/sha, depth tier, dispatch/validation batch counts) and, for an active PR_REVIEW gate, a bounded projection of boundary settlement, per-lane coverage, and the derived candidate inventory. Use to observe state under the fail-closed PR_REVIEW/PR_FEEDBACK gate. Never executes PR-controlled scripts and never reads another session gate.",args:{},execute:async(_args,directory,ctx)=>executePrWorkflowStatus(directory,ctx?.sessionID)}),_internals317={readPrWorkflowGateStateForRecovery,readDelegationsDetailed,isPrWorkflowAutoWakeSuppressed,resolvePrWorkflowControllerSession,resolveCurrentGitHeadAsync,resolveIsWorkingTreeCleanAsync,runGitCapture:runGitCapture2,classifyGitState:classifyPrWorkflowGitState,truncateToByteBudget,resolveWorkflowGateSession,findByBatchIdDetailed,boundUntrusted,boundFindingLine};init_p_limit();init_zod();init_config2();init_manager2();init_utils();init_external_tool_runner();init_filesystem_identity();init_git_executable();init_project_boundary();init_create_tool();init_lint();import*as path368 from"node:path";init_quality_budget();init_sast_scan();init_secretscan();var TOOL_TIMEOUT_MS=60000,MAX_COMBINED_BYTES=500000,MAX_COMPACT_ERROR_BYTES=4096,CANCELLATION_SETTLEMENT_GRACE_MS=1000,MAX_CONCURRENT=4,MAX_FILES=100,GIT_TIMEOUT_MS12=1e4,GIT_MAX_OUTPUT_BYTES2=2000000,ALL_LINES_CHANGED=-1,MAX_CHANGED_LINE_ENTRIES=200000,_internals318={qualityBudget,runLintWrapped,runSecretscanWrapped,runSastScanWrapped,runQualityBudgetWrapped,runWithTimeout:runWithTimeout2,getChangedLineRanges,getChangedLineAmbiguousFiles,saveEvidence,runExternalTool,detectResolvedLinter,runLintOnFiles,platform:()=>process.platform,serializePreCheckResult,resolveGatePreamble,runPreCheckBatch,loadGateOverrides,MAX_COMBINED_BYTES};function formatIncompletePaths(incompletePaths,maxEntries=3){let visible=incompletePaths.slice(0,maxEntries).map((entry)=>{return`${entry.path} (${entry.reason})`}),suffix=incompletePaths.length>maxEntries?` (+${incompletePaths.length-maxEntries} more)`:"";return`${visible.join("; ")}${suffix}`}function evaluateSecretscanGate(toolResult,requestedFiles,classification){if(toolResult.error)return{passed:!1,summary:`Secretscan wrapper error: ${toolResult.error}`,findingsCount:0};if(!toolResult.ran||!toolResult.result)return{passed:!1,summary:"Secretscan did not return a result",findingsCount:0};if("error"in toolResult.result)return{passed:!1,summary:`Secretscan error: ${toolResult.result.error}`,findingsCount:0};let result=toolResult.result;if(typeof result.incomplete_files!=="number"||!Array.isArray(result.incomplete_paths))return{passed:!1,summary:"Secretscan failed: scanner returned incomplete coverage metadata",result,findingsCount:Math.max(result.count,result.findings.length)};let findingsCount=Math.max(result.count,result.findings.length),failures=[],vacuousCoverage=result.files_scanned===0&&typeof result.policy_skipped_files==="number"&&typeof result.requested_files==="number"&&result.requested_files>0&&result.policy_skipped_files>=result.requested_files&&result.count===0&&result.findings.length===0&&result.incomplete_files===0&&result.incomplete_paths.length===0,newFindingsCount=classification?classification.newFindings.length:findingsCount;if(newFindingsCount>0)failures.push(`${newFindingsCount} new secret finding(s) on changed lines`);if(result.truncated===!0)failures.push(`results truncated at ${SECRETSCAN_MAX_FINDINGS} findings`);if(result.incomplete_files>0||result.incomplete_paths.length>0){let incompletePaths=result.incomplete_paths.length>0?`; incomplete paths: ${formatIncompletePaths(result.incomplete_paths)}`:"";failures.push(`${result.incomplete_files} incomplete file(s)${incompletePaths}`)}if(result.count!==result.findings.length)failures.push(`findings/count mismatch (reported ${result.count}, actual ${result.findings.length})`);if(requestedFiles>0&&result.files_scanned===0&&!vacuousCoverage)failures.push(typeof result.ignored_files==="number"&&result.ignored_files>0?`${result.ignored_files} requested file(s) suppressed by .secretscanignore; no file scanned`:"zero requested files scanned");let statistics=`Secretscan: ${findingsCount} finding(s), ${result.files_scanned} files scanned, ${result.skipped_files} skipped`;if(classification)statistics+=`, ${classification.newFindings.length} new secret finding(s) on changed lines (${classification.preexistingFindings.length} pre-existing)`;if(vacuousCoverage)statistics+=`, all ${result.requested_files} requested file(s) skipped by secretscan scan policy (vacuous coverage)`;let passedSummary=classification?.diffScoped?`${statistics}; secretscan green = zero new secrets on changed lines`:statistics;return{passed:failures.length===0,summary:failures.length>0?`${statistics}; failed: ${failures.join("; ")}`:passedSummary,result,findingsCount,...classification&&{newFindingsCount:classification.newFindings.length,preexistingFindingsCount:classification.preexistingFindings.length,diffScoped:classification.diffScoped}}}function truncateUtf8(value,maxBytes){if(Buffer.byteLength(value,"utf8")<=maxBytes)return value;let marker="... (truncated)",budget=Math.max(0,maxBytes-Buffer.byteLength(marker,"utf8")),result="",usedBytes=0;for(let character of value){let characterBytes=Buffer.byteLength(character,"utf8");if(usedBytes+characterBytes>budget)break;result+=character,usedBytes+=characterBytes}return`${result}${marker}`}function compactToolResult(toolResult){return{ran:toolResult.ran,duration_ms:toolResult.duration_ms,...toolResult.error!==void 0&&{error:truncateUtf8(toolResult.error,MAX_COMPACT_ERROR_BYTES)},...toolResult.error===void 0&&toolResult.result!==void 0&&{result_omitted:!0}}}function serializePreCheckResult(result){let serialized3=JSON.stringify(result,null,2);if(Buffer.byteLength(serialized3,"utf8")<=MAX_COMBINED_BYTES)return serialized3;let compact={batch_status:result.batch_status,gates_passed:result.gates_passed,...result.sast_degraded!==void 0&&{sast_degraded:result.sast_degraded},...result.sast_skipped!==void 0&&{sast_skipped:result.sast_skipped},lint:compactToolResult(result.lint),secretscan:compactToolResult(result.secretscan),sast_scan:compactToolResult(result.sast_scan),quality_budget:compactToolResult(result.quality_budget),total_duration_ms:result.total_duration_ms,output_truncated:!0};return JSON.stringify(compact,null,2)}function isWindowsAbsolutePath(inputPath){return/^[A-Za-z]:[/\\]/.test(inputPath)}function validatePath(inputPath,baseDir,workspaceDir){if(typeof inputPath!=="string")return"path must be a string";if(!inputPath||inputPath.trim().length===0)return"path is required";let resolved,isWinAbs=isWindowsAbsolutePath(inputPath);if(isWinAbs)resolved=path368.win32.resolve(inputPath);else if(path368.isAbsolute(inputPath))resolved=path368.resolve(inputPath);else resolved=path368.resolve(baseDir,inputPath);let workspaceResolved=isWindowsAbsolutePath(workspaceDir)?path368.win32.resolve(workspaceDir):path368.resolve(workspaceDir),relative98;if(isWinAbs)relative98=path368.win32.relative(workspaceResolved,resolved);else relative98=path368.relative(workspaceResolved,resolved);if(relative98.startsWith(".."))return"path traversal detected";return null}function isAcceptedProjectRootForPlatform(dir,workspaceDir,platform,hasExplicitBoundary,exactPhysicalRoot=!1){if(exactPhysicalRoot)return!0;let pathApi=platform==="win32"?path368.win32:path368,directoryKey=pathApi.resolve(dir).replace(/\\/g,"/"),workspaceKey=pathApi.resolve(workspaceDir).replace(/\\/g,"/"),normalizedDirectoryKey=platform==="win32"?directoryKey.toLowerCase():directoryKey,normalizedWorkspaceKey=platform==="win32"?workspaceKey.toLowerCase():workspaceKey;if(normalizedDirectoryKey===normalizedWorkspaceKey)return!0;let relative98=pathApi.relative(workspaceDir,dir);return relative98!==""&&relative98!==".."&&!relative98.startsWith(`..${pathApi.sep}`)&&!pathApi.isAbsolute(relative98)&&hasExplicitBoundary}function validateDirectory2(dir,workspaceDir){if(!dir||dir.length===0)return"directory is required";if(dir.length>500)return"directory path too long";let exactPhysicalRoot=sameExistingFilesystemPath(dir,workspaceDir);if(!exactPhysicalRoot){let traversalCheck=validatePath(dir,workspaceDir,workspaceDir);if(traversalCheck)return traversalCheck}let platform=_internals318.platform();if(!isAcceptedProjectRootForPlatform(dir,workspaceDir,platform,hasExplicitProjectBoundary(dir),exactPhysicalRoot))return"directory must resolve to the project root";return null}async function runWithTimeout2(operation,timeoutMs,parentSignal,waitForCancellationSettlement=!1){let controller=new AbortController,timeoutHandle,parentAbortListener;if(parentSignal?.aborted)throw Error("Tool execution cancelled");let parentAbortPromise=new Promise((_,reject3)=>{if(!parentSignal)return;if(parentAbortListener=()=>{reject3(Error("Tool execution cancelled")),controller.abort()},parentSignal.addEventListener("abort",parentAbortListener,{once:!0}),parentSignal.aborted)parentAbortListener()});if(controller.signal.aborted)return await parentAbortPromise;let operationPromise=operation(controller.signal);try{let timeoutPromise=new Promise((_,reject3)=>{timeoutHandle=setTimeout(()=>{reject3(Error(`Timeout after ${timeoutMs}ms`)),controller.abort()},timeoutMs)});return await Promise.race([operationPromise,timeoutPromise,parentAbortPromise])}catch(error93){if(controller.signal.aborted&&waitForCancellationSettlement){let settlementTimer;try{await Promise.race([operationPromise.then(()=>{return},()=>{return}),new Promise((resolve144)=>{settlementTimer=setTimeout(resolve144,CANCELLATION_SETTLEMENT_GRACE_MS)})])}finally{if(settlementTimer!==void 0)clearTimeout(settlementTimer)}}throw error93}finally{if(timeoutHandle!==void 0)clearTimeout(timeoutHandle);if(parentAbortListener&&parentSignal)parentSignal.removeEventListener("abort",parentAbortListener)}}async function runLintWrapped(files,directory,_gates,abortSignal){let start=process.hrtime.bigint();try{let resolvedLinter=await _internals318.detectResolvedLinter(directory,abortSignal);if(!resolvedLinter)return{ran:!1,error:"No linter found (biome or eslint)",duration_ms:Number(process.hrtime.bigint()-start)/1e6};if(files&&files.length>0)return{ran:!0,result:await _internals318.runLintOnFiles(resolvedLinter,files,directory,abortSignal),duration_ms:Number(process.hrtime.bigint()-start)/1e6};return{ran:!0,result:await _internals210.runResolvedLint(resolvedLinter,"check",directory,abortSignal),duration_ms:Number(process.hrtime.bigint()-start)/1e6}}catch(error93){return{ran:!0,error:error93 instanceof Error?error93.message:"Unknown error",duration_ms:Number(process.hrtime.bigint()-start)/1e6}}}async function runLintOnFiles(resolvedLinter,files,workspaceDir,abortSignal){if(resolvedLinter.source==="legacy-test-probe")return _internals210.runResolvedLint(resolvedLinter,"check",workspaceDir,abortSignal);let validatedFiles=[];for(let file3 of files){if(typeof file3!=="string")continue;let resolvedPath=path368.resolve(file3);if(validatePath(resolvedPath,workspaceDir,workspaceDir))continue;validatedFiles.push(resolvedPath)}if(validatedFiles.length===0)return{success:!1,mode:"check",linter:resolvedLinter.linter,command:[],error:"No valid files after security validation"};let args2;if(resolvedLinter.linter==="biome")args2=[...resolvedLinter.argsPrefix,"check",...validatedFiles];else args2=[...resolvedLinter.argsPrefix,...validatedFiles];let command=[...resolvedLinter.displayPrefix,...args2];try{let execution=await _internals318.runExternalTool({executable:resolvedLinter.executable,args:args2,cwd:workspaceDir,timeoutMs:TOOL_TIMEOUT_MS,maxStdoutBytes:512000,maxStderrBytes:512000,abortSignal});if(execution.status!=="completed")return{success:!1,mode:"check",linter:resolvedLinter.linter,command,error:execution.message??`Execution ${execution.status}`};let exitCode=execution.exitCode??1,output=execution.stdout;if(execution.stderr)output+=(output?`
7853
7853
  `:"")+execution.stderr;if(execution.stdoutTruncated||execution.stderrTruncated)output+=`
7854
7854
  ... (output truncated)`;let result={success:!0,mode:"check",linter:resolvedLinter.linter,command,exitCode,output};if(exitCode===0)result.message=`${resolvedLinter.linter} check completed successfully with no issues`;else if(resolvedLinter.linter==="biome"&&output.includes("No files were processed"))result.message=`${resolvedLinter.linter} check processed no files (all specified paths ignored by biome configuration)`;else result.message=`${resolvedLinter.linter} check found issues (exit code ${exitCode}).`;return result}catch(error93){return{success:!1,mode:"check",linter:resolvedLinter.linter,command,error:error93 instanceof Error?`Execution failed: ${error93.message}`:"Execution failed: unknown error"}}}async function runSecretscanWrapped(files,directory,_gates,abortSignal,rawRequestedFiles){let start=process.hrtime.bigint();try{if(files&&files.length>0)return{ran:!0,result:await runWithTimeout2(()=>runSecretscanOnFiles(files,directory,rawRequestedFiles),TOOL_TIMEOUT_MS,abortSignal),duration_ms:Number(process.hrtime.bigint()-start)/1e6};return{ran:!0,result:await runWithTimeout2(()=>runSecretscan(directory),TOOL_TIMEOUT_MS,abortSignal,!0),duration_ms:Number(process.hrtime.bigint()-start)/1e6}}catch(error93){return{ran:!0,error:error93 instanceof Error?error93.message:"Unknown error",duration_ms:Number(process.hrtime.bigint()-start)/1e6}}}async function runSastScanWrapped(changedFiles,directory,severityThreshold,gates,phase,abortSignal){let start=process.hrtime.bigint();try{return{ran:!0,result:await runWithTimeout2((signal2)=>sastScan({changed_files:changedFiles,severity_threshold:severityThreshold,phase,abort_signal:signal2},directory,gates),TOOL_TIMEOUT_MS,abortSignal,!0),duration_ms:Number(process.hrtime.bigint()-start)/1e6}}catch(error93){return{ran:!0,error:error93 instanceof Error?error93.message:"Unknown error",duration_ms:Number(process.hrtime.bigint()-start)/1e6}}}async function runQualityBudgetWrapped(changedFiles,directory,gates,abortSignal){let start=process.hrtime.bigint();try{return{ran:!0,result:await runWithTimeout2((signal2)=>_internals318.qualityBudget({changed_files:changedFiles,config:gates?.quality_budget},directory,signal2),TOOL_TIMEOUT_MS,abortSignal,!0),duration_ms:Number(process.hrtime.bigint()-start)/1e6}}catch(error93){return{ran:!0,error:error93 instanceof Error?error93.message:"Unknown error",duration_ms:Number(process.hrtime.bigint()-start)/1e6}}}var GATE_SEVERITIES=new Set(["high","critical"]),SEVERITY_ORDER_PCB={low:0,medium:1,high:2,critical:3};function meetsThresholdForTriage(severity2,threshold){return(SEVERITY_ORDER_PCB[severity2]??0)>=(SEVERITY_ORDER_PCB[threshold]??1)}async function runGit8(args2,directory,abortSignal){let gitExecutable;try{gitExecutable=await resolveGitExecutableAsync()}catch{return null}let result=await _internals318.runExternalTool({executable:gitExecutable,args:args2,cwd:directory,timeoutMs:GIT_TIMEOUT_MS12,maxStdoutBytes:GIT_MAX_OUTPUT_BYTES2,maxStderrBytes:64000,abortSignal});if(result.status!=="completed"||result.exitCode!==0||result.stdoutTruncated)return null;return result.stdout}function decodeGitQuotedPath(value){if(!value.startsWith('"'))return value;if(!value.endsWith('"'))return null;let bytes=[],appendText=(text)=>{bytes.push(...Buffer.from(text,"utf8"))};for(let index=1;index<value.length-1;index++){let codePoint=value.codePointAt(index);if(codePoint===void 0)return null;let char=String.fromCodePoint(codePoint);if(char!=="\\"){if(appendText(char),char.length===2)index++;continue}if(index++,index>=value.length-1)return null;let escaped=value[index],simple={"\\":"\\",'"':'"',t:"\t",n:`
7855
- `,r:"\r",b:"\b",f:"\f",v:"\v"};if(simple[escaped]!==void 0){appendText(simple[escaped]);continue}if(/[0-7]/.test(escaped)){let octal=escaped;for(let count4=0;count4<2;count4++){let next=value[index+1];if(!next||!/[0-7]/.test(next))break;octal+=next,index++}bytes.push(Number.parseInt(octal,8));continue}return null}return Buffer.from(bytes).toString("utf8")}function normalizeRepoPathKey(repoPath){let normalized=repoPath.replace(/\\/g,"/");return _internals318.platform()==="win32"||_internals318.platform()==="darwin"?normalized.toLowerCase():normalized}function normalizeDiffPath(rawPath){let pathToken=rawPath.startsWith('"')?rawPath:rawPath.split("\t",1)[0],decoded=decodeGitQuotedPath(pathToken);if(decoded===null||decoded==="/dev/null"||decoded.trim().length===0)return null;return normalizeRepoPathKey(decoded)}function parseDiffLineRangesChecked(diffOutput,requireGitFileHeaders){let result=new Map,currentFile=null,inGitFile=!1,expectingDestination=!1,destinationSeen=!1,destinationNeedsHunk=!1,collectedLines=0;for(let rawLine of diffOutput.split(/\r?\n/)){let line=rawLine.endsWith("\r")?rawLine.slice(0,-1):rawLine;if(line.startsWith("diff --git ")){if(expectingDestination||destinationNeedsHunk)return null;inGitFile=!0,currentFile=null,expectingDestination=!1,destinationSeen=!1;continue}if(line.startsWith("--- ")&&(inGitFile||!requireGitFileHeaders)){if(expectingDestination||destinationNeedsHunk)return null;expectingDestination=!0;continue}if(line.startsWith("+++ ")){if(requireGitFileHeaders&&(!inGitFile||!expectingDestination))return null;let rawDestination=line.slice(4);if(currentFile=normalizeDiffPath(rawDestination),currentFile===null&&rawDestination.trim()!=="/dev/null")return null;if(expectingDestination=!1,destinationSeen=!0,destinationNeedsHunk=!0,!currentFile)continue;if(!result.has(currentFile))result.set(currentFile,new Set);continue}if(!line.startsWith("@@"))continue;if(expectingDestination||requireGitFileHeaders&&(!inGitFile||!destinationSeen))return null;let match=/^@@ -\d+(?:,\d+)? \+(\d+)(?:,(\d+))? @@/.exec(line);if(!match)return null;let start=Number.parseInt(match[1],10),count4=match[2]!==void 0?Number.parseInt(match[2],10):1;if(!Number.isSafeInteger(start)||!Number.isSafeInteger(count4)||count4<0||count4>0&&start<1||count4>MAX_CHANGED_LINE_ENTRIES||start+count4-1>Number.MAX_SAFE_INTEGER||collectedLines+count4>MAX_CHANGED_LINE_ENTRIES)return null;if(destinationNeedsHunk=!1,!currentFile)continue;let lines=result.get(currentFile);if(!lines)return null;for(let index=0;index<count4;index++)lines.add(start+index);collectedLines+=count4}if(expectingDestination||destinationNeedsHunk)return null;return result}function mergeChangedLines(target,source){for(let[file3,sourceLines]of source){let targetLines=target.get(file3)??new Set;for(let line of sourceLines)targetLines.add(line);target.set(file3,targetLines)}}function parseUntrackedStatus(output){if(output.length>0&&!output.endsWith("\x00"))return null;let untracked=[],records=output.split("\x00");for(let index=0;index<records.length-1;index++){let record3=records[index];if(!record3||record3.length<4||record3[2]!==" ")return null;let status2=record3.slice(0,2),filePath=record3.slice(3);if(!filePath||!isKnownPorcelainStatus(status2))return null;if(status2==="??"||status2==="!!")untracked.push(normalizeRepoPathKey(filePath));if(/[RC]/.test(status2)){let sourcePath=records[++index];if(!sourcePath||looksLikePorcelainStatusRecord(sourcePath))return null}}return untracked}function isKnownPorcelainStatus(status2){if(status2==="??"||status2==="!!")return!0;if(/U/.test(status2))return new Set(["DD","AU","UD","UA","DU","AA","UU"]).has(status2);return status2!==" "&&/^[ MTADRC]{2}$/.test(status2)}function looksLikePorcelainStatusRecord(value){return value.length>=4&&value[2]===" "&&isKnownPorcelainStatus(value.slice(0,2))}async function getChangedLineAmbiguousFiles(directory,abortSignal,requestedFiles=[]){let mergeBase=null;for(let baseBranch of["zaxbyhub/main","upstream/main","origin/main","main","origin/master","master"]){let candidate2=(await runGit8(["merge-base",baseBranch,"HEAD"],directory,abortSignal))?.trim();if(candidate2&&/^[0-9a-f]{40,64}$/i.test(candidate2)){mergeBase=candidate2;break}}if(!mergeBase)return null;let headSha=(await runGit8(["rev-parse","HEAD"],directory,abortSignal))?.trim();if(typeof headSha==="string"&&/^[0-9a-f]{40,64}$/i.test(headSha)&&headSha.toLowerCase()===mergeBase.toLowerCase())return null;let literalPathspecs=requestedFiles.map((file3)=>path368.relative(directory,file3).replace(/\\/g,"/")).filter((file3)=>file3.length>0&&file3!==".."&&!file3.startsWith("../")).map((file3)=>`:(literal)${file3}`),statusArgs=["-c","core.quotePath=false","status","--porcelain=v1","-z","--untracked-files=all",...literalPathspecs.length>0?["--",...literalPathspecs]:[]],[committedNames,status2]=await Promise.all([runGit8(["-c","core.quotePath=false","diff","--name-only","--no-ext-diff","--no-color","--no-prefix","-z",`${mergeBase}..HEAD`,"--",...literalPathspecs.length>0?literalPathspecs:[]],directory,abortSignal),runGit8(statusArgs,directory,abortSignal)]);if(committedNames===null||status2===null)return null;let committed=new Set(committedNames.split("\x00").filter(Boolean).map(normalizeRepoPathKey)),staged=new Set,unstaged=new Set;if(status2.length>0&&!status2.endsWith("\x00"))return null;let records=status2.split("\x00");for(let index=0;index<records.length-1;index++){let record3=records[index];if(!record3||record3.length<4||record3[2]!==" ")return null;let statusCode=record3.slice(0,2),filePath=record3.slice(3);if(!filePath||!isKnownPorcelainStatus(statusCode))return null;if(statusCode!=="??"&&statusCode!=="!!"){let key3=normalizeRepoPathKey(filePath);if(/[MADRCU]/.test(statusCode[0]))staged.add(key3);if(/[MADRCU]/.test(statusCode[1]))unstaged.add(key3)}if(/[RC]/.test(statusCode)){let sourcePath=records[++index];if(!sourcePath||looksLikePorcelainStatusRecord(sourcePath))return null}}let ambiguous=new Set;for(let key3 of committed)if(staged.has(key3)||unstaged.has(key3))ambiguous.add(key3);for(let key3 of staged)if(unstaged.has(key3))ambiguous.add(key3);return ambiguous}async function getChangedLineRanges(directory,abortSignal,requestedFiles=[]){let mergeBase=null;for(let baseBranch of["zaxbyhub/main","upstream/main","origin/main","main","origin/master","master"]){let candidate2=(await runGit8(["merge-base",baseBranch,"HEAD"],directory,abortSignal))?.trim();if(candidate2&&/^[0-9a-f]{40,64}$/i.test(candidate2)){mergeBase=candidate2;break}}if(!mergeBase)return null;let commonDiffArgs=["-c","core.quotePath=false","diff","--no-ext-diff","--no-color","--no-prefix","-U0"],requestedPathspecs=requestedFiles.map((file3)=>path368.relative(directory,file3).replace(/\\/g,"/")).filter((file3)=>file3.length>0&&file3!==".."&&!file3.startsWith("../")),statusArgs=["-c","core.quotePath=false","status","--porcelain=v1","-z","--untracked-files=all",...requestedPathspecs.length>0?["--ignored=matching"]:[],...requestedPathspecs.length>0?["--",...requestedPathspecs]:[]],[committed,staged,unstaged,status2]=await Promise.all([runGit8([...commonDiffArgs,`${mergeBase}..HEAD`,"--"],directory,abortSignal),runGit8([...commonDiffArgs,"--cached","HEAD","--"],directory,abortSignal),runGit8([...commonDiffArgs,"--"],directory,abortSignal),runGit8(statusArgs,directory,abortSignal)]);if(committed===null||staged===null||unstaged===null||status2===null)return null;let committedLines=parseDiffLineRangesChecked(committed,!0),stagedLines=parseDiffLineRangesChecked(staged,!0),unstagedLines=parseDiffLineRangesChecked(unstaged,!0);if(!committedLines||!stagedLines||!unstagedLines)return null;let result=new Map;mergeChangedLines(result,committedLines),mergeChangedLines(result,stagedLines),mergeChangedLines(result,unstagedLines);let untracked=parseUntrackedStatus(status2);if(untracked===null)return null;let requestedKeys=requestedPathspecs.map(normalizeRepoPathKey);for(let file3 of untracked)if(result.set(file3,new Set([ALL_LINES_CHANGED])),file3.endsWith("/")){for(let requestedFile of requestedKeys)if(requestedFile.startsWith(file3))result.set(requestedFile,new Set([ALL_LINES_CHANGED]))}return result}function classifySastFindings(findings,changedLineRanges,directory){if(!changedLineRanges)return{newFindings:findings,preexistingFindings:[]};let newFindings=[],preexistingFindings=[],pathApi=_internals318.platform()==="win32"?path368.win32:path368.posix,resolvedDirectory=pathApi.resolve(directory);for(let finding of findings){let filePath=finding.location.file,normalised;try{if(typeof filePath!=="string"||filePath.length===0||filePath.includes("\x00")){newFindings.push(finding);continue}let resolvedFinding=pathApi.isAbsolute(filePath)?pathApi.resolve(filePath):pathApi.resolve(resolvedDirectory,filePath),relative98=pathApi.relative(resolvedDirectory,resolvedFinding);if(pathApi.isAbsolute(relative98)||relative98===".."||relative98.startsWith(`..${pathApi.sep}`)){newFindings.push(finding);continue}normalised=normalizeRepoPathKey(relative98)}catch{newFindings.push(finding);continue}let changedLines=changedLineRanges.get(normalised);if(changedLines?.has(ALL_LINES_CHANGED)||changedLines?.has(finding.location.line))newFindings.push(finding);else preexistingFindings.push(finding)}return{newFindings,preexistingFindings}}function classifySecretFindings(findings,changedLineRanges,directory,ambiguousFiles){if(!changedLineRanges)return{newFindings:findings,preexistingFindings:[]};let newFindings=[],preexistingFindings=[],pathApi=_internals318.platform()==="win32"?path368.win32:path368.posix,resolvedDirectory=pathApi.resolve(directory);for(let finding of findings){let{path:filePath,line}=finding;if(typeof filePath!=="string"||filePath.length===0||filePath.includes("\x00")||typeof line!=="number"||!Number.isSafeInteger(line)||line<1){newFindings.push(finding);continue}let changedLines;try{let resolvedFinding=pathApi.isAbsolute(filePath)?pathApi.resolve(filePath):pathApi.resolve(resolvedDirectory,filePath),relative98=pathApi.relative(resolvedDirectory,resolvedFinding);if(pathApi.isAbsolute(relative98)||relative98===".."||relative98.startsWith(`..${pathApi.sep}`)){newFindings.push(finding);continue}let normalised=normalizeRepoPathKey(relative98);if(ambiguousFiles?.has(normalised)){newFindings.push(finding);continue}changedLines=changedLineRanges.get(normalised)}catch{newFindings.push(finding);continue}if(changedLines!==void 0&&changedLines.size>0&&!changedLines.has(ALL_LINES_CHANGED)&&!changedLines.has(line))preexistingFindings.push(finding);else newFindings.push(finding)}return{newFindings,preexistingFindings}}async function runPreCheckBatch(input,workspaceDir,contextDir,abortSignal){let effectiveWorkspaceDir=workspaceDir||input.directory||contextDir,{files,directory,sast_threshold="medium",gates:gatesOverrides,phase,sast_enabled=!0}=input,gates=gatesOverrides??(input.config?.gates?{sast_scan:input.config.gates.sast_scan,quality_budget:input.config.gates.quality_budget}:void 0),dirError=validateDirectory2(directory,effectiveWorkspaceDir);if(dirError)return warn(`pre_check_batch: Invalid directory: ${dirError}`),{batch_status:"invalid",gates_passed:!1,lint:{ran:!1,error:dirError,duration_ms:0},secretscan:{ran:!1,error:dirError,duration_ms:0},sast_scan:{ran:!1,error:dirError,duration_ms:0},quality_budget:{ran:!1,error:dirError,duration_ms:0},total_duration_ms:0};if(!files||files.length===0)return warn("pre_check_batch: No files provided, skipping all tools (fail-closed)"),{batch_status:"invalid",gates_passed:!1,lint:{ran:!1,error:"No files provided",duration_ms:0},secretscan:{ran:!1,error:"No files provided",duration_ms:0},sast_scan:{ran:!1,error:"No files provided",duration_ms:0},quality_budget:{ran:!1,error:"No files provided",duration_ms:0},total_duration_ms:0};let changedFiles=[],rawDeclaredCount=files.length;for(let file3 of files){if(typeof file3!=="string"){warn(`pre_check_batch: Non-string file entry rejected: ${String(file3)}`);continue}if(validatePath(file3,directory,effectiveWorkspaceDir)){warn(`pre_check_batch: Invalid file path: ${file3}`);continue}changedFiles.push(path368.resolve(directory,file3))}if(changedFiles.length===0)return warn("pre_check_batch: No valid files after validation, skipping all tools (fail-closed)"),{batch_status:"invalid",gates_passed:!1,lint:{ran:!1,error:"No files provided",duration_ms:0},secretscan:{ran:!1,error:"No files provided",duration_ms:0},sast_scan:{ran:!1,error:"No files provided",duration_ms:0},quality_budget:{ran:!1,error:"No files provided",duration_ms:0},total_duration_ms:0};try{assertProjectRoot(directory)}catch(error93){let rootError=error93 instanceof Error?error93.message:String(error93);return warn(`pre_check_batch: Project-root validation failed: ${rootError}`),{batch_status:"invalid",gates_passed:!1,lint:{ran:!1,error:rootError,duration_ms:0},secretscan:{ran:!1,error:rootError,duration_ms:0},sast_scan:{ran:!1,error:rootError,duration_ms:0},quality_budget:{ran:!1,error:rootError,duration_ms:0},total_duration_ms:0}}if(changedFiles.length>MAX_FILES)throw Error(`Input exceeds maximum file count: ${changedFiles.length} > ${MAX_FILES}`);let limit=pLimit(MAX_CONCURRENT),sastDisabledByConfig=gates?.sast_scan?.enabled===!1,[lintResult,secretscanResult,sastScanResult,qualityBudgetResult]=await Promise.all([limit(()=>_internals318.runLintWrapped(changedFiles,directory,gates,abortSignal)),limit(()=>_internals318.runSecretscanWrapped(changedFiles,directory,gates,abortSignal,rawDeclaredCount)),sast_enabled&&!sastDisabledByConfig?limit(()=>_internals318.runSastScanWrapped(changedFiles,directory,sast_threshold,gates,phase,abortSignal)):Promise.resolve({ran:!1,duration_ms:0}),limit(()=>_internals318.runQualityBudgetWrapped(changedFiles,directory,gates,abortSignal))]),totalDuration=lintResult.duration_ms+secretscanResult.duration_ms+sastScanResult.duration_ms+qualityBudgetResult.duration_ms,gatesPassed=!0;if(lintResult.ran&&lintResult.result){let lintRes=lintResult.result;if("success"in lintRes&&lintRes.success===!1)warn("pre_check_batch: Lint found issues (informational only)")}else if(lintResult.error)warn(`pre_check_batch: Lint error (informational only): ${lintResult.error}`);let changedLineRangesMemo,getChangedLineRangesMemoized=async()=>{if(changedLineRangesMemo===void 0)changedLineRangesMemo=await _internals318.getChangedLineRanges(directory,abortSignal,changedFiles);return changedLineRangesMemo},secretscanClassification,secretscanPreexistingFindings,secretscanScanFindings=secretscanResult.ran&&secretscanResult.result&&!("error"in secretscanResult.result)?secretscanResult.result.findings:[];if(secretscanScanFindings.length>0){let changedLineRanges=await getChangedLineRangesMemoized(),ambiguousFiles=await _internals318.getChangedLineAmbiguousFiles(directory,abortSignal,changedFiles);if(ambiguousFiles===null)secretscanClassification={newFindings:secretscanScanFindings,preexistingFindings:[],diffScoped:!1};else{let{newFindings,preexistingFindings}=classifySecretFindings(secretscanScanFindings,changedLineRanges,directory,ambiguousFiles);if(secretscanClassification={newFindings,preexistingFindings,diffScoped:changedLineRanges!==null},preexistingFindings.length>0)secretscanPreexistingFindings=preexistingFindings,warn(`pre_check_batch: Secretscan found ${preexistingFindings.length} pre-existing secret finding(s) on unchanged lines - visible, non-gating, passed to reviewer for triage`)}}let secretscanDecision=evaluateSecretscanGate(secretscanResult,rawDeclaredCount,secretscanClassification);if(!secretscanDecision.passed)gatesPassed=!1,warn(`pre_check_batch: ${secretscanDecision.summary} - GATE FAILED`);if(secretscanResult.ran||secretscanResult.error)try{let scanResult=secretscanDecision.result,secretscanEvidence={task_id:"secretscan",type:"secretscan",timestamp:new Date().toISOString(),agent:"pre_check_batch",verdict:secretscanDecision.passed?"pass":"fail",summary:secretscanDecision.summary,findings_count:secretscanDecision.findingsCount,scan_directory:scanResult?.scan_dir??directory,files_scanned:scanResult?.files_scanned??0,skipped_files:scanResult?.skipped_files??0,ignored_files:scanResult?.ignored_files??0,policy_skipped_files:scanResult?.policy_skipped_files??0,requested_files:scanResult?.requested_files??rawDeclaredCount,new_findings_count:secretscanDecision.newFindingsCount??0,preexisting_findings_count:secretscanDecision.preexistingFindingsCount??0,diff_scoped:secretscanDecision.diffScoped??!1,incomplete_files:scanResult?.incomplete_files??changedFiles.length,incomplete_paths:scanResult?.incomplete_paths??[{path:".",reason:"missing_coverage_metadata"}]};await _internals318.saveEvidence(directory,"secretscan",secretscanEvidence,abortSignal)}catch(e){let persistError=`Failed to persist secretscan evidence: ${e instanceof Error?e.message:String(e)}`;secretscanResult.error=persistError,gatesPassed=!1,warn(`pre_check_batch: ${persistError} - GATE FAILED`)}let sastPreexistingFindings,sastDegraded=!1;if(sastScanResult.ran&&sastScanResult.result){let sastResult=sastScanResult.result;if(sastResult.error)if(sastResult.failure_kind==="semgrep_process_exit"&&sastResult.findings.length===0)sastDegraded=!0,warn(`pre_check_batch: SAST coverage degraded (${sastResult.error}) - continuing without a gate failure`);else gatesPassed=!1,warn(`pre_check_batch: SAST scan error (${sastResult.error}) - GATE FAILED`);else if(sastResult.baseline_used){let sastCarryFindings=[...sastResult.pre_existing_findings??[],...sastResult.moved_findings??[]];if(sastCarryFindings.length>0){if(sastPreexistingFindings=sastCarryFindings.filter((f)=>meetsThresholdForTriage(f.severity,sast_threshold)),sastPreexistingFindings.length>0)warn(`pre_check_batch: SAST baseline diff found ${sastPreexistingFindings.length} pre-existing/moved finding(s) - passing to reviewer for triage`)}if(sastResult.verdict==="fail")gatesPassed=!1,warn("pre_check_batch: SAST scan found new findings above threshold - GATE FAILED")}else if(sastResult.verdict==="fail"){let gateFindings=sastResult.findings.filter((f)=>GATE_SEVERITIES.has(f.severity));if(gateFindings.length>0){let changedLineRanges=await getChangedLineRangesMemoized(),{newFindings,preexistingFindings}=classifySastFindings(gateFindings,changedLineRanges,directory);if(newFindings.length>0)gatesPassed=!1,warn(`pre_check_batch: SAST scan found ${newFindings.length} new HIGH/CRITICAL finding(s) on changed lines - GATE FAILED`);else if(preexistingFindings.length>0)sastPreexistingFindings=preexistingFindings,warn(`pre_check_batch: SAST scan found ${preexistingFindings.length} pre-existing HIGH/CRITICAL finding(s) on unchanged lines - passing to reviewer for triage`)}else gatesPassed=!1,warn("pre_check_batch: SAST scan found vulnerabilities - GATE FAILED")}}else if(sastScanResult.error)gatesPassed=!1,warn(`pre_check_batch: SAST scan error - GATE FAILED: ${sastScanResult.error}`);if(qualityBudgetResult.ran&&qualityBudgetResult.result){if(qualityBudgetResult.result.verdict==="fail")warn("pre_check_batch: Quality budget exceeded (informational only)")}else if(qualityBudgetResult.error)warn(`pre_check_batch: Quality budget error (informational only): ${qualityBudgetResult.error}`);return{batch_status:[lintResult,secretscanResult,sastScanResult,qualityBudgetResult].every((toolResult)=>toolResult.ran===!1)?"skipped":"completed",gates_passed:gatesPassed,lint:lintResult,secretscan:secretscanResult,sast_scan:sastScanResult,quality_budget:qualityBudgetResult,total_duration_ms:Math.round(totalDuration),...sastDegraded&&{sast_degraded:!0},...(!sast_enabled||sastDisabledByConfig)&&{sast_skipped:!0},...sastPreexistingFindings&&sastPreexistingFindings.length>0&&{sast_preexisting_findings:sastPreexistingFindings},...secretscanPreexistingFindings&&secretscanPreexistingFindings.length>0&&{secretscan_preexisting_findings:secretscanPreexistingFindings}}}var pre_check_batch=createSwarmTool({allowWorkingDirectoryOverride:!0,description:"Run multiple verification tools in parallel: lint, secretscan, SAST scan, and quality budget. Returns unified result with gates_passed status. Security findings and incomplete SAST runs are hard failures; a Semgrep nonzero process exit with zero findings is returned as explicit sast_degraded coverage and does not block.",args:{files:exports_external.array(exports_external.string()).optional().describe("Specific files to check (optional, scans directory if not provided)"),directory:exports_external.string().describe("Project root directory — ordinary workspace subdirectories are rejected; direct .git or .opencode project boundaries are accepted"),sast_threshold:exports_external.enum(["low","medium","high","critical"]).optional().describe("Minimum severity for SAST findings to cause failure (default: medium)"),phase:exports_external.number().int().min(1).optional().describe("Current phase number (positive integer >= 1). When provided, enables SAST baseline diffing: only findings absent from the phase-scoped baseline fail the gate.")},async execute(args2,directory,ctx){if(!args2||typeof args2!=="object")return serializePreCheckResult({batch_status:"invalid",gates_passed:!1,lint:{ran:!1,error:"Invalid arguments",duration_ms:0},secretscan:{ran:!1,error:"Invalid arguments",duration_ms:0},sast_scan:{ran:!1,error:"Invalid arguments",duration_ms:0},quality_budget:{ran:!1,error:"Invalid arguments",duration_ms:0},total_duration_ms:0});if(!directory||typeof directory!=="string"||directory.trim()==="")return serializePreCheckResult({batch_status:"invalid",gates_passed:!1,lint:{ran:!1,error:"project directory is required but was not provided",duration_ms:0},secretscan:{ran:!1,error:"project directory is required but was not provided",duration_ms:0},sast_scan:{ran:!1,error:"project directory is required but was not provided",duration_ms:0},quality_budget:{ran:!1,error:"project directory is required but was not provided",duration_ms:0},total_duration_ms:0});let typedArgs=args2;if(!typedArgs.directory)return serializePreCheckResult({batch_status:"invalid",gates_passed:!1,lint:{ran:!1,error:"directory is required",duration_ms:0},secretscan:{ran:!1,error:"directory is required",duration_ms:0},sast_scan:{ran:!1,error:"directory is required",duration_ms:0},quality_budget:{ran:!1,error:"directory is required",duration_ms:0},total_duration_ms:0});let resolvedDirectory=path368.resolve(typedArgs.directory),workspaceAnchor=path368.resolve(directory);if(isStrictPathDescendant(resolvedDirectory,workspaceAnchor)&&!hasExplicitProjectBoundary(resolvedDirectory)){let subDirError=`directory "${typedArgs.directory}" is a subdirectory of the project root — pre_check_batch requires the project root directory "${workspaceAnchor}"`;return serializePreCheckResult({batch_status:"invalid",gates_passed:!1,lint:{ran:!1,error:subDirError,duration_ms:0},secretscan:{ran:!1,error:subDirError,duration_ms:0},sast_scan:{ran:!1,error:subDirError,duration_ms:0},quality_budget:{ran:!1,error:subDirError,duration_ms:0},total_duration_ms:0})}let dirError=validateDirectory2(resolvedDirectory,workspaceAnchor);if(dirError)return serializePreCheckResult({batch_status:"invalid",gates_passed:!1,lint:{ran:!1,error:dirError,duration_ms:0},secretscan:{ran:!1,error:dirError,duration_ms:0},sast_scan:{ran:!1,error:dirError,duration_ms:0},quality_budget:{ran:!1,error:dirError,duration_ms:0},total_duration_ms:0});try{let sastEnabled=!0;try{let preamble=await _internals318.resolveGatePreamble(resolvedDirectory,ctx?.sessionID);if(preamble.resolved&&preamble.effectiveGates)sastEnabled=preamble.effectiveGates.sast_enabled}catch{warn("pre_check_batch: QA-gate profile resolution failed; keeping SAST enabled")}let rawPhase=typedArgs.phase,safePhase=typeof rawPhase==="number"&&Number.isInteger(rawPhase)&&rawPhase>=1?rawPhase:void 0,result=await _internals318.runPreCheckBatch({files:typedArgs.files,directory:resolvedDirectory,sast_threshold:typedArgs.sast_threshold,config:typedArgs.config,gates:_internals318.loadGateOverrides(resolvedDirectory),phase:safePhase,sast_enabled:sastEnabled},workspaceAnchor,directory,ctx?.abort);return serializePreCheckResult(result)}catch(error93){let errorMessage3=error93 instanceof Error?error93.message:"Unknown error";return serializePreCheckResult({batch_status:"invalid",gates_passed:!1,lint:{ran:!1,error:errorMessage3,duration_ms:0},secretscan:{ran:!1,error:errorMessage3,duration_ms:0},sast_scan:{ran:!1,error:errorMessage3,duration_ms:0},quality_budget:{ran:!1,error:errorMessage3,duration_ms:0},total_duration_ms:0})}}});init_zod();init_pr_workflow_gate();init_atomic_write();init_create_tool();import{createHash as createHash119}from"node:crypto";import{mkdirSync as mkdirSync98,readdirSync as readdirSync57,realpathSync as realpathSync58,rmSync as rmSync36,statSync as statSync113}from"node:fs";import{tmpdir as tmpdir20}from"node:os";import path369 from"node:path";var MAX_COMMIT_MESSAGE_CHARS=8192,MESSAGE_FILE_TTL_MS=86400000,PreparePrFeedbackCommitMessageArgsSchema=exports_external.object({message:exports_external.string().refine((value)=>value.trim().length>0,{message:"message must not be empty or whitespace-only"}).refine((value)=>value.length<=MAX_COMMIT_MESSAGE_CHARS,{message:`message must be at most ${MAX_COMMIT_MESSAGE_CHARS} characters`}).refine((value)=>!value.includes("\x00"),{message:"message must not contain NUL bytes"}).transform((value)=>value.trim())}).strict();function commitMessageTargetDir(){return path369.join(tmpdir20(),"swarm-pr-feedback-commit-msg")}function resolvePrFeedbackCommitMessageFilePath(sessionID,message){let sanitizedSession=sessionID.replace(/[^A-Za-z0-9._-]/g,"_"),digest5=createHash119("sha256").update(message,"utf8").digest("hex").slice(0,16);return path369.join(commitMessageTargetDir(),`${sanitizedSession}-${digest5}.txt`)}function pruneStaleMessageFiles(){try{let dir=commitMessageTargetDir(),now2=Date.now();for(let entry of readdirSync57(dir)){if(!entry.endsWith(".txt"))continue;let full=path369.join(dir,entry);try{let stats2=statSync113(full);if(now2-stats2.mtimeMs>MESSAGE_FILE_TTL_MS)rmSync36(full,{force:!1})}catch{}}}catch{}}async function executePreparePrFeedbackCommitMessage(args2,directory,context={}){let parsed=PreparePrFeedbackCommitMessageArgsSchema.safeParse(args2);if(!parsed.success)return JSON.stringify({success:!1,message:`Invalid commit-message request: ${parsed.error.issues.map((issue3)=>issue3.path.length>0?`${issue3.path.join(".")}: ${issue3.message}`:issue3.message).join("; ")}`});let sessionID=context.sessionID?.trim();if(!sessionID)return JSON.stringify({success:!1,message:"Commit-message authoring requires an active sessionID"});let state2=await readPrWorkflowGateState(directory,sessionID);if(!state2||state2.mode!=="PR_FEEDBACK"||!state2.prHeadSha)return JSON.stringify({success:!1,message:"Commit-message authoring requires an active bound PR_FEEDBACK workflow; bind the PR head first"});let message=parsed.data.message,targetDir=commitMessageTargetDir(),targetPath=resolvePrFeedbackCommitMessageFilePath(sessionID,message),resolvedTarget=path369.resolve(targetPath),resolvedDir=path369.resolve(targetDir);if(!(resolvedTarget===resolvedDir||resolvedTarget.startsWith(resolvedDir+path369.sep)))return JSON.stringify({success:!1,message:"Commit-message file path escaped the swarm-pr-feedback-commit-msg directory; refusing to write"});let repoRoot=path369.resolve(directory),insideRepo=(value)=>{let rel3=path369.relative(repoRoot,value);return rel3===""||!rel3.startsWith("..")&&!path369.isAbsolute(rel3)};if(insideRepo(resolvedTarget)||insideRepo(resolvedDir))return JSON.stringify({success:!1,message:"TMPDIR resolves inside the repository; the commit-message file must live outside the repository — refusing to write"});try{mkdirSync98(resolvedDir,{recursive:!0});let realpathDir=resolvedDir;try{realpathDir=realpathSync58(resolvedDir)}catch{mkdirSync98(resolvedDir,{recursive:!0})}let realpathTarget=path369.join(realpathDir,path369.basename(resolvedTarget));if(!realpathTarget.startsWith(realpathDir+path369.sep)&&realpathTarget!==realpathDir)return JSON.stringify({success:!1,message:"Commit-message file path escaped the swarm-pr-feedback-commit-msg directory through a symlink; refusing to write"});if(insideRepo(realpathDir))return JSON.stringify({success:!1,message:"The resolved temp directory points inside the repository through a symlink; refusing to write"});pruneStaleMessageFiles(),await atomicWriteFileAnyRoot(realpathTarget,message,{mode:384})}catch(error93){return JSON.stringify({success:!1,message:`Could not author the commit-message file: ${error93 instanceof Error?error93.message:String(error93)}`})}return JSON.stringify({success:!0,path:resolvedTarget,message:"Commit-message file authored outside the repository; commit with git commit -F <path> (the classifier refuses in-repo message files). The file is mode 0600, lives in the OS temp directory, never touches the bound checkout, and is pruned after 24h."})}var prepare_pr_feedback_commit_message=createSwarmTool({description:"Author a PR_FEEDBACK commit message that contains shell metacharacters (e.g. a Co-Authored-By trailer with <...>) into a file OUTSIDE the repository, returning the path for the sanctioned git commit -F command. The inline -m form is rejected by the shell classifier by design; an in-repo message file would dirty the clean-tree arming check. Requires an active bound PR_FEEDBACK workflow.",args:{message:PreparePrFeedbackCommitMessageArgsSchema.shape.message},execute:executePreparePrFeedbackCommitMessage});init_zod();init_guardrails2();init_pr_workflow_gate();init_scope_binding();init_create_tool();var PreparePrFeedbackScopeArgsSchema=exports_external.object({task_id:exports_external.string().regex(/^\d+\.\d+(?:\.\d+)*$/,"task_id must use N.M notation"),files:exports_external.array(exports_external.string().min(1).max(4096)).min(1).max(1e4)}).strict();function failure3(message){return JSON.stringify({success:!1,message},null,2)}async function executePreparePrFeedbackScope(args2,directory,context={}){let parsed=PreparePrFeedbackScopeArgsSchema.safeParse(args2);if(!parsed.success)return failure3(`Invalid PR-feedback scope: ${parsed.error.issues.map((issue3)=>`${issue3.path.join(".")}: ${issue3.message}`).join("; ")}`);let sessionID=context.sessionID?.trim();if(!sessionID)return failure3("PR-feedback scope requires an active session");let files=normalizeScopeFiles(parsed.data.files);if(!files)return failure3("PR-feedback scope contains an unsafe file path");for(let file3 of files){let symlinkBlock=checkWriteTargetForSymlink(file3,directory);if(symlinkBlock)return failure3(symlinkBlock)}try{await declarePrFeedbackScope(directory,sessionID,parsed.data.task_id,files)}catch(error93){return failure3(error93 instanceof Error?error93.message:String(error93))}return JSON.stringify({success:!0,task_id:parsed.data.task_id,files,message:"Scope is bound to the verified PR-feedback revision and will authorize only the next matching coder Task."},null,2)}var prepare_pr_feedback_scope=createSwarmTool({description:"Prepare an exact file scope for one PR-feedback coder Task after immutable feedback verification settles.",args:{task_id:PreparePrFeedbackScopeArgsSchema.shape.task_id,files:PreparePrFeedbackScopeArgsSchema.shape.files},execute:executePreparePrFeedbackScope});init_quality_budget();init_zod();init_pr_workflow_gate();init_create_tool();var RebindPrFeedbackHeadArgsSchema=exports_external.object({pr_head_sha:exports_external.string().trim().regex(/^[0-9a-f]{40}$/i)}).strict();async function executeRebindPrFeedbackHead(args2,directory,context={}){let parsed=RebindPrFeedbackHeadArgsSchema.safeParse(args2);if(!parsed.success)return JSON.stringify({success:!1,message:`Invalid PR feedback rebind: ${parsed.error.issues.map((issue3)=>`${issue3.path.join(".")}: ${issue3.message}`).join("; ")}`});if(!context.sessionID?.trim())return JSON.stringify({success:!1,message:"PR feedback rebind requires an active sessionID"});try{let state2=await rebindPrFeedbackHead(directory,context.sessionID,parsed.data.pr_head_sha);return JSON.stringify({success:!0,pr_head_sha:state2.prHeadSha,rebind_count:state2.prFeedbackRebindCount??1,message:"Rebound the PR_FEEDBACK intake head; every Stage A / verification / gate receipt is invalidated — re-run the full mechanical ladder on the new ancestry."})}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:String(error93)})}}var rebind_pr_feedback_head=createSwarmTool({description:"Rebind a PR_FEEDBACK workflow to a new verified remote PR head after merge/rebase/conflict repair (base-sync). Use ONLY when the history genuinely changed to repair base drift or conflicts: it refuses a no-op rebind to the current intake head, refuses while publication is armed (to change approved content after arming use invalidate_pr_feedback_publication), and refuses while lanes are in flight. It invalidates every ancestry-bound receipt (Stage A, verification, ordered gates) so the full mechanical ladder re-runs on the new ancestry. Requires the full 40-char new PR head SHA; the current checkout must equal it.",args:{pr_head_sha:RebindPrFeedbackHeadArgsSchema.shape.pr_head_sha},execute:executeRebindPrFeedbackHead});init_zod();init_utils2();init_atomic_write();init_create_tool();var FreshnessValueSchema=exports_external.string().trim().min(1).max(500).regex(/^(synced|behind:[1-9][0-9]*|fetch-failed:\S+)$/,"must be 'synced', 'behind:<n>', or 'fetch-failed:<reason>' (reason contains no whitespace)"),RecordBranchFreshnessArgsSchema=exports_external.object({issueNumber:exports_external.number().int().min(1),freshness:FreshnessValueSchema,override:exports_external.string().trim().min(1).max(4000).optional()}).strict();async function executeRecordBranchFreshness(args2,directory,context={}){let parsed=RecordBranchFreshnessArgsSchema.safeParse(args2);if(!parsed.success)return JSON.stringify({success:!1,message:`Invalid branch-freshness receipt: ${parsed.error.issues.map((issue3)=>`${issue3.path.join(".")}: ${issue3.message}`).join("; ")}`});let data=parsed.data;if(data.freshness==="synced"&&data.override)return JSON.stringify({success:!1,message:"An override is only meaningful for a fetch-failed outcome; a synced base needs none."});let receipt={issueNumber:data.issueNumber,freshness:data.freshness,timestamp:new Date().toISOString()};if(data.override)receipt.override=data.override;if(context.sessionID?.trim())receipt.sessionId=context.sessionID.trim();let validatedPath;try{validatedPath=validateSwarmPath(directory,"branch-freshness.json")}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:"Failed to validate path"})}try{await atomicWriteSwarmFile(validatedPath,JSON.stringify(receipt,null,2));let permits=await branchFreshnessReceiptExists(directory,data.issueNumber);return JSON.stringify({success:!0,issueNumber:data.issueNumber,path:".swarm/branch-freshness.json",permits,message:permits?`Branch-freshness receipt recorded for issue #${data.issueNumber}; the trace's freshness gate is satisfied.`:`Branch-freshness receipt recorded for issue #${data.issueNumber}, but the outcome (${data.freshness}) does NOT permit the trace — ${data.freshness.startsWith("behind:")?"re-sync with the default branch and re-record as synced.":"a fetch-failed outcome without a recorded user override fails closed."}`})}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:String(error93)})}}var record_branch_freshness=createSwarmTool({description:`Record the Phase 0 branch-freshness outcome for the current traced issue (issue #2564): freshness is "synced", "behind:<n>", or "fetch-failed:<reason>" exactly as the fetch recorded it, plus an optional verbatim user override for a failed fetch. The /swarm issue --trace workflow will not transition to PLAN until the recorded outcome permits (synced, or fetch-failed with an override). The response's permits field mirrors the gate reader's verdict on the persisted receipt (advisory for the calling agent — the reducer always recomputes it independently).`,args:{issueNumber:RecordBranchFreshnessArgsSchema.shape.issueNumber,freshness:RecordBranchFreshnessArgsSchema.shape.freshness,override:RecordBranchFreshnessArgsSchema.shape.override},execute:executeRecordBranchFreshness});init_zod();init_plan_schema();init_schema();init_extractors();init_manager();init_create_tool();var recordDirectiveOverrideInternals={loadPlan,recordDirectiveOverrides};async function executeRecordDirectiveOverride(args2,directory,ctx){if(!ctx?.sessionID?.trim())return{success:!1,code:"DIRECTIVE_OVERRIDE_SESSION_REQUIRED",message:"An exact session identity is required to record an override."};if(stripKnownSwarmPrefix(ctx.agent??"").toLowerCase()!=="architect")return{success:!1,code:"DIRECTIVE_OVERRIDE_ARCHITECT_ONLY",message:"Only the architect may record a critical-directive override."};let plan=await recordDirectiveOverrideInternals.loadPlan(directory),requestedPhase=plan?.phases.find((candidate2)=>candidate2.id===args2.phase);if(!plan||!requestedPhase||getCurrentPhase(plan)!==args2.phase&&!isPhaseInWrapWindow(plan,args2.phase))return{success:!1,code:"DIRECTIVE_OVERRIDE_PHASE_MISMATCH",message:`Phase ${args2.phase} is neither the current plan phase nor the phase being wrapped.`};let phaseLabel=extractPhaseLabelFromPlan(plan,args2.phase)??`Phase ${args2.phase}`;return await recordDirectiveOverrideInternals.recordDirectiveOverrides(directory,[...new Set(args2.directive_ids)],args2.justification,ctx.sessionID,phaseLabel,args2.phase),{success:!0,code:"DIRECTIVE_OVERRIDE_RECORDED",phase:args2.phase,directive_ids:[...new Set(args2.directive_ids)],message:"Recorded the audited override. Retry phase_complete so every gate is re-evaluated from a fresh snapshot."}}var record_directive_override=createSwarmTool({description:"Architect-only audited override for identified critical-directive violations. Requires the current phase (or the phase being wrapped, whose last task already advanced the cursor), the session identity and substantive justification; it cannot repair or bypass unreadable authority.",args:{directive_ids:exports_external.array(exports_external.string().min(1).max(256)).min(1).max(64),justification:exports_external.string().trim().min(10).max(2000),phase:exports_external.number().int().min(1).max(9999)},execute:async(args2,directory,ctx)=>JSON.stringify(await executeRecordDirectiveOverride(args2,directory,ctx),null,2)});init_zod();init_utils2();init_atomic_write();init_create_tool();var RecordImplementationReviewArgsSchema=exports_external.object({issueNumber:exports_external.number().int().min(1),reviewerVerdict:exports_external.enum(["APPROVE","NEEDS_REVISION","BLOCKED"]),criticVerdict:exports_external.enum(["APPROVE","NEEDS_REVISION","BLOCKED"]),diffBase:exports_external.string().trim().regex(/^[0-9a-f]{7,40}$/i),diffHead:exports_external.string().trim().regex(/^[0-9a-f]{7,40}$/i),notes:exports_external.string().trim().min(8).max(4000)}).strict();async function executeRecordImplementationReview(args2,directory,context={}){let parsed=RecordImplementationReviewArgsSchema.safeParse(args2);if(!parsed.success)return JSON.stringify({success:!1,message:`Invalid implementation review receipt: ${parsed.error.issues.map((issue3)=>`${issue3.path.join(".")}: ${issue3.message}`).join("; ")}`});let data=parsed.data;if(data.reviewerVerdict!=="APPROVE"||data.criticVerdict!=="APPROVE")return JSON.stringify({success:!1,message:"A satisfying implementation-review receipt requires BOTH the reviewer and the critic to have delivered APPROVE; record non-approving verdicts in the working notes and fix the findings instead."});let receipt={issueNumber:data.issueNumber,reviewerVerdict:data.reviewerVerdict,criticVerdict:data.criticVerdict,diffBase:data.diffBase,diffHead:data.diffHead,notes:data.notes,timestamp:new Date().toISOString()};if(context.sessionID?.trim())receipt.sessionId=context.sessionID.trim();let validatedPath;try{validatedPath=validateSwarmPath(directory,"implementation-review.json")}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:"Failed to validate path"})}try{return await atomicWriteSwarmFile(validatedPath,JSON.stringify(receipt,null,2)),JSON.stringify({success:!0,issueNumber:data.issueNumber,path:".swarm/implementation-review.json",message:`Implementation review recorded for issue #${data.issueNumber} (reviewer APPROVE + critic APPROVE); the trace may now satisfy its review gate.`})}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:String(error93)})}}var record_implementation_review=createSwarmTool({description:"Record the independent implementation review for the current traced issue (issue #2131 residual B): dispatch FRESH-context reviewer and critic passes over the implementation diff (separate contexts from the implementer), and once BOTH approve call this with the issue number, both APPROVE verdicts, the reviewed diff base/head SHAs, and notes. The /swarm issue --trace workflow will not hand off to commit-pr until this receipt exists. Non-approving verdicts cannot be recorded here — fix the findings and re-review.",args:{issueNumber:RecordImplementationReviewArgsSchema.shape.issueNumber,reviewerVerdict:RecordImplementationReviewArgsSchema.shape.reviewerVerdict,criticVerdict:RecordImplementationReviewArgsSchema.shape.criticVerdict,diffBase:RecordImplementationReviewArgsSchema.shape.diffBase,diffHead:RecordImplementationReviewArgsSchema.shape.diffHead,notes:RecordImplementationReviewArgsSchema.shape.notes},execute:executeRecordImplementationReview});init_zod();init_url_security();init_loader();init_utils2();init_forge_provider();init_atomic_write();init_create_tool();function loadConfiguredForgeContext4(directory){try{let config3=loadPluginConfig(directory),remote=detectGitRemote(directory,void 0);return resolveForgeContextFromPluginConfig(config3,remote?[remote]:[])??void 0}catch{return}}var RecordIssuePublicationArgsSchema=exports_external.object({issueNumber:exports_external.number().int().min(1),prNumber:exports_external.number().int().min(1),prUrl:exports_external.string().url(),headSha:exports_external.string().min(1).optional()}).strict();async function executeRecordIssuePublication(args2,directory){let parsed=RecordIssuePublicationArgsSchema.safeParse(args2);if(!parsed.success)return JSON.stringify({success:!1,message:`Invalid publication receipt: ${parsed.error.issues.map((issue3)=>`${issue3.path.join(".")}: ${issue3.message}`).join("; ")}`});let{issueNumber,prNumber,prUrl,headSha}=parsed.data,sanitizedPrUrl=sanitizeUrl(prUrl);if(!isForgePrUrl(prUrl)){let configured=loadConfiguredForgeContext4(directory);if(!(configured&&isForgePrUrl(prUrl,configured)))return JSON.stringify({success:!1,message:"Invalid publication receipt: prUrl must be a canonical PR URL (GitHub https://github.com/<owner>/<repo>/pull/<number> or GitLab https://<gitlab-host>/<owner>/<repo>/-/merge_requests/<number>)"})}let receipt={published:!0,issueNumber,prNumber,prUrl:sanitizedPrUrl,publishedAt:new Date().toISOString()};if(headSha)receipt.headSha=headSha;let validatedPath;try{validatedPath=validateSwarmPath(directory,"issue-publication.json")}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:"Failed to validate path"})}try{return await atomicWriteSwarmFile(validatedPath,JSON.stringify(receipt,null,2)),JSON.stringify({success:!0,issueNumber,prNumber,prUrl,path:".swarm/issue-publication.json",message:`Publication receipt recorded for issue #${issueNumber} (PR #${prNumber}); the issue-trace workflow will transition to its terminal published state.`})}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:String(error93)})}}var record_issue_publication=createSwarmTool({description:'Record that the traced issue has been published (PR created/updated) so the /swarm issue --trace workflow can reach its terminal published state. The trace stops at publication_handoff (the commit-pr directive) until this receipt is observed — publication_handoff is NOT "issue resolved". commit-pr calls this after the PR is created/updated. Supply the traced issue number, the exact PR number, the canonical PR URL (GitHub or GitLab), and (optionally) the published HEAD sha. The receipt is issue-bound.',args:{issueNumber:RecordIssuePublicationArgsSchema.shape.issueNumber,prNumber:RecordIssuePublicationArgsSchema.shape.prNumber,prUrl:RecordIssuePublicationArgsSchema.shape.prUrl,headSha:RecordIssuePublicationArgsSchema.shape.headSha},execute:executeRecordIssuePublication});init_zod();init_utils2();init_atomic_write();init_create_tool();var RecordIssueReproductionArgsSchema=exports_external.object({issueNumber:exports_external.number().int().min(1),performed:exports_external.boolean(),commands:exports_external.array(exports_external.string().min(1)).min(1).optional(),output_summary:exports_external.string().min(1).optional()}).strict();async function executeRecordIssueReproduction(args2,directory,context={}){let parsed=RecordIssueReproductionArgsSchema.safeParse(args2);if(!parsed.success)return JSON.stringify({success:!1,message:`Invalid reproduction receipt: ${parsed.error.issues.map((issue3)=>`${issue3.path.join(".")}: ${issue3.message}`).join("; ")}`});let{issueNumber,performed,commands,output_summary}=parsed.data;if(performed&&(!commands||commands.length===0||!output_summary))return JSON.stringify({success:!1,message:"A performed=true reproduction receipt requires non-empty commands and output_summary."});let receipt={performed,issueNumber,timestamp:new Date().toISOString()};if(commands)receipt.commands=commands;if(output_summary)receipt.output_summary=output_summary;if(context.sessionID?.trim())receipt.sessionId=context.sessionID.trim();let validatedPath;try{validatedPath=validateSwarmPath(directory,"reproduction.json")}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:"Failed to validate path"})}try{return await atomicWriteSwarmFile(validatedPath,JSON.stringify(receipt,null,2)),JSON.stringify({success:!0,issueNumber,performed,path:".swarm/reproduction.json",message:performed?`Reproduction receipt recorded for issue #${issueNumber}; the trace may now transition to PLAN.`:`Reproduction receipt recorded (performed=false) for issue #${issueNumber}; it does NOT satisfy the reproduction gate.`})}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:String(error93)})}}var record_issue_reproduction=createSwarmTool({description:"Record the reproduction outcome for the current traced issue. The /swarm issue --trace workflow requires reproduction evidence (or a typed --no-repro waiver) before it can leave localization and transition to PLAN. Call this with performed=true, the exact commands run, and a concrete output_summary after attempting a minimal reproduction; the receipt binds to issueNumber (and records the calling session) and is read by the issue-trace engine. A performed=true receipt MUST include commands and output_summary. A performed=false receipt is recorded but does NOT satisfy the gate.",args:{issueNumber:RecordIssueReproductionArgsSchema.shape.issueNumber,performed:RecordIssueReproductionArgsSchema.shape.performed,commands:RecordIssueReproductionArgsSchema.shape.commands,output_summary:RecordIssueReproductionArgsSchema.shape.output_summary},execute:executeRecordIssueReproduction});init_zod();init_utils2();init_atomic_write();init_create_tool();var HEX40=/^[0-9a-f]{40}$/,RecordMergeApprovalArgsSchema=exports_external.object({issueNumber:exports_external.number().int().min(1),prHeadSha:exports_external.string().regex(HEX40,"must be a 40-hex commit SHA"),finalCriticReviewedCommit:exports_external.string().regex(HEX40,"must be a 40-hex commit SHA"),userApprovalVerbatim:exports_external.string().trim().min(1).max(8000)}).strict();async function executeRecordMergeApproval(args2,directory,context={}){let parsed=RecordMergeApprovalArgsSchema.safeParse(args2);if(!parsed.success)return JSON.stringify({success:!1,message:`Invalid merge-approval receipt: ${parsed.error.issues.map((issue3)=>`${issue3.path.join(".")}: ${issue3.message}`).join("; ")}`});let data=parsed.data;if(data.prHeadSha!==data.finalCriticReviewedCommit)return JSON.stringify({success:!1,message:"Merge-approval binding failed: prHeadSha must equal finalCriticReviewedCommit (the final critic approval must be bound to the exact PR head)."});let receipt={issueNumber:data.issueNumber,prHeadSha:data.prHeadSha,finalCriticReviewedCommit:data.finalCriticReviewedCommit,userApprovalVerbatim:data.userApprovalVerbatim,timestamp:new Date().toISOString()};if(context.sessionID?.trim())receipt.sessionId=context.sessionID.trim();let validatedPath;try{validatedPath=validateSwarmPath(directory,"merge-approval.json")}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:"Failed to validate path"})}try{return await atomicWriteSwarmFile(validatedPath,JSON.stringify(receipt,null,2)),JSON.stringify({success:!0,issueNumber:data.issueNumber,path:".swarm/merge-approval.json",message:`Merge approval recorded for issue #${data.issueNumber}, bound to PR head ${data.prHeadSha}. The approval is captured verbatim for audit; the merge itself is human-enforced and this plugin neither drives nor certifies it.`})}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:String(error93)})}}var record_merge_approval=createSwarmTool({description:"Record the human merge approval for the current traced issue (issue #2564): prHeadSha and finalCriticReviewedCommit must be the same 40-hex SHA (the final critic approval bound to the exact PR head), and userApprovalVerbatim is the user approval quoted verbatim. The receipt is recorded for audit only — the merge stays human-enforced and the plugin never certifies or drives it.",args:{issueNumber:RecordMergeApprovalArgsSchema.shape.issueNumber,prHeadSha:RecordMergeApprovalArgsSchema.shape.prHeadSha,finalCriticReviewedCommit:RecordMergeApprovalArgsSchema.shape.finalCriticReviewedCommit,userApprovalVerbatim:RecordMergeApprovalArgsSchema.shape.userApprovalVerbatim},execute:executeRecordMergeApproval});init_zod();init_utils2();init_atomic_write();init_create_tool();var DispositionSchema=exports_external.object({ref:exports_external.string().trim().min(1).max(500),disposition:exports_external.enum(["FIX","FALSE_POSITIVE","OUT_OF_CLASS","DEFERRED_WITH_USER_APPROVAL"]),note:exports_external.string().trim().max(1000).optional()}).strict(),GuardrailSchema=exports_external.object({kind:exports_external.enum(["lint-static-analysis","type-level","runtime-assertion","ci-check","documented-invariant-plus-regression-test"]),description:exports_external.string().trim().min(8).max(2000),proof:exports_external.string().trim().min(8).max(4000)}).strict(),RelatedProblemSchema=exports_external.object({ref:exports_external.string().trim().min(1).max(500),note:exports_external.string().trim().max(1000).optional()}).strict(),RecordRecurrenceSweepArgsSchema=exports_external.object({issueNumber:exports_external.number().int().min(1),defectClass:exports_external.string().trim().min(1).max(1000),justification:exports_external.string().trim().min(1).max(1000).optional(),predicates:exports_external.array(exports_external.string().trim().min(1).max(500)).min(1).max(32).optional(),dispositions:exports_external.array(DispositionSchema).min(1).max(200).optional(),guardrail:GuardrailSchema.optional(),relatedProblems:exports_external.array(RelatedProblemSchema).min(1).max(200)}).strict();async function executeRecordRecurrenceSweep(args2,directory,context={}){let parsed=RecordRecurrenceSweepArgsSchema.safeParse(args2);if(!parsed.success)return JSON.stringify({success:!1,message:`Invalid recurrence sweep receipt: ${parsed.error.issues.map((issue3)=>`${issue3.path.join(".")}: ${issue3.message}`).join("; ")}`});let data=parsed.data,noDefectClass=data.defectClass==="no defect class";if(noDefectClass){if(!data.justification)return JSON.stringify({success:!1,message:'The "no defect class" fast path requires a one-line justification.'})}else if(!data.predicates||data.predicates.length===0||!data.dispositions||data.dispositions.length===0||!data.guardrail)return JSON.stringify({success:!1,message:"A defect-class sweep requires search predicates, a non-empty disposition for every hit (at least one — the original defect site itself, dispositioned FIX), and a guardrail with proof it catches the original defect. An empty dispositions array is indistinguishable from a sweep that never ran."});let receipt={issueNumber:data.issueNumber,defectClass:data.defectClass,timestamp:new Date().toISOString()};if(data.justification)receipt.justification=data.justification;if(data.predicates)receipt.predicates=data.predicates;if(data.dispositions)receipt.dispositions=data.dispositions;if(data.guardrail)receipt.guardrail=data.guardrail;if(receipt.relatedProblems=data.relatedProblems,context.sessionID?.trim())receipt.sessionId=context.sessionID.trim();let validatedPath;try{validatedPath=validateSwarmPath(directory,"recurrence-sweep.json")}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:"Failed to validate path"})}try{return await atomicWriteSwarmFile(validatedPath,JSON.stringify(receipt,null,2)),JSON.stringify({success:!0,issueNumber:data.issueNumber,path:".swarm/recurrence-sweep.json",message:noDefectClass?`Recurrence sweep recorded for issue #${data.issueNumber} (no defect class fast path).`:`Recurrence sweep recorded for issue #${data.issueNumber}; the trace may now satisfy its recurrence gate.`})}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:String(error93)})}}var record_recurrence_sweep=createSwarmTool({description:'Record the recurrence sweep for the current traced issue (issue #2131 residual B; widened in #2564 and #2600). The /swarm issue --trace workflow will not hand off to commit-pr until this receipt exists. Supply relatedProblems (the Phase 1 related-problems sweep results — at least one {ref, note?} entry) plus, for a real defect class: defectClass (one-sentence characterization), predicates (the exact search predicates), dispositions (non-empty — every hit as FIX / FALSE_POSITIVE / OUT_OF_CLASS / DEFERRED_WITH_USER_APPROVAL, including the original defect site), and a guardrail (kind + description + proof it catches the original defect). If the change corrects no incorrect behavior, use the literal defectClass "no defect class" with a one-line justification (relatedProblems still required).',args:{issueNumber:RecordRecurrenceSweepArgsSchema.shape.issueNumber,defectClass:RecordRecurrenceSweepArgsSchema.shape.defectClass,justification:RecordRecurrenceSweepArgsSchema.shape.justification,predicates:RecordRecurrenceSweepArgsSchema.shape.predicates,dispositions:RecordRecurrenceSweepArgsSchema.shape.dispositions,guardrail:RecordRecurrenceSweepArgsSchema.shape.guardrail,relatedProblems:RecordRecurrenceSweepArgsSchema.shape.relatedProblems},execute:executeRecordRecurrenceSweep});init_zod();import*as fs227 from"node:fs";init_utils2();init_file_locks();init_atomic_write();init_create_tool();var HEX402=/^[0-9a-f]{40}$/,TRACE_VALIDATION_PHASES2=["0","1","2","2.5","3","4","4.2","4.5","4.6","5"],ValidationEntrySchema=exports_external.object({phase:exports_external.enum(TRACE_VALIDATION_PHASES2),outcome:exports_external.enum(["pass","fail"]),reviewedCommit:exports_external.string().regex(HEX402,"must be a 40-hex commit SHA"),treeId:exports_external.string().regex(HEX402,"must be a 40-hex tree id")}).strict(),RecordTraceValidationArgsSchema=ValidationEntrySchema.extend({issueNumber:exports_external.number().int().min(1)}).strict();async function executeRecordTraceValidation(args2,directory,context={}){let parsed=RecordTraceValidationArgsSchema.safeParse(args2);if(!parsed.success)return JSON.stringify({success:!1,message:`Invalid trace-validation receipt: ${parsed.error.issues.map((issue3)=>`${issue3.path.join(".")}: ${issue3.message}`).join("; ")}`});let data=parsed.data,validatedPath;try{validatedPath=validateSwarmPath(directory,"trace-validation.json")}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:"Failed to validate path"})}try{let lockResult=await tryAcquireLock(directory,"trace-validation.json","trace-validation","trace-validation");if(!lockResult.acquired)return JSON.stringify({success:!1,message:"The trace-validation receipt is locked by another concurrent writer; no write was attempted. Re-run record_trace_validation for this phase once the other writer finishes."});try{let validations=[];try{let raw=await fs227.promises.readFile(validatedPath,"utf-8"),existing=JSON.parse(raw);if(typeof existing==="object"&&existing!==null&&Array.isArray(existing.validations))validations=existing.validations.filter((v)=>typeof v==="object"&&v!==null&&typeof v.phase==="string")}catch{}let entry={phase:data.phase,outcome:data.outcome,reviewedCommit:data.reviewedCommit,treeId:data.treeId,timestamp:new Date().toISOString()},idx=validations.findIndex((v)=>v.phase===data.phase);if(idx===-1)validations.push(entry);else validations[idx]=entry;let receipt={issueNumber:data.issueNumber,timestamp:new Date().toISOString(),validations};if(context.sessionID?.trim())receipt.sessionId=context.sessionID.trim();await atomicWriteSwarmFile(validatedPath,JSON.stringify(receipt,null,2));let allGreen=await traceValidationReceiptExists(directory,data.issueNumber);return JSON.stringify({success:!0,issueNumber:data.issueNumber,path:".swarm/trace-validation.json",allGreen,message:allGreen?`Validator receipt recorded for issue #${data.issueNumber} phase ${data.phase} (${data.outcome}); every recorded phase is green.`:`Validator receipt recorded for issue #${data.issueNumber} phase ${data.phase} (${data.outcome}), but at least one recorded phase is failing — fix and re-record that phase as a pass before handoff.`})}finally{try{await lockResult.lock._release?.()}catch{}}}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:String(error93)})}}var record_trace_validation=createSwarmTool({description:"Record one per-phase trace-check.sh validator outcome for the current traced issue (issue #2564): the phase (v3 enum 0..5 incl. 2.5/4.2/4.5/4.6), the outcome (pass or fail), and the exact reviewedCommit and treeId the validator reported. Re-running a phase replaces its entry. The /swarm issue --trace workflow will not hand off to commit-pr while any recorded phase is failing or none is recorded. The receipt write is serialized by a per-file receipt lock, and the response's allGreen field mirrors the gate reader's verdict on the persisted receipt (advisory for the calling agent — the reducer always recomputes it independently).",args:{issueNumber:RecordTraceValidationArgsSchema.shape.issueNumber,phase:RecordTraceValidationArgsSchema.shape.phase,outcome:RecordTraceValidationArgsSchema.shape.outcome,reviewedCommit:RecordTraceValidationArgsSchema.shape.reviewedCommit,treeId:RecordTraceValidationArgsSchema.shape.treeId},execute:executeRecordTraceValidation});init_zod();init_schema();init_gate_evidence();init_manager();init_path_identity();init_state();init_stage_a_repair();import*as fs228 from"node:fs";import*as path370 from"node:path";async function forceRecoverReworkTask(directory,sessionID,options){let session=ensureAgentSession(sessionID,void 0,directory);if(!session||!session.agentName||stripKnownSwarmPrefix(session.agentName)!=="architect")throw Error("RECOVER_REWORK_ARCHITECT_REQUIRED: recover_rework_task requires an active architect session. The rework escape hatch is architect-only; a coder/reviewer/test_engineer cannot self-unblock a task.");let taskId=typeof options.taskId==="string"?options.taskId.trim():"";if(!taskId)throw Error('RECOVER_REWORK_UNKNOWN_TASK: recover_rework_task requires the exact plan task id (e.g. "1.1").');let plan=await loadPlanJsonOnly(directory);if(!plan){let planPath=path370.join(directory,".swarm","plan.json");if(fs228.existsSync(planPath))throw Error("PLAN_CORRUPT: .swarm/plan.json exists but could not be parsed (corrupt or schema-invalid). Repair or re-save the plan before recovering a rework_required task.");throw Error("PLAN_NOT_FOUND: no .swarm/plan.json — cannot recover a rework_required "+"task without a plan. Save a plan first.")}if(!new Set(plan.phases.flatMap((phase)=>phase.tasks.map((task2)=>task2.id))).has(taskId))throw Error(`RECOVER_REWORK_UNKNOWN_TASK: task ${taskId} is not in the current plan. Refusing to recover a foreign task id.`);let evidenceRead=await readTaskEvidenceState(directory,taskId);if(evidenceRead.kind==="unparseable")throw Error(`RECOVER_REWORK_EVIDENCE_CORRUPT: the workflow evidence file for task ${taskId} exists but could not be parsed (${evidenceRead.evidencePath}). Repair the evidence first (repair_gate_evidence or /swarm doctor); recovery cannot classify a corrupt evidence state.`);let evidence2=evidenceRead.kind==="ok"?evidenceRead.evidence:null,workflow=getTaskWorkflowSnapshot(evidence2);if(!evidence2||!workflow.authoritative)throw Error(`RECOVER_REWORK_NO_WORKFLOW: no durable task workflow evidence exists for task ${taskId} — there is no rework state to recover.`);if(workflow.state!=="rework_required")throw Error(`RECOVER_REWORK_STATE_REQUIRED: task ${taskId} is at ${workflow.state}, not rework_required. This recovery applies only to a task whose Stage B verdict moved it to rework_required without a code change. From coder_delegated, run pre_check_batch; for a genuine code defect, delegate the coder to repair it first.`);let wedgeMs=Date.parse(workflow.updatedAt);if(!Number.isFinite(wedgeMs))throw Error(`RECOVER_REWORK_GREEN_PRECHECK_REQUIRED: cannot prove pre-check recency (workflow updatedAt "${workflow.updatedAt}" is not a parseable timestamp — the evidence file for task ${taskId} is likely corrupt). Repair the evidence (repair_gate_evidence or /swarm doctor); re-running pre_check_batch cannot fix an unparseable timestamp.`);let greenness=await hasGreenPostSettlementPreCheck(directory,wedgeMs);if(!greenness.green){let sastHint=greenness.reason==="no_pre_check_bundles"?" Note: if gates.sast_scan.enabled is false, no sast_scan bundle is ever persisted and this recovery is unavailable by design — enable gates.sast_scan.enabled and run sast_scan, or use the coder repair loop.":"";throw Error(`RECOVER_REWORK_GREEN_PRECHECK_REQUIRED: refusing to mark Stage A passed without proof (${greenness.reason}). `+"The bar is a green secretscan AND sast_scan evidence pair newer than the failing verdict — normally provided by a fresh pre_check_batch run (bundle proof is global, not correlated to the task's changed files)."+sastHint)}let sanitizedReason=typeof options.reason==="string"&&options.reason.trim().length>0?sanitizeDiagnosticText(options.reason.trim(),500):void 0,recordedAt=new Date().toISOString(),transitionId=`rework-recovery:${taskId}:gen${workflow.generation}`,updated=await transitionTaskWorkflowEvidence(directory,taskId,{type:"stage_a_passed",supervisedRecovery:!0,expectedGeneration:workflow.generation,transitionId}),updatedWorkflow=getTaskWorkflowSnapshot(updated),auditEventRecorded=await appendStageARepairEvent(directory,{action:"rework_recovered",taskId,transitionId,generation:workflow.generation,sessionId:sessionID,...sanitizedReason?{reason:sanitizedReason}:{}});return{taskId,generation:updatedWorkflow.generation,state:updatedWorkflow.state,transitionId,recordedAt,auditEventRecorded}}init_create_tool();var RecoverReworkTaskArgsSchema=exports_external.object({task_id:exports_external.string().trim().min(1).max(64).describe('Exact plan task id of the rework_required task (e.g. "1.1"). Must exist in the current plan and have durable workflow evidence at state rework_required.'),reason:exports_external.string().trim().min(1).max(500).describe('Why the Stage B verdict did not require a code change (e.g. "test_engineer returned SKIPPED for a tool-argument error while pytest passes"). Audited to .swarm/events.jsonl.')}).strict();async function executeRecoverReworkTask(args2,directory,context={}){let parsed=RecoverReworkTaskArgsSchema.safeParse(args2);if(!parsed.success)return JSON.stringify({success:!1,message:`Invalid recover_rework_task call: ${parsed.error.issues.map((issue3)=>`${issue3.path.join(".")}: ${issue3.message}`).join("; ")}`});if(!context.sessionID?.trim())return JSON.stringify({success:!1,message:"recover_rework_task requires an active sessionID"});try{let summary=await forceRecoverReworkTask(directory,context.sessionID,{taskId:parsed.data.task_id,reason:parsed.data.reason}),auditNote=summary.auditEventRecorded?"The recovery is audited to .swarm/events.jsonl (stage_a_repair action rework_recovered).":"WARNING: the audit event could NOT be appended to .swarm/events.jsonl (see the plugin log); the durable workflow evidence still records the supervised recovery via the rework-recovery: transition id.";return JSON.stringify({success:!0,task_id:summary.taskId,generation:summary.generation,state:summary.state,transition_id:summary.transitionId,recorded_at:summary.recordedAt,audit_event_recorded:summary.auditEventRecorded,method:"supervised_recovery",message:`Task ${summary.taskId} recovered from rework_required: a supervised stage_a_passed was written at generation ${summary.generation} (transition id `+summary.transitionId+"). Reviewer/test_engineer dispatch is permitted again — re-run the Stage B gates that the failed verdict cleared. "+auditNote+" Use it ONLY when the Stage B verdict did not require a code change; a genuine defect still needs the coder repair loop."})}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:String(error93)})}}var recover_rework_task=createSwarmTool({description:"Recover a task wedged at rework_required when the Stage B verdict did NOT require a code change (issue #2755): writes a supervised stage_a_passed for the current generation so reviewer/test_engineer can be re-dispatched, without re-running the coder. Requires the exact plan task id, an active architect session, durable workflow state exactly rework_required, and green pre-check proof: green secretscan AND sast_scan evidence bundles newer than the failing verdict (normally from a fresh pre_check_batch run; bundle recency is global, not file-correlated; projects with SAST disabled cannot use this path). Fail-closed otherwise; the mechanical stage_a_passed path still requires an accepted coder mutation. A reason is required and audited to .swarm/events.jsonl (stage_a_repair action rework_recovered). Prefer the coder repair loop when the code actually has a defect.",args:{task_id:RecoverReworkTaskArgsSchema.shape.task_id,reason:RecoverReworkTaskArgsSchema.shape.reason},execute:executeRecoverReworkTask});init_zod();init_schema();init_gate_evidence();init_path_identity();init_state();init_coder_settlement();init_session_view();init_stage_a_repair();async function recoverStageATaskSupervised(directory,sessionID,options){let session=ensureAgentSession(sessionID,void 0,directory);if(!session||!session.agentName||stripKnownSwarmPrefix(session.agentName)!=="architect")throw Error("RECOVER_STAGE_A_ARCHITECT_REQUIRED: recover_stage_a_task requires an active architect session. The settlement-backed Stage A escape hatch is architect-only; a coder/reviewer/test_engineer cannot self-unblock a task.");let taskId=typeof options.taskId==="string"?options.taskId.trim():"";if(!taskId)throw Error('RECOVER_STAGE_A_UNKNOWN_TASK: recover_stage_a_task requires the exact task id of the settlement-wedged task (e.g. "1.1").');let sanitizedReason=typeof options.reason==="string"&&options.reason.trim().length>0?sanitizeDiagnosticText(options.reason.trim(),500):void 0;if(!sanitizedReason)throw Error("RECOVER_STAGE_A_REASON_REQUIRED: recover_stage_a_task requires a reason describing why the settlement-backed recovery is justified; it is audited to .swarm/events.jsonl.");let evidenceRead=await readTaskEvidenceState(directory,taskId);if(evidenceRead.kind==="unparseable")throw Error(`RECOVER_STAGE_A_EVIDENCE_CORRUPT: the workflow evidence file for task ${taskId} exists but could not be parsed (${evidenceRead.evidencePath}). Repair the evidence first (repair_gate_evidence or /swarm doctor); recovery cannot classify a corrupt evidence state.`);let evidence2=evidenceRead.kind==="ok"?evidenceRead.evidence:null,workflow=getTaskWorkflowSnapshot(evidence2);if(!evidence2||!workflow.authoritative)throw Error(`RECOVER_STAGE_A_NO_WORKFLOW: no durable task workflow evidence exists for task ${taskId} — there is no settlement wedge to recover.`);if(workflow.state==="pre_check_passed"||workflow.state==="reviewer_run"||workflow.state==="tests_run"){if(isStageARecoveredState(workflow.state)&&shouldRefreshStageARecoveryView(session.taskWorkflowStates.get(taskId),workflow.state))applySessionWorkflowView(session,taskId,workflow);return{taskId,generation:workflow.generation,state:workflow.state,transitionId:`stage-a-supervised:${taskId}:noop`,recordedAt:new Date().toISOString(),alreadyRecovered:!0,auditEventRecorded:!1}}if(workflow.state!=="idle"&&workflow.state!=="blocked")throw Error(`RECOVER_STAGE_A_STATE_REQUIRED: task ${taskId} is at ${workflow.state}, not idle/blocked. This recovery applies only to the settlement-backed wedge (a COMMITTED accepted coder settlement while the workflow drifted to idle or blocked). From coder_delegated, run pre_check_batch or /swarm recover; from rework_required without a code change, use recover_rework_task.`);let{states:walStates}=await listCoderSettlementWalStates(directory),settledAfterMs=latestCommittedAcceptedSettlementMs(taskId,walStates);if(settledAfterMs===null)throw Error(`RECOVER_STAGE_A_SETTLEMENT_REQUIRED: refusing to recover task ${taskId} — no COMMITTED accepted coder settlement exists for it. `+"The settlement receipt is what distinguishes this wedge from a not-yet-started or deliberately stopped task; recovery without it would fabricate Stage A justification. Background-dispatched coder tasks never write a settlement WAL and cannot use this path.");let greenness=await hasGreenPostSettlementPreCheck(directory,settledAfterMs);if(!greenness.green){let sastHint=greenness.reason==="no_pre_check_bundles"?" Note: if gates.sast_scan.enabled is false, no sast_scan bundle is ever persisted and this recovery is unavailable by design — enable gates.sast_scan.enabled and run sast_scan, or use the coder repair loop.":"";throw Error(`RECOVER_STAGE_A_GREEN_PRECHECK_REQUIRED: refusing to mark Stage A passed without proof (${greenness.reason}). `+"The bar is a green secretscan AND sast_scan evidence pair newer than the settlement commit — normally provided by a fresh pre_check_batch run (bundle proof is global, not correlated to the task's changed files)."+sastHint)}let recordedAt=new Date().toISOString(),transitionId=`stage-a-supervised:${taskId}:${workflow.generation}`,updated=await transitionTaskWorkflowEvidence(directory,taskId,{type:"stage_a_passed",settlementRecovery:!0,expectedGeneration:workflow.generation,transitionId}),updatedWorkflow=getTaskWorkflowSnapshot(updated);if(isStageARecoveredState(updatedWorkflow.state)){if(shouldRefreshStageARecoveryView(session.taskWorkflowStates.get(taskId),updatedWorkflow.state))applySessionWorkflowView(session,taskId,updatedWorkflow)}let auditEventRecorded=await appendStageARepairEvent(directory,{action:"repaired",via:"recover_stage_a_task",taskId,transitionId,generation:workflow.generation,settlementRecovery:!0,predecessorTransitionId:workflow.lastTransitionId??null,sessionId:sessionID,reason:sanitizedReason});return{taskId,generation:updatedWorkflow.generation,state:updatedWorkflow.state,transitionId,recordedAt,alreadyRecovered:!1,auditEventRecorded}}init_create_tool();var RecoverStageATaskArgsSchema=exports_external.object({task_id:exports_external.string().trim().min(1).max(64).describe('Exact task id of the settlement-wedged task (e.g. "1.1"). Must have durable workflow evidence at state idle or blocked, a COMMITTED accepted coder settlement, and green post-settlement pre-check proof.'),reason:exports_external.string().trim().min(1).max(500).describe('Why the settlement-backed recovery is justified (e.g. "settlement COMMITTED and pre_check_batch green but stage_a_passed never fired; force-repair cleared the proofs"). Audited to .swarm/events.jsonl.')}).strict();async function executeRecoverStageATask(args2,directory,context={}){let parsed=RecoverStageATaskArgsSchema.safeParse(args2);if(!parsed.success)return JSON.stringify({success:!1,message:`Invalid recover_stage_a_task call: ${parsed.error.issues.map((issue3)=>`${issue3.path.join(".")}: ${issue3.message}`).join("; ")}`});if(!context.sessionID?.trim())return JSON.stringify({success:!1,message:"recover_stage_a_task requires an active sessionID"});try{let summary=await recoverStageATaskSupervised(directory,context.sessionID,{taskId:parsed.data.task_id,reason:parsed.data.reason});if(summary.alreadyRecovered)return JSON.stringify({success:!0,task_id:summary.taskId,generation:summary.generation,state:summary.state,already_recovered:!0,message:`Task ${summary.taskId} already has Stage A recorded (state ${summary.state}, generation ${summary.generation}) — nothing to recover.`});let auditNote=summary.auditEventRecorded?"The recovery is audited to .swarm/events.jsonl (stage_a_repair action repaired, via recover_stage_a_task).":"WARNING: the audit event could NOT be appended to .swarm/events.jsonl (see the plugin log); the durable workflow evidence still records the settlement-backed recovery via the stage-a-supervised: transition id and the settlementRecovery marker.";return JSON.stringify({success:!0,task_id:summary.taskId,generation:summary.generation,state:summary.state,transition_id:summary.transitionId,recorded_at:summary.recordedAt,audit_event_recorded:summary.auditEventRecorded,method:"settlement_recovery",message:`Task ${summary.taskId} recovered from the settlement wedge: a settlement-backed stage_a_passed was written at generation ${summary.generation} (transition id `+summary.transitionId+"). Reviewer/test_engineer dispatch is permitted again — run the Stage B gates the task still needs. "+auditNote+" Use it ONLY when a COMMITTED accepted settlement and green post-settlement pre-check proof already justify Stage A; it never re-runs the coder and never edits gate evidence."})}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:String(error93)})}}var recover_stage_a_task=createSwarmTool({description:"Recover a task wedged in the settlement-backed Stage A deadlock (issue #2828): workflow at idle or blocked while a COMMITTED accepted coder settlement and green post-settlement pre-check proof (green secretscan AND sast_scan evidence newer than the settlement commit) still justify Stage A — the shape where stage_a_passed never fired, a force-repair cleared the proofs, and every other recovery path refuses. Writes a settlement-backed stage_a_passed for the current generation so reviewer/test_engineer can be dispatched, without re-running the coder and without editing gate evidence. Requires the exact task id (bound by its durable workflow evidence and settlement WAL — deliberately no plan-membership precondition, mirroring the /swarm recover scan), an active architect session, a reason (audited), and durable workflow evidence at exactly idle/blocked. Fail-closed otherwise (RECOVER_STAGE_A_* errors); the mechanical stage_a_passed path still requires an accepted coder mutation or the #2665 live_wedge scan.",args:{task_id:RecoverStageATaskArgsSchema.shape.task_id,reason:RecoverStageATaskArgsSchema.shape.reason},execute:executeRecoverStageATask});init_zod();init_schema();init_gate_evidence();init_utils2();init_manager();init_state();init_project_boundary();init_swarm_artifact_cache();init_task_id();init_task_file();init_task_gate_requirements();init_gate_evidence();import{createHash as createHash120,randomUUID as randomUUID48}from"node:crypto";import*as fs229 from"node:fs";import*as path371 from"node:path";var TASK_GATE_EVIDENCE_QUARANTINE_DIR=path371.join("evidence","task-gate-quarantine"),MAX_TASK_GATE_EVIDENCE_BYTES=262144,MAX_TASK_GATE_EVIDENCE_QUARANTINE_FILES=32,MAX_TASK_GATE_EVIDENCE_QUARANTINE_BYTES=12582912,MAX_TASK_GATE_EVIDENCE_QUARANTINE_DIRECTORY_ENTRIES=128,MAX_TASK_GATE_EVIDENCE_QUARANTINE_RECORD_BYTES=786432,TASK_GATE_EVIDENCE_QUARANTINE_SCHEMA_VERSION=1,GENERIC_REPAIR_REASONS=new Set(["fix","repair","test","debug","unknown","n/a","na","none"]);function isQuarantinableTaskEvidenceRead(read){return read.status==="corrupt"||read.status==="valid"}function sha25614(bytes){return createHash120("sha256").update(bytes).digest("hex")}function normalizeRepairReason(reason){let normalized=reason.trim().replace(/\s+/g," ");if(normalized.length<12)throw Error("TASK_GATE_EVIDENCE_REASON_REQUIRED: repair_gate_evidence requires a substantive reason of at least 12 characters.");if(GENERIC_REPAIR_REASONS.has(normalized.toLowerCase()))throw Error("TASK_GATE_EVIDENCE_REASON_REQUIRED: repair_gate_evidence requires a substantive reason, not a placeholder.");return normalized}function canonicalizeRepairRoot(directory){let requestedRoot=path371.resolve(directory),requestedStat=fs229.lstatSync(requestedRoot);if(requestedStat.isSymbolicLink()||!requestedStat.isDirectory())throw Error("TASK_GATE_EVIDENCE_ROOT_UNSAFE: repair_gate_evidence requires a canonical project root directory, not a symlink, junction, reparse point, or non-directory path.");let canonicalRoot2=fs229.realpathSync(requestedRoot);return assertProjectRoot(canonicalRoot2),canonicalRoot2}function assertExistingRegularPath(root,relativePath2){let segments=relativePath2.replace(/\\/g,"/").split("/").filter(Boolean),cursor=root;for(let segment of segments){if(cursor=path371.join(cursor,segment),!fs229.existsSync(cursor))return;if(fs229.lstatSync(cursor).isSymbolicLink())throw Error(`TASK_GATE_EVIDENCE_PATH_UNSAFE: ${relativePath2} contains a symlink, junction, or reparse point.`)}}function taskEvidenceFilePath(directory,taskId){let relativePath2=taskEvidenceRelPath(taskId);return assertExistingRegularPath(directory,".swarm"),assertExistingRegularPath(directory,path371.join(".swarm","evidence")),assertExistingRegularPath(directory,path371.join(".swarm",relativePath2)),validateSwarmPath(directory,relativePath2)}function readTaskEvidenceForRepair(directory,taskId){let filePath=taskEvidenceFilePath(directory,taskId),pathStat;try{pathStat=fs229.lstatSync(filePath)}catch(error93){if(error93.code==="ENOENT")return{status:"missing"};return{status:"unreadable",filePath,bytes:Buffer.alloc(0),sha256:sha25614(""),error:error93}}if(pathStat.isSymbolicLink()||!pathStat.isFile())return{status:"unreadable",filePath,bytes:Buffer.alloc(0),sha256:sha25614(""),error:Error("TASK_GATE_EVIDENCE_UNREADABLE: evidence path is not a regular file")};if(pathStat.size>MAX_TASK_GATE_EVIDENCE_BYTES)return{status:"oversized",filePath,bytes:Buffer.alloc(0),sha256:sha25614(""),error:Error(`TASK_GATE_EVIDENCE_OVERSIZED: ${pathStat.size} bytes exceeds ${MAX_TASK_GATE_EVIDENCE_BYTES}`)};let descriptor=fs229.openSync(filePath,fs229.constants.O_RDONLY|(fs229.constants.O_NOFOLLOW??0));try{let openedStat=fs229.fstatSync(descriptor);if(!openedStat.isFile()||openedStat.dev!==pathStat.dev||openedStat.ino!==pathStat.ino)return{status:"unreadable",filePath,bytes:Buffer.alloc(0),sha256:sha25614(""),error:Error("TASK_GATE_EVIDENCE_UNREADABLE: evidence changed while being opened")};let bytes=fs229.readFileSync(descriptor);if(bytes.byteLength>MAX_TASK_GATE_EVIDENCE_BYTES)return{status:"oversized",filePath,bytes:Buffer.alloc(0),sha256:sha25614(""),error:Error(`TASK_GATE_EVIDENCE_OVERSIZED: ${bytes.byteLength} bytes exceeds ${MAX_TASK_GATE_EVIDENCE_BYTES}`)};let digest5=sha25614(bytes);try{let evidence2=parseTaskEvidence(bytes.toString("utf8"),taskId);return{status:"valid",filePath,bytes,sha256:digest5,evidence:evidence2,generation:evidence2.workflow?.generation}}catch(error93){return{status:"corrupt",filePath,bytes,sha256:digest5,error:error93}}}finally{try{fs229.closeSync(descriptor)}catch{}}}function taskGateEvidenceQuarantinePath(directory,taskId,digest5){return validateSwarmPath(directory,path371.join(TASK_GATE_EVIDENCE_QUARANTINE_DIR,`${taskId}.${digest5}.v${TASK_GATE_EVIDENCE_QUARANTINE_SCHEMA_VERSION}.json`))}function parseErrorMetadata(error93){if(!error93)return null;return{name:error93.name||"Error",message:error93.message||String(error93),code:typeof error93.code==="string"?error93.code:null}}function parseQuarantineRecord(raw){try{let parsed=JSON.parse(raw);if(parsed?.schemaVersion!==TASK_GATE_EVIDENCE_QUARANTINE_SCHEMA_VERSION||typeof parsed.taskId!=="string"||typeof parsed.recordedAt!=="string"||typeof parsed.reason!=="string"||typeof parsed.original?.path!=="string"||typeof parsed.original?.sha256!=="string"||typeof parsed.content?.bytes!=="string"||parsed.content?.encoding!=="base64")return null;return parsed}catch{return null}}function buildQuarantineRecord(taskId,read,reason,context,receiptGeneration){let agentName=context?.sessionID!=null?swarmState.activeAgent.get(context.sessionID)??swarmState.agentSessions.get(context.sessionID)?.agentName??null:null;return{schemaVersion:TASK_GATE_EVIDENCE_QUARANTINE_SCHEMA_VERSION,taskId,recordedAt:new Date().toISOString(),reason,caller:{sessionId:context?.sessionID?.trim()||null,messageId:context?.messageID?.trim()||null,agentName},original:{path:read.filePath,sha256:read.sha256,sizeBytes:read.bytes.byteLength,status:read.status,observedGeneration:read.generation??null,receiptGeneration,requirementsState:read.evidence?.requirements_state??null},parseError:parseErrorMetadata(read.error),content:{encoding:"base64",bytes:read.bytes.toString("base64")}}}async function quarantineTaskEvidenceBytes(directory,taskId,read,reason,context,receiptGeneration){let digest5=read.sha256,quarantineDir=validateSwarmPath(directory,TASK_GATE_EVIDENCE_QUARANTINE_DIR);await fs229.promises.mkdir(quarantineDir,{recursive:!0});let dirStat=await fs229.promises.lstat(quarantineDir);if(dirStat.isSymbolicLink()||!dirStat.isDirectory())throw Error("TASK_GATE_EVIDENCE_QUARANTINE_UNREADABLE: quarantine is not a regular directory");let target=taskGateEvidenceQuarantinePath(directory,taskId,digest5),record3=buildQuarantineRecord(taskId,read,reason,context,receiptGeneration),serialized3=JSON.stringify(record3,null,2),serializedBytes=Buffer.byteLength(serialized3,"utf8");if(serializedBytes>MAX_TASK_GATE_EVIDENCE_QUARANTINE_RECORD_BYTES)throw Error("TASK_GATE_EVIDENCE_QUARANTINE_FULL: quarantine payload exceeds the bounded record size limit");let reconcileExisting=async()=>{let existingStat;try{existingStat=await fs229.promises.lstat(target)}catch(error93){if(error93.code==="ENOENT")return!1;throw error93}if(existingStat.isSymbolicLink()||!existingStat.isFile())throw Error("TASK_GATE_EVIDENCE_QUARANTINE_MISMATCH: existing quarantine path is not a regular immutable record");let existingRaw=await fs229.promises.readFile(target,"utf8"),existingRecord=parseQuarantineRecord(existingRaw);if(existingRecord&&existingRecord.taskId===taskId&&existingRecord.original.path===read.filePath&&existingRecord.original.sha256===read.sha256&&existingRecord.content.bytes===read.bytes.toString("base64"))return!0;throw Error("TASK_GATE_EVIDENCE_QUARANTINE_MISMATCH: existing quarantine record does not match the repaired evidence source")};if(await reconcileExisting())return{digest:digest5,filePath:target};let count4=0,totalBytes=0,scanned=0,handle=await fs229.promises.opendir(quarantineDir,{bufferSize:16});try{for await(let entry of handle){if(scanned+=1,scanned>MAX_TASK_GATE_EVIDENCE_QUARANTINE_DIRECTORY_ENTRIES)throw Error("TASK_GATE_EVIDENCE_QUARANTINE_FULL: too many quarantine entries");if(!entry.isFile()||!/^[0-9.]+\.[a-f0-9]{64}\.v1\.json$/.test(entry.name))continue;count4+=1;let candidate2=path371.join(quarantineDir,entry.name),candidateStat=await fs229.promises.lstat(candidate2);if(candidateStat.isSymbolicLink()||!candidateStat.isFile())throw Error("TASK_GATE_EVIDENCE_QUARANTINE_UNREADABLE: invalid quarantine artifact");if(totalBytes+=candidateStat.size,count4>=MAX_TASK_GATE_EVIDENCE_QUARANTINE_FILES||totalBytes+serializedBytes>MAX_TASK_GATE_EVIDENCE_QUARANTINE_BYTES)throw Error("TASK_GATE_EVIDENCE_QUARANTINE_FULL: quarantine retention limit reached")}}finally{try{await handle.close()}catch{}}let tempPath=path371.join(quarantineDir,`.pending.${process.pid}.${randomUUID48()}.json`),fileHandle;try{fileHandle=await fs229.promises.open(tempPath,"wx"),await fileHandle.writeFile(serialized3,"utf8"),await fileHandle.sync(),await fileHandle.close(),fileHandle=void 0,invalidateCachedArtifact(tempPath),await fs229.promises.link(tempPath,target),invalidateCachedArtifact(target)}catch(error93){if(error93.code!=="EEXIST")throw error93;if(await reconcileExisting())return{digest:digest5,filePath:target};throw error93}finally{await fileHandle?.close().catch(()=>{return}),await fs229.promises.unlink(tempPath).catch(()=>{return})}return{digest:digest5,filePath:target}}function buildRepairTransitionId(taskId,source){return`repair_gate_evidence:${taskId}:${source.slice(0,32)}`}function withoutLegacyReconstructionGate(gates){return[...new Set(gates.filter((gate)=>gate!==TASK_GATE_REQUIREMENTS_RECONSTRUCTION_SENTINEL))].sort()}function hasLegacyReconstructionGate(gates){return gates.includes(TASK_GATE_REQUIREMENTS_RECONSTRUCTION_SENTINEL)}function buildKnownRepairedEvidence(taskId,receipt,generation,source){let requiredGates=withoutLegacyReconstructionGate(receipt.requiredGates);if(requiredGates.length!==receipt.requiredGates.length)throw Error("TASK_GATE_REQUIREMENTS_RECEIPT_TAINTED: legacy reconstruction markers cannot seed known requirements.");return{taskId,required_gates:requiredGates,gates:{},requirements_state:"known",test_engineer_exempt:receipt.testEngineerExempt??void 0,workflow:{schema:TASK_WORKFLOW_SCHEMA_MARKER,generation,state:"idle",retryCount:0,retryHistory:[],retryEpoch:0,lastOutcome:"repair_idle",lastTransitionId:buildRepairTransitionId(taskId,receipt.chainHash),updatedAt:new Date().toISOString()},repair_provenance:{source_sha256:source.sha256,source_generation:source.generation,requirements_receipt_hash:receipt.chainHash}}}function buildUnknownRepairedEvidence(taskId,requiredGates,seedGeneration,source,receiptHash){return{taskId,required_gates:withoutLegacyReconstructionGate(requiredGates),gates:{},requirements_state:"unknown",workflow:{schema:TASK_WORKFLOW_SCHEMA_MARKER,generation:seedGeneration,state:"idle",retryCount:0,retryHistory:[],retryEpoch:0,lastOutcome:"repair_idle",lastTransitionId:buildRepairTransitionId(taskId,"unknown"),updatedAt:new Date().toISOString()},repair_provenance:{source_sha256:source.sha256,source_generation:source.generation,requirements_receipt_hash:receiptHash}}}function canonicalizeTaskEvidence(taskId,evidence2){let validated=parseTaskEvidence(JSON.stringify({...evidence2,taskId}),taskId);return JSON.stringify(validated,null,2)}function isRepairWorkflowReset(taskId,workflow){return workflow!=null&&workflow.state==="idle"&&workflow.retryCount===0&&workflow.retryEpoch===0&&workflow.retryHistory.length===0&&workflow.lastOutcome==="repair_idle"&&typeof workflow.lastTransitionId==="string"&&workflow.lastTransitionId.startsWith(`repair_gate_evidence:${taskId}:`)}function isReceiptlessLegacySentinelReset(taskId,evidence2){return evidence2!=null&&isRepairWorkflowReset(taskId,evidence2.workflow)&&evidence2.requirements_state==="unknown"&&evidence2.required_gates.length===1&&evidence2.required_gates[0]===TASK_GATE_REQUIREMENTS_RECONSTRUCTION_SENTINEL&&Object.keys(evidence2.gates).length===0&&evidence2.repair_provenance!=null&&typeof evidence2.repair_provenance.source_sha256==="string"&&(evidence2.repair_provenance.source_generation===null||evidence2.repair_provenance.source_generation<evidence2.workflow.generation)&&evidence2.repair_provenance.requirements_receipt_hash===null}function isAlreadyRepairedEvidence(taskId,evidence2,receipt){if(!evidence2||!isRepairWorkflowReset(taskId,evidence2.workflow))return!1;if(Object.keys(evidence2.gates).length!==0)return!1;if(hasLegacyReconstructionGate(evidence2.required_gates))return!1;let receiptIsTainted=receipt!=null&&hasLegacyReconstructionGate(receipt.requiredGates);if(receipt&&!receiptIsTainted)return evidence2.requirements_state==="known"&&JSON.stringify(evidence2.required_gates)===JSON.stringify(receipt.requiredGates)&&evidence2.workflow.generation>receipt.generation&&(evidence2.test_engineer_exempt??null)===(receipt.testEngineerExempt??null)&&evidence2.repair_provenance?.requirements_receipt_hash===receipt.chainHash;if(!receipt||!receiptIsTainted)return!1;return evidence2.requirements_state==="unknown"&&evidence2.workflow.generation>=1&&evidence2.repair_provenance!=null&&evidence2.repair_provenance.requirements_receipt_hash===receipt.chainHash&&withoutLegacyReconstructionGate(receipt.requiredGates).every((gate)=>evidence2.required_gates.includes(gate))}function repairedEvidenceMatchesCas(evidence2,args2){let provenance=evidence2.repair_provenance;if(!provenance)return args2.expected_sha256==null&&args2.expected_generation==null;return(args2.expected_sha256==null||provenance.source_sha256===args2.expected_sha256)&&(args2.expected_generation==null||provenance.source_generation===args2.expected_generation)}function buildRepairNextActions(taskId,evidence2){if(evidence2.requirements_state==="known")return[`Delegate coder on task ${taskId} to produce a fresh accepted_mutation for the repaired evidence generation ${evidence2.workflow?.generation}.`,`Rerun Stage A for task ${taskId} until pre_check passes for the new generation.`,`Rerun Stage B gates [${evidence2.required_gates.join(", ")}] for task ${taskId} before attempting completion again.`];return[`Delegate coder on task ${taskId} to produce a fresh accepted mutation and regenerate authoritative required gates for a new exact-task generation.`,`Rerun Stage A for task ${taskId} after the new mutation is recorded.`,`Rerun the exact Stage B gates for task ${taskId} only after authoritative required gates are re-recorded; the idle recovery generation cannot complete directly.`]}function invalidateTaskEvidenceSessionFallbacks(taskId){for(let session of swarmState.agentSessions.values()){if(session.currentTaskId===taskId)session.currentTaskId=null;if(session.lastCoderDelegationTaskId===taskId)session.lastCoderDelegationTaskId=null;if(session.taskWorkflowStates?.delete(taskId),session.taskWorkflowCache?.delete(taskId),session.stageBCompletion?.delete(taskId),session.taskCouncilApproved?.delete(taskId),session.taskCouncilWorkflowGeneration?.delete(taskId),session.gateLog?.delete(taskId),session.partialGateWarningsIssuedForTask?.delete(taskId),session.completionGateWarnedForTask?.delete(taskId),session.lastGateFailure?.taskId===taskId)session.lastGateFailure=null}}async function repairTaskGateEvidence(args2,directory,context){assertStrictTaskId(args2.task_id);let normalizedReason=normalizeRepairReason(args2.reason),canonicalDirectory=canonicalizeRepairRoot(directory);if(!(await loadPlan(canonicalDirectory))?.phases.flatMap((phase)=>phase.tasks).find((candidate2)=>candidate2.id===args2.task_id))return{success:!1,message:`TASK_GATE_EVIDENCE_TASK_MISSING: ${args2.task_id} is not present in the loaded plan`,errors:[`Task ${args2.task_id} is not present in .swarm/plan.json.`]};return withTaskEvidenceLock(canonicalDirectory,args2.task_id,"repair_gate_evidence",async()=>{let read=readTaskEvidenceForRepair(canonicalDirectory,args2.task_id),latestReceipt=(await readTaskGateRequirementsReceipts(canonicalDirectory,args2.task_id)).at(-1),evidenceHasLegacyMarker=read.status==="valid"&&read.evidence!=null&&hasLegacyReconstructionGate(read.evidence.required_gates),receiptHasLegacyMarker=latestReceipt!=null&&hasLegacyReconstructionGate(latestReceipt.requiredGates);if(read.status==="valid"&&isAlreadyRepairedEvidence(args2.task_id,read.evidence,latestReceipt)){if(!repairedEvidenceMatchesCas(read.evidence,args2))return{success:!1,message:"TASK_GATE_EVIDENCE_CAS_MISMATCH",errors:["TASK_GATE_EVIDENCE_CAS_MISMATCH: the existing repaired generation was created from a different source identity."]};let nextActions2=buildRepairNextActions(args2.task_id,read.evidence);return{success:!0,repaired:!1,task_id:args2.task_id,required_gates:[...read.evidence.required_gates],requirements_state:read.evidence.requirements_state,repaired_generation:read.evidence.workflow?.generation,next_actions:nextActions2,message:`Task gate evidence for ${args2.task_id} is already in repaired fail-closed state.`}}if(read.status==="valid"&&read.evidence?.workflow?.schema===TASK_WORKFLOW_SCHEMA_MARKER&&!evidenceHasLegacyMarker&&latestReceipt!=null&&!receiptHasLegacyMarker)return{success:!1,message:"TASK_GATE_EVIDENCE_REPAIR_NOT_REQUIRED",errors:[`TASK_GATE_EVIDENCE_REPAIR_NOT_REQUIRED: ${args2.task_id} has valid authoritative evidence. Use the normal workflow repair path; this tool only rebuilds corrupt or legacy evidence.`]};if(read.status==="valid"&&read.evidence?.requirements_state==="known"&&!evidenceHasLegacyMarker&&receiptHasLegacyMarker)return{success:!1,message:"TASK_GATE_REQUIREMENTS_RECEIPT_STALE",errors:[`TASK_GATE_REQUIREMENTS_RECEIPT_STALE: ${args2.task_id} has clean accepted-mutation evidence but its latest requirements receipt is legacy-tainted. Repair was refused without modifying evidence; replay the prepared coder settlement so it can publish the exact hash-linked receipt.`]};if(typeof args2.expected_sha256==="string"&&read.status!=="missing"&&read.sha256!==args2.expected_sha256)return{success:!1,message:"TASK_GATE_EVIDENCE_CAS_MISMATCH",errors:[`TASK_GATE_EVIDENCE_CAS_MISMATCH: expected sha256 ${args2.expected_sha256}, found ${read.sha256}.`]};if(typeof args2.expected_generation==="number"){let observedGeneration=read.status==="valid"?read.generation:latestReceipt?.generation;if(observedGeneration!==args2.expected_generation)return{success:!1,message:"TASK_GATE_EVIDENCE_CAS_MISMATCH",errors:[`TASK_GATE_EVIDENCE_CAS_MISMATCH: expected generation ${args2.expected_generation}, found ${observedGeneration??"unknown"}.`]}}if(read.status==="unreadable"||read.status==="oversized")return{success:!1,message:read.error?.message??"TASK_GATE_EVIDENCE_UNREADABLE: repair requires operator intervention before evidence can be rewritten.",errors:[read.error?.message??`TASK_GATE_EVIDENCE_UNREADABLE: ${args2.task_id} could not be read safely for repair.`]};if(evidenceHasLegacyMarker&&latestReceipt==null&&!isReceiptlessLegacySentinelReset(args2.task_id,read.evidence))return{success:!1,message:"TASK_GATE_REQUIREMENTS_RECEIPT_MISSING",errors:[`TASK_GATE_REQUIREMENTS_RECEIPT_MISSING: ${args2.task_id} is marker-bearing but does not match the exact receipt-less state emitted by the historical repair flow. Repair was refused without modifying evidence or session state.`]};let nextGeneration2=Math.max(read.status==="valid"?read.generation??-1:-1,latestReceipt?.generation??-1)+1,nextEvidence;if(evidenceHasLegacyMarker||receiptHasLegacyMarker){let preservedGates=withoutLegacyReconstructionGate([...read.status==="valid"?read.evidence?.required_gates??[]:[],...latestReceipt?.requiredGates??[]]);nextEvidence=buildUnknownRepairedEvidence(args2.task_id,preservedGates,Math.max(nextGeneration2,1),{sha256:read.status==="missing"?null:read.sha256,generation:read.status==="valid"?read.generation??null:latestReceipt?.generation??null},latestReceipt?.chainHash??null)}else if(latestReceipt)nextEvidence=buildKnownRepairedEvidence(args2.task_id,latestReceipt,nextGeneration2,{sha256:read.status==="missing"?null:read.sha256,generation:read.status==="valid"?read.generation??null:latestReceipt.generation??null});else if(read.status==="missing")return{success:!1,message:"TASK_GATE_EVIDENCE_ABSENT",errors:[`TASK_GATE_EVIDENCE_ABSENT: ${args2.task_id} has no evidence file and no authoritative requirements receipt to rebuild from.`]};else return{success:!1,message:"TASK_GATE_REQUIREMENTS_RECEIPT_MISSING",errors:[`TASK_GATE_REQUIREMENTS_RECEIPT_MISSING: ${args2.task_id} has no authoritative requirements receipt. Receipt-less repair was refused without modifying the original evidence because its required gates cannot be reconstructed safely.`]};let serialized3=canonicalizeTaskEvidence(args2.task_id,nextEvidence),quarantine;if(isQuarantinableTaskEvidenceRead(read))quarantine=await quarantineTaskEvidenceBytes(canonicalDirectory,args2.task_id,read,normalizedReason,context,latestReceipt?.generation??null);assertTaskEvidenceWriteAllowed(canonicalDirectory,args2.task_id),await atomicWriteFile(taskEvidenceFilePath(canonicalDirectory,args2.task_id),serialized3),invalidateTaskEvidenceSessionFallbacks(args2.task_id);let nextActions=buildRepairNextActions(args2.task_id,nextEvidence);return{success:!0,repaired:!0,task_id:args2.task_id,required_gates:[...nextEvidence.required_gates],requirements_state:nextEvidence.requirements_state,quarantine_digest:quarantine?.digest,quarantine_path:quarantine?.filePath,repaired_generation:nextEvidence.workflow?.generation,next_actions:nextActions,message:`Repaired task gate evidence for ${args2.task_id} into a fresh fail-closed generation ${nextEvidence.workflow?.generation}. Next actions: ${nextActions.join(" ")}`}})}init_create_tool();init_resolve_working_directory();async function executeRepairGateEvidence(args2,directory,_ctx){try{if(!_ctx||stripKnownSwarmPrefix(_ctx.agent??"").toLowerCase()!=="architect")return{success:!1,message:"Only the architect may repair task gate evidence.",errors:["TASK_GATE_EVIDENCE_ARCHITECT_ONLY"]};let resolved=resolveWorkingDirectory(args2.working_directory,directory);if(!resolved.success)return{success:!1,message:resolved.message,errors:[resolved.message]};return await repairTaskGateEvidence(args2,resolved.directory,{sessionID:_ctx?.sessionID,messageID:_ctx?.messageID})}catch(error93){return{success:!1,message:"repair_gate_evidence failed",errors:[error93 instanceof Error?error93.message:String(error93)]}}}var repair_gate_evidence=createSwarmTool({description:"Architect-only evidence repair for exact-task gate files. Rebuilds from a durable requirements receipt, recovers receipt-backed legacy marker wedges or the exact sentinel-only historical reset, and refuses every other receipt-less reconstruction.",args:{task_id:exports_external.string().min(1).regex(/^\d+\.\d+(\.\d+)*$/,"Task ID must be in N.M or N.M.P format"),reason:exports_external.string().min(1).max(2000),expected_sha256:exports_external.string().regex(/^[a-f0-9]{64}$/).optional(),expected_generation:exports_external.number().int().min(0).optional(),working_directory:exports_external.string().optional()},execute:async(args2,directory,ctx)=>JSON.stringify(await executeRepairGateEvidence(args2,directory,ctx),null,2)});init_zod();init_schema();init_knowledge_receipt_ledger();init_create_tool();init_resolve_working_directory();async function executeRepairKnowledgeReceiptLedger(args2,directory,_ctx){try{if(_ctx&&stripKnownSwarmPrefix(_ctx.agent??"").toLowerCase()!=="architect")return{success:!1,message:"Only the architect may repair the knowledge receipt ledger.",errors:["RECEIPT_REPAIR_ARCHITECT_ONLY"]};if(_ctx?.sessionID&&args2.session_id!==_ctx.sessionID)return{success:!1,message:"repair_knowledge_receipt_ledger session_id must match the invoking tool context.",errors:["RECEIPT_REPAIR_SESSION_MISMATCH"]};let resolved=resolveWorkingDirectory(args2.working_directory,directory);if(!resolved.success)return{success:!1,message:resolved.message,errors:[resolved.message]};if(args2.operation==="backfill_phase_id"){let backfill=await backfillMembershipPhaseIds(resolved.directory);if(!backfill.ok)return{success:!1,message:"repair_knowledge_receipt_ledger backfill_phase_id failed",errors:[backfill.detail],code:backfill.code};return{success:!0,message:`phase_id backfill complete: ${backfill.backfilled} membership(s) backfilled, ${backfill.skipped.length} skipped (unparsable label), ${backfill.journal_records} journal record(s) appended. Stored labels are never rewritten.`,backfilled:backfill.backfilled,skipped:backfill.skipped.slice(0,20),skipped_total:backfill.skipped.length,journal_records:backfill.journal_records}}let result=await repairKnowledgeReceiptLedger(resolved.directory,args2);if(!result.ok)return{success:!1,message:"repair_knowledge_receipt_ledger failed",errors:[result.detail],code:result.code};let reEvaluationArgs=JSON.stringify({repair_id:result.repair_id,phase:args2.phase,...args2.task_id?{task_id:args2.task_id}:{},scope_complete:!0});return{success:!0,message:result.status==="validated_projection"?"knowledge receipt projection validated":result.status==="pending_re_evaluation"?`knowledge receipt ledger still pending re-evaluation; as architect, run knowledge_recall with a comprehensive query and repair_re_evaluation ${reEvaluationArgs}`:`knowledge receipt ledger repaired and blocked pending re-evaluation; as architect, run knowledge_recall with a comprehensive query and repair_re_evaluation ${reEvaluationArgs}`,...result}}catch(error93){return{success:!1,message:"repair_knowledge_receipt_ledger failed",errors:[error93 instanceof Error?error93.message:String(error93)]}}}var repair_knowledge_receipt_ledger=createSwarmTool({description:"Architect-only repair and validation for the authoritative knowledge receipt ledger. Default operation repairs: rebuilds the derived projection when authority is readable, or quarantines a bounded corrupt authority, salvages only the validated prefix, and blocks the exact phase/session until a fresh re-evaluation is committed. operation backfill_phase_id durably stamps the stable numeric phase_id on live memberships that lack one across the WHOLE ledger (phase/session_id are not used to scope the backfill; labels never rewritten).",args:{phase:exports_external.string().min(1),session_id:exports_external.string().min(1),task_id:exports_external.string().min(1).optional(),reason:exports_external.string().min(1).max(2000),operation:exports_external.enum(["repair","backfill_phase_id"]).optional(),grace_days:exports_external.number().int().min(0).optional(),working_directory:exports_external.string().optional()},execute:async(args2,directory,ctx)=>JSON.stringify(await executeRepairKnowledgeReceiptLedger(args2,directory,ctx),null,2)});init_zod();init_loader();init_schema();init_profiles();init_telemetry();init_path_security();init_create_tool();import*as path373 from"node:path";init_zod();init_external_tool_runner();init_path_security();init_create_tool();import*as fs230 from"node:fs";import{createRequire as createRequire7}from"node:module";import*as path372 from"node:path";var require2=createRequire7(import.meta.url),DEFAULT_MAX_RESULTS4=100,DEFAULT_MAX_LINES=200,REGEX_TIMEOUT_MS=5000,MAX_FILE_SIZE_BYTES8=1048576,HARD_CAP_RESULTS4=1e4,HARD_CAP_LINES=1e4,MAX_QUERY_LENGTH=20000,MAX_INCLUDE_PATTERNS=100,MAX_RG_STDOUT_BYTES=8388608,MAX_RG_STDERR_BYTES=65536,FALLBACK_MAX_FILES=20000,FALLBACK_MAX_DIRS=5000,FALLBACK_MAX_DEPTH=40,FALLBACK_MAX_TOTAL_BYTES=67108864,DEFAULT_SKIP_DIRS=new Set([".git",".swarm","node_modules","dist","build","out","coverage",".next",".turbo",".cache"]);function globMatch(pattern,filePath){let normalizedPattern=pattern.replace(/\\/g,"/"),normalizedPath=filePath.replace(/\\/g,"/"),regexPattern=normalizedPattern.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*\*/g,"{{DOUBLESTAR}}").replace(/\*/g,"[^/]*").replace(/\?/g,".").replace(/\{\{DOUBLESTAR\}\}/g,".*");try{return new RegExp(`^${regexPattern}$`).test(normalizedPath)}catch{return!1}}function matchesGlobs(filePath,globs){if(globs.length===0)return!0;return globs.some((glob)=>globMatch(glob,filePath))}var WINDOWS_RESERVED_NAMES5=/^(con|prn|aux|nul|com[1-9]|lpt[1-9])(\.|:|$)/i;function containsWindowsAttacks4(str){if(/:[^\\/]/.test(str))return!0;let parts=str.split(/[/\\]/);for(let part of parts)if(WINDOWS_RESERVED_NAMES5.test(part))return!0;return!1}function resolveWithinWorkspace(filePath,workspace){try{let resolvedPath=path372.resolve(workspace,filePath),realWorkspace=fs230.realpathSync(workspace),realResolvedPath=fs230.realpathSync(resolvedPath),relativePath2=path372.relative(realWorkspace,realResolvedPath);if(relativePath2.startsWith("..")||path372.isAbsolute(relativePath2))return null;return relativePath2}catch{return null}}function isPathInWorkspace3(filePath,workspace){return resolveWithinWorkspace(filePath,workspace)!==null}function validatePathForRead2(filePath,workspace){return isPathInWorkspace3(filePath,workspace)}function splitGlobPatterns2(value){return value?value.split(",").map((p)=>p.trim()).filter(Boolean):[]}var GLOB_METACHARACTERS=/[*?[\]{}]/;function isExactPath(pattern){return!GLOB_METACHARACTERS.test(pattern)}function targetsDotDirectory(pattern){let firstSegment=pattern.split(/[\\/]/)[0];return!!firstSegment&&firstSegment.startsWith(".")&&firstSegment!=="."&&firstSegment!==".."}function hasGitSegment(resolvedRelativePath){return resolvedRelativePath.split(/[\\/]/).some((segment)=>segment.toLowerCase()===".git")}function toWorkspaceRelativePath2(filePath,workspace){try{let resolved=path372.resolve(workspace,filePath),realWorkspace=fs230.realpathSync(workspace),realResolved=fs230.realpathSync(resolved),relative99=path372.relative(realWorkspace,realResolved);if(!relative99||relative99.startsWith("..")||path372.isAbsolute(relative99))return null;return relative99.split(path372.sep).join("/")}catch{return null}}function truncateLine(line,maxLines){let trimmed=line.trimEnd();if(trimmed.length>maxLines)return`${trimmed.substring(0,maxLines)}...`;return trimmed}function resolvePackagedRipgrep(){try{let mod=require2("@vscode/ripgrep");return typeof mod.rgPath==="string"&&mod.rgPath?mod.rgPath:null}catch{return null}}function resolveRipgrepBinary(){return _internals319.resolvePackagedRipgrep()??_internals319.resolveExecutableFromPath(["rg"])}async function ripgrepSearch(opts){let rgPath=_internals319.resolveRipgrepBinary();if(!rgPath)return{error:!0,type:"rg-not-found",message:"ripgrep (rg) not found; using fallback search was not possible"};let args2=["--json","--no-config","-n"],includes=splitGlobPatterns2(opts.include),promotablePaths=[],globIncludes=[];for(let pattern of includes){let resolvedRelative=resolveWithinWorkspace(pattern,opts.workspace);if(isExactPath(pattern)&&targetsDotDirectory(pattern)&&pattern.split(/[\\/]/)[0]?.toLowerCase()!==".git"&&resolvedRelative!==null&&!hasGitSegment(resolvedRelative))promotablePaths.push(pattern);else globIncludes.push(pattern)}let pathOperands;if(promotablePaths.length>0&&globIncludes.length===0)pathOperands=promotablePaths;else{for(let pattern of[...globIncludes,...promotablePaths])args2.push("--glob",pattern);if(includes.some((p)=>targetsDotDirectory(p)&&p.split(/[\\/]/)[0]?.toLowerCase()!==".git"))args2.push("--hidden","--no-ignore"),args2.push("--glob","!.git");pathOperands=["."]}for(let pattern of splitGlobPatterns2(opts.exclude))args2.push("--glob",`!${pattern}`);if(opts.mode!=="regex")args2.push("--fixed-strings");args2.push("--",opts.query,...pathOperands);let run=await _internals319.runExternalTool({executable:rgPath,args:args2,cwd:opts.workspace,timeoutMs:REGEX_TIMEOUT_MS,maxStdoutBytes:MAX_RG_STDOUT_BYTES,maxStderrBytes:MAX_RG_STDERR_BYTES});try{if(run.status==="timeout")return{error:!0,type:"regex-timeout",message:`Search timed out after ${REGEX_TIMEOUT_MS}ms`};if(run.status==="spawn-error")return{error:!0,type:"unknown",message:run.message??"ripgrep failed to start"};if(run.exitCode!==0&&run.stderr){if(run.stderr.includes("Invalid regex")||run.stderr.includes("regex parse error")||run.stderr.includes("SyntaxError"))return{error:!0,type:"invalid-query",message:`Invalid query: ${run.stderr.split(`
7855
+ `,r:"\r",b:"\b",f:"\f",v:"\v"};if(simple[escaped]!==void 0){appendText(simple[escaped]);continue}if(/[0-7]/.test(escaped)){let octal=escaped;for(let count4=0;count4<2;count4++){let next=value[index+1];if(!next||!/[0-7]/.test(next))break;octal+=next,index++}bytes.push(Number.parseInt(octal,8));continue}return null}return Buffer.from(bytes).toString("utf8")}function normalizeRepoPathKey(repoPath){let normalized=repoPath.replace(/\\/g,"/");return _internals318.platform()==="win32"||_internals318.platform()==="darwin"?normalized.toLowerCase():normalized}function normalizeDiffPath(rawPath){let pathToken=rawPath.startsWith('"')?rawPath:rawPath.split("\t",1)[0],decoded=decodeGitQuotedPath(pathToken);if(decoded===null||decoded==="/dev/null"||decoded.trim().length===0)return null;return normalizeRepoPathKey(decoded)}function parseDiffLineRangesChecked(diffOutput,requireGitFileHeaders){let result=new Map,currentFile=null,inGitFile=!1,expectingDestination=!1,destinationSeen=!1,destinationNeedsHunk=!1,collectedLines=0;for(let rawLine of diffOutput.split(/\r?\n/)){let line=rawLine.endsWith("\r")?rawLine.slice(0,-1):rawLine;if(line.startsWith("diff --git ")){if(expectingDestination||destinationNeedsHunk)return null;inGitFile=!0,currentFile=null,expectingDestination=!1,destinationSeen=!1;continue}if(line.startsWith("--- ")&&(inGitFile||!requireGitFileHeaders)){if(expectingDestination||destinationNeedsHunk)return null;expectingDestination=!0;continue}if(line.startsWith("+++ ")){if(requireGitFileHeaders&&(!inGitFile||!expectingDestination))return null;let rawDestination=line.slice(4);if(currentFile=normalizeDiffPath(rawDestination),currentFile===null&&rawDestination.trim()!=="/dev/null")return null;if(expectingDestination=!1,destinationSeen=!0,destinationNeedsHunk=!0,!currentFile)continue;if(!result.has(currentFile))result.set(currentFile,new Set);continue}if(!line.startsWith("@@"))continue;if(expectingDestination||requireGitFileHeaders&&(!inGitFile||!destinationSeen))return null;let match=/^@@ -\d+(?:,\d+)? \+(\d+)(?:,(\d+))? @@/.exec(line);if(!match)return null;let start=Number.parseInt(match[1],10),count4=match[2]!==void 0?Number.parseInt(match[2],10):1;if(!Number.isSafeInteger(start)||!Number.isSafeInteger(count4)||count4<0||count4>0&&start<1||count4>MAX_CHANGED_LINE_ENTRIES||start+count4-1>Number.MAX_SAFE_INTEGER||collectedLines+count4>MAX_CHANGED_LINE_ENTRIES)return null;if(destinationNeedsHunk=!1,!currentFile)continue;let lines=result.get(currentFile);if(!lines)return null;for(let index=0;index<count4;index++)lines.add(start+index);collectedLines+=count4}if(expectingDestination||destinationNeedsHunk)return null;return result}function mergeChangedLines(target,source){for(let[file3,sourceLines]of source){let targetLines=target.get(file3)??new Set;for(let line of sourceLines)targetLines.add(line);target.set(file3,targetLines)}}function parseUntrackedStatus(output){if(output.length>0&&!output.endsWith("\x00"))return null;let untracked=[],records=output.split("\x00");for(let index=0;index<records.length-1;index++){let record3=records[index];if(!record3||record3.length<4||record3[2]!==" ")return null;let status2=record3.slice(0,2),filePath=record3.slice(3);if(!filePath||!isKnownPorcelainStatus(status2))return null;if(status2==="??"||status2==="!!")untracked.push(normalizeRepoPathKey(filePath));if(/[RC]/.test(status2)){let sourcePath=records[++index];if(!sourcePath||looksLikePorcelainStatusRecord(sourcePath))return null}}return untracked}function isKnownPorcelainStatus(status2){if(status2==="??"||status2==="!!")return!0;if(/U/.test(status2))return new Set(["DD","AU","UD","UA","DU","AA","UU"]).has(status2);return status2!==" "&&/^[ MTADRC]{2}$/.test(status2)}function looksLikePorcelainStatusRecord(value){return value.length>=4&&value[2]===" "&&isKnownPorcelainStatus(value.slice(0,2))}async function getChangedLineAmbiguousFiles(directory,abortSignal,requestedFiles=[]){let mergeBase=null;for(let baseBranch of["zaxbyhub/main","upstream/main","origin/main","main","origin/master","master"]){let candidate2=(await runGit8(["merge-base",baseBranch,"HEAD"],directory,abortSignal))?.trim();if(candidate2&&/^[0-9a-f]{40,64}$/i.test(candidate2)){mergeBase=candidate2;break}}if(!mergeBase)return null;let headSha=(await runGit8(["rev-parse","HEAD"],directory,abortSignal))?.trim();if(typeof headSha==="string"&&/^[0-9a-f]{40,64}$/i.test(headSha)&&headSha.toLowerCase()===mergeBase.toLowerCase())return null;let literalPathspecs=requestedFiles.map((file3)=>path368.relative(directory,file3).replace(/\\/g,"/")).filter((file3)=>file3.length>0&&file3!==".."&&!file3.startsWith("../")).map((file3)=>`:(literal)${file3}`),statusArgs=["-c","core.quotePath=false","status","--porcelain=v1","-z","--untracked-files=all",...literalPathspecs.length>0?["--",...literalPathspecs]:[]],[committedNames,status2]=await Promise.all([runGit8(["-c","core.quotePath=false","diff","--name-only","--no-ext-diff","--no-color","--no-prefix","-z",`${mergeBase}..HEAD`,"--",...literalPathspecs.length>0?literalPathspecs:[]],directory,abortSignal),runGit8(statusArgs,directory,abortSignal)]);if(committedNames===null||status2===null)return null;let committed=new Set(committedNames.split("\x00").filter(Boolean).map(normalizeRepoPathKey)),staged=new Set,unstaged=new Set;if(status2.length>0&&!status2.endsWith("\x00"))return null;let records=status2.split("\x00");for(let index=0;index<records.length-1;index++){let record3=records[index];if(!record3||record3.length<4||record3[2]!==" ")return null;let statusCode=record3.slice(0,2),filePath=record3.slice(3);if(!filePath||!isKnownPorcelainStatus(statusCode))return null;if(statusCode!=="??"&&statusCode!=="!!"){let key3=normalizeRepoPathKey(filePath);if(/[MADRCU]/.test(statusCode[0]))staged.add(key3);if(/[MADRCU]/.test(statusCode[1]))unstaged.add(key3)}if(/[RC]/.test(statusCode)){let sourcePath=records[++index];if(!sourcePath||looksLikePorcelainStatusRecord(sourcePath))return null}}let ambiguous=new Set;for(let key3 of committed)if(staged.has(key3)||unstaged.has(key3))ambiguous.add(key3);for(let key3 of staged)if(unstaged.has(key3))ambiguous.add(key3);return ambiguous}async function getChangedLineRanges(directory,abortSignal,requestedFiles=[]){let mergeBase=null;for(let baseBranch of["zaxbyhub/main","upstream/main","origin/main","main","origin/master","master"]){let candidate2=(await runGit8(["merge-base",baseBranch,"HEAD"],directory,abortSignal))?.trim();if(candidate2&&/^[0-9a-f]{40,64}$/i.test(candidate2)){mergeBase=candidate2;break}}if(!mergeBase)return null;let commonDiffArgs=["-c","core.quotePath=false","diff","--no-ext-diff","--no-color","--no-prefix","-U0"],requestedPathspecs=requestedFiles.map((file3)=>path368.relative(directory,file3).replace(/\\/g,"/")).filter((file3)=>file3.length>0&&file3!==".."&&!file3.startsWith("../")),statusArgs=["-c","core.quotePath=false","status","--porcelain=v1","-z","--untracked-files=all",...requestedPathspecs.length>0?["--ignored=matching"]:[],...requestedPathspecs.length>0?["--",...requestedPathspecs]:[]],[committed,staged,unstaged,status2]=await Promise.all([runGit8([...commonDiffArgs,`${mergeBase}..HEAD`,"--"],directory,abortSignal),runGit8([...commonDiffArgs,"--cached","HEAD","--"],directory,abortSignal),runGit8([...commonDiffArgs,"--"],directory,abortSignal),runGit8(statusArgs,directory,abortSignal)]);if(committed===null||staged===null||unstaged===null||status2===null)return null;let committedLines=parseDiffLineRangesChecked(committed,!0),stagedLines=parseDiffLineRangesChecked(staged,!0),unstagedLines=parseDiffLineRangesChecked(unstaged,!0);if(!committedLines||!stagedLines||!unstagedLines)return null;let result=new Map;mergeChangedLines(result,committedLines),mergeChangedLines(result,stagedLines),mergeChangedLines(result,unstagedLines);let untracked=parseUntrackedStatus(status2);if(untracked===null)return null;let requestedKeys=requestedPathspecs.map(normalizeRepoPathKey);for(let file3 of untracked)if(result.set(file3,new Set([ALL_LINES_CHANGED])),file3.endsWith("/")){for(let requestedFile of requestedKeys)if(requestedFile.startsWith(file3))result.set(requestedFile,new Set([ALL_LINES_CHANGED]))}return result}function classifySastFindings(findings,changedLineRanges,directory){if(!changedLineRanges)return{newFindings:findings,preexistingFindings:[]};let newFindings=[],preexistingFindings=[],pathApi=_internals318.platform()==="win32"?path368.win32:path368.posix,resolvedDirectory=pathApi.resolve(directory);for(let finding of findings){let filePath=finding.location.file,normalised;try{if(typeof filePath!=="string"||filePath.length===0||filePath.includes("\x00")){newFindings.push(finding);continue}let resolvedFinding=pathApi.isAbsolute(filePath)?pathApi.resolve(filePath):pathApi.resolve(resolvedDirectory,filePath),relative98=pathApi.relative(resolvedDirectory,resolvedFinding);if(pathApi.isAbsolute(relative98)||relative98===".."||relative98.startsWith(`..${pathApi.sep}`)){newFindings.push(finding);continue}normalised=normalizeRepoPathKey(relative98)}catch{newFindings.push(finding);continue}let changedLines=changedLineRanges.get(normalised);if(changedLines?.has(ALL_LINES_CHANGED)||changedLines?.has(finding.location.line))newFindings.push(finding);else preexistingFindings.push(finding)}return{newFindings,preexistingFindings}}function classifySecretFindings(findings,changedLineRanges,directory,ambiguousFiles){if(!changedLineRanges)return{newFindings:findings,preexistingFindings:[]};let newFindings=[],preexistingFindings=[],pathApi=_internals318.platform()==="win32"?path368.win32:path368.posix,resolvedDirectory=pathApi.resolve(directory);for(let finding of findings){let{path:filePath,line}=finding;if(typeof filePath!=="string"||filePath.length===0||filePath.includes("\x00")||typeof line!=="number"||!Number.isSafeInteger(line)||line<1){newFindings.push(finding);continue}let changedLines;try{let resolvedFinding=pathApi.isAbsolute(filePath)?pathApi.resolve(filePath):pathApi.resolve(resolvedDirectory,filePath),relative98=pathApi.relative(resolvedDirectory,resolvedFinding);if(pathApi.isAbsolute(relative98)||relative98===".."||relative98.startsWith(`..${pathApi.sep}`)){newFindings.push(finding);continue}let normalised=normalizeRepoPathKey(relative98);if(ambiguousFiles?.has(normalised)){newFindings.push(finding);continue}changedLines=changedLineRanges.get(normalised)}catch{newFindings.push(finding);continue}if(changedLines!==void 0&&changedLines.size>0&&!changedLines.has(ALL_LINES_CHANGED)&&!changedLines.has(line))preexistingFindings.push(finding);else newFindings.push(finding)}return{newFindings,preexistingFindings}}async function runPreCheckBatch(input,workspaceDir,contextDir,abortSignal){let effectiveWorkspaceDir=workspaceDir||input.directory||contextDir,{files,directory,sast_threshold="medium",gates:gatesOverrides,phase,sast_enabled=!0}=input,gates=gatesOverrides??(input.config?.gates?{sast_scan:input.config.gates.sast_scan,quality_budget:input.config.gates.quality_budget}:void 0),dirError=validateDirectory2(directory,effectiveWorkspaceDir);if(dirError)return warn(`pre_check_batch: Invalid directory: ${dirError}`),{batch_status:"invalid",gates_passed:!1,lint:{ran:!1,error:dirError,duration_ms:0},secretscan:{ran:!1,error:dirError,duration_ms:0},sast_scan:{ran:!1,error:dirError,duration_ms:0},quality_budget:{ran:!1,error:dirError,duration_ms:0},total_duration_ms:0};if(!files||files.length===0)return warn("pre_check_batch: No files provided, skipping all tools (fail-closed)"),{batch_status:"invalid",gates_passed:!1,lint:{ran:!1,error:"No files provided",duration_ms:0},secretscan:{ran:!1,error:"No files provided",duration_ms:0},sast_scan:{ran:!1,error:"No files provided",duration_ms:0},quality_budget:{ran:!1,error:"No files provided",duration_ms:0},total_duration_ms:0};let changedFiles=[],rawDeclaredCount=files.length;for(let file3 of files){if(typeof file3!=="string"){warn(`pre_check_batch: Non-string file entry rejected: ${String(file3)}`);continue}if(validatePath(file3,directory,effectiveWorkspaceDir)){warn(`pre_check_batch: Invalid file path: ${file3}`);continue}changedFiles.push(path368.resolve(directory,file3))}if(changedFiles.length===0)return warn("pre_check_batch: No valid files after validation, skipping all tools (fail-closed)"),{batch_status:"invalid",gates_passed:!1,lint:{ran:!1,error:"No files provided",duration_ms:0},secretscan:{ran:!1,error:"No files provided",duration_ms:0},sast_scan:{ran:!1,error:"No files provided",duration_ms:0},quality_budget:{ran:!1,error:"No files provided",duration_ms:0},total_duration_ms:0};try{assertProjectRoot(directory)}catch(error93){let rootError=error93 instanceof Error?error93.message:String(error93);return warn(`pre_check_batch: Project-root validation failed: ${rootError}`),{batch_status:"invalid",gates_passed:!1,lint:{ran:!1,error:rootError,duration_ms:0},secretscan:{ran:!1,error:rootError,duration_ms:0},sast_scan:{ran:!1,error:rootError,duration_ms:0},quality_budget:{ran:!1,error:rootError,duration_ms:0},total_duration_ms:0}}if(changedFiles.length>MAX_FILES)throw Error(`Input exceeds maximum file count: ${changedFiles.length} > ${MAX_FILES}`);let limit=pLimit(MAX_CONCURRENT),sastDisabledByConfig=gates?.sast_scan?.enabled===!1,[lintResult,secretscanResult,sastScanResult,qualityBudgetResult]=await Promise.all([limit(()=>_internals318.runLintWrapped(changedFiles,directory,gates,abortSignal)),limit(()=>_internals318.runSecretscanWrapped(changedFiles,directory,gates,abortSignal,rawDeclaredCount)),sast_enabled&&!sastDisabledByConfig?limit(()=>_internals318.runSastScanWrapped(changedFiles,directory,sast_threshold,gates,phase,abortSignal)):Promise.resolve({ran:!1,duration_ms:0}),limit(()=>_internals318.runQualityBudgetWrapped(changedFiles,directory,gates,abortSignal))]),totalDuration=lintResult.duration_ms+secretscanResult.duration_ms+sastScanResult.duration_ms+qualityBudgetResult.duration_ms,gatesPassed=!0;if(lintResult.ran&&lintResult.result){let lintRes=lintResult.result;if("success"in lintRes&&lintRes.success===!1)warn("pre_check_batch: Lint found issues (informational only)")}else if(lintResult.error)warn(`pre_check_batch: Lint error (informational only): ${lintResult.error}`);let changedLineRangesMemo,getChangedLineRangesMemoized=async()=>{if(changedLineRangesMemo===void 0)changedLineRangesMemo=await _internals318.getChangedLineRanges(directory,abortSignal,changedFiles);return changedLineRangesMemo},secretscanClassification,secretscanPreexistingFindings,secretscanScanFindings=secretscanResult.ran&&secretscanResult.result&&!("error"in secretscanResult.result)?secretscanResult.result.findings:[];if(secretscanScanFindings.length>0){let changedLineRanges=await getChangedLineRangesMemoized(),ambiguousFiles=await _internals318.getChangedLineAmbiguousFiles(directory,abortSignal,changedFiles);if(ambiguousFiles===null)secretscanClassification={newFindings:secretscanScanFindings,preexistingFindings:[],diffScoped:!1};else{let{newFindings,preexistingFindings}=classifySecretFindings(secretscanScanFindings,changedLineRanges,directory,ambiguousFiles);if(secretscanClassification={newFindings,preexistingFindings,diffScoped:changedLineRanges!==null},preexistingFindings.length>0)secretscanPreexistingFindings=preexistingFindings,warn(`pre_check_batch: Secretscan found ${preexistingFindings.length} pre-existing secret finding(s) on unchanged lines - visible, non-gating, passed to reviewer for triage`)}}let secretscanDecision=evaluateSecretscanGate(secretscanResult,rawDeclaredCount,secretscanClassification);if(!secretscanDecision.passed)gatesPassed=!1,warn(`pre_check_batch: ${secretscanDecision.summary} - GATE FAILED`);if(secretscanResult.ran||secretscanResult.error)try{let scanResult=secretscanDecision.result,secretscanEvidence={task_id:"secretscan",type:"secretscan",timestamp:new Date().toISOString(),agent:"pre_check_batch",verdict:secretscanDecision.passed?"pass":"fail",summary:secretscanDecision.summary,findings_count:secretscanDecision.findingsCount,scan_directory:scanResult?.scan_dir??directory,files_scanned:scanResult?.files_scanned??0,skipped_files:scanResult?.skipped_files??0,ignored_files:scanResult?.ignored_files??0,policy_skipped_files:scanResult?.policy_skipped_files??0,requested_files:scanResult?.requested_files??rawDeclaredCount,new_findings_count:secretscanDecision.newFindingsCount??0,preexisting_findings_count:secretscanDecision.preexistingFindingsCount??0,diff_scoped:secretscanDecision.diffScoped??!1,incomplete_files:scanResult?.incomplete_files??changedFiles.length,incomplete_paths:scanResult?.incomplete_paths??[{path:".",reason:"missing_coverage_metadata"}]};await _internals318.saveEvidence(directory,"secretscan",secretscanEvidence,abortSignal)}catch(e){let persistError=`Failed to persist secretscan evidence: ${e instanceof Error?e.message:String(e)}`;secretscanResult.error=persistError,gatesPassed=!1,warn(`pre_check_batch: ${persistError} - GATE FAILED`)}let sastPreexistingFindings,sastDegraded=!1;if(sastScanResult.ran&&sastScanResult.result){let sastResult=sastScanResult.result;if(sastResult.error)if(sastResult.failure_kind==="semgrep_process_exit"&&sastResult.findings.length===0)sastDegraded=!0,warn(`pre_check_batch: SAST coverage degraded (${sastResult.error}) - continuing without a gate failure`);else gatesPassed=!1,warn(`pre_check_batch: SAST scan error (${sastResult.error}) - GATE FAILED`);else if(sastResult.baseline_used){let sastCarryFindings=[...sastResult.pre_existing_findings??[],...sastResult.moved_findings??[]];if(sastCarryFindings.length>0){if(sastPreexistingFindings=sastCarryFindings.filter((f)=>meetsThresholdForTriage(f.severity,sast_threshold)),sastPreexistingFindings.length>0)warn(`pre_check_batch: SAST baseline diff found ${sastPreexistingFindings.length} pre-existing/moved finding(s) - passing to reviewer for triage`)}if(sastResult.verdict==="fail")gatesPassed=!1,warn("pre_check_batch: SAST scan found new findings above threshold - GATE FAILED")}else if(sastResult.verdict==="fail"){let gateFindings=sastResult.findings.filter((f)=>GATE_SEVERITIES.has(f.severity));if(gateFindings.length>0){let changedLineRanges=await getChangedLineRangesMemoized(),{newFindings,preexistingFindings}=classifySastFindings(gateFindings,changedLineRanges,directory);if(newFindings.length>0)gatesPassed=!1,warn(`pre_check_batch: SAST scan found ${newFindings.length} new HIGH/CRITICAL finding(s) on changed lines - GATE FAILED`);else if(preexistingFindings.length>0)sastPreexistingFindings=preexistingFindings,warn(`pre_check_batch: SAST scan found ${preexistingFindings.length} pre-existing HIGH/CRITICAL finding(s) on unchanged lines - passing to reviewer for triage`)}else gatesPassed=!1,warn("pre_check_batch: SAST scan found vulnerabilities - GATE FAILED")}}else if(sastScanResult.error)gatesPassed=!1,warn(`pre_check_batch: SAST scan error - GATE FAILED: ${sastScanResult.error}`);if(qualityBudgetResult.ran&&qualityBudgetResult.result){if(qualityBudgetResult.result.verdict==="fail")warn("pre_check_batch: Quality budget exceeded (informational only)")}else if(qualityBudgetResult.error)warn(`pre_check_batch: Quality budget error (informational only): ${qualityBudgetResult.error}`);return{batch_status:[lintResult,secretscanResult,sastScanResult,qualityBudgetResult].every((toolResult)=>toolResult.ran===!1)?"skipped":"completed",gates_passed:gatesPassed,lint:lintResult,secretscan:secretscanResult,sast_scan:sastScanResult,quality_budget:qualityBudgetResult,total_duration_ms:Math.round(totalDuration),...sastDegraded&&{sast_degraded:!0},...(!sast_enabled||sastDisabledByConfig)&&{sast_skipped:!0},...sastPreexistingFindings&&sastPreexistingFindings.length>0&&{sast_preexisting_findings:sastPreexistingFindings},...secretscanPreexistingFindings&&secretscanPreexistingFindings.length>0&&{secretscan_preexisting_findings:secretscanPreexistingFindings}}}var pre_check_batch=createSwarmTool({allowWorkingDirectoryOverride:!0,description:"Run multiple verification tools in parallel: lint, secretscan, SAST scan, and quality budget. Returns unified result with gates_passed status. Security findings and incomplete SAST runs are hard failures; a Semgrep nonzero process exit with zero findings is returned as explicit sast_degraded coverage and does not block.",args:{files:exports_external.array(exports_external.string()).optional().describe("Specific files to check (optional, scans directory if not provided)"),directory:exports_external.string().describe("Project root directory — ordinary workspace subdirectories are rejected; direct .git or .opencode project boundaries are accepted"),sast_threshold:exports_external.enum(["low","medium","high","critical"]).optional().describe("Minimum severity for SAST findings to cause failure (default: medium)"),phase:exports_external.number().int().min(1).optional().describe("Current phase number (positive integer >= 1). When provided, enables SAST baseline diffing: only findings absent from the phase-scoped baseline fail the gate.")},async execute(args2,directory,ctx){if(!args2||typeof args2!=="object")return serializePreCheckResult({batch_status:"invalid",gates_passed:!1,lint:{ran:!1,error:"Invalid arguments",duration_ms:0},secretscan:{ran:!1,error:"Invalid arguments",duration_ms:0},sast_scan:{ran:!1,error:"Invalid arguments",duration_ms:0},quality_budget:{ran:!1,error:"Invalid arguments",duration_ms:0},total_duration_ms:0});if(!directory||typeof directory!=="string"||directory.trim()==="")return serializePreCheckResult({batch_status:"invalid",gates_passed:!1,lint:{ran:!1,error:"project directory is required but was not provided",duration_ms:0},secretscan:{ran:!1,error:"project directory is required but was not provided",duration_ms:0},sast_scan:{ran:!1,error:"project directory is required but was not provided",duration_ms:0},quality_budget:{ran:!1,error:"project directory is required but was not provided",duration_ms:0},total_duration_ms:0});let typedArgs=args2;if(!typedArgs.directory)return serializePreCheckResult({batch_status:"invalid",gates_passed:!1,lint:{ran:!1,error:"directory is required",duration_ms:0},secretscan:{ran:!1,error:"directory is required",duration_ms:0},sast_scan:{ran:!1,error:"directory is required",duration_ms:0},quality_budget:{ran:!1,error:"directory is required",duration_ms:0},total_duration_ms:0});let resolvedDirectory=path368.resolve(typedArgs.directory),workspaceAnchor=path368.resolve(directory);if(isStrictPathDescendant(resolvedDirectory,workspaceAnchor)&&!hasExplicitProjectBoundary(resolvedDirectory)){let subDirError=`directory "${typedArgs.directory}" is a subdirectory of the project root — pre_check_batch requires the project root directory "${workspaceAnchor}"`;return serializePreCheckResult({batch_status:"invalid",gates_passed:!1,lint:{ran:!1,error:subDirError,duration_ms:0},secretscan:{ran:!1,error:subDirError,duration_ms:0},sast_scan:{ran:!1,error:subDirError,duration_ms:0},quality_budget:{ran:!1,error:subDirError,duration_ms:0},total_duration_ms:0})}let dirError=validateDirectory2(resolvedDirectory,workspaceAnchor);if(dirError)return serializePreCheckResult({batch_status:"invalid",gates_passed:!1,lint:{ran:!1,error:dirError,duration_ms:0},secretscan:{ran:!1,error:dirError,duration_ms:0},sast_scan:{ran:!1,error:dirError,duration_ms:0},quality_budget:{ran:!1,error:dirError,duration_ms:0},total_duration_ms:0});try{let sastEnabled=!0;try{let preamble=await _internals318.resolveGatePreamble(resolvedDirectory,ctx?.sessionID);if(preamble.resolved&&preamble.effectiveGates)sastEnabled=preamble.effectiveGates.sast_enabled}catch{warn("pre_check_batch: QA-gate profile resolution failed; keeping SAST enabled")}let rawPhase=typedArgs.phase,safePhase=typeof rawPhase==="number"&&Number.isInteger(rawPhase)&&rawPhase>=1?rawPhase:void 0,result=await _internals318.runPreCheckBatch({files:typedArgs.files,directory:resolvedDirectory,sast_threshold:typedArgs.sast_threshold,config:typedArgs.config,gates:_internals318.loadGateOverrides(resolvedDirectory),phase:safePhase,sast_enabled:sastEnabled},workspaceAnchor,directory,ctx?.abort);return serializePreCheckResult(result)}catch(error93){let errorMessage3=error93 instanceof Error?error93.message:"Unknown error";return serializePreCheckResult({batch_status:"invalid",gates_passed:!1,lint:{ran:!1,error:errorMessage3,duration_ms:0},secretscan:{ran:!1,error:errorMessage3,duration_ms:0},sast_scan:{ran:!1,error:errorMessage3,duration_ms:0},quality_budget:{ran:!1,error:errorMessage3,duration_ms:0},total_duration_ms:0})}}});init_zod();init_pr_workflow_gate();init_atomic_write();init_create_tool();import{createHash as createHash119}from"node:crypto";import{mkdirSync as mkdirSync98,readdirSync as readdirSync57,realpathSync as realpathSync58,rmSync as rmSync36,statSync as statSync113}from"node:fs";import{tmpdir as tmpdir20}from"node:os";import path369 from"node:path";var MAX_COMMIT_MESSAGE_CHARS=8192,MESSAGE_FILE_TTL_MS=86400000,PreparePrFeedbackCommitMessageArgsSchema=exports_external.object({message:exports_external.string().refine((value)=>value.trim().length>0,{message:"message must not be empty or whitespace-only"}).refine((value)=>value.length<=MAX_COMMIT_MESSAGE_CHARS,{message:`message must be at most ${MAX_COMMIT_MESSAGE_CHARS} characters`}).refine((value)=>!value.includes("\x00"),{message:"message must not contain NUL bytes"}).transform((value)=>value.trim())}).strict();function commitMessageTargetDir(){return path369.join(tmpdir20(),"swarm-pr-feedback-commit-msg")}function resolvePrFeedbackCommitMessageFilePath(sessionID,message){let sanitizedSession=sessionID.replace(/[^A-Za-z0-9._-]/g,"_"),digest5=createHash119("sha256").update(message,"utf8").digest("hex").slice(0,16);return path369.join(commitMessageTargetDir(),`${sanitizedSession}-${digest5}.txt`)}function pruneStaleMessageFiles(){try{let dir=commitMessageTargetDir(),now2=Date.now();for(let entry of readdirSync57(dir)){if(!entry.endsWith(".txt"))continue;let full=path369.join(dir,entry);try{let stats2=statSync113(full);if(now2-stats2.mtimeMs>MESSAGE_FILE_TTL_MS)rmSync36(full,{force:!1})}catch{}}}catch{}}async function executePreparePrFeedbackCommitMessage(args2,directory,context={}){let parsed=PreparePrFeedbackCommitMessageArgsSchema.safeParse(args2);if(!parsed.success)return JSON.stringify({success:!1,message:`Invalid commit-message request: ${parsed.error.issues.map((issue3)=>issue3.path.length>0?`${issue3.path.join(".")}: ${issue3.message}`:issue3.message).join("; ")}`});let sessionID=context.sessionID?.trim();if(!sessionID)return JSON.stringify({success:!1,message:"Commit-message authoring requires an active sessionID"});let state2=await readPrWorkflowGateState(directory,sessionID);if(!state2||state2.mode!=="PR_FEEDBACK"||!state2.prHeadSha)return JSON.stringify({success:!1,message:"Commit-message authoring requires an active bound PR_FEEDBACK workflow; bind the PR head first"});let message=parsed.data.message,targetDir=commitMessageTargetDir(),targetPath=resolvePrFeedbackCommitMessageFilePath(sessionID,message),resolvedTarget=path369.resolve(targetPath),resolvedDir=path369.resolve(targetDir);if(!(resolvedTarget===resolvedDir||resolvedTarget.startsWith(resolvedDir+path369.sep)))return JSON.stringify({success:!1,message:"Commit-message file path escaped the swarm-pr-feedback-commit-msg directory; refusing to write"});let repoRoot=path369.resolve(directory),insideRepo=(value)=>{let rel3=path369.relative(repoRoot,value);return rel3===""||!rel3.startsWith("..")&&!path369.isAbsolute(rel3)};if(insideRepo(resolvedTarget)||insideRepo(resolvedDir))return JSON.stringify({success:!1,message:"TMPDIR resolves inside the repository; the commit-message file must live outside the repository — refusing to write"});try{mkdirSync98(resolvedDir,{recursive:!0});let realpathDir=resolvedDir;try{realpathDir=realpathSync58(resolvedDir)}catch{mkdirSync98(resolvedDir,{recursive:!0})}let realpathTarget=path369.join(realpathDir,path369.basename(resolvedTarget));if(!realpathTarget.startsWith(realpathDir+path369.sep)&&realpathTarget!==realpathDir)return JSON.stringify({success:!1,message:"Commit-message file path escaped the swarm-pr-feedback-commit-msg directory through a symlink; refusing to write"});if(insideRepo(realpathDir))return JSON.stringify({success:!1,message:"The resolved temp directory points inside the repository through a symlink; refusing to write"});pruneStaleMessageFiles(),await atomicWriteFileAnyRoot(realpathTarget,message,{mode:384})}catch(error93){return JSON.stringify({success:!1,message:`Could not author the commit-message file: ${error93 instanceof Error?error93.message:String(error93)}`})}return JSON.stringify({success:!0,path:resolvedTarget,message:"Commit-message file authored outside the repository; commit with git commit -F <path> (the classifier refuses in-repo message files). The file is mode 0600, lives in the OS temp directory, never touches the bound checkout, and is pruned after 24h."})}var prepare_pr_feedback_commit_message=createSwarmTool({description:"Author a PR_FEEDBACK commit message that contains shell metacharacters (e.g. a Co-Authored-By trailer with <...>) into a file OUTSIDE the repository, returning the path for the sanctioned git commit -F command. The inline -m form is rejected by the shell classifier by design; an in-repo message file would dirty the clean-tree arming check. Requires an active bound PR_FEEDBACK workflow.",args:{message:PreparePrFeedbackCommitMessageArgsSchema.shape.message},execute:executePreparePrFeedbackCommitMessage});init_zod();init_guardrails2();init_pr_workflow_gate();init_scope_binding();init_create_tool();var PreparePrFeedbackScopeArgsSchema=exports_external.object({task_id:exports_external.string().regex(/^\d+\.\d+(?:\.\d+)*$/,"task_id must use N.M notation"),files:exports_external.array(exports_external.string().min(1).max(4096)).min(1).max(1e4)}).strict();function failure3(message){return JSON.stringify({success:!1,message},null,2)}async function executePreparePrFeedbackScope(args2,directory,context={}){let parsed=PreparePrFeedbackScopeArgsSchema.safeParse(args2);if(!parsed.success)return failure3(`Invalid PR-feedback scope: ${parsed.error.issues.map((issue3)=>`${issue3.path.join(".")}: ${issue3.message}`).join("; ")}`);let sessionID=context.sessionID?.trim();if(!sessionID)return failure3("PR-feedback scope requires an active session");let files=normalizeScopeFiles(parsed.data.files);if(!files)return failure3("PR-feedback scope contains an unsafe file path");for(let file3 of files){let symlinkBlock=checkWriteTargetForSymlink(file3,directory);if(symlinkBlock)return failure3(symlinkBlock)}try{await declarePrFeedbackScope(directory,sessionID,parsed.data.task_id,files)}catch(error93){return failure3(error93 instanceof Error?error93.message:String(error93))}return JSON.stringify({success:!0,task_id:parsed.data.task_id,files,message:"Scope is bound to the verified PR-feedback revision and will authorize only the next matching coder Task."},null,2)}var prepare_pr_feedback_scope=createSwarmTool({description:"Prepare an exact file scope for one PR-feedback coder Task after immutable feedback verification settles.",args:{task_id:PreparePrFeedbackScopeArgsSchema.shape.task_id,files:PreparePrFeedbackScopeArgsSchema.shape.files},execute:executePreparePrFeedbackScope});init_quality_budget();init_zod();init_pr_workflow_gate();init_create_tool();var RebindPrFeedbackHeadArgsSchema=exports_external.object({pr_head_sha:exports_external.string().trim().regex(/^[0-9a-f]{40}$/i)}).strict();async function executeRebindPrFeedbackHead(args2,directory,context={}){let parsed=RebindPrFeedbackHeadArgsSchema.safeParse(args2);if(!parsed.success)return JSON.stringify({success:!1,message:`Invalid PR feedback rebind: ${parsed.error.issues.map((issue3)=>`${issue3.path.join(".")}: ${issue3.message}`).join("; ")}`});if(!context.sessionID?.trim())return JSON.stringify({success:!1,message:"PR feedback rebind requires an active sessionID"});try{let state2=await rebindPrFeedbackHead(directory,context.sessionID,parsed.data.pr_head_sha);return JSON.stringify({success:!0,pr_head_sha:state2.prHeadSha,rebind_count:state2.prFeedbackRebindCount??1,message:"Rebound the PR_FEEDBACK intake head; every Stage A / verification / gate receipt is invalidated — re-run the full mechanical ladder on the new ancestry."})}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:String(error93)})}}var rebind_pr_feedback_head=createSwarmTool({description:"Rebind a PR_FEEDBACK workflow to a new verified remote PR head after merge/rebase/conflict repair (base-sync). Use ONLY when the history genuinely changed to repair base drift or conflicts: it refuses a no-op rebind to the current intake head, refuses while publication is armed (to change approved content after arming use invalidate_pr_feedback_publication), and refuses while lanes are in flight. It invalidates every ancestry-bound receipt (Stage A, verification, ordered gates) so the full mechanical ladder re-runs on the new ancestry. Requires the full 40-char new PR head SHA; the current checkout must equal it.",args:{pr_head_sha:RebindPrFeedbackHeadArgsSchema.shape.pr_head_sha},execute:executeRebindPrFeedbackHead});init_zod();init_utils2();init_atomic_write();init_create_tool();var FreshnessValueSchema=exports_external.string().trim().min(1).max(500).regex(/^(synced|behind:[1-9][0-9]*|fetch-failed:\S+)$/,"must be 'synced', 'behind:<n>', or 'fetch-failed:<reason>' (reason contains no whitespace)"),RecordBranchFreshnessArgsSchema=exports_external.object({issueNumber:exports_external.number().int().min(1),freshness:FreshnessValueSchema,override:exports_external.string().trim().min(1).max(4000).optional()}).strict();async function executeRecordBranchFreshness(args2,directory,context={}){let parsed=RecordBranchFreshnessArgsSchema.safeParse(args2);if(!parsed.success)return JSON.stringify({success:!1,message:`Invalid branch-freshness receipt: ${parsed.error.issues.map((issue3)=>`${issue3.path.join(".")}: ${issue3.message}`).join("; ")}`});let data=parsed.data;if(data.freshness==="synced"&&data.override)return JSON.stringify({success:!1,message:"An override is only meaningful for a fetch-failed outcome; a synced base needs none."});let receipt={issueNumber:data.issueNumber,freshness:data.freshness,timestamp:new Date().toISOString()};if(data.override)receipt.override=data.override;if(context.sessionID?.trim())receipt.sessionId=context.sessionID.trim();let validatedPath;try{validatedPath=validateSwarmPath(directory,"branch-freshness.json")}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:"Failed to validate path"})}try{await atomicWriteSwarmFile(validatedPath,JSON.stringify(receipt,null,2));let permits=await branchFreshnessReceiptExists(directory,data.issueNumber);return JSON.stringify({success:!0,issueNumber:data.issueNumber,path:".swarm/branch-freshness.json",permits,message:permits?`Branch-freshness receipt recorded for issue #${data.issueNumber}; the trace's freshness gate is satisfied.`:`Branch-freshness receipt recorded for issue #${data.issueNumber}, but the outcome (${data.freshness}) does NOT permit the trace — ${data.freshness.startsWith("behind:")?"re-sync with the default branch and re-record as synced.":"a fetch-failed outcome without a recorded user override fails closed."}`})}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:String(error93)})}}var record_branch_freshness=createSwarmTool({description:`Record the Phase 0 branch-freshness outcome for the current traced issue (issue #2564): freshness is "synced", "behind:<n>", or "fetch-failed:<reason>" exactly as the fetch recorded it, plus an optional verbatim user override for a failed fetch. The /swarm issue --trace workflow will not transition to PLAN until the recorded outcome permits (synced, or fetch-failed with an override). The response's permits field mirrors the gate reader's verdict on the persisted receipt (advisory for the calling agent — the reducer always recomputes it independently).`,args:{issueNumber:RecordBranchFreshnessArgsSchema.shape.issueNumber,freshness:RecordBranchFreshnessArgsSchema.shape.freshness,override:RecordBranchFreshnessArgsSchema.shape.override},execute:executeRecordBranchFreshness});init_zod();init_plan_schema();init_schema();init_extractors();init_manager();init_create_tool();var recordDirectiveOverrideInternals={loadPlan,recordDirectiveOverrides};async function executeRecordDirectiveOverride(args2,directory,ctx){if(!ctx?.sessionID?.trim())return{success:!1,code:"DIRECTIVE_OVERRIDE_SESSION_REQUIRED",message:"An exact session identity is required to record an override."};if(stripKnownSwarmPrefix(ctx.agent??"").toLowerCase()!=="architect")return{success:!1,code:"DIRECTIVE_OVERRIDE_ARCHITECT_ONLY",message:"Only the architect may record a critical-directive override."};let plan=await recordDirectiveOverrideInternals.loadPlan(directory),requestedPhase=plan?.phases.find((candidate2)=>candidate2.id===args2.phase);if(!plan||!requestedPhase||getCurrentPhase(plan)!==args2.phase&&!isPhaseInWrapWindow(plan,args2.phase))return{success:!1,code:"DIRECTIVE_OVERRIDE_PHASE_MISMATCH",message:`Phase ${args2.phase} is neither the current plan phase nor the phase being wrapped.`};let phaseLabel=extractPhaseLabelFromPlan(plan,args2.phase)??`Phase ${args2.phase}`;return await recordDirectiveOverrideInternals.recordDirectiveOverrides(directory,[...new Set(args2.directive_ids)],args2.justification,ctx.sessionID,phaseLabel,args2.phase),{success:!0,code:"DIRECTIVE_OVERRIDE_RECORDED",phase:args2.phase,directive_ids:[...new Set(args2.directive_ids)],message:"Recorded the audited override. Retry phase_complete so every gate is re-evaluated from a fresh snapshot."}}var record_directive_override=createSwarmTool({description:"Architect-only audited override for identified critical-directive violations. Requires the current phase (or the phase being wrapped, whose last task already advanced the cursor), the session identity and substantive justification; it cannot repair or bypass unreadable authority.",args:{directive_ids:exports_external.array(exports_external.string().min(1).max(256)).min(1).max(64),justification:exports_external.string().trim().min(10).max(2000),phase:exports_external.number().int().min(1).max(9999)},execute:async(args2,directory,ctx)=>JSON.stringify(await executeRecordDirectiveOverride(args2,directory,ctx),null,2)});init_zod();init_utils2();init_atomic_write();init_create_tool();var RecordImplementationReviewArgsSchema=exports_external.object({issueNumber:exports_external.number().int().min(1),reviewerVerdict:exports_external.enum(["APPROVE","NEEDS_REVISION","BLOCKED"]),criticVerdict:exports_external.enum(["APPROVE","NEEDS_REVISION","BLOCKED"]),diffBase:exports_external.string().trim().regex(/^[0-9a-f]{7,40}$/i),diffHead:exports_external.string().trim().regex(/^[0-9a-f]{7,40}$/i),notes:exports_external.string().trim().min(8).max(4000)}).strict();async function executeRecordImplementationReview(args2,directory,context={}){let parsed=RecordImplementationReviewArgsSchema.safeParse(args2);if(!parsed.success)return JSON.stringify({success:!1,message:`Invalid implementation review receipt: ${parsed.error.issues.map((issue3)=>`${issue3.path.join(".")}: ${issue3.message}`).join("; ")}`});let data=parsed.data;if(data.reviewerVerdict!=="APPROVE"||data.criticVerdict!=="APPROVE")return JSON.stringify({success:!1,message:"A satisfying implementation-review receipt requires BOTH the reviewer and the critic to have delivered APPROVE; record non-approving verdicts in the working notes and fix the findings instead."});let receipt={issueNumber:data.issueNumber,reviewerVerdict:data.reviewerVerdict,criticVerdict:data.criticVerdict,diffBase:data.diffBase,diffHead:data.diffHead,notes:data.notes,timestamp:new Date().toISOString()};if(context.sessionID?.trim())receipt.sessionId=context.sessionID.trim();let validatedPath;try{validatedPath=validateSwarmPath(directory,"implementation-review.json")}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:"Failed to validate path"})}try{return await atomicWriteSwarmFile(validatedPath,JSON.stringify(receipt,null,2)),JSON.stringify({success:!0,issueNumber:data.issueNumber,path:".swarm/implementation-review.json",message:`Implementation review recorded for issue #${data.issueNumber} (reviewer APPROVE + critic APPROVE); the trace may now satisfy its review gate.`})}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:String(error93)})}}var record_implementation_review=createSwarmTool({description:"Record the independent implementation review for the current traced issue (issue #2131 residual B): dispatch FRESH-context reviewer and critic passes over the implementation diff (separate contexts from the implementer), and once BOTH approve call this with the issue number, both APPROVE verdicts, the reviewed diff base/head SHAs, and notes. The /swarm issue --trace workflow will not hand off to commit-pr until this receipt exists. Non-approving verdicts cannot be recorded here — fix the findings and re-review.",args:{issueNumber:RecordImplementationReviewArgsSchema.shape.issueNumber,reviewerVerdict:RecordImplementationReviewArgsSchema.shape.reviewerVerdict,criticVerdict:RecordImplementationReviewArgsSchema.shape.criticVerdict,diffBase:RecordImplementationReviewArgsSchema.shape.diffBase,diffHead:RecordImplementationReviewArgsSchema.shape.diffHead,notes:RecordImplementationReviewArgsSchema.shape.notes},execute:executeRecordImplementationReview});init_zod();init_url_security();init_loader();init_utils2();init_forge_provider();init_atomic_write();init_create_tool();function loadConfiguredForgeContext4(directory){try{let config3=loadPluginConfig(directory),remote=detectGitRemote(directory,void 0);return resolveForgeContextFromPluginConfig(config3,remote?[remote]:[])??void 0}catch{return}}var RecordIssuePublicationArgsSchema=exports_external.object({issueNumber:exports_external.number().int().min(1),prNumber:exports_external.number().int().min(1),prUrl:exports_external.string().url(),headSha:exports_external.string().min(1).optional()}).strict();async function executeRecordIssuePublication(args2,directory){let parsed=RecordIssuePublicationArgsSchema.safeParse(args2);if(!parsed.success)return JSON.stringify({success:!1,message:`Invalid publication receipt: ${parsed.error.issues.map((issue3)=>`${issue3.path.join(".")}: ${issue3.message}`).join("; ")}`});let{issueNumber,prNumber,prUrl,headSha}=parsed.data,sanitizedPrUrl=sanitizeUrl(prUrl);if(!isForgePrUrl(prUrl)){let configured=loadConfiguredForgeContext4(directory);if(!(configured&&isForgePrUrl(prUrl,configured)))return JSON.stringify({success:!1,message:"Invalid publication receipt: prUrl must be a canonical PR URL (GitHub https://github.com/<owner>/<repo>/pull/<number> or GitLab https://<gitlab-host>/<owner>/<repo>/-/merge_requests/<number>)"})}let receipt={published:!0,issueNumber,prNumber,prUrl:sanitizedPrUrl,publishedAt:new Date().toISOString()};if(headSha)receipt.headSha=headSha;let validatedPath;try{validatedPath=validateSwarmPath(directory,"issue-publication.json")}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:"Failed to validate path"})}try{return await atomicWriteSwarmFile(validatedPath,JSON.stringify(receipt,null,2)),JSON.stringify({success:!0,issueNumber,prNumber,prUrl,path:".swarm/issue-publication.json",message:`Publication receipt recorded for issue #${issueNumber} (PR #${prNumber}); the issue-trace workflow will transition to its terminal published state.`})}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:String(error93)})}}var record_issue_publication=createSwarmTool({description:'Record that the traced issue has been published (PR created/updated) so the /swarm issue --trace workflow can reach its terminal published state. The trace stops at publication_handoff (the commit-pr directive) until this receipt is observed — publication_handoff is NOT "issue resolved". commit-pr calls this after the PR is created/updated. Supply the traced issue number, the exact PR number, the canonical PR URL (GitHub or GitLab), and (optionally) the published HEAD sha. The receipt is issue-bound.',args:{issueNumber:RecordIssuePublicationArgsSchema.shape.issueNumber,prNumber:RecordIssuePublicationArgsSchema.shape.prNumber,prUrl:RecordIssuePublicationArgsSchema.shape.prUrl,headSha:RecordIssuePublicationArgsSchema.shape.headSha},execute:executeRecordIssuePublication});init_zod();init_utils2();init_atomic_write();init_create_tool();var RecordIssueReproductionArgsSchema=exports_external.object({issueNumber:exports_external.number().int().min(1),performed:exports_external.boolean(),commands:exports_external.array(exports_external.string().min(1)).min(1).optional(),output_summary:exports_external.string().min(1).optional()}).strict();async function executeRecordIssueReproduction(args2,directory,context={}){let parsed=RecordIssueReproductionArgsSchema.safeParse(args2);if(!parsed.success)return JSON.stringify({success:!1,message:`Invalid reproduction receipt: ${parsed.error.issues.map((issue3)=>`${issue3.path.join(".")}: ${issue3.message}`).join("; ")}`});let{issueNumber,performed,commands,output_summary}=parsed.data;if(performed&&(!commands||commands.length===0||!output_summary))return JSON.stringify({success:!1,message:"A performed=true reproduction receipt requires non-empty commands and output_summary."});let receipt={performed,issueNumber,timestamp:new Date().toISOString()};if(commands)receipt.commands=commands;if(output_summary)receipt.output_summary=output_summary;if(context.sessionID?.trim())receipt.sessionId=context.sessionID.trim();let validatedPath;try{validatedPath=validateSwarmPath(directory,"reproduction.json")}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:"Failed to validate path"})}try{return await atomicWriteSwarmFile(validatedPath,JSON.stringify(receipt,null,2)),JSON.stringify({success:!0,issueNumber,performed,path:".swarm/reproduction.json",message:performed?`Reproduction receipt recorded for issue #${issueNumber}; the trace may now transition to PLAN.`:`Reproduction receipt recorded (performed=false) for issue #${issueNumber}; it does NOT satisfy the reproduction gate.`})}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:String(error93)})}}var record_issue_reproduction=createSwarmTool({description:"Record the reproduction outcome for the current traced issue. The /swarm issue --trace workflow requires reproduction evidence (or a typed --no-repro waiver) before it can leave localization and transition to PLAN. Call this with performed=true, the exact commands run, and a concrete output_summary after attempting a minimal reproduction; the receipt binds to issueNumber (and records the calling session) and is read by the issue-trace engine. A performed=true receipt MUST include commands and output_summary. A performed=false receipt is recorded but does NOT satisfy the gate.",args:{issueNumber:RecordIssueReproductionArgsSchema.shape.issueNumber,performed:RecordIssueReproductionArgsSchema.shape.performed,commands:RecordIssueReproductionArgsSchema.shape.commands,output_summary:RecordIssueReproductionArgsSchema.shape.output_summary},execute:executeRecordIssueReproduction});init_zod();init_utils2();init_atomic_write();init_create_tool();var HEX40=/^[0-9a-f]{40}$/,RecordMergeApprovalArgsSchema=exports_external.object({issueNumber:exports_external.number().int().min(1),prHeadSha:exports_external.string().regex(HEX40,"must be a 40-hex commit SHA"),finalCriticReviewedCommit:exports_external.string().regex(HEX40,"must be a 40-hex commit SHA"),userApprovalVerbatim:exports_external.string().trim().min(1).max(8000)}).strict();async function executeRecordMergeApproval(args2,directory,context={}){let parsed=RecordMergeApprovalArgsSchema.safeParse(args2);if(!parsed.success)return JSON.stringify({success:!1,message:`Invalid merge-approval receipt: ${parsed.error.issues.map((issue3)=>`${issue3.path.join(".")}: ${issue3.message}`).join("; ")}`});let data=parsed.data;if(data.prHeadSha!==data.finalCriticReviewedCommit)return JSON.stringify({success:!1,message:"Merge-approval binding failed: prHeadSha must equal finalCriticReviewedCommit (the final critic approval must be bound to the exact PR head)."});let receipt={issueNumber:data.issueNumber,prHeadSha:data.prHeadSha,finalCriticReviewedCommit:data.finalCriticReviewedCommit,userApprovalVerbatim:data.userApprovalVerbatim,timestamp:new Date().toISOString()};if(context.sessionID?.trim())receipt.sessionId=context.sessionID.trim();let validatedPath;try{validatedPath=validateSwarmPath(directory,"merge-approval.json")}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:"Failed to validate path"})}try{return await atomicWriteSwarmFile(validatedPath,JSON.stringify(receipt,null,2)),JSON.stringify({success:!0,issueNumber:data.issueNumber,path:".swarm/merge-approval.json",message:`Merge approval recorded for issue #${data.issueNumber}, bound to PR head ${data.prHeadSha}. The approval is captured verbatim for audit; the merge itself is human-enforced and this plugin neither drives nor certifies it.`})}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:String(error93)})}}var record_merge_approval=createSwarmTool({description:"Record the human merge approval for the current traced issue (issue #2564): prHeadSha and finalCriticReviewedCommit must be the same 40-hex SHA (the final critic approval bound to the exact PR head), and userApprovalVerbatim is the user approval quoted verbatim. The receipt is recorded for audit only — the merge stays human-enforced and the plugin never certifies or drives it.",args:{issueNumber:RecordMergeApprovalArgsSchema.shape.issueNumber,prHeadSha:RecordMergeApprovalArgsSchema.shape.prHeadSha,finalCriticReviewedCommit:RecordMergeApprovalArgsSchema.shape.finalCriticReviewedCommit,userApprovalVerbatim:RecordMergeApprovalArgsSchema.shape.userApprovalVerbatim},execute:executeRecordMergeApproval});init_zod();init_utils2();init_atomic_write();init_create_tool();var DispositionSchema=exports_external.object({ref:exports_external.string().trim().min(1).max(500),disposition:exports_external.enum(["FIX","FALSE_POSITIVE","OUT_OF_CLASS","DEFERRED_WITH_USER_APPROVAL"]),note:exports_external.string().trim().max(1000).optional()}).strict(),GuardrailSchema=exports_external.object({kind:exports_external.enum(["lint-static-analysis","type-level","runtime-assertion","ci-check","documented-invariant-plus-regression-test"]),description:exports_external.string().trim().min(8).max(2000),proof:exports_external.string().trim().min(8).max(4000)}).strict(),RelatedProblemSchema=exports_external.object({ref:exports_external.string().trim().min(1).max(500),note:exports_external.string().trim().max(1000).optional()}).strict(),RecordRecurrenceSweepArgsSchema=exports_external.object({issueNumber:exports_external.number().int().min(1),defectClass:exports_external.string().trim().min(1).max(1000),justification:exports_external.string().trim().min(1).max(1000).optional(),predicates:exports_external.array(exports_external.string().trim().min(1).max(500)).min(1).max(32).optional(),dispositions:exports_external.array(DispositionSchema).min(1).max(200).optional(),guardrail:GuardrailSchema.optional(),relatedProblems:exports_external.array(RelatedProblemSchema).min(1).max(200)}).strict();async function executeRecordRecurrenceSweep(args2,directory,context={}){let parsed=RecordRecurrenceSweepArgsSchema.safeParse(args2);if(!parsed.success)return JSON.stringify({success:!1,message:`Invalid recurrence sweep receipt: ${parsed.error.issues.map((issue3)=>`${issue3.path.join(".")}: ${issue3.message}`).join("; ")}`});let data=parsed.data,noDefectClass=data.defectClass==="no defect class";if(noDefectClass){if(!data.justification)return JSON.stringify({success:!1,message:'The "no defect class" fast path requires a one-line justification.'})}else if(!data.predicates||data.predicates.length===0||!data.dispositions||data.dispositions.length===0||!data.guardrail)return JSON.stringify({success:!1,message:"A defect-class sweep requires search predicates, a non-empty disposition for every hit (at least one — the original defect site itself, dispositioned FIX), and a guardrail with proof it catches the original defect. An empty dispositions array is indistinguishable from a sweep that never ran."});let receipt={issueNumber:data.issueNumber,defectClass:data.defectClass,timestamp:new Date().toISOString()};if(data.justification)receipt.justification=data.justification;if(data.predicates)receipt.predicates=data.predicates;if(data.dispositions)receipt.dispositions=data.dispositions;if(data.guardrail)receipt.guardrail=data.guardrail;if(receipt.relatedProblems=data.relatedProblems,context.sessionID?.trim())receipt.sessionId=context.sessionID.trim();let validatedPath;try{validatedPath=validateSwarmPath(directory,"recurrence-sweep.json")}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:"Failed to validate path"})}try{return await atomicWriteSwarmFile(validatedPath,JSON.stringify(receipt,null,2)),JSON.stringify({success:!0,issueNumber:data.issueNumber,path:".swarm/recurrence-sweep.json",message:noDefectClass?`Recurrence sweep recorded for issue #${data.issueNumber} (no defect class fast path).`:`Recurrence sweep recorded for issue #${data.issueNumber}; the trace may now satisfy its recurrence gate.`})}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:String(error93)})}}var record_recurrence_sweep=createSwarmTool({description:'Record the recurrence sweep for the current traced issue (issue #2131 residual B; widened in #2564 and #2600). The /swarm issue --trace workflow will not hand off to commit-pr until this receipt exists. Supply relatedProblems (the Phase 1 related-problems sweep results — at least one {ref, note?} entry) plus, for a real defect class: defectClass (one-sentence characterization), predicates (the exact search predicates), dispositions (non-empty — every hit as FIX / FALSE_POSITIVE / OUT_OF_CLASS / DEFERRED_WITH_USER_APPROVAL, including the original defect site), and a guardrail (kind + description + proof it catches the original defect). If the change corrects no incorrect behavior, use the literal defectClass "no defect class" with a one-line justification (relatedProblems still required).',args:{issueNumber:RecordRecurrenceSweepArgsSchema.shape.issueNumber,defectClass:RecordRecurrenceSweepArgsSchema.shape.defectClass,justification:RecordRecurrenceSweepArgsSchema.shape.justification,predicates:RecordRecurrenceSweepArgsSchema.shape.predicates,dispositions:RecordRecurrenceSweepArgsSchema.shape.dispositions,guardrail:RecordRecurrenceSweepArgsSchema.shape.guardrail,relatedProblems:RecordRecurrenceSweepArgsSchema.shape.relatedProblems},execute:executeRecordRecurrenceSweep});init_zod();import*as fs227 from"node:fs";init_utils2();init_file_locks();init_atomic_write();init_create_tool();var HEX402=/^[0-9a-f]{40}$/,TRACE_VALIDATION_PHASES2=["0","1","2","2.5","3","4","4.2","4.5","4.6","5"],ValidationEntrySchema=exports_external.object({phase:exports_external.enum(TRACE_VALIDATION_PHASES2),outcome:exports_external.enum(["pass","fail"]),reviewedCommit:exports_external.string().regex(HEX402,"must be a 40-hex commit SHA"),treeId:exports_external.string().regex(HEX402,"must be a 40-hex tree id")}).strict(),RecordTraceValidationArgsSchema=ValidationEntrySchema.extend({issueNumber:exports_external.number().int().min(1)}).strict();async function executeRecordTraceValidation(args2,directory,context={}){let parsed=RecordTraceValidationArgsSchema.safeParse(args2);if(!parsed.success)return JSON.stringify({success:!1,message:`Invalid trace-validation receipt: ${parsed.error.issues.map((issue3)=>`${issue3.path.join(".")}: ${issue3.message}`).join("; ")}`});let data=parsed.data,validatedPath;try{validatedPath=validateSwarmPath(directory,"trace-validation.json")}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:"Failed to validate path"})}try{let lockResult=await tryAcquireLock(directory,"trace-validation.json","trace-validation","trace-validation");if(!lockResult.acquired)return JSON.stringify({success:!1,message:"The trace-validation receipt is locked by another concurrent writer; no write was attempted. Re-run record_trace_validation for this phase once the other writer finishes."});try{let validations=[];try{let raw=await fs227.promises.readFile(validatedPath,"utf-8"),existing=JSON.parse(raw);if(typeof existing==="object"&&existing!==null&&Array.isArray(existing.validations))validations=existing.validations.filter((v)=>typeof v==="object"&&v!==null&&typeof v.phase==="string")}catch{}let entry={phase:data.phase,outcome:data.outcome,reviewedCommit:data.reviewedCommit,treeId:data.treeId,timestamp:new Date().toISOString()},idx=validations.findIndex((v)=>v.phase===data.phase);if(idx===-1)validations.push(entry);else validations[idx]=entry;let receipt={issueNumber:data.issueNumber,timestamp:new Date().toISOString(),validations};if(context.sessionID?.trim())receipt.sessionId=context.sessionID.trim();await atomicWriteSwarmFile(validatedPath,JSON.stringify(receipt,null,2));let allGreen=await traceValidationReceiptExists(directory,data.issueNumber);return JSON.stringify({success:!0,issueNumber:data.issueNumber,path:".swarm/trace-validation.json",allGreen,message:allGreen?`Validator receipt recorded for issue #${data.issueNumber} phase ${data.phase} (${data.outcome}); every recorded phase is green.`:`Validator receipt recorded for issue #${data.issueNumber} phase ${data.phase} (${data.outcome}), but at least one recorded phase is failing — fix and re-record that phase as a pass before handoff.`})}finally{try{await lockResult.lock._release?.()}catch{}}}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:String(error93)})}}var record_trace_validation=createSwarmTool({description:"Record one per-phase trace-check.sh validator outcome for the current traced issue (issue #2564): the phase (v3 enum 0..5 incl. 2.5/4.2/4.5/4.6), the outcome (pass or fail), and the exact reviewedCommit and treeId the validator reported. Re-running a phase replaces its entry. The /swarm issue --trace workflow will not hand off to commit-pr while any recorded phase is failing or none is recorded. The receipt write is serialized by a per-file receipt lock, and the response's allGreen field mirrors the gate reader's verdict on the persisted receipt (advisory for the calling agent — the reducer always recomputes it independently).",args:{issueNumber:RecordTraceValidationArgsSchema.shape.issueNumber,phase:RecordTraceValidationArgsSchema.shape.phase,outcome:RecordTraceValidationArgsSchema.shape.outcome,reviewedCommit:RecordTraceValidationArgsSchema.shape.reviewedCommit,treeId:RecordTraceValidationArgsSchema.shape.treeId},execute:executeRecordTraceValidation});init_zod();init_schema();init_gate_evidence();init_manager();init_path_identity();init_state();init_stage_a_repair();import*as fs228 from"node:fs";import*as path370 from"node:path";async function forceRecoverReworkTask(directory,sessionID,options){let session=ensureAgentSession(sessionID,void 0,directory);if(!session||!session.agentName||stripKnownSwarmPrefix(session.agentName)!=="architect")throw Error("RECOVER_REWORK_ARCHITECT_REQUIRED: recover_rework_task requires an active architect session. The rework escape hatch is architect-only; a coder/reviewer/test_engineer cannot self-unblock a task.");let taskId=typeof options.taskId==="string"?options.taskId.trim():"";if(!taskId)throw Error('RECOVER_REWORK_UNKNOWN_TASK: recover_rework_task requires the exact plan task id (e.g. "1.1").');let plan=await loadPlanJsonOnly(directory);if(!plan){let planPath=path370.join(directory,".swarm","plan.json");if(fs228.existsSync(planPath))throw Error("PLAN_CORRUPT: .swarm/plan.json exists but could not be parsed (corrupt or schema-invalid). Repair or re-save the plan before recovering a rework_required task.");throw Error("PLAN_NOT_FOUND: no .swarm/plan.json — cannot recover a rework_required "+"task without a plan. Save a plan first.")}if(!new Set(plan.phases.flatMap((phase)=>phase.tasks.map((task2)=>task2.id))).has(taskId))throw Error(`RECOVER_REWORK_UNKNOWN_TASK: task ${taskId} is not in the current plan. Refusing to recover a foreign task id.`);let evidenceRead=await readTaskEvidenceState(directory,taskId);if(evidenceRead.kind==="unparseable")throw Error(`RECOVER_REWORK_EVIDENCE_CORRUPT: the workflow evidence file for task ${taskId} exists but could not be parsed (${evidenceRead.evidencePath}). Repair the evidence first (repair_gate_evidence or /swarm doctor); recovery cannot classify a corrupt evidence state.`);let evidence2=evidenceRead.kind==="ok"?evidenceRead.evidence:null,workflow=getTaskWorkflowSnapshot(evidence2);if(!evidence2||!workflow.authoritative)throw Error(`RECOVER_REWORK_NO_WORKFLOW: no durable task workflow evidence exists for task ${taskId} — there is no rework state to recover.`);if(workflow.state!=="rework_required")throw Error(`RECOVER_REWORK_STATE_REQUIRED: task ${taskId} is at ${workflow.state}, not rework_required. This recovery applies only to a task whose Stage B verdict moved it to rework_required without a code change. From coder_delegated, run pre_check_batch; for a genuine code defect, delegate the coder to repair it first.`);let wedgeMs=Date.parse(workflow.updatedAt);if(!Number.isFinite(wedgeMs))throw Error(`RECOVER_REWORK_GREEN_PRECHECK_REQUIRED: cannot prove pre-check recency (workflow updatedAt "${workflow.updatedAt}" is not a parseable timestamp — the evidence file for task ${taskId} is likely corrupt). Repair the evidence (repair_gate_evidence or /swarm doctor); re-running pre_check_batch cannot fix an unparseable timestamp.`);let greenness=await hasGreenPostSettlementPreCheck(directory,wedgeMs);if(!greenness.green){let sastHint=greenness.reason==="no_pre_check_bundles"?" Note: if gates.sast_scan.enabled is false, no sast_scan bundle is ever persisted and this recovery is unavailable by design — enable gates.sast_scan.enabled and run sast_scan, or use the coder repair loop.":"";throw Error(`RECOVER_REWORK_GREEN_PRECHECK_REQUIRED: refusing to mark Stage A passed without proof (${greenness.reason}). `+"The bar is a green secretscan AND sast_scan evidence pair newer than the failing verdict — normally provided by a fresh pre_check_batch run (bundle proof is global, not correlated to the task's changed files)."+sastHint)}let sanitizedReason=typeof options.reason==="string"&&options.reason.trim().length>0?sanitizeDiagnosticText(options.reason.trim(),500):void 0,recordedAt=new Date().toISOString(),transitionId=`rework-recovery:${taskId}:gen${workflow.generation}`,updated=await transitionTaskWorkflowEvidence(directory,taskId,{type:"stage_a_passed",supervisedRecovery:!0,expectedGeneration:workflow.generation,transitionId}),updatedWorkflow=getTaskWorkflowSnapshot(updated),auditEventRecorded=await appendStageARepairEvent(directory,{action:"rework_recovered",taskId,transitionId,generation:workflow.generation,sessionId:sessionID,...sanitizedReason?{reason:sanitizedReason}:{}});return{taskId,generation:updatedWorkflow.generation,state:updatedWorkflow.state,transitionId,recordedAt,auditEventRecorded}}init_create_tool();var RecoverReworkTaskArgsSchema=exports_external.object({task_id:exports_external.string().trim().min(1).max(64).describe('Exact plan task id of the rework_required task (e.g. "1.1"). Must exist in the current plan and have durable workflow evidence at state rework_required.'),reason:exports_external.string().trim().min(1).max(500).describe('Why the Stage B verdict did not require a code change (e.g. "test_engineer returned SKIPPED for a tool-argument error while pytest passes"). Audited to .swarm/events.jsonl.')}).strict();async function executeRecoverReworkTask(args2,directory,context={}){let parsed=RecoverReworkTaskArgsSchema.safeParse(args2);if(!parsed.success)return JSON.stringify({success:!1,message:`Invalid recover_rework_task call: ${parsed.error.issues.map((issue3)=>`${issue3.path.join(".")}: ${issue3.message}`).join("; ")}`});if(!context.sessionID?.trim())return JSON.stringify({success:!1,message:"recover_rework_task requires an active sessionID"});try{let summary=await forceRecoverReworkTask(directory,context.sessionID,{taskId:parsed.data.task_id,reason:parsed.data.reason}),auditNote=summary.auditEventRecorded?"The recovery is audited to .swarm/events.jsonl (stage_a_repair action rework_recovered).":"WARNING: the audit event could NOT be appended to .swarm/events.jsonl (see the plugin log); the durable workflow evidence still records the supervised recovery via the rework-recovery: transition id.";return JSON.stringify({success:!0,task_id:summary.taskId,generation:summary.generation,state:summary.state,transition_id:summary.transitionId,recorded_at:summary.recordedAt,audit_event_recorded:summary.auditEventRecorded,method:"supervised_recovery",message:`Task ${summary.taskId} recovered from rework_required: a supervised stage_a_passed was written at generation ${summary.generation} (transition id `+summary.transitionId+"). Reviewer/test_engineer dispatch is permitted again — re-run the Stage B gates that the failed verdict cleared. "+auditNote+" Use it ONLY when the Stage B verdict did not require a code change; a genuine defect still needs the coder repair loop."})}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:String(error93)})}}var recover_rework_task=createSwarmTool({description:"Recover a task wedged at rework_required when the Stage B verdict did NOT require a code change (issue #2755): writes a supervised stage_a_passed for the current generation so reviewer/test_engineer can be re-dispatched, without re-running the coder. Requires the exact plan task id, an active architect session, durable workflow state exactly rework_required, and green pre-check proof: green secretscan AND sast_scan evidence bundles newer than the failing verdict (normally from a fresh pre_check_batch run; bundle recency is global, not file-correlated; projects with SAST disabled cannot use this path). Fail-closed otherwise; the mechanical stage_a_passed path still requires an accepted coder mutation. A reason is required and audited to .swarm/events.jsonl (stage_a_repair action rework_recovered). Prefer the coder repair loop when the code actually has a defect.",args:{task_id:RecoverReworkTaskArgsSchema.shape.task_id,reason:RecoverReworkTaskArgsSchema.shape.reason},execute:executeRecoverReworkTask});init_zod();init_schema();init_gate_evidence();init_path_identity();init_state();init_coder_settlement();init_session_view();init_stage_a_repair();async function recoverStageATaskSupervised(directory,sessionID,options){let session=ensureAgentSession(sessionID,void 0,directory);if(!session||!session.agentName||stripKnownSwarmPrefix(session.agentName)!=="architect")throw Error("RECOVER_STAGE_A_ARCHITECT_REQUIRED: recover_stage_a_task requires an active architect session. The settlement-backed Stage A escape hatch is architect-only; a coder/reviewer/test_engineer cannot self-unblock a task.");let taskId=typeof options.taskId==="string"?options.taskId.trim():"";if(!taskId)throw Error('RECOVER_STAGE_A_UNKNOWN_TASK: recover_stage_a_task requires the exact task id of the settlement-wedged task (e.g. "1.1").');let sanitizedReason=typeof options.reason==="string"&&options.reason.trim().length>0?sanitizeDiagnosticText(options.reason.trim(),500):void 0;if(!sanitizedReason)throw Error("RECOVER_STAGE_A_REASON_REQUIRED: recover_stage_a_task requires a reason describing why the settlement-backed recovery is justified; it is audited to .swarm/events.jsonl.");let evidenceRead=await readTaskEvidenceState(directory,taskId);if(evidenceRead.kind==="unparseable")throw Error(`RECOVER_STAGE_A_EVIDENCE_CORRUPT: the workflow evidence file for task ${taskId} exists but could not be parsed (${evidenceRead.evidencePath}). Repair the evidence first (repair_gate_evidence or /swarm doctor); recovery cannot classify a corrupt evidence state.`);let evidence2=evidenceRead.kind==="ok"?evidenceRead.evidence:null,workflow=getTaskWorkflowSnapshot(evidence2);if(!evidence2||!workflow.authoritative)throw Error(`RECOVER_STAGE_A_NO_WORKFLOW: no durable task workflow evidence exists for task ${taskId} — there is no settlement wedge to recover.`);if(workflow.state==="pre_check_passed"||workflow.state==="reviewer_run"||workflow.state==="tests_run"){if(isStageARecoveredState(workflow.state)&&shouldRefreshStageARecoveryView(session.taskWorkflowStates.get(taskId),workflow.state))applySessionWorkflowView(session,taskId,workflow);return{taskId,generation:workflow.generation,state:workflow.state,transitionId:`stage-a-supervised:${taskId}:noop`,recordedAt:new Date().toISOString(),alreadyRecovered:!0,auditEventRecorded:!1}}if(workflow.state!=="idle"&&workflow.state!=="blocked")throw Error(`RECOVER_STAGE_A_STATE_REQUIRED: task ${taskId} is at ${workflow.state}, not idle/blocked. This recovery applies only to the settlement-backed wedge (a COMMITTED accepted coder settlement while the workflow drifted to idle or blocked). From coder_delegated, run pre_check_batch or /swarm recover; from rework_required without a code change, use recover_rework_task.`);let{states:walStates}=await listCoderSettlementWalStates(directory),settledAfterMs=latestCommittedAcceptedSettlementMs(taskId,walStates);if(settledAfterMs===null)throw Error(`RECOVER_STAGE_A_SETTLEMENT_REQUIRED: refusing to recover task ${taskId} — no COMMITTED accepted coder settlement exists for it. `+"The settlement receipt is what distinguishes this wedge from a not-yet-started or deliberately stopped task; recovery without it would fabricate Stage A justification. Background-dispatched coder tasks never write a settlement WAL and cannot use this path.");let greenness=await hasGreenPostSettlementPreCheck(directory,settledAfterMs);if(!greenness.green){let sastHint=greenness.reason==="no_pre_check_bundles"?" Note: if gates.sast_scan.enabled is false, no sast_scan bundle is ever persisted and this recovery is unavailable by design — enable gates.sast_scan.enabled and run sast_scan, or use the coder repair loop.":"";throw Error(`RECOVER_STAGE_A_GREEN_PRECHECK_REQUIRED: refusing to mark Stage A passed without proof (${greenness.reason}). `+"The bar is a green secretscan AND sast_scan evidence pair newer than the settlement commit — normally provided by a fresh pre_check_batch run (bundle proof is global, not correlated to the task's changed files)."+sastHint)}let recordedAt=new Date().toISOString(),transitionId=`stage-a-supervised:${taskId}:${workflow.generation}`,updated=await transitionTaskWorkflowEvidence(directory,taskId,{type:"stage_a_passed",settlementRecovery:!0,expectedGeneration:workflow.generation,transitionId}),updatedWorkflow=getTaskWorkflowSnapshot(updated);if(isStageARecoveredState(updatedWorkflow.state)){if(shouldRefreshStageARecoveryView(session.taskWorkflowStates.get(taskId),updatedWorkflow.state))applySessionWorkflowView(session,taskId,updatedWorkflow)}let auditEventRecorded=await appendStageARepairEvent(directory,{action:"repaired",via:"recover_stage_a_task",taskId,transitionId,generation:workflow.generation,settlementRecovery:!0,predecessorTransitionId:workflow.lastTransitionId??null,sessionId:sessionID,reason:sanitizedReason});return{taskId,generation:updatedWorkflow.generation,state:updatedWorkflow.state,transitionId,recordedAt,alreadyRecovered:!1,auditEventRecorded}}init_create_tool();var RecoverStageATaskArgsSchema=exports_external.object({task_id:exports_external.string().trim().min(1).max(64).describe('Exact task id of the settlement-wedged task (e.g. "1.1"). Must have durable workflow evidence at state idle or blocked, a COMMITTED accepted coder settlement, and green post-settlement pre-check proof.'),reason:exports_external.string().trim().min(1).max(500).describe('Why the settlement-backed recovery is justified (e.g. "settlement COMMITTED and pre_check_batch green but stage_a_passed never fired; force-repair cleared the proofs"). Audited to .swarm/events.jsonl.')}).strict();async function executeRecoverStageATask(args2,directory,context={}){let parsed=RecoverStageATaskArgsSchema.safeParse(args2);if(!parsed.success)return JSON.stringify({success:!1,message:`Invalid recover_stage_a_task call: ${parsed.error.issues.map((issue3)=>`${issue3.path.join(".")}: ${issue3.message}`).join("; ")}`});if(!context.sessionID?.trim())return JSON.stringify({success:!1,message:"recover_stage_a_task requires an active sessionID"});try{let summary=await recoverStageATaskSupervised(directory,context.sessionID,{taskId:parsed.data.task_id,reason:parsed.data.reason});if(summary.alreadyRecovered)return JSON.stringify({success:!0,task_id:summary.taskId,generation:summary.generation,state:summary.state,already_recovered:!0,message:`Task ${summary.taskId} already has Stage A recorded (state ${summary.state}, generation ${summary.generation}) — nothing to recover.`});let auditNote=summary.auditEventRecorded?"The recovery is audited to .swarm/events.jsonl (stage_a_repair action repaired, via recover_stage_a_task).":"WARNING: the audit event could NOT be appended to .swarm/events.jsonl (see the plugin log); the durable workflow evidence still records the settlement-backed recovery via the stage-a-supervised: transition id and the settlementRecovery marker.";return JSON.stringify({success:!0,task_id:summary.taskId,generation:summary.generation,state:summary.state,transition_id:summary.transitionId,recorded_at:summary.recordedAt,audit_event_recorded:summary.auditEventRecorded,method:"settlement_recovery",message:`Task ${summary.taskId} recovered from the settlement wedge: a settlement-backed stage_a_passed was written at generation ${summary.generation} (transition id `+summary.transitionId+"). Reviewer/test_engineer dispatch is permitted again — run the Stage B gates the task still needs. "+auditNote+" Use it ONLY when a COMMITTED accepted settlement and green post-settlement pre-check proof already justify Stage A; it never re-runs the coder and never edits gate evidence."})}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:String(error93)})}}var recover_stage_a_task=createSwarmTool({description:"Recover a task wedged in the settlement-backed Stage A deadlock (issue #2828): workflow at idle or blocked while a COMMITTED accepted coder settlement and green post-settlement pre-check proof (green secretscan AND sast_scan evidence newer than the settlement commit) still justify Stage A — the shape where stage_a_passed never fired, a force-repair cleared the proofs, and every other recovery path refuses. Writes a settlement-backed stage_a_passed for the current generation so reviewer/test_engineer can be dispatched, without re-running the coder and without editing gate evidence. Requires the exact task id (bound by its durable workflow evidence and settlement WAL — deliberately no plan-membership precondition, mirroring the /swarm recover scan), an active architect session, a reason (audited), and durable workflow evidence at exactly idle/blocked. Fail-closed otherwise (RECOVER_STAGE_A_* errors); the mechanical stage_a_passed path still requires an accepted coder mutation or the #2665 live_wedge scan.",args:{task_id:RecoverStageATaskArgsSchema.shape.task_id,reason:RecoverStageATaskArgsSchema.shape.reason},execute:executeRecoverStageATask});init_zod();init_schema();init_gate_evidence();init_utils2();init_manager();init_utils3();init_state();init_project_boundary();init_swarm_artifact_cache();init_task_id();init_task_file();init_task_gate_requirements();init_gate_evidence();import{createHash as createHash120,randomUUID as randomUUID48}from"node:crypto";import*as fs229 from"node:fs";import*as path371 from"node:path";var TASK_GATE_EVIDENCE_QUARANTINE_DIR=path371.join("evidence","task-gate-quarantine"),MAX_TASK_GATE_EVIDENCE_BYTES=262144,MAX_TASK_GATE_EVIDENCE_QUARANTINE_FILES=32,MAX_TASK_GATE_EVIDENCE_QUARANTINE_BYTES=12582912,MAX_TASK_GATE_EVIDENCE_QUARANTINE_DIRECTORY_ENTRIES=128,MAX_TASK_GATE_EVIDENCE_QUARANTINE_RECORD_BYTES=786432,TASK_GATE_EVIDENCE_QUARANTINE_SCHEMA_VERSION=1,GENERIC_REPAIR_REASONS=new Set(["fix","repair","test","debug","unknown","n/a","na","none"]);function isQuarantinableTaskEvidenceRead(read){return read.status==="corrupt"||read.status==="valid"}function sha25614(bytes){return createHash120("sha256").update(bytes).digest("hex")}function normalizeRepairReason(reason){let normalized=reason.trim().replace(/\s+/g," ");if(normalized.length<12)throw Error("TASK_GATE_EVIDENCE_REASON_REQUIRED: repair_gate_evidence requires a substantive reason of at least 12 characters.");if(GENERIC_REPAIR_REASONS.has(normalized.toLowerCase()))throw Error("TASK_GATE_EVIDENCE_REASON_REQUIRED: repair_gate_evidence requires a substantive reason, not a placeholder.");return normalized}function canonicalizeRepairRoot(directory){let requestedRoot=path371.resolve(directory),requestedStat=fs229.lstatSync(requestedRoot);if(requestedStat.isSymbolicLink()||!requestedStat.isDirectory())throw Error("TASK_GATE_EVIDENCE_ROOT_UNSAFE: repair_gate_evidence requires a canonical project root directory, not a symlink, junction, reparse point, or non-directory path.");let canonicalRoot2=fs229.realpathSync(requestedRoot);return assertProjectRoot(canonicalRoot2),canonicalRoot2}function assertExistingRegularPath(root,relativePath2){let segments=relativePath2.replace(/\\/g,"/").split("/").filter(Boolean),cursor=root;for(let segment of segments){if(cursor=path371.join(cursor,segment),!fs229.existsSync(cursor))return;if(fs229.lstatSync(cursor).isSymbolicLink())throw Error(`TASK_GATE_EVIDENCE_PATH_UNSAFE: ${relativePath2} contains a symlink, junction, or reparse point.`)}}function taskEvidenceFilePath(directory,taskId){let relativePath2=taskEvidenceRelPath(taskId);return assertExistingRegularPath(directory,".swarm"),assertExistingRegularPath(directory,path371.join(".swarm","evidence")),assertExistingRegularPath(directory,path371.join(".swarm",relativePath2)),validateSwarmPath(directory,relativePath2)}function readTaskEvidenceForRepair(directory,taskId){let filePath=taskEvidenceFilePath(directory,taskId),pathStat;try{pathStat=fs229.lstatSync(filePath)}catch(error93){if(error93.code==="ENOENT")return{status:"missing"};return{status:"unreadable",filePath,bytes:Buffer.alloc(0),sha256:sha25614(""),error:error93}}if(pathStat.isSymbolicLink()||!pathStat.isFile())return{status:"unreadable",filePath,bytes:Buffer.alloc(0),sha256:sha25614(""),error:Error("TASK_GATE_EVIDENCE_UNREADABLE: evidence path is not a regular file")};if(pathStat.size>MAX_TASK_GATE_EVIDENCE_BYTES)return{status:"oversized",filePath,bytes:Buffer.alloc(0),sha256:sha25614(""),error:Error(`TASK_GATE_EVIDENCE_OVERSIZED: ${pathStat.size} bytes exceeds ${MAX_TASK_GATE_EVIDENCE_BYTES}`)};let descriptor=fs229.openSync(filePath,fs229.constants.O_RDONLY|(fs229.constants.O_NOFOLLOW??0));try{let openedStat=fs229.fstatSync(descriptor);if(!openedStat.isFile()||openedStat.dev!==pathStat.dev||openedStat.ino!==pathStat.ino)return{status:"unreadable",filePath,bytes:Buffer.alloc(0),sha256:sha25614(""),error:Error("TASK_GATE_EVIDENCE_UNREADABLE: evidence changed while being opened")};let bytes=fs229.readFileSync(descriptor);if(bytes.byteLength>MAX_TASK_GATE_EVIDENCE_BYTES)return{status:"oversized",filePath,bytes:Buffer.alloc(0),sha256:sha25614(""),error:Error(`TASK_GATE_EVIDENCE_OVERSIZED: ${bytes.byteLength} bytes exceeds ${MAX_TASK_GATE_EVIDENCE_BYTES}`)};let digest5=sha25614(bytes);try{let evidence2=parseTaskEvidence(bytes.toString("utf8"),taskId);return{status:"valid",filePath,bytes,sha256:digest5,evidence:evidence2,generation:evidence2.workflow?.generation}}catch(error93){return{status:"corrupt",filePath,bytes,sha256:digest5,error:error93}}}finally{try{fs229.closeSync(descriptor)}catch{}}}function taskGateEvidenceQuarantinePath(directory,taskId,digest5){return validateSwarmPath(directory,path371.join(TASK_GATE_EVIDENCE_QUARANTINE_DIR,`${taskId}.${digest5}.v${TASK_GATE_EVIDENCE_QUARANTINE_SCHEMA_VERSION}.json`))}function parseErrorMetadata(error93){if(!error93)return null;return{name:error93.name||"Error",message:error93.message||String(error93),code:typeof error93.code==="string"?error93.code:null}}function parseQuarantineRecord(raw){try{let parsed=JSON.parse(raw);if(parsed?.schemaVersion!==TASK_GATE_EVIDENCE_QUARANTINE_SCHEMA_VERSION||typeof parsed.taskId!=="string"||typeof parsed.recordedAt!=="string"||typeof parsed.reason!=="string"||typeof parsed.original?.path!=="string"||typeof parsed.original?.sha256!=="string"||typeof parsed.content?.bytes!=="string"||parsed.content?.encoding!=="base64")return null;return parsed}catch{return null}}function buildQuarantineRecord(taskId,read,reason,context,receiptGeneration){let agentName=context?.sessionID!=null?swarmState.activeAgent.get(context.sessionID)??swarmState.agentSessions.get(context.sessionID)?.agentName??null:null;return{schemaVersion:TASK_GATE_EVIDENCE_QUARANTINE_SCHEMA_VERSION,taskId,recordedAt:new Date().toISOString(),reason,caller:{sessionId:context?.sessionID?.trim()||null,messageId:context?.messageID?.trim()||null,agentName},original:{path:read.filePath,sha256:read.sha256,sizeBytes:read.bytes.byteLength,status:read.status,observedGeneration:read.generation??null,receiptGeneration,requirementsState:read.evidence?.requirements_state??null},parseError:parseErrorMetadata(read.error),content:{encoding:"base64",bytes:read.bytes.toString("base64")}}}async function quarantineTaskEvidenceBytes(directory,taskId,read,reason,context,receiptGeneration){let digest5=read.sha256,quarantineDir=validateSwarmPath(directory,TASK_GATE_EVIDENCE_QUARANTINE_DIR);await fs229.promises.mkdir(quarantineDir,{recursive:!0});let dirStat=await fs229.promises.lstat(quarantineDir);if(dirStat.isSymbolicLink()||!dirStat.isDirectory())throw Error("TASK_GATE_EVIDENCE_QUARANTINE_UNREADABLE: quarantine is not a regular directory");let target=taskGateEvidenceQuarantinePath(directory,taskId,digest5),record3=buildQuarantineRecord(taskId,read,reason,context,receiptGeneration),serialized3=JSON.stringify(record3,null,2),serializedBytes=Buffer.byteLength(serialized3,"utf8");if(serializedBytes>MAX_TASK_GATE_EVIDENCE_QUARANTINE_RECORD_BYTES)throw Error("TASK_GATE_EVIDENCE_QUARANTINE_FULL: quarantine payload exceeds the bounded record size limit");let reconcileExisting=async()=>{let existingStat;try{existingStat=await fs229.promises.lstat(target)}catch(error93){if(error93.code==="ENOENT")return!1;throw error93}if(existingStat.isSymbolicLink()||!existingStat.isFile())throw Error("TASK_GATE_EVIDENCE_QUARANTINE_MISMATCH: existing quarantine path is not a regular immutable record");let existingRaw=await fs229.promises.readFile(target,"utf8"),existingRecord=parseQuarantineRecord(existingRaw);if(existingRecord&&existingRecord.taskId===taskId&&existingRecord.original.path===read.filePath&&existingRecord.original.sha256===read.sha256&&existingRecord.content.bytes===read.bytes.toString("base64"))return!0;throw Error("TASK_GATE_EVIDENCE_QUARANTINE_MISMATCH: existing quarantine record does not match the repaired evidence source")};if(await reconcileExisting())return{digest:digest5,filePath:target};let count4=0,totalBytes=0,scanned=0,handle=await fs229.promises.opendir(quarantineDir,{bufferSize:16});try{for await(let entry of handle){if(scanned+=1,scanned>MAX_TASK_GATE_EVIDENCE_QUARANTINE_DIRECTORY_ENTRIES)throw Error("TASK_GATE_EVIDENCE_QUARANTINE_FULL: too many quarantine entries");if(!entry.isFile()||!/^[0-9.]+\.[a-f0-9]{64}\.v1\.json$/.test(entry.name))continue;count4+=1;let candidate2=path371.join(quarantineDir,entry.name),candidateStat=await fs229.promises.lstat(candidate2);if(candidateStat.isSymbolicLink()||!candidateStat.isFile())throw Error("TASK_GATE_EVIDENCE_QUARANTINE_UNREADABLE: invalid quarantine artifact");if(totalBytes+=candidateStat.size,count4>=MAX_TASK_GATE_EVIDENCE_QUARANTINE_FILES||totalBytes+serializedBytes>MAX_TASK_GATE_EVIDENCE_QUARANTINE_BYTES)throw Error("TASK_GATE_EVIDENCE_QUARANTINE_FULL: quarantine retention limit reached")}}finally{try{await handle.close()}catch{}}let tempPath=path371.join(quarantineDir,`.pending.${process.pid}.${randomUUID48()}.json`),fileHandle;try{fileHandle=await fs229.promises.open(tempPath,"wx"),await fileHandle.writeFile(serialized3,"utf8"),await fileHandle.sync(),await fileHandle.close(),fileHandle=void 0,invalidateCachedArtifact(tempPath),await fs229.promises.link(tempPath,target),invalidateCachedArtifact(target)}catch(error93){if(error93.code!=="EEXIST")throw error93;if(await reconcileExisting())return{digest:digest5,filePath:target};throw error93}finally{await fileHandle?.close().catch(()=>{return}),await fs229.promises.unlink(tempPath).catch(()=>{return})}return{digest:digest5,filePath:target}}function buildRepairTransitionId(taskId,source){return`repair_gate_evidence:${taskId}:${source.slice(0,32)}`}function withoutLegacyReconstructionGate(gates){return[...new Set(gates.filter((gate)=>gate!==TASK_GATE_REQUIREMENTS_RECONSTRUCTION_SENTINEL))].sort()}function hasLegacyReconstructionGate(gates){return gates.includes(TASK_GATE_REQUIREMENTS_RECONSTRUCTION_SENTINEL)}function buildKnownRepairedEvidence(taskId,receipt,generation,source){let requiredGates=withoutLegacyReconstructionGate(receipt.requiredGates);if(requiredGates.length!==receipt.requiredGates.length)throw Error("TASK_GATE_REQUIREMENTS_RECEIPT_TAINTED: legacy reconstruction markers cannot seed known requirements.");return{taskId,required_gates:requiredGates,gates:{},requirements_state:"known",test_engineer_exempt:receipt.testEngineerExempt??void 0,workflow:{schema:TASK_WORKFLOW_SCHEMA_MARKER,generation,state:"idle",retryCount:0,retryHistory:[],retryEpoch:0,lastOutcome:"repair_idle",lastTransitionId:buildRepairTransitionId(taskId,receipt.chainHash),updatedAt:new Date().toISOString()},repair_provenance:{source_sha256:source.sha256,source_generation:source.generation,requirements_receipt_hash:receipt.chainHash}}}function buildUnknownRepairedEvidence(taskId,requiredGates,seedGeneration,source,receiptHash){return{taskId,required_gates:withoutLegacyReconstructionGate(requiredGates),gates:{},requirements_state:"unknown",workflow:{schema:TASK_WORKFLOW_SCHEMA_MARKER,generation:seedGeneration,state:"idle",retryCount:0,retryHistory:[],retryEpoch:0,lastOutcome:"repair_idle",lastTransitionId:buildRepairTransitionId(taskId,"unknown"),updatedAt:new Date().toISOString()},repair_provenance:{source_sha256:source.sha256,source_generation:source.generation,requirements_receipt_hash:receiptHash}}}function canonicalizeTaskEvidence(taskId,evidence2){let validated=parseTaskEvidence(JSON.stringify({...evidence2,taskId}),taskId);return JSON.stringify(validated,null,2)}function isRepairWorkflowReset(taskId,workflow){return workflow!=null&&workflow.state==="idle"&&workflow.retryCount===0&&workflow.retryEpoch===0&&workflow.retryHistory.length===0&&workflow.lastOutcome==="repair_idle"&&typeof workflow.lastTransitionId==="string"&&workflow.lastTransitionId.startsWith(`repair_gate_evidence:${taskId}:`)}function isReceiptlessLegacySentinelReset(taskId,evidence2){return evidence2!=null&&isRepairWorkflowReset(taskId,evidence2.workflow)&&evidence2.requirements_state==="unknown"&&evidence2.required_gates.length===1&&evidence2.required_gates[0]===TASK_GATE_REQUIREMENTS_RECONSTRUCTION_SENTINEL&&Object.keys(evidence2.gates).length===0&&evidence2.repair_provenance!=null&&typeof evidence2.repair_provenance.source_sha256==="string"&&(evidence2.repair_provenance.source_generation===null||evidence2.repair_provenance.source_generation<evidence2.workflow.generation)&&evidence2.repair_provenance.requirements_receipt_hash===null}function isAlreadyRepairedEvidence(taskId,evidence2,receipt){if(!evidence2||!isRepairWorkflowReset(taskId,evidence2.workflow))return!1;if(Object.keys(evidence2.gates).length!==0)return!1;if(hasLegacyReconstructionGate(evidence2.required_gates))return!1;let receiptIsTainted=receipt!=null&&hasLegacyReconstructionGate(receipt.requiredGates);if(receipt&&!receiptIsTainted)return evidence2.requirements_state==="known"&&JSON.stringify(evidence2.required_gates)===JSON.stringify(receipt.requiredGates)&&evidence2.workflow.generation>receipt.generation&&(evidence2.test_engineer_exempt??null)===(receipt.testEngineerExempt??null)&&evidence2.repair_provenance?.requirements_receipt_hash===receipt.chainHash;if(!receipt||!receiptIsTainted)return!1;return evidence2.requirements_state==="unknown"&&evidence2.workflow.generation>=1&&evidence2.repair_provenance!=null&&evidence2.repair_provenance.requirements_receipt_hash===receipt.chainHash&&withoutLegacyReconstructionGate(receipt.requiredGates).every((gate)=>evidence2.required_gates.includes(gate))}function repairedEvidenceMatchesCas(evidence2,args2){let provenance=evidence2.repair_provenance;if(!provenance)return args2.expected_sha256==null&&args2.expected_generation==null;return(args2.expected_sha256==null||provenance.source_sha256===args2.expected_sha256)&&(args2.expected_generation==null||provenance.source_generation===args2.expected_generation)}function buildRepairNextActions(taskId,evidence2){if(evidence2.requirements_state==="known")return[`Delegate coder on task ${taskId} to produce a fresh accepted_mutation for the repaired evidence generation ${evidence2.workflow?.generation}.`,`Rerun Stage A for task ${taskId} until pre_check passes for the new generation.`,`Rerun Stage B gates [${evidence2.required_gates.join(", ")}] for task ${taskId} before attempting completion again.`];return[`Delegate coder on task ${taskId} to produce a fresh accepted mutation and regenerate authoritative required gates for a new exact-task generation.`,`Rerun Stage A for task ${taskId} after the new mutation is recorded.`,`Rerun the exact Stage B gates for task ${taskId} only after authoritative required gates are re-recorded; the idle recovery generation cannot complete directly.`]}function invalidateTaskEvidenceSessionFallbacks(taskId){for(let session of swarmState.agentSessions.values()){if(session.currentTaskId===taskId)session.currentTaskId=null;if(session.lastCoderDelegationTaskId===taskId)session.lastCoderDelegationTaskId=null;if(session.taskWorkflowStates?.delete(taskId),session.taskWorkflowCache?.delete(taskId),session.stageBCompletion?.delete(taskId),session.taskCouncilApproved?.delete(taskId),session.taskCouncilWorkflowGeneration?.delete(taskId),session.gateLog?.delete(taskId),session.partialGateWarningsIssuedForTask?.delete(taskId),session.completionGateWarnedForTask?.delete(taskId),session.lastGateFailure?.taskId===taskId)session.lastGateFailure=null}}async function repairTaskGateEvidence(args2,directory,context){assertStrictTaskId(args2.task_id);let normalizedReason=normalizeRepairReason(args2.reason),canonicalDirectory=canonicalizeRepairRoot(directory),plan=await loadPlan(canonicalDirectory);if(!plan?.phases.flatMap((phase)=>phase.tasks).find((candidate2)=>candidate2.id===args2.task_id))return{success:!1,message:`TASK_GATE_EVIDENCE_TASK_MISSING: ${args2.task_id} is not present in the loaded plan`,errors:[`Task ${args2.task_id} is not present in .swarm/plan.json.`]};return withTaskEvidenceLock(canonicalDirectory,args2.task_id,"repair_gate_evidence",async()=>{let read=readTaskEvidenceForRepair(canonicalDirectory,args2.task_id),latestReceipt=(await readTaskGateRequirementsReceipts(canonicalDirectory,args2.task_id)).at(-1),evidenceHasLegacyMarker=read.status==="valid"&&read.evidence!=null&&hasLegacyReconstructionGate(read.evidence.required_gates),receiptHasLegacyMarker=latestReceipt!=null&&hasLegacyReconstructionGate(latestReceipt.requiredGates);if(read.status==="valid"&&isAlreadyRepairedEvidence(args2.task_id,read.evidence,latestReceipt)){if(!repairedEvidenceMatchesCas(read.evidence,args2))return{success:!1,message:"TASK_GATE_EVIDENCE_CAS_MISMATCH",errors:["TASK_GATE_EVIDENCE_CAS_MISMATCH: the existing repaired generation was created from a different source identity."]};let nextActions2=buildRepairNextActions(args2.task_id,read.evidence);return{success:!0,repaired:!1,task_id:args2.task_id,required_gates:[...read.evidence.required_gates],requirements_state:read.evidence.requirements_state,repaired_generation:read.evidence.workflow?.generation,next_actions:nextActions2,message:`Task gate evidence for ${args2.task_id} is already in repaired fail-closed state.`}}if(read.status==="valid"&&read.evidence?.workflow?.schema===TASK_WORKFLOW_SCHEMA_MARKER&&!evidenceHasLegacyMarker&&latestReceipt!=null&&!receiptHasLegacyMarker&&!evidenceStampedForDifferentPlan(read.evidence,plan?derivePlanIdentityHash(plan):null))return{success:!1,message:"TASK_GATE_EVIDENCE_REPAIR_NOT_REQUIRED",errors:[`TASK_GATE_EVIDENCE_REPAIR_NOT_REQUIRED: ${args2.task_id} has valid authoritative evidence. Use the normal workflow repair path; this tool only rebuilds corrupt or legacy evidence, or evidence stamped for a different plan than the current .swarm/plan.json.`]};if(read.status==="valid"&&read.evidence?.requirements_state==="known"&&!evidenceHasLegacyMarker&&receiptHasLegacyMarker)return{success:!1,message:"TASK_GATE_REQUIREMENTS_RECEIPT_STALE",errors:[`TASK_GATE_REQUIREMENTS_RECEIPT_STALE: ${args2.task_id} has clean accepted-mutation evidence but its latest requirements receipt is legacy-tainted. Repair was refused without modifying evidence; replay the prepared coder settlement so it can publish the exact hash-linked receipt.`]};if(typeof args2.expected_sha256==="string"&&read.status!=="missing"&&read.sha256!==args2.expected_sha256)return{success:!1,message:"TASK_GATE_EVIDENCE_CAS_MISMATCH",errors:[`TASK_GATE_EVIDENCE_CAS_MISMATCH: expected sha256 ${args2.expected_sha256}, found ${read.sha256}.`]};if(typeof args2.expected_generation==="number"){let observedGeneration=read.status==="valid"?read.generation:latestReceipt?.generation;if(observedGeneration!==args2.expected_generation)return{success:!1,message:"TASK_GATE_EVIDENCE_CAS_MISMATCH",errors:[`TASK_GATE_EVIDENCE_CAS_MISMATCH: expected generation ${args2.expected_generation}, found ${observedGeneration??"unknown"}.`]}}if(read.status==="unreadable"||read.status==="oversized")return{success:!1,message:read.error?.message??"TASK_GATE_EVIDENCE_UNREADABLE: repair requires operator intervention before evidence can be rewritten.",errors:[read.error?.message??`TASK_GATE_EVIDENCE_UNREADABLE: ${args2.task_id} could not be read safely for repair.`]};if(evidenceHasLegacyMarker&&latestReceipt==null&&!isReceiptlessLegacySentinelReset(args2.task_id,read.evidence))return{success:!1,message:"TASK_GATE_REQUIREMENTS_RECEIPT_MISSING",errors:[`TASK_GATE_REQUIREMENTS_RECEIPT_MISSING: ${args2.task_id} is marker-bearing but does not match the exact receipt-less state emitted by the historical repair flow. Repair was refused without modifying evidence or session state.`]};let nextGeneration2=Math.max(read.status==="valid"?read.generation??-1:-1,latestReceipt?.generation??-1)+1,nextEvidence;if(evidenceHasLegacyMarker||receiptHasLegacyMarker){let preservedGates=withoutLegacyReconstructionGate([...read.status==="valid"?read.evidence?.required_gates??[]:[],...latestReceipt?.requiredGates??[]]);nextEvidence=buildUnknownRepairedEvidence(args2.task_id,preservedGates,Math.max(nextGeneration2,1),{sha256:read.status==="missing"?null:read.sha256,generation:read.status==="valid"?read.generation??null:latestReceipt?.generation??null},latestReceipt?.chainHash??null)}else if(latestReceipt)nextEvidence=buildKnownRepairedEvidence(args2.task_id,latestReceipt,nextGeneration2,{sha256:read.status==="missing"?null:read.sha256,generation:read.status==="valid"?read.generation??null:latestReceipt.generation??null});else if(read.status==="missing")return{success:!1,message:"TASK_GATE_EVIDENCE_ABSENT",errors:[`TASK_GATE_EVIDENCE_ABSENT: ${args2.task_id} has no evidence file and no authoritative requirements receipt to rebuild from.`]};else return{success:!1,message:"TASK_GATE_REQUIREMENTS_RECEIPT_MISSING",errors:[`TASK_GATE_REQUIREMENTS_RECEIPT_MISSING: ${args2.task_id} has no authoritative requirements receipt. Receipt-less repair was refused without modifying the original evidence because its required gates cannot be reconstructed safely.`]};if(plan)nextEvidence.planId=derivePlanId(plan),nextEvidence.planIdentityHash=derivePlanIdentityHash(plan);let serialized3=canonicalizeTaskEvidence(args2.task_id,nextEvidence),quarantine;if(isQuarantinableTaskEvidenceRead(read))quarantine=await quarantineTaskEvidenceBytes(canonicalDirectory,args2.task_id,read,normalizedReason,context,latestReceipt?.generation??null);assertTaskEvidenceWriteAllowed(canonicalDirectory,args2.task_id),await atomicWriteFile(taskEvidenceFilePath(canonicalDirectory,args2.task_id),serialized3),invalidateTaskEvidenceSessionFallbacks(args2.task_id);let nextActions=buildRepairNextActions(args2.task_id,nextEvidence);return{success:!0,repaired:!0,task_id:args2.task_id,required_gates:[...nextEvidence.required_gates],requirements_state:nextEvidence.requirements_state,quarantine_digest:quarantine?.digest,quarantine_path:quarantine?.filePath,repaired_generation:nextEvidence.workflow?.generation,next_actions:nextActions,message:`Repaired task gate evidence for ${args2.task_id} into a fresh fail-closed generation ${nextEvidence.workflow?.generation}. Next actions: ${nextActions.join(" ")}`}})}init_create_tool();init_resolve_working_directory();async function executeRepairGateEvidence(args2,directory,_ctx){try{if(!_ctx||stripKnownSwarmPrefix(_ctx.agent??"").toLowerCase()!=="architect")return{success:!1,message:"Only the architect may repair task gate evidence.",errors:["TASK_GATE_EVIDENCE_ARCHITECT_ONLY"]};let resolved=resolveWorkingDirectory(args2.working_directory,directory);if(!resolved.success)return{success:!1,message:resolved.message,errors:[resolved.message]};return await repairTaskGateEvidence(args2,resolved.directory,{sessionID:_ctx?.sessionID,messageID:_ctx?.messageID})}catch(error93){return{success:!1,message:"repair_gate_evidence failed",errors:[error93 instanceof Error?error93.message:String(error93)]}}}var repair_gate_evidence=createSwarmTool({description:"Architect-only evidence repair for exact-task gate files. Rebuilds from a durable requirements receipt, recovers receipt-backed legacy marker wedges or the exact sentinel-only historical reset, rebuilds otherwise-valid evidence stamped for a different plan than the current .swarm/plan.json (stamping the rebuilt record with the current plan identity), and refuses every other receipt-less reconstruction.",args:{task_id:exports_external.string().min(1).regex(/^\d+\.\d+(\.\d+)*$/,"Task ID must be in N.M or N.M.P format"),reason:exports_external.string().min(1).max(2000),expected_sha256:exports_external.string().regex(/^[a-f0-9]{64}$/).optional(),expected_generation:exports_external.number().int().min(0).optional(),working_directory:exports_external.string().optional()},execute:async(args2,directory,ctx)=>JSON.stringify(await executeRepairGateEvidence(args2,directory,ctx),null,2)});init_zod();init_schema();init_knowledge_receipt_ledger();init_create_tool();init_resolve_working_directory();async function executeRepairKnowledgeReceiptLedger(args2,directory,_ctx){try{if(_ctx&&stripKnownSwarmPrefix(_ctx.agent??"").toLowerCase()!=="architect")return{success:!1,message:"Only the architect may repair the knowledge receipt ledger.",errors:["RECEIPT_REPAIR_ARCHITECT_ONLY"]};if(_ctx?.sessionID&&args2.session_id!==_ctx.sessionID)return{success:!1,message:"repair_knowledge_receipt_ledger session_id must match the invoking tool context.",errors:["RECEIPT_REPAIR_SESSION_MISMATCH"]};let resolved=resolveWorkingDirectory(args2.working_directory,directory);if(!resolved.success)return{success:!1,message:resolved.message,errors:[resolved.message]};if(args2.operation==="backfill_phase_id"){let backfill=await backfillMembershipPhaseIds(resolved.directory);if(!backfill.ok)return{success:!1,message:"repair_knowledge_receipt_ledger backfill_phase_id failed",errors:[backfill.detail],code:backfill.code};return{success:!0,message:`phase_id backfill complete: ${backfill.backfilled} membership(s) backfilled, ${backfill.skipped.length} skipped (unparsable label), ${backfill.journal_records} journal record(s) appended. Stored labels are never rewritten.`,backfilled:backfill.backfilled,skipped:backfill.skipped.slice(0,20),skipped_total:backfill.skipped.length,journal_records:backfill.journal_records}}let result=await repairKnowledgeReceiptLedger(resolved.directory,args2);if(!result.ok)return{success:!1,message:"repair_knowledge_receipt_ledger failed",errors:[result.detail],code:result.code};let reEvaluationArgs=JSON.stringify({repair_id:result.repair_id,phase:args2.phase,...args2.task_id?{task_id:args2.task_id}:{},scope_complete:!0});return{success:!0,message:result.status==="validated_projection"?"knowledge receipt projection validated":result.status==="pending_re_evaluation"?`knowledge receipt ledger still pending re-evaluation; as architect, run knowledge_recall with a comprehensive query and repair_re_evaluation ${reEvaluationArgs}`:`knowledge receipt ledger repaired and blocked pending re-evaluation; as architect, run knowledge_recall with a comprehensive query and repair_re_evaluation ${reEvaluationArgs}`,...result}}catch(error93){return{success:!1,message:"repair_knowledge_receipt_ledger failed",errors:[error93 instanceof Error?error93.message:String(error93)]}}}var repair_knowledge_receipt_ledger=createSwarmTool({description:"Architect-only repair and validation for the authoritative knowledge receipt ledger. Default operation repairs: rebuilds the derived projection when authority is readable, or quarantines a bounded corrupt authority, salvages only the validated prefix, and blocks the exact phase/session until a fresh re-evaluation is committed. operation backfill_phase_id durably stamps the stable numeric phase_id on live memberships that lack one across the WHOLE ledger (phase/session_id are not used to scope the backfill; labels never rewritten).",args:{phase:exports_external.string().min(1),session_id:exports_external.string().min(1),task_id:exports_external.string().min(1).optional(),reason:exports_external.string().min(1).max(2000),operation:exports_external.enum(["repair","backfill_phase_id"]).optional(),grace_days:exports_external.number().int().min(0).optional(),working_directory:exports_external.string().optional()},execute:async(args2,directory,ctx)=>JSON.stringify(await executeRepairKnowledgeReceiptLedger(args2,directory,ctx),null,2)});init_zod();init_loader();init_schema();init_profiles();init_telemetry();init_path_security();init_create_tool();import*as path373 from"node:path";init_zod();init_external_tool_runner();init_path_security();init_create_tool();import*as fs230 from"node:fs";import{createRequire as createRequire7}from"node:module";import*as path372 from"node:path";var require2=createRequire7(import.meta.url),DEFAULT_MAX_RESULTS4=100,DEFAULT_MAX_LINES=200,REGEX_TIMEOUT_MS=5000,MAX_FILE_SIZE_BYTES8=1048576,HARD_CAP_RESULTS4=1e4,HARD_CAP_LINES=1e4,MAX_QUERY_LENGTH=20000,MAX_INCLUDE_PATTERNS=100,MAX_RG_STDOUT_BYTES=8388608,MAX_RG_STDERR_BYTES=65536,FALLBACK_MAX_FILES=20000,FALLBACK_MAX_DIRS=5000,FALLBACK_MAX_DEPTH=40,FALLBACK_MAX_TOTAL_BYTES=67108864,DEFAULT_SKIP_DIRS=new Set([".git",".swarm","node_modules","dist","build","out","coverage",".next",".turbo",".cache"]);function globMatch(pattern,filePath){let normalizedPattern=pattern.replace(/\\/g,"/"),normalizedPath=filePath.replace(/\\/g,"/"),regexPattern=normalizedPattern.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*\*/g,"{{DOUBLESTAR}}").replace(/\*/g,"[^/]*").replace(/\?/g,".").replace(/\{\{DOUBLESTAR\}\}/g,".*");try{return new RegExp(`^${regexPattern}$`).test(normalizedPath)}catch{return!1}}function matchesGlobs(filePath,globs){if(globs.length===0)return!0;return globs.some((glob)=>globMatch(glob,filePath))}var WINDOWS_RESERVED_NAMES5=/^(con|prn|aux|nul|com[1-9]|lpt[1-9])(\.|:|$)/i;function containsWindowsAttacks4(str){if(/:[^\\/]/.test(str))return!0;let parts=str.split(/[/\\]/);for(let part of parts)if(WINDOWS_RESERVED_NAMES5.test(part))return!0;return!1}function resolveWithinWorkspace(filePath,workspace){try{let resolvedPath=path372.resolve(workspace,filePath),realWorkspace=fs230.realpathSync(workspace),realResolvedPath=fs230.realpathSync(resolvedPath),relativePath2=path372.relative(realWorkspace,realResolvedPath);if(relativePath2.startsWith("..")||path372.isAbsolute(relativePath2))return null;return relativePath2}catch{return null}}function isPathInWorkspace3(filePath,workspace){return resolveWithinWorkspace(filePath,workspace)!==null}function validatePathForRead2(filePath,workspace){return isPathInWorkspace3(filePath,workspace)}function splitGlobPatterns2(value){return value?value.split(",").map((p)=>p.trim()).filter(Boolean):[]}var GLOB_METACHARACTERS=/[*?[\]{}]/;function isExactPath(pattern){return!GLOB_METACHARACTERS.test(pattern)}function targetsDotDirectory(pattern){let firstSegment=pattern.split(/[\\/]/)[0];return!!firstSegment&&firstSegment.startsWith(".")&&firstSegment!=="."&&firstSegment!==".."}function hasGitSegment(resolvedRelativePath){return resolvedRelativePath.split(/[\\/]/).some((segment)=>segment.toLowerCase()===".git")}function toWorkspaceRelativePath2(filePath,workspace){try{let resolved=path372.resolve(workspace,filePath),realWorkspace=fs230.realpathSync(workspace),realResolved=fs230.realpathSync(resolved),relative99=path372.relative(realWorkspace,realResolved);if(!relative99||relative99.startsWith("..")||path372.isAbsolute(relative99))return null;return relative99.split(path372.sep).join("/")}catch{return null}}function truncateLine(line,maxLines){let trimmed=line.trimEnd();if(trimmed.length>maxLines)return`${trimmed.substring(0,maxLines)}...`;return trimmed}function resolvePackagedRipgrep(){try{let mod=require2("@vscode/ripgrep");return typeof mod.rgPath==="string"&&mod.rgPath?mod.rgPath:null}catch{return null}}function resolveRipgrepBinary(){return _internals319.resolvePackagedRipgrep()??_internals319.resolveExecutableFromPath(["rg"])}async function ripgrepSearch(opts){let rgPath=_internals319.resolveRipgrepBinary();if(!rgPath)return{error:!0,type:"rg-not-found",message:"ripgrep (rg) not found; using fallback search was not possible"};let args2=["--json","--no-config","-n"],includes=splitGlobPatterns2(opts.include),promotablePaths=[],globIncludes=[];for(let pattern of includes){let resolvedRelative=resolveWithinWorkspace(pattern,opts.workspace);if(isExactPath(pattern)&&targetsDotDirectory(pattern)&&pattern.split(/[\\/]/)[0]?.toLowerCase()!==".git"&&resolvedRelative!==null&&!hasGitSegment(resolvedRelative))promotablePaths.push(pattern);else globIncludes.push(pattern)}let pathOperands;if(promotablePaths.length>0&&globIncludes.length===0)pathOperands=promotablePaths;else{for(let pattern of[...globIncludes,...promotablePaths])args2.push("--glob",pattern);if(includes.some((p)=>targetsDotDirectory(p)&&p.split(/[\\/]/)[0]?.toLowerCase()!==".git"))args2.push("--hidden","--no-ignore"),args2.push("--glob","!.git");pathOperands=["."]}for(let pattern of splitGlobPatterns2(opts.exclude))args2.push("--glob",`!${pattern}`);if(opts.mode!=="regex")args2.push("--fixed-strings");args2.push("--",opts.query,...pathOperands);let run=await _internals319.runExternalTool({executable:rgPath,args:args2,cwd:opts.workspace,timeoutMs:REGEX_TIMEOUT_MS,maxStdoutBytes:MAX_RG_STDOUT_BYTES,maxStderrBytes:MAX_RG_STDERR_BYTES});try{if(run.status==="timeout")return{error:!0,type:"regex-timeout",message:`Search timed out after ${REGEX_TIMEOUT_MS}ms`};if(run.status==="spawn-error")return{error:!0,type:"unknown",message:run.message??"ripgrep failed to start"};if(run.exitCode!==0&&run.stderr){if(run.stderr.includes("Invalid regex")||run.stderr.includes("regex parse error")||run.stderr.includes("SyntaxError"))return{error:!0,type:"invalid-query",message:`Invalid query: ${run.stderr.split(`
7856
7856
  `)[0]}`};if(run.exitCode===2)return{error:!0,type:"unknown",message:`ripgrep error: ${run.stderr.split(`
7857
7857
  `)[0]}`}}let matches=[],total=0;for(let line of run.stdout.split(`
7858
7858
  `)){if(!line.trim())continue;try{let entry=JSON.parse(line);if(entry.type==="match"){let rawPath=entry.data?.path?.text??entry.data?.path,relativePath2=typeof rawPath==="string"?toWorkspaceRelativePath2(rawPath,opts.workspace):null;if(!relativePath2)continue;if(total++,matches.length<opts.maxResults){let match={file:relativePath2,lineNumber:entry.data.line_number,lineText:truncateLine(entry.data.lines.text,opts.maxLines)};matches.push(match)}}}catch{}}return{matches,truncated:total>opts.maxResults||run.stdoutTruncated||run.stderrTruncated,total,query:opts.query,mode:opts.mode,maxResults:opts.maxResults,engine:"ripgrep",outputTruncated:run.stdoutTruncated||run.stderrTruncated}}catch(err){return{error:!0,type:"unknown",message:err instanceof Error?err.message:String(err)}}}function escapeRegex4(str){return str.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function collectFiles(dir,workspace,includeGlobs,excludeGlobs,state2,depth=0){if(depth>FALLBACK_MAX_DEPTH||state2.files.length>=FALLBACK_MAX_FILES||state2.dirCount>=FALLBACK_MAX_DIRS)return state2.truncated=!0,state2.files;try{let realDir=fs230.realpathSync(dir);if(state2.seenRealPaths.has(realDir))return state2.files;state2.seenRealPaths.add(realDir),state2.dirCount++}catch{return state2.files}if(!validatePathForRead2(dir,workspace))return state2.files;try{let entries2=fs230.readdirSync(dir,{withFileTypes:!0});for(let entry of entries2){if(state2.files.length>=FALLBACK_MAX_FILES||state2.dirCount>=FALLBACK_MAX_DIRS){state2.truncated=!0;break}let fullPath=path372.join(dir,entry.name),relativePath2=path372.relative(workspace,fullPath);if(!validatePathForRead2(fullPath,workspace))continue;if(entry.isDirectory()){if(entry.name.toLowerCase()===".git"||DEFAULT_SKIP_DIRS.has(entry.name)&&!includeGlobs.some((g)=>g.split(/[\\/]/)[0]===entry.name))continue;collectFiles(fullPath,workspace,includeGlobs,excludeGlobs,state2,depth+1)}else if(entry.isFile()){if(includeGlobs.length>0&&!matchesGlobs(relativePath2,includeGlobs))continue;if(excludeGlobs.length>0&&matchesGlobs(relativePath2,excludeGlobs))continue;let normalized=toWorkspaceRelativePath2(fullPath,workspace);if(!normalized)continue;state2.files.push(normalized)}}}catch{}return state2.files}async function searchWorkspaceLiteral(opts){let includeGlobs=opts.include?opts.include.split(",").map((p)=>p.trim()).filter(Boolean):[],excludeGlobs=opts.exclude?opts.exclude.split(",").map((p)=>p.trim()).filter(Boolean):[],collectState={files:[],seenRealPaths:new Set,dirCount:0,truncated:!1},files=collectFiles(opts.workspace,opts.workspace,includeGlobs,excludeGlobs,collectState),regex;try{if(opts.mode==="regex")regex=new RegExp(opts.query);else regex=new RegExp(escapeRegex4(opts.query))}catch(err){return{error:!0,type:"invalid-query",message:err instanceof Error?err.message:"Invalid regex pattern"}}let matches=[],total=0,totalBytesRead=0,truncated=collectState.truncated;for(let file3 of files){let fullPath=path372.join(opts.workspace,file3);if(!validatePathForRead2(fullPath,opts.workspace))continue;let stats2;try{if(stats2=fs230.statSync(fullPath),stats2.size>MAX_FILE_SIZE_BYTES8)continue;if(totalBytesRead+stats2.size>FALLBACK_MAX_TOTAL_BYTES){truncated=!0;break}totalBytesRead+=stats2.size}catch{continue}let content;try{let bytes=fs230.readFileSync(fullPath);if(bytes.includes(0))continue;content=bytes.toString("utf-8")}catch{continue}let lines=content.split(`