opencode-swarm 7.132.1 → 7.132.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.opencode/skills/swarm-pr-review/SKILL.md +15 -5
- package/dist/cli/{curator-28hcw9hx.js → curator-h067mrcc.js} +1 -1
- package/dist/cli/{curator-llm-factory-rd0s95fw.js → curator-llm-factory-605d08hf.js} +1 -1
- package/dist/cli/{guardrail-explain-742dhpec.js → guardrail-explain-s7vzm6z7.js} +2 -2
- package/dist/cli/{hive-promoter-8whgvcry.js → hive-promoter-nv0m5rzk.js} +1 -1
- package/dist/cli/{index-x3p6ktva.js → index-8d3m0ge3.js} +2 -2
- package/dist/cli/{index-b21a4zw4.js → index-f6480ee6.js} +9 -9
- package/dist/cli/{index-4hapy63e.js → index-k4tmx21m.js} +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/hooks/guardrails/index.d.ts +32 -0
- package/dist/hooks/guardrails/messages-transform.d.ts +7 -0
- package/dist/hooks/guardrails.d.ts +1 -1
- package/dist/hooks/pr-workflow-response-gate.d.ts +44 -26
- package/dist/index.js +13 -13
- 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.132.1",description:"Architect-centric agentic swarm plugin for OpenCode - hub-and-spoke orchestration with SME consultation, code generation, and QA review",main:"dist/index.js",types:"dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",default:"./dist/index.js"},"./package.json":"./package.json"},bin:{"opencode-swarm":"./dist/cli/index.js"},type:"module",engines:{bun:">=1.3.13"},license:"MIT",repository:{type:"git",url:"https://github.com/ZaxbyHub/opencode-swarm.git"},publishConfig:{access:"public",registry:"https://registry.npmjs.org/"},keywords:["opencode","opencode-plugin","ai","agents","orchestration","swarm","multi-agent","llm"],files:["dist","dist/lang/grammars","binaries","evaluation-fixtures",".opencode/skills/brainstorm",".opencode/skills/specify",".opencode/skills/clarify-spec",".opencode/skills/resume",".opencode/skills/clarify",".opencode/skills/discover",".opencode/skills/consult",".opencode/skills/pre-phase-briefing",".opencode/skills/council",".opencode/skills/deep-dive",".opencode/skills/deep-research",".opencode/skills/codebase-review-swarm",".opencode/skills/swarm-implement",".opencode/skills/design-docs",".opencode/skills/swarm-pr-review",".opencode/skills/swarm",".opencode/skills/swarm-pr-feedback",".opencode/skills/swarm-pr-subscribe",".opencode/skills/swarm-ci-monitor",".opencode/skills/issue-ingest",".opencode/skills/plan",".opencode/skills/critic-gate",".opencode/skills/execute",".opencode/skills/phase-wrap",".opencode/skills/loop",".opencode/skills/writing-tests",".opencode/skills/running-tests",".opencode/skills/engineering-conventions",".opencode/skills/commit-pr",".opencode/skills/ci-failure-batching",".opencode/skills/gate-attribution",".opencode/skills/merge-queue-readiness",".opencode/skills/skill-edit-validation",".opencode/skills/worktree-retry-cleanup",".opencode/skills/test-file-split",".opencode/skills/fork-pr-operations",".opencode/skills/parallel-work-check",".opencode/skills/ci-fix-monitor",".opencode/skills/issue-tracer","tests/fixtures/memory-recall","README.md","LICENSE"],scripts:{clean:`bun -e "require('fs').rmSync('dist',{recursive:true,force:true})"`,build:"bun run clean && bun run scripts/copy-grammars.ts && bun build src/index.ts --outdir dist --target node --format esm --external web-tree-sitter --minify-whitespace --minify-syntax && bun build src/cli/index.ts --outdir dist/cli --target bun --format esm --external bash-parser --splitting && bun run scripts/copy-grammars.ts --to-dist && tsc --emitDeclarationOnly",typecheck:"tsc --noEmit",test:"bun test",lint:"biome lint .","lint:ci":"biome ci .","test:unit:ci":"bun scripts/ci/run-unit-tests-local.ts","drift:check":"bun run scripts/drift-check.ts","drift:fix":"bun run scripts/drift-check.ts --fix --confirm","skills:sync":"bun run scripts/sync-qa-gate-skills.ts",format:"biome format . --write",check:"biome check --write .",dev:"bun run build && opencode","package:smoke":"node scripts/package-smoke.mjs",prepare:"bun run build","repro:704":"node scripts/repro-704.mjs","repro:1144":"bun scripts/repro-1144.mjs","repro:1873":"bun build scripts/repro-1873-entry.ts --outdir dist-build-test/repro-1873 --target node --format esm && node scripts/repro-1873.mjs"},dependencies:{"@opencode-ai/plugin":"^1.18.3","@opencode-ai/sdk":"^1.18.3","@vscode/tree-sitter-wasm":"^0.3.0","bash-parser":"^0.5.0","p-limit":"^7.3.0",picomatch:"^4.0.4","proper-lockfile":"^4.1.2","quick-lru":"^7.3.0","web-tree-sitter":"^0.25.0",zod:"^4.1.8"},devDependencies:{"@biomejs/biome":"2.3.14","@types/picomatch":"^4.0.3","bun-types":"1.3.8","js-yaml":"^4.1.1",typescript:"^5.7.3"}}});var QA_AGENTS,PIPELINE_AGENTS,ORCHESTRATOR_NAME="architect",ALL_SUBAGENT_NAMES,ALL_AGENT_NAMES;var init_agent_names=__esm(()=>{QA_AGENTS=["reviewer","critic","critic_oversight"],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_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_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"],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","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","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_oversight"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},sast_scan:{description:"static analysis security scan",agents:["architect","reviewer","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"]},quality_budget:{description:"code quality budget check",agents:["architect"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},symbols:{description:"extract exported symbols (functions, classes, interfaces, types) from source files; supports TypeScript, JavaScript, and Python",agents:["architect","sme","researcher","docs","docs_design","designer","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","spec_writer","reviewer","critic","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","critic_oversight","explorer","test_engineer"]},schema_drift:{description:"OpenAPI spec vs route drift",agents:["architect","sme","researcher","docs","explorer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},todo_extract:{description:"structured TODO/FIXME extraction",agents:["architect","researcher","docs","explorer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},evidence_check:{description:"verify task evidence completeness",agents:["architect","critic_oversight"]},check_gate_status:{description:"check the gate status of a specific task",agents:["architect","critic_oversight"]},completion_verify:{description:"verify completed tasks have required evidence",agents:["architect","critic_oversight"]},complete_pr_workflow:{description:"validate terminal PR workflow evidence and clear its durable session gate",agents:["architect"]},abort_pr_workflow:{description:"abort an unrecoverable PR_REVIEW/PR_FEEDBACK mechanical gate and clear its durable session state",agents:["architect"]},prepare_pr_workflow_checkout:{description:"preserve explicit dirty tracked files before an unbound PR workflow checkout with an auditable recovery receipt",agents:["architect"]},run_pr_feedback_stage_a:{description:"execute and persist mandatory PR-feedback Stage A checks on a content-bound revision",agents:["architect"]},submit_council_verdicts:{description:"submit pre-collected council member verdicts for synthesis (architect MUST dispatch critic/reviewer/sme/test_engineer/explorer as Agent tasks first; this tool synthesizes only, it does not contact members)",agents:[]},submit_phase_council_verdicts:{description:"submit pre-collected phase-level council member verdicts for holistic phase synthesis (architect MUST dispatch all 5 council members with phase-scoped context first; this tool synthesizes only, it does not contact members)",agents:[]},declare_council_criteria:{description:"pre-declare acceptance criteria for a task before the coder starts work; criteria are read back during council evaluation",agents:[]},sbom_generate:{description:"SBOM generation for dependency inventory",agents:["architect"]},checkpoint:{description:"create named git checkpoints for save, restore, and delete — use before risky operations to enable rollback",agents:["architect"]},pkg_audit:{description:"dependency vulnerability scan — npm/pip/cargo",agents:["architect","critic_hallucination_verifier","reviewer","critic_oversight","test_engineer"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},parse_lane_candidates:{description:"Parse [CANDIDATE] rows from a dispatch_lanes or collect_lane_results artifact (by output_ref), produce structured records with provenance, optionally persist to a per-batch sidecar JSONL. Pure-parser variant exists as internal module.",agents:["architect"]},plan_conflict_check:{description:"read-only advisory check (#1656): compute a pairwise file-conflict matrix for N proposed parallel task groups using declared scopes and optional git co-change; returns a verdict (all_disjoint / conflicts_present / unknown_scopes), per-pair evidence, and a suggested serialization order. Writes nothing — the execution gate independently recomputes the verdict inline at dispatch time via the same helper. Call BEFORE attempting parallel dispatch to confirm disjointness.",agents:["architect"]},write_pr_review_trigger_eval:{description:"persist the complete PR-review trigger evaluation with exact-set validation, dispatch provenance, and live merge-base verification",agents:["architect"]},write_pr_review_artifact:{description:"persist schema-validated PR-review findings checkpoints and exact actionable feedback handoffs under the active run",agents:["architect"]},prepare_pr_feedback_scope:{description:"prepare an exact file scope for one PR-feedback coder Task after immutable feedback verification settles",agents:["architect"]},test_runner:{description:"auto-detect and run tests",agents:["architect","reviewer","test_engineer"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},test_impact:{description:"identify test files impacted by changed source files via import analysis",agents:["architect","reviewer","critic_oversight","test_engineer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},mutation_test:{description:"executes pre-generated mutation patches against tests, evaluates kill rate against quality gate thresholds",agents:["architect","test_engineer"]},generate_mutants:{description:"generate LLM-based mutation testing patches for source files; returns MutationPatch[] for direct consumption by the mutation_test tool",agents:["architect"]},detect_domains:{description:"detect which SME domains are relevant for a given text",agents:["architect","sme","docs","docs_design","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic","critic_oversight","explorer"]},git_blame:{description:"per-line git blame metadata: sha, author, date, summary for each line in a file",agents:["reviewer","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","coder","test_engineer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},retrieve_lane_output:{description:"retrieve paged full dispatch lane output by output_ref; use before consuming truncated lane previews or routing candidates from lane results",agents:["architect"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},extract_code_blocks:{description:"extract code blocks from text content and save them to files",agents:["docs","docs_design","designer","spec_writer","coder","test_engineer"]},phase_complete:{description:"mark a phase as complete and track dispatched agents",agents:["architect"]},save_plan:{description:"save a structured implementation plan",agents:["architect"]},update_task_status:{description:"mark tasks complete, track phase progress",agents:["architect"]},lint_spec:{description:"validate .swarm/spec.md format and required fields",agents:["architect","spec_writer"]},write_retro:{description:"document phase retrospectives via phase_complete workflow, capture lessons learned",agents:["architect"]},write_drift_evidence:{description:"write drift verification evidence for a completed phase",agents:["architect"]},write_hallucination_evidence:{description:"write hallucination verification evidence for a completed phase",agents:["architect"]},write_mutation_evidence:{description:"write mutation gate evidence for a completed phase; normalizes PASS/WARN/FAIL/SKIP verdicts and writes .swarm/evidence/{phase}/mutation-gate.json",agents:["architect"]},declare_scope:{description:"declare file scope for next coder delegation",agents:["architect"]},knowledge_query:{description:"query swarm or hive knowledge with optional filters",agents:["architect","skill_improver","spec_writer"]},doc_scan:{description:"scan project documentation files and build an index manifest",agents:["architect","docs_design","skill_improver","spec_writer","explorer"]},doc_extract:{description:"extract actionable constraints from project documentation",agents:["architect","docs_design","skill_improver","spec_writer"]},curator_analyze:{description:"run curator phase analysis and optionally apply knowledge recommendations",agents:["architect"]},consensus_mine:{description:"mine cross-run consensus from existing .swarm evidence into an immutable proposals-only report; also deletes its own reports past consensus.report_retention, appends to the shared recommendation dedup ledger (in the shared cohort root, outside this project, when a knowledge link is active), and mirrors proposals into pending swarm-memory proposals when memory is enabled",agents:["architect","curator_phase","curator_postmortem"]},knowledge_add:{description:"store a new lesson in the knowledge base",agents:["architect","coder"]},knowledge_recall:{description:"search the knowledge base for relevant past decisions",agents:["architect","sme","docs","docs_design","designer","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic_architecture_supervisor","curator_init","curator_phase","skill_improver","spec_writer","reviewer","critic","critic_oversight","explorer","coder","test_engineer"]},knowledge_remove:{description:"delete an outdated swarm knowledge entry by ID (swarm tier only)",agents:["architect"]},co_change_analyzer:{description:"detect hidden couplings by analyzing git history",agents:["architect"]},context_status:{description:"report current context-window headroom for the active session — returns tokens-used, model-limit, usage-percent, threshold-state (none/warn/critical), model name, and provider. Pure read-only: no state mutation, no warning injection. Works whether context_budget.enabled is true or false.",agents:["architect"]},search:{description:"Workspace-scoped ripgrep-style text search with structured JSON output. Supports literal and regex modes, glob filtering, and result limits. NOTE: This is text search, not structural AST search — use symbols and imports tools for structural queries.",agents:["architect","sme","docs","docs_design","designer","critic_hallucination_verifier","skill_improver","spec_writer","reviewer","critic_oversight","explorer","coder","test_engineer","researcher"]},ast_grep:{description:"Read-only structural AST search using ast-grep patterns with optional language and glob filters. Use for syntax-aware code pattern searches; does not rewrite files.",agents:["architect","sme","docs","docs_design","critic_hallucination_verifier","spec_writer","explorer","coder","test_engineer","researcher"]},actionlint_scan:{description:"Run actionlint against GitHub Actions workflow YAML files with structured findings. Resolves actionlint lazily and does not modify files.",agents:["architect","test_engineer"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},osv_scan:{description:"Run OSV-Scanner against a workspace path and return structured dependency vulnerability findings. Resolves osv-scanner lazily and does not modify files.",agents:["architect","test_engineer"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},gh_evidence:{description:"Fetch bounded GitHub pull request or issue metadata through gh for review and CI evidence. Resolves gh lazily and is read-only.",agents:["architect","researcher"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},pr_workflow_status:{description:"Read-only architect observation of local git state (HEAD, branch, clean/dirty with a bounded changed-file list, remotes) plus a session-pinned PR workflow gate summary. Use to observe state under the fail-closed PR_REVIEW/PR_FEEDBACK gate. Never executes PR-controlled scripts and never reads another session gate.",agents:["architect"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},batch_symbols:{description:"Batched symbol extraction across multiple files. Returns per-file symbol summaries with isolated error handling.",agents:["architect","critic_hallucination_verifier","reviewer","critic_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"]},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","critic_oversight","explorer","coder"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},get_qa_gate_profile:{description:"retrieve the QA gate profile for the current plan: gates (reviewer, test_engineer, sme_enabled, critic_pre_plan, sast_enabled, council_mode, hallucination_guard, mutation_test, phase_council, drift_check, final_council), lock state, and profile hash. Read-only.",agents:["architect"]},set_qa_gates:{description:"configure the QA gate profile for the current plan. Architect-only. Ratchet-tighter only — rejected once the profile is locked after critic approval. Supports: reviewer, test_engineer, sme_enabled, critic_pre_plan, sast_enabled, council_mode, hallucination_guard, mutation_test, phase_council, drift_check, final_council.",agents:["architect"]},web_search:{description:"External web search (Tavily or Brave) for architect-driven council research, SME domain research, researcher auto-research, and skill-improver research. Returns titled results with snippets, URLs, normalized query metadata, temporal intent, freshness, and removed stale years. Config-gated on council.general.enabled in the resolved config: global ~/.config/opencode/opencode-swarm.json, then project .opencode/opencode-swarm.json overrides. Requires a search API key. Used by the architect in MODE: COUNCIL to gather a RESEARCH CONTEXT before dispatching council agents, by SME for opt-in external skill/source evaluation, and by the researcher agent for multi-source auto-research.",agents:["sme","researcher","skill_improver"]},web_fetch:{description:"Fetch the readable text of a single http(s) URL (architect-only). Returns decoded page text, document title, final URL after redirects, and an evidence reference. Reads primary sources that web_search only surfaces as snippets. Config-gated on council.general.enabled. Blocks private/loopback/link-local/metadata addresses (re-validated and re-pinned across redirects); enforces timeout and body size cap.",agents:[]},convene_general_council:{description:"Synthesize responses from a multi-model General Council. Accepts parallel member responses (Round 1, optionally Round 2), detects disagreements, and returns consensus points, persisting disagreements, and a structured synthesis. Architect-only. Config-gated on council.general.enabled in the resolved config: global ~/.config/opencode/opencode-swarm.json, then project .opencode/opencode-swarm.json overrides.",agents:[]},write_final_council_evidence:{description:"Persist project-scoped final council evidence to .swarm/evidence/final-council.json. PREREQUISITE: dispatch critic, reviewer, sme, test_engineer, and explorer as project-scoped Agent tasks and collect their CouncilMemberVerdict JSON — this tool synthesizes only. Rejects on insufficient quorum or CONCERNS with unresolved requiredFixes; normalizes verdicts to approved/concerns/rejected. Architect-only.",agents:[]},skill_generate:{description:"compile knowledge entries into a structured SKILL.md draft",agents:["skill_improver"]},skill_list:{description:"list generated skill files and their status",agents:["skill_improver"]},skill_apply:{description:"activate a draft skill proposal",agents:[]},skill_inspect:{description:"inspect the content and source entries of a skill file",agents:["skill_improver"]},run_stale_reconciliation:{description:"reconcile skills against the knowledge store: mark skills stale when source knowledge is archived or deleted, or clear stale markers",agents:["architect"]},skill_regenerate:{description:"regenerate an active skill by re-clustering its source knowledge entries and updating the SKILL.md in place",agents:[]},skill_retire:{description:"retire a generated skill by adding a retired.marker file; retired skills are excluded from scoring and injection",agents:[]},skill_improve:{description:"run the skill_improver agent to review and refine skills",agents:["skill_improver"]},spec_write:{description:"author or update .swarm/spec.md for the current project",agents:["spec_writer"]},knowledge_receipt:{description:"file a receipt for retrieved knowledge (applied/ignored/contradicted + new lessons), recorded as immutable knowledge events",agents:["architect","sme","docs","docs_design","designer","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic_architecture_supervisor","curator_init","curator_phase","skill_improver","spec_writer","reviewer","critic","coder","test_engineer"]},knowledge_archive:{description:"archive (default), quarantine, or purge a swarm or hive knowledge entry by ID with an immutable audit tombstone; purge requires an admin flag",agents:["architect"]},swarm_memory_recall:{description:"recall scoped Swarm memory for the current repository as untrusted background",agents:[]},swarm_memory_propose:{description:"create a pending Swarm memory proposal; does not write durable memory directly",agents:[]},swarm_command:{description:"run supported /swarm commands through the canonical command registry",agents:["architect","sme","researcher","docs","docs_design","designer","reviewer","critic","explorer","coder","test_engineer"]},dispatch_lanes:{description:"dispatch read-only exploration/review lanes concurrently and BLOCK until all finish; prefer dispatch_lanes_async for non-blocking dispatch, use this only when promptAsync is unavailable",agents:["architect"]},dispatch_lanes_async:{description:"launch read-only advisory lanes non-blockingly and return a batch id plus lane session handles immediately so you can keep working; launch_timeout_ms is only a promptAsync acceptance budget, not a lane runtime timeout; poll incrementally with collect_lane_results (wait omitted or false) while doing independent investigation, or join with wait: true when you need all results",agents:["architect"]},collect_lane_results:{description:"collect or poll results for a dispatch_lanes_async batch; supports both non-blocking polling (wait omitted or false) and blocking join (wait: true). Non-blocking polls include pending lane identities by default and process settled lanes incrementally while continuing independent work; busy/retry lanes are not timed out just because they run for a long time. Does not advance workflow gates. Inline output for a settled lane is delivered only once: later polls of the same lane set output_omitted_repeat: true and omit output, but still include output_ref for recovery via retrieve_lane_output.",agents:["architect"]},summarize_work:{description:"emit a short structured summary of completed work (key decisions, assumptions, risks, constraints) at task completion; rolls up per phase for architecture-supervisor review. Advisory, never blocks.",agents:["architect","sme","researcher","docs","docs_design","designer","explorer","coder","test_engineer"]},write_architecture_supervisor_evidence:{description:"persist the architecture supervisor verdict for a phase (architect MUST dispatch critic_architecture_supervisor first and collect its JSON verdict; this tool persists only, it does not contact the supervisor)",agents:["architect"]},lean_turbo_plan_lanes:{description:"partition phase tasks into parallel lanes based on file-scope conflicts for Lean Turbo execution",agents:[]},lean_turbo_acquire_locks:{description:"acquire file locks for all files in a lane (all-or-nothing) before lane execution",agents:[]},lean_turbo_runner_status:{description:"read Lean Turbo run state from .swarm/turbo-state.json",agents:[]},lean_turbo_review:{description:"dispatch a read-only reviewer agent to evaluate a completed Lean Turbo phase",agents:[]},lean_turbo_run_phase:{description:"Execute a phase using Lean Turbo parallel lane execution. Plans lanes, acquires file locks, and dispatches coder agents concurrently. Use when Lean Turbo is active and you want to execute all tasks in a phase in parallel lanes.",agents:[]},lean_turbo_status:{description:"returns Lean Turbo configuration and active status for the current session",agents:[]},swarm_apply_patch:{description:"Apply a unified diff patch to workspace files with exact context matching, atomic writes, and path validation. Use standard unified diff format only — does NOT support *** Begin Patch / *** Update File payloads (use native apply_patch for those).",agents:["coder","test_engineer"]},external_skill_discover:{description:"Discover external skill candidates from configured sources. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_list:{description:"List external skill candidates in the quarantine store. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_inspect:{description:"Inspect a specific external skill candidate by ID. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_promote:{description:"Promote a validated external skill candidate to an active generated skill. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_reject:{description:"Reject an external skill candidate after evaluation. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_delete:{description:"Delete an external skill candidate from the quarantine store. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_revoke:{description:"Revoke a previously promoted external skill. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},epic_decide_phase:{description:"Compute the Epic Mode verdict for a phase WITHOUT dispatching coders. Runs preflight + calibration + the three gates (p-threshold, hot-module, greenfield), persists the decision, and returns the verdict so the architect can dispatch waves via the visible Task tool (promote) or fall back to per-task serial (demote). Pair with `epic_plan_waves` to get the wave plan when promoted. Use when /swarm epic is on for the session.",agents:["architect"]},epic_plan_waves:{description:"Partition a phase's pending tasks into ordered concurrent waves for Epic Mode dispatch. A wave is a set of tasks with mutually disjoint declared scopes and all dependencies satisfied by prior waves. Returns `{ waves: [{ waveId, taskIds, files }, ...], serializedTasks, degradedTasks }`. "+'For each wave in order, the architect dispatches one `Task(subagent_type="coder", ...)` per `taskId` — all in one assistant message — so the wave runs concurrently and each coder appears as a visible subagent. '+"Wait for the wave to finish before dispatching the next. Pair with `epic_decide_phase` (called first; this tool is only relevant on a `promote` verdict). "+"Preflight reject reasons: `no-plan`, `no-phase`, `phase-empty`, `phase-already-complete`, `scopes-missing` (call `declare_scope` for `missingScopes`), `git-failed` (transient — retry), `planner-error`.",agents:["architect"]},epic_record_divergence:{description:"After every `update_task_status(completed)`, record the task's declared-vs-actual divergence to .swarm/epic/divergence.jsonl. Feeds Epic Mode's self-calibration loop (Capability D). Best-effort: never blocks.",agents:["architect"]}},TOOL_NAMES=Object.keys(TOOL_METADATA),TOOL_NAME_SET=new Set(TOOL_NAMES);TOOL_DESCRIPTIONS=Object.fromEntries(Object.entries(TOOL_METADATA).map(([name,meta])=>[name,meta.description])),AGENT_TOOL_MAP=(()=>{let map=Object.fromEntries(ALL_AGENT_NAMES.map((agent)=>[agent,[]]));for(let[name,meta]of Object.entries(TOOL_METADATA))for(let agent of meta.agents)map[agent].push(name);return map})()});function deepMergeInternal(base,override,depth){if(depth>=10)throw Error("deepMerge exceeded maximum depth of 10");let result={...base};for(let key of Object.keys(override)){let baseVal=base[key],overrideVal=override[key];if(typeof baseVal==="object"&&baseVal!==null&&typeof overrideVal==="object"&&overrideVal!==null&&!Array.isArray(baseVal)&&!Array.isArray(overrideVal))result[key]=deepMergeInternal(baseVal,overrideVal,depth+1);else result[key]=overrideVal}return result}function deepMerge(base,override){if(!base)return override;if(!override)return base;return deepMergeInternal(base,override,0)}var MAX_MERGE_DEPTH=10;function freezeSet(items){let set=new Set(items),proxy=new Proxy(set,{get(target,prop){if(prop==="add"||prop==="delete"||prop==="clear")return()=>{throw TypeError("CLAUDE_CODE_NATIVE_COMMANDS is readonly")};if(prop==="forEach")return(callback,thisArg)=>{let wrapped=(v,k)=>callback.call(thisArg??void 0,v,k,proxy);return set.forEach(wrapped)};let value=Reflect.get(target,prop);return typeof value==="function"?value.bind(target):value},set(){throw TypeError("CLAUDE_CODE_NATIVE_COMMANDS is readonly")},deleteProperty(){throw TypeError("CLAUDE_CODE_NATIVE_COMMANDS is readonly")},defineProperty(){throw TypeError("CLAUDE_CODE_NATIVE_COMMANDS is readonly")},setPrototypeOf(){throw TypeError("CLAUDE_CODE_NATIVE_COMMANDS is readonly")}});return proxy}function isQAAgent(name){return QA_AGENTS.includes(name)}function isSubagent(name){return ALL_SUBAGENT_NAMES.includes(name)}function isLowCapabilityModel(modelId){let lower=(modelId||"").toLowerCase();return LOW_CAPABILITY_MODELS.some((substr)=>lower.includes(substr))}var OPENCODE_NATIVE_AGENTS,CLAUDE_CODE_NATIVE_COMMANDS,MEMORY_AGENT_TOOL_MAP,EXTERNAL_SKILL_TOOL_NAMES,EXTERNAL_SKILL_AGENT_TOOL_MAP,COUNCIL_TOOL_NAMES,COUNCIL_AGENT_TOOL_MAP,GENERAL_COUNCIL_TOOL_NAMES,GENERAL_COUNCIL_AGENT_TOOL_MAP,TURBO_TOOL_NAMES,TURBO_AGENT_TOOL_MAP,SKILL_TOOL_NAMES,SKILL_AGENT_TOOL_MAP,WRITE_TOOL_NAMES,SUMMARIZER_EXEMPT_TOOL_NAMES,DEFAULT_MODELS,DEFAULT_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.132.2",description:"Architect-centric agentic swarm plugin for OpenCode - hub-and-spoke orchestration with SME consultation, code generation, and QA review",main:"dist/index.js",types:"dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",default:"./dist/index.js"},"./package.json":"./package.json"},bin:{"opencode-swarm":"./dist/cli/index.js"},type:"module",engines:{bun:">=1.3.13"},license:"MIT",repository:{type:"git",url:"https://github.com/ZaxbyHub/opencode-swarm.git"},publishConfig:{access:"public",registry:"https://registry.npmjs.org/"},keywords:["opencode","opencode-plugin","ai","agents","orchestration","swarm","multi-agent","llm"],files:["dist","dist/lang/grammars","binaries","evaluation-fixtures",".opencode/skills/brainstorm",".opencode/skills/specify",".opencode/skills/clarify-spec",".opencode/skills/resume",".opencode/skills/clarify",".opencode/skills/discover",".opencode/skills/consult",".opencode/skills/pre-phase-briefing",".opencode/skills/council",".opencode/skills/deep-dive",".opencode/skills/deep-research",".opencode/skills/codebase-review-swarm",".opencode/skills/swarm-implement",".opencode/skills/design-docs",".opencode/skills/swarm-pr-review",".opencode/skills/swarm",".opencode/skills/swarm-pr-feedback",".opencode/skills/swarm-pr-subscribe",".opencode/skills/swarm-ci-monitor",".opencode/skills/issue-ingest",".opencode/skills/plan",".opencode/skills/critic-gate",".opencode/skills/execute",".opencode/skills/phase-wrap",".opencode/skills/loop",".opencode/skills/writing-tests",".opencode/skills/running-tests",".opencode/skills/engineering-conventions",".opencode/skills/commit-pr",".opencode/skills/ci-failure-batching",".opencode/skills/gate-attribution",".opencode/skills/merge-queue-readiness",".opencode/skills/skill-edit-validation",".opencode/skills/worktree-retry-cleanup",".opencode/skills/test-file-split",".opencode/skills/fork-pr-operations",".opencode/skills/parallel-work-check",".opencode/skills/ci-fix-monitor",".opencode/skills/issue-tracer","tests/fixtures/memory-recall","README.md","LICENSE"],scripts:{clean:`bun -e "require('fs').rmSync('dist',{recursive:true,force:true})"`,build:"bun run clean && bun run scripts/copy-grammars.ts && bun build src/index.ts --outdir dist --target node --format esm --external web-tree-sitter --minify-whitespace --minify-syntax && bun build src/cli/index.ts --outdir dist/cli --target bun --format esm --external bash-parser --splitting && bun run scripts/copy-grammars.ts --to-dist && tsc --emitDeclarationOnly",typecheck:"tsc --noEmit",test:"bun test",lint:"biome lint .","lint:ci":"biome ci .","test:unit:ci":"bun scripts/ci/run-unit-tests-local.ts","drift:check":"bun run scripts/drift-check.ts","drift:fix":"bun run scripts/drift-check.ts --fix --confirm","skills:sync":"bun run scripts/sync-qa-gate-skills.ts",format:"biome format . --write",check:"biome check --write .",dev:"bun run build && opencode","package:smoke":"node scripts/package-smoke.mjs",prepare:"bun run build","repro:704":"node scripts/repro-704.mjs","repro:1144":"bun scripts/repro-1144.mjs","repro:1873":"bun build scripts/repro-1873-entry.ts --outdir dist-build-test/repro-1873 --target node --format esm && node scripts/repro-1873.mjs"},dependencies:{"@opencode-ai/plugin":"^1.18.3","@opencode-ai/sdk":"^1.18.3","@vscode/tree-sitter-wasm":"^0.3.0","bash-parser":"^0.5.0","p-limit":"^7.3.0",picomatch:"^4.0.4","proper-lockfile":"^4.1.2","quick-lru":"^7.3.0","web-tree-sitter":"^0.25.0",zod:"^4.1.8"},devDependencies:{"@biomejs/biome":"2.3.14","@types/picomatch":"^4.0.3","bun-types":"1.3.8","js-yaml":"^4.1.1",typescript:"^5.7.3"}}});var QA_AGENTS,PIPELINE_AGENTS,ORCHESTRATOR_NAME="architect",ALL_SUBAGENT_NAMES,ALL_AGENT_NAMES;var init_agent_names=__esm(()=>{QA_AGENTS=["reviewer","critic","critic_oversight"],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_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_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"],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","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","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_oversight"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},sast_scan:{description:"static analysis security scan",agents:["architect","reviewer","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"]},quality_budget:{description:"code quality budget check",agents:["architect"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},symbols:{description:"extract exported symbols (functions, classes, interfaces, types) from source files; supports TypeScript, JavaScript, and Python",agents:["architect","sme","researcher","docs","docs_design","designer","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","spec_writer","reviewer","critic","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","critic_oversight","explorer","test_engineer"]},schema_drift:{description:"OpenAPI spec vs route drift",agents:["architect","sme","researcher","docs","explorer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},todo_extract:{description:"structured TODO/FIXME extraction",agents:["architect","researcher","docs","explorer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},evidence_check:{description:"verify task evidence completeness",agents:["architect","critic_oversight"]},check_gate_status:{description:"check the gate status of a specific task",agents:["architect","critic_oversight"]},completion_verify:{description:"verify completed tasks have required evidence",agents:["architect","critic_oversight"]},complete_pr_workflow:{description:"validate terminal PR workflow evidence and clear its durable session gate",agents:["architect"]},abort_pr_workflow:{description:"abort an unrecoverable PR_REVIEW/PR_FEEDBACK mechanical gate and clear its durable session state",agents:["architect"]},prepare_pr_workflow_checkout:{description:"preserve explicit dirty tracked files before an unbound PR workflow checkout with an auditable recovery receipt",agents:["architect"]},run_pr_feedback_stage_a:{description:"execute and persist mandatory PR-feedback Stage A checks on a content-bound revision",agents:["architect"]},submit_council_verdicts:{description:"submit pre-collected council member verdicts for synthesis (architect MUST dispatch critic/reviewer/sme/test_engineer/explorer as Agent tasks first; this tool synthesizes only, it does not contact members)",agents:[]},submit_phase_council_verdicts:{description:"submit pre-collected phase-level council member verdicts for holistic phase synthesis (architect MUST dispatch all 5 council members with phase-scoped context first; this tool synthesizes only, it does not contact members)",agents:[]},declare_council_criteria:{description:"pre-declare acceptance criteria for a task before the coder starts work; criteria are read back during council evaluation",agents:[]},sbom_generate:{description:"SBOM generation for dependency inventory",agents:["architect"]},checkpoint:{description:"create named git checkpoints for save, restore, and delete — use before risky operations to enable rollback",agents:["architect"]},pkg_audit:{description:"dependency vulnerability scan — npm/pip/cargo",agents:["architect","critic_hallucination_verifier","reviewer","critic_oversight","test_engineer"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},parse_lane_candidates:{description:"Parse [CANDIDATE] rows from a dispatch_lanes or collect_lane_results artifact (by output_ref), produce structured records with provenance, optionally persist to a per-batch sidecar JSONL. Pure-parser variant exists as internal module.",agents:["architect"]},plan_conflict_check:{description:"read-only advisory check (#1656): compute a pairwise file-conflict matrix for N proposed parallel task groups using declared scopes and optional git co-change; returns a verdict (all_disjoint / conflicts_present / unknown_scopes), per-pair evidence, and a suggested serialization order. Writes nothing — the execution gate independently recomputes the verdict inline at dispatch time via the same helper. Call BEFORE attempting parallel dispatch to confirm disjointness.",agents:["architect"]},write_pr_review_trigger_eval:{description:"persist the complete PR-review trigger evaluation with exact-set validation, dispatch provenance, and live merge-base verification",agents:["architect"]},write_pr_review_artifact:{description:"persist schema-validated PR-review findings checkpoints and exact actionable feedback handoffs under the active run",agents:["architect"]},prepare_pr_feedback_scope:{description:"prepare an exact file scope for one PR-feedback coder Task after immutable feedback verification settles",agents:["architect"]},test_runner:{description:"auto-detect and run tests",agents:["architect","reviewer","test_engineer"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},test_impact:{description:"identify test files impacted by changed source files via import analysis",agents:["architect","reviewer","critic_oversight","test_engineer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},mutation_test:{description:"executes pre-generated mutation patches against tests, evaluates kill rate against quality gate thresholds",agents:["architect","test_engineer"]},generate_mutants:{description:"generate LLM-based mutation testing patches for source files; returns MutationPatch[] for direct consumption by the mutation_test tool",agents:["architect"]},detect_domains:{description:"detect which SME domains are relevant for a given text",agents:["architect","sme","docs","docs_design","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic","critic_oversight","explorer"]},git_blame:{description:"per-line git blame metadata: sha, author, date, summary for each line in a file",agents:["reviewer","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","coder","test_engineer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},retrieve_lane_output:{description:"retrieve paged full dispatch lane output by output_ref; use before consuming truncated lane previews or routing candidates from lane results",agents:["architect"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},extract_code_blocks:{description:"extract code blocks from text content and save them to files",agents:["docs","docs_design","designer","spec_writer","coder","test_engineer"]},phase_complete:{description:"mark a phase as complete and track dispatched agents",agents:["architect"]},save_plan:{description:"save a structured implementation plan",agents:["architect"]},update_task_status:{description:"mark tasks complete, track phase progress",agents:["architect"]},lint_spec:{description:"validate .swarm/spec.md format and required fields",agents:["architect","spec_writer"]},write_retro:{description:"document phase retrospectives via phase_complete workflow, capture lessons learned",agents:["architect"]},write_drift_evidence:{description:"write drift verification evidence for a completed phase",agents:["architect"]},write_hallucination_evidence:{description:"write hallucination verification evidence for a completed phase",agents:["architect"]},write_mutation_evidence:{description:"write mutation gate evidence for a completed phase; normalizes PASS/WARN/FAIL/SKIP verdicts and writes .swarm/evidence/{phase}/mutation-gate.json",agents:["architect"]},declare_scope:{description:"declare file scope for next coder delegation",agents:["architect"]},knowledge_query:{description:"query swarm or hive knowledge with optional filters",agents:["architect","skill_improver","spec_writer"]},doc_scan:{description:"scan project documentation files and build an index manifest",agents:["architect","docs_design","skill_improver","spec_writer","explorer"]},doc_extract:{description:"extract actionable constraints from project documentation",agents:["architect","docs_design","skill_improver","spec_writer"]},curator_analyze:{description:"run curator phase analysis and optionally apply knowledge recommendations",agents:["architect"]},consensus_mine:{description:"mine cross-run consensus from existing .swarm evidence into an immutable proposals-only report; also deletes its own reports past consensus.report_retention, appends to the shared recommendation dedup ledger (in the shared cohort root, outside this project, when a knowledge link is active), and mirrors proposals into pending swarm-memory proposals when memory is enabled",agents:["architect","curator_phase","curator_postmortem"]},knowledge_add:{description:"store a new lesson in the knowledge base",agents:["architect","coder"]},knowledge_recall:{description:"search the knowledge base for relevant past decisions",agents:["architect","sme","docs","docs_design","designer","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic_architecture_supervisor","curator_init","curator_phase","skill_improver","spec_writer","reviewer","critic","critic_oversight","explorer","coder","test_engineer"]},knowledge_remove:{description:"delete an outdated swarm knowledge entry by ID (swarm tier only)",agents:["architect"]},co_change_analyzer:{description:"detect hidden couplings by analyzing git history",agents:["architect"]},context_status:{description:"report current context-window headroom for the active session — returns tokens-used, model-limit, usage-percent, threshold-state (none/warn/critical), model name, and provider. Pure read-only: no state mutation, no warning injection. Works whether context_budget.enabled is true or false.",agents:["architect"]},search:{description:"Workspace-scoped ripgrep-style text search with structured JSON output. Supports literal and regex modes, glob filtering, and result limits. NOTE: This is text search, not structural AST search — use symbols and imports tools for structural queries.",agents:["architect","sme","docs","docs_design","designer","critic_hallucination_verifier","skill_improver","spec_writer","reviewer","critic_oversight","explorer","coder","test_engineer","researcher"]},ast_grep:{description:"Read-only structural AST search using ast-grep patterns with optional language and glob filters. Use for syntax-aware code pattern searches; does not rewrite files.",agents:["architect","sme","docs","docs_design","critic_hallucination_verifier","spec_writer","explorer","coder","test_engineer","researcher"]},actionlint_scan:{description:"Run actionlint against GitHub Actions workflow YAML files with structured findings. Resolves actionlint lazily and does not modify files.",agents:["architect","test_engineer"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},osv_scan:{description:"Run OSV-Scanner against a workspace path and return structured dependency vulnerability findings. Resolves osv-scanner lazily and does not modify files.",agents:["architect","test_engineer"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},gh_evidence:{description:"Fetch bounded GitHub pull request or issue metadata through gh for review and CI evidence. Resolves gh lazily and is read-only.",agents:["architect","researcher"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},pr_workflow_status:{description:"Read-only architect observation of local git state (HEAD, branch, clean/dirty with a bounded changed-file list, remotes) plus a session-pinned PR workflow gate summary. Use to observe state under the fail-closed PR_REVIEW/PR_FEEDBACK gate. Never executes PR-controlled scripts and never reads another session gate.",agents:["architect"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},batch_symbols:{description:"Batched symbol extraction across multiple files. Returns per-file symbol summaries with isolated error handling.",agents:["architect","critic_hallucination_verifier","reviewer","critic_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"]},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","critic_oversight","explorer","coder"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},get_qa_gate_profile:{description:"retrieve the QA gate profile for the current plan: gates (reviewer, test_engineer, sme_enabled, critic_pre_plan, sast_enabled, council_mode, hallucination_guard, mutation_test, phase_council, drift_check, final_council), lock state, and profile hash. Read-only.",agents:["architect"]},set_qa_gates:{description:"configure the QA gate profile for the current plan. Architect-only. Ratchet-tighter only — rejected once the profile is locked after critic approval. Supports: reviewer, test_engineer, sme_enabled, critic_pre_plan, sast_enabled, council_mode, hallucination_guard, mutation_test, phase_council, drift_check, final_council.",agents:["architect"]},web_search:{description:"External web search (Tavily or Brave) for architect-driven council research, SME domain research, researcher auto-research, and skill-improver research. Returns titled results with snippets, URLs, normalized query metadata, temporal intent, freshness, and removed stale years. Config-gated on council.general.enabled in the resolved config: global ~/.config/opencode/opencode-swarm.json, then project .opencode/opencode-swarm.json overrides. Requires a search API key. Used by the architect in MODE: COUNCIL to gather a RESEARCH CONTEXT before dispatching council agents, by SME for opt-in external skill/source evaluation, and by the researcher agent for multi-source auto-research.",agents:["sme","researcher","skill_improver"]},web_fetch:{description:"Fetch the readable text of a single http(s) URL (architect-only). Returns decoded page text, document title, final URL after redirects, and an evidence reference. Reads primary sources that web_search only surfaces as snippets. Config-gated on council.general.enabled. Blocks private/loopback/link-local/metadata addresses (re-validated and re-pinned across redirects); enforces timeout and body size cap.",agents:[]},convene_general_council:{description:"Synthesize responses from a multi-model General Council. Accepts parallel member responses (Round 1, optionally Round 2), detects disagreements, and returns consensus points, persisting disagreements, and a structured synthesis. Architect-only. Config-gated on council.general.enabled in the resolved config: global ~/.config/opencode/opencode-swarm.json, then project .opencode/opencode-swarm.json overrides.",agents:[]},write_final_council_evidence:{description:"Persist project-scoped final council evidence to .swarm/evidence/final-council.json. PREREQUISITE: dispatch critic, reviewer, sme, test_engineer, and explorer as project-scoped Agent tasks and collect their CouncilMemberVerdict JSON — this tool synthesizes only. Rejects on insufficient quorum or CONCERNS with unresolved requiredFixes; normalizes verdicts to approved/concerns/rejected. Architect-only.",agents:[]},skill_generate:{description:"compile knowledge entries into a structured SKILL.md draft",agents:["skill_improver"]},skill_list:{description:"list generated skill files and their status",agents:["skill_improver"]},skill_apply:{description:"activate a draft skill proposal",agents:[]},skill_inspect:{description:"inspect the content and source entries of a skill file",agents:["skill_improver"]},run_stale_reconciliation:{description:"reconcile skills against the knowledge store: mark skills stale when source knowledge is archived or deleted, or clear stale markers",agents:["architect"]},skill_regenerate:{description:"regenerate an active skill by re-clustering its source knowledge entries and updating the SKILL.md in place",agents:[]},skill_retire:{description:"retire a generated skill by adding a retired.marker file; retired skills are excluded from scoring and injection",agents:[]},skill_improve:{description:"run the skill_improver agent to review and refine skills",agents:["skill_improver"]},spec_write:{description:"author or update .swarm/spec.md for the current project",agents:["spec_writer"]},knowledge_receipt:{description:"file a receipt for retrieved knowledge (applied/ignored/contradicted + new lessons), recorded as immutable knowledge events",agents:["architect","sme","docs","docs_design","designer","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic_architecture_supervisor","curator_init","curator_phase","skill_improver","spec_writer","reviewer","critic","coder","test_engineer"]},knowledge_archive:{description:"archive (default), quarantine, or purge a swarm or hive knowledge entry by ID with an immutable audit tombstone; purge requires an admin flag",agents:["architect"]},swarm_memory_recall:{description:"recall scoped Swarm memory for the current repository as untrusted background",agents:[]},swarm_memory_propose:{description:"create a pending Swarm memory proposal; does not write durable memory directly",agents:[]},swarm_command:{description:"run supported /swarm commands through the canonical command registry",agents:["architect","sme","researcher","docs","docs_design","designer","reviewer","critic","explorer","coder","test_engineer"]},dispatch_lanes:{description:"dispatch read-only exploration/review lanes concurrently and BLOCK until all finish; prefer dispatch_lanes_async for non-blocking dispatch, use this only when promptAsync is unavailable",agents:["architect"]},dispatch_lanes_async:{description:"launch read-only advisory lanes non-blockingly and return a batch id plus lane session handles immediately so you can keep working; launch_timeout_ms is only a promptAsync acceptance budget, not a lane runtime timeout; poll incrementally with collect_lane_results (wait omitted or false) while doing independent investigation, or join with wait: true when you need all results",agents:["architect"]},collect_lane_results:{description:"collect or poll results for a dispatch_lanes_async batch; supports both non-blocking polling (wait omitted or false) and blocking join (wait: true). Non-blocking polls include pending lane identities by default and process settled lanes incrementally while continuing independent work; busy/retry lanes are not timed out just because they run for a long time. Does not advance workflow gates. Inline output for a settled lane is delivered only once: later polls of the same lane set output_omitted_repeat: true and omit output, but still include output_ref for recovery via retrieve_lane_output.",agents:["architect"]},summarize_work:{description:"emit a short structured summary of completed work (key decisions, assumptions, risks, constraints) at task completion; rolls up per phase for architecture-supervisor review. Advisory, never blocks.",agents:["architect","sme","researcher","docs","docs_design","designer","explorer","coder","test_engineer"]},write_architecture_supervisor_evidence:{description:"persist the architecture supervisor verdict for a phase (architect MUST dispatch critic_architecture_supervisor first and collect its JSON verdict; this tool persists only, it does not contact the supervisor)",agents:["architect"]},lean_turbo_plan_lanes:{description:"partition phase tasks into parallel lanes based on file-scope conflicts for Lean Turbo execution",agents:[]},lean_turbo_acquire_locks:{description:"acquire file locks for all files in a lane (all-or-nothing) before lane execution",agents:[]},lean_turbo_runner_status:{description:"read Lean Turbo run state from .swarm/turbo-state.json",agents:[]},lean_turbo_review:{description:"dispatch a read-only reviewer agent to evaluate a completed Lean Turbo phase",agents:[]},lean_turbo_run_phase:{description:"Execute a phase using Lean Turbo parallel lane execution. Plans lanes, acquires file locks, and dispatches coder agents concurrently. Use when Lean Turbo is active and you want to execute all tasks in a phase in parallel lanes.",agents:[]},lean_turbo_status:{description:"returns Lean Turbo configuration and active status for the current session",agents:[]},swarm_apply_patch:{description:"Apply a unified diff patch to workspace files with exact context matching, atomic writes, and path validation. Use standard unified diff format only — does NOT support *** Begin Patch / *** Update File payloads (use native apply_patch for those).",agents:["coder","test_engineer"]},external_skill_discover:{description:"Discover external skill candidates from configured sources. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_list:{description:"List external skill candidates in the quarantine store. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_inspect:{description:"Inspect a specific external skill candidate by ID. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_promote:{description:"Promote a validated external skill candidate to an active generated skill. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_reject:{description:"Reject an external skill candidate after evaluation. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_delete:{description:"Delete an external skill candidate from the quarantine store. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_revoke:{description:"Revoke a previously promoted external skill. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},epic_decide_phase:{description:"Compute the Epic Mode verdict for a phase WITHOUT dispatching coders. Runs preflight + calibration + the three gates (p-threshold, hot-module, greenfield), persists the decision, and returns the verdict so the architect can dispatch waves via the visible Task tool (promote) or fall back to per-task serial (demote). Pair with `epic_plan_waves` to get the wave plan when promoted. Use when /swarm epic is on for the session.",agents:["architect"]},epic_plan_waves:{description:"Partition a phase's pending tasks into ordered concurrent waves for Epic Mode dispatch. A wave is a set of tasks with mutually disjoint declared scopes and all dependencies satisfied by prior waves. Returns `{ waves: [{ waveId, taskIds, files }, ...], serializedTasks, degradedTasks }`. "+'For each wave in order, the architect dispatches one `Task(subagent_type="coder", ...)` per `taskId` — all in one assistant message — so the wave runs concurrently and each coder appears as a visible subagent. '+"Wait for the wave to finish before dispatching the next. Pair with `epic_decide_phase` (called first; this tool is only relevant on a `promote` verdict). "+"Preflight reject reasons: `no-plan`, `no-phase`, `phase-empty`, `phase-already-complete`, `scopes-missing` (call `declare_scope` for `missingScopes`), `git-failed` (transient — retry), `planner-error`.",agents:["architect"]},epic_record_divergence:{description:"After every `update_task_status(completed)`, record the task's declared-vs-actual divergence to .swarm/epic/divergence.jsonl. Feeds Epic Mode's self-calibration loop (Capability D). Best-effort: never blocks.",agents:["architect"]}},TOOL_NAMES=Object.keys(TOOL_METADATA),TOOL_NAME_SET=new Set(TOOL_NAMES);TOOL_DESCRIPTIONS=Object.fromEntries(Object.entries(TOOL_METADATA).map(([name,meta])=>[name,meta.description])),AGENT_TOOL_MAP=(()=>{let map=Object.fromEntries(ALL_AGENT_NAMES.map((agent)=>[agent,[]]));for(let[name,meta]of Object.entries(TOOL_METADATA))for(let agent of meta.agents)map[agent].push(name);return map})()});function deepMergeInternal(base,override,depth){if(depth>=10)throw Error("deepMerge exceeded maximum depth of 10");let result={...base};for(let key of Object.keys(override)){let baseVal=base[key],overrideVal=override[key];if(typeof baseVal==="object"&&baseVal!==null&&typeof overrideVal==="object"&&overrideVal!==null&&!Array.isArray(baseVal)&&!Array.isArray(overrideVal))result[key]=deepMergeInternal(baseVal,overrideVal,depth+1);else result[key]=overrideVal}return result}function deepMerge(base,override){if(!base)return override;if(!override)return base;return deepMergeInternal(base,override,0)}var MAX_MERGE_DEPTH=10;function freezeSet(items){let set=new Set(items),proxy=new Proxy(set,{get(target,prop){if(prop==="add"||prop==="delete"||prop==="clear")return()=>{throw TypeError("CLAUDE_CODE_NATIVE_COMMANDS is readonly")};if(prop==="forEach")return(callback,thisArg)=>{let wrapped=(v,k)=>callback.call(thisArg??void 0,v,k,proxy);return set.forEach(wrapped)};let value=Reflect.get(target,prop);return typeof value==="function"?value.bind(target):value},set(){throw TypeError("CLAUDE_CODE_NATIVE_COMMANDS is readonly")},deleteProperty(){throw TypeError("CLAUDE_CODE_NATIVE_COMMANDS is readonly")},defineProperty(){throw TypeError("CLAUDE_CODE_NATIVE_COMMANDS is readonly")},setPrototypeOf(){throw TypeError("CLAUDE_CODE_NATIVE_COMMANDS is readonly")}});return proxy}function isQAAgent(name){return QA_AGENTS.includes(name)}function isSubagent(name){return ALL_SUBAGENT_NAMES.includes(name)}function isLowCapabilityModel(modelId){let lower=(modelId||"").toLowerCase();return LOW_CAPABILITY_MODELS.some((substr)=>lower.includes(substr))}var OPENCODE_NATIVE_AGENTS,CLAUDE_CODE_NATIVE_COMMANDS,MEMORY_AGENT_TOOL_MAP,EXTERNAL_SKILL_TOOL_NAMES,EXTERNAL_SKILL_AGENT_TOOL_MAP,COUNCIL_TOOL_NAMES,COUNCIL_AGENT_TOOL_MAP,GENERAL_COUNCIL_TOOL_NAMES,GENERAL_COUNCIL_AGENT_TOOL_MAP,TURBO_TOOL_NAMES,TURBO_AGENT_TOOL_MAP,SKILL_TOOL_NAMES,SKILL_AGENT_TOOL_MAP,WRITE_TOOL_NAMES,SUMMARIZER_EXEMPT_TOOL_NAMES,DEFAULT_MODELS,DEFAULT_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
|
|
|
@@ -556,17 +556,17 @@ No plan content available. Start by creating a .swarm/plan.md file.
|
|
|
556
556
|
You have produced ${count} consecutive responses without using any tools. You MUST call a tool in your next response.
|
|
557
557
|
[/RUNAWAY OUTPUT STOP]
|
|
558
558
|
|
|
559
|
-
`+stopPart.text}consecutiveNoToolTurns.set(sessionId,0)}else if(count>=3){if(session){if(session.pendingAdvisoryMessages??=[],!session.pendingAdvisoryMessages.some((m)=>m.includes(
|
|
559
|
+
`+stopPart.text}consecutiveNoToolTurns.set(sessionId,0)}else if(count>=3){if(session){if(session.pendingAdvisoryMessages??=[],!session.pendingAdvisoryMessages.some((m)=>m.includes(RUNAWAY_OUTPUT_ADVISORY_MARKER)))session.pendingAdvisoryMessages.push(`WARNING: ${RUNAWAY_OUTPUT_ADVISORY_MARKER}. ${count} consecutive high-output responses without tool calls detected. Use a tool or report BLOCKED.`)}}}else if((lastAssistantMsg.parts?.filter((p)=>p.type==="text"&&typeof p.text==="string").reduce((sum,p)=>sum+p.text.length,0)??0)<200)consecutiveNoToolTurns.set(sessionId,0)}}if(isArchitectSession&&session?.loopWarningPending){let pending=session.loopWarningPending;session.loopWarningPending=void 0,telemetry.loopDetected(_input.sessionID,session.agentName,pending.message);let loopSystemMsg=systemMessages[0];if(loopSystemMsg){let loopTextPart=(loopSystemMsg.parts??[]).find((part)=>part.type==="text"&&typeof part.text==="string");if(loopTextPart&&!loopTextPart.text.includes("LOOP DETECTED"))loopTextPart.text=`[LOOP WARNING]
|
|
560
560
|
${pending.message}
|
|
561
561
|
[/LOOP WARNING]
|
|
562
562
|
|
|
563
|
-
`+loopTextPart.text}}if(isArchitectSession&&(session?.pendingAdvisoryMessages?.length??0)>0){let advisories=session.pendingAdvisoryMessages??[],targetMsg=systemMessages[0];if(!targetMsg){let newMsg={info:{role:"system"},parts:[{type:"text",text:""}]};messages.unshift(newMsg),targetMsg=newMsg}let textPart2=(targetMsg.parts??[]).find((part)=>part.type==="text"&&typeof part.text==="string");if(textPart2){let
|
|
563
|
+
`+loopTextPart.text}}if(isArchitectSession&&(session?.pendingAdvisoryMessages?.length??0)>0){let advisories=session.pendingAdvisoryMessages??[],targetMsg=systemMessages[0];if(!targetMsg){let newMsg={info:{role:"system"},parts:[{type:"text",text:""}]};messages.unshift(newMsg),targetMsg=newMsg}let textPart2=(targetMsg.parts??[]).find((part)=>part.type==="text"&&typeof part.text==="string");if(textPart2){let seenAdvisories=new Set,cleanedAdvisories=[];for(let advisory of advisories){if(!advisory.trim())continue;if(seenAdvisories.has(advisory))continue;seenAdvisories.add(advisory),cleanedAdvisories.push(advisory)}if(cleanedAdvisories.length>0){let joined=cleanedAdvisories.join(`
|
|
564
564
|
---
|
|
565
565
|
`);textPart2.text=`[ADVISORIES]
|
|
566
566
|
${joined}
|
|
567
567
|
[/ADVISORIES]
|
|
568
568
|
|
|
569
|
-
${textPart2.text}`}session.pendingAdvisoryMessages=[]}else if(!isArchitectSession&&session&&(session.pendingAdvisoryMessages?.length??0)>0){let allAdvisories=session.pendingAdvisoryMessages??[],TRANSIENT_PREFIXES=["TRANSIENT ERROR:","MODEL FALLBACK:","DEGRADED:","[pr-monitor:"],transientAdvisories=allAdvisories.filter((m)=>TRANSIENT_PREFIXES.some((p)=>m.startsWith(p)));if(transientAdvisories.length>0){let targetMsg=systemMessages[0];if(!targetMsg){let newMsg={info:{role:"system"},parts:[{type:"text",text:""}]};messages.unshift(newMsg),targetMsg=newMsg}let textPart2=(targetMsg.parts??[]).find((part)=>part.type==="text"&&typeof part.text==="string");if(textPart2){let joined=transientAdvisories.join(`
|
|
569
|
+
${textPart2.text}`}}if(textPart2)session.pendingAdvisoryMessages=[]}else if(!isArchitectSession&&session&&(session.pendingAdvisoryMessages?.length??0)>0){let allAdvisories=session.pendingAdvisoryMessages??[],TRANSIENT_PREFIXES=["TRANSIENT ERROR:","MODEL FALLBACK:","DEGRADED:","[pr-monitor:"],transientAdvisories=allAdvisories.filter((m)=>TRANSIENT_PREFIXES.some((p)=>m.startsWith(p)));if(transientAdvisories.length>0){let targetMsg=systemMessages[0];if(!targetMsg){let newMsg={info:{role:"system"},parts:[{type:"text",text:""}]};messages.unshift(newMsg),targetMsg=newMsg}let textPart2=(targetMsg.parts??[]).find((part)=>part.type==="text"&&typeof part.text==="string");if(textPart2){let joined=transientAdvisories.join(`
|
|
570
570
|
---
|
|
571
571
|
`);textPart2.text=`[ADVISORIES]
|
|
572
572
|
${joined}
|
|
@@ -614,7 +614,7 @@ Do not acknowledge or reference this guidance in your response.
|
|
|
614
614
|
|
|
615
615
|
`+textPart.text;else if(targetWindow.warningIssued){let reasonSuffix=targetWindow.warningReason?` (${targetWindow.warningReason})`:"";textPart.text=`[⚠️ APPROACHING LIMITS${reasonSuffix}: You still have capacity to finish your current step. Complete what you're working on, then return your results.]
|
|
616
616
|
|
|
617
|
-
`+textPart.text}}}function extractPhaseNumber(phaseString){if(!phaseString)return 1;let match=phaseString.match(/^Phase (\d+):/);return match?parseInt(match[1],10):1}function getCurrentTaskId2(sessionId){return swarmState.agentSessions.get(sessionId)?.currentTaskId??`${sessionId}:unknown`}var TRANSIENT_PROVIDER_RECOVERY_TAG="TRANSIENT PROVIDER RECOVERY";var init_messages_transform=__esm(()=>{init_agents2();init_constants();init_schema();init_manager();init_state2();init_telemetry();init_utils();init_provider_error_classification();init_extractors();init_model_limits();init_file_authority()});function hasOwn(source,key){return typeof source==="object"&&source!==null&&Object.hasOwn(source,key)}function readOwn(source,key){if(!hasOwn(source,key))return;try{return source[key]}catch{return}}function signalFrom(value){if(typeof value==="string")return value;if(value instanceof Error)return`${value.name}: ${value.message}`;if(typeof value==="number"||typeof value==="boolean")return String(value);if(typeof value!=="object"||value===null)return"";let source=value;return["name","message","code","status","statusCode"].map((key)=>signalFrom(readOwn(source,key))).filter(Boolean).join(" ")}function getOriginalCommand(input,correlation){if(correlation)return correlation.originalCommand;return typeof input.args?.command==="string"?input.args.command:""}function isShellTool(tool){let normalized=tool.toLowerCase();return normalized==="bash"||normalized==="shell"}function isSimpleCommand(command){return command.length>0&&!/[;&|<>\r\n]/.test(command)}function isNeutralExitOne(command){let trimmed=command.trim();if(!isSimpleCommand(trimmed))return!1;let tokens=trimmed.match(/"[^"]*"|'[^']*'|\S+/g)?.map((token)=>token.replace(/^(["'])(.*)\1$/,"$2"))??[],executable=tokens[0]?.toLowerCase();if(executable==="rg"||executable==="rg.exe")return!0;if(executable!=="git"&&executable!=="git.exe")return!1;let subcommandIndex=1;while(tokens[subcommandIndex]==="-C"&&tokens[subcommandIndex+1])subcommandIndex+=2;return tokens[subcommandIndex]?.toLowerCase()==="diff"&&tokens.slice(subcommandIndex+1).includes("--quiet")}function classifyFatalSignal(signal,sandboxWrapped){if(/\[sandbox\]\s+BLOCKED:/i.test(signal))return"sandbox_wrapper_failure";if(/\b(?:MissingEndCurlyBrace|ParserError|ParseError|IncompleteParseException)\b/i.test(signal))return sandboxWrapped?"sandbox_wrapper_failure":"shell_parse_error";if(/\bCommandNotFoundException\b/i.test(signal)||/\bis not recognized as (?:the name of a cmdlet|an internal or external command)\b/i.test(signal)||/\bcommand not found\b/i.test(signal)||/(?:^|\n)(?:\/bin\/)?(?:ba|da|z|k)?sh(?:\.exe)?:\s+(?:(?:line\s+)?\d+:\s+)?[^:\r\n]+:\s+not found\b/im.test(signal)||/\b(?:spawn|execFile)\s+\S+\s+ENOENT\b/i.test(signal))return"command_not_found";return null}function classifyToolOutcome(input,output,correlation){let explicitError=signalFrom(readOwn(output,"error")),explicitFailure=explicitError.length>0||readOwn(output,"success")===!1||output.output===null||output.output===void 0,shell=isShellTool(input.tool),metadata=output.metadata,exitPresent=shell&&(hasOwn(metadata,"exit")||hasOwn(metadata,"exitCode")),exit=hasOwn(metadata,"exit")?readOwn(metadata,"exit"):readOwn(metadata,"exitCode"),originalCommand=getOriginalCommand(input,correlation),correlatedWrappedCommand=correlation!==void 0&&typeof input.args?.command==="string"&&input.args.command!==correlation.originalCommand,neutralExitOne=exit===1&&isNeutralExitOne(originalCommand),outputSignal=typeof output.output==="string"?output.output:"",signal=[explicitError,outputSignal].filter(Boolean).join(`
|
|
617
|
+
`+textPart.text}}}function extractPhaseNumber(phaseString){if(!phaseString)return 1;let match=phaseString.match(/^Phase (\d+):/);return match?parseInt(match[1],10):1}function getCurrentTaskId2(sessionId){return swarmState.agentSessions.get(sessionId)?.currentTaskId??`${sessionId}:unknown`}var TRANSIENT_PROVIDER_RECOVERY_TAG="TRANSIENT PROVIDER RECOVERY",RUNAWAY_OUTPUT_ADVISORY_MARKER="Model is generating analysis without taking action";var init_messages_transform=__esm(()=>{init_agents2();init_constants();init_schema();init_manager();init_state2();init_telemetry();init_utils();init_provider_error_classification();init_extractors();init_model_limits();init_file_authority()});function hasOwn(source,key){return typeof source==="object"&&source!==null&&Object.hasOwn(source,key)}function readOwn(source,key){if(!hasOwn(source,key))return;try{return source[key]}catch{return}}function signalFrom(value){if(typeof value==="string")return value;if(value instanceof Error)return`${value.name}: ${value.message}`;if(typeof value==="number"||typeof value==="boolean")return String(value);if(typeof value!=="object"||value===null)return"";let source=value;return["name","message","code","status","statusCode"].map((key)=>signalFrom(readOwn(source,key))).filter(Boolean).join(" ")}function getOriginalCommand(input,correlation){if(correlation)return correlation.originalCommand;return typeof input.args?.command==="string"?input.args.command:""}function isShellTool(tool){let normalized=tool.toLowerCase();return normalized==="bash"||normalized==="shell"}function isSimpleCommand(command){return command.length>0&&!/[;&|<>\r\n]/.test(command)}function isNeutralExitOne(command){let trimmed=command.trim();if(!isSimpleCommand(trimmed))return!1;let tokens=trimmed.match(/"[^"]*"|'[^']*'|\S+/g)?.map((token)=>token.replace(/^(["'])(.*)\1$/,"$2"))??[],executable=tokens[0]?.toLowerCase();if(executable==="rg"||executable==="rg.exe")return!0;if(executable!=="git"&&executable!=="git.exe")return!1;let subcommandIndex=1;while(tokens[subcommandIndex]==="-C"&&tokens[subcommandIndex+1])subcommandIndex+=2;return tokens[subcommandIndex]?.toLowerCase()==="diff"&&tokens.slice(subcommandIndex+1).includes("--quiet")}function classifyFatalSignal(signal,sandboxWrapped){if(/\[sandbox\]\s+BLOCKED:/i.test(signal))return"sandbox_wrapper_failure";if(/\b(?:MissingEndCurlyBrace|ParserError|ParseError|IncompleteParseException)\b/i.test(signal))return sandboxWrapped?"sandbox_wrapper_failure":"shell_parse_error";if(/\bCommandNotFoundException\b/i.test(signal)||/\bis not recognized as (?:the name of a cmdlet|an internal or external command)\b/i.test(signal)||/\bcommand not found\b/i.test(signal)||/(?:^|\n)(?:\/bin\/)?(?:ba|da|z|k)?sh(?:\.exe)?:\s+(?:(?:line\s+)?\d+:\s+)?[^:\r\n]+:\s+not found\b/im.test(signal)||/\b(?:spawn|execFile)\s+\S+\s+ENOENT\b/i.test(signal))return"command_not_found";return null}function classifyToolOutcome(input,output,correlation){let explicitError=signalFrom(readOwn(output,"error")),explicitFailure=explicitError.length>0||readOwn(output,"success")===!1||output.output===null||output.output===void 0,shell=isShellTool(input.tool),metadata=output.metadata,exitPresent=shell&&(hasOwn(metadata,"exit")||hasOwn(metadata,"exitCode")),exit=hasOwn(metadata,"exit")?readOwn(metadata,"exit"):readOwn(metadata,"exitCode"),originalCommand=getOriginalCommand(input,correlation),correlatedWrappedCommand=correlation!==void 0&&typeof input.args?.command==="string"&&input.args.command!==correlation.originalCommand,neutralExitOne=exit===1&&isNeutralExitOne(originalCommand),outputSignal=typeof output.output==="string"?output.output:"",signal=[explicitError,outputSignal].filter(Boolean).join(`
|
|
618
618
|
`),rawShellFailure=exitPresent&&(exit===null||typeof exit!=="number"||!Number.isFinite(exit)||exit!==0);if(explicitFailure||rawShellFailure){let category=classifyFatalSignal(signal,correlation?.sandboxWrapped===!0||correlatedWrappedCommand);if(category)return{kind:"fatal",category,signal}}if(explicitFailure||rawShellFailure&&!neutralExitOne)return{kind:"failure",signal};if(neutralExitOne)return{kind:"neutral",signal};if(shell&&exitPresent&&exit===0)return{kind:"success",signal};if(!shell)return{kind:"success",signal};return{kind:"unknown",signal}}function currentOwner(sessionID){let session=getAgentSession(sessionID);if(!session)return null;return{agent:stripKnownSwarmPrefix(session.agentName),invocationId:session.activeInvocationId??0}}function freshCircuit(ownerAgent,ownerInvocationId){return{ownerAgent,ownerInvocationId,category:null,sameCategoryCount:0,hardStop:!1,lastSignal:null}}function ensureCircuit(sessionID){let owner=currentOwner(sessionID);if(!owner)return null;let session=getAgentSession(sessionID);if(!session)return null;let circuit=session.nonTransientCircuit;if(!circuit||circuit.ownerAgent!==owner.agent||circuit.ownerInvocationId!==owner.invocationId)session.nonTransientCircuit=freshCircuit(owner.agent,owner.invocationId);return session.nonTransientCircuit??null}function ensureCircuitSession(sessionID){if(getAgentSession(sessionID))return;let agent=swarmState.activeAgent.get(sessionID)??"architect";ensureAgentSession(sessionID,agent)}function recordNonTransientFailure(sessionID,category,signal){ensureCircuitSession(sessionID);let circuit=ensureCircuit(sessionID),session=getAgentSession(sessionID);if(!circuit||!session)return null;let wasHardStopped=circuit.hardStop;if(circuit.category===category)circuit.sameCategoryCount++;else circuit.category=category,circuit.sameCategoryCount=1;circuit.lastSignal=signal.slice(0,MAX_SIGNAL_LENGTH);let threshold=IMMEDIATE_HARD_STOP_CATEGORIES.has(category)?1:SAME_CATEGORY_HARD_STOP_THRESHOLD;if(circuit.hardStop=circuit.sameCategoryCount>=threshold,!wasHardStopped&&circuit.hardStop)telemetry.loopDetected(sessionID,circuit.ownerAgent,`nontransient:${category}`),session.pendingAdvisoryMessages??=[],session.pendingAdvisoryMessages.push("NON-TRANSIENT STOP ("+category+", "+circuit.sameCategoryCount+"/"+threshold+"): STOP. Do not retry this failure with another command or tool. Report the blocker and wait for corrected input, environment, or scope.");return circuit}function clearNonTransientCircuit(sessionID){let circuit=ensureCircuit(sessionID);if(!circuit||circuit.hardStop)return;circuit.category=null,circuit.sameCategoryCount=0,circuit.lastSignal=null}function nonTransientRemediation(category){switch(category){case"sandbox_wrapper_failure":return'This is a SANDBOX PROVISIONING failure — the command wrapper itself failed to sandbox the command (see "Last signal" for the wrapper error and mechanism). It is NOT the sub-agent refusing to act. '+"Run /swarm diagnose to check the sandbox mechanism and its availability. "+'A UI "session reset" alone may NOT clear this: the circuit is keyed to the current agent invocation, so only a fresh agent invocation (re-delegation) or a full plugin restart resets it — clearing the .opencode cache does not, because the circuit is in-memory. '+"When the sandbox mechanism is genuinely unavailable the shell runs UNSANDBOXED instead of hard-stopping, so a repeatable hard-stop here means the wrapper is actively failing — repair the sandbox environment before re-dispatching.";case"command_not_found":return'A command/executable was not found (see "Last signal"). Ensure the binary is installed and on PATH, then start a fresh invocation.';case"shell_parse_error":return'The shell could not parse the command (see "Last signal"). Fix the command syntax (quoting/escaping), then start a fresh invocation.';default:return"Start a verified new invocation or reset the session before continuing."}}function nonTransientHardStopMessage(circuit){let category=circuit.category??"fatal",signal=circuit.lastSignal??"(no signal captured)";return"NON-TRANSIENT CIRCUIT BREAKER: "+circuit.sameCategoryCount+" consecutive "+category+` failure(s). STOP tool calls and report the blocker.
|
|
619
619
|
Last signal: `+signal+`
|
|
620
620
|
`+nonTransientRemediation(category)}function assertNonTransientCircuitAllowsTool(sessionID){let circuit=ensureCircuit(sessionID);if(circuit?.hardStop)throw Error(nonTransientHardStopMessage(circuit))}function rememberToolExecution(sessionID,callID,tool,originalCommand){if(!isShellTool(tool)||originalCommand.length===0)return;ensureCircuitSession(sessionID);let session=getAgentSession(sessionID);if(!session)return;let owner=currentOwner(sessionID);if(!owner)return;if(session.pendingToolExecutions??=new Map,!session.pendingToolExecutions.has(callID)&&session.pendingToolExecutions.size>=MAX_PENDING_EXECUTIONS_PER_SESSION){let oldest=session.pendingToolExecutions.keys().next().value;if(typeof oldest==="string")session.pendingToolExecutions.delete(oldest)}session.pendingToolExecutions.set(callID,{tool,originalCommand,sandboxWrapped:!1,ownerAgent:owner.agent,ownerInvocationId:owner.invocationId})}function isToolExecutionCurrent(sessionID,execution){let owner=currentOwner(sessionID);return owner!==null&&execution.ownerAgent===owner.agent&&execution.ownerInvocationId===owner.invocationId}function markToolExecutionSandboxWrapped(sessionID,callID){let pending=getAgentSession(sessionID)?.pendingToolExecutions?.get(callID);if(pending)pending.sandboxWrapped=!0}function takeToolExecution(sessionID,callID){let pending=getAgentSession(sessionID)?.pendingToolExecutions,execution=pending?.get(callID);return pending?.delete(callID),execution}function forgetToolExecution(sessionID,callID){getAgentSession(sessionID)?.pendingToolExecutions?.delete(callID)}var SAME_CATEGORY_HARD_STOP_THRESHOLD=3,IMMEDIATE_HARD_STOP_CATEGORIES,MAX_PENDING_EXECUTIONS_PER_SESSION=100,MAX_SIGNAL_LENGTH=1000;var init_nontransient_circuit=__esm(()=>{init_schema();init_state2();init_telemetry();IMMEDIATE_HARD_STOP_CATEGORIES=new Set(["shell_parse_error","command_not_found","sandbox_wrapper_failure"])});function getStoredInputArgs(callID){return storedInputArgs.get(callID)}function setStoredInputArgs(callID,args2){storedInputArgs.set(callID,args2)}function deleteStoredInputArgs(callID){storedInputArgs.delete(callID)}var storedInputArgs;var init_stored_input_args=__esm(()=>{storedInputArgs=new Map});function normalizeSwarmCommandInput(command,argumentText){if(command!=="swarm"&&!command.startsWith("swarm-"))return{isSwarmCommand:!1,tokens:[]};if(command==="swarm")return{isSwarmCommand:!0,tokens:argumentText.trim().split(/\s+/).filter(Boolean)};let subcommand=command.slice(6),extraArgs=argumentText.trim().split(/\s+/).filter(Boolean);return{isSwarmCommand:!0,tokens:[subcommand,...extraArgs].filter(Boolean)}}function canonicalCommandKey(resolved){return resolved.entry.aliasOf??resolved.key}function formatCommandNotFound(tokens){let attemptedCommand=tokens[0]||"",MAX_DISPLAY=100,displayCommand=attemptedCommand.length>100?`${attemptedCommand.slice(0,100)}...`:attemptedCommand,similar=_internals27.findSimilarCommands(attemptedCommand),header=`Command \`/swarm ${displayCommand}\` not found.`,suggestions=similar.length>0?`Did you mean:
|
|
@@ -685,7 +685,7 @@ Changed sections: ${diffInfo.changedSections.map((s)=>`## ${s}`).join(", ")}`:""
|
|
|
685
685
|
`+diffInfo.diff+`
|
|
686
686
|
[End spec diff]`}else message+=`
|
|
687
687
|
|
|
688
|
-
(no recorded snapshot to diff against)`;throw Error(message)}}function isPlainObject3(value){return typeof value==="object"&&value!==null&&(value.constructor===Object||Object.getPrototypeOf(value)===null)}function readSignalField(source,key){try{return source[key]}catch{return}}function pushSignalValue(parts,value){if(typeof value==="string"){parts.push(value);return}if(typeof value==="number"||typeof value==="boolean")parts.push(String(value))}function appendSelectedFields(parts,source,keys){for(let key of keys)pushSignalValue(parts,readSignalField(source,key))}function appendNestedErrorSignal(parts,value){if(typeof value==="string"){parts.push(value);return}if(value instanceof Error){parts.push(value.name,value.message),appendSelectedFields(parts,value,["code","status","statusCode"]);return}if(!isPlainObject3(value))return;appendSelectedFields(parts,value,["code","status","statusCode","message","error_type"])}function extractErrorSignal(errorContent){if(typeof errorContent==="string")return errorContent;if(errorContent==null)return"";let parts=[];try{if(errorContent instanceof Error)return parts.push(errorContent.name,errorContent.message),appendSelectedFields(parts,errorContent,["code","status","statusCode"]),parts.join(" ");if(!isPlainObject3(errorContent))return"";appendSelectedFields(parts,errorContent,["code","status","statusCode","message","error_type"]),appendNestedErrorSignal(parts,readSignalField(errorContent,"error"));let metadata=readSignalField(errorContent,"metadata");if(isPlainObject3(metadata))appendSelectedFields(parts,metadata,["code","status","statusCode","error_type"]);appendNestedErrorSignal(parts,readSignalField(errorContent,"cause"))}catch{return parts.join(" ")}return parts.join(" ")}function extractPhaseNumber2(phaseString){if(!phaseString)return 1;let match=phaseString.match(/^Phase (\d+):/);return match?parseInt(match[1],10):1}function isWriteTool2(toolName){let normalized=normalizeToolName(toolName);return WRITE_TOOL_NAMES.includes(normalized)}function isInDeclaredScope3(filePath,scopeEntries,cwd){let dir=cwd??process.cwd(),caseInsensitive=process.platform==="win32",resolvedFileRaw=path55.resolve(dir,filePath),resolvedFile=caseInsensitive?resolvedFileRaw.toLowerCase():resolvedFileRaw;return scopeEntries.some((scope)=>{let resolvedScopeRaw=path55.resolve(dir,scope),resolvedScope=caseInsensitive?resolvedScopeRaw.toLowerCase():resolvedScopeRaw;if(resolvedFile===resolvedScope)return!0;let rel=path55.relative(resolvedScope,resolvedFile);return rel.length>0&&!rel.startsWith("..")&&!path55.isAbsolute(rel)})}function isGateTool(toolName){let normalized=normalizeToolName(toolName);return["diff","syntax_check","placeholder_scan","imports","lint","build_check","pre_check_batch","secretscan","sast_scan","quality_budget"].includes(normalized)}function isAgentDelegation(toolName,args2){let normalized=normalizeToolName(toolName);if(normalized!=="Task"&&normalized!=="task")return{isDelegation:!1,targetAgent:null};let argsObj=args2;if(!argsObj)return{isDelegation:!1,targetAgent:null};let subagentType=argsObj.subagent_type;if(typeof subagentType==="string")return{isDelegation:!0,targetAgent:stripKnownSwarmPrefix(subagentType)};return{isDelegation:!1,targetAgent:null}}function getCurrentTaskId3(sessionId){return swarmState.agentSessions.get(sessionId)?.currentTaskId??`${sessionId}:unknown`}function createGuardrailsHooks(directory,directoryOrConfig,config2,authorityConfig,worktreeBaseDirOverrides){let guardrailsConfig;if(directory&&typeof directory==="object"&&"enabled"in directory)warn("[guardrails] Legacy call without directory, falling back to process.cwd()"),guardrailsConfig=directory;else if(directoryOrConfig&&typeof directoryOrConfig==="object"&&"enabled"in directoryOrConfig)guardrailsConfig=directoryOrConfig;else guardrailsConfig=config2;let effectiveDirectory=(()=>{if(typeof directory==="string")return directory;let cwd=process.cwd();return warn(`[guardrails] effectiveDirectory resolved to process.cwd() "${cwd}" — `+"pass an explicit directory string to createGuardrailsHooks to avoid .swarm artifacts in wrong locations"),cwd})();if(guardrailsConfig?.enabled===!1)return{toolBefore:async()=>{},toolAfter:async()=>{},messagesTransform:async()=>{}};let precomputedAuthorityRules=buildEffectiveRules(authorityConfig),verifierPaths=authorityConfig?.verifier_config_paths;if(verifierPaths&&verifierPaths.length>0){let existingArchitect=precomputedAuthorityRules.architect??{};precomputedAuthorityRules.architect={...existingArchitect,blockedGlobs:[...existingArchitect.blockedGlobs??[],...verifierPaths]}}let universalDenyPrefixes=authorityConfig?.universal_deny_prefixes??[],cfg=guardrailsConfig,requiredQaGates=cfg.qa_gates?.required_tools??["diff","syntax_check","placeholder_scan","lint","pre_check_batch"],requireReviewerAndTestEngineer=cfg.qa_gates?.require_reviewer_test_engineer??!0,interpreterAllowedAgents=cfg.interpreter_allowed_agents,shellAuditEnabled=cfg.shell_audit_log??!0,shellAuditPath=path55.join(effectiveDirectory,".swarm","session","shell-audit.jsonl"),consecutiveNoToolTurns=new Map,toolBefore=createToolBeforeHandler({effectiveDirectory,cfg,precomputedAuthorityRules,universalDenyPrefixes,shellAuditPath,shellAuditEnabled,interpreterAllowedAgents,authorityConfig,consecutiveNoToolTurns,worktreeBaseDirOverrides}),messagesTransform=createMessagesTransformHandler({effectiveDirectory,cfg,requiredQaGates,requireReviewerAndTestEngineer,consecutiveNoToolTurns});return{toolBefore,toolAfter:async(input,output)=>{let correlatedExecution=takeToolExecution(input.sessionID,input.callID);if(correlatedExecution&&!isToolExecutionCurrent(input.sessionID,correlatedExecution))return;let malformedOutput=!output||typeof output!=="object",safeOutput=malformedOutput?{title:"",output:"",metadata:null}:output,session=swarmState.agentSessions.get(input.sessionID);if(session){if(isGateTool(input.tool)){let taskId=getCurrentTaskId3(input.sessionID);if(!session.gateLog.has(taskId))session.gateLog.set(taskId,new Set);session.gateLog.get(taskId)?.add(input.tool);let outputStr=typeof safeOutput.output==="string"?safeOutput.output:"",isSkipCondition=!1;try{let result=JSON.parse(outputStr);if(result.lint?.ran===!1&&result.secretscan?.ran===!1&&result.sast_scan?.ran===!1&&result.quality_budget?.ran===!1)isSkipCondition=!0}catch{}if(!isSkipCondition&&(safeOutput.output===null||safeOutput.output===void 0||outputStr.includes("FAIL")||outputStr.includes("error")||outputStr.toLowerCase().includes("gates_passed: false")))session.lastGateFailure={tool:input.tool,taskId,timestamp:Date.now()};else if(session.lastGateFailure=null,input.tool==="pre_check_batch"){let successStr=typeof safeOutput.output==="string"?safeOutput.output:"",isPassed=!1;try{isPassed=JSON.parse(successStr).gates_passed===!0}catch(error49){log("[Guardrails] pre_check_batch JSON parse failed",{error:error49 instanceof Error?error49.message:String(error49)}),isPassed=!1}if(isPassed&&session.currentTaskId)try{advanceTaskState(session,session.currentTaskId,"pre_check_passed")}catch(err){warn("Failed to advance task state after pre_check_batch pass",{taskId:session.currentTaskId,error:String(err)})}}}let inputArgs=input.args??getStoredInputArgs(input.callID),delegation=isAgentDelegation(input.tool,inputArgs);if(delegation.isDelegation&&(delegation.targetAgent==="reviewer"||delegation.targetAgent==="test_engineer")){let currentPhase=1;try{let plan=await loadPlan(effectiveDirectory);if(plan){let phaseString=extractCurrentPhaseFromPlan(plan);currentPhase=extractPhaseNumber2(phaseString)}}catch(error49){log("[Guardrails] loadPlan failed during reviewer tracking",{error:error49 instanceof Error?error49.message:String(error49)})}let count=session.reviewerCallCount.get(currentPhase)??0;session.reviewerCallCount.set(currentPhase,count+1)}if(delegation.isDelegation&&delegation.targetAgent==="coder"&&session.lastCoderDelegationTaskId){if(session.currentTaskId=session.lastCoderDelegationTaskId,!session.revisionLimitHit){if(session.coderRevisions++,session.coderRevisions>1&&session.qaSkipCount===0){let conflictPhase=1;try{let plan=await loadPlan(effectiveDirectory);if(plan)conflictPhase=extractPhaseNumber2(extractCurrentPhaseFromPlan(plan))}catch{}resolveAgentConflict({sessionID:input.sessionID,phase:conflictPhase,taskId:session.currentTaskId??void 0,sourceAgent:"reviewer",targetAgent:"coder",conflictType:"feedback_rejection",rejectionCount:session.coderRevisions-1,summary:`Coder revision ${session.coderRevisions} for task ${session.currentTaskId??"unknown"}`}),session.lastDelegationReason="review_rejected"}let maxRevisions=cfg.max_coder_revisions??5;if(session.coderRevisions>=maxRevisions)session.revisionLimitHit=!0,telemetry.revisionLimitHit(input.sessionID,session.agentName),session.pendingAdvisoryMessages??=[],session.pendingAdvisoryMessages.push(`CODER REVISION LIMIT: Agent has been revised ${session.coderRevisions} times (max: ${maxRevisions}) for task ${session.currentTaskId??"unknown"}. Escalate to user or consider a fundamentally different approach.`),swarmState.pendingEvents++}if(session.partialGateWarningsIssuedForTask?.delete(session.currentTaskId),session.declaredCoderScope!==null){let undeclaredFiles=session.modifiedFilesThisCoderTask.map((f)=>f.replace(/[\r\n\t]/g,"_")).filter((f)=>!isInDeclaredScope3(f,session.declaredCoderScope,directory));if(undeclaredFiles.length>=1){let safeTaskId=String(session.currentTaskId??"").replace(/[\r\n\t]/g,"_");session.lastScopeViolation=`Scope violation for task ${safeTaskId}: ${undeclaredFiles.length} undeclared files modified: `+undeclaredFiles.join(", "),session.scopeViolationDetected=!0,telemetry.scopeViolation(input.sessionID,session.agentName,session.currentTaskId??"unknown","undeclared files modified")}}session.modifiedFilesThisCoderTask=[]}}let sessionId=input.sessionID,normalizedToolName=normalizeToolName(input.tool);if(isWriteTool2(normalizedToolName))toolCallsSinceLastWrite.set(sessionId,0),noOpWarningIssued.delete(sessionId);else{let count=(toolCallsSinceLastWrite.get(sessionId)??0)+1;toolCallsSinceLastWrite.set(sessionId,count);let threshold=cfg.no_op_warning_threshold??15;if(count>=threshold&&!noOpWarningIssued.has(sessionId)&&session?.pendingAdvisoryMessages)noOpWarningIssued.add(sessionId),session.pendingAdvisoryMessages.push(`WARNING: Agent has made ${count} tool calls with no file modifications. If you are stuck, use /swarm handoff to reset or /swarm turbo to reduce overhead.`)}let outcome=malformedOutput?{kind:"unknown",signal:""}:classifyToolOutcome(input,safeOutput,correlatedExecution);if(outcome.kind==="fatal")recordNonTransientFailure(input.sessionID,outcome.category,outcome.signal);else if(outcome.kind==="success"||outcome.kind==="neutral")clearNonTransientCircuit(input.sessionID);else if(outcome.kind==="failure"){let circuitSignal=extractErrorSignal(outcome.signal),circuitStatus=extractStatusCode(circuitSignal),circuitIsTransient=circuitStatus!==null&&TRANSIENT_STATUS_CODES.has(circuitStatus)||TRANSIENT_MODEL_ERROR_PATTERN.test(circuitSignal),circuitIsDegraded=DEGRADED_ERROR_PATTERN.test(circuitSignal);if(circuitIsTransient||circuitIsDegraded)clearNonTransientCircuit(input.sessionID);else recordNonTransientFailure(input.sessionID,"general_permanent",outcome.signal)}let window2=getActiveWindow(input.sessionID);if(!window2)return;if(outcome.kind==="fatal"){window2.consecutiveErrors++;return}if(outcome.kind==="failure"){let errorSignal=extractErrorSignal(outcome.signal),extractedStatus=extractStatusCode(errorSignal),isTransientStatusCode=extractedStatus!==null&&TRANSIENT_STATUS_CODES.has(extractedStatus),isTransientPatternMatch=TRANSIENT_MODEL_ERROR_PATTERN.test(errorSignal),isTransientMatch=isTransientStatusCode||isTransientPatternMatch,maxTransientRetries=cfg.max_transient_retries??5,isTransient=!!session&&isTransientMatch&&window2.transientRetryCount<maxTransientRetries,isDegraded=!isTransient&&DEGRADED_ERROR_PATTERN.test(errorSignal);if(isTransient)window2.transientRetryCount++;else if(isDegraded){let isContentFilter=CONTENT_FILTER_PATTERN.test(errorSignal);if(session&&!session.modelFallbackExhausted){session.model_fallback_index++;let swarmId=_internals30.extractSwarmIdFromAgentName(session.agentName),baseAgentName=session.agentName?session.agentName.replace(/^[^_]+[_]/,""):"",fallbackModels=_internals30.getSwarmAgents(swarmId)?.[baseAgentName]?.fallback_models;if(session.modelFallbackExhausted=!fallbackModels||session.model_fallback_index>fallbackModels.length,session.pendingAdvisoryMessages??=[],isContentFilter)session.pendingAdvisoryMessages.push(`DEGRADED: Content policy violation detected (content filter). Fallback model ${session.model_fallback_index}/${fallbackModels?.length??0} considered. The input may need content modification to comply with provider policies.`);else session.pendingAdvisoryMessages.push(`DEGRADED: Context-limit or token-limit error detected. Fallback model ${session.model_fallback_index}/${fallbackModels?.length??0} considered. Consider reducing input size or using /swarm handoff to switch models.`)}else if(session)if(session.pendingAdvisoryMessages??=[],isContentFilter)session.pendingAdvisoryMessages.push("DEGRADED: Content policy violation detected (content filter). No fallback models available. The input may need content modification to comply with provider policies.");else session.pendingAdvisoryMessages.push('DEGRADED: Context-limit or token-limit error detected. No fallback models available. Consider reducing input size or add "fallback_models" config.')}else window2.consecutiveErrors++;let modelFallbackAdvisoryEmitted=!1;if(session&&isTransientMatch&&!session.modelFallbackExhausted&&!isDegraded){session.model_fallback_index++;let swarmId=_internals30.extractSwarmIdFromAgentName(session.agentName),baseAgentName=session.agentName?session.agentName.replace(/^[^_]+[_]/,""):"",swarmAgents=_internals30.getSwarmAgents(swarmId),fallbackModels=swarmAgents?.[baseAgentName]?.fallback_models;session.modelFallbackExhausted=!fallbackModels||session.model_fallback_index>fallbackModels.length;let fallbackModel=_internals30.resolveFallbackModel(baseAgentName,session.model_fallback_index,swarmAgents),primaryModel=swarmAgents?.[baseAgentName]?.model??"default";if(fallbackModel){if(swarmAgents?.[baseAgentName])swarmAgents[baseAgentName].model=fallbackModel;session.pendingAdvisoryMessages??=[],session.pendingAdvisoryMessages.push(`MODEL FALLBACK: Applied fallback model "${fallbackModel}" (attempt ${session.model_fallback_index}). Using /swarm handoff to reset to primary model.`),modelFallbackAdvisoryEmitted=!0}else session.pendingAdvisoryMessages??=[],session.pendingAdvisoryMessages.push(`MODEL FALLBACK: Transient model error detected (attempt ${session.model_fallback_index}). No fallback models configured for this agent. Add "fallback_models": ["model-a", "model-b"] to the agent's config in opencode-swarm.json.`),modelFallbackAdvisoryEmitted=!0;telemetry.modelFallback(input.sessionID,session.agentName,primaryModel,fallbackModel??"none","transient_model_error"),swarmState.pendingEvents++}if(session&&isTransient&&isTransientMatch&&!modelFallbackAdvisoryEmitted){if(session.pendingAdvisoryMessages??=[],!session.pendingAdvisoryMessages.some((m)=>m.startsWith("TRANSIENT ERROR:")||m.startsWith("MODEL FALLBACK:")))session.pendingAdvisoryMessages.push(`TRANSIENT ERROR: Provider error detected (attempt ${window2.transientRetryCount}/${maxTransientRetries}). Retrying...`)}}else if(window2.consecutiveErrors=0,window2.transientRetryCount=0,window2.lastSuccessTimeMs=Date.now(),session){if(session.model_fallback_index>0)session.model_fallback_index=0,session.modelFallbackExhausted=!1}},messagesTransform}}var _internals30,SPEC_DRIFT_BLOCKED_TOOLS,DEGRADED_ERROR_PATTERN,CONTENT_FILTER_PATTERN,toolCallsSinceLastWrite,noOpWarningIssued;var init_guardrails=__esm(()=>{init_agents2();init_constants();init_schema();init_manager();init_state2();init_telemetry();init_utils();init_logger();init_provider_error_classification();init_spec_hash();init_conflict_resolution();init_extractors();init_normalize_tool_name();init_destructive_command();init_file_authority();init_messages_transform();init_nontransient_circuit();init_stored_input_args();init_tool_before();init_helpers();_internals30={extractSwarmIdFromAgentName,getSwarmAgents,getMostRecentAssistantText,getProviderFailureFingerprint,isTransientProviderFailureText,resolveFallbackModel,dcCheckJunctionCreation,extractErrorSignal},SPEC_DRIFT_BLOCKED_TOOLS=new Set(["save_plan","update_task_status","phase_complete","lean_turbo_run_phase","lean_turbo_acquire_locks"]);DEGRADED_ERROR_PATTERN=/context.?length|token.?(limit|budget)|input.?too.?long|content.?filter|exceeds?.?(maximum.?)?tokens|maximum.?context|context.?window|too.?many.?tokens|prompt.?too.?long|message.?too.?long|request.?too.?large|max.?tokens/i,CONTENT_FILTER_PATTERN=/content.?filter/i,toolCallsSinceLastWrite=new Map,noOpWarningIssued=new Set});var init_guardrails2=__esm(()=>{init_file_authority();init_guardrails();init_stored_input_args()});var exports_task_envelope={};__export(exports_task_envelope,{parseTaskEnvelope:()=>parseTaskEnvelope,extractDispatchIds:()=>extractDispatchIds});function parseTaskEnvelope(text){if(typeof text!=="string"||text.length===0)return null;let match=text.match(TASK_ENVELOPE_RE);if(!match)return null;let sessionId=match[1],state=match[2];if(!sessionId)return null;let summary=extractTagText(text,"summary"),resultRaw=state==="error"?extractTagText(text,"task_error"):extractTagText(text,"task_result"),bounded=boundEnvelopeText(resultRaw);return{sessionId,state,...summary!==void 0?{summary}:{},...state==="error"&&bounded?{errorText:bounded.text,resultChars:bounded.chars,resultTruncated:bounded.truncated}:{},...state!=="error"&&bounded?{resultText:bounded.text,resultChars:bounded.chars,resultTruncated:bounded.truncated}:{}}}function extractTagText(text,tag){let re=new RegExp(`<${tag}>([\\s\\S]*?)</${tag}>`),match=text.match(re);if(!match)return;return match[1]}function boundEnvelopeText(text){if(text===void 0)return;if(text.length<=20000)return{text,chars:text.length,truncated:!1};let suffix=`
|
|
688
|
+
(no recorded snapshot to diff against)`;throw Error(message)}}function isPlainObject3(value){return typeof value==="object"&&value!==null&&(value.constructor===Object||Object.getPrototypeOf(value)===null)}function readSignalField(source,key){try{return source[key]}catch{return}}function pushSignalValue(parts,value){if(typeof value==="string"){parts.push(value);return}if(typeof value==="number"||typeof value==="boolean")parts.push(String(value))}function appendSelectedFields(parts,source,keys){for(let key of keys)pushSignalValue(parts,readSignalField(source,key))}function appendNestedErrorSignal(parts,value){if(typeof value==="string"){parts.push(value);return}if(value instanceof Error){parts.push(value.name,value.message),appendSelectedFields(parts,value,["code","status","statusCode"]);return}if(!isPlainObject3(value))return;appendSelectedFields(parts,value,["code","status","statusCode","message","error_type"])}function extractErrorSignal(errorContent){if(typeof errorContent==="string")return errorContent;if(errorContent==null)return"";let parts=[];try{if(errorContent instanceof Error)return parts.push(errorContent.name,errorContent.message),appendSelectedFields(parts,errorContent,["code","status","statusCode"]),parts.join(" ");if(!isPlainObject3(errorContent))return"";appendSelectedFields(parts,errorContent,["code","status","statusCode","message","error_type"]),appendNestedErrorSignal(parts,readSignalField(errorContent,"error"));let metadata=readSignalField(errorContent,"metadata");if(isPlainObject3(metadata))appendSelectedFields(parts,metadata,["code","status","statusCode","error_type"]);appendNestedErrorSignal(parts,readSignalField(errorContent,"cause"))}catch{return parts.join(" ")}return parts.join(" ")}function touchNoOpSession(sessionID,count){toolCallsSinceLastWrite.delete(sessionID),toolCallsSinceLastWrite.set(sessionID,count),evictNoOpStateIfOverBound()}function evictNoOpStateIfOverBound(){while(toolCallsSinceLastWrite.size>MAX_TRACKED_NO_OP_SESSIONS){let stalestKey=toolCallsSinceLastWrite.keys().next().value;if(stalestKey===void 0)break;toolCallsSinceLastWrite.delete(stalestKey),noOpWarningIssued.delete(stalestKey)}while(noOpWarningIssued.size>MAX_TRACKED_NO_OP_SESSIONS){let stalestKey=noOpWarningIssued.values().next().value;if(stalestKey===void 0)break;noOpWarningIssued.delete(stalestKey)}}function extractPhaseNumber2(phaseString){if(!phaseString)return 1;let match=phaseString.match(/^Phase (\d+):/);return match?parseInt(match[1],10):1}function isWriteTool2(toolName){let normalized=normalizeToolName(toolName);return WRITE_TOOL_NAMES.includes(normalized)}function isInDeclaredScope3(filePath,scopeEntries,cwd){let dir=cwd??process.cwd(),caseInsensitive=process.platform==="win32",resolvedFileRaw=path55.resolve(dir,filePath),resolvedFile=caseInsensitive?resolvedFileRaw.toLowerCase():resolvedFileRaw;return scopeEntries.some((scope)=>{let resolvedScopeRaw=path55.resolve(dir,scope),resolvedScope=caseInsensitive?resolvedScopeRaw.toLowerCase():resolvedScopeRaw;if(resolvedFile===resolvedScope)return!0;let rel=path55.relative(resolvedScope,resolvedFile);return rel.length>0&&!rel.startsWith("..")&&!path55.isAbsolute(rel)})}function isGateTool(toolName){let normalized=normalizeToolName(toolName);return["diff","syntax_check","placeholder_scan","imports","lint","build_check","pre_check_batch","secretscan","sast_scan","quality_budget"].includes(normalized)}function isAgentDelegation(toolName,args2){let normalized=normalizeToolName(toolName);if(normalized!=="Task"&&normalized!=="task")return{isDelegation:!1,targetAgent:null};let argsObj=args2;if(!argsObj)return{isDelegation:!1,targetAgent:null};let subagentType=argsObj.subagent_type;if(typeof subagentType==="string")return{isDelegation:!0,targetAgent:stripKnownSwarmPrefix(subagentType)};return{isDelegation:!1,targetAgent:null}}function getCurrentTaskId3(sessionId){return swarmState.agentSessions.get(sessionId)?.currentTaskId??`${sessionId}:unknown`}function createGuardrailsHooks(directory,directoryOrConfig,config2,authorityConfig,worktreeBaseDirOverrides){let guardrailsConfig;if(directory&&typeof directory==="object"&&"enabled"in directory)warn("[guardrails] Legacy call without directory, falling back to process.cwd()"),guardrailsConfig=directory;else if(directoryOrConfig&&typeof directoryOrConfig==="object"&&"enabled"in directoryOrConfig)guardrailsConfig=directoryOrConfig;else guardrailsConfig=config2;let effectiveDirectory=(()=>{if(typeof directory==="string")return directory;let cwd=process.cwd();return warn(`[guardrails] effectiveDirectory resolved to process.cwd() "${cwd}" — `+"pass an explicit directory string to createGuardrailsHooks to avoid .swarm artifacts in wrong locations"),cwd})();if(guardrailsConfig?.enabled===!1)return{toolBefore:async()=>{},toolAfter:async()=>{},messagesTransform:async()=>{}};let precomputedAuthorityRules=buildEffectiveRules(authorityConfig),verifierPaths=authorityConfig?.verifier_config_paths;if(verifierPaths&&verifierPaths.length>0){let existingArchitect=precomputedAuthorityRules.architect??{};precomputedAuthorityRules.architect={...existingArchitect,blockedGlobs:[...existingArchitect.blockedGlobs??[],...verifierPaths]}}let universalDenyPrefixes=authorityConfig?.universal_deny_prefixes??[],cfg=guardrailsConfig,requiredQaGates=cfg.qa_gates?.required_tools??["diff","syntax_check","placeholder_scan","lint","pre_check_batch"],requireReviewerAndTestEngineer=cfg.qa_gates?.require_reviewer_test_engineer??!0,interpreterAllowedAgents=cfg.interpreter_allowed_agents,shellAuditEnabled=cfg.shell_audit_log??!0,shellAuditPath=path55.join(effectiveDirectory,".swarm","session","shell-audit.jsonl"),consecutiveNoToolTurns=new Map,toolBefore=createToolBeforeHandler({effectiveDirectory,cfg,precomputedAuthorityRules,universalDenyPrefixes,shellAuditPath,shellAuditEnabled,interpreterAllowedAgents,authorityConfig,consecutiveNoToolTurns,worktreeBaseDirOverrides}),messagesTransform=createMessagesTransformHandler({effectiveDirectory,cfg,requiredQaGates,requireReviewerAndTestEngineer,consecutiveNoToolTurns});return{toolBefore,toolAfter:async(input,output)=>{let correlatedExecution=takeToolExecution(input.sessionID,input.callID);if(correlatedExecution&&!isToolExecutionCurrent(input.sessionID,correlatedExecution))return;let malformedOutput=!output||typeof output!=="object",safeOutput=malformedOutput?{title:"",output:"",metadata:null}:output,session=swarmState.agentSessions.get(input.sessionID);if(session){if(isGateTool(input.tool)){let taskId=getCurrentTaskId3(input.sessionID);if(!session.gateLog.has(taskId))session.gateLog.set(taskId,new Set);session.gateLog.get(taskId)?.add(input.tool);let outputStr=typeof safeOutput.output==="string"?safeOutput.output:"",isSkipCondition=!1;try{let result=JSON.parse(outputStr);if(result.lint?.ran===!1&&result.secretscan?.ran===!1&&result.sast_scan?.ran===!1&&result.quality_budget?.ran===!1)isSkipCondition=!0}catch{}if(!isSkipCondition&&(safeOutput.output===null||safeOutput.output===void 0||outputStr.includes("FAIL")||outputStr.includes("error")||outputStr.toLowerCase().includes("gates_passed: false")))session.lastGateFailure={tool:input.tool,taskId,timestamp:Date.now()};else if(session.lastGateFailure=null,input.tool==="pre_check_batch"){let successStr=typeof safeOutput.output==="string"?safeOutput.output:"",isPassed=!1;try{isPassed=JSON.parse(successStr).gates_passed===!0}catch(error49){log("[Guardrails] pre_check_batch JSON parse failed",{error:error49 instanceof Error?error49.message:String(error49)}),isPassed=!1}if(isPassed&&session.currentTaskId)try{advanceTaskState(session,session.currentTaskId,"pre_check_passed")}catch(err){warn("Failed to advance task state after pre_check_batch pass",{taskId:session.currentTaskId,error:String(err)})}}}let inputArgs=input.args??getStoredInputArgs(input.callID),delegation=isAgentDelegation(input.tool,inputArgs);if(delegation.isDelegation&&(delegation.targetAgent==="reviewer"||delegation.targetAgent==="test_engineer")){let currentPhase=1;try{let plan=await loadPlan(effectiveDirectory);if(plan){let phaseString=extractCurrentPhaseFromPlan(plan);currentPhase=extractPhaseNumber2(phaseString)}}catch(error49){log("[Guardrails] loadPlan failed during reviewer tracking",{error:error49 instanceof Error?error49.message:String(error49)})}let count=session.reviewerCallCount.get(currentPhase)??0;session.reviewerCallCount.set(currentPhase,count+1)}if(delegation.isDelegation&&delegation.targetAgent==="coder"&&session.lastCoderDelegationTaskId){if(session.currentTaskId=session.lastCoderDelegationTaskId,!session.revisionLimitHit){if(session.coderRevisions++,session.coderRevisions>1&&session.qaSkipCount===0){let conflictPhase=1;try{let plan=await loadPlan(effectiveDirectory);if(plan)conflictPhase=extractPhaseNumber2(extractCurrentPhaseFromPlan(plan))}catch{}resolveAgentConflict({sessionID:input.sessionID,phase:conflictPhase,taskId:session.currentTaskId??void 0,sourceAgent:"reviewer",targetAgent:"coder",conflictType:"feedback_rejection",rejectionCount:session.coderRevisions-1,summary:`Coder revision ${session.coderRevisions} for task ${session.currentTaskId??"unknown"}`}),session.lastDelegationReason="review_rejected"}let maxRevisions=cfg.max_coder_revisions??5;if(session.coderRevisions>=maxRevisions)session.revisionLimitHit=!0,telemetry.revisionLimitHit(input.sessionID,session.agentName),session.pendingAdvisoryMessages??=[],session.pendingAdvisoryMessages.push(`CODER REVISION LIMIT: Agent has been revised ${session.coderRevisions} times (max: ${maxRevisions}) for task ${session.currentTaskId??"unknown"}. Escalate to user or consider a fundamentally different approach.`),swarmState.pendingEvents++}if(session.partialGateWarningsIssuedForTask?.delete(session.currentTaskId),session.declaredCoderScope!==null){let undeclaredFiles=session.modifiedFilesThisCoderTask.map((f)=>f.replace(/[\r\n\t]/g,"_")).filter((f)=>!isInDeclaredScope3(f,session.declaredCoderScope,directory));if(undeclaredFiles.length>=1){let safeTaskId=String(session.currentTaskId??"").replace(/[\r\n\t]/g,"_");session.lastScopeViolation=`Scope violation for task ${safeTaskId}: ${undeclaredFiles.length} undeclared files modified: `+undeclaredFiles.join(", "),session.scopeViolationDetected=!0,telemetry.scopeViolation(input.sessionID,session.agentName,session.currentTaskId??"unknown","undeclared files modified")}}session.modifiedFilesThisCoderTask=[]}}let sessionId=input.sessionID,normalizedToolName=normalizeToolName(input.tool),isSubagentDispatch=new Set(["dispatch_lanes","dispatch_lanes_async"]).has(normalizedToolName)||isAgentDelegation(input.tool,input.args??getStoredInputArgs(input.callID)).isDelegation;if(isWriteTool2(normalizedToolName)||isSubagentDispatch)touchNoOpSession(sessionId,0),noOpWarningIssued.delete(sessionId);else{let count=(toolCallsSinceLastWrite.get(sessionId)??0)+1;touchNoOpSession(sessionId,count);let threshold=cfg.no_op_warning_threshold??15;if(count>=threshold&&!noOpWarningIssued.has(sessionId)&&session?.pendingAdvisoryMessages)noOpWarningIssued.add(sessionId),evictNoOpStateIfOverBound(),session.pendingAdvisoryMessages.push(`WARNING: Agent has made ${count} tool calls with no file modifications and no subagent dispatches. If you are stuck, state what is blocking you and report BLOCKED rather than continuing to probe.`)}let outcome=malformedOutput?{kind:"unknown",signal:""}:classifyToolOutcome(input,safeOutput,correlatedExecution);if(outcome.kind==="fatal")recordNonTransientFailure(input.sessionID,outcome.category,outcome.signal);else if(outcome.kind==="success"||outcome.kind==="neutral")clearNonTransientCircuit(input.sessionID);else if(outcome.kind==="failure"){let circuitSignal=extractErrorSignal(outcome.signal),circuitStatus=extractStatusCode(circuitSignal),circuitIsTransient=circuitStatus!==null&&TRANSIENT_STATUS_CODES.has(circuitStatus)||TRANSIENT_MODEL_ERROR_PATTERN.test(circuitSignal),circuitIsDegraded=DEGRADED_ERROR_PATTERN.test(circuitSignal);if(circuitIsTransient||circuitIsDegraded)clearNonTransientCircuit(input.sessionID);else recordNonTransientFailure(input.sessionID,"general_permanent",outcome.signal)}let window2=getActiveWindow(input.sessionID);if(!window2)return;if(outcome.kind==="fatal"){window2.consecutiveErrors++;return}if(outcome.kind==="failure"){let errorSignal=extractErrorSignal(outcome.signal),extractedStatus=extractStatusCode(errorSignal),isTransientStatusCode=extractedStatus!==null&&TRANSIENT_STATUS_CODES.has(extractedStatus),isTransientPatternMatch=TRANSIENT_MODEL_ERROR_PATTERN.test(errorSignal),isTransientMatch=isTransientStatusCode||isTransientPatternMatch,maxTransientRetries=cfg.max_transient_retries??5,isTransient=!!session&&isTransientMatch&&window2.transientRetryCount<maxTransientRetries,isDegraded=!isTransient&&DEGRADED_ERROR_PATTERN.test(errorSignal);if(isTransient)window2.transientRetryCount++;else if(isDegraded){let isContentFilter=CONTENT_FILTER_PATTERN.test(errorSignal);if(session&&!session.modelFallbackExhausted){session.model_fallback_index++;let swarmId=_internals30.extractSwarmIdFromAgentName(session.agentName),baseAgentName=session.agentName?session.agentName.replace(/^[^_]+[_]/,""):"",fallbackModels=_internals30.getSwarmAgents(swarmId)?.[baseAgentName]?.fallback_models;if(session.modelFallbackExhausted=!fallbackModels||session.model_fallback_index>fallbackModels.length,session.pendingAdvisoryMessages??=[],isContentFilter)session.pendingAdvisoryMessages.push(`DEGRADED: Content policy violation detected (content filter). Fallback model ${session.model_fallback_index}/${fallbackModels?.length??0} considered. The input may need content modification to comply with provider policies.`);else session.pendingAdvisoryMessages.push(`DEGRADED: Context-limit or token-limit error detected. Fallback model ${session.model_fallback_index}/${fallbackModels?.length??0} considered. Consider reducing input size or using /swarm handoff to switch models.`)}else if(session)if(session.pendingAdvisoryMessages??=[],isContentFilter)session.pendingAdvisoryMessages.push("DEGRADED: Content policy violation detected (content filter). No fallback models available. The input may need content modification to comply with provider policies.");else session.pendingAdvisoryMessages.push('DEGRADED: Context-limit or token-limit error detected. No fallback models available. Consider reducing input size or add "fallback_models" config.')}else window2.consecutiveErrors++;let modelFallbackAdvisoryEmitted=!1;if(session&&isTransientMatch&&!session.modelFallbackExhausted&&!isDegraded){session.model_fallback_index++;let swarmId=_internals30.extractSwarmIdFromAgentName(session.agentName),baseAgentName=session.agentName?session.agentName.replace(/^[^_]+[_]/,""):"",swarmAgents=_internals30.getSwarmAgents(swarmId),fallbackModels=swarmAgents?.[baseAgentName]?.fallback_models;session.modelFallbackExhausted=!fallbackModels||session.model_fallback_index>fallbackModels.length;let fallbackModel=_internals30.resolveFallbackModel(baseAgentName,session.model_fallback_index,swarmAgents),primaryModel=swarmAgents?.[baseAgentName]?.model??"default";if(fallbackModel){if(swarmAgents?.[baseAgentName])swarmAgents[baseAgentName].model=fallbackModel;session.pendingAdvisoryMessages??=[],session.pendingAdvisoryMessages.push(`MODEL FALLBACK: Applied fallback model "${fallbackModel}" (attempt ${session.model_fallback_index}). Using /swarm handoff to reset to primary model.`),modelFallbackAdvisoryEmitted=!0}else session.pendingAdvisoryMessages??=[],session.pendingAdvisoryMessages.push(`MODEL FALLBACK: Transient model error detected (attempt ${session.model_fallback_index}). No fallback models configured for this agent. Add "fallback_models": ["model-a", "model-b"] to the agent's config in opencode-swarm.json.`),modelFallbackAdvisoryEmitted=!0;telemetry.modelFallback(input.sessionID,session.agentName,primaryModel,fallbackModel??"none","transient_model_error"),swarmState.pendingEvents++}if(session&&isTransient&&isTransientMatch&&!modelFallbackAdvisoryEmitted){if(session.pendingAdvisoryMessages??=[],!session.pendingAdvisoryMessages.some((m)=>m.startsWith("TRANSIENT ERROR:")||m.startsWith("MODEL FALLBACK:")))session.pendingAdvisoryMessages.push(`TRANSIENT ERROR: Provider error detected (attempt ${window2.transientRetryCount}/${maxTransientRetries}). Retrying...`)}}else if(window2.consecutiveErrors=0,window2.transientRetryCount=0,window2.lastSuccessTimeMs=Date.now(),session){if(session.model_fallback_index>0)session.model_fallback_index=0,session.modelFallbackExhausted=!1}},messagesTransform}}var _internals30,SPEC_DRIFT_BLOCKED_TOOLS,DEGRADED_ERROR_PATTERN,CONTENT_FILTER_PATTERN,MAX_TRACKED_NO_OP_SESSIONS=200,toolCallsSinceLastWrite,noOpWarningIssued;var init_guardrails=__esm(()=>{init_agents2();init_constants();init_schema();init_manager();init_state2();init_telemetry();init_utils();init_logger();init_provider_error_classification();init_spec_hash();init_conflict_resolution();init_extractors();init_normalize_tool_name();init_destructive_command();init_file_authority();init_messages_transform();init_nontransient_circuit();init_stored_input_args();init_tool_before();init_helpers();_internals30={extractSwarmIdFromAgentName,getSwarmAgents,getMostRecentAssistantText,getProviderFailureFingerprint,isTransientProviderFailureText,resolveFallbackModel,dcCheckJunctionCreation,extractErrorSignal,noOpStateSize:()=>toolCallsSinceLastWrite.size,hasNoOpState:(sessionID)=>toolCallsSinceLastWrite.has(sessionID)},SPEC_DRIFT_BLOCKED_TOOLS=new Set(["save_plan","update_task_status","phase_complete","lean_turbo_run_phase","lean_turbo_acquire_locks"]);DEGRADED_ERROR_PATTERN=/context.?length|token.?(limit|budget)|input.?too.?long|content.?filter|exceeds?.?(maximum.?)?tokens|maximum.?context|context.?window|too.?many.?tokens|prompt.?too.?long|message.?too.?long|request.?too.?large|max.?tokens/i,CONTENT_FILTER_PATTERN=/content.?filter/i,toolCallsSinceLastWrite=new Map,noOpWarningIssued=new Set});var init_guardrails2=__esm(()=>{init_file_authority();init_guardrails();init_stored_input_args()});var exports_task_envelope={};__export(exports_task_envelope,{parseTaskEnvelope:()=>parseTaskEnvelope,extractDispatchIds:()=>extractDispatchIds});function parseTaskEnvelope(text){if(typeof text!=="string"||text.length===0)return null;let match=text.match(TASK_ENVELOPE_RE);if(!match)return null;let sessionId=match[1],state=match[2];if(!sessionId)return null;let summary=extractTagText(text,"summary"),resultRaw=state==="error"?extractTagText(text,"task_error"):extractTagText(text,"task_result"),bounded=boundEnvelopeText(resultRaw);return{sessionId,state,...summary!==void 0?{summary}:{},...state==="error"&&bounded?{errorText:bounded.text,resultChars:bounded.chars,resultTruncated:bounded.truncated}:{},...state!=="error"&&bounded?{resultText:bounded.text,resultChars:bounded.chars,resultTruncated:bounded.truncated}:{}}}function extractTagText(text,tag){let re=new RegExp(`<${tag}>([\\s\\S]*?)</${tag}>`),match=text.match(re);if(!match)return;return match[1]}function boundEnvelopeText(text){if(text===void 0)return;if(text.length<=20000)return{text,chars:text.length,truncated:!1};let suffix=`
|
|
689
689
|
[... ${text.length-20000} chars truncated by task-envelope ...]`,maxContent=Math.max(0,20000-suffix.length);return{text:`${text.slice(0,maxContent)}${suffix}`,chars:text.length,truncated:!0}}function extractDispatchIds(output){let subagentSessionId=null,jobId=null;if(typeof output==="object"&&output!==null){let o=output,metadata=o.metadata;if(typeof metadata==="object"&&metadata!==null){let rawJobId=metadata.jobId;if(typeof rawJobId==="string"&&rawJobId.length>0)jobId=rawJobId}let rendered=o.output,envelope=parseTaskEnvelope(typeof rendered==="string"?rendered:void 0);if(envelope&&envelope.state==="running")subagentSessionId=envelope.sessionId}else if(typeof output==="string"){let envelope=parseTaskEnvelope(output);if(envelope&&envelope.state==="running")subagentSessionId=envelope.sessionId}if(!subagentSessionId&&jobId)subagentSessionId=jobId;return{subagentSessionId,jobId}}var TASK_ENVELOPE_RE;var init_task_envelope=__esm(()=>{TASK_ENVELOPE_RE=/<task\s+id="([^"]+)"\s+state="(running|completed|error)"\s*>/});var exports_gate_evidence={};__export(exports_gate_evidence,{recordGateEvidence:()=>recordGateEvidence,recordAgentDispatch:()=>recordAgentDispatch,readTaskEvidenceRaw:()=>readTaskEvidenceRaw,readTaskEvidence:()=>readTaskEvidence,isValidTaskId:()=>isValidTaskId,hasPassedAllGates:()=>hasPassedAllGates,expandRequiredGates:()=>expandRequiredGates,deriveRequiredGates:()=>deriveRequiredGates,DEFAULT_REQUIRED_GATES:()=>DEFAULT_REQUIRED_GATES});import{mkdirSync as mkdirSync20,readFileSync as readFileSync21,realpathSync as realpathSync11}from"node:fs";import*as path56 from"node:path";function isValidTaskId(taskId){return isStrictTaskId(taskId)}function assertValidTaskId(taskId){assertStrictTaskId(taskId)}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 getEvidenceDir(directory){let swarmDir=path56.resolve(directory,".swarm"),evidenceDir=path56.join(swarmDir,"evidence");mkdirSync20(evidenceDir,{recursive:!0});let resolvedSwarmDir,resolvedEvidenceDir;try{resolvedSwarmDir=path56.normalize(realpathSync11(swarmDir)),resolvedEvidenceDir=path56.normalize(realpathSync11(evidenceDir))}catch(error49){throw Error(`Unable to resolve evidence directory: ${error49.message}`)}let swarmPrefix=`${resolvedSwarmDir}${path56.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 readExisting(evidencePath,taskId){try{let raw=readFileSync21(evidencePath,"utf-8");return TaskEvidenceSchema.parse(JSON.parse(raw))}catch(error49){if(error49.code==="ENOENT")return null;throw telemetry.gateParseError(taskId,error49),error49}}async function recordGateEvidence(directory,taskId,gate,sessionId,turbo){assertValidTaskId(taskId),await withTaskEvidenceLock(directory,taskId,gate,async()=>{let resolvedEvidenceDir=getEvidenceDir(directory),evidencePath=path56.join(resolvedEvidenceDir,`${taskId}.json`),existing=null;try{existing=readExisting(evidencePath,taskId)}catch(error49){throw telemetry.gateParseError(taskId,error49),error49}let requiredGates=existing?expandRequiredGates(existing.required_gates,gate):deriveRequiredGates(gate),updated={taskId,required_gates:requiredGates,turbo:turbo===!0?!0:existing?.turbo,test_engineer_exempt:existing?.test_engineer_exempt,gates:{...existing?.gates??{},[gate]:{sessionId,timestamp:new Date().toISOString(),agent:gate}}};await atomicWriteFile(evidencePath,JSON.stringify(updated,null,2))}),telemetry.gatePassed(sessionId,gate,taskId)}async function recordAgentDispatch(directory,taskId,agentType,turbo,context={}){assertValidTaskId(taskId),await withTaskEvidenceLock(directory,taskId,agentType,async()=>{let resolvedEvidenceDir=getEvidenceDir(directory),evidencePath=path56.join(resolvedEvidenceDir,`${taskId}.json`),existing=null;try{existing=readExisting(evidencePath,taskId)}catch(error49){throw telemetry.gateParseError(taskId,error49),error49}let requiredGates=existing?expandRequiredGates(existing.required_gates,agentType,context):deriveRequiredGates(agentType,context),updated={taskId,required_gates:requiredGates,turbo:turbo===!0?!0:existing?.turbo,test_engineer_exempt:agentType==="coder"?context.testEngineerExempt===!0&&!requiredGates.includes("test_engineer"):existing?.test_engineer_exempt,gates:existing?.gates??{}};await atomicWriteFile(evidencePath,JSON.stringify(updated,null,2))})}async function readTaskEvidence(directory,taskId){try{return assertValidTaskId(taskId),readExisting(getEvidencePath(directory,taskId),taskId)}catch{return null}}function readTaskEvidenceRaw(directory,taskId){assertValidTaskId(taskId);let evidencePath=getEvidencePath(directory,taskId);try{let raw=readFileSync21(evidencePath,"utf-8");return TaskEvidenceSchema.parse(JSON.parse(raw))}catch(error49){let code=error49.code;if(code==="ENOENT"||code==="ENAMETOOLONG")return null;throw error49}}async function hasPassedAllGates(directory,taskId){let evidence=await readTaskEvidence(directory,taskId);if(!evidence)return!1;if(!Array.isArray(evidence.required_gates)||evidence.required_gates.length===0)return!1;return evidence.required_gates.every((gate)=>evidence.gates[gate]!=null)}var GateEvidenceSchema,TaskEvidenceSchema,DEFAULT_REQUIRED_GATES;var init_gate_evidence=__esm(()=>{init_zod();init_task_file();init_telemetry();init_task_id();GateEvidenceSchema=exports_external.object({sessionId:exports_external.string(),timestamp:exports_external.string(),agent:exports_external.string()}).passthrough(),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(),test_engineer_exempt:exports_external.boolean().optional()}),DEFAULT_REQUIRED_GATES=["reviewer","test_engineer"]});import*as fs27 from"node:fs";import*as path57 from"node:path";function clearPendingCoderScope(){pendingCoderScopeByTaskId.clear()}async function prepareCoderScope(directory,input,args2){let plan=await loadPlanJsonOnly(directory);if(!plan){let rawTaskId=typeof args2.task_id==="string"?args2.task_id.trim():typeof args2.taskId==="string"?args2.taskId.trim():"";if(isStrictTaskId(rawTaskId)){let feedbackScope=await consumePrFeedbackScopeDeclaration(directory,input.sessionID,rawTaskId,input.callID);if(feedbackScope){let directives2=extractTaskFileDirectives(args2);if(directives2.present&&!directives2.files)throw Error("SCOPE_NOT_DECLARED: FILE: directives are present but empty or ambiguous; provide one complete relative path per FILE: line.");let resolved2=resolveCoderScopeSources({explicitFiles:feedbackScope.files,planFiles:null,fileDirectiveFiles:directives2.files});if(!resolved2.ok)throw Error(`${resolved2.code}: PR-feedback coder scope conflicts with the verified controller declaration.`);let binding2=createPrFeedbackScopeBinding({directory,taskId:rawTaskId,files:resolved2.files,ownerSessionId:input.sessionID,ownerMessageId:input.callID,dispatchCallId:input.callID,activation:"pending_child",workflowSessionId:input.sessionID,workflowRevisionDigest:feedbackScope.revisionDigest});if(!binding2)throw Error("SCOPE_NOT_DECLARED: PR-feedback scope could not be bound to this Task invocation.");return{plan:null,taskId:rawTaskId,declaredFiles:resolved2.files,binding:binding2}}}let planPath=path57.join(directory,".swarm","plan.json");throw Error(`SCOPE_NOT_DECLARED: no valid plan found at ${planPath} (file missing or invalid). Declare a plan via save_plan or run /swarm plan first.`)}let planTaskIds=new Set(plan.phases.flatMap((phase)=>phase.tasks.map((task)=>task.id))),taskId=resolveDelegatedPlanTaskId(args2,planTaskIds);if(!taskId)throw Error(`SCOPE_NOT_DECLARED: ${describeCoderScopeFailure(args2,planTaskIds)}`);if(!planTaskIds.has(taskId))throw Error(`SCOPE_NOT_DECLARED: task_id "${taskId}" does not match any known plan task id. Known: ${[...planTaskIds].sort().join(", ")||"(none)"}. Update the dispatch or revise the plan.`);let directives=extractTaskFileDirectives(args2);if(directives.present&&!directives.files)throw Error("SCOPE_NOT_DECLARED: FILE: directives are present but empty or ambiguous; provide one complete relative path per FILE: line.");let explicitBinding=getScopeBinding({directory,plan,taskId,ownerSessionId:input.sessionID})??readScopeBindingFromDisk({directory,plan,taskId,ownerSessionId:input.sessionID,requireDeclaration:!0}),declaredFiles=getPlanTaskDeclaredFiles(plan,taskId),resolved=resolveCoderScopeSources({explicitFiles:explicitBinding?.files,planFiles:declaredFiles,fileDirectiveFiles:directives.files});if(!resolved.ok)throw Error(`${resolved.code}: ${resolved.code==="SCOPE_CONFLICT"?"coder scope sources disagree or a lower-precedence source exceeds the authoritative scope.":"coder delegation has no complete, valid, non-empty scope."}`);let binding=createScopeBinding({directory,plan,taskId,files:resolved.files,ownerSessionId:input.sessionID,ownerMessageId:input.callID,dispatchCallId:input.callID,activation:"pending_child",source:resolved.source});if(!binding)throw Error("SCOPE_NOT_DECLARED: coder scope could not be bound to this Task invocation.");return{plan,taskId,declaredFiles,binding}}function isBackgroundTrue(value){return value===!0||value==="true"}function outputLooksLikeBackgroundRunning(output){if(typeof output!=="object"||output===null)return!1;let o=output;if(o.state==="running")return!0;let metadata=o.metadata;return typeof metadata==="object"&&metadata!==null&&metadata.background===!0}function isEnvelope(obj){if(typeof obj!=="object"||obj===null)return!1;let e=obj;return typeof e.taskId==="string"&&typeof e.targetAgent==="string"&&typeof e.action==="string"}function parseDelegationEnvelope(content,directory){let validateEnvelopePaths=(envelope2)=>{if(directory)for(let filePath of envelope2.files){try{validateSwarmPath(directory,filePath)}catch{return null}let resolvedPath=path57.resolve(directory,filePath);if(!fs27.existsSync(resolvedPath))return null}return envelope2};try{let parsed=JSON.parse(content);if(isEnvelope(parsed))return validateEnvelopePaths(parsed)}catch{let match=content.match(/\{[\s\S]*\}/);if(match)try{let parsed=JSON.parse(match[0]);if(isEnvelope(parsed))return validateEnvelopePaths(parsed)}catch{}}let lines=content.split(`
|
|
690
690
|
`),keyValueMap={};for(let line of lines){let match=line.match(/^([^:]+):\s*(.+)$/);if(match){let key=match[1].trim().toLowerCase(),value=match[2].trim();keyValueMap[key]=value}}let keyNormalization={taskid:"taskId",task_id:"taskId",targetagent:"targetAgent",target_agent:"targetAgent",commandtype:"commandType",command_type:"commandType",acceptancecriteria:"acceptanceCriteria",acceptance_criteria:"acceptanceCriteria",technicalcontext:"technicalContext",technical_context:"technicalContext",errorstrategy:"errorStrategy",error_strategy:"errorStrategy",platformnotes:"platformNotes",platform_notes:"platformNotes",action:"action",files:"files"},normalizedMap={};for(let[key,value]of Object.entries(keyValueMap)){let normalized=keyNormalization[key]||key;normalizedMap[normalized]=value}if(Object.keys(normalizedMap).length<3)return null;let requiredFields=["taskId","targetAgent","action","commandType","files","acceptanceCriteria"];for(let field of requiredFields)if(!normalizedMap[field])return null;let parseArrayField=(value)=>{let parts=value.split(",");if(parts.length===1)parts=value.split(";");return parts.map((s)=>s.trim()).filter((s)=>s.length>0)},envelope={taskId:normalizedMap.taskId,targetAgent:normalizedMap.targetAgent,action:normalizedMap.action,commandType:normalizedMap.commandType,files:parseArrayField(normalizedMap.files),acceptanceCriteria:parseArrayField(normalizedMap.acceptanceCriteria),technicalContext:normalizedMap.technicalContext||""};if(normalizedMap.technicalContext)envelope.technicalContext=normalizedMap.technicalContext;if(normalizedMap.errorStrategy)envelope.errorStrategy=normalizedMap.errorStrategy;if(normalizedMap.platformNotes)envelope.platformNotes=normalizedMap.platformNotes;return validateEnvelopePaths(envelope)}function validateDelegationEnvelope(envelope,context){if(typeof envelope!=="object"||envelope===null)return{valid:!1,reason:"envelope_not_object"};let e=envelope,requiredFields=["taskId","targetAgent","action","commandType","files","acceptanceCriteria"];for(let field of requiredFields)if(!(field in e)||e[field]===void 0||e[field]===null)return{valid:!1,reason:`missing_field_${field}`};if(e.commandType==="slash_command")return{valid:!1,reason:"slash_command_delegation_blocked"};let taskId=e.taskId;if(context.planTasks.length>0&&!context.planTasks.includes(taskId))return{valid:!1,reason:"taskId_not_in_plan"};let rawAgent=e.targetAgent,normalizedAgent=stripKnownSwarmPrefix(rawAgent);if(!context.validAgents.includes(normalizedAgent))return{valid:!1,reason:"invalid_target_agent"};let{action,files}=e;if((action==="implement"||action==="review")&&(!Array.isArray(files)||files.length===0))return{valid:!1,reason:"files_required_for_action"};let acceptanceCriteria=e.acceptanceCriteria;if(!Array.isArray(acceptanceCriteria)||acceptanceCriteria.length===0)return{valid:!1,reason:"acceptanceCriteria_required"};if("specCriteria"in e&&e.specCriteria!==void 0&&e.specCriteria!==null){let spec=e.specCriteria;if(typeof spec!=="object"||Array.isArray(spec))return{valid:!1,reason:"specCriteria_malformed"};let specObj=spec;for(let member of["fr","sc","acceptance"]){let value=specObj[member];if(value===void 0||value===null)continue;if(!Array.isArray(value)||!value.every((entry)=>typeof entry==="string"))return{valid:!1,reason:`specCriteria_${member}_malformed`}}}return{valid:!0}}function appendDelegationEnvelopeAdvisory(session,promptText,context){try{let envelope=parseDelegationEnvelope(promptText);if(!envelope)return null;let result=validateDelegationEnvelope(envelope,context);if(!result.valid)session.pendingAdvisoryMessages??=[],session.pendingAdvisoryMessages.push(`DELEGATION ENVELOPE ADVISORY: a parsed delegation envelope failed validation (${result.reason}). `+"This is advisory-only — the delegation was NOT blocked. Review the envelope's structured "+"fields (including the optional specCriteria acceptance/FR/SC arrays) before the next dispatch.");return result}catch{return null}}function validateCoderReviewerAcceptanceField(promptText){let lines=promptText.split(/\r?\n/),headerRe=/^ACCEPTANCE:[ \t]*(.*)$/i,nextFieldRe=/^[A-Z][A-Z0-9_]*:/;for(let i=0;i<lines.length;i++){let match=headerRe.exec(lines[i]);if(!match)continue;if(match[1].trim().length>0)return{valid:!0};for(let j=i+1;j<lines.length;j++){if(nextFieldRe.test(lines[j]))break;if(lines[j].trim().length>0)return{valid:!0}}return{valid:!1,reason:"acceptance_field_empty"}}return{valid:!1,reason:"acceptance_field_missing"}}function extractSpecRequirementBodyById(specText,id){let escapedId=id.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),lines=specText.split(/\r?\n/),headerRe=new RegExp(`^\\s*[-*]?\\s*\\*\\*\\s*${escapedId}\\b`),headerIdx=-1;for(let i=0;i<lines.length;i++)if(headerRe.test(lines[i])){headerIdx=i;break}if(headerIdx===-1)return null;let headerLine=lines[headerIdx],openIdx=headerLine.indexOf("**"),closeIdx=openIdx===-1?-1:headerLine.indexOf("**",openIdx+2);if(closeIdx===-1)return null;let body=headerLine.slice(closeIdx+2);for(let i=headerIdx+1;i<lines.length;i++){let line=lines[i];if(line.trim().length===0)break;if(/^#/.test(line))break;if(/^\s*[-*]\s/.test(line))break;if(/^\s*[-*]?\s*\*\*\s*(?:FR|SC)-/.test(line))break;body+=` ${line}`}return body}function normalizeAcceptanceText(s){return s.normalize("NFC").replace(/`/g,"").replace(/\*\*/g,"").replace(/\*/g,"").replace(/^[ \t]*[-*][ \t]+/gm,"").replace(/[‘’]/g,"'").replace(/[“”]/g,'"').replace(/[—–]/g,"-").replace(/-{2,}/g,"-").replace(/Â?§/g," section ").replace(/\s+/g," ").trim().toLowerCase()}function describeCoverageMiss(params){let{normalizedExpected,normalizedAcceptance}=params,divergenceOffset=0,maxScan=Math.min(normalizedExpected.length,COVERAGE_DIAG_MAX_SCAN);while(divergenceOffset<maxScan&&normalizedAcceptance.includes(normalizedExpected.slice(0,divergenceOffset+1)))divergenceOffset++;let expectedSnippet=normalizedExpected.slice(divergenceOffset,divergenceOffset+COVERAGE_DIAG_SNIPPET_CAP),matchedPrefix=normalizedExpected.slice(0,divergenceOffset),foundIdx=matchedPrefix.length>0?normalizedAcceptance.indexOf(matchedPrefix):-1,foundPos=foundIdx>=0?foundIdx+matchedPrefix.length:0,foundSnippet=normalizedAcceptance.slice(foundPos,foundPos+COVERAGE_DIAG_SNIPPET_CAP),raw=`${params.rawExpectedBody}
|
|
691
691
|
${params.rawAcceptanceText}`,corruptionHint;if(/�/.test(raw))corruptionHint="the text contains U+FFFD (the Unicode replacement char), a sign spec.md was decoded with the wrong encoding — re-save spec.md as UTF-8";else if(/\?{2,}/.test(raw))corruptionHint="the text contains a '??' run — a non-UTF-8 save can turn characters like § into ?? on disk; open .swarm/spec.md and re-type the affected character, then re-save as UTF-8";else if(/Ã.|â€|Â[^\s]/.test(raw))corruptionHint="the text contains a Latin-1 mojibake byte sequence (e.g. §, é) — re-save spec.md as UTF-8";return{expectedSnippet,foundSnippet,divergenceOffset,...corruptionHint?{corruptionHint}:{}}}function checkAcceptanceCoversFrRefs(params){let normalizedAcceptance=normalizeAcceptanceText(params.acceptanceText);for(let id of params.frRefs){let body=extractSpecRequirementBodyById(params.specText,id);if(body===null)continue;let normalizedBody=normalizeAcceptanceText(body);if(normalizedBody.length===0)continue;if(!normalizedAcceptance.includes(normalizedBody))return{covered:!1,missingId:id,diagnostic:describeCoverageMiss({rawExpectedBody:body,rawAcceptanceText:params.acceptanceText,normalizedExpected:normalizedBody,normalizedAcceptance})}}return{covered:!0}}function extractTaskLine(text){let match=text.match(/TASK:\s*(.+?)(?:\n|$)/i);return match?match[1].trim():null}function extractPlanTaskId(text){let taskListMatch=text.match(/^[ \t]*-[ \t]*(?:\[[ x]\][ \t]+)?(\d+\.\d+(?:\.\d+)*)[:. ]/m);if(taskListMatch)return taskListMatch[1];let taskLineMatch=text.match(/TASK:\s*(?:.+?\s)?(\d+\.\d+(?:\.\d+)*)(?:\s|$|:)/i);if(taskLineMatch)return taskLineMatch[1];return null}function outputText(output){if(typeof output==="string")return output;if(typeof output==="number"||typeof output==="boolean")return String(output);if(Array.isArray(output))return output.map(outputText).filter(Boolean).join(`
|
|
@@ -5987,14 +5987,14 @@ ${promptRaw}`,log("[delegate-directive-injection] injected",{caller_agent:caller
|
|
|
5987
5987
|
`);try{injectAdvisory(architectSessionId,summary)}catch{}}}}var WRITE_TOOL_PATTERNS=["write","edit","patch","create","insert","replace","append","prepend"];function isWriteTool3(toolName){let normalized=normalizeToolNameLowerCase(toolName);return WRITE_TOOL_PATTERNS.some((p)=>normalized.includes(p))}var READ_TOOL_PATTERNS=["read","cat","view","fetch","get"];function isReadTool(toolName){let normalized=normalizeToolNameLowerCase(toolName);return READ_TOOL_PATTERNS.some((p)=>normalized.includes(p))}init_constants();init_schema();import*as fs110 from"node:fs";init_constants();import*as fs109 from"node:fs";import*as path200 from"node:path";var READ_ONLY_TOOLS2=new Set(["check_gate_status","completion_verify","evidence_check","get_approved_plan","get_qa_gate_profile","diff","diff_summary","imports","symbols","batch_symbols","search","repo_map","retrieve_summary","knowledge_recall","knowledge_query","co_change_analyzer","complexity_hotspots","detect_domains","lint","lint_spec","pkg_audit","placeholder_scan","pre_check_batch","quality_budget","sast_scan","sbom_generate","schema_drift","secretscan","syntax_check","test_impact","todo_extract","doc_scan","doc_extract","req_coverage","req_coverage".toLowerCase(),"read","glob","grep","list","ls","view"]),WRITE_LIKE_TOOLS=new Set([...WRITE_TOOL_NAMES,"multiedit","multi_edit","todo_write","save_plan","update_task_status","phase_complete","declare_scope","declare_council_criteria","submit_council_verdicts","submit_phase_council_verdicts","set_qa_gates","write_retro","write_drift_evidence","write_hallucination_evidence","write_mutation_evidence","knowledge_add","knowledge_remove","curator_analyze","consensus_mine","suggest_patch"]),SHELL_TOOLS=new Set(["bash","shell","exec","run"]),NETWORK_TOOLS=new Set(["web_search","webfetch","web_fetch","fetch","http","request","gitingest"]),SUBAGENT_TOOLS=new Set(["task","agent","delegate"]),HIGH_RISK_BUILD_PATHS=["src/index.ts","src/hooks/guardrails.ts","src/hooks/delegation-gate.ts","src/hooks/scope-guard.ts","src/hooks/full-auto-permission.ts","src/hooks/full-auto-intercept.ts","src/full-auto/","src/config/schema.ts","src/config/constants.ts","src/tools/phase-complete.ts","src/tools/index.ts","package.json","package-lock.json","bun.lock","biome.json","tsconfig.json","CHANGELOG.md",".release-please-manifest.json","release-please-config.json","dist/",".github/workflows/"],ALWAYS_PROTECTED_PREFIXES=[".git/",".git\\"],PROTECTED_PATH_DEFAULTS=[".git",".github/workflows",".opencode",".swarm","package.json","package-lock.json","bun.lock","CHANGELOG.md",".release-please-manifest.json","release-please-config.json"],SAFE_SHELL_PATTERNS=[/^(?:cat|head|tail|less|more|file|stat|wc|sort|uniq|tr|cut|awk|sed)\b/,/^(?:ls|pwd|whoami|hostname|uname|env|date|which|type|tree)\b/,/^(?:echo|printf|true|false|test)\b/,/^(?:grep|rg|ag|find|fd|locate)\b/,/^git\s+(?:status|log|show|diff|branch|describe|rev-parse|rev-list|ls-files|config\s+--get|remote\s+-v|stash\s+list)/,/^(?:bun|npm|yarn|pnpm)\s+(?:run\s+(?:typecheck|lint|test|build)|test|typecheck|lint)\b/,/^node\s+(?:--version|-v|--input-type)/,/^bunx\s+biome\s+(?:ci|check|lint|format)\b/],DENY_SHELL_PATTERNS=[/\brm\s+(?:-[^\s]*\s+)*(?:\/|~|\.)?\s*$|\brm\s+-[rRf]+/i,/\bdd\s+if=/i,/\bmkfs\b/i,/\bshutdown\b|\breboot\b|\bhalt\b|\bpoweroff\b/i,/\b(?:chown|chmod)\s+-R\s+/i,/\bkill\s+-9\b/i,/\bpkill\b|\bkillall\b/i,/\bgit\s+push\s+--force(?!-with-lease)/i,/\bgit\s+push\s+(?:[^\s]+\s+)?(?:main|master|production|prod)\b/i,/\bgit\s+reset\s+--hard\b/i,/\bgit\s+clean\s+-(?:f|d|x)/i,/\bgit\s+branch\s+-D\b/i,/\bgit\s+checkout\s+\.|\bgit\s+restore\s+\./i,/\b(?:cat|head|tail|less|more)\s+[^\n]*(?:\.env|credentials|id_rsa|id_ed25519|\.pem|\.key)/i,/\bprintenv\b.*(?:SECRET|TOKEN|KEY|PASSWORD)/i,/\bcurl\s+[^|]*\|\s*(?:sh|bash|zsh|fish)\b/i,/\bwget\s+[^|]*\|\s*(?:sh|bash|zsh|fish)\b/i,/\bsudo\s+(?:rm|chmod|chown|dd|mkfs|shutdown)/i,/\bnpm\s+publish\b/i,/\bbun\s+publish\b/i,/\bbunx?\s+publish\b/i,/\bterraform\s+(?:apply|destroy)\b/i,/\bkubectl\s+(?:delete|apply\s+-f)/i,/\bdrop\s+(?:database|table)\b/i,/\bsed\s+-i\b(?=[^\n]*\b(?:biome\.json|eslintrc|oxlintrc)\b)(?=[^\n]*\b(?:error|warn|off)\b)/i,/\b(?:cat|tee)\b[^\n]*>\s*[^\n]*\b(biome\.json|eslintrc|oxlintrc)\b[^\n]*\b(error|warn|off)\b/i],ESCALATE_SHELL_PATTERNS=[/\bcurl\b/i,/\bwget\b/i,/\bssh\b/i,/\bscp\b/i,/\brsync\b/i,/\bsudo\b/i,/\bchmod\b/i,/\bchown\b/i,/\bnpm\s+(?:install|i|add)\b/i,/\bbun\s+(?:install|i|add|remove|update)\b/i,/\byarn\s+(?:install|add|remove|upgrade)\b/i,/\bpnpm\s+(?:install|add|remove|update)\b/i,/\bpip\s+install\b/i,/\bgit\s+push\b/i,/\bgit\s+pull\b/i,/\bgit\s+rebase\b/i,/\bgit\s+merge\b/i,/\bgit\s+commit\b/i,/\b(sed\s+-i|echo\s+|printf\s+)[^\n]*\b(biome\.jsonc?|eslintrc|eslint\.config|oxlintrc|prettierrc|secretscanignore|golangci|tsconfig\.json|tsconfig\.[^.]+\.json)\b/i,/\b(?:cat|tee)\b[^\n]*>\s*[^\n]*\b(biome\.jsonc?|eslintrc|eslint\.config|oxlintrc|prettierrc|secretscanignore|golangci|tsconfig\.json|tsconfig\.[^.]+\.json)\b/i];function isReadOnlyTool(toolName){if(!toolName)return!1;return READ_ONLY_TOOLS2.has(toolName.toLowerCase())}function isWriteLikeTool(toolName){if(!toolName)return!1;return WRITE_LIKE_TOOLS.has(toolName.toLowerCase())}function isSubagentDelegation(toolName,args2){let lower=toolName?.toLowerCase()??"";if(SUBAGENT_TOOLS.has(lower))return!0;if(lower==="task"&&args2&&typeof args2==="object")return!0;return!1}function isWithinDirectory(target,root){if(!target||!root)return!1;let resolvedTarget=path200.resolve(target),resolvedRoot=path200.resolve(root);if(resolvedTarget===resolvedRoot)return!0;let withSep=resolvedRoot.endsWith(path200.sep)?resolvedRoot:resolvedRoot+path200.sep;if(process.platform==="win32")return resolvedTarget.toLowerCase().startsWith(withSep.toLowerCase());return resolvedTarget.startsWith(withSep)}var SEGMENT_PROTECTED=new Set([".git",".swarm","package.json","package-lock.json","bun.lock","CHANGELOG.md",".release-please-manifest.json","release-please-config.json"]);function isProtectedPath2(filePath,config3){if(!filePath)return!1;let normalized=normalizePath(filePath);for(let prefix of ALWAYS_PROTECTED_PREFIXES){let np=normalizePath(prefix);if(normalized===np||normalized.startsWith(`${np}/`))return!0}let segments=normalized.split("/").filter(Boolean),allowDefaults=config3?.permission_policy?.allow_defaults!==!1;if(allowDefaults){for(let seg of segments)if(SEGMENT_PROTECTED.has(seg))return!0}let protectedList=[...allowDefaults?PROTECTED_PATH_DEFAULTS:[],...config3?.permission_policy?.protected_paths??[]];for(let candidate of protectedList){let c=normalizePath(candidate);if(!c)continue;if(normalized===c)return!0;if(normalized.startsWith(`${c}/`))return!0;if(!c.includes("/")&&segments.includes(c))return!0}return!1}function classifyPathRisk(filePath,context){if(!filePath)return{withinProjectRoot:!1,withinDeclaredScope:null,protected:!1,highRiskBuild:!1};let absolute=path200.isAbsolute(filePath)?filePath:path200.resolve(context.directory,filePath),resolvedAbsolute=(()=>{try{let candidate=absolute,depth=0;while(depth<32){if(fs109.existsSync(candidate)){if(isWithinDirectory(candidate,context.directory))try{return fs109.realpathSync(candidate)}catch{return candidate}return absolute}let parent=path200.dirname(candidate);if(parent===candidate)break;candidate=parent,depth+=1}return absolute}catch{return absolute}})(),withinProjectRoot=isWithinDirectory(absolute,context.directory)&&isWithinDirectory(resolvedAbsolute,context.directory),relative38=normalizePath(path200.relative(context.directory,absolute)),withinDeclaredScope=null;if(Array.isArray(context.declaredScope))withinDeclaredScope=context.declaredScope.length===0?!1:context.declaredScope.some((scope)=>{let s=normalizePath(scope);if(!s)return!1;return relative38===s||relative38.startsWith(`${s}/`)});let highRiskBuild=HIGH_RISK_BUILD_PATHS.some((entry)=>{let e=normalizePath(entry);if(e.endsWith("/"))return relative38.startsWith(e);return relative38===e||relative38.startsWith(`${e}/`)});return{withinProjectRoot,withinDeclaredScope,protected:!1,highRiskBuild}}var SHELL_METACHARACTER_PATTERN=/[|&;<>`$]|\$\(|\\\n/;function classifyCommandRisk(command,_cwd,_context){if(!command||typeof command!=="string")return{decision:"escalate_critic",reason:"shell command empty or non-string — cannot classify deterministically"};let trimmed=command.trim();for(let re of DENY_SHELL_PATTERNS)if(re.test(trimmed))return{decision:"deny",reason:`shell command matches deny pattern (${re.source})`};let hasMetacharacter=SHELL_METACHARACTER_PATTERN.test(trimmed);if(!hasMetacharacter){for(let re of SAFE_SHELL_PATTERNS)if(re.test(trimmed))return{decision:"allow",reason:"shell command matches deterministically safe pattern"}}for(let re of ESCALATE_SHELL_PATTERNS)if(re.test(trimmed))return{decision:"escalate_critic",reason:`shell command matches escalate pattern (${re.source})`};if(hasMetacharacter)return{decision:"escalate_critic",reason:"shell command contains metacharacters (|, &, ;, <, >, $, backtick) — verify with critic"};return{decision:"escalate_critic",reason:"shell command not in deterministic allow/deny set"}}var PATH_ARG_KEYS=["file_path","filepath","path","file","target","to","dest","destination","output_path"];function extractPathArgs(toolName,args2){if(!args2||typeof args2!=="object")return[];let found=[];for(let key of PATH_ARG_KEYS){let v=args2[key];if(typeof v==="string"&&v.trim())found.push(v)}let filesArg=args2.files;if(Array.isArray(filesArg)){for(let f of filesArg)if(typeof f==="string"&&f.trim())found.push(f);else if(f&&typeof f==="object"&&typeof f.path==="string")found.push(f.path)}let editsArg=args2.edits;if(Array.isArray(editsArg)){for(let e of editsArg)if(e&&typeof e==="object"&&typeof e.file_path==="string")found.push(e.file_path)}if(toolName==="declare_scope"&&Array.isArray(args2.files));return found}function extractCommandArg(args2){if(!args2||typeof args2!=="object")return;return typeof args2.command==="string"&&args2.command||typeof args2.cmd==="string"&&args2.cmd||typeof args2.script==="string"&&args2.script||void 0}function extractURLArg(args2){if(!args2||typeof args2!=="object")return;return typeof args2.url==="string"&&args2.url||typeof args2.uri==="string"&&args2.uri||typeof args2.endpoint==="string"&&args2.endpoint||void 0}function isTrustedDomain(url3,config3){let domains=config3?.permission_policy?.trusted_domains??[];if(domains.length===0)return!1;let host="";try{host=new URL(url3).hostname.toLowerCase()}catch{return!1}return domains.some((d)=>{let dl=d.toLowerCase();return host===dl||host.endsWith(`.${dl}`)})}function classifyFullAutoToolAction(input){let tool3=input.toolName?.toLowerCase()??"",config3=input.fullAutoConfig,mode=config3?.mode??"supervised";if(!(mode==="strict"||config3?.permission_policy?.enabled!==!1))return{action:"allow",reason:"permission policy disabled by config",tier:"local"};if(isReadOnlyTool(tool3))return{action:"allow",reason:"read-only tool",tier:"safe"};if(isSubagentDelegation(tool3,input.args)){let subagentName=typeof input.args?.subagent_type==="string"&&input.args.subagent_type||typeof input.args?.agent==="string"&&input.args.agent||"unknown";return{action:"escalate_critic",reason:"subagent delegation requires plan/scope verification",risk:"high",context:{tool:tool3,subagent:subagentName,currentTaskID:input.currentTaskID,currentPhase:input.currentPhase}}}if(tool3==="phase_complete")return{action:"escalate_critic",reason:"phase_complete requires Full-Auto approval evidence",risk:"high",context:{tool:tool3,currentPhase:input.currentPhase}};if(tool3==="update_task_status"){let status=typeof input.args?.status==="string"&&input.args.status||"";if(status==="completed"){if(mode==="strict"||config3?.oversight?.on_task_completion===!0)return{action:"escalate_critic",reason:"task completion requires Full-Auto critic verification",risk:"medium",context:{tool:tool3,status}}}else{if(mode==="strict")return{action:"escalate_critic",reason:`strict mode: update_task_status with status=${status} requires critic verification`,risk:"medium",context:{tool:tool3,status}};return{action:"allow",reason:`update_task_status with status=${status} is a routine state change`,tier:"local"}}}if(tool3==="save_plan")return{action:"escalate_critic",reason:"plan mutation requires Full-Auto critic verification",risk:"high",context:{tool:tool3}};if(NETWORK_TOOLS.has(tool3)){let url3=extractURLArg(input.args);if(url3&&isTrustedDomain(url3,config3))return{action:"allow",reason:"network tool with trusted domain",tier:"local"};return{action:"escalate_critic",reason:"network/web tool — verify intent and target",risk:"medium",context:{tool:tool3,url:url3}}}if(SHELL_TOOLS.has(tool3)){let command=extractCommandArg(input.args);if(!command)return{action:"deny",reason:"shell tool invoked without a command argument",code:"shell_no_command",recoverable:!0};let cmdRisk=classifyCommandRisk(command,input.workingDirectory??"",{directory:input.directory});if(cmdRisk.decision==="deny")return{action:"deny",reason:cmdRisk.reason,code:"shell_deny",recoverable:!0};if(cmdRisk.decision==="allow")return{action:"allow",reason:cmdRisk.reason,tier:"local"};return{action:"escalate_critic",reason:cmdRisk.reason,risk:"medium",context:{tool:tool3,command}}}if(isWriteLikeTool(tool3)||tool3==="patch"||tool3==="edit"){let paths=extractPathArgs(tool3,input.args);if(paths.length===0){if(new Set(["declare_scope","declare_council_criteria","submit_council_verdicts","submit_phase_council_verdicts","set_qa_gates","write_retro","write_drift_evidence","write_hallucination_evidence","write_mutation_evidence","knowledge_add","knowledge_remove","curator_analyze","consensus_mine"]).has(tool3))return{action:"allow",reason:`pathless plan/evidence tool '${tool3}' allowed under Full-Auto`,tier:"local"};return{action:"escalate_critic",reason:"write-like tool without explicit path — verify side effects",risk:"medium",context:{tool:tool3,args:input.args}}}for(let p of paths){let risk=classifyPathRisk(p,{directory:input.directory,declaredScope:input.declaredScope??null});if(!risk.withinProjectRoot)return{action:"deny",reason:`write target outside project root: ${p}`,code:"path_out_of_root",recoverable:!0};if(isProtectedPath2(path200.relative(input.directory,path200.resolve(input.directory,p)),config3))return{action:"escalate_critic",reason:`write to protected path requires critic approval: ${p}`,risk:"high",context:{tool:tool3,path:p}};if(risk.highRiskBuild)return{action:"escalate_critic",reason:`write to high-risk build/plugin path requires critic approval: ${p}`,risk:"high",context:{tool:tool3,path:p}};if(input.normalizedAgentName==="coder"&&Array.isArray(input.declaredScope)&&input.declaredScope.length>0&&risk.withinDeclaredScope===!1)return{action:"deny",reason:`coder write outside declared scope: ${p}`,code:"path_out_of_scope",recoverable:!0}}return{action:"allow",reason:"write within project root and declared scope",tier:"local"}}return{action:"escalate_critic",reason:`tool '${tool3||"<empty>"}' not deterministically classifiable`,risk:"medium",context:{tool:tool3}}}function buildStructuredDenial(decision,tool3){return{full_auto_denial:!0,tool:tool3,code:decision.code,reason:decision.reason,recoverable:decision.recoverable,guidance:decision.recoverable?"Choose a safer path: stay within the project root, respect declared scope, avoid destructive shell, and avoid protected paths. Consider declaring scope or escalating to a human.":"This action cannot be retried under Full-Auto. Ask a human to authorize it."}}init_state3();init_file_locks();init_state2();init_logger();init_normalize_tool_name();init_utils2();var RETURN_WARNING_PATTERNS=[{category:"skipped_tests",regex:/\b(?:skipped (?:the )?tests?|tests? (?:were |was )?skipped|did(?:n['']t)? run tests?|tests? not run|bypass(?:ed)? (?:the )?tests?|test (?:step|phase) (?:was )?bypass|tests? (?:are )?failing|tests? (?:are )?broken)\b/i},{category:"tool_timeout",regex:/\b(?:tool|process|command|test|build|lint)\s+(?:timed out|timeout|hung|killed|aborted|terminated|did not (?:complete|finish))/i},{category:"scope_changed",regex:/\b(?:expanded|changed|widened|exceeded|broke|extended|enlarged|grew|altered|adjusted) (?:the )?(?:declared |working |task |allowed )?(?:scope|file ?list|file ?set|working set|set of files)\b|\bscope (?:expansion|creep|drift|change)\b/i},{category:"external_instructions",regex:/\b(?:followed |received |applied |honored |obeyed )?(?:instructions|directives|guidance|orders|commands|hints) (?:from|in|per|according to) (?:the )?(?:tool output|web|search|fetched|fetch|external|untrusted|upstream|page|site|doc|documentation|response|prompt)\b|\bper (?:the )?(?:upstream|external|fetched|web|tool) (?:doc|documentation|page|response|content|guidance)\b/i},{category:"unable_to_verify",regex:/\b(?:unable|could ?n['']t|cannot|can ?not|wasn['']?t able) (?:to )?(?:verify|confirm|reproduce|test|check|validate|prove)\b|\bverification (?:deferred|skipped|postponed|incomplete|pending|impossible)\b/i},{category:"missing_evidence",regex:/\b(?:no |missing |without |lacking )(?:evidence|proof|verification|tests? passing|test results|coverage)\b|\bevidence (?:is )?(?:missing|absent|unavailable)\b/i},{category:"out_of_scope_files",regex:/\b(?:created|generated|wrote|modified|added|edited|patched|touched) (?:files? |code )?(?:outside|beyond|past|not in|that (?:are|were) outside) (?:the )?(?:declared |task |coder |allowed )?(?:scope|file ?list|file ?set|allowed (?:paths|files))\b/i}],SEVERE_CATEGORIES=new Set(["external_instructions","out_of_scope_files"]),CANONICAL_ROLES_LOWER=new Set(ALL_AGENT_NAMES.map((s)=>s.toLowerCase()));function isExactCanonicalRole(name){return CANONICAL_ROLES_LOWER.has(name.toLowerCase())}function isTaskTool5(toolName){let lower=toolName?.toLowerCase()??"";return lower==="task"||lower==="agent"||lower==="delegate"}function extractText(value){if(typeof value==="string")return value;if(value&&typeof value==="object"){let o=value;if(typeof o.output==="string")return o.output;if(typeof o.text==="string")return o.text;if(typeof o.summary==="string")return o.summary;try{return JSON.stringify(o)}catch{return""}}return""}function detectReturnWarnings(text){let warnings=[];if(!text)return warnings;let seen=new Set;for(let{category,regex}of RETURN_WARNING_PATTERNS){let m=text.match(regex);if(!m)continue;let key=`${category}:${m[0].toLowerCase()}`;if(seen.has(key))continue;seen.add(key),warnings.push({category,matched:m[0]})}return warnings}async function writeDelegationEvent(directory,event){let lockTaskId=`full-auto-delegation-${Date.now()}`,lockResult;try{lockResult=await tryAcquireLock(directory,"events.jsonl","full-auto-delegation",lockTaskId)}catch(error93){warn(`[full-auto/delegation] failed to acquire lock: ${error93 instanceof Error?error93.message:String(error93)}`)}try{let eventsPath=validateSwarmPath(directory,"events.jsonl");fs110.appendFileSync(eventsPath,`${JSON.stringify(event)}
|
|
5988
5988
|
`,"utf-8")}catch(error93){throw error48(`[full-auto/delegation] failed to write event: ${error93 instanceof Error?error93.message:String(error93)}`),error93}finally{if(lockResult?.acquired&&lockResult.lock._release)try{await lockResult.lock._release()}catch(releaseError){error48("[full-auto/delegation] lock release failed:",releaseError)}}}function createFullAutoDelegationHook(options){let{config:config3,directory}=options;return{toolBefore:async(input,output)=>{let tool3=(normalizeToolName(input.tool)??input.tool??"").toLowerCase();if(!isTaskTool5(tool3))return;let sessionID=input.sessionID;if(!sessionID)return;let runState=loadFullAutoRunState(directory,sessionID);if(!runState||runState.status!=="running")return;let args2=output.args??{},subagentRaw=typeof args2.subagent_type==="string"&&args2.subagent_type||typeof args2.agent==="string"&&args2.agent||"",generatedAgentRegistry=swarmState.generatedAgentNames,canonicalRole=generatedAgentRegistry.length>0?resolveGeneratedAgentRole(subagentRaw,generatedAgentRegistry):getCanonicalAgentRole(subagentRaw);if(subagentRaw&&canonicalRole!==subagentRaw&&!isExactCanonicalRole(subagentRaw)){if(!subagentRaw.slice(0,subagentRaw.length-canonicalRole.length-1))throw Error(`FULL_AUTO_DELEGATION_DENY: subagent name '${subagentRaw}' has no valid prefix before the canonical role '${canonicalRole}'. Generated agent names must include a non-empty swarm prefix.`)}let promptText=typeof args2.prompt==="string"&&args2.prompt||typeof args2.message==="string"&&args2.message||typeof args2.task==="string"&&args2.task||"";if(incrementFullAutoCounter(directory,sessionID,"coderDelegations"),!subagentRaw||!isKnownCanonicalRole(canonicalRole))throw Error(`FULL_AUTO_DELEGATION_DENY: unknown subagent '${subagentRaw}' (canonical role '${canonicalRole}' is not a registered plugin role). Choose a generated agent whose suffix matches one of the canonical roles.`);if(promptText&&typeof promptText==="string"){let candidatePaths=promptText.match(/\b[A-Za-z0-9._/-]+\.(?:ts|tsx|js|jsx|json|md|yml|yaml|toml|lock|sh|env)\b/g);if(candidatePaths){for(let p of candidatePaths)if(isProtectedPath2(p,config3.full_auto))await writeDelegationEvent(directory,{type:"full_auto_subagent_warning",timestamp:new Date().toISOString(),session_id:sessionID,subagent:subagentRaw,canonical_role:canonicalRole,phase:"outbound",category:"protected_path_in_prompt",matched:p})}}},toolAfter:async(input,output)=>{let tool3=(normalizeToolName(input.tool)??input.tool??"").toLowerCase();if(!isTaskTool5(tool3))return;let sessionID=input.sessionID;if(!sessionID)return;let runState=loadFullAutoRunState(directory,sessionID);if(!runState||runState.status!=="running")return;let text=extractText(output.output),warnings=detectReturnWarnings(text);if(warnings.length===0)return;let severe=warnings.some((w)=>SEVERE_CATEGORIES.has(w.category));if(await writeDelegationEvent(directory,{type:"full_auto_subagent_warning",timestamp:new Date().toISOString(),session_id:sessionID,phase:"return",warnings,severe}),runState.counters.consecutiveNoProgressTurns=severe?runState.counters.consecutiveNoProgressTurns+1:runState.counters.consecutiveNoProgressTurns,saveFullAutoRunState(directory,runState),severe){let updated=loadFullAutoRunState(directory,sessionID);if(updated&&updated.status==="running")updated.status="paused",updated.pauseReason=`severe subagent return warning: ${warnings.filter((w)=>SEVERE_CATEGORIES.has(w.category)).map((w)=>w.category).join(",")}`,saveFullAutoRunState(directory,updated)}}}}import*as fs111 from"node:fs";var PATTERNS=[{category:"instruction_override",regex:/\bignore (?:all |any |the )?(?:previous|prior|earlier|above) (?:instructions|prompts|rules|directives)\b/i},{category:"instruction_override",regex:/\bdisregard (?:all |any |the )?(?:previous|prior|earlier|above) (?:instructions|prompts|rules)\b/i},{category:"instruction_override",regex:/\bforget (?:all |any |everything|the )?(?:previous|above|prior) (?:instructions|prompts|rules)\b/i},{category:"system_role_override",regex:/\b(?:you are now|act as|pretend to be|from now on you are)\s+(?:a |an |the )?(?:system|developer|root|admin|superuser)\b/i},{category:"system_role_override",regex:/\b<\|?(?:system|developer|im_start|imstart)\|?>/i},{category:"credential_request",regex:/\b(?:please |kindly |)(?:paste|share|reveal|send|provide|leak|print|echo|cat) (?:your |the |my )?(?:api[_ -]?key|password|token|secret|credentials|\.env)\b/i},{category:"credential_request",regex:/\b(?:show|dump|export) (?:env(?:ironment)?|secrets|credentials|keys?)\b/i},{category:"exfiltration_request",regex:/\b(?:upload|exfiltrate|send) (?:contents of |files? from |the )?(?:home|repo|workspace|project|secrets?|env(?:ironment)?)\b/i},{category:"exfiltration_request",regex:/\bcurl\s+-d\s+@/i},{category:"guardrail_disable_request",regex:/\bdisable (?:full[- ]auto|guardrails?|safety|policy|oversight|critic)\b/i},{category:"guardrail_disable_request",regex:/\bturn (?:off|disable) (?:full[- ]auto|guardrails?|safety|policy)\b/i},{category:"curl_pipe_shell",regex:/\bcurl\b[^|\n]*\|\s*(?:sh|bash|zsh|fish)\b/i},{category:"untrusted_run_command",regex:/\b(?:run|execute|paste) (?:this|the following) (?:command|script|bash|shell)\b/i}];function buildExcerpt(text,match){let idx=match.index??0,start=Math.max(0,idx-120),end=Math.min(text.length,idx+match[0].length+120),slice=text.slice(start,end).replace(/\s+/g," ").trim();return slice.length>280?`${slice.slice(0,280)}…`:slice}function probeFullAutoInput(text){let warnings=[];if(!text||typeof text!=="string")return{hasWarning:!1,warnings};let seen=new Set;for(let{category,regex}of PATTERNS){let m=text.match(regex);if(!m)continue;let key=`${category}:${m[0].toLowerCase()}`;if(seen.has(key))continue;seen.add(key),warnings.push({category,matched:m[0],excerpt:buildExcerpt(text,m)})}return{hasWarning:warnings.length>0,warnings}}var RISKY_FOLLOWUP_TOOLS=new Set(["bash","shell","exec","web_search","webfetch","web_fetch","fetch","http","request"]),SECRET_TOOL_PATTERNS=[/\b(?:cat|head|tail|less|more)\s+[^\n]*\.env/i,/\bprintenv\b.*(?:SECRET|TOKEN|KEY|PASSWORD)/i];function shouldEscalateAfterWarning(toolName,commandOrUrl){let lower=toolName?.toLowerCase()??"";if(RISKY_FOLLOWUP_TOOLS.has(lower))return!0;if(typeof commandOrUrl==="string"){for(let re of SECRET_TOOL_PATTERNS)if(re.test(commandOrUrl))return!0}return!1}init_state3();init_file_locks();init_logger();init_normalize_tool_name();init_utils2();var PROBED_TOOLS=new Set(["web_search","webfetch","web_fetch","fetch","http","request","doc_extract","doc_scan","gitingest","extract_code_blocks","retrieve_summary","retrieve_lane_output","search","read","view"]);async function writeWarningEvent(directory,sessionID,tool3,probe2){let event={type:"full_auto_input_warning",timestamp:new Date().toISOString(),session_id:sessionID,tool:tool3,warnings:probe2.warnings},lockTaskId=`full-auto-input-warning-${Date.now()}`,lockResult;try{lockResult=await tryAcquireLock(directory,"events.jsonl","full-auto-input-warning",lockTaskId)}catch(error93){warn(`[full-auto/input-probe] failed to acquire lock: ${error93 instanceof Error?error93.message:String(error93)}`)}try{let eventsPath=validateSwarmPath(directory,"events.jsonl");fs111.appendFileSync(eventsPath,`${JSON.stringify(event)}
|
|
5989
5989
|
`,"utf-8")}catch(error93){error48(`[full-auto/input-probe] failed to write event: ${error93 instanceof Error?error93.message:String(error93)}`)}finally{if(lockResult?.acquired&&lockResult.lock._release)try{await lockResult.lock._release()}catch(releaseError){error48("[full-auto/input-probe] lock release failed:",releaseError)}}}function extractText2(out){if(typeof out==="string")return out;if(out&&typeof out==="object"){let candidate=out;if(typeof candidate.output==="string")return candidate.output;if(typeof candidate.text==="string")return candidate.text;if(typeof candidate.body==="string")return candidate.body;try{return JSON.stringify(candidate)}catch{return""}}return""}var MAX_TRACKED_SESSIONS6=256,WARNING_TTL_MS=300000,fullAutoInputWarningStash=new Map;function isExpired2(w,nowMs=Date.now()){let at=Date.parse(w.at);if(!Number.isFinite(at))return!0;return nowMs-at>WARNING_TTL_MS}function evictExpired(){let now=Date.now();for(let[sid,w]of fullAutoInputWarningStash)if(isExpired2(w,now))fullAutoInputWarningStash.delete(sid);while(fullAutoInputWarningStash.size>MAX_TRACKED_SESSIONS6){let firstKey=fullAutoInputWarningStash.keys().next().value;if(firstKey===void 0)break;fullAutoInputWarningStash.delete(firstKey)}}function setPendingInputWarning(sessionID,warning){fullAutoInputWarningStash.delete(sessionID),fullAutoInputWarningStash.set(sessionID,warning),evictExpired()}function consumePendingInputWarning(sessionID){let warning=fullAutoInputWarningStash.get(sessionID);if(warning)fullAutoInputWarningStash.delete(sessionID);if(warning&&isExpired2(warning))return;return warning}function peekPendingInputWarning(sessionID){let w=fullAutoInputWarningStash.get(sessionID);if(!w)return;if(isExpired2(w)){fullAutoInputWarningStash.delete(sessionID);return}return w}function createFullAutoInputProbeHook(options){let{directory}=options;return{toolAfter:async(input,output)=>{let tool3=(normalizeToolName(input.tool)??input.tool??"").toLowerCase();if(!PROBED_TOOLS.has(tool3))return;let sessionID=input.sessionID;if(!sessionID)return;let runState=loadFullAutoRunState(directory,sessionID);if(!runState||runState.status!=="running")return;let text=extractText2(output.output);if(!text)return;let probe2=probeFullAutoInput(text);if(!probe2.hasWarning)return;setPendingInputWarning(sessionID,{tool:tool3,at:new Date().toISOString(),categories:probe2.warnings.map((w)=>w.category)}),await writeWarningEvent(directory,sessionID,tool3,probe2)}}}init_constants();init_schema();init_state3();init_scope_persistence();init_state2();init_normalize_tool_name();function createFullAutoPermissionHook(options){let{config:config3,directory}=options,fullAutoConfig=config3.full_auto;return{toolBefore:async(input,output)=>{let toolName=normalizeToolName(input.tool)??input.tool,sessionID=input.sessionID;if(!sessionID)return;let stateHealth=isFullAutoStateUnreadable();if(stateHealth.unreadable){if(isReadOnlyTool(toolName))return;throw Error(`FULL_AUTO_STATE_UNREADABLE: tool '${toolName}' blocked because the Full-Auto durable state file is unreadable (${stateHealth.reason}). Restore .swarm/full-auto-state.json (or .bak) and re-run /swarm full-auto on.`)}let runState=loadFullAutoRunState(directory,sessionID);if(!runState||runState.status==="idle")return;if(runState.status==="paused"||runState.status==="terminated"){if(isReadOnlyTool(toolName))return;let rawReason=runState.pauseReason??runState.terminateReason??"no reason recorded",statusPrefix=rawReason.includes("infrastructure failure")&&runState.status==="paused"?"FULL_AUTO_PAUSED:OVERSIGHT_INFRASTRUCTURE_FAILURE":`FULL_AUTO_${runState.status.toUpperCase()}`;throw Error(`${statusPrefix}: tool '${toolName}' blocked because Full-Auto run is ${runState.status} (${rawReason}). Re-enable with /swarm full-auto on after the underlying issue is resolved.`)}let session=swarmState.agentSessions.get(sessionID),activeAgent=swarmState.activeAgent.get(sessionID)??session?.agentName??ORCHESTRATOR_NAME,normalizedAgentName=stripKnownSwarmPrefix(activeAgent),taskId=session?.currentTaskId??null,binding=taskId?resolveAuthorizedScopeBinding({directory,taskId,activeSessionId:sessionID}):resolveAuthorizedScopeBindingForSession({directory,activeSessionId:sessionID});if(!taskId&&binding&&session)session.currentTaskId=binding.taskId,session.declaredCoderScope=[...binding.files];let declaredScope=binding?.files??null,argsObj=output.args??void 0,lowerTool=toolName?.toLowerCase()??"",phaseFromArgs;if(lowerTool==="phase_complete"){if(phaseFromArgs=parsePhaseArg(argsObj),phaseFromArgs===void 0)throw Error("FULL_AUTO_DENY [phase_complete_invalid_phase]: phase_complete called without a valid 'phase' argument. Provide a positive integer phase before calling phase_complete.")}let effectivePhase=phaseFromArgs??runState.currentPhase,safeMode=["assisted","supervised","strict"].includes(runState.mode)?runState.mode:"strict",effectiveFullAutoConfig=fullAutoConfig?{...fullAutoConfig,mode:safeMode}:{mode:safeMode},classifierInput={sessionID,agentName:activeAgent,normalizedAgentName,toolName,args:argsObj,directory,declaredScope,currentTaskID:taskId,currentPhase:effectivePhase,planSummary:void 0,changedFiles:session?.modifiedFilesThisCoderTask,fullAutoConfig:effectiveFullAutoConfig},decision=classifyFullAutoToolAction(classifierInput),pendingWarning=peekPendingInputWarning(sessionID);if(pendingWarning){let commandOrUrl=typeof argsObj?.command==="string"&&argsObj.command||typeof argsObj?.url==="string"&&argsObj.url||void 0;if(shouldEscalateAfterWarning(toolName,commandOrUrl))decision={action:"escalate_critic",reason:`risky follow-up after prompt-injection warning (${pendingWarning.categories.join(",")})`,risk:"high",context:{tool:toolName,priorWarningTool:pendingWarning.tool,categories:pendingWarning.categories}},consumePendingInputWarning(sessionID)}if(decision.action==="allow"){tickAndMaybeDispatchCadence(directory,sessionID,"toolCalls",config3,{activeAgent}),resetFullAutoDenials(directory,sessionID);return}if(decision.action==="deny"){let denial=buildStructuredDenial(decision,toolName);recordFullAutoDenial(directory,sessionID,{tool:toolName,code:decision.code,reason:decision.reason});let updated2=loadFullAutoRunState(directory,sessionID);if(updated2){let pauseDecision=shouldPauseForDenials(updated2,fullAutoConfig);if(pauseDecision.pause)if(pauseDecision.mode==="terminate")terminateFullAutoRun(directory,sessionID,pauseDecision.reason??"denial-limit");else pauseFullAutoRun(directory,sessionID,pauseDecision.reason??"denial-limit")}throw Error(`FULL_AUTO_DENY [${decision.code}]: ${decision.reason}. ${JSON.stringify(denial)}`)}if(decision.action==="pause")throw pauseFullAutoRun(directory,sessionID,decision.reason),Error(`FULL_AUTO_PAUSE [${decision.code}]: ${decision.reason}`);if(decision.action==="escalate_human")throw terminateFullAutoRun(directory,sessionID,decision.reason),Error(`FULL_AUTO_ESCALATE_HUMAN [${decision.code}]: ${decision.reason}`);let triggerSource=mapTriggerSource(decision,toolName),criticModel=fullAutoConfig?.critic_model??config3.agents?.critic?.model??"opencode/big-pickle",oversightAgentName=resolveOversightAgentNameFromActive(activeAgent);if(lowerTool==="phase_complete"&&effectivePhase!==void 0){let stateForPhase=loadFullAutoRunState(directory,sessionID);if(stateForPhase&&stateForPhase.currentPhase!==effectivePhase){stateForPhase.currentPhase=effectivePhase;try{saveFullAutoRunState(directory,stateForPhase)}catch(persistErr){let msg=persistErr instanceof Error?persistErr.message:String(persistErr);throw Error(`FULL_AUTO_BLOCKED: failed to persist phase ${effectivePhase} to durable run state — ${msg}`)}}}let outcome;try{outcome=await dispatchFullAutoOversight({directory,sessionID,trigger:decision.reason,triggerSource,phase:effectivePhase,taskID:taskId??void 0,planID:runState.planID,architectOutput:output.args?JSON.stringify(output.args):void 0,actionContext:{tool:toolName,...decision.context??{}},criticModel,oversightAgentName,fullAutoConfig:{fail_closed:fullAutoConfig?.fail_closed!==!1,max_dispatch_retries:fullAutoConfig?.oversight?.max_dispatch_retries??2,max_consecutive_dispatch_failures:fullAutoConfig?.oversight?.max_consecutive_dispatch_failures??3}})}catch(error93){let reason=error93 instanceof Error?error93.message:String(error93);throw pauseFullAutoRun(directory,sessionID,`oversight dispatcher exception: ${reason}`),Error(`FULL_AUTO_BLOCKED: oversight dispatch threw — ${reason}`)}if(outcome.decision==="allow"){tickAndMaybeDispatchCadence(directory,sessionID,"toolCalls",config3,{activeAgent}),resetFullAutoDenials(directory,sessionID);return}if(outcome.decision==="pause")throw Error(`FULL_AUTO_BLOCKED: critic verdict ${outcome.verdict} — ${outcome.reasoning}`);if(outcome.decision==="escalate_human")throw Error(`FULL_AUTO_ESCALATE_HUMAN: critic verdict ${outcome.verdict} — ${outcome.reasoning}`);recordFullAutoDenial(directory,sessionID,{tool:toolName,code:`critic_${outcome.verdict}`.toLowerCase(),reason:outcome.reasoning||`critic verdict ${outcome.verdict}`});let updated=loadFullAutoRunState(directory,sessionID);if(updated){let pauseDecision=shouldPauseForDenials(updated,fullAutoConfig);if(pauseDecision.pause)if(pauseDecision.mode==="terminate")terminateFullAutoRun(directory,sessionID,pauseDecision.reason??"denial-limit");else pauseFullAutoRun(directory,sessionID,pauseDecision.reason??"denial-limit")}throw Error(`FULL_AUTO_CRITIC_DENY: ${outcome.verdict} — ${outcome.reasoning}`)}}}function parsePhaseArg(args2){if(!args2)return;let raw=args2.phase,n;if(typeof raw==="number")n=raw;else if(typeof raw==="string"&&raw.trim()){let trimmed=raw.trim();if(!/^[1-9][0-9]*$/.test(trimmed))return;n=Number.parseInt(trimmed,10)}else return;if(!Number.isFinite(n)||!Number.isInteger(n)||n<1)return;if(n>Number.MAX_SAFE_INTEGER)return;return n}function mapTriggerSource(decision,toolName){if(decision.action!=="escalate_critic")return"tool_action";let lower=toolName?.toLowerCase()??"";if(lower==="phase_complete")return"phase_boundary";if(lower==="update_task_status")return"task_completion";if(decision.risk==="high")return"risk";return"tool_action"}function resolveOversightAgentNameFromActive(activeAgent){if(!activeAgent)return"critic_oversight";if(stripKnownSwarmPrefix(activeAgent)===ORCHESTRATOR_NAME){let lastIdx=activeAgent.toLowerCase().lastIndexOf("architect");if(lastIdx>0)return`${activeAgent.slice(0,lastIdx)}critic_oversight`}return"critic_oversight"}init_guardrails2();init_hive_promoter();init_stored_input_args();import*as fs112 from"node:fs";import*as path201 from"node:path";import*as child_process13 from"node:child_process";var WIN32_CMD_BINARIES=new Set(["npm","npx","pnpm","yarn"]),_internals131={spawn:child_process13.spawn};function spawnAsync(command,cwd,timeoutMs){return new Promise((resolve70)=>{try{let[rawCmd,...args2]=command,cmd=process.platform==="win32"&&WIN32_CMD_BINARIES.has(rawCmd)&&!rawCmd.includes(".")?`${rawCmd}.cmd`:rawCmd,proc=_internals131.spawn(cmd,args2,{cwd,stdio:["ignore","pipe","pipe"]}),stdout="",stderr="",done=!1,MAX_OUTPUT=524288;proc.stdout.on("data",(d)=>{if(stdout.length<MAX_OUTPUT){if(stdout+=d,stdout.length>=MAX_OUTPUT){stdout=stdout.slice(0,MAX_OUTPUT);try{proc.stdout.destroy()}catch{}}}}),proc.stderr.on("data",(d)=>{if(stderr.length<MAX_OUTPUT){if(stderr+=d,stderr.length>=MAX_OUTPUT){stderr=stderr.slice(0,MAX_OUTPUT);try{proc.stderr.destroy()}catch{}}}});let timer=setTimeout(()=>{if(done)return;done=!0;try{proc.stdout.destroy()}catch{}try{proc.stderr.destroy()}catch{}try{proc.kill()}catch{}resolve70(null)},timeoutMs);proc.on("close",(code)=>{if(done)return;done=!0,clearTimeout(timer),resolve70({exitCode:code??1,stdout,stderr})}),proc.on("error",()=>{if(done)return;done=!0,clearTimeout(timer),resolve70(null)})}catch{resolve70(null)}})}var emittedSkipAdvisories=new Set;function detectPackageManager(projectDir){if(fs112.existsSync(path201.join(projectDir,"bun.lockb")))return"bun";if(fs112.existsSync(path201.join(projectDir,"pnpm-lock.yaml")))return"pnpm";if(fs112.existsSync(path201.join(projectDir,"yarn.lock")))return"yarn";if(fs112.existsSync(path201.join(projectDir,"package-lock.json")))return"npm";return"bun"}function detectTypecheckCommand(projectDir){let pkgPath=path201.join(projectDir,"package.json");if(fs112.existsSync(pkgPath))try{let pkg=JSON.parse(fs112.readFileSync(pkgPath,"utf8")),scripts=pkg.scripts;if(scripts?.typecheck)return{command:[detectPackageManager(projectDir),"run","typecheck"],language:"typescript"};if(scripts?.["type-check"])return{command:[detectPackageManager(projectDir),"run","type-check"],language:"typescript"};let deps={...pkg.dependencies,...pkg.devDependencies};if(!deps?.typescript&&!fs112.existsSync(path201.join(projectDir,"tsconfig.json")));if(deps?.typescript||fs112.existsSync(path201.join(projectDir,"tsconfig.json")))return{command:["npx","tsc","--noEmit"],language:"typescript"}}catch{return null}if(fs112.existsSync(path201.join(projectDir,"go.mod")))return{command:["go","vet","./..."],language:"go"};if(fs112.existsSync(path201.join(projectDir,"Cargo.toml")))return{command:["cargo","check"],language:"rust"};if(fs112.existsSync(path201.join(projectDir,"pyproject.toml"))||fs112.existsSync(path201.join(projectDir,"requirements.txt"))||fs112.existsSync(path201.join(projectDir,"setup.py")))return{command:null,language:"python"};try{if(fs112.readdirSync(projectDir).some((f)=>f.endsWith(".csproj")||f.endsWith(".sln")))return{command:["dotnet","build","--no-restore"],language:"csharp"}}catch{}return null}async function runWithTimeout(command,cwd,timeoutMs){let result=await spawnAsync(command,cwd,timeoutMs);if(result===null)return null;return{exitCode:result.exitCode,stderr:result.stderr}}function createIncrementalVerifyHook(config3,projectDir,injectMessage){return{toolAfter:async(input,output)=>{if(!config3.enabled)return;if(input.tool!=="Task")return;let args2=(typeof input.callID==="string"?getStoredInputArgs(input.callID):void 0)??input.args??output.args,subagentType=typeof args2?.subagent_type==="string"?args2.subagent_type:"",agentName=subagentType.replace(/^[^_]+_/,"");if(!config3.triggerAgents.includes(agentName)&&!config3.triggerAgents.includes(subagentType))return;let commandToRun=null;if(config3.command!=null)if(Array.isArray(config3.command))commandToRun=config3.command;else commandToRun=config3.command.split(" ");else{let detected=detectTypecheckCommand(projectDir);if(detected===null)return;if(detected.command===null){let dedupKey=`${input.sessionID}:${detected.language}`;if(!emittedSkipAdvisories.has(dedupKey))emittedSkipAdvisories.add(dedupKey),injectMessage(input.sessionID,`POST-CODER CHECK SKIPPED: ${detected.language} project detected but no default checker available. Set incremental_verify.command in .swarm/config.json to enable.`);return}commandToRun=detected.command}if(commandToRun===null)return;let result=await runWithTimeout(commandToRun,projectDir,config3.timeoutMs);if(result===null)return;if(result.exitCode===0)injectMessage(input.sessionID,"POST-CODER CHECK PASSED: No type errors.");else{let errorSummary=result.stderr.slice(0,800);injectMessage(input.sessionID,`POST-CODER CHECK FAILED: Type errors detected after coder delegation. Address these before proceeding.
|
|
5990
|
-
${errorSummary}`)}}}}init_file_locks();init_state2();init_recovery();init_utils();init_core3();init_merge();import*as fs113 from"node:fs";import*as fsPromises10 from"node:fs/promises";import*as path202 from"node:path";var INIT_ORPHAN_RECOVERY_TIMEOUT_MS=1e4,ORPHAN_RECOVERY_LOCK_FILE=".swarm/locks/init-orphan-recovery.lock",_internals132={rmSync:fs113.rmSync,removeWorktree,isLocked,listActiveLocks,tryAcquireLock};async function writeAdvisoryFile(directory,cleanupResult,warnings,attempted,removedWorktrees=[]){let advisoryPath=path202.join(directory,".swarm","advisories","init-orphan-recovery.json"),advisory={initTimestamp:new Date().toISOString(),warnings,errors:cleanupResult.errors,reclaimed:{removedBranches:cleanupResult.removed,removedWorktrees,prunedWorktrees:attempted},...cleanupResult.skippedRecoveryBranches&&cleanupResult.skippedRecoveryBranches.length>0?{preservedRecoveryBranches:cleanupResult.skippedRecoveryBranches}:{},...cleanupResult.recoveryReadError?{recoveryReadError:!0,note:"skipped all lane-branch deletions this pass because .swarm/recovery/ was unreadable (fail-safe)"}:{}};try{await fsPromises10.mkdir(path202.dirname(advisoryPath),{recursive:!0}),await fsPromises10.writeFile(advisoryPath,JSON.stringify(advisory,null,2),"utf-8")}catch{log("initOrphanRecovery advisory file write failed (non-fatal)")}}async function enumerateOrphanedWorktreeDirs(directory,activeSessionIds){let orphanedDirs=[],worktreeRoot=path202.resolve(path202.dirname(directory),".swarm-worktrees"),entries;try{entries=await fsPromises10.readdir(worktreeRoot,{withFileTypes:!0})}catch{return[]}for(let entry of entries){if(!entry.isDirectory())continue;let sessionId=entry.name;if(activeSessionIds.includes(sessionId))continue;let sessionEntries;try{sessionEntries=await fsPromises10.readdir(path202.join(worktreeRoot,sessionId),{withFileTypes:!0})}catch{continue}for(let laneEntry of sessionEntries){if(!laneEntry.isDirectory())continue;let worktreePath=path202.join(worktreeRoot,sessionId,laneEntry.name);orphanedDirs.push(worktreePath)}}return orphanedDirs}async function isCrossProcessLockHeld(directory){if(_internals132.isLocked(directory,ORPHAN_RECOVERY_LOCK_FILE))return!0;if(_internals132.listActiveLocks(directory).length>0)return!0;return!1}async function removeOrphanedWorktreeDir(worktreePath,projectRoot){let removeResult=await _internals132.removeWorktree(worktreePath,projectRoot);if(!("error"in removeResult))return;try{_internals132.rmSync(worktreePath,{recursive:!0,force:!0});return}catch{return removeResult.error}}function worktreePathKey(worktreePath,directory){let absolutePath2=path202.isAbsolute(worktreePath)?worktreePath:path202.resolve(directory,worktreePath),normalized=path202.normalize(absolutePath2);return process.platform==="win32"?normalized.toLowerCase():normalized}async function runInitOrphanRecovery(directory){let result,activeSessionIds=Array.from(swarmState.agentSessions.keys());try{if(await isCrossProcessLockHeld(directory)){let orphanedWorktreeDirs=await withTimeout(enumerateOrphanedWorktreeDirs(directory,activeSessionIds),INIT_ORPHAN_RECOVERY_TIMEOUT_MS,Error(`runInitOrphanRecovery exceeded ${INIT_ORPHAN_RECOVERY_TIMEOUT_MS}ms budget during worktree enumeration; continuing without orphan reclamation`)),orphanedBranches=[];return result={attempted:!0,crossProcessLockHeld:!0,warnings:["Cross-process lock held — another opencode process may be active. "+`Skipping destructive cleanup to preserve its worktrees/branches. Detected ${orphanedWorktreeDirs.length} orphaned worktree dir(s). Run '/swarm status' or check '.swarm/locks/' to identify active processes.`],orphanedBranches,removedWorktrees:[],prunedWorktrees:!1},await writeAdvisoryFile(directory,{removed:[],skipped:orphanedBranches,skippedRecoveryBranches:[],errors:[]},result.warnings,!1,[]),result}let lockAcquireResult=await _internals132.tryAcquireLock(directory,ORPHAN_RECOVERY_LOCK_FILE,"init-orphan-recovery","init");if(!lockAcquireResult.acquired)return result={attempted:!0,crossProcessLockHeld:!0,warnings:["Cross-process lock acquired by another process during init — "+`skipping destructive cleanup to preserve its worktrees/branches. Detected ${(await withTimeout(enumerateOrphanedWorktreeDirs(directory,activeSessionIds),INIT_ORPHAN_RECOVERY_TIMEOUT_MS,Error(`runInitOrphanRecovery exceeded ${INIT_ORPHAN_RECOVERY_TIMEOUT_MS}ms budget during worktree enumeration; continuing without orphan reclamation`))).length} orphaned worktree dir(s).`],orphanedBranches:[],removedWorktrees:[],prunedWorktrees:!1},await writeAdvisoryFile(directory,{removed:[],skipped:[],skippedRecoveryBranches:[],errors:[]},result.warnings,!1,[]),result;try{let orphanedWorktreeDirs=await withTimeout(enumerateOrphanedWorktreeDirs(directory,activeSessionIds),INIT_ORPHAN_RECOVERY_TIMEOUT_MS,Error(`runInitOrphanRecovery exceeded ${INIT_ORPHAN_RECOVERY_TIMEOUT_MS}ms budget during worktree enumeration; continuing without orphan reclamation`)),removedWorktrees=[],worktreeWarnings=[],recoveryRecords=listRecoveryRecords(directory),recoveryReadError=recoveryReadErrored(directory),recoveryWorktreePaths=new Set(recoveryRecords.map((record3)=>worktreePathKey(record3.worktreePath,directory)));if(recoveryReadError)worktreeWarnings.push("Recovery records are unreadable or fail schema validation; skipped all orphaned worktree deletion this pass (fail-safe).");else for(let worktreePath of orphanedWorktreeDirs){if(recoveryWorktreePaths.has(worktreePathKey(worktreePath,directory))){worktreeWarnings.push(`Preserved recovery worktree "${worktreePath}"; an unresolved recovery record still references it.`);continue}let error93=await removeOrphanedWorktreeDir(worktreePath,directory);if(error93)worktreeWarnings.push(`Could not reclaim orphaned worktree "${worktreePath}": ${error93}`);else removedWorktrees.push(worktreePath)}let cleanupResult=await withTimeout(cleanupOrphanedBranches(directory,activeSessionIds),INIT_ORPHAN_RECOVERY_TIMEOUT_MS,Error(`runInitOrphanRecovery exceeded ${INIT_ORPHAN_RECOVERY_TIMEOUT_MS}ms budget during branch cleanup; continuing without orphan reclamation`)),branchWarnings=cleanupResult.errors.map((e)=>`Could not delete orphaned branch "${e.branch}": ${e.error}`),allWarnings=[...worktreeWarnings,...branchWarnings];result={attempted:!0,crossProcessLockHeld:!1,warnings:allWarnings,orphanedBranches:cleanupResult.removed,removedWorktrees,prunedWorktrees:cleanupResult.recoveryReadError!==!0},await writeAdvisoryFile(directory,cleanupResult,allWarnings,!0,removedWorktrees)}finally{try{await lockAcquireResult.lock._release?.()}catch{}}}catch(err){let msg=err instanceof Error?err.message:String(err);log("initOrphanRecovery timed out or failed (non-fatal)",{error:msg}),result={attempted:!1,crossProcessLockHeld:!1,warnings:[`Orphan recovery timed out or failed: ${msg}`],orphanedBranches:[],removedWorktrees:[],prunedWorktrees:!1,diagnostic:{file:".swarm/advisories/init-orphan-recovery.json",reason:msg}},await writeAdvisoryFile(directory,{removed:[],skipped:[],skippedRecoveryBranches:[],errors:[]},result.warnings,!1,[])}return result}init_state2();import*as fs114 from"node:fs/promises";import*as path203 from"node:path";var ADVISORY_FILENAME="init-orphan-recovery.json";function createInitOrphanRecoveryAdvisoryHook(directory){let consumedBySession=new Set;async function readAdvisoryFile(){let advisoryPath=path203.join(directory,".swarm","advisories",ADVISORY_FILENAME);try{let content=await fs114.readFile(advisoryPath,"utf-8");return JSON.parse(content)}catch{return null}}async function deleteAdvisoryFile(){let advisoryPath=path203.join(directory,".swarm","advisories",ADVISORY_FILENAME);try{await fs114.unlink(advisoryPath)}catch{}}function formatError3(error93){return`ORPHAN_RECOVERY_ERROR: Could not reclaim branch "${error93.branch}": ${error93.error}`}async function messagesTransform(_input,output){let messages=output.messages;if(!messages||messages.length===0)return;let sessionId=messages[messages.length-1]?.info?.sessionID;if(!sessionId)return;let activeAgent=swarmState.activeAgent.get(sessionId),session=swarmState.agentSessions.get(sessionId),ORCHESTRATOR_NAME2="Architect";if(!(activeAgent?activeAgent===ORCHESTRATOR_NAME2||activeAgent.endsWith("_Architect"):session?session.agentName===ORCHESTRATOR_NAME2||session.agentName.endsWith("_Architect"):!1))return;if(consumedBySession.has(sessionId))return;let advisory=await readAdvisoryFile();if(!advisory)return;consumedBySession.add(sessionId),await deleteAdvisoryFile();let targetSession=ensureAgentSession(sessionId);targetSession.pendingAdvisoryMessages??=[];let timestamp=advisory.initTimestamp?new Date(advisory.initTimestamp).toLocaleString():"unknown";targetSession.pendingAdvisoryMessages.push(`[INIT ORPHAN RECOVERY] Plugin init detected the following at ${timestamp}:`);for(let warning of advisory.warnings)targetSession.pendingAdvisoryMessages.push(` WARNING: ${warning}`);for(let err of advisory.errors)targetSession.pendingAdvisoryMessages.push(` ERROR: ${formatError3(err)}`);let reclaimed=advisory.reclaimed;if(reclaimed.removedBranches.length>0)targetSession.pendingAdvisoryMessages.push(` Reclaimed ${reclaimed.removedBranches.length} orphaned branch(es): ${reclaimed.removedBranches.join(", ")}`);if(reclaimed.removedWorktrees&&reclaimed.removedWorktrees.length>0)targetSession.pendingAdvisoryMessages.push(` Reclaimed ${reclaimed.removedWorktrees.length} orphaned worktree directory(ies): ${reclaimed.removedWorktrees.join(", ")}`);if(reclaimed.prunedWorktrees)targetSession.pendingAdvisoryMessages.push(" Stale worktree metadata pruned.")}return{messagesTransform}}init_delegation_gate();import*as fs115 from"node:fs";import*as path205 from"node:path";function computeNextMode(params){let{issueReference,traceState,workflowArtifacts}=params,noop={nextMode:null,directive:null,nextLastTransition:traceState.lastTransition,nextCompleted:traceState.completed};if(!issueReference||issueReference.flags.trace!==!0)return noop;if(traceState.completed)return noop;if(workflowArtifacts.specIssueNumber===null||workflowArtifacts.specIssueNumber!==issueReference.number||traceState.issueNumber!==issueReference.number)return noop;if(!workflowArtifacts.specExists)return noop;if(!workflowArtifacts.planExists&&(traceState.lastTransition===null||traceState.lastTransition==="ISSUE_INGEST_TO_PLAN")){if(traceState.lastTransition==="ISSUE_INGEST_TO_PLAN")return noop;return{nextMode:"PLAN",directive:null,nextLastTransition:"ISSUE_INGEST_TO_PLAN",nextCompleted:!1}}if(!workflowArtifacts.criticApproved)return noop;if(workflowArtifacts.planExists&&!workflowArtifacts.allPhasesComplete){if(traceState.lastTransition==="PLAN_TO_EXECUTE")return noop;return{nextMode:"EXECUTE",directive:null,nextLastTransition:"PLAN_TO_EXECUTE",nextCompleted:!1}}if(!workflowArtifacts.planExists)return noop;if(traceState.lastTransition==="EXECUTE_TO_COMMIT")return noop;return{nextMode:null,directive:"All phases complete. Compose commit-pr to publish the PR. Read .swarm/issue-reference.json for Closes #N.",nextLastTransition:"EXECUTE_TO_COMMIT",nextCompleted:!0}}init_manager();import{existsSync as existsSync104,mkdirSync as mkdirSync50,readFileSync as readFileSync77,renameSync as renameSync32,unlinkSync as unlinkSync32,writeFileSync as writeFileSync35}from"node:fs";import*as path204 from"node:path";async function _defaultLoadPlanFromLedger(directory){return loadPlanJsonOnly(directory)}var _internals133={readFileSync:readFileSync77,writeFileSync:writeFileSync35,existsSync:existsSync104,renameSync:renameSync32,mkdirSync:mkdirSync50,unlinkSync:unlinkSync32,loadPlanFromLedger:_defaultLoadPlanFromLedger};function isPhaseComplete(status){return status==="complete"||status==="completed"}function isValidIssueReference(obj){if(typeof obj!=="object"||obj===null)return!1;let o=obj;if(typeof o.url!=="string"||!o.url.startsWith("https://github.com/"))return!1;return typeof o.owner==="string"&&typeof o.repo==="string"&&typeof o.number==="number"&&typeof o.timestamp==="string"&&typeof o.flags==="object"&&o.flags!==null}function isValidTraceState(obj){if(typeof obj!=="object"||obj===null)return!1;let o=obj;return typeof o.issueNumber==="number"&&(o.lastTransition===null||typeof o.lastTransition==="string")&&typeof o.completed==="boolean"}function readIssueReference(directory){try{let filePath=path204.join(directory,".swarm","issue-reference.json"),raw=_internals133.readFileSync(filePath,"utf-8"),parsed=JSON.parse(raw);if(!isValidIssueReference(parsed))return null;return parsed}catch{return null}}function readTraceState(directory){let defaultState={issueNumber:0,lastTransition:null,completed:!1};try{let filePath=path204.join(directory,".swarm","issue-trace-state.json"),raw=_internals133.readFileSync(filePath,"utf-8"),parsed=JSON.parse(raw);if(!isValidTraceState(parsed))return defaultState;return parsed}catch{return defaultState}}function writeTraceState(directory,state){let swarmDir=path204.join(directory,".swarm");_internals133.mkdirSync(swarmDir,{recursive:!0});let finalPath=path204.join(swarmDir,"issue-trace-state.json"),tmpPath=path204.join(swarmDir,`issue-trace-state.tmp.${process.pid}.${Date.now()}.json`);_internals133.writeFileSync(tmpPath,JSON.stringify(state,null,2),"utf-8");try{_internals133.renameSync(tmpPath,finalPath)}catch{try{_internals133.unlinkSync(finalPath)}catch{}try{_internals133.renameSync(tmpPath,finalPath)}catch(retryErr){try{_internals133.unlinkSync(tmpPath)}catch{}throw retryErr}}}function readSpecIssueNumber(directory){try{let filePath=path204.join(directory,".swarm","spec.md"),raw=_internals133.readFileSync(filePath,"utf-8"),sectionStart=raw.indexOf("## Source Issue");if(sectionStart===-1)return null;let nextHeading=raw.indexOf(`
|
|
5990
|
+
${errorSummary}`)}}}}init_file_locks();init_state2();init_recovery();init_utils();init_core3();init_merge();import*as fs113 from"node:fs";import*as fsPromises10 from"node:fs/promises";import*as path202 from"node:path";var INIT_ORPHAN_RECOVERY_TIMEOUT_MS=1e4,ORPHAN_RECOVERY_LOCK_FILE=".swarm/locks/init-orphan-recovery.lock",_internals132={rmSync:fs113.rmSync,removeWorktree,isLocked,listActiveLocks,tryAcquireLock};async function writeAdvisoryFile(directory,cleanupResult,warnings,attempted,removedWorktrees=[]){let advisoryPath=path202.join(directory,".swarm","advisories","init-orphan-recovery.json"),advisory={initTimestamp:new Date().toISOString(),warnings,errors:cleanupResult.errors,reclaimed:{removedBranches:cleanupResult.removed,removedWorktrees,prunedWorktrees:attempted},...cleanupResult.skippedRecoveryBranches&&cleanupResult.skippedRecoveryBranches.length>0?{preservedRecoveryBranches:cleanupResult.skippedRecoveryBranches}:{},...cleanupResult.recoveryReadError?{recoveryReadError:!0,note:"skipped all lane-branch deletions this pass because .swarm/recovery/ was unreadable (fail-safe)"}:{}};try{await fsPromises10.mkdir(path202.dirname(advisoryPath),{recursive:!0}),await fsPromises10.writeFile(advisoryPath,JSON.stringify(advisory,null,2),"utf-8")}catch{log("initOrphanRecovery advisory file write failed (non-fatal)")}}async function enumerateOrphanedWorktreeDirs(directory,activeSessionIds){let orphanedDirs=[],worktreeRoot=path202.resolve(path202.dirname(directory),".swarm-worktrees"),entries;try{entries=await fsPromises10.readdir(worktreeRoot,{withFileTypes:!0})}catch{return[]}for(let entry of entries){if(!entry.isDirectory())continue;let sessionId=entry.name;if(activeSessionIds.includes(sessionId))continue;let sessionEntries;try{sessionEntries=await fsPromises10.readdir(path202.join(worktreeRoot,sessionId),{withFileTypes:!0})}catch{continue}for(let laneEntry of sessionEntries){if(!laneEntry.isDirectory())continue;let worktreePath=path202.join(worktreeRoot,sessionId,laneEntry.name);orphanedDirs.push(worktreePath)}}return orphanedDirs}async function isCrossProcessLockHeld(directory){if(_internals132.isLocked(directory,ORPHAN_RECOVERY_LOCK_FILE))return!0;if(_internals132.listActiveLocks(directory).length>0)return!0;return!1}async function removeOrphanedWorktreeDir(worktreePath,projectRoot){let removeResult=await _internals132.removeWorktree(worktreePath,projectRoot);if(!("error"in removeResult))return;try{_internals132.rmSync(worktreePath,{recursive:!0,force:!0});return}catch{return removeResult.error}}function worktreePathKey(worktreePath,directory){let absolutePath2=path202.isAbsolute(worktreePath)?worktreePath:path202.resolve(directory,worktreePath),normalized=path202.normalize(absolutePath2);return process.platform==="win32"?normalized.toLowerCase():normalized}async function runInitOrphanRecovery(directory){let result,activeSessionIds=Array.from(swarmState.agentSessions.keys());try{if(await isCrossProcessLockHeld(directory)){let orphanedWorktreeDirs=await withTimeout(enumerateOrphanedWorktreeDirs(directory,activeSessionIds),INIT_ORPHAN_RECOVERY_TIMEOUT_MS,Error(`runInitOrphanRecovery exceeded ${INIT_ORPHAN_RECOVERY_TIMEOUT_MS}ms budget during worktree enumeration; continuing without orphan reclamation`)),orphanedBranches=[];return result={attempted:!0,crossProcessLockHeld:!0,warnings:["Cross-process lock held — another opencode process may be active. "+`Skipping destructive cleanup to preserve its worktrees/branches. Detected ${orphanedWorktreeDirs.length} orphaned worktree dir(s). Run '/swarm status' or check '.swarm/locks/' to identify active processes.`],orphanedBranches,removedWorktrees:[],prunedWorktrees:!1},await writeAdvisoryFile(directory,{removed:[],skipped:orphanedBranches,skippedRecoveryBranches:[],errors:[]},result.warnings,!1,[]),result}let lockAcquireResult=await _internals132.tryAcquireLock(directory,ORPHAN_RECOVERY_LOCK_FILE,"init-orphan-recovery","init");if(!lockAcquireResult.acquired)return result={attempted:!0,crossProcessLockHeld:!0,warnings:["Cross-process lock acquired by another process during init — "+`skipping destructive cleanup to preserve its worktrees/branches. Detected ${(await withTimeout(enumerateOrphanedWorktreeDirs(directory,activeSessionIds),INIT_ORPHAN_RECOVERY_TIMEOUT_MS,Error(`runInitOrphanRecovery exceeded ${INIT_ORPHAN_RECOVERY_TIMEOUT_MS}ms budget during worktree enumeration; continuing without orphan reclamation`))).length} orphaned worktree dir(s).`],orphanedBranches:[],removedWorktrees:[],prunedWorktrees:!1},await writeAdvisoryFile(directory,{removed:[],skipped:[],skippedRecoveryBranches:[],errors:[]},result.warnings,!1,[]),result;try{let orphanedWorktreeDirs=await withTimeout(enumerateOrphanedWorktreeDirs(directory,activeSessionIds),INIT_ORPHAN_RECOVERY_TIMEOUT_MS,Error(`runInitOrphanRecovery exceeded ${INIT_ORPHAN_RECOVERY_TIMEOUT_MS}ms budget during worktree enumeration; continuing without orphan reclamation`)),removedWorktrees=[],worktreeWarnings=[],recoveryRecords=listRecoveryRecords(directory),recoveryReadError=recoveryReadErrored(directory),recoveryWorktreePaths=new Set(recoveryRecords.map((record3)=>worktreePathKey(record3.worktreePath,directory)));if(recoveryReadError)worktreeWarnings.push("Recovery records are unreadable or fail schema validation; skipped all orphaned worktree deletion this pass (fail-safe).");else for(let worktreePath of orphanedWorktreeDirs){if(recoveryWorktreePaths.has(worktreePathKey(worktreePath,directory))){worktreeWarnings.push(`Preserved recovery worktree "${worktreePath}"; an unresolved recovery record still references it.`);continue}let error93=await removeOrphanedWorktreeDir(worktreePath,directory);if(error93)worktreeWarnings.push(`Could not reclaim orphaned worktree "${worktreePath}": ${error93}`);else removedWorktrees.push(worktreePath)}let cleanupResult=await withTimeout(cleanupOrphanedBranches(directory,activeSessionIds),INIT_ORPHAN_RECOVERY_TIMEOUT_MS,Error(`runInitOrphanRecovery exceeded ${INIT_ORPHAN_RECOVERY_TIMEOUT_MS}ms budget during branch cleanup; continuing without orphan reclamation`)),branchWarnings=cleanupResult.errors.map((e)=>`Could not delete orphaned branch "${e.branch}": ${e.error}`),allWarnings=[...worktreeWarnings,...branchWarnings];result={attempted:!0,crossProcessLockHeld:!1,warnings:allWarnings,orphanedBranches:cleanupResult.removed,removedWorktrees,prunedWorktrees:cleanupResult.recoveryReadError!==!0},await writeAdvisoryFile(directory,cleanupResult,allWarnings,!0,removedWorktrees)}finally{try{await lockAcquireResult.lock._release?.()}catch{}}}catch(err){let msg=err instanceof Error?err.message:String(err);log("initOrphanRecovery timed out or failed (non-fatal)",{error:msg}),result={attempted:!1,crossProcessLockHeld:!1,warnings:[`Orphan recovery timed out or failed: ${msg}`],orphanedBranches:[],removedWorktrees:[],prunedWorktrees:!1,diagnostic:{file:".swarm/advisories/init-orphan-recovery.json",reason:msg}},await writeAdvisoryFile(directory,{removed:[],skipped:[],skippedRecoveryBranches:[],errors:[]},result.warnings,!1,[])}return result}init_state2();import*as fs114 from"node:fs/promises";import*as path203 from"node:path";var ADVISORY_FILENAME="init-orphan-recovery.json";function createInitOrphanRecoveryAdvisoryHook(directory){let consumedBySession=new Set;async function readAdvisoryFile(){let advisoryPath=path203.join(directory,".swarm","advisories",ADVISORY_FILENAME);try{let content=await fs114.readFile(advisoryPath,"utf-8");return JSON.parse(content)}catch{return null}}async function deleteAdvisoryFile(){let advisoryPath=path203.join(directory,".swarm","advisories",ADVISORY_FILENAME);try{await fs114.unlink(advisoryPath)}catch{}}function formatError3(error93){return`ORPHAN_RECOVERY_ERROR: Could not reclaim branch "${error93.branch}": ${error93.error}`}async function messagesTransform(_input,output){let messages=output.messages;if(!messages||messages.length===0)return;let sessionId=messages[messages.length-1]?.info?.sessionID;if(!sessionId)return;let activeAgent=swarmState.activeAgent.get(sessionId),session=swarmState.agentSessions.get(sessionId),ORCHESTRATOR_NAME2="Architect";if(!(activeAgent?activeAgent===ORCHESTRATOR_NAME2||activeAgent.endsWith("_Architect"):session?session.agentName===ORCHESTRATOR_NAME2||session.agentName.endsWith("_Architect"):!1))return;if(consumedBySession.has(sessionId))return;let advisory=await readAdvisoryFile();if(!advisory)return;consumedBySession.add(sessionId),await deleteAdvisoryFile();let reclaimedForGate=advisory.reclaimed;if(!((advisory.warnings?.length??0)>0||(advisory.errors?.length??0)>0||(reclaimedForGate?.removedBranches?.length??0)>0||(reclaimedForGate?.removedWorktrees?.length??0)>0))return;let targetSession=ensureAgentSession(sessionId);targetSession.pendingAdvisoryMessages??=[];let timestamp=advisory.initTimestamp?new Date(advisory.initTimestamp).toLocaleString():"unknown";targetSession.pendingAdvisoryMessages.push(`[INIT ORPHAN RECOVERY] Plugin init detected the following at ${timestamp}:`);for(let warning of advisory.warnings??[])targetSession.pendingAdvisoryMessages.push(` WARNING: ${warning}`);for(let err of advisory.errors??[])targetSession.pendingAdvisoryMessages.push(` ERROR: ${formatError3(err)}`);let reclaimed=advisory.reclaimed;if((reclaimed?.removedBranches?.length??0)>0)targetSession.pendingAdvisoryMessages.push(` Reclaimed ${reclaimed.removedBranches.length} orphaned branch(es): ${reclaimed.removedBranches.join(", ")}`);if(reclaimed?.removedWorktrees&&reclaimed.removedWorktrees.length>0)targetSession.pendingAdvisoryMessages.push(` Reclaimed ${reclaimed.removedWorktrees.length} orphaned worktree directory(ies): ${reclaimed.removedWorktrees.join(", ")}`);if(reclaimed?.prunedWorktrees)targetSession.pendingAdvisoryMessages.push(" Stale worktree metadata pruned.")}return{messagesTransform}}init_delegation_gate();import*as fs115 from"node:fs";import*as path205 from"node:path";function computeNextMode(params){let{issueReference,traceState,workflowArtifacts}=params,noop={nextMode:null,directive:null,nextLastTransition:traceState.lastTransition,nextCompleted:traceState.completed};if(!issueReference||issueReference.flags.trace!==!0)return noop;if(traceState.completed)return noop;if(workflowArtifacts.specIssueNumber===null||workflowArtifacts.specIssueNumber!==issueReference.number||traceState.issueNumber!==issueReference.number)return noop;if(!workflowArtifacts.specExists)return noop;if(!workflowArtifacts.planExists&&(traceState.lastTransition===null||traceState.lastTransition==="ISSUE_INGEST_TO_PLAN")){if(traceState.lastTransition==="ISSUE_INGEST_TO_PLAN")return noop;return{nextMode:"PLAN",directive:null,nextLastTransition:"ISSUE_INGEST_TO_PLAN",nextCompleted:!1}}if(!workflowArtifacts.criticApproved)return noop;if(workflowArtifacts.planExists&&!workflowArtifacts.allPhasesComplete){if(traceState.lastTransition==="PLAN_TO_EXECUTE")return noop;return{nextMode:"EXECUTE",directive:null,nextLastTransition:"PLAN_TO_EXECUTE",nextCompleted:!1}}if(!workflowArtifacts.planExists)return noop;if(traceState.lastTransition==="EXECUTE_TO_COMMIT")return noop;return{nextMode:null,directive:"All phases complete. Compose commit-pr to publish the PR. Read .swarm/issue-reference.json for Closes #N.",nextLastTransition:"EXECUTE_TO_COMMIT",nextCompleted:!0}}init_manager();import{existsSync as existsSync104,mkdirSync as mkdirSync50,readFileSync as readFileSync77,renameSync as renameSync32,unlinkSync as unlinkSync32,writeFileSync as writeFileSync35}from"node:fs";import*as path204 from"node:path";async function _defaultLoadPlanFromLedger(directory){return loadPlanJsonOnly(directory)}var _internals133={readFileSync:readFileSync77,writeFileSync:writeFileSync35,existsSync:existsSync104,renameSync:renameSync32,mkdirSync:mkdirSync50,unlinkSync:unlinkSync32,loadPlanFromLedger:_defaultLoadPlanFromLedger};function isPhaseComplete(status){return status==="complete"||status==="completed"}function isValidIssueReference(obj){if(typeof obj!=="object"||obj===null)return!1;let o=obj;if(typeof o.url!=="string"||!o.url.startsWith("https://github.com/"))return!1;return typeof o.owner==="string"&&typeof o.repo==="string"&&typeof o.number==="number"&&typeof o.timestamp==="string"&&typeof o.flags==="object"&&o.flags!==null}function isValidTraceState(obj){if(typeof obj!=="object"||obj===null)return!1;let o=obj;return typeof o.issueNumber==="number"&&(o.lastTransition===null||typeof o.lastTransition==="string")&&typeof o.completed==="boolean"}function readIssueReference(directory){try{let filePath=path204.join(directory,".swarm","issue-reference.json"),raw=_internals133.readFileSync(filePath,"utf-8"),parsed=JSON.parse(raw);if(!isValidIssueReference(parsed))return null;return parsed}catch{return null}}function readTraceState(directory){let defaultState={issueNumber:0,lastTransition:null,completed:!1};try{let filePath=path204.join(directory,".swarm","issue-trace-state.json"),raw=_internals133.readFileSync(filePath,"utf-8"),parsed=JSON.parse(raw);if(!isValidTraceState(parsed))return defaultState;return parsed}catch{return defaultState}}function writeTraceState(directory,state){let swarmDir=path204.join(directory,".swarm");_internals133.mkdirSync(swarmDir,{recursive:!0});let finalPath=path204.join(swarmDir,"issue-trace-state.json"),tmpPath=path204.join(swarmDir,`issue-trace-state.tmp.${process.pid}.${Date.now()}.json`);_internals133.writeFileSync(tmpPath,JSON.stringify(state,null,2),"utf-8");try{_internals133.renameSync(tmpPath,finalPath)}catch{try{_internals133.unlinkSync(finalPath)}catch{}try{_internals133.renameSync(tmpPath,finalPath)}catch(retryErr){try{_internals133.unlinkSync(tmpPath)}catch{}throw retryErr}}}function readSpecIssueNumber(directory){try{let filePath=path204.join(directory,".swarm","spec.md"),raw=_internals133.readFileSync(filePath,"utf-8"),sectionStart=raw.indexOf("## Source Issue");if(sectionStart===-1)return null;let nextHeading=raw.indexOf(`
|
|
5991
5991
|
## `,sectionStart+14),sectionEnd=nextHeading===-1?raw.length:nextHeading,section=raw.slice(sectionStart,sectionEnd),numberMatch=section.match(/-\s+Number:\s*(\d+)/);if(numberMatch)return parseInt(numberMatch[1],10);let urlMatch=section.match(/-\s+URL:.*\/issues\/(\d+)/);if(urlMatch)return parseInt(urlMatch[1],10);return null}catch{return null}}async function readPlanPhaseStatus(directory){let plan=await _internals133.loadPlanFromLedger(directory);if(!plan||plan.phases.length===0)return{allComplete:!1};return{allComplete:plan.phases.every((phase)=>isPhaseComplete(phase.status))}}function specExists(directory){return _internals133.existsSync(path204.join(directory,".swarm","spec.md"))}function planExists(directory){return _internals133.existsSync(path204.join(directory,".swarm","plan.json"))}var _internals134={readIssueReference,readTraceState,writeTraceState,readSpecIssueNumber,readPlanPhaseStatus,specExists,planExists,isPlanCriticApproved},cachedApproval=null;async function boundedApprovalCheck(directory,timeoutMs){try{let ledgerPath=path205.join(directory,".swarm","plan-ledger.jsonl"),currentSize=-1;try{currentSize=fs115.statSync(ledgerPath).size}catch{let timeout=new Promise((resolve71)=>{setTimeout(()=>resolve71(!1),timeoutMs)});return await Promise.race([_internals134.isPlanCriticApproved(directory),timeout])}if(cachedApproval&&cachedApproval.dir===directory&&cachedApproval.size===currentSize)return cachedApproval.result;let timer;try{let timeout=new Promise((resolve71)=>{timer=setTimeout(()=>resolve71(!1),timeoutMs)}),result=await Promise.race([_internals134.isPlanCriticApproved(directory),timeout]);return cachedApproval={dir:directory,size:currentSize,result},result}finally{if(timer!==void 0)clearTimeout(timer)}}catch{return!1}}function createIssueTraceHook(_config,directory,approvalTimeoutMs=5000){return{messagesTransform:async(_input,output)=>{try{let issueRef=_internals134.readIssueReference(directory);if(!issueRef||issueRef.flags.trace!==!0)return;let traceState=_internals134.readTraceState(directory),_specExists=_internals134.specExists(directory),_specIssueNumber=_internals134.readSpecIssueNumber(directory),_planExists=_internals134.planExists(directory),_criticApproved=await boundedApprovalCheck(directory,approvalTimeoutMs),_allPhasesComplete=(await _internals134.readPlanPhaseStatus(directory)).allComplete,result=computeNextMode({issueReference:issueRef,traceState,workflowArtifacts:{specExists:_specExists,specIssueNumber:_specIssueNumber,planExists:_planExists,criticApproved:_criticApproved,allPhasesComplete:_allPhasesComplete}});if(result.nextMode===null&&result.directive===null)return;let finalDirective=result.directive?result.directive.replace("#N",`#${issueRef.number}`):null,messagesToAdd=[];if(result.nextMode!==null)messagesToAdd.push({role:"system",content:[{type:"text",text:`[MODE: ${result.nextMode}]`}]});if(finalDirective!==null)messagesToAdd.push({role:"system",content:[{type:"text",text:finalDirective}]});_internals134.writeTraceState(directory,{issueNumber:traceState.issueNumber,lastTransition:result.nextLastTransition,completed:result.nextCompleted});let out=output;if(out.messages)out.messages.push(...messagesToAdd)}catch{}}}}init_schema();init_state2();init_logger();import{appendFile as appendFile22,mkdir as mkdir47}from"node:fs/promises";import*as path206 from"node:path";var HIGH_RISK_TOOLS=new Set(["save_plan","update_task_status","phase_complete","task","Task","skill_regenerate","skill_retire"]),DEFAULT_MAX_GATE_DENIALS=5,DEFAULT_GATE_STALENESS_MS=600000;async function knowledgeApplicationGateBefore(directory,input,config3){if(!config3.enabled)return;let toolName=typeof input.tool==="string"?input.tool:"";if(!(config3.high_risk_tools?new Set(config3.high_risk_tools):HIGH_RISK_TOOLS).has(toolName))return;let agentRaw=typeof input.agent==="string"?input.agent:"";if(!agentRaw)return;if(stripKnownSwarmPrefix(agentRaw)!=="architect")return;let sessionID=typeof input.sessionID==="string"?input.sessionID:void 0;if(!sessionID){if(config3.mode==="enforce")throw Error("KNOWLEDGE_ENFORCE_GATE_DENY: missing sessionID on tool.execute.before; refusing to evaluate critical-directive ack state");_internals135.writeWarnEvent(directory,{timestamp:new Date().toISOString(),event:"knowledge_application_gate_warn",tool:toolName,agent:agentRaw,reason:"missing_sessionID",mode:config3.mode}).catch(()=>{});return}let cached3=swarmState.currentCriticalShownIds.get(sessionID);if(!cached3||cached3.ids.length===0){clearGateDenialCount(sessionID);return}let ackedIds=new Set;for(let id of cached3.ids)for(let result of["applied","ignored","violated"]){let key=buildAckDedupKey(sessionID,id,result);if(swarmState.knowledgeAckDedup.has(key)){ackedIds.add(id);break}}let unacked=cached3.ids.filter((id)=>!ackedIds.has(id));if(unacked.length===0){clearGateDenialCount(sessionID);return}if(config3.mode==="enforce"&&config3.critical_requires_ack){let maxDenials=config3.max_gate_denials??DEFAULT_MAX_GATE_DENIALS,stalenessMs=config3.gate_staleness_ms??DEFAULT_GATE_STALENESS_MS,age=Date.now()-cached3.generatedAt;if(age>stalenessMs){for(let id of unacked)addKnowledgeAckDedup(buildAckDedupKey(sessionID,id,"applied"));clearCriticalShownIds(sessionID),clearGateDenialCount(sessionID),await writeWarnEvent2(directory,{timestamp:new Date().toISOString(),event:"knowledge_application_gate_staleness_clear",tool:toolName,agent:agentRaw,sessionID,cleared_ids:unacked,age_ms:age,staleness_threshold_ms:stalenessMs}).catch((err)=>{warn(`[knowledge-application-gate] staleness-clear audit write failed: ${err instanceof Error?err.message:String(err)}`)});return}let directiveKey=buildGateDenialDirectiveKey(cached3.ids),denials=incrementGateDenialCount(sessionID,directiveKey);if(denials>maxDenials){for(let id of unacked)addKnowledgeAckDedup(buildAckDedupKey(sessionID,id,"applied"));clearCriticalShownIds(sessionID),clearGateDenialCount(sessionID),await writeWarnEvent2(directory,{timestamp:new Date().toISOString(),event:"knowledge_application_gate_denial_limit_clear",tool:toolName,agent:agentRaw,sessionID,cleared_ids:unacked,denial_count:denials,max_gate_denials:maxDenials}).catch((err)=>{warn(`[knowledge-application-gate] denial-limit-clear audit write failed: ${err instanceof Error?err.message:String(err)}`)});return}let ids=unacked.join(", ");throw Error(`KNOWLEDGE_ENFORCE_GATE_DENY: ${toolName} blocked — critical knowledge directive(s) ${ids} require KNOWLEDGE_APPLIED:<id>, KNOWLEDGE_IGNORED:<id> reason=..., or KNOWLEDGE_VIOLATED:<id> reason=... before this action.`)}writeWarnEvent2(directory,{timestamp:new Date().toISOString(),event:"knowledge_application_gate_warn",tool:toolName,agent:agentRaw,sessionID,unacknowledged_critical_ids:unacked}).catch(()=>{})}async function writeWarnEvent2(directory,record3){let filePath=path206.join(directory,".swarm","events.jsonl");await mkdir47(path206.dirname(filePath),{recursive:!0}),await appendFile22(filePath,`${JSON.stringify(record3)}
|
|
5992
5992
|
`,"utf-8")}async function knowledgeApplicationTransformScan(directory,output,sessionID){if(!output?.messages)return;if(!sessionID)return;let target;for(let i=output.messages.length-1;i>=0;i--){let m=output.messages[i],agent=m.info?.agent;if(typeof agent==="string"&&stripKnownSwarmPrefix(agent)==="architect"){target=m;break}}if(!target)return;let text=(target.parts??[]).map((p)=>typeof p.text==="string"?p.text:"").join(`
|
|
5993
|
-
`);if(!text)return;let acks=parseAcknowledgments(text);if(acks.length===0)return;let ctx={sessionId:sessionID};for(let ack of acks){let key=buildAckDedupKey(sessionID,ack.id,ack.result);if(swarmState.knowledgeAckDedup.has(key))continue;addKnowledgeAckDedup(key);try{await recordAcknowledgment(directory,ack,ctx)}catch(err){warn(`[knowledge-application-gate] transform-scan record failed: ${err instanceof Error?err.message:String(err)}`)}}}var _internals135={knowledgeApplicationGateBefore,knowledgeApplicationTransformScan,HIGH_RISK_TOOLS,writeWarnEvent:writeWarnEvent2};init_knowledge_curator();init_micro_reflector();init_normalize_tool_name();init_pr_subscriptions();init_utils();init_stored_input_args();init_normalize_tool_name();var MAX_OUTPUT_SCAN_BYTES=65536,PR_URL_PATTERN=/https:\/\/github\.com\/([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)\/pull\/(\d+)/,_internals136={subscribe,log};function extractPrUrl(text){let match=PR_URL_PATTERN.exec(text.slice(0,MAX_OUTPUT_SCAN_BYTES));if(!match)return null;let owner=match[1],repo=match[2],prNumber=Number.parseInt(match[3],10);if(!Number.isSafeInteger(prNumber)||prNumber<=0)return null;return{repoFullName:`${owner}/${repo}`,prNumber,prUrl:`https://github.com/${owner}/${repo}/pull/${prNumber}`}}function createPrAutoSubscribeHook(directory,config3){return{toolAfter:async(input,output)=>{try{if(!config3.enabled||!config3.auto_subscribe_on_pr_create)return;let sessionID=typeof input.sessionID==="string"?input.sessionID.trim():"";if(!sessionID)return;let tool3=normalizeToolNameLowerCase(input.tool??"");if(tool3!=="bash"&&tool3!=="shell")return;let args2=(typeof input.callID==="string"?getStoredInputArgs(input.callID):void 0)??input.args??output.args;if(!(typeof args2?.command==="string"?args2.command:"").includes("gh pr create"))return;let outputText2=typeof output.output==="string"?output.output:"";if(!outputText2)return;let prInfo=extractPrUrl(outputText2);if(!prInfo)return;await _internals136.subscribe(directory,{sessionID,prNumber:prInfo.prNumber,repoFullName:prInfo.repoFullName,prUrl:prInfo.prUrl,maxSubscriptions:config3.max_subscriptions}),_internals136.log("[pr-monitor] Auto-subscribed session to created PR",{sessionID,pr:`${prInfo.repoFullName}#${prInfo.prNumber}`})}catch(err){_internals136.log("[pr-monitor] Auto-subscribe failed (non-fatal)",{error:err instanceof Error?err.message:String(err)})}}}}init_pr_workflow_gate();init_pr_workflow_auto_wake();init_pr_workflow_gate();var DEFAULT_WAKE_TIMEOUT_MS=5000,_internals137={readPrWorkflowGateState},DEFAULT_MAX_CONSECUTIVE_UNPRODUCTIVE_WAKES=5,DEFAULT_WAKE_COOLDOWN_MS=30000,DEFAULT_BANNER_COOLDOWN_MS=20000,MAX_TRACKED_WAKE_SESSIONS=200;function blockedText(mode,options={}){let lines=[`[${mode} WORKFLOW ACTIVE]`,`The ${mode} workflow gate is still active. Continue with the required structured lanes, evidence, and controller tools until \`complete_pr_workflow\` succeeds.`,`If the bind/checkout path is unreachable — for example a compound \`git fetch && git checkout\` was rejected as read-only shell syntax, the PR head cannot be fetched, or the working tree is on the wrong branch — call \`abort_pr_workflow\` (mode: "${mode}", reason: "<one-line cause>") to clear the gate, or ask the user to run \`/swarm abort-pr-workflow\`.`];if(options.suspended){let max=options.maxConsecutive;lines.push(`Auto-resume is suspended after ${max??"the configured number of"} consecutive unproductive retries (the durable gate \`revision\` did not advance). The session will not be re-awoken automatically. Run \`/swarm abort-pr-workflow\` or call \`abort_pr_workflow\` to clear the gate, or complete the workflow with \`complete_pr_workflow\` to publish normally.`)}if(options.userInterrupted)lines.push("Auto-resume is paused after a user interruption. The durable workflow gate is preserved, but the plugin will not re-awaken this session. Send a new message to continue, or run `/swarm abort-pr-workflow` to clear the workflow.");return lines.join(`
|
|
5994
|
-
`)}function workflowBanner(mode,options={}){let lines=[`--- [${mode} WORKFLOW ACTIVE — output below is not a terminal verdict; \`complete_pr_workflow\` clears the gate on success; if the bind/checkout path is unreachable call \`abort_pr_workflow\` or run \`/swarm abort-pr-workflow\`] ---`];if(options.suspended){let max=options.maxConsecutive;lines.push(`[Auto-resume is suspended after ${max??"the configured number of"} consecutive unproductive retries. Run \`/swarm abort-pr-workflow\` or call \`abort_pr_workflow\` to clear the gate, or complete the workflow with \`complete_pr_workflow\`.]`)}if(options.userInterrupted)lines.push("[Auto-resume paused after a user interruption. Send a new message to continue, or run `/swarm abort-pr-workflow` to clear the workflow.]");return lines.join(" ")}function createPrWorkflowResponseGate(options){let wakeTimeoutMs=options.wakeTimeoutMs??DEFAULT_WAKE_TIMEOUT_MS,maxConsecutive=options.maxConsecutiveUnproductiveWakes??DEFAULT_MAX_CONSECUTIVE_UNPRODUCTIVE_WAKES,wakeCooldownMs=options.wakeCooldownMs??DEFAULT_WAKE_COOLDOWN_MS,bannerCooldownMs=options.bannerCooldownMs??DEFAULT_BANNER_COOLDOWN_MS,activeWakeSessions=new Set,wakeBudgets=new Map,bannerStamps=new Map,session=options.client?.session;function evictIfOverBound(){while(wakeBudgets.size>MAX_TRACKED_WAKE_SESSIONS){let oldestKey=wakeBudgets.keys().next().value;if(oldestKey===void 0)break;wakeBudgets.delete(oldestKey)}}function
|
|
5995
|
-
Do not stop or summarize. Inspect the durable gate, dispatch or collect the next missing required lane, and continue until complete_pr_workflow succeeds. If the bind/checkout path is genuinely unreachable, call abort_pr_workflow instead of looping.`}]}},call=session.promptAsync?session.promptAsync(args2):session.prompt(args2),result=await Promise.race([call,new Promise((_resolve,reject2)=>{timer=setTimeout(()=>reject2(Error("PR workflow resume prompt timed out")),wakeTimeoutMs)})]);if(result?.error!=null)throw promptRejected=!0,Error(`PR workflow resume prompt failed: ${String(result.error)}`)}finally{if(timer)clearTimeout(timer);if(promptRejected)cancelPrWorkflowPluginWake(options.directory,sessionID,pluginWakeMessageID);let postWakeState=await _internals137.readPrWorkflowGateState(options.directory,sessionID);if(budget.lastWakeAt=now,postWakeState===null)resetBudget(sessionID);else{let currentRevision=postWakeState.revision,effectiveMadeProgress=madeProgress||budget.lastSeenRevision!==void 0&¤tRevision>budget.lastSeenRevision;if(budget.lastSeenRevision=currentRevision,!effectiveMadeProgress){if(budget.consecutiveUnproductive+=1,budget.consecutiveUnproductive>=maxConsecutive)budget.suspended=!0}else budget.consecutiveUnproductive=0}}}finally{activeWakeSessions.delete(sessionID)}},textComplete:async(input,output)=>{if(!input.sessionID?.trim())return;let state=await _internals137.readPrWorkflowGateState(options.directory,input.sessionID);if(!state){resetBudget(input.sessionID),clearPrWorkflowAutoWakeState(options.directory,input.sessionID);return}let suspended=wakeBudgets.get(input.sessionID)?.suspended??!1,userInterrupted=isPrWorkflowAutoWakeSuppressed(options.directory,input.sessionID),forceFullBanner=suspended||userInterrupted,now=Date.now(),lastBannerAt=bannerStamps.get(input.sessionID),withinCooldown=lastBannerAt!==void 0&&now-lastBannerAt<bannerCooldownMs;if(!forceFullBanner&&withinCooldown){output.text=`--- [${state.mode} WORKFLOW ACTIVE] ---
|
|
5993
|
+
`);if(!text)return;let acks=parseAcknowledgments(text);if(acks.length===0)return;let ctx={sessionId:sessionID};for(let ack of acks){let key=buildAckDedupKey(sessionID,ack.id,ack.result);if(swarmState.knowledgeAckDedup.has(key))continue;addKnowledgeAckDedup(key);try{await recordAcknowledgment(directory,ack,ctx)}catch(err){warn(`[knowledge-application-gate] transform-scan record failed: ${err instanceof Error?err.message:String(err)}`)}}}var _internals135={knowledgeApplicationGateBefore,knowledgeApplicationTransformScan,HIGH_RISK_TOOLS,writeWarnEvent:writeWarnEvent2};init_knowledge_curator();init_micro_reflector();init_normalize_tool_name();init_pr_subscriptions();init_utils();init_stored_input_args();init_normalize_tool_name();var MAX_OUTPUT_SCAN_BYTES=65536,PR_URL_PATTERN=/https:\/\/github\.com\/([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)\/pull\/(\d+)/,_internals136={subscribe,log};function extractPrUrl(text){let match=PR_URL_PATTERN.exec(text.slice(0,MAX_OUTPUT_SCAN_BYTES));if(!match)return null;let owner=match[1],repo=match[2],prNumber=Number.parseInt(match[3],10);if(!Number.isSafeInteger(prNumber)||prNumber<=0)return null;return{repoFullName:`${owner}/${repo}`,prNumber,prUrl:`https://github.com/${owner}/${repo}/pull/${prNumber}`}}function createPrAutoSubscribeHook(directory,config3){return{toolAfter:async(input,output)=>{try{if(!config3.enabled||!config3.auto_subscribe_on_pr_create)return;let sessionID=typeof input.sessionID==="string"?input.sessionID.trim():"";if(!sessionID)return;let tool3=normalizeToolNameLowerCase(input.tool??"");if(tool3!=="bash"&&tool3!=="shell")return;let args2=(typeof input.callID==="string"?getStoredInputArgs(input.callID):void 0)??input.args??output.args;if(!(typeof args2?.command==="string"?args2.command:"").includes("gh pr create"))return;let outputText2=typeof output.output==="string"?output.output:"";if(!outputText2)return;let prInfo=extractPrUrl(outputText2);if(!prInfo)return;await _internals136.subscribe(directory,{sessionID,prNumber:prInfo.prNumber,repoFullName:prInfo.repoFullName,prUrl:prInfo.prUrl,maxSubscriptions:config3.max_subscriptions}),_internals136.log("[pr-monitor] Auto-subscribed session to created PR",{sessionID,pr:`${prInfo.repoFullName}#${prInfo.prNumber}`})}catch(err){_internals136.log("[pr-monitor] Auto-subscribe failed (non-fatal)",{error:err instanceof Error?err.message:String(err)})}}}}init_pr_workflow_gate();init_pr_workflow_auto_wake();init_pr_workflow_gate();var DEFAULT_WAKE_TIMEOUT_MS=5000,_internals137={readPrWorkflowGateState},DEFAULT_MAX_CONSECUTIVE_UNPRODUCTIVE_WAKES=5,DEFAULT_WAKE_COOLDOWN_MS=30000,DEFAULT_BANNER_COOLDOWN_MS=20000,MAX_FALLBACK_BANNER_INJECTIONS_PER_SESSION=20,BANNER_PREFIX_PATTERN=/^--- \[(?:PR_REVIEW|PR_FEEDBACK) WORKFLOW ACTIVE/,MAX_TRACKED_WAKE_SESSIONS=200;function blockedText(mode,options={}){let lines=[`[${mode} WORKFLOW ACTIVE]`,`The ${mode} workflow gate is still active. Continue with the required structured lanes, evidence, and controller tools until \`complete_pr_workflow\` succeeds.`,`If the bind/checkout path is unreachable — for example a compound \`git fetch && git checkout\` was rejected as read-only shell syntax, the PR head cannot be fetched, or the working tree is on the wrong branch — call \`abort_pr_workflow\` (mode: "${mode}", reason: "<one-line cause>") to clear the gate, or ask the user to run \`/swarm abort-pr-workflow\`.`];if(options.suspended){let max=options.maxConsecutive;lines.push(`Auto-resume is suspended after ${max??"the configured number of"} consecutive unproductive retries (the durable gate \`revision\` did not advance). The session will not be re-awoken automatically. Run \`/swarm abort-pr-workflow\` or call \`abort_pr_workflow\` to clear the gate, or complete the workflow with \`complete_pr_workflow\` to publish normally.`)}if(options.userInterrupted)lines.push("Auto-resume is paused after a user interruption. The durable workflow gate is preserved, but the plugin will not re-awaken this session. Send a new message to continue, or run `/swarm abort-pr-workflow` to clear the workflow.");return lines.join(`
|
|
5994
|
+
`)}function workflowBanner(mode,options={}){let lines=[`--- [${mode} WORKFLOW ACTIVE — output below is not a terminal verdict; \`complete_pr_workflow\` clears the gate on success; if the bind/checkout path is unreachable call \`abort_pr_workflow\` or run \`/swarm abort-pr-workflow\`] ---`];if(options.suspended){let max=options.maxConsecutive;lines.push(`[Auto-resume is suspended after ${max??"the configured number of"} consecutive unproductive retries. Run \`/swarm abort-pr-workflow\` or call \`abort_pr_workflow\` to clear the gate, or complete the workflow with \`complete_pr_workflow\`.]`)}if(options.userInterrupted)lines.push("[Auto-resume paused after a user interruption. Send a new message to continue, or run `/swarm abort-pr-workflow` to clear the workflow.]");return lines.join(" ")}function createPrWorkflowResponseGate(options){let wakeTimeoutMs=options.wakeTimeoutMs??DEFAULT_WAKE_TIMEOUT_MS,maxConsecutive=options.maxConsecutiveUnproductiveWakes??DEFAULT_MAX_CONSECUTIVE_UNPRODUCTIVE_WAKES,wakeCooldownMs=options.wakeCooldownMs??DEFAULT_WAKE_COOLDOWN_MS,bannerCooldownMs=options.bannerCooldownMs??DEFAULT_BANNER_COOLDOWN_MS,activeWakeSessions=new Set,wakeBudgets=new Map,bannerStamps=new Map,banneredMessages=new Map,fallbackInjections=new Map,session=options.client?.session;function evictIfOverBound(){while(wakeBudgets.size>MAX_TRACKED_WAKE_SESSIONS){let oldestKey=wakeBudgets.keys().next().value;if(oldestKey===void 0)break;wakeBudgets.delete(oldestKey)}}function evictBannerDedupeMapsIfOverBound(){while(bannerStamps.size>MAX_TRACKED_WAKE_SESSIONS){let oldestKey=bannerStamps.keys().next().value;if(oldestKey===void 0)break;bannerStamps.delete(oldestKey)}while(banneredMessages.size>MAX_TRACKED_WAKE_SESSIONS){let oldestKey=banneredMessages.keys().next().value;if(oldestKey===void 0)break;banneredMessages.delete(oldestKey)}while(fallbackInjections.size>MAX_TRACKED_WAKE_SESSIONS){let oldestKey=fallbackInjections.keys().next().value;if(oldestKey===void 0)break;fallbackInjections.delete(oldestKey)}}function resetBudget(sessionID){wakeBudgets.delete(sessionID),bannerStamps.delete(sessionID),banneredMessages.delete(sessionID),fallbackInjections.delete(sessionID)}return{event:async(input)=>{let wakeDecision=await observePrWorkflowAutoWakeEvent(options.directory,input.event),event2=input.event,sessionID=event2?.properties?.sessionID??event2?.data?.sessionID;if(event2?.type!=="session.idle"||typeof sessionID!=="string"||!sessionID.trim()||wakeDecision.suppressWake||activeWakeSessions.has(sessionID))return;activeWakeSessions.add(sessionID);try{let state=await _internals137.readPrWorkflowGateState(options.directory,sessionID);if(!state){resetBudget(sessionID),clearPrWorkflowAutoWakeState(options.directory,sessionID);return}if(isPrWorkflowAutoWakeSuppressed(options.directory,sessionID))return;if(!session)return;evictIfOverBound();let budget=wakeBudgets.get(sessionID);if(!budget)budget={consecutiveUnproductive:0,lastWakeAt:0,suspended:!1},wakeBudgets.set(sessionID,budget);if(budget.suspended)return;let now=Date.now();if(budget.lastSeenRevision!==void 0&&state.revision>budget.lastSeenRevision)budget.consecutiveUnproductive=0;if(budget.consecutiveUnproductive>0&&budget.lastWakeAt>0&&now-budget.lastWakeAt<wakeCooldownMs)return;let madeProgress=budget.lastSeenRevision===void 0?!0:state.revision>budget.lastSeenRevision,pluginWakeMessageID=markPrWorkflowPluginWake(options.directory,sessionID),promptRejected=!1,timer;try{let args2={path:{id:sessionID},body:{messageID:pluginWakeMessageID,parts:[{type:"text",text:`${blockedText(state.mode,{suspended:!1,maxConsecutive})}
|
|
5995
|
+
Do not stop or summarize. Inspect the durable gate, dispatch or collect the next missing required lane, and continue until complete_pr_workflow succeeds. If the bind/checkout path is genuinely unreachable, call abort_pr_workflow instead of looping.`}]}},call=session.promptAsync?session.promptAsync(args2):session.prompt(args2),result=await Promise.race([call,new Promise((_resolve,reject2)=>{timer=setTimeout(()=>reject2(Error("PR workflow resume prompt timed out")),wakeTimeoutMs)})]);if(result?.error!=null)throw promptRejected=!0,Error(`PR workflow resume prompt failed: ${String(result.error)}`)}finally{if(timer)clearTimeout(timer);if(promptRejected)cancelPrWorkflowPluginWake(options.directory,sessionID,pluginWakeMessageID);let postWakeState=await _internals137.readPrWorkflowGateState(options.directory,sessionID);if(budget.lastWakeAt=now,postWakeState===null)resetBudget(sessionID);else{let currentRevision=postWakeState.revision,effectiveMadeProgress=madeProgress||budget.lastSeenRevision!==void 0&¤tRevision>budget.lastSeenRevision;if(budget.lastSeenRevision=currentRevision,!effectiveMadeProgress){if(budget.consecutiveUnproductive+=1,budget.consecutiveUnproductive>=maxConsecutive)budget.suspended=!0}else budget.consecutiveUnproductive=0}}}finally{activeWakeSessions.delete(sessionID)}},textComplete:async(input,output)=>{if(!input.sessionID?.trim())return;let state=await _internals137.readPrWorkflowGateState(options.directory,input.sessionID);if(!state){resetBudget(input.sessionID),clearPrWorkflowAutoWakeState(options.directory,input.sessionID);return}if(!output.text.trim())return;if(BANNER_PREFIX_PATTERN.test(output.text))return;let messageID=input.messageID?.trim();if(messageID){if(banneredMessages.get(input.sessionID)===messageID)return}else{let injected=fallbackInjections.get(input.sessionID)??0;if(injected>=MAX_FALLBACK_BANNER_INJECTIONS_PER_SESSION)return;fallbackInjections.set(input.sessionID,injected+1),evictBannerDedupeMapsIfOverBound()}let suspended=wakeBudgets.get(input.sessionID)?.suspended??!1,userInterrupted=isPrWorkflowAutoWakeSuppressed(options.directory,input.sessionID),forceFullBanner=suspended||userInterrupted,now=Date.now(),lastBannerAt=bannerStamps.get(input.sessionID),withinCooldown=lastBannerAt!==void 0&&now-lastBannerAt<bannerCooldownMs;if(messageID)banneredMessages.set(input.sessionID,messageID),evictBannerDedupeMapsIfOverBound();if(!forceFullBanner&&withinCooldown){output.text=`--- [${state.mode} WORKFLOW ACTIVE] ---
|
|
5996
5996
|
|
|
5997
|
-
${output.text}`;return}let banner=workflowBanner(state.mode,{suspended,userInterrupted,maxConsecutive});bannerStamps.set(input.sessionID,now),
|
|
5997
|
+
${output.text}`;return}let banner=workflowBanner(state.mode,{suspended,userInterrupted,maxConsecutive});bannerStamps.set(input.sessionID,now),evictBannerDedupeMapsIfOverBound(),output.text=`${banner}
|
|
5998
5998
|
|
|
5999
5999
|
${output.text}`},_inspectWakeBudget:(sessionID)=>wakeBudgets.get(sessionID)}}init_pending_delegations();init_pr_workflow_gate();var MAX_PARENT_DEPTH=16,MAX_TRACKED_SESSION_PARENTS=512;function rememberBounded2(parents,childSessionID,parentSessionID){parents.delete(childSessionID),parents.set(childSessionID,parentSessionID);while(parents.size>MAX_TRACKED_SESSION_PARENTS){let oldest=parents.keys().next().value;if(typeof oldest!=="string")break;parents.delete(oldest)}}function createPrWorkflowSessionResolver(options){let session=options.client?.session,parents=new Map;return{observeEvent:(input)=>{let event=input.event;if(event?.type!=="session.created"&&event?.type!=="session.updated")return;let child=event.properties?.info?.id,parent=event.properties?.info?.parentID;if(typeof child==="string"&&child.trim()&&typeof parent==="string"&&parent.trim())rememberBounded2(parents,child.trim(),parent.trim())},resolve:async(sessionID)=>{let original=sessionID.trim();if(!original)return sessionID;let current=original,visited=new Set;for(let depth=0;depth<MAX_PARENT_DEPTH;depth+=1){if(visited.has(current))break;if(visited.add(current),await readPrWorkflowGateState(options.directory,current))return current;let parent=parents.get(current);if(!parent)parent=findByCorrelationId(options.directory,current)?.parentSessionId;if(!parent&&session?.get){let result=await session.get({path:{id:current},query:{directory:options.directory}});if(result?.error==null){let candidate=result?.data?.parentID;if(typeof candidate==="string"&&candidate.trim())parent=candidate.trim()}}if(!parent)return original;rememberBounded2(parents,current,parent),current=parent}return original}}}init_schema();init_bun_compat();init_logger();var import_picomatch2=__toESM(require_picomatch2(),1);import{existsSync as existsSync105,readdirSync as readdirSync31,readFileSync as readFileSync78,statSync as statSync41}from"node:fs";import*as path207 from"node:path";var PREDICATE_TIMEOUT_MS=15000,GREP_MAX_FILES=1e4,GREP_MAX_BYTES_PER_FILE=1e6,GREP_SKIP_DIRECTORIES=new Set([".git",".swarm","node_modules","dist","coverage"]),TOOL_BINARY_ALLOWLIST=new Set(["rg","grep","git","biome","eslint","tsc","ruff"]);function validateRepoRelativeGlob(directory,value){let v=value.trim();if(!v)return null;if(v.includes("\x00"))return null;if(v.startsWith("/")||/^[A-Za-z]:[\\/]/.test(v)||v.startsWith("\\"))return null;if(v.split(/[/\\]/).some((s)=>s===".."))return null;let globStart=v.search(/[*?{[]/),concrete=globStart===-1?v:v.slice(0,globStart);if(concrete){let baseDir=path207.resolve(directory),resolved=path207.resolve(baseDir,concrete),rel=path207.relative(baseDir,resolved);if(rel.startsWith("..")||path207.isAbsolute(rel))return null}return v}function findBinaryInPath(binary){let candidates=process.platform==="win32"?[`${binary}.exe`,`${binary}.cmd`,`${binary}.bat`,binary]:[binary];for(let dir of(process.env.PATH??"").split(path207.delimiter)){if(!dir)continue;for(let name of candidates){let candidate=path207.join(dir,name);if(existsSync105(candidate))return candidate}}return null}function safeChildEnv(){let env={};if(process.env.PATH)env.PATH=process.env.PATH;if(process.env.HOME)env.HOME=process.env.HOME;if(process.env.SystemRoot)env.SystemRoot=process.env.SystemRoot;if(process.env.TEMP)env.TEMP=process.env.TEMP;if(process.env.TMP)env.TMP=process.env.TMP;return env}async function runArgv(argv,cwd){let proc=bunSpawn(argv,{stdin:"ignore",stdout:"pipe",stderr:"pipe",cwd,env:safeChildEnv()}),finished=!1;try{let timeout=new Promise((resolve72)=>setTimeout(()=>resolve72("timeout"),PREDICATE_TIMEOUT_MS));if(await Promise.race([proc.exited,timeout])==="timeout")return{exitCode:null,stdout:"",stderr:"",timedOut:!0};let[stdout,stderr]=await Promise.all([proc.stdout.text().catch(()=>""),proc.stderr.text().catch(()=>"")]);return finished=!0,{exitCode:proc.exitCode,stdout,stderr,timedOut:!1}}finally{if(!finished)try{proc.kill()}catch{}}}async function runGrepPredicate(rest,directory){let lastColon=rest.lastIndexOf(":");if(lastColon<=0||lastColon===rest.length-1)return{result:"error",detail:"grep: expected <regex>:<path-glob>"};let regex=rest.slice(0,lastColon),rawGlob=rest.slice(lastColon+1),glob=validateRepoRelativeGlob(directory,rawGlob);if(glob===null)return{result:"error",detail:`grep: unsafe or empty path-glob "${rawGlob}"`};let pattern;try{pattern=new RegExp(regex,"m")}catch(err){return{result:"error",detail:`grep: invalid regex ${err instanceof Error?err.message:String(err)}`}}let matcher=import_picomatch2.default(glob,{dot:!0}),visited=0,matches=0,walk=(dir)=>{if(visited>=GREP_MAX_FILES)return;let entries;try{entries=readdirSync31(dir,{withFileTypes:!0})}catch{return}for(let entry of entries){if(visited>=GREP_MAX_FILES)return;let fullPath=path207.join(dir,entry.name),relPath=path207.relative(directory,fullPath).replace(/\\/g,"/");if(entry.isDirectory()){if(!GREP_SKIP_DIRECTORIES.has(entry.name))walk(fullPath);continue}if(!entry.isFile())continue;if(visited++,!matcher(relPath))continue;try{if(statSync41(fullPath).size>GREP_MAX_BYTES_PER_FILE)continue;let found=readFileSync78(fullPath,"utf-8").match(pattern);if(found)matches+=found.length}catch{}}};if(walk(directory),visited>=GREP_MAX_FILES)return{result:"error",detail:`grep: file scan exceeded ${GREP_MAX_FILES} files`};if(matches===0)return{result:"pass",detail:"grep: zero matches"};return{result:"fail",detail:`grep: ${matches} match(es) found`}}async function runToolPredicate(rest,directory){let raw=rest.trim();if(!raw)return{result:"error",detail:"tool: empty command"};if(raw.includes("\x00"))return{result:"error",detail:"tool: null byte in command"};let argvParts=raw.split(/\s+/).filter((p)=>p.length>0);if(argvParts.length===0)return{result:"error",detail:"tool: empty command"};let binary=argvParts[0];if(binary.includes("/")||binary.includes("\\"))return{result:"error",detail:`tool: path-qualified binary "${binary}" is not allowed`};if(!TOOL_BINARY_ALLOWLIST.has(binary))return{result:"error",detail:`tool: binary "${binary}" is not on the allowlist`};let resolved=findBinaryInPath(binary);if(!resolved)return{result:"error",detail:`tool: binary "${binary}" not found`};let res=await runArgv([resolved,...argvParts.slice(1)],directory);if(res.timedOut)return{result:"error",detail:"tool: timed out"};if(res.exitCode===0)return{result:"pass",detail:"tool: exit 0"};return{result:"fail",detail:`tool: exit ${res.exitCode} ${res.stderr.slice(0,200)}`}}async function changedPaths(directory){let git2=findBinaryInPath("git");if(!git2)return null;let res=await runArgv([git2,"status","--porcelain","-z"],directory);if(res.timedOut||res.exitCode!==0)return null;let out=new Set;for(let entry of res.stdout.split("\x00")){if(entry.length<=3)continue;let p=entry.slice(3);if(p)out.add(path207.normalize(p))}return out}async function runFileModifiedPredicate(rest,directory,expectModified){let label=expectModified?"file_modified":"file_not_modified",safe=validateRepoRelativeGlob(directory,rest);if(safe===null)return{result:"error",detail:`${label}: unsafe or empty path "${rest}"`};let changed=await changedPaths(directory);if(changed===null)return{result:"error",detail:`${label}: git unavailable or failed`};let target=path207.normalize(safe),isChanged=changed.has(target);return{result:(expectModified?isChanged:!isChanged)?"pass":"fail",detail:`${label}: ${target} ${isChanged?"changed":"unchanged"}`}}async function runDirectivePredicate(predicate,directory){try{if(typeof predicate!=="string"||!predicate.trim())return{result:"error",detail:"predicate: empty"};let trimmed=predicate.trim(),firstColon=trimmed.indexOf(":");if(firstColon<=0)return{result:"error",detail:"predicate: missing handler prefix (expected <handler>:...)"};let handler=trimmed.slice(0,firstColon),rest=trimmed.slice(firstColon+1);switch(handler){case"grep":return await runGrepPredicate(rest,directory);case"tool":return await runToolPredicate(rest,directory);case"file_not_modified":return await runFileModifiedPredicate(rest,directory,!1);case"file_modified":return await runFileModifiedPredicate(rest,directory,!0);default:return{result:"error",detail:`predicate: unknown handler "${handler}"`}}}catch(err){return warn(`[directive-predicate-runner] unexpected error: ${err instanceof Error?err.message:String(err)}`),{result:"error",detail:"predicate: unexpected error (fail-closed)"}}}init_knowledge_escalator();init_knowledge_events();init_skill_propagation_gate();var VERDICT_PATTERN=/\b(VERIFIED|VIOLATED|N\/A)\s*:\s*([A-Za-z0-9._-]{1,80})(?:\s+(?:evidence|reason)\s*=\s*([^\n\r]+?))?(?=$|[\n\r]|\s+(?:VERIFIED|VIOLATED|N\/A)\b)/gi;function parseReviewerDirectiveCompliance(text){if(!text||typeof text!=="string")return[];let out=[];for(let m of text.matchAll(VERDICT_PATTERN)){let verb=m[1].toUpperCase(),id=m[2],evidence=m[3]?.trim().slice(0,280),verdict=verb==="VERIFIED"?"verified":verb==="VIOLATED"?"violated":"n_a";out.push({id,verdict,evidence})}return out}function verdictToEventType(v){return v==="verified"?"applied":v==="violated"?"violated":"n_a"}async function reconcileReviewerVerdicts(params){let result={emitted:[],omittedCriticals:[]};try{let verifyById=new Map(params.directivesToVerify.map((d)=>[d.id,d]));if(verifyById.size===0)return result;let verdicts=parseReviewerDirectiveCompliance(params.transcript),addressed=new Set,violatedIds=new Set,traceId=newTraceId(),sessionId=params.sessionId??"unknown",agent=params.agent??"reviewer";for(let v of verdicts){let directive=verifyById.get(v.id);if(!directive)continue;addressed.add(v.id);let type=verdictToEventType(v.verdict),predicateCheck;if(v.verdict==="violated"&&directive.verification_predicate){let outcome=await runDirectivePredicate(directive.verification_predicate,params.directory);predicateCheck={predicate:directive.verification_predicate,result:outcome.result,detail:outcome.detail}}if(await recordKnowledgeEvent(params.directory,{type,trace_id:traceId,knowledge_id:v.id,session_id:sessionId,task_id:params.taskId,phase:params.phase,agent,source:"reviewer",reason:v.evidence,predicate_check:predicateCheck}),type==="violated")violatedIds.add(v.id);result.emitted.push({id:v.id,type,source:"reviewer"})}for(let d of params.directivesToVerify){if(d.priority!=="critical")continue;if(addressed.has(d.id))continue;result.omittedCriticals.push(d.id),await recordKnowledgeEvent(params.directory,{type:"violated",trace_id:traceId,knowledge_id:d.id,session_id:sessionId,task_id:params.taskId,phase:params.phase,agent,source:"reviewer",reason:"reviewer_omitted"}),violatedIds.add(d.id),result.emitted.push({id:d.id,type:"violated",source:"reviewer"})}if(violatedIds.size>0)await escalateViolatedEntries(params.directory,[...violatedIds])}catch{}return result}function isTaskTool6(tool3){return tool3==="Task"||tool3==="task"}async function collectReviewerVerdictsAfter(directory,input,output){if(!isTaskTool6(input.tool))return;let parsedArgs=parseDelegationArgs(input.args);if(!parsedArgs)return;if(stripKnownSwarmPrefix(parsedArgs.targetAgent).toLowerCase()!=="reviewer")return;let argsRecord=input.args&&typeof input.args==="object"?input.args:null,prompt=argsRecord&&typeof argsRecord.prompt==="string"?argsRecord.prompt:"";if(!prompt)return;let transcript=typeof output.output==="string"?output.output:"";if(!transcript)return;let directivesToVerify=parseDirectivesToVerifyBlock(prompt);if(directivesToVerify.length===0)return;let sessionId=typeof input.sessionID==="string"?input.sessionID:void 0;await reconcileReviewerVerdicts({directory,transcript,directivesToVerify,sessionId,agent:"reviewer"})}init_constants();init_schema();init_scope_binding();init_scope_persistence();init_state2();init_normalize_tool_name();init_pr_workflow_gate();init_write_target_resolver();import*as path208 from"node:path";var WRITE_TOOLS2=new Set(WRITE_TOOL_NAMES);function createScopeGuardHook(config3,directory,injectAdvisory){let enabled=config3.enabled??!0,_skipInTurbo=config3.skip_in_turbo??!1;return{toolBefore:async(input,output)=>{if(!enabled)return;let toolName=normalizeToolName(input.tool);if(!WRITE_TOOLS2.has(toolName))return;let sessionId=input.sessionID,activeAgent=swarmState.activeAgent.get(sessionId),session=swarmState.agentSessions.get(sessionId),agentName=activeAgent??session?.agentName??"unknown",agentRole=stripKnownSwarmPrefix(agentName);if(agentRole===ORCHESTRATOR_NAME)return;if(agentRole!=="coder")return;let targets=_internals138.resolveWriteTargets(toolName,output.args,{directory});if(targets.status==="unverifiable")throw Error(`WRITE TARGET UNVERIFIABLE: ${agentName} invoked ${toolName}: ${targets.reason}`);if(targets.paths.length===0)return;let taskId=_internals138.resolveTaskId(session),binding=taskId?_internals138.resolveAuthorizedScopeBinding({directory,taskId,activeSessionId:sessionId}):_internals138.resolveAuthorizedScopeBindingForSession({directory,activeSessionId:sessionId});if(!binding){if(binding=_internals138.getAuthorizedPrFeedbackScopeBinding({directory,activeSessionId:sessionId,taskId:taskId??void 0})??_internals138.resolveAuthorizedPrFeedbackScopeBindingFromDisk({directory,activeSessionId:sessionId,taskId:taskId??void 0}),binding&&!await _internals138.validatePrFeedbackScopeBinding(directory,binding))binding=null}if(!taskId&&binding&&session)taskId=binding.taskId,session.currentTaskId=binding.taskId,session.declaredCoderScope=[...binding.files];let declaredScope=binding?.files??null;if(!declaredScope||declaredScope.length===0)throw Error(`SCOPE_NOT_DECLARED: ${agentName} cannot invoke ${toolName} without a validated scope for task ${taskId??"unknown"}.`);for(let rawPath of targets.paths){let filePath=sanitizePath(rawPath);if(!isFileInScope(filePath,declaredScope,directory))reportScopeViolation(agentName,filePath,taskId,session,injectAdvisory,swarmState,declaredScope)}}}}function isFileInScope(filePath,scopeEntries,directory){let dir=directory??process.cwd(),resolvedFile=path208.resolve(dir,filePath);return scopeEntries.filter((scope)=>scope.length>0).some((scope)=>{let resolvedScope=path208.resolve(dir,scope);if(resolvedFile===resolvedScope)return!0;let rel=path208.relative(resolvedScope,resolvedFile);return rel.length>0&&!rel.startsWith("..")&&!path208.isAbsolute(rel)})}function sanitizePath(raw){let result="";for(let i=0;i<raw.length;i++){let c=raw.charCodeAt(i);if(c<=31||c===127||c>=128&&c<=159){result+="_";continue}result+=raw[i]}return result.replace(/\[[\d;]*m/g,"")}var _internals138={sanitizePath,resolveWriteTargets:resolveWriteTargets2,resolveAuthorizedScopeBinding,resolveAuthorizedScopeBindingForSession,getAuthorizedPrFeedbackScopeBinding,resolveAuthorizedPrFeedbackScopeBindingFromDisk,validatePrFeedbackScopeBinding,resolveTaskId:(session)=>session?.currentTaskId??null};function reportScopeViolation(agentName,filePath,taskId,session,injectAdvisory,state,scopeEntries){let violationMessage=`SCOPE VIOLATION: ${agentName} attempted to modify '${filePath}' which is not in declared scope for task ${taskId??"unknown"}. Declared scope: [${scopeEntries.slice(0,3).join(", ")}${scopeEntries.length>3?"...":""}]`;if(session)session.lastScopeViolation=violationMessage,session.scopeViolationDetected=!0;if(injectAdvisory)for(let[archSessionId,archSession]of state.agentSessions){let archAgent=state.activeAgent.get(archSessionId)??archSession.agentName;if(stripKnownSwarmPrefix(archAgent)===ORCHESTRATOR_NAME){try{injectAdvisory(archSessionId,`[SCOPE GUARD] ${violationMessage}`)}catch{}break}}throw Error(violationMessage)}init_constants();init_schema();init_state2();init_normalize_tool_name();function createSelfReviewHook(config3,injectAdvisory){let enabled=config3.enabled??!0,skipInTurbo=config3.skip_in_turbo??!0;return{toolAfter:async(input,output)=>{if(!enabled)return;if(normalizeToolName(input.tool)!=="update_task_status")return;let args2=output.args;if(args2?.status!=="in_progress")return;let taskId=typeof args2?.task_id==="string"?args2.task_id:"unknown",sessionId=input.sessionID,agentName=swarmState.activeAgent.get(sessionId)??swarmState.agentSessions.get(sessionId)?.agentName??"";if(stripKnownSwarmPrefix(agentName)!==ORCHESTRATOR_NAME)return;if(skipInTurbo){let session=swarmState.agentSessions.get(sessionId);if(session&&session.turboMode===!0)return}let advisory=[`[SELF-REVIEW] Task ${taskId} is now delegated to coder.`,"After coder completes, review for:"," • Broken conditionals (inverted if/else, wrong comparisons)"," • Off-by-one errors (array bounds, loop indices)"," • Assumptions contradicting existing codebase patterns"," • Missing error handling (uncaught exceptions, unhandled promises)"," • Scope creep (changes outside the declared task spec)","Delegate to critic with self-review focus before marking complete."].join(`
|
|
6000
6000
|
`);try{injectAdvisory(sessionId,advisory)}catch{}}}}init_skill_propagation_gate();init_skill_scoring();init_skill_usage_log();import*as path209 from"node:path";var SKILL_INJECTION_THRESHOLD=0.5,SKILL_INJECTION_TOP_N=5;function injectSkillsIntoDelegation(directory,args2,recommendedSkills,targetAgent,sessionID,options={}){if(!recommendedSkills||recommendedSkills.length===0)return{injected:!1,injectedSkills:[]};let promptRaw=args2.prompt;if(typeof promptRaw!=="string")return{injected:!1,injectedSkills:[]};let parsedDelegation=parseDelegationArgs(args2);if(!parsedDelegation)return{injected:!1,injectedSkills:[]};if(parsedDelegation.skillsField.trim())return{injected:!1,injectedSkills:[]};let qualified=recommendedSkills.filter((s)=>s.score>=SKILL_INJECTION_THRESHOLD);if(qualified.length===0){if(args2.prompt=`SKILLS: none
|
|
@@ -6106,7 +6106,7 @@ followed by exactly:
|
|
|
6106
6106
|
[CLEAN] | workflow_lane | coverage_scope | evidence
|
|
6107
6107
|
Fill every CLEAN field with the exact workflow_lane; bare header-only output is
|
|
6108
6108
|
UNATTESTED for every PR-review lane.
|
|
6109
|
-
Do NOT use the default PROJECT/STRUCTURE output format for this dispatch.`,READ_ONLY_LANE_ROLES=new Set(["explorer","reviewer","test_engineer","critic","critic_oversight","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic_architecture_supervisor","sme","researcher","council_generalist","council_skeptic","council_domain_expert"]),READ_ONLY_TOOL_DENYLIST=[...new Set([...WRITE_TOOL_NAMES,"extract_code_blocks","multiedit","multi_edit","todo_write","save_plan","update_task_status","phase_complete","declare_scope","declare_council_criteria","submit_council_verdicts","submit_phase_council_verdicts","set_qa_gates","write_retro","write_drift_evidence","write_hallucination_evidence","write_mutation_evidence","knowledge_add","knowledge_remove","consensus_mine","summarize_work","doc_scan","lint"])],LaneSchema=exports_external.object({id:exports_external.string().min(1).max(80).regex(/^[A-Za-z0-9][A-Za-z0-9_.-]*$/).describe("Stable lane identifier, unique within this dispatch batch"),agent:exports_external.string().min(1).max(120).describe("Read-only swarm agent name, including any generated swarm prefix"),prompt:exports_external.string().min(1).max(MAX_PROMPT_CHARS).describe("Full lane prompt to send to the requested agent"),workflow_lane:exports_external.string().min(1).max(120).optional().describe("Required mechanical policy identifier in PR workflows; distinct from the retry-safe lane id"),owned_workflow_lanes:exports_external.array(exports_external.string().trim().min(1).max(120)).min(1).max(11).optional().describe("Complete dimension/family set a consolidated PR-review base or micro lane covers under the controller-computed depth tier; must include workflow_lane. Omit for singleton lanes."),feedback_item_ids:exports_external.array(exports_external.string().trim().min(1).max(120)).min(1).optional().describe("PR-feedback ledger item IDs owned exclusively by this lane"),review_item_ids:exports_external.array(exports_external.string().trim().min(1).max(160)).min(1).optional().describe("Candidate/finding IDs owned by a PR-review reviewer or critic lane; every ID requires a parseable verdict row")}),PrReviewTriggerEvaluationRowSchema=exports_external.object({trigger_id:exports_external.string().trim().min(1).max(120),result:exports_external.literal("MATCHED"),evidence:exports_external.string().trim().min(1).max(4000)}).strict(),DispatchLanesArgsSchema=exports_external.object({lanes:exports_external.array(LaneSchema).min(1).max(MAX_LANES).describe("Read-only lane specs to dispatch concurrently"),common_prompt:exports_external.string().min(1).regex(/\S/,"common_prompt must contain non-whitespace content").max(MAX_PROMPT_CHARS-COMMON_PROMPT_SEPARATOR.length-1).optional().describe("Optional shared context prepended to every lane prompt. Send large shared context (PR diff, obligation ledger, scope) ONCE here instead of inlining the same blob into each lane prompt; this keeps the tool-call payload small and avoids malformed/truncated tool-call JSON. Combined common_prompt + per-lane prompt must not exceed the per-lane character limit."),max_concurrent:exports_external.number().int().min(1).max(MAX_LANES).optional().describe("Maximum lanes in flight at once; defaults to lane count"),timeout_ms:exports_external.number().int().min(10).max(MAX_TIMEOUT_MS2).optional().describe("Per-lane timeout in milliseconds. For blocking dispatch this covers session create and prompt execution; for async dispatch this covers launch only, never lane runtime.")}),DispatchLanesAsyncArgsSchema=DispatchLanesArgsSchema.extend({launch_timeout_ms:exports_external.number().int().min(10).max(MAX_TIMEOUT_MS2).optional().describe("Async launch acceptance timeout in milliseconds. This only bounds session creation and promptAsync acceptance; it is never a lane runtime timeout. Deprecated alias: timeout_ms."),batch_id:exports_external.string().min(1).max(MAX_BATCH_ID_CHARS).regex(/^[A-Za-z0-9][A-Za-z0-9_.:-]*$/).optional().describe("Stable async batch id for later collection; generated when omitted"),mode:exports_external.string().min(1).max(80).optional().describe("Advisory workflow mode, such as deep-dive or swarm-pr-review"),pr_head_sha:exports_external.string().min(1).max(80).optional(),base_sha:exports_external.string().regex(/^[0-9a-f]{6,64}$/i).optional(),base_ref:exports_external.string().regex(/^(?!-)[A-Za-z0-9][A-Za-z0-9._/-]{0,255}$/).optional(),scope:exports_external.string().min(1).max(500).optional(),trigger_evaluation:exports_external.array(PrReviewTriggerEvaluationRowSchema).min(1).optional().describe("Exact all-MATCHED repository-agnostic mandatory micro-lane ledger required for swarm-pr-review:micro"),feedback_inventory:exports_external.array(exports_external.string().trim().min(1).max(120)).min(1).optional().describe("Complete immutable feedback item inventory required for swarm-pr-feedback:verification")}),CollectLaneResultsArgsSchema=exports_external.object({batch_id:exports_external.string().min(1).max(MAX_BATCH_ID_CHARS),wait:exports_external.boolean().optional().describe("Poll until all lanes settle or timeout"),timeout_ms:exports_external.number().int().min(0).max(MAX_COLLECT_TIMEOUT_MS).optional().describe("Total wait budget when wait=true"),include_pending:exports_external.boolean().optional().describe("Include pending/running lanes in lane_results. Defaults to true for non-blocking polls and false for wait=true joins."),cancel_pending:exports_external.boolean().optional().describe("Abort and mark pending/running lanes cancelled")});function validatePrReviewMicroDispatch(args2,depthTier){let evaluation=args2.trigger_evaluation;if(!evaluation)throw Error("BLOCKED: PR_REVIEW micro dispatch requires the complete trigger_evaluation ledger");let expected=new Set(PR_REVIEW_REQUIRED_MICRO_LANE_IDS),seen=new Set;for(let row of evaluation){if(seen.has(row.trigger_id))throw Error(`BLOCKED: duplicate PR_REVIEW trigger row: ${row.trigger_id}`);seen.add(row.trigger_id)}let missing=[...expected].filter((id)=>!seen.has(id)),unknown3=[...seen].filter((id)=>!expected.has(id));if(missing.length>0||unknown3.length>0)throw Error(`BLOCKED: PR_REVIEW trigger ledger must be exact; missing: ${missing.join(", ")||"(none)"}; unknown: ${unknown3.join(", ")||"(none)"}`);let required3=new Set(evaluation.map((row)=>row.trigger_id)),laneOwnership=args2.lanes.map((lane)=>({label:lane.workflow_lane??"",owned:lane.owned_workflow_lanes?.length?lane.owned_workflow_lanes:lane.workflow_lane?[lane.workflow_lane]:[]}));if(depthTier==="L"&&laneOwnership.some((lane)=>lane.owned.length!==1))throw Error("BLOCKED: PR_REVIEW micro dispatch at depth tier L requires one dedicated lane per risk family; consolidated owned_workflow_lanes are allowed only at tiers S and M");let flattened=laneOwnership.flatMap((lane)=>lane.owned),duplicates=flattened.filter((value,index)=>flattened.indexOf(value)!==index),unmatched=flattened.filter((triggerId)=>!required3.has(triggerId)),invalidLabels=laneOwnership.filter((lane)=>lane.label.length===0||!lane.owned.includes(lane.label)).map((lane)=>lane.label||"(missing workflow_lane)");if(invalidLabels.length>0||duplicates.length>0||unmatched.length>0)throw Error(`BLOCKED: PR_REVIEW micro lanes must have unique workflow_lane IDs from the mandatory repository-agnostic lane set, with workflow_lane contained in its own owned set; invalid: ${[...new Set([...invalidLabels,...duplicates,...unmatched])].join(", ")}`);let coversAllFamilies=required3.size>0&&[...required3].every((id)=>flattened.includes(id)),microFloor=PR_REVIEW_MICRO_LANE_FLOORS[depthTier];if(coversAllFamilies&&laneOwnership.length<microFloor)throw Error(`BLOCKED: PR_REVIEW micro dispatch at depth tier ${depthTier} covering all ${PR_REVIEW_REQUIRED_MICRO_LANE_IDS.length} risk families requires at least ${microFloor} lanes; received ${laneOwnership.length}. Partial retry batches covering a subset of families are exempt.`)}var _internals145={getSessionOps:()=>swarmState.opencodeClient?.session??null,getGeneratedAgentNames:()=>swarmState.generatedAgentNames,createParallelDispatcher,resolvePrWorkflowRevisionDigestAsync,resolveExactMergeBaseAsync,now:()=>Date.now(),sleep:sleep3};async function executeDispatchLanes(args2,directory,context={}){let parsed=DispatchLanesArgsSchema.safeParse(args2);if(!parsed.success)return failureResult({failure_class:"invalid_args",message:"Invalid dispatch_lanes arguments",errors:boundZodIssues(parsed.error.issues)});let duplicateLaneIds=findDuplicateLaneIds(parsed.data.lanes);if(duplicateLaneIds.length>0)return failureResult({failure_class:"invalid_args",message:"Lane IDs must be unique within one dispatch_lanes batch",errors:duplicateLaneIds.map((id)=>`Duplicate lane id: ${id}`)});if(context.sessionID?.trim())try{await enforcePrWorkflowDispatchLanesAsync(directory,context.sessionID,"dispatch_lanes")}catch(error93){return failureResult({failure_class:"invalid_args",message:error93 instanceof Error?error93.message:"PR workflow gate rejected dispatch"})}let session=_internals145.getSessionOps();if(!session)return failureResult({failure_class:"no_client",message:"OpenCode session client is not available"});let common=applyCommonPrompt(parsed.data.lanes,parsed.data.common_prompt);if(!common.ok)return failureResult({failure_class:"invalid_args",message:"Invalid dispatch_lanes arguments",errors:common.errors});let lanes=applyExplorerFormatSuffix(common.lanes),maxConcurrent=Math.min(parsed.data.max_concurrent??lanes.length,lanes.length,MAX_LANES),timeoutMs=parsed.data.timeout_ms??DEFAULT_TIMEOUT_MS4,dispatcher=_internals145.createParallelDispatcher({enabled:!0,maxConcurrentTasks:maxConcurrent,evidenceLockTimeoutMs:0}),limit=pLimit(maxConcurrent);try{let laneResults=await Promise.all(lanes.map((lane)=>limit(()=>runLane(session,dispatcher,lane,directory,timeoutMs,context))));return buildResult(laneResults,maxConcurrent,timeoutMs)}finally{dispatcher.shutdown()}}async function executeDispatchLanesAsync(args2,directory,context={}){let parsed=DispatchLanesAsyncArgsSchema.safeParse(args2);if(!parsed.success)return asyncFailureResult({failure_class:"invalid_args",message:"Invalid dispatch_lanes_async arguments",errors:boundZodIssues(parsed.error.issues)});let duplicateLaneIds=findDuplicateLaneIds(parsed.data.lanes);if(duplicateLaneIds.length>0)return asyncFailureResult({failure_class:"invalid_args",message:"Lane IDs must be unique within one dispatch_lanes_async batch",errors:duplicateLaneIds.map((id)=>`Duplicate lane id: ${id}`)});let requestedBatchId=parsed.data.batch_id??makeBatchId(),session=_internals145.getSessionOps();if(!session||typeof session.promptAsync!=="function")return asyncFailureResult({failure_class:"no_client",message:"OpenCode session promptAsync client is not available"});let common=applyCommonPrompt(parsed.data.lanes,parsed.data.common_prompt);if(!common.ok)return asyncFailureResult({failure_class:"invalid_args",message:"Invalid dispatch_lanes_async arguments",errors:common.errors});let lanes=common.lanes,batchId=requestedBatchId;if(findByBatchId(directory,batchId).length>0)return asyncFailureResult({failure_class:"invalid_args",message:`Async lane batch already exists: ${batchId}`,errors:[`batch_id must be unique: ${batchId}`]});let verifiedPrHead,workflowRevisionDigest,verifiedReviewBaseSha;if(context.sessionID?.trim()&&parsed.data.pr_head_sha&&(parsed.data.mode?.startsWith("swarm-pr-review:")||parsed.data.mode?.startsWith("swarm-pr-feedback:")))try{if(verifiedPrHead=await assertCurrentCheckoutHead(directory,parsed.data.pr_head_sha),workflowRevisionDigest=await _internals145.resolvePrWorkflowRevisionDigestAsync(directory,parsed.data.pr_head_sha)??void 0,!workflowRevisionDigest)throw Error("BLOCKED: PR workflow could not compute a bounded current-revision digest");if(parsed.data.mode?.startsWith("swarm-pr-review:")){if(!parsed.data.base_sha||!parsed.data.base_ref)throw Error("BLOCKED: PR_REVIEW dispatch requires exact base_sha and base_ref");let resolvedBase=await _internals145.resolveExactMergeBaseAsync(directory,parsed.data.base_ref,parsed.data.pr_head_sha);if(!resolvedBase||resolvedBase.toLowerCase()!==parsed.data.base_sha.toLowerCase())throw Error("BLOCKED: PR_REVIEW base_sha is not the exact merge base of base_ref and pr_head_sha");verifiedReviewBaseSha=resolvedBase}}catch(error93){return asyncFailureResult({failure_class:"invalid_args",message:error93 instanceof Error?error93.message:"PR workflow checkout head verification failed"})}if(context.sessionID?.trim())try{let gateState=await enforcePrWorkflowDispatchLanesAsync(directory,context.sessionID,"dispatch_lanes_async");if(!gateState&&parsed.data.mode?.startsWith("swarm-pr-review:"))gateState=await activatePrWorkflow(directory,context.sessionID,"PR_REVIEW");else if(!gateState&&parsed.data.mode==="swarm-pr-feedback:verification")gateState=await activatePrWorkflow(directory,context.sessionID,"PR_FEEDBACK");if(gateState?.mode==="PR_REVIEW"){let headSha=parsed.data.pr_head_sha;if(!headSha)throw Error("BLOCKED: active PR_REVIEW dispatch requires pr_head_sha");if(!verifiedReviewBaseSha||!parsed.data.base_ref)throw Error("BLOCKED: PR_REVIEW exact merge-base scope was not verified");gateState=await bindPrReviewBase(directory,context.sessionID,{prHeadSha:headSha,baseRef:parsed.data.base_ref,baseSha:verifiedReviewBaseSha});let laneSpecs=parsed.data.lanes.map((lane)=>({laneId:lane.id,workflowLane:lane.workflow_lane,reviewItemIds:lane.review_item_ids,ownedWorkflowLanes:lane.owned_workflow_lanes})),depthTier=gateState.prReviewDepthTier??"L";if(parsed.data.mode==="swarm-pr-review:base"){if((gateState.prReviewBaseDispatches?.length??0)===0){let ownedDimensionIds=parsed.data.lanes.flatMap((lane)=>lane.owned_workflow_lanes?.length?lane.owned_workflow_lanes:lane.workflow_lane?[lane.workflow_lane]:[]),coversAllSixExactlyOnce=ownedDimensionIds.length===PR_REVIEW_BASE_DIMENSION_IDS.length&&new Set(ownedDimensionIds).size===PR_REVIEW_BASE_DIMENSION_IDS.length&&PR_REVIEW_BASE_DIMENSION_IDS.every((dimensionId)=>ownedDimensionIds.includes(dimensionId));if(depthTier==="L"){if(parsed.data.lanes.length!==6||parsed.data.max_concurrent!==6||parsed.data.lanes.some((lane)=>(lane.owned_workflow_lanes?.length??1)!==1))throw Error("BLOCKED: initial PR_REVIEW base dispatch requires exactly six lanes and max_concurrent: 6 at depth tier L (consolidated owned_workflow_lanes are allowed only at tiers S and M)")}else if(!coversAllSixExactlyOnce||parsed.data.lanes.length<PR_REVIEW_BASE_LANE_FLOORS[depthTier]||parsed.data.lanes.length>PR_REVIEW_BASE_DIMENSION_IDS.length||parsed.data.max_concurrent!==parsed.data.lanes.length)throw Error(`BLOCKED: initial PR_REVIEW base dispatch at depth tier ${depthTier} requires between ${PR_REVIEW_BASE_LANE_FLOORS[depthTier]} and ${PR_REVIEW_BASE_DIMENSION_IDS.length} lanes whose owned_workflow_lanes partition all six dimensions exactly once, with max_concurrent equal to the lane count`)}for(let lane of parsed.data.lanes)if(resolveGeneratedAgentRole(lane.agent,swarmState.generatedAgentNames)!=="explorer")throw Error(`BLOCKED: PR_REVIEW base lane "${lane.id}" must use the explorer role`);await enforcePrReviewBaseDimensions(directory,context.sessionID,laneSpecs,{batchId,prHeadSha:headSha})}else if(parsed.data.mode==="swarm-pr-review:micro"){if(await assertPrReviewBaseCoverageSettled(directory,context.sessionID),gateState.prHeadSha&&gateState.prHeadSha!==headSha)throw Error(`BLOCKED: PR_REVIEW head mismatch; expected "${gateState.prHeadSha}", received "${headSha}"`);for(let lane of parsed.data.lanes)if(resolveGeneratedAgentRole(lane.agent,swarmState.generatedAgentNames)!=="explorer")throw Error(`BLOCKED: PR_REVIEW micro lane "${lane.id}" must use the explorer role`);validatePrReviewMicroDispatch(parsed.data,depthTier)}else if(parsed.data.mode==="swarm-pr-review:council"||parsed.data.mode==="swarm-pr-review:reviewer"||parsed.data.mode==="swarm-pr-review:critic"){let phase=parsed.data.mode.endsWith(":council")?"council":parsed.data.mode.endsWith(":reviewer")?"reviewer":"critic";if(parsed.data.lanes.some((lane)=>lane.owned_workflow_lanes))throw Error(`BLOCKED: PR_REVIEW ${phase} lanes must not declare owned_workflow_lanes; depth-tier consolidation applies only to base and micro discovery lanes`);for(let lane of parsed.data.lanes){let role=resolveGeneratedAgentRole(lane.agent,swarmState.generatedAgentNames);if(phase==="council"&&!role.startsWith("council_")||phase==="reviewer"&&role!=="reviewer"||phase==="critic"&&!role.startsWith("critic"))throw Error(`BLOCKED: PR_REVIEW ${phase} lane "${lane.id}" uses invalid role "${role||lane.agent}"`)}await recordPrReviewValidationBatch(directory,context.sessionID,phase,laneSpecs,{batchId,prHeadSha:headSha})}else throw Error("BLOCKED: active PR_REVIEW requires a structured base, micro, council, reviewer, or critic mode")}else if(gateState?.mode==="PR_FEEDBACK"){let headSha=parsed.data.pr_head_sha;if(!headSha)throw Error("BLOCKED: PR_FEEDBACK dispatch requires pr_head_sha");if(parsed.data.lanes.some((lane)=>lane.owned_workflow_lanes))throw Error("BLOCKED: PR_FEEDBACK lanes must not declare owned_workflow_lanes; depth-tier consolidation applies only to PR_REVIEW base and micro discovery lanes");if(parsed.data.mode==="swarm-pr-feedback:verification")await declarePrFeedbackInventory(directory,context.sessionID,parsed.data.feedback_inventory??[],{prHeadSha:headSha}),await enforcePrFeedbackVerificationOwnership(directory,context.sessionID,parsed.data.lanes.map((lane)=>({laneId:lane.id,ownedItemIds:lane.feedback_item_ids??[]})),{batchId,prHeadSha:headSha});else if(parsed.data.mode==="swarm-pr-feedback:stage-b-reviewer"||parsed.data.mode==="swarm-pr-feedback:stage-b-test"||parsed.data.mode==="swarm-pr-feedback:closeout-reviewer"||parsed.data.mode==="swarm-pr-feedback:closeout-critic"){if(parsed.data.lanes.length!==1||parsed.data.max_concurrent!==1)throw Error("BLOCKED: each ordered PR_FEEDBACK gate requires exactly one lane and max_concurrent: 1");let phase=parsed.data.mode.slice(18),lane=parsed.data.lanes[0],role=resolveGeneratedAgentRole(lane.agent,swarmState.generatedAgentNames),expectedRole=phase==="stage-b-test"?"test_engineer":phase==="closeout-critic"?"critic":"reviewer";if(lane.workflow_lane!==phase||(expectedRole==="critic"?!role.startsWith("critic"):role!==expectedRole))throw Error(`BLOCKED: PR_FEEDBACK ${phase} requires workflow_lane "${phase}" and role "${expectedRole}"`);await recordPrFeedbackGateBatch(directory,context.sessionID,phase,{laneId:lane.id,ownedItemIds:lane.feedback_item_ids??[]},{batchId,prHeadSha:headSha,revisionDigest:workflowRevisionDigest??""})}else throw Error("BLOCKED: active PR_FEEDBACK requires structured verification, Stage B reviewer/test, and closeout reviewer/critic modes")}}catch(error93){return asyncFailureResult({failure_class:"invalid_args",message:error93 instanceof Error?error93.message:"PR workflow gate rejected dispatch"})}let contracted=applyPrWorkflowPromptContract(lanes,{mode:parsed.data.mode,prHeadSha:verifiedPrHead,revisionDigest:workflowRevisionDigest,scope:verifiedReviewBaseSha?`complete PR diff ${verifiedReviewBaseSha}...${verifiedPrHead}`:"the complete immutable feedback inventory on the exact checked-out revision",callerFocus:parsed.data.scope});if(!contracted.ok)return asyncFailureResult({failure_class:"invalid_args",message:"Invalid mandatory PR workflow prompt contract",errors:contracted.errors});lanes=applyExplorerFormatSuffix(contracted.lanes);let canonicalWorkflowScope=verifiedReviewBaseSha?`complete PR diff ${verifiedReviewBaseSha}...${verifiedPrHead}`:parsed.data.mode?.startsWith("swarm-pr-feedback:")?"the complete immutable feedback inventory on the exact checked-out revision":parsed.data.scope,maxConcurrent=Math.min(parsed.data.max_concurrent??lanes.length,lanes.length,MAX_LANES),launchTimeoutMs=parsed.data.launch_timeout_ms??parsed.data.timeout_ms??DEFAULT_ASYNC_LAUNCH_TIMEOUT_MS,dispatcher=_internals145.createParallelDispatcher({enabled:!0,maxConcurrentTasks:maxConcurrent,evidenceLockTimeoutMs:0}),limit=pLimit(maxConcurrent);try{let laneResults=await Promise.all(lanes.map((lane)=>limit(()=>launchAsyncLane({session,dispatcher,lane,directory,timeoutMs:launchTimeoutMs,context,batchId,mode:parsed.data.mode,prHeadSha:parsed.data.pr_head_sha,gitHead:verifiedPrHead,dirtyHash:workflowRevisionDigest,scope:canonicalWorkflowScope})))),failed=laneResults.filter((lane)=>lane.status==="failed"),rejected=laneResults.filter((lane)=>lane.status==="rejected"),pending=laneResults.filter((lane)=>lane.status==="pending");return{success:failed.length===0&&rejected.length===0,batch_id:batchId,dispatched:laneResults.length,pending:pending.length,failed:failed.length,rejected:rejected.length,max_concurrent:maxConcurrent,launch_timeout_ms:launchTimeoutMs,timeout_ms:launchTimeoutMs,lane_results:laneResults}}finally{dispatcher.shutdown()}}async function executeCollectLaneResults(args2,directory,context={}){let parsed=CollectLaneResultsArgsSchema.safeParse(args2);if(!parsed.success)return collectFailureResult({failure_class:"invalid_args",batch_id:"",message:"Invalid collect_lane_results arguments",errors:boundZodIssues(parsed.error.issues)});let session=_internals145.getSessionOps();if(!session||typeof session.messages!=="function")return collectFailureResult({failure_class:"no_client",batch_id:parsed.data.batch_id,message:"OpenCode session messages client is not available"});let timeoutMs=parsed.data.timeout_ms??DEFAULT_COLLECT_TIMEOUT_MS,deadline=_internals145.now()+timeoutMs,batchFilter=context.sessionID!==void 0?{parentSessionId:context.sessionID}:void 0,records=findByBatchId(directory,parsed.data.batch_id,batchFilter);if(records.length===0)return collectFailureResult({failure_class:"not_found",batch_id:parsed.data.batch_id,message:`No async lane batch found for ${parsed.data.batch_id}`});let keepPolling=!0,pollIntervalMs=COLLECT_POLL_INTERVAL_MS;while(keepPolling){if(await collectOnce(session,directory,records,parsed.data.cancel_pending===!0),await sweepStaleAsyncLaneRecords(session,directory,records,DEFAULT_ASYNC_STALE_TIMEOUT_MS),records=findByBatchId(directory,parsed.data.batch_id,batchFilter),allSettled(records)||parsed.data.wait!==!0){keepPolling=!1;continue}if(_internals145.now()>=deadline){keepPolling=!1;continue}await _internals145.sleep(Math.min(pollIntervalMs,Math.max(0,deadline-_internals145.now()))),pollIntervalMs=nextCollectPollInterval(pollIntervalMs)}return buildCollectResult(parsed.data.batch_id,records,parsed.data.include_pending??parsed.data.wait!==!0)}async function launchAsyncLane(args2){let validation2=validateLaneAgent(args2.lane.agent,args2.context),role=validation2.role,startedAt=isoNow2();if(!validation2.ok)return{id:args2.lane.id,agent:args2.lane.agent,role,status:"rejected",started_at:startedAt,completed_at:isoNow2(),error:validation2.error};let decision=args2.dispatcher.dispatch(args2.lane.id);if(decision.action!=="dispatch")return{id:args2.lane.id,agent:args2.lane.agent,role,status:"failed",started_at:startedAt,completed_at:isoNow2(),error:`dispatcher ${decision.action}: ${decision.reason}`};try{let createTimeoutMessage=`Lane "${args2.lane.id}" session.create timed out after ${args2.timeoutMs}ms`,createPromise=args2.session.create(buildLaneSessionCreateArgs(args2.directory,args2.lane,args2.context)),createTimedOut=!1;createPromise.then((createResult2)=>{if(createTimedOut&&createResult2.data?.id)scheduleSessionCleanup(args2.session,createResult2.data.id)}).catch(()=>{return});let createResult=await withTimeout2(createPromise,args2.timeoutMs,createTimeoutMessage).catch((error93)=>{if(formatError3(error93)===createTimeoutMessage)createTimedOut=!0;throw error93}),sessionId=createResult.data?.id;if(!sessionId)return failedLane(args2.lane,role,startedAt,`session.create failed: ${formatError3(createResult.error)}`,decision.slot.slotId,decision.slot.runId);if(!await recordPendingDelegation(args2.directory,{correlationId:sessionId,jobId:null,subagentSessionId:sessionId,parentSessionId:args2.context.sessionID??`dispatch_lanes_async:${args2.batchId}`,callID:args2.batchId,normalizedAgent:role,swarmPrefixedAgent:args2.lane.agent,planTaskId:null,evidenceTaskId:null,batchId:args2.batchId,laneId:args2.lane.id,mode:args2.mode??"advisory",workflowLane:args2.lane.workflow_lane,ownedWorkflowLanes:args2.lane.owned_workflow_lanes,promptHash:promptHash(args2.lane,args2.directory,args2.batchId),workspace:{directory:args2.directory,gitHead:args2.gitHead??null,dirtyHash:args2.dirtyHash??null,prHeadSha:args2.prHeadSha??null,scope:args2.scope??null},generation:1}))return cleanupAsyncLaunchSession(args2.session,sessionId),failedLane(args2.lane,role,startedAt,"Failed to record async lane in background delegation ledger",decision.slot.slotId,decision.slot.runId);return scheduleAsyncLanePrompt({session:args2.session,directory:args2.directory,sessionId,lane:args2.lane,timeoutMs:args2.timeoutMs}),{id:args2.lane.id,agent:args2.lane.agent,role,status:"pending",session_id:sessionId,slot_id:decision.slot.slotId,run_id:decision.slot.runId,started_at:startedAt,completed_at:isoNow2()}}catch(error93){return failedLane(args2.lane,role,startedAt,formatError3(error93),decision.slot.slotId,decision.slot.runId)}finally{args2.dispatcher.releaseSlot(decision.slot.slotId)}}async function collectOnce(session,directory,records,cancelPending){for(let record3 of records){if(record3.status!=="pending"&&record3.status!=="running")continue;if(cancelPending){if(typeof session.abort==="function")await session.abort({path:{id:record3.subagentSessionId}}).catch(()=>{return});await appendDelegationTransition(directory,record3.correlationId,{status:"cancelled"});continue}if(!await isLaneReadyForCollection(session,directory,record3.subagentSessionId))continue;let messages;try{messages=await session.messages({path:{id:record3.subagentSessionId},query:{directory,limit:ASYNC_MESSAGE_FETCH_LIMIT}})}catch{continue}if(!messages.data)continue;let transcript=extractAssistantTranscript(messages.data);if(!transcript.text)continue;let collectedRevisionDigest=record3.workspace?.prHeadSha?await _internals145.resolvePrWorkflowRevisionDigestAsync(directory,record3.workspace.prHeadSha)??void 0:void 0,output=prepareLaneOutput({directory,batchId:record3.batchId??record3.callID,laneId:record3.laneId??record3.correlationId,agent:record3.swarmPrefixedAgent,role:record3.normalizedAgent,sessionId:record3.subagentSessionId,parentSessionId:record3.parentSessionId,mode:record3.mode,workflowLane:record3.workflowLane,prHeadSha:record3.workspace?.prHeadSha??void 0,gitHead:record3.workspace?.gitHead??void 0,revisionDigest:collectedRevisionDigest,scope:record3.workspace?.scope??void 0,source:"collect_lane_results",text:transcript.text,messageCount:transcript.messageCount,transcriptIncomplete:transcript.transcriptIncomplete});await appendDelegationTransition(directory,record3.correlationId,{status:"completed",result:{text:output.output,chars:output.output_chars,truncated:output.output_truncated,digest:output.output_digest,...output.output_ref?{outputRef:output.output_ref}:{},outputPreviewChars:output.output.length,...output.output_degraded!==void 0?{outputDegraded:output.output_degraded}:{},...output.output_artifact_error?{outputArtifactError:output.output_artifact_error}:{},...output.transcript_incomplete!==void 0?{transcriptIncomplete:output.transcript_incomplete}:{},messageCount:transcript.messageCount}})}}function scheduleAsyncLanePrompt(args2){queueMicrotask(()=>{startAsyncLanePrompt(args2).catch(async(error93)=>{let message=formatError3(error93);await appendAsyncLaneLaunchError(args2.directory,args2.session,args2.sessionId,message)})})}async function startAsyncLanePrompt(args2){let promptController=new AbortController,promptResult;try{promptResult=await withTimeout2(args2.session.promptAsync({path:{id:args2.sessionId},query:{directory:args2.directory},body:{agent:args2.lane.agent,tools:buildReadOnlyTools(),parts:[{type:"text",text:args2.lane.prompt}]},signal:promptController.signal}),args2.timeoutMs,`Lane "${args2.lane.id}" session.promptAsync launch timed out after ${args2.timeoutMs}ms`,promptController)}catch(error93){await appendAsyncLaneLaunchError(args2.directory,args2.session,args2.sessionId,formatError3(error93));return}if(promptResult.error){await appendAsyncLaneLaunchError(args2.directory,args2.session,args2.sessionId,`session.promptAsync launch failed: ${formatError3(promptResult.error)}`);return}await appendDelegationTransition(args2.directory,args2.sessionId,{status:"running"})}async function appendAsyncLaneLaunchError(directory,session,sessionId,message){await appendDelegationTransition(directory,sessionId,{status:"error",result:{error:message,chars:message.length,truncated:!1,digest:digestText2(message)}}),cleanupAsyncLaunchSession(session,sessionId)}async function isLaneReadyForCollection(session,directory,sessionId){if(typeof session.status!=="function")return!0;try{let status=await session.status({query:{directory}});if(status.error||!status.data)return!1;let current=status.data[sessionId];return current===void 0||current.type==="idle"}catch{return!1}}async function sweepStaleAsyncLaneRecords(session,directory,records,staleTimeoutMs){if(staleTimeoutMs<=0)return;let now=_internals145.now();for(let record3 of records){if(record3.status!=="pending"&&record3.status!=="running"&&record3.status!=="ingestion_error")continue;if(now-record3.updatedAt<=staleTimeoutMs)continue;if(!await isLaneReadyForCollection(session,directory,record3.subagentSessionId))continue;await appendDelegationTransition(directory,record3.correlationId,{status:"stale"})}}function extractAssistantTranscript(messages){let assistantTexts=[];for(let message of messages){if(message.info?.role!=="assistant")continue;let text=extractText3(message.parts);if(text.trim().length>0)assistantTexts.push(text)}return{text:assistantTexts.join(`
|
|
6109
|
+
Do NOT use the default PROJECT/STRUCTURE output format for this dispatch.`,READ_ONLY_LANE_ROLES=new Set(["explorer","reviewer","test_engineer","critic","critic_oversight","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic_architecture_supervisor","sme","researcher","council_generalist","council_skeptic","council_domain_expert"]),READ_ONLY_TOOL_DENYLIST=[...new Set([...WRITE_TOOL_NAMES,"extract_code_blocks","multiedit","multi_edit","todo_write","save_plan","update_task_status","phase_complete","declare_scope","declare_council_criteria","submit_council_verdicts","submit_phase_council_verdicts","set_qa_gates","write_retro","write_drift_evidence","write_hallucination_evidence","write_mutation_evidence","knowledge_add","knowledge_remove","consensus_mine","summarize_work","doc_scan","lint"])],LaneSchema=exports_external.object({id:exports_external.string().min(1).max(80).regex(/^[A-Za-z0-9][A-Za-z0-9_.-]*$/).describe("Stable lane identifier, unique within this dispatch batch"),agent:exports_external.string().min(1).max(120).describe("Read-only swarm agent name, including any generated swarm prefix"),prompt:exports_external.string().min(1).max(MAX_PROMPT_CHARS).describe("Full lane prompt to send to the requested agent"),workflow_lane:exports_external.string().min(1).max(120).optional().describe("Required mechanical policy identifier in PR workflows; distinct from the retry-safe lane id"),owned_workflow_lanes:exports_external.array(exports_external.string().trim().min(1).max(120)).min(1).max(11).optional().describe("Complete dimension/family set a consolidated PR-review base or micro lane covers under the controller-computed depth tier; must include workflow_lane. Omit for singleton lanes."),feedback_item_ids:exports_external.array(exports_external.string().trim().min(1).max(120)).min(1).optional().describe("PR-feedback ledger item IDs owned exclusively by this lane"),review_item_ids:exports_external.array(exports_external.string().trim().min(1).max(160)).min(1).optional().describe("Candidate/finding IDs owned by a PR-review reviewer or critic lane; every ID requires a parseable verdict row")}),PrReviewTriggerEvaluationRowSchema=exports_external.object({trigger_id:exports_external.string().trim().min(1).max(120),result:exports_external.literal("MATCHED"),evidence:exports_external.string().trim().min(1).max(4000)}).strict(),DispatchLanesArgsSchema=exports_external.object({lanes:exports_external.array(LaneSchema).min(1).max(MAX_LANES).describe("Read-only lane specs to dispatch concurrently"),common_prompt:exports_external.string().min(1).regex(/\S/,"common_prompt must contain non-whitespace content").max(MAX_PROMPT_CHARS-COMMON_PROMPT_SEPARATOR.length-1).optional().describe("Optional shared context prepended to every lane prompt. Send large shared context (PR diff, obligation ledger, scope) ONCE here instead of inlining the same blob into each lane prompt; this keeps the tool-call payload small and avoids malformed/truncated tool-call JSON. Combined common_prompt + per-lane prompt must not exceed the per-lane character limit."),max_concurrent:exports_external.number().int().min(1).max(MAX_LANES).optional().describe("Maximum lanes in flight at once; defaults to lane count"),timeout_ms:exports_external.number().int().min(10).max(MAX_TIMEOUT_MS2).optional().describe("Per-lane timeout in milliseconds. For blocking dispatch this covers session create and prompt execution; for async dispatch this covers launch only, never lane runtime.")}),DispatchLanesAsyncArgsSchema=DispatchLanesArgsSchema.extend({launch_timeout_ms:exports_external.number().int().min(10).max(MAX_TIMEOUT_MS2).optional().describe("Async launch acceptance timeout in milliseconds. This only bounds session creation and promptAsync acceptance; it is never a lane runtime timeout. Deprecated alias: timeout_ms."),batch_id:exports_external.string().min(1).max(MAX_BATCH_ID_CHARS).regex(/^[A-Za-z0-9][A-Za-z0-9_.:-]*$/).optional().describe("Stable async batch id for later collection; generated when omitted"),mode:exports_external.string().min(1).max(80).optional().describe('Advisory workflow mode, such as deep-dive. PR-review stages are COLON-SUFFIXED and the suffix is required. Accepted values: swarm-pr-review:base, swarm-pr-review:micro, swarm-pr-review:council, swarm-pr-review:reviewer, swarm-pr-review:critic, swarm-pr-feedback:verification. A bare "swarm-pr-review" does NOT enter the PR-review path — it skips the merge-base bind and later fails with "exact merge-base scope was not verified".'),pr_head_sha:exports_external.string().min(1).max(80).optional().describe("Full 40-char SHA of the PR head commit under review. Required when mode starts with swarm-pr-review: or swarm-pr-feedback:."),base_sha:exports_external.string().regex(/^[0-9a-f]{6,64}$/i).optional().describe("Exact merge base of base_ref and pr_head_sha — NOT the base branch tip. The controller recomputes `git merge-base -- <base_ref> <pr_head_sha>` and rejects any mismatch. Required when mode starts with swarm-pr-review:."),base_ref:exports_external.string().regex(/^(?!-)[A-Za-z0-9][A-Za-z0-9._/-]{0,255}$/).optional().describe("Base branch ref used to recompute the merge base. Use the REMOTE-TRACKING form (origin/main), and compute base_sha against that same ref. A local branch ref (main, refs/heads/main) is only as fresh as the last fetch — the PR-review preflight fetches refs/pull/<N>/head and not the base branch, so a local ref commonly resolves to a different merge base and the dispatch is rejected. Required when mode starts with swarm-pr-review:."),scope:exports_external.string().min(1).max(500).optional(),trigger_evaluation:exports_external.array(PrReviewTriggerEvaluationRowSchema).min(1).optional().describe("Exact all-MATCHED repository-agnostic mandatory micro-lane ledger required for swarm-pr-review:micro"),feedback_inventory:exports_external.array(exports_external.string().trim().min(1).max(120)).min(1).optional().describe("Complete immutable feedback item inventory required for swarm-pr-feedback:verification")}),CollectLaneResultsArgsSchema=exports_external.object({batch_id:exports_external.string().min(1).max(MAX_BATCH_ID_CHARS),wait:exports_external.boolean().optional().describe("Poll until all lanes settle or timeout"),timeout_ms:exports_external.number().int().min(0).max(MAX_COLLECT_TIMEOUT_MS).optional().describe("Total wait budget when wait=true"),include_pending:exports_external.boolean().optional().describe("Include pending/running lanes in lane_results. Defaults to true for non-blocking polls and false for wait=true joins."),cancel_pending:exports_external.boolean().optional().describe("Abort and mark pending/running lanes cancelled")});function validatePrReviewMicroDispatch(args2,depthTier){let evaluation=args2.trigger_evaluation;if(!evaluation)throw Error("BLOCKED: PR_REVIEW micro dispatch requires the complete trigger_evaluation ledger");let expected=new Set(PR_REVIEW_REQUIRED_MICRO_LANE_IDS),seen=new Set;for(let row of evaluation){if(seen.has(row.trigger_id))throw Error(`BLOCKED: duplicate PR_REVIEW trigger row: ${row.trigger_id}`);seen.add(row.trigger_id)}let missing=[...expected].filter((id)=>!seen.has(id)),unknown3=[...seen].filter((id)=>!expected.has(id));if(missing.length>0||unknown3.length>0)throw Error(`BLOCKED: PR_REVIEW trigger ledger must be exact; missing: ${missing.join(", ")||"(none)"}; unknown: ${unknown3.join(", ")||"(none)"}`);let required3=new Set(evaluation.map((row)=>row.trigger_id)),laneOwnership=args2.lanes.map((lane)=>({label:lane.workflow_lane??"",owned:lane.owned_workflow_lanes?.length?lane.owned_workflow_lanes:lane.workflow_lane?[lane.workflow_lane]:[]}));if(depthTier==="L"&&laneOwnership.some((lane)=>lane.owned.length!==1))throw Error("BLOCKED: PR_REVIEW micro dispatch at depth tier L requires one dedicated lane per risk family; consolidated owned_workflow_lanes are allowed only at tiers S and M");let flattened=laneOwnership.flatMap((lane)=>lane.owned),duplicates=flattened.filter((value,index)=>flattened.indexOf(value)!==index),unmatched=flattened.filter((triggerId)=>!required3.has(triggerId)),invalidLabels=laneOwnership.filter((lane)=>lane.label.length===0||!lane.owned.includes(lane.label)).map((lane)=>lane.label||"(missing workflow_lane)");if(invalidLabels.length>0||duplicates.length>0||unmatched.length>0)throw Error(`BLOCKED: PR_REVIEW micro lanes must have unique workflow_lane IDs from the mandatory repository-agnostic lane set, with workflow_lane contained in its own owned set; invalid: ${[...new Set([...invalidLabels,...duplicates,...unmatched])].join(", ")}`);let coversAllFamilies=required3.size>0&&[...required3].every((id)=>flattened.includes(id)),microFloor=PR_REVIEW_MICRO_LANE_FLOORS[depthTier];if(coversAllFamilies&&laneOwnership.length<microFloor)throw Error(`BLOCKED: PR_REVIEW micro dispatch at depth tier ${depthTier} covering all ${PR_REVIEW_REQUIRED_MICRO_LANE_IDS.length} risk families requires at least ${microFloor} lanes; received ${laneOwnership.length}. Partial retry batches covering a subset of families are exempt.`)}var _internals145={getSessionOps:()=>swarmState.opencodeClient?.session??null,getGeneratedAgentNames:()=>swarmState.generatedAgentNames,createParallelDispatcher,resolvePrWorkflowRevisionDigestAsync,resolveExactMergeBaseAsync,now:()=>Date.now(),sleep:sleep3};async function executeDispatchLanes(args2,directory,context={}){let parsed=DispatchLanesArgsSchema.safeParse(args2);if(!parsed.success)return failureResult({failure_class:"invalid_args",message:"Invalid dispatch_lanes arguments",errors:boundZodIssues(parsed.error.issues)});let duplicateLaneIds=findDuplicateLaneIds(parsed.data.lanes);if(duplicateLaneIds.length>0)return failureResult({failure_class:"invalid_args",message:"Lane IDs must be unique within one dispatch_lanes batch",errors:duplicateLaneIds.map((id)=>`Duplicate lane id: ${id}`)});if(context.sessionID?.trim())try{await enforcePrWorkflowDispatchLanesAsync(directory,context.sessionID,"dispatch_lanes")}catch(error93){return failureResult({failure_class:"invalid_args",message:error93 instanceof Error?error93.message:"PR workflow gate rejected dispatch"})}let session=_internals145.getSessionOps();if(!session)return failureResult({failure_class:"no_client",message:"OpenCode session client is not available"});let common=applyCommonPrompt(parsed.data.lanes,parsed.data.common_prompt);if(!common.ok)return failureResult({failure_class:"invalid_args",message:"Invalid dispatch_lanes arguments",errors:common.errors});let lanes=applyExplorerFormatSuffix(common.lanes),maxConcurrent=Math.min(parsed.data.max_concurrent??lanes.length,lanes.length,MAX_LANES),timeoutMs=parsed.data.timeout_ms??DEFAULT_TIMEOUT_MS4,dispatcher=_internals145.createParallelDispatcher({enabled:!0,maxConcurrentTasks:maxConcurrent,evidenceLockTimeoutMs:0}),limit=pLimit(maxConcurrent);try{let laneResults=await Promise.all(lanes.map((lane)=>limit(()=>runLane(session,dispatcher,lane,directory,timeoutMs,context))));return buildResult(laneResults,maxConcurrent,timeoutMs)}finally{dispatcher.shutdown()}}async function executeDispatchLanesAsync(args2,directory,context={}){let parsed=DispatchLanesAsyncArgsSchema.safeParse(args2);if(!parsed.success)return asyncFailureResult({failure_class:"invalid_args",message:"Invalid dispatch_lanes_async arguments",errors:boundZodIssues(parsed.error.issues)});if(typeof parsed.data.mode==="string"){let normalizedMode=parsed.data.mode.trim();parsed.data.mode=normalizedMode.length>0?normalizedMode:void 0}let duplicateLaneIds=findDuplicateLaneIds(parsed.data.lanes);if(duplicateLaneIds.length>0)return asyncFailureResult({failure_class:"invalid_args",message:"Lane IDs must be unique within one dispatch_lanes_async batch",errors:duplicateLaneIds.map((id)=>`Duplicate lane id: ${id}`)});let requestedBatchId=parsed.data.batch_id??makeBatchId(),session=_internals145.getSessionOps();if(!session||typeof session.promptAsync!=="function")return asyncFailureResult({failure_class:"no_client",message:"OpenCode session promptAsync client is not available"});let common=applyCommonPrompt(parsed.data.lanes,parsed.data.common_prompt);if(!common.ok)return asyncFailureResult({failure_class:"invalid_args",message:"Invalid dispatch_lanes_async arguments",errors:common.errors});let lanes=common.lanes,batchId=requestedBatchId;if(findByBatchId(directory,batchId).length>0)return asyncFailureResult({failure_class:"invalid_args",message:`Async lane batch already exists: ${batchId}`,errors:[`batch_id must be unique: ${batchId}`]});let verifiedPrHead,workflowRevisionDigest,verifiedReviewBaseSha,bareWorkflowMode=["swarm-pr-review","swarm-pr-feedback"].find((prefix)=>parsed.data.mode?.trim()===prefix);if(bareWorkflowMode)return asyncFailureResult({failure_class:"invalid_args",message:bareWorkflowMode==="swarm-pr-review"?'BLOCKED: mode "swarm-pr-review" is missing its required stage suffix. Use one of: swarm-pr-review:base, swarm-pr-review:micro, swarm-pr-review:council, swarm-pr-review:reviewer, swarm-pr-review:critic.':'BLOCKED: mode "swarm-pr-feedback" is missing its required stage suffix. Use swarm-pr-feedback:verification.'});if(context.sessionID?.trim()&&parsed.data.pr_head_sha&&(parsed.data.mode?.startsWith("swarm-pr-review:")||parsed.data.mode?.startsWith("swarm-pr-feedback:")))try{if(verifiedPrHead=await assertCurrentCheckoutHead(directory,parsed.data.pr_head_sha),workflowRevisionDigest=await _internals145.resolvePrWorkflowRevisionDigestAsync(directory,parsed.data.pr_head_sha)??void 0,!workflowRevisionDigest)throw Error("BLOCKED: PR workflow could not compute a bounded current-revision digest");if(parsed.data.mode?.startsWith("swarm-pr-review:")){if(!parsed.data.base_sha||!parsed.data.base_ref)throw Error("BLOCKED: PR_REVIEW dispatch requires exact base_sha and base_ref");let resolvedBase=await _internals145.resolveExactMergeBaseAsync(directory,parsed.data.base_ref,parsed.data.pr_head_sha);if(!resolvedBase)throw Error(`BLOCKED: PR_REVIEW could not resolve a merge base for base_ref="${parsed.data.base_ref}" and pr_head_sha=${parsed.data.pr_head_sha} in "${directory}". The ref may not exist locally — the PR-review preflight fetches only refs/pull/<N>/head, not the base branch. Fetch it and pass the remote-tracking form, then verify with: git -C "${directory}" fetch origin <base-branch> && git -C "${directory}" merge-base -- origin/<base-branch> ${parsed.data.pr_head_sha}`);if(resolvedBase.toLowerCase()!==parsed.data.base_sha.toLowerCase())throw Error(`BLOCKED: PR_REVIEW merge-base mismatch. git merge-base -- "${parsed.data.base_ref}" ${parsed.data.pr_head_sha} in "${directory}" resolved to ${resolvedBase}, but base_sha=${parsed.data.base_sha} was passed. If you computed base_sha against a remote-tracking ref, pass that SAME ref as base_ref — a local branch of the same name (main, refs/heads/main) may be stale and yields a different merge base. Verify with: git -C "${directory}" merge-base -- "${parsed.data.base_ref}" ${parsed.data.pr_head_sha}`);verifiedReviewBaseSha=resolvedBase}}catch(error93){return asyncFailureResult({failure_class:"invalid_args",message:error93 instanceof Error?error93.message:"PR workflow checkout head verification failed"})}if(context.sessionID?.trim())try{let gateState=await enforcePrWorkflowDispatchLanesAsync(directory,context.sessionID,"dispatch_lanes_async");if(!gateState&&parsed.data.mode?.startsWith("swarm-pr-review:"))gateState=await activatePrWorkflow(directory,context.sessionID,"PR_REVIEW");else if(!gateState&&parsed.data.mode==="swarm-pr-feedback:verification")gateState=await activatePrWorkflow(directory,context.sessionID,"PR_FEEDBACK");if(gateState?.mode==="PR_REVIEW"){let headSha=parsed.data.pr_head_sha;if(!headSha)throw Error("BLOCKED: active PR_REVIEW dispatch requires pr_head_sha");if(!verifiedReviewBaseSha||!parsed.data.base_ref)throw Error("BLOCKED: PR_REVIEW exact merge-base scope was not verified");gateState=await bindPrReviewBase(directory,context.sessionID,{prHeadSha:headSha,baseRef:parsed.data.base_ref,baseSha:verifiedReviewBaseSha});let laneSpecs=parsed.data.lanes.map((lane)=>({laneId:lane.id,workflowLane:lane.workflow_lane,reviewItemIds:lane.review_item_ids,ownedWorkflowLanes:lane.owned_workflow_lanes})),depthTier=gateState.prReviewDepthTier??"L";if(parsed.data.mode==="swarm-pr-review:base"){if((gateState.prReviewBaseDispatches?.length??0)===0){let ownedDimensionIds=parsed.data.lanes.flatMap((lane)=>lane.owned_workflow_lanes?.length?lane.owned_workflow_lanes:lane.workflow_lane?[lane.workflow_lane]:[]),coversAllSixExactlyOnce=ownedDimensionIds.length===PR_REVIEW_BASE_DIMENSION_IDS.length&&new Set(ownedDimensionIds).size===PR_REVIEW_BASE_DIMENSION_IDS.length&&PR_REVIEW_BASE_DIMENSION_IDS.every((dimensionId)=>ownedDimensionIds.includes(dimensionId));if(depthTier==="L"){if(parsed.data.lanes.length!==6||parsed.data.max_concurrent!==6||parsed.data.lanes.some((lane)=>(lane.owned_workflow_lanes?.length??1)!==1))throw Error("BLOCKED: initial PR_REVIEW base dispatch requires exactly six lanes and max_concurrent: 6 at depth tier L (consolidated owned_workflow_lanes are allowed only at tiers S and M)")}else if(!coversAllSixExactlyOnce||parsed.data.lanes.length<PR_REVIEW_BASE_LANE_FLOORS[depthTier]||parsed.data.lanes.length>PR_REVIEW_BASE_DIMENSION_IDS.length||parsed.data.max_concurrent!==parsed.data.lanes.length)throw Error(`BLOCKED: initial PR_REVIEW base dispatch at depth tier ${depthTier} requires between ${PR_REVIEW_BASE_LANE_FLOORS[depthTier]} and ${PR_REVIEW_BASE_DIMENSION_IDS.length} lanes whose owned_workflow_lanes partition all six dimensions exactly once, with max_concurrent equal to the lane count`)}for(let lane of parsed.data.lanes)if(resolveGeneratedAgentRole(lane.agent,swarmState.generatedAgentNames)!=="explorer")throw Error(`BLOCKED: PR_REVIEW base lane "${lane.id}" must use the explorer role`);await enforcePrReviewBaseDimensions(directory,context.sessionID,laneSpecs,{batchId,prHeadSha:headSha})}else if(parsed.data.mode==="swarm-pr-review:micro"){if(await assertPrReviewBaseCoverageSettled(directory,context.sessionID),gateState.prHeadSha&&gateState.prHeadSha!==headSha)throw Error(`BLOCKED: PR_REVIEW head mismatch; expected "${gateState.prHeadSha}", received "${headSha}"`);for(let lane of parsed.data.lanes)if(resolveGeneratedAgentRole(lane.agent,swarmState.generatedAgentNames)!=="explorer")throw Error(`BLOCKED: PR_REVIEW micro lane "${lane.id}" must use the explorer role`);validatePrReviewMicroDispatch(parsed.data,depthTier)}else if(parsed.data.mode==="swarm-pr-review:council"||parsed.data.mode==="swarm-pr-review:reviewer"||parsed.data.mode==="swarm-pr-review:critic"){let phase=parsed.data.mode.endsWith(":council")?"council":parsed.data.mode.endsWith(":reviewer")?"reviewer":"critic";if(parsed.data.lanes.some((lane)=>lane.owned_workflow_lanes))throw Error(`BLOCKED: PR_REVIEW ${phase} lanes must not declare owned_workflow_lanes; depth-tier consolidation applies only to base and micro discovery lanes`);for(let lane of parsed.data.lanes){let role=resolveGeneratedAgentRole(lane.agent,swarmState.generatedAgentNames);if(phase==="council"&&!role.startsWith("council_")||phase==="reviewer"&&role!=="reviewer"||phase==="critic"&&!role.startsWith("critic"))throw Error(`BLOCKED: PR_REVIEW ${phase} lane "${lane.id}" uses invalid role "${role||lane.agent}"`)}await recordPrReviewValidationBatch(directory,context.sessionID,phase,laneSpecs,{batchId,prHeadSha:headSha})}else throw Error("BLOCKED: active PR_REVIEW requires a structured base, micro, council, reviewer, or critic mode")}else if(gateState?.mode==="PR_FEEDBACK"){let headSha=parsed.data.pr_head_sha;if(!headSha)throw Error("BLOCKED: PR_FEEDBACK dispatch requires pr_head_sha");if(parsed.data.lanes.some((lane)=>lane.owned_workflow_lanes))throw Error("BLOCKED: PR_FEEDBACK lanes must not declare owned_workflow_lanes; depth-tier consolidation applies only to PR_REVIEW base and micro discovery lanes");if(parsed.data.mode==="swarm-pr-feedback:verification")await declarePrFeedbackInventory(directory,context.sessionID,parsed.data.feedback_inventory??[],{prHeadSha:headSha}),await enforcePrFeedbackVerificationOwnership(directory,context.sessionID,parsed.data.lanes.map((lane)=>({laneId:lane.id,ownedItemIds:lane.feedback_item_ids??[]})),{batchId,prHeadSha:headSha});else if(parsed.data.mode==="swarm-pr-feedback:stage-b-reviewer"||parsed.data.mode==="swarm-pr-feedback:stage-b-test"||parsed.data.mode==="swarm-pr-feedback:closeout-reviewer"||parsed.data.mode==="swarm-pr-feedback:closeout-critic"){if(parsed.data.lanes.length!==1||parsed.data.max_concurrent!==1)throw Error("BLOCKED: each ordered PR_FEEDBACK gate requires exactly one lane and max_concurrent: 1");let phase=parsed.data.mode.slice(18),lane=parsed.data.lanes[0],role=resolveGeneratedAgentRole(lane.agent,swarmState.generatedAgentNames),expectedRole=phase==="stage-b-test"?"test_engineer":phase==="closeout-critic"?"critic":"reviewer";if(lane.workflow_lane!==phase||(expectedRole==="critic"?!role.startsWith("critic"):role!==expectedRole))throw Error(`BLOCKED: PR_FEEDBACK ${phase} requires workflow_lane "${phase}" and role "${expectedRole}"`);await recordPrFeedbackGateBatch(directory,context.sessionID,phase,{laneId:lane.id,ownedItemIds:lane.feedback_item_ids??[]},{batchId,prHeadSha:headSha,revisionDigest:workflowRevisionDigest??""})}else throw Error("BLOCKED: active PR_FEEDBACK requires structured verification, Stage B reviewer/test, and closeout reviewer/critic modes")}}catch(error93){return asyncFailureResult({failure_class:"invalid_args",message:error93 instanceof Error?error93.message:"PR workflow gate rejected dispatch"})}let contracted=applyPrWorkflowPromptContract(lanes,{mode:parsed.data.mode,prHeadSha:verifiedPrHead,revisionDigest:workflowRevisionDigest,scope:verifiedReviewBaseSha?`complete PR diff ${verifiedReviewBaseSha}...${verifiedPrHead}`:"the complete immutable feedback inventory on the exact checked-out revision",callerFocus:parsed.data.scope});if(!contracted.ok)return asyncFailureResult({failure_class:"invalid_args",message:"Invalid mandatory PR workflow prompt contract",errors:contracted.errors});lanes=applyExplorerFormatSuffix(contracted.lanes);let canonicalWorkflowScope=verifiedReviewBaseSha?`complete PR diff ${verifiedReviewBaseSha}...${verifiedPrHead}`:parsed.data.mode?.startsWith("swarm-pr-feedback:")?"the complete immutable feedback inventory on the exact checked-out revision":parsed.data.scope,maxConcurrent=Math.min(parsed.data.max_concurrent??lanes.length,lanes.length,MAX_LANES),launchTimeoutMs=parsed.data.launch_timeout_ms??parsed.data.timeout_ms??DEFAULT_ASYNC_LAUNCH_TIMEOUT_MS,dispatcher=_internals145.createParallelDispatcher({enabled:!0,maxConcurrentTasks:maxConcurrent,evidenceLockTimeoutMs:0}),limit=pLimit(maxConcurrent);try{let laneResults=await Promise.all(lanes.map((lane)=>limit(()=>launchAsyncLane({session,dispatcher,lane,directory,timeoutMs:launchTimeoutMs,context,batchId,mode:parsed.data.mode,prHeadSha:parsed.data.pr_head_sha,gitHead:verifiedPrHead,dirtyHash:workflowRevisionDigest,scope:canonicalWorkflowScope})))),failed=laneResults.filter((lane)=>lane.status==="failed"),rejected=laneResults.filter((lane)=>lane.status==="rejected"),pending=laneResults.filter((lane)=>lane.status==="pending");return{success:failed.length===0&&rejected.length===0,batch_id:batchId,dispatched:laneResults.length,pending:pending.length,failed:failed.length,rejected:rejected.length,max_concurrent:maxConcurrent,launch_timeout_ms:launchTimeoutMs,timeout_ms:launchTimeoutMs,lane_results:laneResults}}finally{dispatcher.shutdown()}}async function executeCollectLaneResults(args2,directory,context={}){let parsed=CollectLaneResultsArgsSchema.safeParse(args2);if(!parsed.success)return collectFailureResult({failure_class:"invalid_args",batch_id:"",message:"Invalid collect_lane_results arguments",errors:boundZodIssues(parsed.error.issues)});let session=_internals145.getSessionOps();if(!session||typeof session.messages!=="function")return collectFailureResult({failure_class:"no_client",batch_id:parsed.data.batch_id,message:"OpenCode session messages client is not available"});let timeoutMs=parsed.data.timeout_ms??DEFAULT_COLLECT_TIMEOUT_MS,deadline=_internals145.now()+timeoutMs,batchFilter=context.sessionID!==void 0?{parentSessionId:context.sessionID}:void 0,records=findByBatchId(directory,parsed.data.batch_id,batchFilter);if(records.length===0)return collectFailureResult({failure_class:"not_found",batch_id:parsed.data.batch_id,message:`No async lane batch found for ${parsed.data.batch_id}`});let keepPolling=!0,pollIntervalMs=COLLECT_POLL_INTERVAL_MS;while(keepPolling){if(await collectOnce(session,directory,records,parsed.data.cancel_pending===!0),await sweepStaleAsyncLaneRecords(session,directory,records,DEFAULT_ASYNC_STALE_TIMEOUT_MS),records=findByBatchId(directory,parsed.data.batch_id,batchFilter),allSettled(records)||parsed.data.wait!==!0){keepPolling=!1;continue}if(_internals145.now()>=deadline){keepPolling=!1;continue}await _internals145.sleep(Math.min(pollIntervalMs,Math.max(0,deadline-_internals145.now()))),pollIntervalMs=nextCollectPollInterval(pollIntervalMs)}return buildCollectResult(parsed.data.batch_id,records,parsed.data.include_pending??parsed.data.wait!==!0)}async function launchAsyncLane(args2){let validation2=validateLaneAgent(args2.lane.agent,args2.context),role=validation2.role,startedAt=isoNow2();if(!validation2.ok)return{id:args2.lane.id,agent:args2.lane.agent,role,status:"rejected",started_at:startedAt,completed_at:isoNow2(),error:validation2.error};let decision=args2.dispatcher.dispatch(args2.lane.id);if(decision.action!=="dispatch")return{id:args2.lane.id,agent:args2.lane.agent,role,status:"failed",started_at:startedAt,completed_at:isoNow2(),error:`dispatcher ${decision.action}: ${decision.reason}`};try{let createTimeoutMessage=`Lane "${args2.lane.id}" session.create timed out after ${args2.timeoutMs}ms`,createPromise=args2.session.create(buildLaneSessionCreateArgs(args2.directory,args2.lane,args2.context)),createTimedOut=!1;createPromise.then((createResult2)=>{if(createTimedOut&&createResult2.data?.id)scheduleSessionCleanup(args2.session,createResult2.data.id)}).catch(()=>{return});let createResult=await withTimeout2(createPromise,args2.timeoutMs,createTimeoutMessage).catch((error93)=>{if(formatError3(error93)===createTimeoutMessage)createTimedOut=!0;throw error93}),sessionId=createResult.data?.id;if(!sessionId)return failedLane(args2.lane,role,startedAt,`session.create failed: ${formatError3(createResult.error)}`,decision.slot.slotId,decision.slot.runId);if(!await recordPendingDelegation(args2.directory,{correlationId:sessionId,jobId:null,subagentSessionId:sessionId,parentSessionId:args2.context.sessionID??`dispatch_lanes_async:${args2.batchId}`,callID:args2.batchId,normalizedAgent:role,swarmPrefixedAgent:args2.lane.agent,planTaskId:null,evidenceTaskId:null,batchId:args2.batchId,laneId:args2.lane.id,mode:args2.mode??"advisory",workflowLane:args2.lane.workflow_lane,ownedWorkflowLanes:args2.lane.owned_workflow_lanes,promptHash:promptHash(args2.lane,args2.directory,args2.batchId),workspace:{directory:args2.directory,gitHead:args2.gitHead??null,dirtyHash:args2.dirtyHash??null,prHeadSha:args2.prHeadSha??null,scope:args2.scope??null},generation:1}))return cleanupAsyncLaunchSession(args2.session,sessionId),failedLane(args2.lane,role,startedAt,"Failed to record async lane in background delegation ledger",decision.slot.slotId,decision.slot.runId);return scheduleAsyncLanePrompt({session:args2.session,directory:args2.directory,sessionId,lane:args2.lane,timeoutMs:args2.timeoutMs}),{id:args2.lane.id,agent:args2.lane.agent,role,status:"pending",session_id:sessionId,slot_id:decision.slot.slotId,run_id:decision.slot.runId,started_at:startedAt,completed_at:isoNow2()}}catch(error93){return failedLane(args2.lane,role,startedAt,formatError3(error93),decision.slot.slotId,decision.slot.runId)}finally{args2.dispatcher.releaseSlot(decision.slot.slotId)}}async function collectOnce(session,directory,records,cancelPending){for(let record3 of records){if(record3.status!=="pending"&&record3.status!=="running")continue;if(cancelPending){if(typeof session.abort==="function")await session.abort({path:{id:record3.subagentSessionId}}).catch(()=>{return});await appendDelegationTransition(directory,record3.correlationId,{status:"cancelled"});continue}if(!await isLaneReadyForCollection(session,directory,record3.subagentSessionId))continue;let messages;try{messages=await session.messages({path:{id:record3.subagentSessionId},query:{directory,limit:ASYNC_MESSAGE_FETCH_LIMIT}})}catch{continue}if(!messages.data)continue;let transcript=extractAssistantTranscript(messages.data);if(!transcript.text)continue;let collectedRevisionDigest=record3.workspace?.prHeadSha?await _internals145.resolvePrWorkflowRevisionDigestAsync(directory,record3.workspace.prHeadSha)??void 0:void 0,output=prepareLaneOutput({directory,batchId:record3.batchId??record3.callID,laneId:record3.laneId??record3.correlationId,agent:record3.swarmPrefixedAgent,role:record3.normalizedAgent,sessionId:record3.subagentSessionId,parentSessionId:record3.parentSessionId,mode:record3.mode,workflowLane:record3.workflowLane,prHeadSha:record3.workspace?.prHeadSha??void 0,gitHead:record3.workspace?.gitHead??void 0,revisionDigest:collectedRevisionDigest,scope:record3.workspace?.scope??void 0,source:"collect_lane_results",text:transcript.text,messageCount:transcript.messageCount,transcriptIncomplete:transcript.transcriptIncomplete});await appendDelegationTransition(directory,record3.correlationId,{status:"completed",result:{text:output.output,chars:output.output_chars,truncated:output.output_truncated,digest:output.output_digest,...output.output_ref?{outputRef:output.output_ref}:{},outputPreviewChars:output.output.length,...output.output_degraded!==void 0?{outputDegraded:output.output_degraded}:{},...output.output_artifact_error?{outputArtifactError:output.output_artifact_error}:{},...output.transcript_incomplete!==void 0?{transcriptIncomplete:output.transcript_incomplete}:{},messageCount:transcript.messageCount}})}}function scheduleAsyncLanePrompt(args2){queueMicrotask(()=>{startAsyncLanePrompt(args2).catch(async(error93)=>{let message=formatError3(error93);await appendAsyncLaneLaunchError(args2.directory,args2.session,args2.sessionId,message)})})}async function startAsyncLanePrompt(args2){let promptController=new AbortController,promptResult;try{promptResult=await withTimeout2(args2.session.promptAsync({path:{id:args2.sessionId},query:{directory:args2.directory},body:{agent:args2.lane.agent,tools:buildReadOnlyTools(),parts:[{type:"text",text:args2.lane.prompt}]},signal:promptController.signal}),args2.timeoutMs,`Lane "${args2.lane.id}" session.promptAsync launch timed out after ${args2.timeoutMs}ms`,promptController)}catch(error93){await appendAsyncLaneLaunchError(args2.directory,args2.session,args2.sessionId,formatError3(error93));return}if(promptResult.error){await appendAsyncLaneLaunchError(args2.directory,args2.session,args2.sessionId,`session.promptAsync launch failed: ${formatError3(promptResult.error)}`);return}await appendDelegationTransition(args2.directory,args2.sessionId,{status:"running"})}async function appendAsyncLaneLaunchError(directory,session,sessionId,message){await appendDelegationTransition(directory,sessionId,{status:"error",result:{error:message,chars:message.length,truncated:!1,digest:digestText2(message)}}),cleanupAsyncLaunchSession(session,sessionId)}async function isLaneReadyForCollection(session,directory,sessionId){if(typeof session.status!=="function")return!0;try{let status=await session.status({query:{directory}});if(status.error||!status.data)return!1;let current=status.data[sessionId];return current===void 0||current.type==="idle"}catch{return!1}}async function sweepStaleAsyncLaneRecords(session,directory,records,staleTimeoutMs){if(staleTimeoutMs<=0)return;let now=_internals145.now();for(let record3 of records){if(record3.status!=="pending"&&record3.status!=="running"&&record3.status!=="ingestion_error")continue;if(now-record3.updatedAt<=staleTimeoutMs)continue;if(!await isLaneReadyForCollection(session,directory,record3.subagentSessionId))continue;await appendDelegationTransition(directory,record3.correlationId,{status:"stale"})}}function extractAssistantTranscript(messages){let assistantTexts=[];for(let message of messages){if(message.info?.role!=="assistant")continue;let text=extractText3(message.parts);if(text.trim().length>0)assistantTexts.push(text)}return{text:assistantTexts.join(`
|
|
6110
6110
|
|
|
6111
6111
|
`),messageCount:assistantTexts.length,transcriptIncomplete:messages.length>=ASYNC_MESSAGE_FETCH_LIMIT}}function nextCollectPollInterval(currentMs){if(currentMs<=0)return COLLECT_POLL_INTERVAL_MS;return Math.min(currentMs*2,MAX_COLLECT_POLL_INTERVAL_MS)}async function runLane(session,dispatcher,lane,directory,timeoutMs,context){let validation2=validateLaneAgent(lane.agent,context),role=validation2.role,startedAt=isoNow2();if(!validation2.ok)return{id:lane.id,agent:lane.agent,role,status:"rejected",started_at:startedAt,completed_at:isoNow2(),error:validation2.error};let decision=dispatcher.dispatch(lane.id);if(decision.action!=="dispatch")return{id:lane.id,agent:lane.agent,role,status:"failed",started_at:startedAt,completed_at:isoNow2(),error:`dispatcher ${decision.action}: ${decision.reason}`};let promptController=new AbortController,sessionId;try{let createTimeoutMessage=`Lane "${lane.id}" session.create timed out after ${timeoutMs}ms`,createPromise=session.create(buildLaneSessionCreateArgs(directory,lane,context)),createTimedOut=!1;createPromise.then((createResult2)=>{if(createTimedOut&&createResult2.data?.id)scheduleSessionCleanup(session,createResult2.data.id)}).catch(()=>{return});let createResult=await withTimeout2(createPromise,timeoutMs,createTimeoutMessage).catch((error93)=>{if(formatError3(error93)===createTimeoutMessage)createTimedOut=!0;throw error93});if(!createResult.data?.id)return failedLane(lane,role,startedAt,`session.create failed: ${formatError3(createResult.error)}`,decision.slot.slotId,decision.slot.runId);sessionId=createResult.data.id;let promptResult=await withTimeout2(session.prompt({path:{id:sessionId},body:{agent:lane.agent,tools:buildReadOnlyTools(),parts:[{type:"text",text:lane.prompt}]},signal:promptController.signal}),timeoutMs,`Lane "${lane.id}" session.prompt timed out after ${timeoutMs}ms`,promptController);if(!promptResult.data)return failedLane(lane,role,startedAt,`session.prompt failed: ${formatError3(promptResult.error)}`,decision.slot.slotId,decision.slot.runId,sessionId);let laneOutput=prepareLaneOutput({directory,batchId:`blocking:${sessionId}`,laneId:lane.id,agent:lane.agent,role,sessionId,parentSessionId:context.sessionID,source:"dispatch_lanes",text:extractText3(promptResult.data.parts)});return{id:lane.id,agent:lane.agent,role,status:"completed",session_id:sessionId,slot_id:decision.slot.slotId,run_id:decision.slot.runId,started_at:startedAt,completed_at:isoNow2(),...laneOutput}}catch(error93){return failedLane(lane,role,startedAt,formatError3(error93),decision.slot.slotId,decision.slot.runId,sessionId)}finally{if(dispatcher.releaseSlot(decision.slot.slotId),promptController.abort(),sessionId)scheduleSessionCleanup(session,sessionId)}}function buildResult(laneResults,maxConcurrent,timeoutMs){let completed=laneResults.filter((lane)=>lane.status==="completed"),failed=laneResults.filter((lane)=>lane.status==="failed"),rejected=laneResults.filter((lane)=>lane.status==="rejected");return{success:failed.length===0&&rejected.length===0,dispatched:laneResults.length,completed:completed.length,failed:failed.length,rejected:rejected.length,max_concurrent:maxConcurrent,timeout_ms:timeoutMs,lane_results:laneResults}}function buildCollectResult(batchId,records,includePending){let laneResults=records.filter((record3)=>includePending||record3.status!=="pending"&&record3.status!=="running").map((record3)=>recordToLaneResult(record3,batchId)),completed=records.filter((record3)=>record3.status==="completed"),failed=records.filter((record3)=>record3.status==="error"||record3.status==="ingestion_error"),cancelled=records.filter((record3)=>record3.status==="cancelled"),stale=records.filter((record3)=>record3.status==="stale"),pending=records.filter((record3)=>record3.status==="pending"||record3.status==="running"),consumed=records.filter((record3)=>record3.status==="consumed");return{success:pending.length===0&&failed.length===0&&cancelled.length===0&&stale.length===0,batch_id:batchId,total:records.length,completed:completed.length,failed:failed.length,cancelled:cancelled.length,stale:stale.length,pending:pending.length,consumed:consumed.length,all_settled:pending.length===0,lane_results:laneResults}}function recordToLaneResult(record3,batchId){let status=record3.status==="error"?"failed":record3.status==="ingestion_error"?"failed":record3.status==="running"?"pending":record3.status,laneId=record3.laneId??record3.correlationId,digest3=record3.result?.digest,outputRef=record3.result?.outputRef?.trim(),alreadyDelivered=!1;if(record3.result?.text!==void 0&&status!=="pending"&&digest3&&outputRef){let key=`${batchId}\x00${laneId}\x00${digest3}`;if(alreadyDelivered=deliveredLaneOutputs.has(key),!alreadyDelivered)deliveredLaneOutputs.add(key),evictDeliveredLaneOutputsIfOverBound()}return{id:laneId,agent:record3.swarmPrefixedAgent,role:record3.normalizedAgent,status,session_id:record3.subagentSessionId,started_at:new Date(record3.createdAt).toISOString(),completed_at:new Date(record3.completedAt??record3.updatedAt).toISOString(),...record3.result?.text!==void 0?{...alreadyDelivered?{output_omitted_repeat:!0}:{output:record3.result.text},output_chars:record3.result.chars,output_truncated:record3.result.truncated,output_digest:record3.result.digest,...record3.result.outputRef?{output_ref:record3.result.outputRef}:{},...record3.result.outputPreviewChars!==void 0?{output_preview_chars:record3.result.outputPreviewChars}:{},...record3.result.outputDegraded!==void 0?{output_degraded:record3.result.outputDegraded}:{},...record3.result.outputArtifactError?{output_artifact_error:record3.result.outputArtifactError}:{},...record3.result.transcriptIncomplete!==void 0?{transcript_incomplete:record3.result.transcriptIncomplete}:{},...record3.result.messageCount!==void 0?{message_count:record3.result.messageCount}:{}}:{},...record3.result?.error!==void 0?{error:record3.result.error}:{}}}function allSettled(records){return records.every((record3)=>record3.status!=="pending"&&record3.status!=="running")}function failedLane(lane,role,startedAt,error93,slotId,runId,sessionId){return{id:lane.id,agent:lane.agent,role,status:"failed",session_id:sessionId,slot_id:slotId,run_id:runId,started_at:startedAt,completed_at:isoNow2(),error:error93}}function validateLaneAgent(agent,context){let generatedAgentNames=_internals145.getGeneratedAgentNames(),role=resolveGeneratedAgentRole(agent,generatedAgentNames);if(!isKnownCanonicalRole(role))return{ok:!1,role,error:`Agent "${agent}" is not registered as a generated swarm agent or canonical role`};if(!READ_ONLY_LANE_ROLES.has(role))return{ok:!1,role,error:`Agent role "${role}" is not allowed for read-only lane dispatch`};let callerPrefix=context.callerAgent?getGeneratedAgentPrefix(context.callerAgent,generatedAgentNames):null;if(callerPrefix){if(getGeneratedAgentPrefix(agent,generatedAgentNames)!==callerPrefix)return{ok:!1,role,error:`Agent "${agent}" does not match caller swarm prefix "${callerPrefix}"`}}return{ok:!0,role}}function getGeneratedAgentPrefix(agent,generatedAgentNames){let role=resolveGeneratedAgentRole(agent,generatedAgentNames);if(!isKnownCanonicalRole(role))return null;let normalized=agent.toLowerCase();if(normalized===role)return null;for(let separator of AGENT_NAME_SEPARATORS){let suffix=`${separator}${role}`;if(normalized.endsWith(suffix))return normalized.slice(0,-suffix.length)}return null}function buildReadOnlyTools(){let tools={};for(let toolName of READ_ONLY_TOOL_DENYLIST)tools[toolName]=!1;return tools.write=!1,tools.edit=!1,tools.patch=!1,tools}function prepareLaneOutput(args2){let stored=storeLaneOutput(args2.directory,{batchId:args2.batchId,laneId:args2.laneId,agent:args2.agent,role:args2.role,sessionId:args2.sessionId,parentSessionId:args2.parentSessionId,mode:args2.mode,workflowLane:args2.workflowLane,prHeadSha:args2.prHeadSha,gitHead:args2.gitHead,revisionDigest:args2.revisionDigest,scope:args2.scope,source:args2.source,text:args2.text,messageCount:args2.messageCount,transcriptIncomplete:args2.transcriptIncomplete}),preview=buildLaneOutputPreview({text:args2.text,ref:stored.ref,degraded:stored.degraded,maxChars:MAX_LANE_OUTPUT_CHARS});return{...preview,output_ref:stored.ref,output_digest:stored.digest,output_preview_chars:preview.output.length,...stored.degraded?{output_degraded:!0}:{},...stored.error?{output_artifact_error:stored.error}:{},...args2.transcriptIncomplete!==void 0?{transcript_incomplete:args2.transcriptIncomplete}:{},...args2.messageCount!==void 0?{message_count:args2.messageCount}:{}}}function failureResult(args2){return{success:!1,failure_class:args2.failure_class,message:args2.message,dispatched:0,completed:0,failed:0,rejected:0,max_concurrent:0,timeout_ms:0,lane_results:[],errors:args2.errors}}function asyncFailureResult(args2){return{success:!1,failure_class:args2.failure_class,message:args2.message,batch_id:null,dispatched:0,pending:0,failed:0,rejected:0,max_concurrent:0,launch_timeout_ms:0,timeout_ms:0,lane_results:[],errors:args2.errors}}function collectFailureResult(args2){return{success:!1,failure_class:args2.failure_class,message:args2.message,batch_id:args2.batch_id,total:0,completed:0,failed:0,cancelled:0,stale:0,pending:0,consumed:0,all_settled:!1,lane_results:[],errors:args2.errors}}function applyCommonPrompt(lanes,commonPrompt){if(!commonPrompt)return{ok:!0,lanes:[...lanes]};let errors5=[],merged=lanes.map((lane)=>{let prompt=`${commonPrompt}${COMMON_PROMPT_SEPARATOR}${lane.prompt}`;if(prompt.length>MAX_PROMPT_CHARS)errors5.push(`Lane "${lane.id}" combined common_prompt + prompt is ${prompt.length} chars (common_prompt ${commonPrompt.length} + separator ${COMMON_PROMPT_SEPARATOR.length} + lane prompt ${lane.prompt.length}; max ${MAX_PROMPT_CHARS})`);return{...lane,prompt}});if(errors5.length>0)return{ok:!1,errors:errors5};return{ok:!0,lanes:merged}}function applyExplorerFormatSuffix(lanes){let generatedAgentNames=_internals145.getGeneratedAgentNames();return lanes.map((lane)=>{if(resolveGeneratedAgentRole(lane.agent,generatedAgentNames)!=="explorer")return lane;if(lane.prompt.includes("[CANDIDATE]"))return lane;let exactLane=lane.workflow_lane??lane.id,ownedLanes=lane.owned_workflow_lanes?.length?lane.owned_workflow_lanes:[exactLane],identity=ownedLanes.length===1?`every output row MUST use the exact lane value "${ownedLanes[0]}"`:`this consolidated lane covers ${ownedLanes.length} obligations — evaluate EVERY one and emit a distinct [CANDIDATE] row set or fully populated [CLEAN] attestation for EACH of: ${ownedLanes.map((owned)=>`"${owned}"`).join(", ")}; every output row MUST use the exact lane value of the obligation it reports`,prompt=`${lane.prompt}
|
|
6112
6112
|
|
|
@@ -6279,7 +6279,7 @@ ${content}
|
|
|
6279
6279
|
`),diff2+=`
|
|
6280
6280
|
`,diff2}function validateOldContent(lines,contextMatch,oldContent){if(!oldContent)return{valid:!0};let expectedLines=splitDiffLines(oldContent),removalStartIdx=contextMatch.startLineIndex+contextMatch.matchedBefore.length,actualLines=lines.slice(removalStartIdx,removalStartIdx+expectedLines.length);if(!arraysEqual2(actualLines,expectedLines))return{valid:!1,expected:expectedLines.join(`
|
|
6281
6281
|
`),actual:actualLines.join(`
|
|
6282
|
-
`)};return{valid:!0}}var suggestPatch=createSwarmTool({description:'Suggest a structured patch for specified files without modifying them. Returns context-based patch proposals with anchors for reviewer use. When format="unified", also produces a unified diff string consumable by apply_patch. '+"This is a read-only tool — it does not modify any files.",args:{targetFiles:exports_external.array(exports_external.string()).describe("Array of file paths to patch").min(1),changes:exports_external.array(exports_external.object({file:exports_external.string().describe("Path to the file this change applies to"),contextBefore:exports_external.array(exports_external.string()).optional().describe("Lines before the change region (anchor)"),contextAfter:exports_external.array(exports_external.string()).optional().describe("Lines after the change region (anchor)"),oldContent:exports_external.string().optional().describe("Current content to be replaced"),newContent:exports_external.string().describe("New content to replace with")})).describe("Array of change descriptions with context anchors").min(1),format:exports_external.enum(["json","unified"]).optional().default("json").describe('Output format: "json" (default, existing structured output) or "unified" (unified diff string for apply_patch)')},execute:async(args2,directory)=>{if(!args2||typeof args2!=="object")return JSON.stringify({success:!1,error:!0,type:"parse-error",message:"Could not parse suggest-patch arguments"},null,2);let obj=args2,targetFiles=obj.targetFiles??[],changes=obj.changes??[],format=obj.format??"json";if(!targetFiles||targetFiles.length===0)return JSON.stringify({success:!1,error:!0,type:"parse-error",message:"targetFiles cannot be empty"},null,2);if(!changes||changes.length===0)return JSON.stringify({success:!1,error:!0,type:"parse-error",message:"changes cannot be empty"},null,2);if(!fs156.existsSync(directory))return JSON.stringify({success:!1,error:!0,type:"file-not-found",message:"Workspace directory does not exist"},null,2);let patches=[],filesModifiedSet=new Set,errors5=[],unifiedDiffEntries=[],targetFileSet=new Set(targetFiles),skippedBinaryFiles=new Set;if(format==="unified"){for(let change of changes)if(isBinaryFile4(change.file))errors5.push({success:!1,error:!0,type:"parse-error",message:`Binary files are not supported in unified diff mode: ${change.file}`,details:{location:change.file}}),skippedBinaryFiles.add(change.file)}for(let changeIndex=0;changeIndex<changes.length;changeIndex++){let change=changes[changeIndex];if(format==="unified"&&skippedBinaryFiles.has(change.file))continue;if(!targetFileSet.has(change.file)){errors5.push({success:!1,error:!0,type:"parse-error",message:`File "${change.file}" is not in targetFiles`,details:{location:change.file}});continue}if(!validateFilePath2(change.file,directory)){errors5.push({success:!1,error:!0,type:"parse-error",message:`Invalid file path: ${change.file}`,details:{location:change.file}});continue}let fullPath=path261.resolve(directory,change.file);if(!fs156.existsSync(fullPath)){errors5.push({success:!1,error:!0,type:"file-not-found",message:`File not found: ${change.file}`,details:{location:change.file}});continue}let content;try{content=fs156.readFileSync(fullPath,"utf-8")}catch(err2){errors5.push({success:!1,error:!0,type:"unknown",message:`Could not read file: ${err2 instanceof Error?err2.message:String(err2)}`,details:{location:`${change.file}:0`}});continue}let contextMatch=findContextMatch(content,change.contextBefore,change.contextAfter,change.oldContent);if(!contextMatch){errors5.push({success:!1,error:!0,type:"context-mismatch",message:`Could not find context anchor in ${change.file}. Provide contextBefore/contextAfter lines to locate the change region.`,details:{location:change.file}});continue}let lines=splitDiffLines(content),oldContentValidation=validateOldContent(lines,contextMatch,change.oldContent);if(!oldContentValidation.valid){errors5.push({success:!1,error:!0,type:"context-mismatch",message:"Content at the specified location does not match oldContent",details:{expected:oldContentValidation.expected,actual:oldContentValidation.actual,location:`${change.file}:${contextMatch.startLineIndex+1}-${contextMatch.endLineIndex+1}`}});continue}let originalContext=[...contextMatch.matchedBefore,...contextMatch.matchedAfter.length>0?["..."]:[],...contextMatch.matchedAfter];if(patches.push({file:change.file,originalContext,newContent:change.newContent,hunkIndex:changeIndex}),filesModifiedSet.add(change.file),format==="unified")unifiedDiffEntries.push({file:change.file,contextMatch,oldContent:change.oldContent,newContent:change.newContent})}if(patches.length>0){let baseResult={success:!0,patches,filesModified:Array.from(filesModifiedSet),...errors5.length>0&&{errors:errors5}};if(format==="unified"){let fileGroups=new Map;for(let entry of unifiedDiffEntries){let group=fileGroups.get(entry.file)??[];group.push(entry),fileGroups.set(entry.file,group)}let unifiedParts=[];for(let[file3,entries]of fileGroups){entries.sort((a,b)=>a.contextMatch.startLineIndex-b.contextMatch.startLineIndex);let entryFullPath=path261.resolve(directory,file3),entryContent;try{entryContent=fs156.readFileSync(entryFullPath,"utf-8")}catch{continue}unifiedParts.push(generateFileHeader(file3));for(let entry of entries)unifiedParts.push(generateHunk(entryContent,entry.contextMatch,entry.oldContent,entry.newContent))}let unifiedPatch=unifiedParts.join("");return JSON.stringify({...baseResult,unifiedPatch},null,2)}return JSON.stringify(baseResult,null,2)}if(errors5.length===1)return JSON.stringify(errors5[0],null,2);return JSON.stringify({success:!1,error:!0,type:"context-mismatch",message:`All ${errors5.length} patch suggestions failed`,errors:errors5},null,2)}});init_zod();init_loader();init_schema3();init_store3();init_create_tool();init_resolve_working_directory();function getContextAgent2(ctx){if(!ctx||typeof ctx!=="object")return;let value=ctx.agent;return typeof value==="string"?value:void 0}var ArgsSchema5=exports_external.object({phase:exports_external.number().int().min(0).max(999),summary:exports_external.string().min(1),task_id:exports_external.string().min(1).optional(),parent_agent:exports_external.string().min(1).optional(),key_decisions:exports_external.array(exports_external.string().min(1)).optional(),constraints_observed:exports_external.array(exports_external.string().min(1)).optional(),constraints_violated:exports_external.array(exports_external.string().min(1)).optional(),assumptions:exports_external.array(exports_external.string().min(1)).optional(),risks:exports_external.array(exports_external.string().min(1)).optional(),files_touched:exports_external.array(exports_external.string().min(1)).optional(),evidence_refs:exports_external.array(exports_external.string().min(1)).optional(),working_directory:exports_external.string().optional()}),summarize_work=createSwarmTool({description:`Emit a short structured summary of the work you just completed (key decisions, assumptions, risks, constraints observed/violated). Call this once at task completion. Keep the summary under ${MAX_AGENT_SUMMARY_WORDS} words and each list to ${MAX_LIST_ITEMS} items — longer content is truncated, not rejected. These `+"summaries roll up per phase and are reviewed by the architecture supervisor to catch cross-task contradictions, drift, and repeated failure loops. Advisory only.",args:{phase:exports_external.number().int().min(0).max(999).describe("Phase number this work belongs to."),summary:exports_external.string().min(1).describe(`One-paragraph summary of what you did (<= ${MAX_AGENT_SUMMARY_WORDS} words).`),task_id:exports_external.string().min(1).optional().describe('Task ID this summary covers (e.g. "1.2").'),parent_agent:exports_external.string().min(1).optional().describe("The agent that delegated this task, if any."),key_decisions:exports_external.array(exports_external.string().min(1)).optional(),constraints_observed:exports_external.array(exports_external.string().min(1)).optional(),constraints_violated:exports_external.array(exports_external.string().min(1)).optional(),assumptions:exports_external.array(exports_external.string().min(1)).optional(),risks:exports_external.array(exports_external.string().min(1)).optional(),files_touched:exports_external.array(exports_external.string().min(1)).optional(),evidence_refs:exports_external.array(exports_external.string().min(1)).optional(),working_directory:exports_external.string().optional()},execute:async(rawArgs,directory,ctx)=>{let parsed=ArgsSchema5.safeParse(rawArgs);if(!parsed.success)return JSON.stringify({success:!1,reason:"invalid arguments",errors:parsed.error.issues.map((i)=>({path:i.path.join("."),message:i.message}))},null,2);let args2=parsed.data,dirResult=resolveWorkingDirectory(args2.working_directory,directory);if(!dirResult.success)return JSON.stringify({success:!1,reason:dirResult.message},null,2);let workingDir=dirResult.directory,sessionId=ctx?.sessionID??"unknown-session",agent=getContextAgent2(ctx)??"unknown-agent",maxWords=MAX_AGENT_SUMMARY_WORDS;try{maxWords=loadPluginConfig(workingDir).architectural_supervision?.max_agent_summary_words??maxWords}catch{}let summary=normalizeAgentWorkSummary({phase:args2.phase,task_id:args2.task_id,session_id:sessionId,agent,parent_agent:args2.parent_agent,summary:args2.summary,key_decisions:args2.key_decisions,constraints_observed:args2.constraints_observed,constraints_violated:args2.constraints_violated,assumptions:args2.assumptions,risks:args2.risks,files_touched:args2.files_touched,evidence_refs:args2.evidence_refs},maxWords),storedTaskId=await writeAgentSummary(workingDir,summary);return JSON.stringify({success:!0,stored_task_id:storedTaskId,phase:summary.phase,agent:summary.agent,truncated:summary.truncated??!1},null,2)}});init_zod();init_command_dispatch();init_tool_policy();init_create_tool();function createSwarmCommandTool(agents,evaluationModelDispatcher){return createSwarmTool({description:"Run supported /swarm commands through the canonical opencode-swarm command registry. Return the tool output verbatim to the user.",args:{command:exports_external.enum(SWARM_COMMAND_TOOL_COMMANDS).describe("The /swarm subcommand to run, without the /swarm prefix."),args:exports_external.array(exports_external.string()).default([]).describe("Additional command arguments as separate tokens.")},async execute(rawArgs,directory,ctx){let args2=rawArgs;return(await executeSwarmCommand({directory,agents,sessionID:ctx?.sessionID??"",tokens:[args2.command,...args2.args??[]],policy:classifySwarmCommandToolUse,evaluationModelDispatcher})).text}})}var swarm_command=createSwarmCommandTool({});init_zod();init_config();init_memory();init_create_tool();var MEMORY_KINDS=["user_preference","project_fact","architecture_decision","repo_convention","api_finding","code_pattern","test_pattern","failure_pattern","security_note","evidence","todo","scratch"],ProposalArgsSchema=exports_external.object({operation:exports_external.enum(["add","update","delete","ignore","merge","supersede"]),kind:exports_external.enum(MEMORY_KINDS).optional(),text:exports_external.string().min(1).max(2000).optional(),targetMemoryId:exports_external.string().optional(),relatedMemoryIds:exports_external.array(exports_external.string()).optional(),rationale:exports_external.string().min(1).max(2000),evidenceRefs:exports_external.array(exports_external.string().min(1).max(500)).max(20).optional()}),swarm_memory_propose=createSwarmTool({description:"Create a pending Swarm memory proposal. This never writes durable memory directly; curator review is required.",args:{operation:exports_external.enum(["add","update","delete","ignore","merge","supersede"]).describe("Proposal operation"),kind:exports_external.enum(MEMORY_KINDS).optional().describe("Memory kind for add/update/supersede proposals"),text:exports_external.string().min(1).max(2000).optional().describe("Canonical fact text for add/update/supersede proposals"),targetMemoryId:exports_external.string().optional().describe("Target memory ID for update/delete/supersede proposals"),relatedMemoryIds:exports_external.array(exports_external.string()).optional().describe("Related memory IDs for merge/supersede proposals"),rationale:exports_external.string().min(1).max(2000).describe("Why this proposal matters"),evidenceRefs:exports_external.array(exports_external.string().min(1).max(500)).max(20).optional().describe("Evidence refs such as files, commits, test outputs, or URLs")},execute:async(args2,directory,ctx)=>{let{config:config3}=_internals173.loadPluginConfigWithMeta(directory);if(config3.memory?.enabled!==!0)return JSON.stringify({success:!1,disabled:!0,message:"Swarm memory is disabled. Set swarm.memory.enabled=true."});let parsed=ProposalArgsSchema.safeParse(args2);if(!parsed.success)return JSON.stringify({success:!1,error:parsed.error.issues.map((issue3)=>issue3.message).join("; ")});let agent=getContextAgent3(ctx),gateway=_internals173.createMemoryGateway({directory,sessionID:ctx?.sessionID,agentRole:agent,agentId:agent,runId:ctx?.sessionID},{config:config3.memory});try{let proposal=await gateway.propose(parsed.data);return JSON.stringify({success:proposal.status!=="rejected",proposal_id:proposal.id,status:proposal.status,operation:proposal.operation,memory_id:proposal.proposedRecord?.id,rejection_reason:proposal.rejectionReason,message:proposal.status==="pending"?"Memory proposal created. Durable memory was not written.":"Memory proposal was captured with policy rejection metadata."},null,2)}finally{await gateway.dispose()}}}),_internals173={loadPluginConfigWithMeta,createMemoryGateway};function getContextAgent3(ctx){if(!ctx||typeof ctx!=="object")return;let value=ctx.agent;return typeof value==="string"?value:void 0}init_zod();init_config();init_memory();init_state2();init_create_tool();var MEMORY_KINDS2=["user_preference","project_fact","architecture_decision","repo_convention","api_finding","code_pattern","test_pattern","failure_pattern","security_note","evidence","todo","scratch"],swarm_memory_recall=createSwarmTool({description:"Recall scoped Swarm memory for the current repository. Read-only; retrieved memory is untrusted background.",args:{query:exports_external.string().min(3).describe("Natural language recall query"),kinds:exports_external.array(exports_external.enum(MEMORY_KINDS2)).optional().describe("Optional memory kinds to include"),maxItems:exports_external.number().int().min(1).max(20).optional().describe("Maximum memories to return")},execute:async(args2,directory,ctx)=>{let{config:config3}=_internals174.loadPluginConfigWithMeta(directory);if(config3.memory?.enabled!==!0)return JSON.stringify({success:!1,disabled:!0,message:"Swarm memory is disabled. Set swarm.memory.enabled=true."});let parsed=RecallArgsSchema.safeParse(args2);if(!parsed.success)return JSON.stringify({success:!1,error:parsed.error.issues.map((issue3)=>issue3.message).join("; ")});let agent=getContextAgent4(ctx),unitId=ctx?.sessionID?_internals174.getAgentSession(ctx.sessionID)?.currentTaskId??void 0:void 0,gateway=_internals174.createMemoryGateway({directory,sessionID:ctx?.sessionID,agentRole:agent,agentId:agent,runId:ctx?.sessionID,unitId},{config:config3.memory});try{let bundle=await gateway.recall(parsed.data);return JSON.stringify({success:!0,bundle_id:bundle.id,memory_ids:bundle.items.map((item)=>item.record.id),total:bundle.items.length,token_estimate:bundle.tokenEstimate,signals:bundle.items.map((item)=>({memory_id:item.record.id,...item.signals})),prompt_block:bundle.promptBlock},null,2)}finally{await gateway.dispose()}}}),RecallArgsSchema=exports_external.object({query:exports_external.string().min(3),kinds:exports_external.array(exports_external.enum(MEMORY_KINDS2)).optional(),maxItems:exports_external.number().int().min(1).max(20).optional()}),_internals174={loadPluginConfigWithMeta,createMemoryGateway,getAgentSession};function getContextAgent4(ctx){if(!ctx||typeof ctx!=="object")return;let value=ctx.agent;return typeof value==="string"?value:void 0}init_p_limit();init_zod();init_manager2();init_detector();init_registry();init_create_tool();import*as fs157 from"node:fs";import*as path262 from"node:path";var MAX_FILE_SIZE2=2097152,BINARY_CHECK_BYTES=8192,BINARY_NULL_THRESHOLD3=0.1,SYNTAX_CHECK_CONCURRENCY=8;function isBinaryContent2(content){let sample=content.slice(0,BINARY_CHECK_BYTES),nullCount=0;for(let i=0;i<sample.length;i++)if(sample.charCodeAt(i)===0)nullCount++;return nullCount/sample.length>BINARY_NULL_THRESHOLD3}function extractSyntaxErrors(parser,content){let tree=parser.parse(content);if(!tree)return[];let errors5=[],stack=[tree.rootNode];while(stack.length>0){let node=stack.pop();if(node.type==="ERROR")errors5.push({line:node.startPosition.row+1,column:node.startPosition.column,message:"Syntax error"});else if(node.isMissing)errors5.push({line:node.startPosition.row+1,column:node.startPosition.column,message:`Missing '${node.type}'`});let children=node.children;for(let i=children.length-1;i>=0;i--)stack.push(children[i])}if(errors5.length===0&&tree.rootNode.hasError)errors5.push({line:1,column:0,message:"Syntax error detected (tree has errors)"});return tree.delete(),errors5}async function syntaxCheck(input,directory,config3){if(config3?.gates?.syntax_check?.enabled===!1)return{verdict:"pass",files:[],summary:"syntax_check disabled by configuration"};let{changed_files,mode="changed",languages}=input,filesToCheck=changed_files;if(mode==="changed")filesToCheck=filesToCheck.filter((f)=>f.additions>0);if(languages?.length){let lowerLangs=languages.map((l)=>l.toLowerCase());filesToCheck=filesToCheck.filter((file3)=>{let ext=path262.extname(file3.path).toLowerCase(),langDef=getLanguageForExtension(ext),langId=getProfileForFile(file3.path)?.id||langDef?.id;return langId?lowerLangs.includes(langId.toLowerCase()):!1})}let{loadGrammar:loadGrammar2}=await Promise.resolve().then(() => (init_runtime(),exports_runtime));async function checkOneFile(fileInfo){let{path:filePath}=fileInfo,fullPath=path262.isAbsolute(filePath)?filePath:path262.join(directory,filePath),result={path:filePath,language:"",ok:!1,errors:[]};try{let profile=getProfileForFile(filePath),grammarId=profile?.treeSitter?.grammarId,parser=null;if(grammarId)try{parser=await loadGrammar2(grammarId)}catch{parser=null}if(!parser)parser=await getParserForFile(filePath);if(!parser)return result.skipped_reason="unsupported_language",{result,counted:!1,failed:!1,skipped:!0};try{if(fs157.statSync(fullPath).size>=MAX_FILE_SIZE2)return result.skipped_reason="file_too_large",{result,counted:!1,failed:!1,skipped:!0}}catch{}let content;try{content=fs157.readFileSync(fullPath,"utf8")}catch{return result.skipped_reason="file_read_error",{result,counted:!1,failed:!1,skipped:!0}}if(content.length>=MAX_FILE_SIZE2)return result.skipped_reason="file_too_large",{result,counted:!1,failed:!1,skipped:!0};if(isBinaryContent2(content))return result.skipped_reason="binary_file",{result,counted:!1,failed:!1,skipped:!0};let ext=path262.extname(filePath).toLowerCase(),langDef=getLanguageForExtension(ext);result.language=profile?.id||langDef?.id||"unknown";let errors5=extractSyntaxErrors(parser,content);if(errors5.length>0)return result.ok=!1,result.errors=errors5,{result,counted:!0,failed:!0,skipped:!1};return result.ok=!0,{result,counted:!0,failed:!1,skipped:!1}}catch(error93){return result.skipped_reason=error93 instanceof Error?error93.message:"unknown_error",{result,counted:!0,failed:!1,skipped:!0}}}let limit=pLimit(SYNTAX_CHECK_CONCURRENCY),outcomes=await Promise.all(filesToCheck.map((fileInfo)=>limit(()=>checkOneFile(fileInfo)))),results=[],filesChecked=0,filesFailed=0,skippedCount=0;for(let outcome of outcomes){if(results.push(outcome.result),outcome.counted)filesChecked++;if(outcome.failed)filesFailed++;if(outcome.skipped)skippedCount++}let verdict=filesFailed>0?"fail":"pass",summary=filesFailed>0?`Syntax errors found in ${filesFailed} of ${filesChecked} files`:`All ${filesChecked} files passed syntax check`;return await _internals18.saveEvidence(directory,"syntax_check",{task_id:"syntax_check",type:"syntax",timestamp:new Date().toISOString(),agent:"syntax_check",verdict,summary,files_checked:filesChecked,files_failed:filesFailed,skipped_count:skippedCount,files:results}),{verdict,files:results,summary}}var syntax_check=createSwarmTool({description:"Check syntax of source files using tree-sitter parsers. Supports JS/TS, Python, Go, Rust, Java, C/C++, C#, PHP, Ruby. Returns JSON with syntax errors found per file.",args:{changed_files:exports_external.array(exports_external.object({path:exports_external.string(),additions:exports_external.number()})).describe("Files to check (from diff gate)"),mode:exports_external.enum(["changed","all"]).optional().describe("Check mode: 'changed' = only changed files, 'all' = all files in repo"),languages:exports_external.array(exports_external.string()).optional().describe("Optional: restrict to specific languages")},async execute(args2,directory){let result=await syntaxCheck(args2,directory);return JSON.stringify(result)}});init_zod();init_analyzer();init_create_tool();init_resolve_working_directory();var test_impact=createSwarmTool({description:"Analyze which test files are impacted by changes to the given source files. Returns TestImpactResult with impactedTests, untestedFiles, and the full impact map.",args:{changedFiles:exports_external.array(exports_external.string()).describe("Array of source file paths to analyze for test impact"),working_directory:exports_external.string().optional().describe("Project root directory. Defaults to current working directory.")},async execute(args2,directory,_ctx){let typedArgs=args2;try{if(!typedArgs.changedFiles||!Array.isArray(typedArgs.changedFiles)||typedArgs.changedFiles.length===0)return JSON.stringify({error:"changedFiles must be a non-empty array of file paths",success:!1},null,2);let resolved=resolveWorkingDirectory(typedArgs.working_directory,directory);if(!resolved.success)return JSON.stringify({error:resolved.message,success:!1},null,2);let cwd=resolved.directory,result=await analyzeImpact(typedArgs.changedFiles,cwd);return JSON.stringify(result,null,2)}catch(e){return JSON.stringify({error:e instanceof Error?`test_impact failed: ${e.message}`:"test_impact failed: unknown error",success:!1},null,2)}}});init_test_runner();init_zod();init_utils();init_create_tool();init_path_security();import*as fs158 from"node:fs";import*as path263 from"node:path";var MAX_TEXT_LENGTH=200,MAX_FILE_SIZE_BYTES10=1048576,SUPPORTED_EXTENSIONS4=new Set([".ts",".tsx",".js",".jsx",".py",".rs",".ps1",".go",".java",".c",".cpp",".h",".cs",".rb",".php",".blade.php",".swift",".kt"]),SKIP_DIRECTORIES5=new Set(["node_modules","dist","build",".git",".swarm","coverage"]),PRIORITY_MAP={FIXME:"high",HACK:"high",XXX:"high",TODO:"medium",WARN:"medium",NOTE:"low"},SHELL_METACHAR_REGEX3=/[;&|%$`\\]/;function validateTagsInput(tags){if(!tags||tags.length===0)return"tags cannot be empty";if(containsControlChars(tags))return"tags contains control characters";if(SHELL_METACHAR_REGEX3.test(tags))return"tags contains shell metacharacters (;|&$`\\)";if(!/^[a-zA-Z0-9,\s]+$/.test(tags))return"tags contains invalid characters (only alphanumeric, commas, spaces allowed)";return null}function validatePathsInput(paths,cwd){if(!paths||paths.length===0)return{error:null,resolvedPath:cwd};if(containsControlChars(paths))return{error:"paths contains control characters",resolvedPath:null};if(containsPathTraversal(paths))return{error:"paths contains path traversal",resolvedPath:null};try{let resolvedPath=path263.resolve(paths),normalizedCwd=path263.resolve(cwd);if(!path263.resolve(resolvedPath).startsWith(normalizedCwd))return{error:"paths must be within the current working directory",resolvedPath:null};return{error:null,resolvedPath}}catch(e){return{error:e instanceof Error?e.message:"invalid paths",resolvedPath:null}}}function isSupportedExtension(filePath){let ext=path263.extname(filePath).toLowerCase();return SUPPORTED_EXTENSIONS4.has(ext)}function findSourceFiles3(dir,files=[]){let entries;try{entries=fs158.readdirSync(dir)}catch{return files}entries.sort((a,b)=>a.toLowerCase().localeCompare(b.toLowerCase()));for(let entry of entries){if(SKIP_DIRECTORIES5.has(entry))continue;let fullPath=path263.join(dir,entry),stat17;try{stat17=fs158.statSync(fullPath)}catch{continue}if(stat17.isDirectory())findSourceFiles3(fullPath,files);else if(stat17.isFile()){if(isSupportedExtension(fullPath))files.push(fullPath)}}return files}function parseTodoComments(content,filePath,tagsSet){let entries=[],lines=content.split(`
|
|
6282
|
+
`)};return{valid:!0}}var suggestPatch=createSwarmTool({description:'Suggest a structured patch for specified files without modifying them. Returns context-based patch proposals with anchors for reviewer use. When format="unified", also produces a unified diff string consumable by apply_patch. '+"This is a read-only tool — it does not modify any files.",args:{targetFiles:exports_external.array(exports_external.string()).describe("Array of file paths to patch").min(1),changes:exports_external.array(exports_external.object({file:exports_external.string().describe("Path to the file this change applies to"),contextBefore:exports_external.array(exports_external.string()).optional().describe("Lines before the change region (anchor)"),contextAfter:exports_external.array(exports_external.string()).optional().describe("Lines after the change region (anchor)"),oldContent:exports_external.string().optional().describe("Current content to be replaced"),newContent:exports_external.string().describe("New content to replace with")})).describe("Array of change descriptions with context anchors").min(1),format:exports_external.enum(["json","unified"]).optional().default("json").describe('Output format: "json" (default, existing structured output) or "unified" (unified diff string for apply_patch)')},execute:async(args2,directory)=>{if(!args2||typeof args2!=="object")return JSON.stringify({success:!1,error:!0,type:"parse-error",message:"Could not parse suggest-patch arguments"},null,2);let obj=args2,targetFiles=obj.targetFiles??[],changes=obj.changes??[],format=obj.format??"json";if(!targetFiles||targetFiles.length===0)return JSON.stringify({success:!1,error:!0,type:"parse-error",message:"targetFiles cannot be empty"},null,2);if(!changes||changes.length===0)return JSON.stringify({success:!1,error:!0,type:"parse-error",message:"changes cannot be empty"},null,2);if(!fs156.existsSync(directory))return JSON.stringify({success:!1,error:!0,type:"file-not-found",message:"Workspace directory does not exist"},null,2);let patches=[],filesModifiedSet=new Set,errors5=[],unifiedDiffEntries=[],targetFileSet=new Set(targetFiles),skippedBinaryFiles=new Set;if(format==="unified"){for(let change of changes)if(isBinaryFile4(change.file))errors5.push({success:!1,error:!0,type:"parse-error",message:`Binary files are not supported in unified diff mode: ${change.file}`,details:{location:change.file}}),skippedBinaryFiles.add(change.file)}for(let changeIndex=0;changeIndex<changes.length;changeIndex++){let change=changes[changeIndex];if(format==="unified"&&skippedBinaryFiles.has(change.file))continue;if(!targetFileSet.has(change.file)){errors5.push({success:!1,error:!0,type:"parse-error",message:`File "${change.file}" is not in targetFiles`,details:{location:change.file}});continue}if(!validateFilePath2(change.file,directory)){errors5.push({success:!1,error:!0,type:"parse-error",message:`Invalid file path: ${change.file}`,details:{location:change.file}});continue}let fullPath=path261.resolve(directory,change.file);if(!fs156.existsSync(fullPath)){errors5.push({success:!1,error:!0,type:"file-not-found",message:`File not found: ${change.file}`,details:{location:change.file}});continue}let content;try{content=fs156.readFileSync(fullPath,"utf-8")}catch(err2){errors5.push({success:!1,error:!0,type:"unknown",message:`Could not read file: ${err2 instanceof Error?err2.message:String(err2)}`,details:{location:`${change.file}:0`}});continue}let contextMatch=findContextMatch(content,change.contextBefore,change.contextAfter,change.oldContent);if(!contextMatch){errors5.push({success:!1,error:!0,type:"context-mismatch",message:`Could not find context anchor in ${change.file}. Provide contextBefore/contextAfter lines to locate the change region.`,details:{location:change.file}});continue}let lines=splitDiffLines(content),oldContentValidation=validateOldContent(lines,contextMatch,change.oldContent);if(!oldContentValidation.valid){errors5.push({success:!1,error:!0,type:"context-mismatch",message:"Content at the specified location does not match oldContent",details:{expected:oldContentValidation.expected,actual:oldContentValidation.actual,location:`${change.file}:${contextMatch.startLineIndex+1}-${contextMatch.endLineIndex+1}`}});continue}let originalContext=[...contextMatch.matchedBefore,...contextMatch.matchedAfter.length>0?["..."]:[],...contextMatch.matchedAfter];if(patches.push({file:change.file,originalContext,newContent:change.newContent,hunkIndex:changeIndex}),filesModifiedSet.add(change.file),format==="unified")unifiedDiffEntries.push({file:change.file,contextMatch,oldContent:change.oldContent,newContent:change.newContent})}if(patches.length>0){let baseResult={success:!0,patches,filesModified:Array.from(filesModifiedSet),...errors5.length>0&&{errors:errors5}};if(format==="unified"){let fileGroups=new Map;for(let entry of unifiedDiffEntries){let group=fileGroups.get(entry.file)??[];group.push(entry),fileGroups.set(entry.file,group)}let unifiedParts=[];for(let[file3,entries]of fileGroups){entries.sort((a,b)=>a.contextMatch.startLineIndex-b.contextMatch.startLineIndex);let entryFullPath=path261.resolve(directory,file3),entryContent;try{entryContent=fs156.readFileSync(entryFullPath,"utf-8")}catch{continue}unifiedParts.push(generateFileHeader(file3));for(let entry of entries)unifiedParts.push(generateHunk(entryContent,entry.contextMatch,entry.oldContent,entry.newContent))}let unifiedPatch=unifiedParts.join("");return JSON.stringify({...baseResult,unifiedPatch},null,2)}return JSON.stringify(baseResult,null,2)}if(errors5.length===1)return JSON.stringify(errors5[0],null,2);return JSON.stringify({success:!1,error:!0,type:"context-mismatch",message:`All ${errors5.length} patch suggestions failed`,errors:errors5},null,2)}});init_zod();init_loader();init_schema3();init_store3();init_create_tool();init_resolve_working_directory();function getContextAgent2(ctx){if(!ctx||typeof ctx!=="object")return;let value=ctx.agent;return typeof value==="string"?value:void 0}var ArgsSchema5=exports_external.object({phase:exports_external.number().int().min(0).max(999),summary:exports_external.string().min(1),task_id:exports_external.string().min(1).optional(),parent_agent:exports_external.string().min(1).optional(),key_decisions:exports_external.array(exports_external.string().min(1)).optional(),constraints_observed:exports_external.array(exports_external.string().min(1)).optional(),constraints_violated:exports_external.array(exports_external.string().min(1)).optional(),assumptions:exports_external.array(exports_external.string().min(1)).optional(),risks:exports_external.array(exports_external.string().min(1)).optional(),files_touched:exports_external.array(exports_external.string().min(1)).optional(),evidence_refs:exports_external.array(exports_external.string().min(1)).optional(),working_directory:exports_external.string().optional()}),summarize_work=createSwarmTool({description:`Emit a short structured summary of the work you just completed (key decisions, assumptions, risks, constraints observed/violated). Call this once at task completion. Keep the summary under ${MAX_AGENT_SUMMARY_WORDS} words and each list to ${MAX_LIST_ITEMS} items — longer content is truncated, not rejected. These `+"summaries roll up per phase and are reviewed by the architecture supervisor to catch cross-task contradictions, drift, and repeated failure loops. Advisory only.",args:{phase:exports_external.number().int().min(0).max(999).describe("Phase number this work belongs to."),summary:exports_external.string().min(1).describe(`One-paragraph summary of what you did (<= ${MAX_AGENT_SUMMARY_WORDS} words).`),task_id:exports_external.string().min(1).optional().describe('Task ID this summary covers (e.g. "1.2").'),parent_agent:exports_external.string().min(1).optional().describe("The agent that delegated this task, if any."),key_decisions:exports_external.array(exports_external.string().min(1)).optional(),constraints_observed:exports_external.array(exports_external.string().min(1)).optional(),constraints_violated:exports_external.array(exports_external.string().min(1)).optional(),assumptions:exports_external.array(exports_external.string().min(1)).optional(),risks:exports_external.array(exports_external.string().min(1)).optional(),files_touched:exports_external.array(exports_external.string().min(1)).optional(),evidence_refs:exports_external.array(exports_external.string().min(1)).optional(),working_directory:exports_external.string().optional()},execute:async(rawArgs,directory,ctx)=>{let parsed=ArgsSchema5.safeParse(rawArgs);if(!parsed.success)return JSON.stringify({success:!1,reason:"invalid arguments",errors:parsed.error.issues.map((i)=>({path:i.path.join("."),message:i.message}))},null,2);let args2=parsed.data,dirResult=resolveWorkingDirectory(args2.working_directory,directory);if(!dirResult.success)return JSON.stringify({success:!1,reason:dirResult.message},null,2);let workingDir=dirResult.directory,sessionId=ctx?.sessionID??"unknown-session",agent=getContextAgent2(ctx)??"unknown-agent",maxWords=MAX_AGENT_SUMMARY_WORDS;try{maxWords=loadPluginConfig(workingDir).architectural_supervision?.max_agent_summary_words??maxWords}catch{}let summary=normalizeAgentWorkSummary({phase:args2.phase,task_id:args2.task_id,session_id:sessionId,agent,parent_agent:args2.parent_agent,summary:args2.summary,key_decisions:args2.key_decisions,constraints_observed:args2.constraints_observed,constraints_violated:args2.constraints_violated,assumptions:args2.assumptions,risks:args2.risks,files_touched:args2.files_touched,evidence_refs:args2.evidence_refs},maxWords),storedTaskId=await writeAgentSummary(workingDir,summary);return JSON.stringify({success:!0,stored_task_id:storedTaskId,phase:summary.phase,agent:summary.agent,truncated:summary.truncated??!1},null,2)}});init_zod();init_command_dispatch();init_tool_policy();init_create_tool();function createSwarmCommandTool(agents,evaluationModelDispatcher){return createSwarmTool({description:"Run supported /swarm commands through the canonical opencode-swarm command registry. Return the tool output verbatim to the user.",args:{command:exports_external.enum(SWARM_COMMAND_TOOL_COMMANDS).describe("The /swarm subcommand to run, without the /swarm prefix."),args:exports_external.array(exports_external.string()).default([]).describe("Additional command arguments as separate tokens.")},async execute(rawArgs,directory,ctx){let args2=rawArgs;return(await executeSwarmCommand({directory,agents,sessionID:ctx?.sessionID??"",tokens:[args2.command,...args2.args??[]],policy:classifySwarmCommandToolUse,evaluationModelDispatcher})).text}})}var swarm_command=createSwarmCommandTool({});init_zod();init_config();init_memory();init_create_tool();var MEMORY_KINDS=["user_preference","project_fact","architecture_decision","repo_convention","api_finding","code_pattern","test_pattern","failure_pattern","security_note","evidence","todo","scratch"],ProposalArgsSchema=exports_external.object({operation:exports_external.enum(["add","update","delete","ignore","merge","supersede"]),kind:exports_external.enum(MEMORY_KINDS).optional(),text:exports_external.string().min(1).max(2000).optional(),targetMemoryId:exports_external.string().optional(),relatedMemoryIds:exports_external.array(exports_external.string()).optional(),rationale:exports_external.string().min(1).max(2000),evidenceRefs:exports_external.array(exports_external.string().min(1).max(500)).max(20).optional()}),swarm_memory_propose=createSwarmTool({description:"Create a pending Swarm memory proposal. This never writes durable memory directly; curator review is required.",args:{operation:exports_external.enum(["add","update","delete","ignore","merge","supersede"]).describe("Proposal operation"),kind:exports_external.enum(MEMORY_KINDS).optional().describe("Memory kind for add/update/supersede proposals"),text:exports_external.string().min(1).max(2000).optional().describe("Canonical fact text for add/update/supersede proposals"),targetMemoryId:exports_external.string().optional().describe("Target memory ID for update/delete/supersede proposals"),relatedMemoryIds:exports_external.array(exports_external.string()).optional().describe("Related memory IDs for merge/supersede proposals"),rationale:exports_external.string().min(1).max(2000).describe("Why this proposal matters"),evidenceRefs:exports_external.array(exports_external.string().min(1).max(500)).max(20).optional().describe("Evidence refs such as files, commits, test outputs, or URLs")},execute:async(args2,directory,ctx)=>{let{config:config3}=_internals173.loadPluginConfigWithMeta(directory);if(config3.memory?.enabled!==!0)return JSON.stringify({success:!1,disabled:!0,message:"Swarm memory is disabled. Set swarm.memory.enabled=true."});let parsed=ProposalArgsSchema.safeParse(args2);if(!parsed.success)return JSON.stringify({success:!1,error:parsed.error.issues.map((issue3)=>issue3.message).join("; ")});let agent=getContextAgent3(ctx),gateway=_internals173.createMemoryGateway({directory,sessionID:ctx?.sessionID,agentRole:agent,agentId:agent,runId:ctx?.sessionID},{config:config3.memory});try{let proposal=await gateway.propose(parsed.data);return JSON.stringify({success:proposal.status!=="rejected",proposal_id:proposal.id,status:proposal.status,operation:proposal.operation,memory_id:proposal.proposedRecord?.id,rejection_reason:proposal.rejectionReason,message:proposal.status==="pending"?"Memory proposal created. Durable memory was not written.":"Memory proposal was captured with policy rejection metadata."},null,2)}finally{await gateway.dispose()}}}),_internals173={loadPluginConfigWithMeta,createMemoryGateway};function getContextAgent3(ctx){if(!ctx||typeof ctx!=="object")return;let value=ctx.agent;return typeof value==="string"?value:void 0}init_zod();init_config();init_memory();init_state2();init_create_tool();var MEMORY_KINDS2=["user_preference","project_fact","architecture_decision","repo_convention","api_finding","code_pattern","test_pattern","failure_pattern","security_note","evidence","todo","scratch"],swarm_memory_recall=createSwarmTool({description:"Recall scoped Swarm memory for the current repository. Read-only; retrieved memory is untrusted background.",args:{query:exports_external.string().min(3).describe("Natural language recall query"),kinds:exports_external.array(exports_external.enum(MEMORY_KINDS2)).optional().describe("Optional memory kinds to include"),maxItems:exports_external.number().int().min(1).max(20).optional().describe("Maximum memories to return")},execute:async(args2,directory,ctx)=>{let{config:config3}=_internals174.loadPluginConfigWithMeta(directory);if(config3.memory?.enabled!==!0)return JSON.stringify({success:!1,disabled:!0,message:"Swarm memory is disabled. Set swarm.memory.enabled=true."});let parsed=RecallArgsSchema.safeParse(args2);if(!parsed.success)return JSON.stringify({success:!1,error:parsed.error.issues.map((issue3)=>issue3.message).join("; ")});let agent=getContextAgent4(ctx),unitId=ctx?.sessionID?_internals174.getAgentSession(ctx.sessionID)?.currentTaskId??void 0:void 0,gateway=_internals174.createMemoryGateway({directory,sessionID:ctx?.sessionID,agentRole:agent,agentId:agent,runId:ctx?.sessionID,unitId},{config:config3.memory});try{let bundle=await gateway.recall(parsed.data);return JSON.stringify({success:!0,bundle_id:bundle.id,memory_ids:bundle.items.map((item)=>item.record.id),total:bundle.items.length,token_estimate:bundle.tokenEstimate,signals:bundle.items.map((item)=>({memory_id:item.record.id,...item.signals})),prompt_block:bundle.promptBlock},null,2)}finally{await gateway.dispose()}}}),RecallArgsSchema=exports_external.object({query:exports_external.string().min(3),kinds:exports_external.array(exports_external.enum(MEMORY_KINDS2)).optional(),maxItems:exports_external.number().int().min(1).max(20).optional()}),_internals174={loadPluginConfigWithMeta,createMemoryGateway,getAgentSession};function getContextAgent4(ctx){if(!ctx||typeof ctx!=="object")return;let value=ctx.agent;return typeof value==="string"?value:void 0}init_p_limit();init_zod();init_manager2();init_detector();init_registry();init_create_tool();import*as fs157 from"node:fs";import*as path262 from"node:path";var MAX_FILE_SIZE2=2097152,BINARY_CHECK_BYTES=8192,BINARY_NULL_THRESHOLD3=0.1,SYNTAX_CHECK_CONCURRENCY=8;function isBinaryContent2(content){let sample=content.slice(0,BINARY_CHECK_BYTES),nullCount=0;for(let i=0;i<sample.length;i++)if(sample.charCodeAt(i)===0)nullCount++;return nullCount/sample.length>BINARY_NULL_THRESHOLD3}function extractSyntaxErrors(parser,content){let tree=parser.parse(content);if(!tree)return[];let errors5=[],stack=[tree.rootNode];while(stack.length>0){let node=stack.pop();if(node.type==="ERROR")errors5.push({line:node.startPosition.row+1,column:node.startPosition.column,message:"Syntax error"});else if(node.isMissing)errors5.push({line:node.startPosition.row+1,column:node.startPosition.column,message:`Missing '${node.type}'`});let children=node.children;for(let i=children.length-1;i>=0;i--)stack.push(children[i])}if(errors5.length===0&&tree.rootNode.hasError)errors5.push({line:1,column:0,message:"Syntax error detected (tree has errors)"});return tree.delete(),errors5}async function syntaxCheck(input,directory,config3){if(config3?.gates?.syntax_check?.enabled===!1)return{verdict:"pass",files:[],summary:"syntax_check disabled by configuration"};let{changed_files,mode="changed",languages}=input,filesToCheck=changed_files;if(mode==="changed")filesToCheck=filesToCheck.filter((f)=>f.additions>0);if(languages?.length){let lowerLangs=languages.map((l)=>l.toLowerCase());filesToCheck=filesToCheck.filter((file3)=>{let ext=path262.extname(file3.path).toLowerCase(),langDef=getLanguageForExtension(ext),langId=getProfileForFile(file3.path)?.id||langDef?.id;return langId?lowerLangs.includes(langId.toLowerCase()):!1})}let{loadGrammar:loadGrammar2}=await Promise.resolve().then(() => (init_runtime(),exports_runtime));async function checkOneFile(fileInfo){let{path:filePath}=fileInfo,fullPath=path262.isAbsolute(filePath)?filePath:path262.join(directory,filePath),result={path:filePath,language:"",ok:!1,errors:[]};try{let profile=getProfileForFile(filePath),grammarId=profile?.treeSitter?.grammarId,parser=null;if(grammarId)try{parser=await loadGrammar2(grammarId)}catch{parser=null}if(!parser)parser=await getParserForFile(filePath);if(!parser)return result.skipped_reason="unsupported_language",{result,counted:!1,failed:!1,skipped:!0};try{if(fs157.statSync(fullPath).size>=MAX_FILE_SIZE2)return result.skipped_reason="file_too_large",{result,counted:!1,failed:!1,skipped:!0}}catch{}let content;try{content=fs157.readFileSync(fullPath,"utf8")}catch{return result.skipped_reason="file_read_error",{result,counted:!1,failed:!1,skipped:!0}}if(content.length>=MAX_FILE_SIZE2)return result.skipped_reason="file_too_large",{result,counted:!1,failed:!1,skipped:!0};if(isBinaryContent2(content))return result.skipped_reason="binary_file",{result,counted:!1,failed:!1,skipped:!0};let ext=path262.extname(filePath).toLowerCase(),langDef=getLanguageForExtension(ext);result.language=profile?.id||langDef?.id||"unknown";let errors5=extractSyntaxErrors(parser,content);if(errors5.length>0)return result.ok=!1,result.errors=errors5,{result,counted:!0,failed:!0,skipped:!1};return result.ok=!0,{result,counted:!0,failed:!1,skipped:!1}}catch(error93){return result.skipped_reason=error93 instanceof Error?error93.message:"unknown_error",{result,counted:!0,failed:!1,skipped:!0}}}let limit=pLimit(SYNTAX_CHECK_CONCURRENCY),outcomes=await Promise.all(filesToCheck.map((fileInfo)=>limit(()=>checkOneFile(fileInfo)))),results=[],filesChecked=0,filesFailed=0,skippedCount=0;for(let outcome of outcomes){if(results.push(outcome.result),outcome.counted)filesChecked++;if(outcome.failed)filesFailed++;if(outcome.skipped)skippedCount++}let emptyCheckReasons=[];if(changed_files.length===0)emptyCheckReasons.push("no files were supplied in changed_files");else{if(mode==="changed")emptyCheckReasons.push("mode='changed' dropped files with additions === 0 (deletion-only or pure-rename entries); pass mode='all' to include them");if(languages?.length)emptyCheckReasons.push(`the languages filter [${languages.join(", ")}] matched no supplied file`);if(emptyCheckReasons.length===0)emptyCheckReasons.push("every supplied file was skipped as unsupported, unreadable, too large, or binary")}let verdict=filesFailed>0?"fail":filesChecked===0?"skip":"pass",summary=filesFailed>0?`Syntax errors found in ${filesFailed} of ${filesChecked} files`:filesChecked===0?`No files were checked — ${emptyCheckReasons.join("; ")}. This is NOT a passing syntax check.`:`All ${filesChecked} files passed syntax check`;return await _internals18.saveEvidence(directory,"syntax_check",{task_id:"syntax_check",type:"syntax",timestamp:new Date().toISOString(),agent:"syntax_check",verdict,summary,files_checked:filesChecked,files_failed:filesFailed,skipped_count:skippedCount,files:results}),{verdict,files:results,summary}}var syntax_check=createSwarmTool({description:"Check syntax of source files using tree-sitter parsers. Supports JS/TS, Python, Go, Rust, Java, C/C++, C#, PHP, Ruby. Returns JSON with syntax errors found per file.",args:{changed_files:exports_external.array(exports_external.object({path:exports_external.string(),additions:exports_external.number()})).describe("Files to check (from diff gate)"),mode:exports_external.enum(["changed","all"]).optional().describe("Check mode over the supplied changed_files. 'changed' (default) checks only entries with additions > 0, so deletion-only and pure-rename entries are excluded; 'all' checks every supplied entry. Neither mode enumerates the repository — this tool only ever inspects the files you pass in changed_files. If the filters leave nothing to check the verdict is 'skip', never 'pass'."),languages:exports_external.array(exports_external.string()).optional().describe("Optional: restrict to specific languages")},async execute(args2,directory){let result=await syntaxCheck(args2,directory);return JSON.stringify(result)}});init_zod();init_analyzer();init_create_tool();init_resolve_working_directory();var test_impact=createSwarmTool({description:"Analyze which test files are impacted by changes to the given source files. Returns TestImpactResult with impactedTests, untestedFiles, and the full impact map.",args:{changedFiles:exports_external.array(exports_external.string()).describe("Array of source file paths to analyze for test impact"),working_directory:exports_external.string().optional().describe("Project root directory. Defaults to current working directory.")},async execute(args2,directory,_ctx){let typedArgs=args2;try{if(!typedArgs.changedFiles||!Array.isArray(typedArgs.changedFiles)||typedArgs.changedFiles.length===0)return JSON.stringify({error:"changedFiles must be a non-empty array of file paths",success:!1},null,2);let resolved=resolveWorkingDirectory(typedArgs.working_directory,directory);if(!resolved.success)return JSON.stringify({error:resolved.message,success:!1},null,2);let cwd=resolved.directory,result=await analyzeImpact(typedArgs.changedFiles,cwd);return JSON.stringify(result,null,2)}catch(e){return JSON.stringify({error:e instanceof Error?`test_impact failed: ${e.message}`:"test_impact failed: unknown error",success:!1},null,2)}}});init_test_runner();init_zod();init_utils();init_create_tool();init_path_security();import*as fs158 from"node:fs";import*as path263 from"node:path";var MAX_TEXT_LENGTH=200,MAX_FILE_SIZE_BYTES10=1048576,SUPPORTED_EXTENSIONS4=new Set([".ts",".tsx",".js",".jsx",".py",".rs",".ps1",".go",".java",".c",".cpp",".h",".cs",".rb",".php",".blade.php",".swift",".kt"]),SKIP_DIRECTORIES5=new Set(["node_modules","dist","build",".git",".swarm","coverage"]),PRIORITY_MAP={FIXME:"high",HACK:"high",XXX:"high",TODO:"medium",WARN:"medium",NOTE:"low"},SHELL_METACHAR_REGEX3=/[;&|%$`\\]/;function validateTagsInput(tags){if(!tags||tags.length===0)return"tags cannot be empty";if(containsControlChars(tags))return"tags contains control characters";if(SHELL_METACHAR_REGEX3.test(tags))return"tags contains shell metacharacters (;|&$`\\)";if(!/^[a-zA-Z0-9,\s]+$/.test(tags))return"tags contains invalid characters (only alphanumeric, commas, spaces allowed)";return null}function validatePathsInput(paths,cwd){if(!paths||paths.length===0)return{error:null,resolvedPath:cwd};if(containsControlChars(paths))return{error:"paths contains control characters",resolvedPath:null};if(containsPathTraversal(paths))return{error:"paths contains path traversal",resolvedPath:null};try{let resolvedPath=path263.resolve(paths),normalizedCwd=path263.resolve(cwd);if(!path263.resolve(resolvedPath).startsWith(normalizedCwd))return{error:"paths must be within the current working directory",resolvedPath:null};return{error:null,resolvedPath}}catch(e){return{error:e instanceof Error?e.message:"invalid paths",resolvedPath:null}}}function isSupportedExtension(filePath){let ext=path263.extname(filePath).toLowerCase();return SUPPORTED_EXTENSIONS4.has(ext)}function findSourceFiles3(dir,files=[]){let entries;try{entries=fs158.readdirSync(dir)}catch{return files}entries.sort((a,b)=>a.toLowerCase().localeCompare(b.toLowerCase()));for(let entry of entries){if(SKIP_DIRECTORIES5.has(entry))continue;let fullPath=path263.join(dir,entry),stat17;try{stat17=fs158.statSync(fullPath)}catch{continue}if(stat17.isDirectory())findSourceFiles3(fullPath,files);else if(stat17.isFile()){if(isSupportedExtension(fullPath))files.push(fullPath)}}return files}function parseTodoComments(content,filePath,tagsSet){let entries=[],lines=content.split(`
|
|
6283
6283
|
`),tagPattern=Array.from(tagsSet).map(escapeRegex2).join("|"),regex=new RegExp(`\\b(${tagPattern})\\b[:\\s]?`,"i");for(let i=0;i<lines.length;i++){let line=lines[i],match=regex.exec(line);if(match){let tag=match[1].toUpperCase(),priority=PRIORITY_MAP[tag]||"medium",text=line.substring(match.index+match[0].length).trim();if(text=text.replace(/^[/*\-\s]+/,""),text.length>MAX_TEXT_LENGTH)text=`${text.substring(0,MAX_TEXT_LENGTH-3)}...`;entries.push({file:filePath,line:i+1,tag,text,priority})}}return entries}var todo_extract=createSwarmTool({description:"Scan the codebase for TODO/FIXME/HACK/XXX/WARN/NOTE comments. Returns JSON with count by priority and sorted entries. Useful for identifying pending tasks and code issues.",args:{paths:exports_external.string().optional().describe("Directory or file to scan (default: entire project/cwd)"),tags:exports_external.string().optional().describe("Comma-separated tags to search for (default: TODO,FIXME,HACK,XXX,WARN,NOTE)")},async execute(args2,directory){let paths,tags;try{if(args2&&typeof args2==="object"){let obj=args2;paths=typeof obj.paths==="string"?obj.paths:void 0,tags=typeof obj.tags==="string"?obj.tags:void 0}}catch{}let cwd=directory,tagsInput=tags||"TODO,FIXME,HACK,XXX,WARN,NOTE",tagsValidationError=validateTagsInput(tagsInput);if(tagsValidationError){let errorResult={error:`invalid tags: ${tagsValidationError}`,total:0,byPriority:{high:0,medium:0,low:0},entries:[]};return JSON.stringify(errorResult,null,2)}let tagsList=tagsInput.split(",").map((t)=>t.trim().toUpperCase()).filter((t)=>t.length>0),tagsSet=new Set(tagsList);if(tagsSet.size===0)return JSON.stringify({error:"invalid tags: no valid tags provided",total:0,byPriority:{high:0,medium:0,low:0},entries:[]},null,2);let pathsInput=paths||cwd,{error:pathsError,resolvedPath}=validatePathsInput(pathsInput,cwd);if(pathsError){let errorResult={error:`invalid paths: ${pathsError}`,total:0,byPriority:{high:0,medium:0,low:0},entries:[]};return JSON.stringify(errorResult,null,2)}let scanPath=resolvedPath;if(!fs158.existsSync(scanPath)){let errorResult={error:`path not found: ${pathsInput}`,total:0,byPriority:{high:0,medium:0,low:0},entries:[]};return JSON.stringify(errorResult,null,2)}let filesToScan=[];if(fs158.statSync(scanPath).isFile())if(isSupportedExtension(scanPath))filesToScan.push(scanPath);else{let errorResult={error:`unsupported file extension: ${path263.extname(scanPath)}`,total:0,byPriority:{high:0,medium:0,low:0},entries:[]};return JSON.stringify(errorResult,null,2)}else findSourceFiles3(scanPath,filesToScan);let allEntries=[];for(let filePath of filesToScan)try{if(fs158.statSync(filePath).size>MAX_FILE_SIZE_BYTES10)continue;let content=fs158.readFileSync(filePath,"utf-8"),entries=parseTodoComments(content,filePath,tagsSet);allEntries.push(...entries)}catch{}allEntries.sort((a,b)=>{let priorityOrder={high:0,medium:1,low:2},priorityDiff=priorityOrder[a.priority]-priorityOrder[b.priority];if(priorityDiff!==0)return priorityDiff;return a.file.toLowerCase().localeCompare(b.file.toLowerCase())});let byPriority={high:allEntries.filter((e)=>e.priority==="high").length,medium:allEntries.filter((e)=>e.priority==="medium").length,low:allEntries.filter((e)=>e.priority==="low").length},result={total:allEntries.length,byPriority,entries:allEntries};return JSON.stringify(result,null,2)}});init_zod();init_loader();init_schema();init_qa_gate_profile();init_gate_evidence();import*as fs162 from"node:fs";import*as path267 from"node:path";init_bun_compat();import*as fs160 from"node:fs";import*as path265 from"node:path";init_warning_buffer();init_bun_compat();import*as fs159 from"node:fs";import*as path264 from"node:path";var _internals175={bunSpawn};var _swarmGitExcludedChecked=!1;function fileCoversSwarm(content){for(let rawLine of content.split(`
|
|
6284
6284
|
`)){let line=rawLine.trim();if(line.startsWith("#")||line.length===0)continue;if(line===".swarm"||line===".swarm/")return!0}return!1}var ENSURE_SWARM_GIT_EXCLUDED_OUTER_TIMEOUT_MS=3000,ENSURE_SWARM_GIT_EXCLUDED_PER_CALL_TIMEOUT_MS=1500,GIT_SPAWN_OPTIONS={timeout:ENSURE_SWARM_GIT_EXCLUDED_PER_CALL_TIMEOUT_MS,stdin:"ignore",stdout:"pipe",stderr:"pipe"};async function ensureSwarmGitExcluded(directory,options={}){if(_swarmGitExcludedChecked)return;_swarmGitExcludedChecked=!0;let{quiet:_quiet=!1}=options;try{let[[gitRootExitCode,gitRootOutput],[excludePathExitCode,excludePathRaw],checkIgnoreExitCode]=await Promise.all([(async()=>{let proc=_internals175.bunSpawn(["git","-C",directory,"rev-parse","--show-toplevel"],GIT_SPAWN_OPTIONS);try{return await Promise.all([proc.exited,proc.stdout.text()])}finally{try{proc.kill()}catch{}}})(),(async()=>{let proc=_internals175.bunSpawn(["git","-C",directory,"rev-parse","--git-path","info/exclude"],GIT_SPAWN_OPTIONS);try{return await Promise.all([proc.exited,proc.stdout.text()])}finally{try{proc.kill()}catch{}}})(),(async()=>{let proc=_internals175.bunSpawn(["git","-C",directory,"check-ignore","-q",".swarm/.gitkeep"],GIT_SPAWN_OPTIONS);try{return await proc.exited}finally{try{proc.kill()}catch{}}})()]);if(gitRootExitCode!==0)return;if(!gitRootOutput.trim())return;if(excludePathExitCode!==0)return;let excludeRelPath=excludePathRaw.trim();if(!excludeRelPath)return;let excludePath=path264.isAbsolute(excludeRelPath)?excludeRelPath:path264.join(directory,excludeRelPath);if(checkIgnoreExitCode!==0)try{fs159.mkdirSync(path264.dirname(excludePath),{recursive:!0});let existing="";try{existing=fs159.readFileSync(excludePath,"utf8")}catch{}if(!fileCoversSwarm(existing))fs159.appendFileSync(excludePath,`
|
|
6285
6285
|
# opencode-swarm local runtime state
|