opencode-swarm 7.125.4 → 7.125.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/.opencode/skills/brainstorm/SKILL.md +1 -0
  2. package/.opencode/skills/execute/SKILL.md +5 -0
  3. package/.opencode/skills/phase-wrap/SKILL.md +2 -0
  4. package/.opencode/skills/plan/SKILL.md +1 -0
  5. package/.opencode/skills/swarm-pr-feedback/SKILL.md +16 -0
  6. package/.opencode/skills/swarm-pr-review/SKILL.md +34 -0
  7. package/dist/cli/{config-doctor-rm1m07gz.js → config-doctor-akxywx0c.js} +2 -2
  8. package/dist/cli/{curation-policy-7pgdjt5w.js → curation-policy-62w2pwfz.js} +2 -2
  9. package/dist/cli/{curator-n6whbm4r.js → curator-gke6nrc4.js} +12 -12
  10. package/dist/cli/{curator-llm-factory-0hncnz9t.js → curator-llm-factory-40c4852v.js} +12 -12
  11. package/dist/cli/{guardrail-explain-8gknrsbb.js → guardrail-explain-m34vcgjg.js} +13 -13
  12. package/dist/cli/{guardrail-log-6a2zxvtx.js → guardrail-log-222xyxfp.js} +3 -3
  13. package/dist/cli/{hive-promoter-mpjq0fw9.js → hive-promoter-6fg3redm.js} +12 -12
  14. package/dist/cli/{index-vdfewvn5.js → index-0f45t7xy.js} +5 -5
  15. package/dist/cli/{index-45mvd5q7.js → index-1012f47p.js} +4 -4
  16. package/dist/cli/{index-jkwyjr8x.js → index-1cxp3b5y.js} +2 -2
  17. package/dist/cli/{index-rp5msv7n.js → index-1htanqp1.js} +1 -1
  18. package/dist/cli/{index-emzes7sj.js → index-4b1e5m0d.js} +2 -2
  19. package/dist/cli/{index-ambnwnmt.js → index-74xejn4v.js} +1 -1
  20. package/dist/cli/{index-7xg876np.js → index-d17kqe54.js} +221 -94
  21. package/dist/cli/{index-xezv6tdw.js → index-dezgmvtw.js} +1 -1
  22. package/dist/cli/{index-8tjbq2ej.js → index-e315gwc9.js} +1 -1
  23. package/dist/cli/{index-fm4zfxnr.js → index-gbnpz7rh.js} +1 -1
  24. package/dist/cli/{index-01n43w2p.js → index-gd5w3ef8.js} +3 -3
  25. package/dist/cli/{index-pk099nqv.js → index-jt7hnr7q.js} +1 -1
  26. package/dist/cli/{index-4ycq2mrp.js → index-qzkcy22e.js} +1 -1
  27. package/dist/cli/{index-414r47r7.js → index-r1gdkn2d.js} +4 -0
  28. package/dist/cli/{index-sa3dgpmc.js → index-yq4s3q43.js} +2 -2
  29. package/dist/cli/{index-hr2kzcem.js → index-zp330ss0.js} +14 -14
  30. package/dist/cli/index.js +12 -12
  31. package/dist/cli/{knowledge-escalator-gr8qd7kz.js → knowledge-escalator-h3hg7ek7.js} +3 -3
  32. package/dist/cli/{knowledge-events-q83g3f8z.js → knowledge-events-jtr66wxz.js} +1 -1
  33. package/dist/cli/{knowledge-store-qq3w5yt8.js → knowledge-store-69ttjjjs.js} +1 -1
  34. package/dist/cli/{knowledge-validator-7jhq8yam.js → knowledge-validator-yn06rh13.js} +4 -4
  35. package/dist/cli/{scan-cursor-fa5sy36q.js → scan-cursor-r0w2p5gz.js} +2 -2
  36. package/dist/cli/{schema-bw68my66.js → schema-69z8w1ka.js} +1 -1
  37. package/dist/cli/{skill-generator-ffc1agyw.js → skill-generator-a7xfyddq.js} +5 -5
  38. package/dist/commands/abort-pr-workflow.d.ts +17 -0
  39. package/dist/commands/registry.d.ts +8 -0
  40. package/dist/hooks/pr-workflow-gate.d.ts +32 -0
  41. package/dist/hooks/pr-workflow-response-gate.d.ts +48 -0
  42. package/dist/index.js +84 -67
  43. package/dist/tools/abort-pr-workflow.d.ts +5 -0
  44. package/dist/tools/index.d.ts +1 -0
  45. package/dist/tools/manifest.d.ts +1 -0
  46. package/dist/tools/tool-metadata.d.ts +4 -0
  47. 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.125.4",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",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.1.53","@opencode-ai/sdk":"^1.1.53","@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]});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"]},diff_summary:{description:"filter classified AST changes by category, risk level, or file for reviewer drill-down",agents:["architect","reviewer","critic_oversight"]},syntax_check:{description:"check syntax of source files using tree-sitter parsers across multiple languages, returning per-file errors",agents:["architect","coder","test_engineer"]},placeholder_scan:{description:"todo and FIXME comment detection",agents:["architect","reviewer"]},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"]},lint:{description:"run project linter in check or fix mode; supports biome, eslint, ruff, clippy, and more, returns structured results",agents:["architect","reviewer","coder"]},secretscan:{description:"scan for secrets (API keys, tokens, passwords) via regex and entropy; returns redacted previews, excludes common dirs",agents:["architect","reviewer","critic_oversight"]},sast_scan:{description:"static analysis security scan",agents:["architect","reviewer","critic_oversight"]},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"]},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"]},todo_extract:{description:"structured TODO/FIXME extraction",agents:["architect","researcher","docs","explorer"]},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"]},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"]},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"]},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"]},test_runner:{description:"auto-detect and run tests",agents:["architect","reviewer","test_engineer"]},test_impact:{description:"identify test files impacted by changed source files via import analysis",agents:["architect","reviewer","critic_oversight","test_engineer"]},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"]},gitingest:{description:"fetch a GitHub repository full content via gitingest.com",agents:["architect","docs","explorer"]},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"]},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"]},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"]},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"]},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"]},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"]},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"]},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.",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,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.125.6",description:"Architect-centric agentic swarm plugin for OpenCode - hub-and-spoke orchestration with SME consultation, code generation, and QA review",main:"dist/index.js",types:"dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",default:"./dist/index.js"},"./package.json":"./package.json"},bin:{"opencode-swarm":"./dist/cli/index.js"},type:"module",engines:{bun:">=1.3.13"},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",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.1.53","@opencode-ai/sdk":"^1.1.53","@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]});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"]},diff_summary:{description:"filter classified AST changes by category, risk level, or file for reviewer drill-down",agents:["architect","reviewer","critic_oversight"]},syntax_check:{description:"check syntax of source files using tree-sitter parsers across multiple languages, returning per-file errors",agents:["architect","coder","test_engineer"]},placeholder_scan:{description:"todo and FIXME comment detection",agents:["architect","reviewer"]},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"]},lint:{description:"run project linter in check or fix mode; supports biome, eslint, ruff, clippy, and more, returns structured results",agents:["architect","reviewer","coder"]},secretscan:{description:"scan for secrets (API keys, tokens, passwords) via regex and entropy; returns redacted previews, excludes common dirs",agents:["architect","reviewer","critic_oversight"]},sast_scan:{description:"static analysis security scan",agents:["architect","reviewer","critic_oversight"]},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"]},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"]},todo_extract:{description:"structured TODO/FIXME extraction",agents:["architect","researcher","docs","explorer"]},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"]},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"]},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"]},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"]},test_runner:{description:"auto-detect and run tests",agents:["architect","reviewer","test_engineer"]},test_impact:{description:"identify test files impacted by changed source files via import analysis",agents:["architect","reviewer","critic_oversight","test_engineer"]},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"]},gitingest:{description:"fetch a GitHub repository full content via gitingest.com",agents:["architect","docs","explorer"]},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"]},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"]},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"]},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"]},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"]},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"]},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"]},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.",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,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
 
@@ -166,7 +166,15 @@ ${append}`;return base}import{randomUUID}from"node:crypto";import*as fsp from"no
166
166
  GFS4: `),console.error(m)};if(!fs4[gracefulQueue]){if(queue=global[gracefulQueue]||[],publishQueue(fs4,queue),fs4.close=function(fs$close){function close(fd,cb){return fs$close.call(fs4,fd,function(err){if(!err)resetQueue();if(typeof cb==="function")cb.apply(this,arguments)})}return Object.defineProperty(close,previousSymbol,{value:fs$close}),close}(fs4.close),fs4.closeSync=function(fs$closeSync){function closeSync(fd){fs$closeSync.apply(fs4,arguments),resetQueue()}return Object.defineProperty(closeSync,previousSymbol,{value:fs$closeSync}),closeSync}(fs4.closeSync),/\bgfs4\b/i.test(process.env.NODE_DEBUG||""))process.on("exit",function(){debug(fs4[gracefulQueue]),__require("assert").equal(fs4[gracefulQueue].length,0)})}var queue;if(!global[gracefulQueue])publishQueue(global,fs4[gracefulQueue]);module.exports=patch(clone2(fs4));if(process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH&&!fs4.__patched)module.exports=patch(fs4),fs4.__patched=!0;function patch(fs5){polyfills(fs5),fs5.gracefulify=patch,fs5.createReadStream=createReadStream,fs5.createWriteStream=createWriteStream;var fs$readFile=fs5.readFile;fs5.readFile=readFile4;function readFile4(path7,options,cb){if(typeof options==="function")cb=options,options=null;return go$readFile(path7,options,cb);function go$readFile(path8,options2,cb2,startTime){return fs$readFile(path8,options2,function(err){if(err&&(err.code==="EMFILE"||err.code==="ENFILE"))enqueue([go$readFile,[path8,options2,cb2],err,startTime||Date.now(),Date.now()]);else if(typeof cb2==="function")cb2.apply(this,arguments)})}}var fs$writeFile=fs5.writeFile;fs5.writeFile=writeFile3;function writeFile3(path7,data,options,cb){if(typeof options==="function")cb=options,options=null;return go$writeFile(path7,data,options,cb);function go$writeFile(path8,data2,options2,cb2,startTime){return fs$writeFile(path8,data2,options2,function(err){if(err&&(err.code==="EMFILE"||err.code==="ENFILE"))enqueue([go$writeFile,[path8,data2,options2,cb2],err,startTime||Date.now(),Date.now()]);else if(typeof cb2==="function")cb2.apply(this,arguments)})}}var fs$appendFile=fs5.appendFile;if(fs$appendFile)fs5.appendFile=appendFile;function appendFile(path7,data,options,cb){if(typeof options==="function")cb=options,options=null;return go$appendFile(path7,data,options,cb);function go$appendFile(path8,data2,options2,cb2,startTime){return fs$appendFile(path8,data2,options2,function(err){if(err&&(err.code==="EMFILE"||err.code==="ENFILE"))enqueue([go$appendFile,[path8,data2,options2,cb2],err,startTime||Date.now(),Date.now()]);else if(typeof cb2==="function")cb2.apply(this,arguments)})}}var fs$copyFile=fs5.copyFile;if(fs$copyFile)fs5.copyFile=copyFile2;function copyFile2(src,dest,flags,cb){if(typeof flags==="function")cb=flags,flags=0;return go$copyFile(src,dest,flags,cb);function go$copyFile(src2,dest2,flags2,cb2,startTime){return fs$copyFile(src2,dest2,flags2,function(err){if(err&&(err.code==="EMFILE"||err.code==="ENFILE"))enqueue([go$copyFile,[src2,dest2,flags2,cb2],err,startTime||Date.now(),Date.now()]);else if(typeof cb2==="function")cb2.apply(this,arguments)})}}var fs$readdir=fs5.readdir;fs5.readdir=readdir2;var noReaddirOptionVersions=/^v[0-5]\./;function readdir2(path7,options,cb){if(typeof options==="function")cb=options,options=null;var go$readdir=noReaddirOptionVersions.test(process.version)?function(path8,options2,cb2,startTime){return fs$readdir(path8,fs$readdirCallback(path8,options2,cb2,startTime))}:function(path8,options2,cb2,startTime){return fs$readdir(path8,options2,fs$readdirCallback(path8,options2,cb2,startTime))};return go$readdir(path7,options,cb);function fs$readdirCallback(path8,options2,cb2,startTime){return function(err,files){if(err&&(err.code==="EMFILE"||err.code==="ENFILE"))enqueue([go$readdir,[path8,options2,cb2],err,startTime||Date.now(),Date.now()]);else{if(files&&files.sort)files.sort();if(typeof cb2==="function")cb2.call(this,err,files)}}}}if(process.version.substr(0,4)==="v0.8"){var legStreams=legacy(fs5);ReadStream=legStreams.ReadStream,WriteStream=legStreams.WriteStream}var fs$ReadStream=fs5.ReadStream;if(fs$ReadStream)ReadStream.prototype=Object.create(fs$ReadStream.prototype),ReadStream.prototype.open=ReadStream$open;var fs$WriteStream=fs5.WriteStream;if(fs$WriteStream)WriteStream.prototype=Object.create(fs$WriteStream.prototype),WriteStream.prototype.open=WriteStream$open;Object.defineProperty(fs5,"ReadStream",{get:function(){return ReadStream},set:function(val){ReadStream=val},enumerable:!0,configurable:!0}),Object.defineProperty(fs5,"WriteStream",{get:function(){return WriteStream},set:function(val){WriteStream=val},enumerable:!0,configurable:!0});var FileReadStream=ReadStream;Object.defineProperty(fs5,"FileReadStream",{get:function(){return FileReadStream},set:function(val){FileReadStream=val},enumerable:!0,configurable:!0});var FileWriteStream=WriteStream;Object.defineProperty(fs5,"FileWriteStream",{get:function(){return FileWriteStream},set:function(val){FileWriteStream=val},enumerable:!0,configurable:!0});function ReadStream(path7,options){if(this instanceof ReadStream)return fs$ReadStream.apply(this,arguments),this;else return ReadStream.apply(Object.create(ReadStream.prototype),arguments)}function ReadStream$open(){var that=this;open2(that.path,that.flags,that.mode,function(err,fd){if(err){if(that.autoClose)that.destroy();that.emit("error",err)}else that.fd=fd,that.emit("open",fd),that.read()})}function WriteStream(path7,options){if(this instanceof WriteStream)return fs$WriteStream.apply(this,arguments),this;else return WriteStream.apply(Object.create(WriteStream.prototype),arguments)}function WriteStream$open(){var that=this;open2(that.path,that.flags,that.mode,function(err,fd){if(err)that.destroy(),that.emit("error",err);else that.fd=fd,that.emit("open",fd)})}function createReadStream(path7,options){return new fs5.ReadStream(path7,options)}function createWriteStream(path7,options){return new fs5.WriteStream(path7,options)}var fs$open=fs5.open;fs5.open=open2;function open2(path7,flags,mode,cb){if(typeof mode==="function")cb=mode,mode=null;return go$open(path7,flags,mode,cb);function go$open(path8,flags2,mode2,cb2,startTime){return fs$open(path8,flags2,mode2,function(err,fd){if(err&&(err.code==="EMFILE"||err.code==="ENFILE"))enqueue([go$open,[path8,flags2,mode2,cb2],err,startTime||Date.now(),Date.now()]);else if(typeof cb2==="function")cb2.apply(this,arguments)})}}return fs5}function enqueue(elem){debug("ENQUEUE",elem[0].name,elem[1]),fs4[gracefulQueue].push(elem),retry()}var retryTimer;function resetQueue(){var now=Date.now();for(var i=0;i<fs4[gracefulQueue].length;++i)if(fs4[gracefulQueue][i].length>2)fs4[gracefulQueue][i][3]=now,fs4[gracefulQueue][i][4]=now;retry()}function retry(){if(clearTimeout(retryTimer),retryTimer=void 0,fs4[gracefulQueue].length===0)return;var elem=fs4[gracefulQueue].shift(),fn2=elem[0],args2=elem[1],err=elem[2],startTime=elem[3],lastTime=elem[4];if(startTime===void 0)debug("RETRY",fn2.name,args2),fn2.apply(null,args2);else if(Date.now()-startTime>=60000){debug("TIMEOUT",fn2.name,args2);var cb=args2.pop();if(typeof cb==="function")cb.call(null,err)}else{var sinceAttempt=Date.now()-lastTime,sinceStart=Math.max(lastTime-startTime,1),desiredDelay=Math.min(sinceStart*1.2,100);if(sinceAttempt>=desiredDelay)debug("RETRY",fn2.name,args2),fn2.apply(null,args2.concat([startTime]));else fs4[gracefulQueue].push(elem)}if(retryTimer===void 0)retryTimer=setTimeout(retry,0)}});var require_retry_operation=__commonJS((exports,module)=>{function RetryOperation(timeouts,options){if(typeof options==="boolean")options={forever:options};if(this._originalTimeouts=JSON.parse(JSON.stringify(timeouts)),this._timeouts=timeouts,this._options=options||{},this._maxRetryTime=options&&options.maxRetryTime||1/0,this._fn=null,this._errors=[],this._attempts=1,this._operationTimeout=null,this._operationTimeoutCb=null,this._timeout=null,this._operationStart=null,this._options.forever)this._cachedTimeouts=this._timeouts.slice(0)}module.exports=RetryOperation;RetryOperation.prototype.reset=function(){this._attempts=1,this._timeouts=this._originalTimeouts};RetryOperation.prototype.stop=function(){if(this._timeout)clearTimeout(this._timeout);this._timeouts=[],this._cachedTimeouts=null};RetryOperation.prototype.retry=function(err){if(this._timeout)clearTimeout(this._timeout);if(!err)return!1;var currentTime=new Date().getTime();if(err&&currentTime-this._operationStart>=this._maxRetryTime)return this._errors.unshift(Error("RetryOperation timeout occurred")),!1;this._errors.push(err);var timeout=this._timeouts.shift();if(timeout===void 0)if(this._cachedTimeouts)this._errors.splice(this._errors.length-1,this._errors.length),this._timeouts=this._cachedTimeouts.slice(0),timeout=this._timeouts.shift();else return!1;var self=this,timer=setTimeout(function(){if(self._attempts++,self._operationTimeoutCb){if(self._timeout=setTimeout(function(){self._operationTimeoutCb(self._attempts)},self._operationTimeout),self._options.unref)self._timeout.unref()}self._fn(self._attempts)},timeout);if(this._options.unref)timer.unref();return!0};RetryOperation.prototype.attempt=function(fn2,timeoutOps){if(this._fn=fn2,timeoutOps){if(timeoutOps.timeout)this._operationTimeout=timeoutOps.timeout;if(timeoutOps.cb)this._operationTimeoutCb=timeoutOps.cb}var self=this;if(this._operationTimeoutCb)this._timeout=setTimeout(function(){self._operationTimeoutCb()},self._operationTimeout);this._operationStart=new Date().getTime(),this._fn(this._attempts)};RetryOperation.prototype.try=function(fn2){console.log("Using RetryOperation.try() is deprecated"),this.attempt(fn2)};RetryOperation.prototype.start=function(fn2){console.log("Using RetryOperation.start() is deprecated"),this.attempt(fn2)};RetryOperation.prototype.start=RetryOperation.prototype.try;RetryOperation.prototype.errors=function(){return this._errors};RetryOperation.prototype.attempts=function(){return this._attempts};RetryOperation.prototype.mainError=function(){if(this._errors.length===0)return null;var counts={},mainError=null,mainErrorCount=0;for(var i=0;i<this._errors.length;i++){var error49=this._errors[i],message=error49.message,count=(counts[message]||0)+1;if(counts[message]=count,count>=mainErrorCount)mainError=error49,mainErrorCount=count}return mainError}});var require_retry=__commonJS((exports)=>{var RetryOperation=require_retry_operation();exports.operation=function(options){var timeouts=exports.timeouts(options);return new RetryOperation(timeouts,{forever:options&&options.forever,unref:options&&options.unref,maxRetryTime:options&&options.maxRetryTime})};exports.timeouts=function(options){if(options instanceof Array)return[].concat(options);var opts={retries:10,factor:2,minTimeout:1000,maxTimeout:1/0,randomize:!1};for(var key in options)opts[key]=options[key];if(opts.minTimeout>opts.maxTimeout)throw Error("minTimeout is greater than maxTimeout");var timeouts=[];for(var i=0;i<opts.retries;i++)timeouts.push(this.createTimeout(i,opts));if(options&&options.forever&&!timeouts.length)timeouts.push(this.createTimeout(i,opts));return timeouts.sort(function(a,b){return a-b}),timeouts};exports.createTimeout=function(attempt,opts){var random=opts.randomize?Math.random()+1:1,timeout=Math.round(random*opts.minTimeout*Math.pow(opts.factor,attempt));return timeout=Math.min(timeout,opts.maxTimeout),timeout};exports.wrap=function(obj,options,methods){if(options instanceof Array)methods=options,options=null;if(!methods){methods=[];for(var key in obj)if(typeof obj[key]==="function")methods.push(key)}for(var i=0;i<methods.length;i++){var method=methods[i],original=obj[method];obj[method]=function(original2){var op=exports.operation(options),args2=Array.prototype.slice.call(arguments,1),callback=args2.pop();args2.push(function(err){if(op.retry(err))return;if(err)arguments[0]=op.mainError();callback.apply(this,arguments)}),op.attempt(function(){original2.apply(obj,args2)})}.bind(obj,original),obj[method].options=options}}});var require_signals=__commonJS((exports,module)=>{module.exports=["SIGABRT","SIGALRM","SIGHUP","SIGINT","SIGTERM"];if(process.platform!=="win32")module.exports.push("SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT");if(process.platform==="linux")module.exports.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT","SIGUNUSED")});var require_signal_exit=__commonJS((exports,module)=>{var process3=global.process,processOk=function(process4){return process4&&typeof process4==="object"&&typeof process4.removeListener==="function"&&typeof process4.emit==="function"&&typeof process4.reallyExit==="function"&&typeof process4.listeners==="function"&&typeof process4.kill==="function"&&typeof process4.pid==="number"&&typeof process4.on==="function"};if(!processOk(process3))module.exports=function(){return function(){}};else{if(assert2=__require("assert"),signals=require_signals(),isWin=/^win/i.test(process3.platform),EE=__require("events"),typeof EE!=="function")EE=EE.EventEmitter;if(process3.__signal_exit_emitter__)emitter=process3.__signal_exit_emitter__;else emitter=process3.__signal_exit_emitter__=new EE,emitter.count=0,emitter.emitted={};if(!emitter.infinite)emitter.setMaxListeners(1/0),emitter.infinite=!0;module.exports=function(cb,opts){if(!processOk(global.process))return function(){};if(assert2.equal(typeof cb,"function","a callback must be provided for exit handler"),loaded===!1)load();var ev="exit";if(opts&&opts.alwaysLast)ev="afterexit";var remove=function(){if(emitter.removeListener(ev,cb),emitter.listeners("exit").length===0&&emitter.listeners("afterexit").length===0)unload()};return emitter.on(ev,cb),remove},unload=function(){if(!loaded||!processOk(global.process))return;loaded=!1,signals.forEach(function(sig){try{process3.removeListener(sig,sigListeners[sig])}catch(er){}}),process3.emit=originalProcessEmit,process3.reallyExit=originalProcessReallyExit,emitter.count-=1},module.exports.unload=unload,emit=function(event,code,signal){if(emitter.emitted[event])return;emitter.emitted[event]=!0,emitter.emit(event,code,signal)},sigListeners={},signals.forEach(function(sig){sigListeners[sig]=function(){if(!processOk(global.process))return;var listeners=process3.listeners(sig);if(listeners.length===emitter.count){if(unload(),emit("exit",null,sig),emit("afterexit",null,sig),isWin&&sig==="SIGHUP")sig="SIGINT";process3.kill(process3.pid,sig)}}}),module.exports.signals=function(){return signals},loaded=!1,load=function(){if(loaded||!processOk(global.process))return;loaded=!0,emitter.count+=1,signals=signals.filter(function(sig){try{return process3.on(sig,sigListeners[sig]),!0}catch(er){return!1}}),process3.emit=processEmit,process3.reallyExit=processReallyExit},module.exports.load=load,originalProcessReallyExit=process3.reallyExit,processReallyExit=function(code){if(!processOk(global.process))return;process3.exitCode=code||0,emit("exit",process3.exitCode,null),emit("afterexit",process3.exitCode,null),originalProcessReallyExit.call(process3,process3.exitCode)},originalProcessEmit=process3.emit,processEmit=function(ev,arg){if(ev==="exit"&&processOk(global.process)){if(arg!==void 0)process3.exitCode=arg;var ret=originalProcessEmit.apply(this,arguments);return emit("exit",process3.exitCode,null),emit("afterexit",process3.exitCode,null),ret}else return originalProcessEmit.apply(this,arguments)}}var assert2,signals,isWin,EE,emitter,unload,emit,sigListeners,loaded,load,originalProcessReallyExit,processReallyExit,originalProcessEmit,processEmit});var require_mtime_precision=__commonJS((exports,module)=>{var cacheSymbol=Symbol();function probe(file2,fs4,callback){let cachedPrecision=fs4[cacheSymbol];if(cachedPrecision)return fs4.stat(file2,(err,stat5)=>{if(err)return callback(err);callback(null,stat5.mtime,cachedPrecision)});let mtime=new Date(Math.ceil(Date.now()/1000)*1000+5);fs4.utimes(file2,mtime,mtime,(err)=>{if(err)return callback(err);fs4.stat(file2,(err2,stat5)=>{if(err2)return callback(err2);let precision=stat5.mtime.getTime()%1000===0?"s":"ms";Object.defineProperty(fs4,cacheSymbol,{value:precision}),callback(null,stat5.mtime,precision)})})}function getMtime(precision){let now=Date.now();if(precision==="s")now=Math.ceil(now/1000)*1000;return new Date(now)}exports.probe=probe;exports.getMtime=getMtime});var require_lockfile=__commonJS((exports,module)=>{var path7=__require("path"),fs4=require_graceful_fs(),retry=require_retry(),onExit=require_signal_exit(),mtimePrecision=require_mtime_precision(),locks={};function getLockFile(file2,options){return options.lockfilePath||`${file2}.lock`}function resolveCanonicalPath(file2,options,callback){if(!options.realpath)return callback(null,path7.resolve(file2));options.fs.realpath(file2,callback)}function acquireLock(file2,options,callback){let lockfilePath=getLockFile(file2,options);options.fs.mkdir(lockfilePath,(err)=>{if(!err)return mtimePrecision.probe(lockfilePath,options.fs,(err2,mtime,mtimePrecision2)=>{if(err2)return options.fs.rmdir(lockfilePath,()=>{}),callback(err2);callback(null,mtime,mtimePrecision2)});if(err.code!=="EEXIST")return callback(err);if(options.stale<=0)return callback(Object.assign(Error("Lock file is already being held"),{code:"ELOCKED",file:file2}));options.fs.stat(lockfilePath,(err2,stat5)=>{if(err2){if(err2.code==="ENOENT")return acquireLock(file2,{...options,stale:0},callback);return callback(err2)}if(!isLockStale(stat5,options))return callback(Object.assign(Error("Lock file is already being held"),{code:"ELOCKED",file:file2}));removeLock(file2,options,(err3)=>{if(err3)return callback(err3);acquireLock(file2,{...options,stale:0},callback)})})})}function isLockStale(stat5,options){return stat5.mtime.getTime()<Date.now()-options.stale}function removeLock(file2,options,callback){options.fs.rmdir(getLockFile(file2,options),(err)=>{if(err&&err.code!=="ENOENT")return callback(err);callback()})}function updateLock(file2,options){let lock2=locks[file2];if(lock2.updateTimeout)return;if(lock2.updateDelay=lock2.updateDelay||options.update,lock2.updateTimeout=setTimeout(()=>{lock2.updateTimeout=null,options.fs.stat(lock2.lockfilePath,(err,stat5)=>{let isOverThreshold=lock2.lastUpdate+options.stale<Date.now();if(err){if(err.code==="ENOENT"||isOverThreshold)return setLockAsCompromised(file2,lock2,Object.assign(err,{code:"ECOMPROMISED"}));return lock2.updateDelay=1000,updateLock(file2,options)}if(lock2.mtime.getTime()!==stat5.mtime.getTime())return setLockAsCompromised(file2,lock2,Object.assign(Error("Unable to update lock within the stale threshold"),{code:"ECOMPROMISED"}));let mtime=mtimePrecision.getMtime(lock2.mtimePrecision);options.fs.utimes(lock2.lockfilePath,mtime,mtime,(err2)=>{let isOverThreshold2=lock2.lastUpdate+options.stale<Date.now();if(lock2.released)return;if(err2){if(err2.code==="ENOENT"||isOverThreshold2)return setLockAsCompromised(file2,lock2,Object.assign(err2,{code:"ECOMPROMISED"}));return lock2.updateDelay=1000,updateLock(file2,options)}lock2.mtime=mtime,lock2.lastUpdate=Date.now(),lock2.updateDelay=null,updateLock(file2,options)})})},lock2.updateDelay),lock2.updateTimeout.unref)lock2.updateTimeout.unref()}function setLockAsCompromised(file2,lock2,err){if(lock2.released=!0,lock2.updateTimeout)clearTimeout(lock2.updateTimeout);if(locks[file2]===lock2)delete locks[file2];lock2.options.onCompromised(err)}function lock(file2,options,callback){options={stale:1e4,update:null,realpath:!0,retries:0,fs:fs4,onCompromised:(err)=>{throw err},...options},options.retries=options.retries||0,options.retries=typeof options.retries==="number"?{retries:options.retries}:options.retries,options.stale=Math.max(options.stale||0,2000),options.update=options.update==null?options.stale/2:options.update||0,options.update=Math.max(Math.min(options.update,options.stale/2),1000),resolveCanonicalPath(file2,options,(err,file3)=>{if(err)return callback(err);let operation=retry.operation(options.retries);operation.attempt(()=>{acquireLock(file3,options,(err2,mtime,mtimePrecision2)=>{if(operation.retry(err2))return;if(err2)return callback(operation.mainError());let lock2=locks[file3]={lockfilePath:getLockFile(file3,options),mtime,mtimePrecision:mtimePrecision2,options,lastUpdate:Date.now()};updateLock(file3,options),callback(null,(releasedCallback)=>{if(lock2.released)return releasedCallback&&releasedCallback(Object.assign(Error("Lock is already released"),{code:"ERELEASED"}));unlock(file3,{...options,realpath:!1},releasedCallback)})})})})}function unlock(file2,options,callback){options={fs:fs4,realpath:!0,...options},resolveCanonicalPath(file2,options,(err,file3)=>{if(err)return callback(err);let lock2=locks[file3];if(!lock2)return callback(Object.assign(Error("Lock is not acquired/owned by you"),{code:"ENOTACQUIRED"}));lock2.updateTimeout&&clearTimeout(lock2.updateTimeout),lock2.released=!0,delete locks[file3],removeLock(file3,options,callback)})}function check2(file2,options,callback){options={stale:1e4,realpath:!0,fs:fs4,...options},options.stale=Math.max(options.stale||0,2000),resolveCanonicalPath(file2,options,(err,file3)=>{if(err)return callback(err);options.fs.stat(getLockFile(file3,options),(err2,stat5)=>{if(err2)return err2.code==="ENOENT"?callback(null,!1):callback(err2);return callback(null,!isLockStale(stat5,options))})})}function getLocks(){return locks}onExit(()=>{for(let file2 in locks){let options=locks[file2].options;try{options.fs.rmdirSync(getLockFile(file2,options))}catch(e){}}});exports.lock=lock;exports.unlock=unlock;exports.check=check2;exports.getLocks=getLocks});var require_adapter=__commonJS((exports,module)=>{var fs4=require_graceful_fs();function createSyncFs(fs5){let methods=["mkdir","realpath","stat","rmdir","utimes"],newFs={...fs5};return methods.forEach((method)=>{newFs[method]=(...args2)=>{let callback=args2.pop(),ret;try{ret=fs5[`${method}Sync`](...args2)}catch(err){return callback(err)}callback(null,ret)}}),newFs}function toPromise(method){return(...args2)=>new Promise((resolve4,reject)=>{args2.push((err,result)=>{if(err)reject(err);else resolve4(result)}),method(...args2)})}function toSync(method){return(...args2)=>{let err,result;if(args2.push((_err,_result)=>{err=_err,result=_result}),method(...args2),err)throw err;return result}}function toSyncOptions(options){if(options={...options},options.fs=createSyncFs(options.fs||fs4),typeof options.retries==="number"&&options.retries>0||options.retries&&typeof options.retries.retries==="number"&&options.retries.retries>0)throw Object.assign(Error("Cannot use retries with the sync api"),{code:"ESYNC"});return options}module.exports={toPromise,toSync,toSyncOptions}});var require_proper_lockfile=__commonJS((exports,module)=>{var lockfile=require_lockfile(),{toPromise,toSync,toSyncOptions}=require_adapter();async function lock(file2,options){let release=await toPromise(lockfile.lock)(file2,options);return toPromise(release)}function lockSync(file2,options){let release=toSync(lockfile.lock)(file2,toSyncOptions(options));return toSync(release)}function unlock(file2,options){return toPromise(lockfile.unlock)(file2,options)}function unlockSync(file2,options){return toSync(lockfile.unlock)(file2,toSyncOptions(options))}function check2(file2,options){return toPromise(lockfile.check)(file2,options)}function checkSync(file2,options){return toSync(lockfile.check)(file2,toSyncOptions(options))}module.exports=lock;module.exports.lock=lock;module.exports.unlock=unlock;module.exports.lockSync=lockSync;module.exports.unlockSync=unlockSync;module.exports.check=check2;module.exports.checkSync=checkSync});import*as crypto2 from"node:crypto";import*as fs4 from"node:fs";import*as path7 from"node:path";function getLockFilePath(directory,filePath){let normalized=path7.resolve(directory,filePath),baseDir=path7.resolve(directory)+path7.sep;if(!(process.platform==="win32"?normalized.toLowerCase().startsWith(baseDir.toLowerCase()):normalized.startsWith(baseDir)))throw Error("Invalid file path: path traversal not allowed");let pathForHash=process.platform==="win32"?normalized.toLowerCase():normalized,hash2=crypto2.createHash("sha256").update(pathForHash).digest("hex"),lockPath=path7.join(directory,LOCKS_DIR,`${hash2}.lock`),legacyPaths=[pathForHash];if(process.platform==="win32"&&normalized!==pathForHash)legacyPaths.push(normalized);for(let legacyPath of legacyPaths){let oldHash=Buffer.from(legacyPath).toString("base64").replace(/[/+=]/g,"_"),oldLockPath=path7.join(directory,LOCKS_DIR,`${oldHash}.lock`);if(fs4.existsSync(oldLockPath))return oldLockPath}return lockPath}function getMetaPath(lockPath){return`${lockPath.replace(/\.lock$/,"")}.meta`}async function writeMetaFile(metaPath,metadata){let tmpPath=`${metaPath}.tmp`;try{await _internals4.writeFile(tmpPath,JSON.stringify(metadata),"utf-8"),await fs4.promises.rename(tmpPath,metaPath)}catch(err){try{await fs4.promises.unlink(tmpPath)}catch{}throw err}}function readMetaFile(metaPath){try{let content=fs4.readFileSync(metaPath,"utf-8");return JSON.parse(content)}catch{return null}}async function tryAcquireLock(directory,filePath,agent,taskId){let lockPath=getLockFilePath(directory,filePath),locksDir=path7.dirname(lockPath);if(!fs4.existsSync(locksDir))fs4.mkdirSync(locksDir,{recursive:!0});if(!fs4.existsSync(lockPath))fs4.writeFileSync(lockPath,"","utf-8");let release;try{release=await import_proper_lockfile.default.lock(lockPath,{stale:LOCK_TIMEOUT_MS,retries:{retries:5,minTimeout:10,maxTimeout:500,factor:2},realpath:!1})}catch(err){let code=err.code;if(code==="ELOCKED"||code==="EEXIST")return{acquired:!1};throw err}return{acquired:!0,lock:{filePath,agent,taskId,timestamp:new Date().toISOString(),expiresAt:Date.now()+LOCK_TIMEOUT_MS,_release:release}}}function isLocked(directory,filePath){let plLockDir=`${getLockFilePath(directory,filePath)}.lock`;if(fs4.existsSync(plLockDir)){let acquiredAt=Date.now();try{acquiredAt=fs4.statSync(plLockDir).mtimeMs}catch{}return{filePath,agent:"unknown",taskId:"unknown",timestamp:new Date(acquiredAt).toISOString(),expiresAt:acquiredAt+LOCK_TIMEOUT_MS}}return null}function listActiveLocks(directory){let locksDir=path7.join(directory,LOCKS_DIR),locks=[];if(!fs4.existsSync(locksDir))return locks;let files=fs4.readdirSync(locksDir),now=Date.now();for(let file2 of files){if(!file2.endsWith(".lock"))continue;let lockPath=path7.join(locksDir,file2);try{if(fs4.statSync(lockPath).isFile()){let plLockDir=`${lockPath}.lock`;if(fs4.existsSync(plLockDir)){let metaPath=getMetaPath(lockPath),meta3=readMetaFile(metaPath);if(meta3){if(meta3.expiresAt<now)continue;locks.push({filePath:meta3.originalPath,agent:meta3.agent,taskId:meta3.taskId,timestamp:meta3.acquiredAt,expiresAt:meta3.expiresAt,laneId:meta3.laneId})}else{let acquiredAt=Date.now();try{acquiredAt=fs4.statSync(plLockDir).mtimeMs}catch{}let expiresAt=acquiredAt+LOCK_TIMEOUT_MS;if(expiresAt<now)continue;locks.push({filePath:file2,agent:"unknown",taskId:"unknown",timestamp:new Date(acquiredAt).toISOString(),expiresAt})}}}}catch{}}return locks}async function acquireLaneLocks(directory,laneId,files,agent,taskId,sessionID){let acquiredLocks=[],conflicts=[];for(let file2 of files){let result=await tryAcquireLock(directory,file2,agent,taskId);if(!result.acquired){for(let lock of acquiredLocks)try{if(lock._release)await lock._release();let lockPath2=getLockFilePath(directory,lock.filePath),metaPath2=getMetaPath(lockPath2);try{fs4.unlinkSync(metaPath2)}catch{}try{fs4.unlinkSync(lockPath2)}catch{}}catch{}return conflicts.push(file2),{acquired:!1,conflicts}}let lockPath=getLockFilePath(directory,file2),metaPath=getMetaPath(lockPath),meta3={originalPath:file2,laneId,taskId,agent,sessionID,acquiredAt:result.lock.timestamp,expiresAt:result.lock.expiresAt};try{await writeMetaFile(metaPath,meta3)}catch(err){for(let lock of acquiredLocks)try{if(lock._release)await lock._release();let lp=getLockFilePath(directory,lock.filePath),mp=getMetaPath(lp);try{fs4.unlinkSync(mp)}catch{}try{fs4.unlinkSync(lp)}catch{}}catch{}if(result.lock._release)await result.lock._release();try{fs4.unlinkSync(lockPath)}catch{}throw err}result.lock.laneId=laneId,acquiredLocks.push(result.lock)}return{acquired:!0,locks:acquiredLocks}}async function releaseLaneLocks(directory,laneId){let locksDir=path7.join(directory,LOCKS_DIR);if(!fs4.existsSync(locksDir))return 0;let files=fs4.readdirSync(locksDir),releasedCount=0;for(let file2 of files){if(!file2.endsWith(".meta"))continue;let metaPath=path7.join(locksDir,file2),meta3=readMetaFile(metaPath);if(!meta3||meta3.laneId!==laneId)continue;let lockPath=metaPath.replace(/\.meta$/,".lock");try{try{await import_proper_lockfile.default.unlock(lockPath,{realpath:!1})}catch{}try{fs4.unlinkSync(lockPath)}catch{}try{fs4.unlinkSync(metaPath)}catch{}releasedCount++}catch{}}return releasedCount}var import_proper_lockfile,LOCKS_DIR=".swarm/locks",LOCK_TIMEOUT_MS=300000,_internals4;var init_file_locks=__esm(()=>{import_proper_lockfile=__toESM(require_proper_lockfile(),1),_internals4={tryAcquireLock,writeFile:fs4.promises.writeFile}});var exports_telemetry={};__export(exports_telemetry,{telemetry:()=>telemetry,rotateTelemetryIfNeeded:()=>rotateTelemetryIfNeeded,resetTelemetryForTesting:()=>resetTelemetryForTesting,initTelemetry:()=>initTelemetry,emit:()=>emit,addTelemetryListener:()=>addTelemetryListener,_internals:()=>_internals5,ROTATION_CHECK_INTERVAL:()=>ROTATION_CHECK_INTERVAL});import*as fs5 from"node:fs";import{createWriteStream}from"node:fs";import*as os2 from"node:os";import*as path8 from"node:path";function resetTelemetryForTesting(){if(_disabled=!1,_projectDirectory=null,_listeners.length=0,_emitCount=0,_writeStream!==null)_writeStream.end(),_writeStream=null}function initTelemetry(projectDirectory){if(_writeStream!==null||_disabled)return;try{_projectDirectory=projectDirectory;let swarmDir=path8.join(projectDirectory,".swarm");if(!fs5.existsSync(swarmDir))fs5.mkdirSync(swarmDir,{recursive:!0});let telemetryPath=path8.join(swarmDir,"telemetry.jsonl"),stream=createWriteStream(telemetryPath,{flags:"a"});stream.on("error",()=>{if(_writeStream===stream)_disabled=!0,_writeStream=null}),_writeStream=stream}catch{_disabled=!0,_writeStream=null}}function emit(event,data){try{if(_disabled||_writeStream===null)return;let line=JSON.stringify({timestamp:new Date().toISOString(),event,...data})+os2.EOL,stream=_writeStream;stream.write(line,(err)=>{if(err&&_writeStream===stream)_disabled=!0,_writeStream=null});for(let listener of _listeners)try{listener(event,data)}catch{}if(_emitCount++,_emitCount>=ROTATION_CHECK_INTERVAL)_emitCount=0,_internals5.rotateTelemetryIfNeeded()}catch{}}function addTelemetryListener(callback){_listeners.push(callback)}function rotateTelemetryIfNeeded(maxBytes=10485760){try{if(_projectDirectory===null)return;let telemetryPath=path8.join(_projectDirectory,".swarm","telemetry.jsonl");if(!fs5.existsSync(telemetryPath))return;if(fs5.statSync(telemetryPath).size<maxBytes)return;let rotatedPath=path8.join(_projectDirectory,".swarm","telemetry.jsonl.1");if(fs5.renameSync(telemetryPath,rotatedPath),_writeStream!==null){_writeStream.end();let stream=createWriteStream(telemetryPath,{flags:"a"});stream.on("error",()=>{if(_writeStream===stream)_disabled=!0,_writeStream=null}),_writeStream=stream}}catch{}}var _writeStream=null,_projectDirectory=null,_listeners,_disabled=!1,_emitCount=0,ROTATION_CHECK_INTERVAL=50,telemetry,_internals5;var init_telemetry=__esm(()=>{_listeners=[];telemetry={sessionStarted(sessionId,agentName){_internals5.emit("session_started",{sessionId,agentName})},sessionEnded(sessionId,reason){_internals5.emit("session_ended",{sessionId,reason})},agentActivated(sessionId,agentName,oldName){_internals5.emit("agent_activated",{sessionId,agentName,oldName})},delegationBegin(sessionId,agentName,taskId){_internals5.emit("delegation_begin",{sessionId,agentName,taskId})},delegationEnd(sessionId,agentName,taskId,result,costFields){_internals5.emit("delegation_end",{sessionId,agentName,taskId,result,tokens_input:costFields?.tokens_input??0,tokens_output:costFields?.tokens_output??0,tokens_reasoning:costFields?.tokens_reasoning??0,tokens_cache:costFields?.tokens_cache??0,cost_usd:costFields?.cost_usd??null,cost_source:costFields?.cost_source??"unavailable",model:costFields?.model,gate:costFields?.gate,retry_index:costFields?.retry_index})},taskStateChanged(sessionId,taskId,newState,oldState){_internals5.emit("task_state_changed",{sessionId,taskId,newState,oldState})},gatePassed(sessionId,gate,taskId){_internals5.emit("gate_passed",{sessionId,gate,taskId})},gateParseError(taskId,error49){_internals5.emit("gate_parse_error",{taskId,errorName:error49.name,errorMessage:error49.message.slice(0,200)})},gateFailed(sessionId,gate,taskId,reason){_internals5.emit("gate_failed",{sessionId,gate,taskId,reason})},reviewerGateDecision(sessionId,taskId,blocked,reasonCode,evidenceKind){_internals5.emit("reviewer_gate_decision",{sessionId,gate:"qa_gate",taskId,blocked,allowed:!blocked,reasonCode,evidenceKind})},phaseChanged(sessionId,oldPhase,newPhase){_internals5.emit("phase_changed",{sessionId,oldPhase,newPhase})},budgetUpdated(sessionId,budgetPct,agentName){_internals5.emit("budget_updated",{sessionId,budgetPct,agentName})},modelFallback(sessionId,agentName,fromModel,toModel,reason){_internals5.emit("model_fallback",{sessionId,agentName,fromModel,toModel,reason})},hardLimitHit(sessionId,agentName,limitType,value){_internals5.emit("hard_limit_hit",{sessionId,agentName,limitType,value})},revisionLimitHit(sessionId,agentName){_internals5.emit("revision_limit_hit",{sessionId,agentName})},loopDetected(sessionId,agentName,loopType){_internals5.emit("loop_detected",{sessionId,agentName,loopType})},scopeViolation(sessionId,agentName,file2,reason){_internals5.emit("scope_violation",{sessionId,agentName,file:file2,reason})},qaSkipViolation(sessionId,agentName,skipCount){_internals5.emit("qa_skip_violation",{sessionId,agentName,skipCount})},heartbeat(sessionId){_internals5.emit("heartbeat",{sessionId})},turboModeChanged(sessionId,enabled,agentName){_internals5.emit("turbo_mode_changed",{sessionId,enabled,agentName})},autoOversightEscalation(sessionId,reason,interactionCount,deadlockCount,phase){_internals5.emit("auto_oversight_escalation",{sessionId,reason,interactionCount,deadlockCount,phase})},environmentDetected(sessionId,hostOS,shellFamily,executionMode){_internals5.emit("environment_detected",{sessionId,hostOS,shellFamily,executionMode})},prmPatternDetected(sessionId,pattern,severity,category,stepRange){_internals5.emit("prm_pattern_detected",{sessionId,pattern,severity,category,stepRange})},prmCourseCorrectionInjected(sessionId,pattern,level){_internals5.emit("prm_course_correction_injected",{sessionId,pattern,level})},prmEscalationTriggered(sessionId,pattern,level,occurrenceCount){_internals5.emit("prm_escalation_triggered",{sessionId,pattern,level,occurrenceCount})},prmHardStop(sessionId,pattern,level,occurrenceCount){_internals5.emit("prm_hard_stop",{sessionId,pattern,level,occurrenceCount})}},_internals5={telemetry,emit,rotateTelemetryIfNeeded}});function backoffMs(attempt){let base=Math.min(BACKOFF_START_MS*2**attempt,BACKOFF_MAX_MS),jitter=base*BACKOFF_JITTER_RATIO*(Math.random()*2-1);return Math.max(1,Math.round(base+jitter))}async function withEvidenceLock(directory,evidencePath,agent,taskId,fn2,timeoutMs=60000){let deadline=Date.now()+timeoutMs,attempt=0;while(!0){let result=await tryAcquireLock(directory,evidencePath,agent,taskId);if(result.acquired){let lock=result.lock;if(attempt>0)emit("evidence_lock_stale_recovered",{directory,evidencePath,agent,taskId,attempt});emit("evidence_lock_acquired",{directory,evidencePath,agent,taskId,attempt});try{return await fn2()}finally{if(lock._release)try{await lock._release()}catch{}}}if(Date.now()>=deadline)throw new EvidenceLockTimeoutError(directory,evidencePath,agent,taskId,timeoutMs);emit("evidence_lock_contended",{directory,evidencePath,agent,taskId,attempt});let delay=Math.min(backoffMs(attempt),deadline-Date.now());if(delay>0)await new Promise((resolve5)=>setTimeout(resolve5,delay));attempt++}}var EvidenceLockTimeoutError,BACKOFF_START_MS=50,BACKOFF_MAX_MS=2000,BACKOFF_JITTER_RATIO=0.25;var init_lock=__esm(()=>{init_file_locks();init_telemetry();EvidenceLockTimeoutError=class EvidenceLockTimeoutError extends Error{directory;evidencePath;agent;taskId;constructor(directory,evidencePath,agent,taskId,timeoutMs){super(`Evidence lock timeout after ${timeoutMs}ms for ${evidencePath} (agent=${agent}, task=${taskId})`);this.name="EvidenceLockTimeoutError",this.directory=directory,this.evidencePath=evidencePath,this.agent=agent,this.taskId=taskId}}});var exports_pending_delegations={};__export(exports_pending_delegations,{sweepStaleDelegations:()=>sweepStaleDelegations,recordPendingDelegation:()=>recordPendingDelegation,readDelegations:()=>readDelegations,findOpenAsyncLaneBatches:()=>findOpenAsyncLaneBatches,findByCorrelationId:()=>findByCorrelationId,findByBatchId:()=>findByBatchId,buildPromptSnapshot:()=>buildPromptSnapshot,appendDelegationTransition:()=>appendDelegationTransition,BACKGROUND_DELEGATIONS_FILE:()=>BACKGROUND_DELEGATIONS_FILE});import{createHash as createHash3}from"node:crypto";import*as fs6 from"node:fs";import*as path9 from"node:path";function storePath(directory){return validateSwarmPath(directory,BACKGROUND_DELEGATIONS_FILE)}function ensureSwarmDir(directory){fs6.mkdirSync(path9.resolve(directory,".swarm"),{recursive:!0})}function readDelegations(directory){let raw;try{raw=fs6.readFileSync(storePath(directory),"utf-8")}catch(err){if(err.code==="ENOENT")return[];return warn(`[background] readDelegations failed: ${err instanceof Error?err.message:String(err)}`),[]}let folded=new Map;for(let line of raw.split(`
167
167
  `)){let trimmed=line.trim();if(trimmed.length===0)continue;let parsedJson;try{parsedJson=JSON.parse(trimmed)}catch{continue}let result=RecordSchema.safeParse(parsedJson);if(!result.success)continue;folded.set(result.data.correlationId,result.data)}return[...folded.values()]}function findByCorrelationId(directory,correlationId){if(!correlationId)return null;for(let record2 of readDelegations(directory))if(record2.correlationId===correlationId)return record2;return null}function appendRecord(directory,record2){ensureSwarmDir(directory),fs6.appendFileSync(storePath(directory),`${JSON.stringify(record2)}
168
168
  `,"utf-8")}async function recordPendingDelegation(directory,input,options={}){let now=Date.now(),record2={schemaVersion:input.batchId?2:1,correlationId:input.correlationId,jobId:input.jobId,subagentSessionId:input.subagentSessionId,parentSessionId:input.parentSessionId,callID:input.callID,normalizedAgent:input.normalizedAgent,swarmPrefixedAgent:input.swarmPrefixedAgent,planTaskId:input.planTaskId,evidenceTaskId:input.evidenceTaskId,status:"pending",createdAt:now,updatedAt:now,...input.batchId?{batchId:input.batchId}:{},...input.laneId?{laneId:input.laneId}:{},...input.mode?{mode:input.mode}:{},...input.workflowLane?{workflowLane:input.workflowLane}:{},...input.promptHash?{promptHash:input.promptHash}:{},...input.workspace?{workspace:input.workspace}:{},...input.taskChangeContext?{taskChangeContext:input.taskChangeContext}:{},...input.prompt?{prompt:input.prompt}:{},...input.generation!==void 0?{generation:input.generation}:{}};try{return await withEvidenceLock(directory,BACKGROUND_DELEGATIONS_FILE,STORE_LOCK_AGENT,STORE_LOCK_TASK,async()=>{if(options.staleTimeoutMs&&options.staleTimeoutMs>0)sweepStaleLocked(directory,options.staleTimeoutMs,now);appendRecord(directory,record2)}),record2}catch(err){return warn(`[background] recordPendingDelegation failed: ${err instanceof Error?err.message:String(err)}`),null}}function buildPromptSnapshot(text,maxChars){let boundedMax=Math.max(0,Math.min(maxChars,20000)),truncated=text.length>boundedMax;return{text:truncated?text.slice(0,boundedMax):text,chars:text.length,truncated,digest:createHash3("sha256").update(text).digest("hex")}}async function appendDelegationTransition(directory,correlationId,transition){let now=Date.now();try{let next=null;return await withEvidenceLock(directory,BACKGROUND_DELEGATIONS_FILE,STORE_LOCK_AGENT,STORE_LOCK_TASK,async()=>{let current=findByCorrelationId(directory,correlationId);if(!current)return;if(isTerminal(current.status)&&transition.status!=="consumed"&&transition.status!=="ingestion_error"){next=current;return}next={...current,schemaVersion:current.schemaVersion===1?2:current.schemaVersion,status:transition.status,updatedAt:now,...transition.completedAt!==void 0?{completedAt:transition.completedAt}:transition.status==="completed"||transition.status==="error"?{completedAt:now}:{},...transition.result?{result:transition.result}:{}},appendRecord(directory,next)}),next}catch(err){return warn(`[background] appendDelegationTransition failed: ${err instanceof Error?err.message:String(err)}`),null}}function findByBatchId(directory,batchId,opts){if(!batchId)return[];return readDelegations(directory).filter((record2)=>record2.batchId===batchId&&(opts?.parentSessionId===void 0||record2.parentSessionId===opts.parentSessionId))}function findOpenAsyncLaneBatches(directory){return readDelegations(directory).filter((record2)=>record2.batchId!==void 0&&(record2.status==="pending"||record2.status==="running"))}function isTerminal(status){return status==="completed"||status==="error"||status==="cancelled"||status==="stale"||status==="consumed"}function sweepStaleLocked(directory,timeoutMs,now){let swept=0;for(let record2 of readDelegations(directory)){if(record2.status!=="pending"&&record2.status!=="running"&&record2.status!=="ingestion_error")continue;if(now-record2.updatedAt<=timeoutMs)continue;appendRecord(directory,{...record2,status:"stale",updatedAt:now}),swept+=1}return swept}async function sweepStaleDelegations(directory,timeoutMs){if(!timeoutMs||timeoutMs<=0)return 0;try{return await withEvidenceLock(directory,BACKGROUND_DELEGATIONS_FILE,STORE_LOCK_AGENT,STORE_LOCK_TASK,async()=>sweepStaleLocked(directory,timeoutMs,Date.now()))}catch(err){return warn(`[background] sweepStaleDelegations failed: ${err instanceof Error?err.message:String(err)}`),0}}var BACKGROUND_DELEGATIONS_FILE="background-delegations.jsonl",STORE_LOCK_AGENT="background",STORE_LOCK_TASK="background-delegations",ResultSchema,WorkspaceSchema,TaskChangeContextSchema,PromptSchema,RecordSchema;var init_pending_delegations=__esm(()=>{init_zod();init_lock();init_utils2();init_logger();ResultSchema=exports_external.object({text:exports_external.string().optional(),error:exports_external.string().optional(),chars:exports_external.number(),truncated:exports_external.boolean(),digest:exports_external.string(),outputRef:exports_external.string().optional(),outputPreviewChars:exports_external.number().optional(),outputDegraded:exports_external.boolean().optional(),outputArtifactError:exports_external.string().optional(),transcriptIncomplete:exports_external.boolean().optional(),messageCount:exports_external.number().optional()}).strict(),WorkspaceSchema=exports_external.object({directory:exports_external.string(),gitHead:exports_external.string().nullable(),dirtyHash:exports_external.string().nullable(),changedFiles:exports_external.array(exports_external.string()).nullable().optional(),prHeadSha:exports_external.string().nullable(),scope:exports_external.string().nullable()}).strict(),TaskChangeContextSchema=exports_external.object({declaredFiles:exports_external.array(exports_external.string()).nullable(),baseline:WorkspaceSchema}).strict(),PromptSchema=exports_external.object({text:exports_external.string(),chars:exports_external.number(),truncated:exports_external.boolean(),digest:exports_external.string()}).strict(),RecordSchema=exports_external.object({schemaVersion:exports_external.union([exports_external.literal(1),exports_external.literal(2)]),correlationId:exports_external.string().min(1),jobId:exports_external.string().nullable(),subagentSessionId:exports_external.string().min(1),parentSessionId:exports_external.string().min(1),callID:exports_external.string(),normalizedAgent:exports_external.string(),swarmPrefixedAgent:exports_external.string(),planTaskId:exports_external.string().nullable(),evidenceTaskId:exports_external.string().nullable(),status:exports_external.enum(["pending","running","ingestion_error","completed","error","cancelled","stale","consumed"]),createdAt:exports_external.number(),updatedAt:exports_external.number(),batchId:exports_external.string().optional(),laneId:exports_external.string().optional(),mode:exports_external.string().optional(),workflowLane:exports_external.string().optional(),promptHash:exports_external.string().optional(),workspace:WorkspaceSchema.optional(),taskChangeContext:TaskChangeContextSchema.optional(),prompt:PromptSchema.optional(),generation:exports_external.number().optional(),result:ResultSchema.optional(),completedAt:exports_external.number().optional()}).strict()});var exports_workspace_snapshot={};__export(exports_workspace_snapshot,{workspaceSnapshotMatches:()=>workspaceSnapshotMatches,resolveRemoteRefsContainingHead:()=>resolveRemoteRefsContainingHead,resolvePrWorkflowRevisionDigestAsync:()=>resolvePrWorkflowRevisionDigestAsync,resolvePrWorkflowRevisionDigest:()=>resolvePrWorkflowRevisionDigest,resolveIsWorkingTreeClean:()=>resolveIsWorkingTreeClean,resolveIsExactSingleChildCommit:()=>resolveIsExactSingleChildCommit,resolveGitControlStateDigest:()=>resolveGitControlStateDigest,resolveExactRemoteBranchHead:()=>resolveExactRemoteBranchHead,resolveExactMergeBase:()=>resolveExactMergeBase,resolveCurrentUpstreamRemoteRef:()=>resolveCurrentUpstreamRemoteRef,resolveCurrentUpstreamPushTarget:()=>resolveCurrentUpstreamPushTarget,resolveCurrentGitHead:()=>resolveCurrentGitHead,resolveCommitCountSince:()=>resolveCommitCountSince,readGitTextAtRevision:()=>readGitTextAtRevision,parsePorcelainPaths:()=>parsePorcelainPaths,digest:()=>digest,compareWorkspaceSnapshots:()=>compareWorkspaceSnapshots,compareWorkspaceSnapshot:()=>compareWorkspaceSnapshot,changedFilesSinceSnapshot:()=>changedFilesSinceSnapshot,captureWorkspaceSnapshot:()=>captureWorkspaceSnapshot,_internals:()=>_internals6});import*as child_process from"node:child_process";import{createHash as createHash4}from"node:crypto";import*as fs7 from"node:fs";import*as path10 from"node:path";function runGit(directory,args2,timeoutMs=GIT_SNAPSHOT_TIMEOUT_MS){let result=_internals6.spawnSync("git",["-C",directory,...args2],{cwd:directory,encoding:"utf-8",timeout:timeoutMs,maxBuffer:GIT_SNAPSHOT_MAX_BUFFER,stdio:["ignore","pipe","pipe"]});if(result.error||result.status!==0)return null;return typeof result.stdout==="string"?result.stdout.trimEnd():null}async function runGitAsync(directory,args2,timeoutMs=GIT_SNAPSHOT_TIMEOUT_MS){return await new Promise((resolve7)=>{let settled=!1,stdout="",stderrBytes=0,timeout,child,finish=(value)=>{if(settled)return;if(settled=!0,timeout)clearTimeout(timeout);try{child?.kill()}catch{}resolve7(value)};try{child=child_process.spawn("git",["-C",directory,...args2],{cwd:directory,stdio:["ignore","pipe","pipe"],windowsHide:!0})}catch{finish(null);return}timeout=setTimeout(()=>finish(null),timeoutMs),child.stdout?.setEncoding("utf-8"),child.stdout?.on("data",(chunk)=>{if(stdout+=chunk,Buffer.byteLength(stdout,"utf-8")>GIT_SNAPSHOT_MAX_BUFFER)finish(null)}),child.stderr?.on("data",(chunk)=>{if(stderrBytes+=chunk.length,stderrBytes>GIT_SNAPSHOT_MAX_BUFFER)finish(null)}),child.once("error",()=>finish(null)),child.once("close",(code)=>finish(code===0?stdout.trimEnd():null))})}function readGitTextAtRevision(directory,revision,relativePath){if(!isSafeGitRevisionToken(revision)||!/^\.?(?:[A-Za-z0-9][A-Za-z0-9._-]*\/)*[A-Za-z0-9][A-Za-z0-9._-]*$/.test(relativePath)||relativePath.split("/").includes(".."))return null;let result=_internals6.spawnSync("git",["-C",directory,"show",`${revision}:${relativePath}`],{cwd:directory,encoding:"utf-8",timeout:GIT_SNAPSHOT_TIMEOUT_MS,maxBuffer:GIT_SNAPSHOT_MAX_BUFFER,stdio:["ignore","pipe","pipe"]});if(result.error||result.status!==0||typeof result.stdout!=="string")return null;return result.stdout}function resolveCurrentGitHead(directory){return runGit(directory,["rev-parse","--verify","HEAD^{commit}"])}function resolveExactMergeBase(directory,baseRef,prHeadSha){if(!isSafeGitRevisionToken(baseRef)||!isSafeGitRevisionToken(prHeadSha))return null;let mergeBase=runGit(directory,["merge-base","--",baseRef,prHeadSha]);return mergeBase&&/^[0-9a-f]{6,64}$/i.test(mergeBase)?mergeBase:null}function isSafeGitRevisionToken(value){return/^(?!-)[A-Za-z0-9][A-Za-z0-9._/-]{0,255}$/.test(value)&&!value.includes("..")&&!value.includes("//")&&!value.includes("@{")}function resolveCurrentUpstreamRemoteRef(directory){let upstream=runGit(directory,["rev-parse","--symbolic-full-name","@{upstream}"]);if(!upstream?.startsWith("refs/remotes/")||upstream.endsWith("/HEAD"))return null;return upstream}function resolveCurrentUpstreamPushTarget(directory){let localBranchRef=runGit(directory,["symbolic-ref","--quiet","HEAD"]);if(!localBranchRef?.startsWith("refs/heads/"))return null;let encoded=runGit(directory,["for-each-ref","--format=%(upstream:remotename)%00%(upstream:remoteref)%00%(upstream)",localBranchRef]);if(!encoded)return null;let[remoteName,remoteBranchRef,remoteTrackingRef,...extras]=encoded.split("\x00");if(extras.length>0||!remoteName||remoteName.startsWith("-")||/[\s;&|<>`]/.test(remoteName)||!remoteBranchRef?.startsWith("refs/heads/")||remoteBranchRef==="refs/heads/"||/[\s;&|<>`]/.test(remoteBranchRef)||!remoteTrackingRef?.startsWith("refs/remotes/")||remoteTrackingRef.endsWith("/HEAD"))return null;return{remoteName,remoteBranchRef,remoteTrackingRef}}function resolveExactRemoteBranchHead(directory,remoteName,remoteBranchRef){if(!remoteName||remoteName.startsWith("-")||/[\s;&|<>`]/.test(remoteName)||!remoteBranchRef.startsWith("refs/heads/")||remoteBranchRef==="refs/heads/"||/[\s;&|<>`]/.test(remoteBranchRef))return null;let output=runGit(directory,["ls-remote","--exit-code","--heads",remoteName,remoteBranchRef],20000);if(!output)return null;let rows=output.split(/\r?\n/).filter(Boolean);if(rows.length!==1)return null;let[objectName,refName,...extras]=rows[0].split(/\s+/);if(extras.length>0||refName!==remoteBranchRef||!objectName||!(/^[0-9a-f]{40}$/i.test(objectName)||/^[0-9a-f]{64}$/i.test(objectName)))return null;return objectName}function resolveGitControlStateDigest(directory){let head=runGit(directory,["rev-parse","--verify","HEAD^{commit}"]),symbolicHead=runGit(directory,["symbolic-ref","--quiet","HEAD"]),upstream=resolveCurrentUpstreamPushTarget(directory),refs=runGit(directory,["for-each-ref","--format=%(refname)%00%(objectname)","refs/heads","refs/remotes","refs/tags"]),config2=runGit(directory,["config","--null","--show-origin","--show-scope","--list"]),index=runGit(directory,["ls-files","--stage","-z"]);if(head===null||symbolicHead===null||!upstream||refs===null||config2===null||index===null)return null;return digest(`head\x00${head}\x00symbolic\x00${symbolicHead}\x00upstream\x00${upstream.remoteName}\x00${upstream.remoteBranchRef}\x00${upstream.remoteTrackingRef}\x00refs\x00${refs}\x00config\x00${config2}\x00index\x00${index}`)}function resolveIsWorkingTreeClean(directory){let status=runGit(directory,["status","--porcelain=v1","--untracked-files=all"]);return status===null?null:status.length===0}function resolveCommitCountSince(directory,baseHeadSha,currentHeadSha){let output=runGit(directory,["rev-list","--count","--ancestry-path",`${baseHeadSha}..${currentHeadSha}`]);if(!output||!/^\d+$/.test(output))return null;let count=Number(output);return Number.isSafeInteger(count)?count:null}function resolveIsExactSingleChildCommit(directory,baseHeadSha,currentHeadSha){let base=runGit(directory,["rev-parse","--verify",`${baseHeadSha}^{commit}`]),current=runGit(directory,["rev-parse","--verify",`${currentHeadSha}^{commit}`]);if(!base||!current)return null;let commitAndParents=runGit(directory,["rev-list","--parents","-n","1",current]);if(commitAndParents===null)return null;let fields=commitAndParents.trim().split(/\s+/);return fields.length===2&&fields[0]?.toLowerCase()===current.toLowerCase()&&fields[1]?.toLowerCase()===base.toLowerCase()}function resolveRemoteRefsContainingHead(directory,headSha){let output=runGit(directory,["for-each-ref","--format=%(refname)%09%(objectname)","refs/remotes"]);if(output===null)return null;return output.split(/\r?\n/).map((line)=>line.trim().split("\t")).filter(([ref,objectName])=>ref?.startsWith("refs/remotes/")&&!ref.endsWith("/HEAD")&&objectName?.toLowerCase()===headSha.toLowerCase()).map(([ref])=>ref)}function resolvePrWorkflowRevisionDigest(directory,baseHeadSha){let projectRoot=path10.resolve(directory),baseHead=runGit(projectRoot,["rev-parse","--verify",`${baseHeadSha}^{commit}`]),diffNames=runGit(projectRoot,["diff","--no-ext-diff","--name-only","-z",baseHeadSha]),porcelain=runGit(projectRoot,["status","--porcelain=v1","-z","--untracked-files=all"]);if(!baseHead||diffNames===null||porcelain===null)return null;let porcelainPaths=parsePorcelainPaths(porcelain);if(!porcelainPaths)return null;let changedPaths=[...new Set([...parseNulPaths(diffNames),...porcelainPaths])].sort((left,right)=>left.localeCompare(right));if(changedPaths.length>REVISION_MAX_FILES)return null;let hash2=createHash4("sha256");hash2.update(`base\x00${baseHead}\x00`);let totalBytes=0;for(let relativePath of changedPaths){let resolvedPath=path10.resolve(projectRoot,relativePath),relativeToRoot=path10.relative(projectRoot,resolvedPath);if(!relativeToRoot||relativeToRoot.startsWith("..")||path10.isAbsolute(relativeToRoot))return null;hash2.update(`path\x00${relativePath}\x00`);let stats2;try{stats2=fs7.lstatSync(resolvedPath)}catch(error49){if(error49.code==="ENOENT"){hash2.update("deleted\x00");continue}return null}if(stats2.isSymbolicLink())try{hash2.update(`symlink\x00${fs7.readlinkSync(resolvedPath)}\x00`);continue}catch{return null}if(!stats2.isFile()){hash2.update(`node\x00${stats2.mode}\x00`);continue}if(totalBytes+=stats2.size,totalBytes>REVISION_MAX_TOTAL_BYTES)return null;try{hash2.update(`file\x00${stats2.mode}\x00`),hash2.update(fs7.readFileSync(resolvedPath)),hash2.update("\x00")}catch{return null}}return hash2.digest("hex")}async function resolvePrWorkflowRevisionDigestAsync(directory,baseHeadSha){let projectRoot=path10.resolve(directory),[baseHead,diffNames,porcelain]=await Promise.all([runGitAsync(projectRoot,["rev-parse","--verify",`${baseHeadSha}^{commit}`]),runGitAsync(projectRoot,["diff","--no-ext-diff","--name-only","-z",baseHeadSha]),runGitAsync(projectRoot,["status","--porcelain=v1","-z","--untracked-files=all"])]);if(!baseHead||diffNames===null||porcelain===null)return null;let porcelainPaths=parsePorcelainPaths(porcelain);if(!porcelainPaths)return null;let changedPaths=[...new Set([...parseNulPaths(diffNames),...porcelainPaths])].sort((left,right)=>left.localeCompare(right));if(changedPaths.length>REVISION_MAX_FILES)return null;let hash2=createHash4("sha256");hash2.update(`base\x00${baseHead}\x00`);let totalBytes=0,chunksSinceYield=0;for(let relativePath of changedPaths){let resolvedPath=path10.resolve(projectRoot,relativePath),relativeToRoot=path10.relative(projectRoot,resolvedPath);if(!relativeToRoot||relativeToRoot.startsWith("..")||path10.isAbsolute(relativeToRoot))return null;hash2.update(`path\x00${relativePath}\x00`);let stats2;try{stats2=await fs7.promises.lstat(resolvedPath)}catch(error49){if(error49.code==="ENOENT"){hash2.update("deleted\x00");continue}return null}if(stats2.isSymbolicLink())try{hash2.update(`symlink\x00${await fs7.promises.readlink(resolvedPath)}\x00`);continue}catch{return null}if(!stats2.isFile()){hash2.update(`node\x00${stats2.mode}\x00`);continue}if(totalBytes+=stats2.size,totalBytes>REVISION_MAX_TOTAL_BYTES)return null;hash2.update(`file\x00${stats2.mode}\x00`);let handle;try{handle=await fs7.promises.open(resolvedPath,"r");let buffer=Buffer.allocUnsafe(REVISION_READ_CHUNK_BYTES);for(let position=0;position<stats2.size;){let length=Math.min(REVISION_READ_CHUNK_BYTES,stats2.size-position),{bytesRead}=await handle.read(buffer,0,length,position);if(bytesRead<=0)return null;if(hash2.update(buffer.subarray(0,bytesRead)),position+=bytesRead,chunksSinceYield++,chunksSinceYield>=REVISION_YIELD_EVERY_CHUNKS)chunksSinceYield=0,await _internals6.yieldControl()}hash2.update("\x00")}catch{return null}finally{await handle?.close().catch(()=>{return})}}return hash2.digest("hex")}function parseNulPaths(output){return output.split("\x00").filter((entry)=>entry.length>0)}function parsePorcelainPaths(output){let entries=parseNulPaths(output),paths=[];for(let index=0;index<entries.length;index++){let entry=entries[index];if(entry.length<4||entry[2]!==" ")return null;let status=entry.slice(0,2),changedPath=entry.slice(3);if(!changedPath)return null;if(paths.push(changedPath),status.includes("R")||status.includes("C")){let originalPath=entries[++index];if(!originalPath)return null;paths.push(originalPath)}}return[...new Set(paths)]}function parsePorcelainV2Snapshot(output){let records=output.split("\x00"),headers=[];while(records[0]?.startsWith("# "))headers.push(records.shift());let oidMatch=headers.join(`
169
- `).match(/^# branch\.oid (.+)$/m);if(!oidMatch)return null;let gitHead=/^[0-9a-f]{6,64}$/i.test(oidMatch[1])?oidMatch[1]:oidMatch[1]==="(initial)"?null:null,paths=[];for(let index=0;index<records.length;index++){let record2=records[index];if(!record2)continue;if(record2.startsWith("? ")){paths.push(record2.slice(2));continue}if(record2.startsWith("1 ")){let changedPath=porcelainV2PathAfterFields(record2,8);if(!changedPath)return null;paths.push(changedPath);continue}if(record2.startsWith("2 ")){let changedPath=porcelainV2PathAfterFields(record2,9),originalPath=records[++index];if(!changedPath||!originalPath)return null;paths.push(changedPath,originalPath);continue}if(record2.startsWith("u ")){let changedPath=porcelainV2PathAfterFields(record2,10);if(!changedPath)return null;paths.push(changedPath);continue}return null}return{gitHead,changedFiles:[...new Set(paths)]}}function porcelainV2PathAfterFields(record2,fields){let offset=0;for(let index=0;index<fields;index++){let delimiter=record2.indexOf(" ",offset);if(delimiter<0)return null;offset=delimiter+1}return record2.slice(offset)||null}function captureWorkspaceSnapshot(directory,optionsOrScope=null,prHeadShaArg=null){let scope=typeof optionsOrScope==="object"&&optionsOrScope!==null?optionsOrScope.scope??null:optionsOrScope,configuredPrHeadSha=(()=>{if(typeof optionsOrScope!=="object"||optionsOrScope===null)return prHeadShaArg;return optionsOrScope.prHeadSha??null})(),resolveCurrentPrHeadSha=typeof optionsOrScope==="object"&&optionsOrScope!==null&&optionsOrScope.resolveCurrentPrHeadSha===!0,upstreamBefore=resolveCurrentPrHeadSha?runGit(directory,["rev-parse","@{upstream}"]):null,porcelain=runGit(directory,["status","--porcelain=v2","--branch","-z","--untracked-files=all"]),snapshot=porcelain===null?null:parsePorcelainV2Snapshot(porcelain),upstreamAfter=resolveCurrentPrHeadSha?runGit(directory,["rev-parse","@{upstream}"]):null,prHeadSha=resolveCurrentPrHeadSha?upstreamBefore&&upstreamBefore===upstreamAfter?upstreamBefore:null:configuredPrHeadSha;return{directory:path10.resolve(directory),gitHead:snapshot?.gitHead??null,dirtyHash:porcelain===null?null:digest(porcelain),changedFiles:snapshot?.changedFiles??null,prHeadSha,scope}}function changedFilesSinceSnapshot(directory,baseline){if(!baseline?.gitHead||baseline.changedFiles==null)return null;if(baseline.changedFiles.length>0)return null;let current=captureWorkspaceSnapshot(directory);if(!current.gitHead||current.changedFiles==null)return null;let changed=new Set(current.changedFiles);if(baseline.gitHead!==current.gitHead){let committed=runGit(directory,["diff","--name-only","-z",baseline.gitHead,current.gitHead]);if(committed===null)return null;for(let changedPath of parseNulPaths(committed))changed.add(changedPath)}return[...changed]}function workspaceSnapshotMatches(expected,current){if(!expected)return{ok:!0};if(path10.resolve(expected.directory)!==path10.resolve(current.directory))return{ok:!1,reason:`directory changed: expected ${expected.directory}, got ${current.directory}`};let checks3=["gitHead","dirtyHash","prHeadSha"];for(let key of checks3){let expectedValue=expected[key];if(expectedValue===null)continue;if(current[key]!==expectedValue)return{ok:!1,reason:`${key} changed: expected ${expectedValue}, got ${current[key]??"unknown"}`}}return{ok:!0}}function compareWorkspaceSnapshots(expected,current){let result=workspaceSnapshotMatches(expected,current);if(result.ok)return{stale:!1};return{stale:!0,reason:result.reason}}function digest(text){return createHash4("sha256").update(text).digest("hex")}var GIT_SNAPSHOT_TIMEOUT_MS=3000,GIT_SNAPSHOT_MAX_BUFFER=524288,REVISION_MAX_FILES=5000,REVISION_MAX_TOTAL_BYTES=67108864,REVISION_READ_CHUNK_BYTES=65536,REVISION_YIELD_EVERY_CHUNKS=16,compareWorkspaceSnapshot,_internals6;var init_workspace_snapshot=__esm(()=>{compareWorkspaceSnapshot=workspaceSnapshotMatches;_internals6={spawnSync:child_process.spawnSync,yieldControl:()=>new Promise((resolve7)=>setImmediate(resolve7)),parsePorcelainV2Snapshot}});import{createHash as createHash5,randomUUID as randomUUID2}from"node:crypto";import{readFileSync as readFileSync6}from"node:fs";import*as fsp2 from"node:fs/promises";import*as path11 from"node:path";async function activatePrWorkflow(directory,sessionID,mode,options={}){let normalizedSessionID=normalizeSessionID(sessionID),existing=await readPrWorkflowGateState(directory,normalizedSessionID);if(existing?.mode===mode)return options.prHeadSha?bindPrWorkflowHead(directory,normalizedSessionID,options.prHeadSha):existing;if(existing)throw Error(`BLOCKED: session "${normalizedSessionID}" already has an active ${existing.mode} workflow; complete it before starting ${mode}`);let initialHead=options.prHeadSha?assertCurrentCheckoutHead(directory,options.prHeadSha):void 0,timestamp=isoNow(),nextState={schemaVersion:GATE_SCHEMA_VERSION,revision:0,sessionID:normalizedSessionID,mode,activatedAt:timestamp,updatedAt:timestamp,...initialHead?{prHeadSha:initialHead}:{}};return await persistState(directory,nextState),nextState}async function readPrWorkflowGateState(directory,sessionID){let normalizedSessionID=normalizeSessionID(sessionID),state=await readPrWorkflowGateStateFromDisk(directory,normalizedSessionID);if(state)rememberState(directory,state);else trackedStatesByProjectSession.delete(stateCacheKey(directory,normalizedSessionID));return state}async function clearPrWorkflowGateState(directory,sessionID,expectedRevision){let normalizedSessionID=normalizeSessionID(sessionID);await withSessionStateMutation(directory,normalizedSessionID,async()=>{let current=await readPrWorkflowGateStateFromDisk(directory,normalizedSessionID);if(expectedRevision!==void 0&&(!current||current.revision!==expectedRevision))throw Error("BLOCKED: PR workflow gate state changed during terminal completion; revalidate the current session state before retrying");try{await fsp2.rm(workflowGateStatePath(directory,normalizedSessionID),{force:!0})}catch(error49){if(error49.code!=="ENOENT")throw error49}trackedStatesByProjectSession.delete(stateCacheKey(directory,normalizedSessionID))})}async function bindPrWorkflowHead(directory,sessionID,prHeadSha){let state=await requireAnyActiveState(directory,sessionID),normalizedHead=normalizePrHeadSha(prHeadSha);if(assertCurrentCheckoutHead(directory,normalizedHead),state.mode==="PR_REVIEW")assertPrReviewCleanCheckout(directory);if(state.prHeadSha&&state.prHeadSha!==normalizedHead)throw Error(`BLOCKED: active ${state.mode} workflow is bound to PR head "${state.prHeadSha}"; received "${normalizedHead}"`);if(state.prHeadSha===normalizedHead)return state;let nextState={...state,prHeadSha:normalizedHead,updatedAt:isoNow()};return await persistState(directory,nextState),nextState}async function bindPrReviewBase(directory,sessionID,options){let state=await bindPrWorkflowHead(directory,sessionID,options.prHeadSha);if(state.mode!=="PR_REVIEW")throw Error("BLOCKED: only PR_REVIEW can bind a review merge base");let baseRef=options.baseRef.trim(),baseSha=normalizePrHeadSha(options.baseSha).toLowerCase();if(!baseRef)throw Error("BLOCKED: PR_REVIEW base_ref must not be empty");if(state.prReviewBaseRef&&state.prReviewBaseRef!==baseRef||state.prReviewBaseSha&&state.prReviewBaseSha!==baseSha)throw Error(`BLOCKED: active PR_REVIEW is bound to merge-base scope "${state.prReviewBaseRef??"(unbound)"}" at "${state.prReviewBaseSha??"(unbound)"}"; received "${baseRef}" at "${baseSha}"`);if(state.prReviewBaseRef===baseRef&&state.prReviewBaseSha===baseSha)return state;return state={...state,prReviewBaseRef:baseRef,prReviewBaseSha:baseSha,updatedAt:isoNow()},await persistState(directory,state),state}function assertCurrentCheckoutHead(directory,expectedHead){let normalizedExpected=normalizePrHeadSha(expectedHead),currentHead=_test_exports.resolveCurrentGitHead(directory)?.trim();if(!currentHead)throw Error(`BLOCKED: cannot verify the current Git HEAD against PR head "${normalizedExpected}"`);if(currentHead.toLowerCase()!==normalizedExpected.toLowerCase())throw Error(`BLOCKED: current checkout HEAD "${currentHead}" does not match PR head "${normalizedExpected}"`);return normalizedExpected}function assertPrReviewCleanCheckout(directory){if(_test_exports.resolveIsWorkingTreeClean(directory)!==!0)throw Error("BLOCKED: PR_REVIEW requires a clean index and working tree at the exact PR head")}async function enforcePrWorkflowDispatchLanesAsync(directory,sessionID,toolName){let state=await readPrWorkflowGateState(directory,sessionID);if(!state)return null;if(toolName===DISPATCH_TOOL_NAME)return state;if(toolName===BLOCKING_DISPATCH_TOOL_NAME)throw Error(`BLOCKED: active ${state.mode} workflow for session "${state.sessionID}" requires ${DISPATCH_TOOL_NAME}; ${BLOCKING_DISPATCH_TOOL_NAME} is not allowed`);return state}async function enforcePrReviewBaseDimensions(directory,sessionID,lanes,options){let state=await bindPrWorkflowHead(directory,sessionID,options.prHeadSha);if(state.mode!=="PR_REVIEW")throw wrongModeError(state,"PR_REVIEW");let normalizedLanes=normalizeWorkflowLanes(lanes),workflowLaneIds=normalizedLanes.map((lane)=>lane.workflowLane);if(workflowLaneIds.filter((laneId)=>!PR_REVIEW_BASE_DIMENSION_IDS.includes(laneId)).length>0){let expected=PR_REVIEW_BASE_DIMENSION_IDS.join(", "),received=workflowLaneIds.join(", ")||"(none)";throw Error(`BLOCKED: PR_REVIEW base dispatch lane ids must be drawn from: ${expected}. Received: ${received}`)}let batchId=normalizeBatchId(options.batchId),previous=state.prReviewBaseDispatches??[];if(previous.some((record3)=>record3.batchId===batchId))throw Error(`BLOCKED: PR_REVIEW base batch id "${batchId}" is already recorded`);if(previous.length>=MAX_WORKFLOW_BATCHES)throw Error("BLOCKED: PR_REVIEW base batch limit reached");let record2={batchId,lanes:normalizedLanes.map((lane)=>({laneId:lane.laneId,workflowLane:lane.workflowLane})),validatedAt:isoNow()},nextState={...state,updatedAt:isoNow(),prReviewBaseDispatches:[...previous,record2],prReviewBaseDispatch:record2};return await persistState(directory,nextState),nextState}async function assertPrReviewBaseCoverageSettled(directory,sessionID){let state=await requireBoundState(directory,sessionID,"PR_REVIEW"),batches=state.prReviewBaseDispatches??[];if(batches.length===0)throw Error("BLOCKED: PR_REVIEW requires at least one base batch");let covered=new Set;for(let batch of batches){let successful=successfulObligationsFromExactBatch(directory,state,batch.batchId,batch.lanes,"swarm-pr-review:base",batch.validatedAt);for(let obligation of successful)covered.add(obligation)}let missing=PR_REVIEW_BASE_DIMENSION_IDS.filter((dimension)=>!covered.has(dimension));if(missing.length>0||covered.size!==PR_REVIEW_BASE_DIMENSION_IDS.length)throw Error(`BLOCKED: PR_REVIEW base coverage is incomplete; missing dimensions: ${missing.join(", ")||"(none)"}`);return state}async function recordPrReviewValidationBatch(directory,sessionID,phase,lanes,options){let state=await bindPrWorkflowHead(directory,sessionID,options.prHeadSha);if(state.mode!=="PR_REVIEW")throw wrongModeError(state,"PR_REVIEW");if(!state.prReviewTriggerEvalPath)throw Error("BLOCKED: PR_REVIEW validation dispatch requires a completed trigger evaluation");if(phase==="reviewer"&&(state.prReviewValidationBatches??[]).some((batch)=>batch.phase==="council"))state=await assertPrReviewValidationSettled(directory,sessionID,"council");else if(phase==="critic")state=await assertPrReviewValidationSettled(directory,sessionID,"reviewer");let normalizedLanes=normalizeWorkflowLanes(lanes);if((phase==="reviewer"||phase==="critic")&&normalizedLanes.some((lane)=>!lane.reviewItemIds?.length))throw Error(`BLOCKED: PR_REVIEW ${phase} lanes require non-empty review_item_ids ownership`);if(phase==="reviewer"||phase==="critic"){assertNoDuplicates(normalizedLanes.flatMap((lane)=>lane.reviewItemIds??[]),`PR_REVIEW ${phase} review item ownership`);let assigned=normalizedLanes.flatMap((lane)=>lane.reviewItemIds??[]),required2=phase==="reviewer"?derivePrReviewCandidateInventory(directory,state):derivePrReviewCriticInventory(directory,state);assertExactStringSet(assigned,required2,`PR_REVIEW ${phase} ownership`)}let batchId=normalizeBatchId(options.batchId),previous=state.prReviewValidationBatches??[];if(previous.some((batch)=>batch.batchId===batchId))throw Error(`BLOCKED: PR_REVIEW validation batch id "${batchId}" is already recorded`);if(previous.length>=MAX_WORKFLOW_BATCHES)throw Error("BLOCKED: PR_REVIEW validation batch limit reached");let record2={batchId,phase,lanes:normalizedLanes,validatedAt:isoNow()},retained=phase==="reviewer"?previous.filter((batch)=>batch.phase!=="critic"):previous,nextState={...state,updatedAt:isoNow(),prReviewValidationBatches:[...retained,record2]};return await persistState(directory,nextState),nextState}async function assertPrReviewValidationSettled(directory,sessionID,phase){let state=await requireBoundState(directory,sessionID,"PR_REVIEW"),declaredPhases=new Set((state.prReviewValidationBatches??[]).map((batch)=>batch.phase)),phases=phase?[phase]:["council","reviewer","critic"].filter((candidate)=>declaredPhases.has(candidate));for(let requiredPhase of phases){let validationBatches=state.prReviewValidationBatches??[],forbiddenSubagentSessionIds=new Set;if(requiredPhase==="critic")for(let reviewerBatch of validationBatches.filter((batch)=>batch.phase==="reviewer"))for(let record2 of findByBatchId(directory,reviewerBatch.batchId,{parentSessionId:state.sessionID})){let subagentSessionId=record2.subagentSessionId?.trim();if(subagentSessionId)forbiddenSubagentSessionIds.add(subagentSessionId)}let batches=validationBatches.filter((batch)=>batch.phase===requiredPhase);if(requiredPhase==="reviewer"){let latestCouncilIndex=-1;for(let index=0;index<validationBatches.length;index++)if(validationBatches[index]?.phase==="council")latestCouncilIndex=index;if(latestCouncilIndex>=0)batches=validationBatches.slice(latestCouncilIndex+1).filter((batch)=>batch.phase==="reviewer")}if(batches.length===0)throw Error(requiredPhase==="reviewer"&&declaredPhases.has("council")?"BLOCKED: PR_REVIEW requires at least one reviewer batch after the latest council batch":`BLOCKED: PR_REVIEW requires at least one ${requiredPhase} batch`);let allObligations=new Set(batches.flatMap((batch)=>batch.lanes.map((lane)=>lane.workflowLane))),settled=new Set,hasFullySuccessfulExactBatch=!1;for(let batch of batches){let successful=successfulObligationsFromExactBatch(directory,state,batch.batchId,batch.lanes,`swarm-pr-review:${requiredPhase}`,batch.validatedAt,!0,forbiddenSubagentSessionIds);if(successful.size===batch.lanes.length&&batch.lanes.every((lane)=>successful.has(lane.workflowLane)))hasFullySuccessfulExactBatch=!0;for(let obligation of successful)settled.add(obligation)}if((requiredPhase==="reviewer"||requiredPhase==="critic")&&!hasFullySuccessfulExactBatch)throw Error(`BLOCKED: PR_REVIEW ${requiredPhase} requires one fully successful exact batch; complementary partial retries are not a coherent verdict set`);let missing=[...allObligations].filter((obligation)=>!settled.has(obligation));if(missing.length>0)throw Error(`BLOCKED: PR_REVIEW ${requiredPhase} obligations lack successful exact artifacts: ${missing.join(", ")}`)}return state}async function declarePrFeedbackInventory(directory,sessionID,inventoryIds,options){let state=await bindPrWorkflowHead(directory,sessionID,options.prHeadSha);if(state.mode!=="PR_FEEDBACK")throw wrongModeError(state,"PR_FEEDBACK");let normalizedInventory=normalizeInventoryIds(inventoryIds);if(state.prFeedbackInventory){if(!sameStringArray(state.prFeedbackInventory,normalizedInventory))throw Error("BLOCKED: PR_FEEDBACK inventory is immutable after declaration");return state}let nextState={...state,updatedAt:isoNow(),prFeedbackInventory:normalizedInventory,prFeedbackVerifications:[]};return await persistState(directory,nextState),nextState}async function enforcePrFeedbackVerificationOwnership(directory,sessionID,ownership,options){let state=await bindPrWorkflowHead(directory,sessionID,options.prHeadSha);if(state.mode!=="PR_FEEDBACK")throw wrongModeError(state,"PR_FEEDBACK");let inventory=state.prFeedbackInventory;if(!inventory||inventory.length===0)throw Error(`BLOCKED: PR_FEEDBACK verification for session "${state.sessionID}" requires a declared feedback inventory before dispatch`);let normalizedOwnership=normalizeOwnership(ownership),inventorySet=new Set(inventory),claimedByItemId=new Map,previous=state.prFeedbackVerifications??[],batchId=normalizeBatchId(options.batchId);if(previous.some((record3)=>record3.batchId===batchId))throw Error(`BLOCKED: PR_FEEDBACK verification batch id "${batchId}" is already recorded`);if(previous.length>=MAX_WORKFLOW_BATCHES)throw Error("BLOCKED: PR_FEEDBACK verification batch limit reached");for(let record3 of previous)for(let lane of record3.ownership)for(let itemId of lane.ownedItemIds)claimedByItemId.set(itemId,lane.laneId);for(let lane of normalizedOwnership)for(let itemId of lane.ownedItemIds){if(!inventorySet.has(itemId))throw Error(`BLOCKED: PR_FEEDBACK verification lane "${lane.laneId}" owns undeclared item "${itemId}"`);let previousLane=claimedByItemId.get(itemId);if(previousLane&&previousLane!==lane.laneId)throw Error(`BLOCKED: PR_FEEDBACK verification item "${itemId}" is owned by both "${previousLane}" and "${lane.laneId}"`);claimedByItemId.set(itemId,lane.laneId)}let record2={batchId,ownership:normalizedOwnership,validatedAt:isoNow()},nextState={...state,updatedAt:isoNow(),prFeedbackVerifications:[...previous,record2],prFeedbackVerification:record2};return await persistState(directory,nextState),nextState}async function assertPrFeedbackVerificationSettled(directory,sessionID){let state=await requireBoundState(directory,sessionID,"PR_FEEDBACK"),currentDigest=await currentPrFeedbackRevisionDigest(directory,state),inventory=state.prFeedbackInventory,batches=state.prFeedbackVerifications??[];if(!inventory||batches.length===0)throw Error("BLOCKED: PR_FEEDBACK requires an immutable inventory and verification batches");let covered=new Set;for(let batch of batches){let successfulLaneIds=successfulObligationsFromExactBatch(directory,state,batch.batchId,batch.ownership.map((lane)=>({laneId:lane.laneId,workflowLane:lane.laneId})),"swarm-pr-feedback:verification",batch.validatedAt,!1,new Set,currentDigest);for(let lane of batch.ownership){if(!successfulLaneIds.has(lane.laneId))continue;if(!feedbackArtifactCoversItems(directory,state,batch.batchId,lane.laneId,lane.ownedItemIds))continue;for(let itemId of lane.ownedItemIds)covered.add(itemId)}}let missing=inventory.filter((itemId)=>!covered.has(itemId));if(missing.length>0||covered.size!==inventory.length)throw Error(`BLOCKED: PR_FEEDBACK verification ownership is incomplete; missing inventory items: ${missing.join(", ")||"(none)"}`);return state}async function recordPrFeedbackStageA(directory,sessionID,revisionDigest,checks3,options={}){let state=await assertPrFeedbackVerificationSettled(directory,sessionID),currentDigest=await currentPrFeedbackRevisionDigest(directory,state);if(revisionDigest!==currentDigest)throw Error("BLOCKED: PR_FEEDBACK Stage A receipt is stale because the working-tree revision changed during validation");if(checks3.length<2||checks3.length>258)throw Error("BLOCKED: PR_FEEDBACK Stage A requires two to 258 controller-created check receipts");let optionalCategoryOrder=["build","typecheck","lint"],applicableCategories=options.applicableCategories??optionalCategoryOrder.filter((category)=>checks3.some((check2)=>check2.category===category));if(assertNoDuplicates(applicableCategories,"PR_FEEDBACK Stage A applicable categories"),applicableCategories.some((category)=>!optionalCategoryOrder.includes(category)))throw Error("BLOCKED: PR_FEEDBACK Stage A applicability may contain only build, typecheck, and lint");let required2=new Set(["diff-check","reproduction",...applicableCategories]),singletonSeen=new Set,applicableObligations=[...options.applicableObligations??[]];assertNoDuplicates(applicableObligations.map(({id})=>id),"PR_FEEDBACK Stage A applicable obligations");let requiredObligationIds=new Set(applicableObligations.map(({id})=>id)),commandDigests=new Set,reproductionFeedbackItemIds=[];for(let check2 of checks3){if(["diff-check","reproduction"].includes(check2.category)&&singletonSeen.has(check2.category))throw Error(`BLOCKED: PR_FEEDBACK Stage A contains duplicate category "${check2.category}"`);if(singletonSeen.add(check2.category),required2.delete(check2.category),check2.obligationId){let obligation=applicableObligations.find((candidate)=>candidate.id===check2.obligationId);if(!obligation||obligation.category!==check2.category||obligation.workingDirectory!==(check2.workingDirectory??".")||!requiredObligationIds.delete(check2.obligationId))throw Error(`BLOCKED: PR_FEEDBACK Stage A receipt does not match one exact applicable obligation: ${check2.obligationId}`);let sourceContract=obligation.source.includes(".pr-validation.json#")?{path:obligation.source.slice(0,obligation.source.lastIndexOf("#")),id:obligation.source.slice(obligation.source.lastIndexOf("#")+1)}:void 0,requiredContract=obligation.validatorContract??sourceContract;if(requiredContract&&(check2.validatorContract?.path!==requiredContract.path||check2.validatorContract.id!==requiredContract.id))throw Error(`BLOCKED: PR_FEEDBACK Stage A obligation ${obligation.id} requires exact validator contract provenance`)}let commandDigest=createHash5("sha256").update(`${check2.obligationId??check2.category}\x00${check2.workingDirectory??"."}\x00${check2.command.join("\x00")}`).digest("hex");if(commandDigests.has(commandDigest))throw Error("BLOCKED: PR_FEEDBACK Stage A cannot reuse one command as multiple check receipts");if(commandDigests.add(commandDigest),check2.category==="diff-check"&&!sameStringArray(check2.command,["git","diff","--check"]))throw Error("BLOCKED: PR_FEEDBACK Stage A diff-check receipt is not the exact git diff --check command");if(check2.category==="reproduction"&&(!check2.targets?.length||!check2.feedbackTargets?.length||check2.targets.some((target)=>!check2.command.join(" ").includes(target))))throw Error("BLOCKED: PR_FEEDBACK Stage A reproduction receipt requires exact selected targets");if(check2.category==="reproduction"){if(reproductionFeedbackItemIds=check2.feedbackTargets.map((mapping)=>mapping.feedbackItemId),assertNoDuplicates(reproductionFeedbackItemIds,"PR_FEEDBACK Stage A reproduction feedback item mappings"),check2.feedbackTargets.some((mapping)=>!check2.targets.includes(mapping.target)))throw Error("BLOCKED: PR_FEEDBACK Stage A feedback mappings must reference exact executed reproduction targets")}}if(required2.size>0)throw Error(`BLOCKED: PR_FEEDBACK Stage A is missing required checks: ${[...required2].join(", ")}`);if(requiredObligationIds.size>0)throw Error(`BLOCKED: PR_FEEDBACK Stage A is missing applicable workspace obligations: ${[...requiredObligationIds].join(", ")}`);if(!sameStringArray(reproductionFeedbackItemIds,state.prFeedbackInventory??[]))throw Error("BLOCKED: PR_FEEDBACK Stage A reproduction must map every immutable feedback item exactly once and in declared order");let nextState={...state,updatedAt:isoNow(),prFeedbackStageA:{revisionDigest:currentDigest,checks:[...checks3],feedbackItemIds:reproductionFeedbackItemIds,applicableCategories:optionalCategoryOrder.filter((category)=>applicableCategories.includes(category)),applicableObligations,validatedAt:isoNow()},prFeedbackGateBatches:[],prFeedbackReadyToPublish:void 0};return await persistState(directory,nextState),nextState}async function recordPrFeedbackGateBatch(directory,sessionID,phase,lane,options){let state=await bindPrWorkflowHead(directory,sessionID,options.prHeadSha);if(state.mode!=="PR_FEEDBACK")throw wrongModeError(state,"PR_FEEDBACK");let inventory=state.prFeedbackInventory;if(!inventory?.length)throw Error("BLOCKED: PR_FEEDBACK ordered gates require an immutable feedback inventory");let normalized=normalizeOwnership([lane])[0];if(!sameStringArray(normalized.ownedItemIds,inventory))throw Error(`BLOCKED: PR_FEEDBACK ${phase} must own every inventory item exactly once and in declared order`);let phaseIndex=PR_FEEDBACK_PHASE_ORDER.indexOf(phase),prerequisite=PR_FEEDBACK_PHASE_ORDER[phaseIndex-1];if(prerequisite)state=await assertPrFeedbackGatePhaseSettled(directory,sessionID,prerequisite);let{prFeedbackStageA:stageA,prFeedbackInventory:refreshedInventory}=state,currentDigest=await currentPrFeedbackRevisionDigest(directory,state);if(!stageA||!refreshedInventory||stageA.revisionDigest!==currentDigest||!sameStringArray(stageA.feedbackItemIds??[],refreshedInventory)||options.revisionDigest!==currentDigest)throw Error(`BLOCKED: PR_FEEDBACK ${phase} requires fresh Stage A checks on the current revision`);let batchId=normalizeBatchId(options.batchId),previous=state.prFeedbackGateBatches??[];if(previous.some((batch)=>batch.batchId===batchId))throw Error(`BLOCKED: PR_FEEDBACK gate batch id "${batchId}" is already recorded`);let retained=previous.filter((batch)=>PR_FEEDBACK_PHASE_ORDER.indexOf(batch.phase)<phaseIndex),record2={batchId,phase,laneId:normalized.laneId,itemIds:normalized.ownedItemIds,revisionDigest:currentDigest,validatedAt:isoNow()},nextState={...state,updatedAt:isoNow(),prFeedbackGateBatches:[...retained,record2]};return await persistState(directory,nextState),nextState}async function assertPrFeedbackGatePhaseSettled(directory,sessionID,phase){let state=await requireBoundState(directory,sessionID,"PR_FEEDBACK"),currentDigest=await currentPrFeedbackRevisionDigest(directory,state);if(state.prFeedbackStageA?.revisionDigest!==currentDigest)throw Error(`BLOCKED: PR_FEEDBACK ${phase} cannot use stale Stage A evidence`);if(!sameStringArray(state.prFeedbackStageA?.feedbackItemIds??[],state.prFeedbackInventory??[]))throw Error(`BLOCKED: PR_FEEDBACK ${phase} Stage A reproduction is not bound to the exact immutable feedback inventory`);let batch=[...state.prFeedbackGateBatches??[]].reverse().find((candidate)=>candidate.phase===phase);if(!batch||batch.revisionDigest!==currentDigest)throw Error(`BLOCKED: PR_FEEDBACK ${phase} has no validation batch on the current revision`);if(!successfulObligationsFromExactBatch(directory,state,batch.batchId,[{laneId:batch.laneId,workflowLane:phase,reviewItemIds:batch.itemIds}],`swarm-pr-feedback:${phase}`,batch.validatedAt,!0,new Set,currentDigest).has(phase))throw Error(`BLOCKED: PR_FEEDBACK ${phase} requires one complete, non-degraded positive verdict row per inventory item`);if(findByBatchId(directory,batch.batchId,{parentSessionId:state.sessionID}).find((candidate)=>candidate.laneId===batch.laneId)?.workspace?.dirtyHash!==currentDigest)throw Error(`BLOCKED: PR_FEEDBACK ${phase} artifact is not bound to the current revision digest`);return assertIndependentFeedbackGateSessions(directory,state,phase),state}function assertIndependentFeedbackGateSessions(directory,state,throughPhase){let throughIndex=PR_FEEDBACK_PHASE_ORDER.indexOf(throughPhase),batches=(state.prFeedbackGateBatches??[]).filter((batch)=>PR_FEEDBACK_PHASE_ORDER.indexOf(batch.phase)<=throughIndex),seenSessions=new Set;for(let batch of batches){let matching=findByBatchId(directory,batch.batchId,{parentSessionId:state.sessionID}).filter((record3)=>record3.laneId===batch.laneId);if(matching.length!==1)throw Error(`BLOCKED: PR_FEEDBACK ${batch.phase} must resolve from exactly one durable child session`);let record2=matching[0],expectedRole=PR_FEEDBACK_PHASE_ROLE[batch.phase];if(!(record2.normalizedAgent===expectedRole||expectedRole==="critic"&&record2.normalizedAgent.startsWith("critic_")))throw Error(`BLOCKED: PR_FEEDBACK ${batch.phase} requires role ${expectedRole}, received ${record2.normalizedAgent||"(unknown)"}`);if(seenSessions.has(record2.subagentSessionId))throw Error(`BLOCKED: PR_FEEDBACK independent phases reused child session "${record2.subagentSessionId}"`);seenSessions.add(record2.subagentSessionId)}}async function assertPrFeedbackReadyToPublish(directory,sessionID){let state=await assertPrFeedbackVerificationSettled(directory,sessionID);for(let phase of PR_FEEDBACK_PHASE_ORDER)state=await assertPrFeedbackGatePhaseSettled(directory,sessionID,phase);return state}async function assertPrFeedbackPublicationArmed(directory,sessionID){let state=await requireBoundState(directory,sessionID,"PR_FEEDBACK"),armed=state.prFeedbackReadyToPublish;if(!armed)throw Error("BLOCKED: PR_FEEDBACK publication is not armed; call complete_pr_workflow once after every ordered gate passes");let currentDigest=await currentPrFeedbackRevisionDigest(directory,state);if(armed.revisionDigest!==currentDigest)throw Error("BLOCKED: PR_FEEDBACK changed after publication was armed; rerun Stage A and every independent gate");if(_test_exports.resolveCurrentGitHead(directory)?.trim()!==armed.localHead)throw Error("BLOCKED: PR_FEEDBACK current Git HEAD changed after publication was armed");if(_test_exports.resolveIsWorkingTreeClean(directory)!==!0)throw Error("BLOCKED: PR_FEEDBACK working tree changed after publication was armed");let currentTarget=_test_exports.resolveCurrentUpstreamPushTarget(directory);if(!currentTarget||currentTarget.remoteName!==armed.remoteName||currentTarget.remoteBranchRef!==armed.remoteBranchRef||currentTarget.remoteTrackingRef!==armed.remoteRef)throw Error("BLOCKED: PR_FEEDBACK upstream publication target changed after publication was armed");return state}async function markPrReviewTriggerEvaluationComplete(directory,sessionID,artifactPath){let state=await assertPrReviewBaseCoverageSettled(directory,sessionID),normalizedPath=artifactPath.trim();if(!normalizedPath)throw Error("BLOCKED: PR_REVIEW trigger artifact path is required");let nextState={...state,updatedAt:isoNow(),prReviewTriggerEvalPath:normalizedPath};return await persistState(directory,nextState),nextState}async function enforcePrWorkflowToolBefore(directory,sessionID,toolName,args2,generatedAgentNames=[]){let state=await readPrWorkflowGateState(directory,sessionID);if(!state)return;let normalizedTool=toolName.toLowerCase(),isDirectAgentTask=normalizedTool==="task"||normalizedTool==="run_agent",requestedRoles=["subagent_type","agent"].filter((field)=>Object.hasOwn(args2??{},field)).map((field)=>{let value=args2?.[field];if(typeof value!=="string"||!value.trim())return"";return resolveGeneratedAgentRole(value.trim(),generatedAgentNames)}),isDirectWrite=WRITE_TOOL_NAMES.includes(normalizedTool),command=typeof args2?.command==="string"?args2.command.trim():"",serializedArgs=JSON.stringify(args2??{}),referencesProtectedWorkflowEvidence=containsProtectedWorkflowPath(command||serializedArgs),isInternalWorkflowTool=PR_WORKFLOW_CONTROLLER_TOOLS.has(normalizedTool),isShellTool=normalizedTool==="bash"||normalizedTool==="shell",isReadOnlyShell=isShellTool&&command.length>0&&isAllowedPrWorkflowReadOnlyShell(command,{allowCheckout:!state.prHeadSha,allowFetch:!state.prHeadSha}),isNamedReadOnlyTool=isAllowedPrReviewReadOnlyToolName(normalizedTool)&&readOnlyToolArgumentsAreSafe(args2??{});if(referencesProtectedWorkflowEvidence&&!isInternalWorkflowTool&&!isNamedReadOnlyTool&&!isReadOnlyShell)throw Error(`BLOCKED: active ${state.mode} workflow evidence under .swarm is controller-owned and cannot be modified directly`);let isShellCommandRequiringVerification=isShellTool&&command.length>0&&!isReadOnlyShell,isRemoteReviewTool=/(?:git|github|pull|(?:^|[_-])pr(?:[_-]|$)|issue|review)/i.test(normalizedTool),hasRemoteMutationVerb=/(?:^|[_-])(?:add|approve|cancel|close|comment|commit|convert|create|delete|dismiss|edit|mark|merge|push|ready|reopen|rerun|resolve|submit|transfer|unresolve|update)(?:[_-]|$)/i.test(normalizedTool),hasRemoteReadVerb=/(?:^|[_-])(?:github|git)[_-]+(?:check|checks|checkout|diff|fetch|get|inspect|list|read|search|status|view)(?:[_-]|$)/i.test(normalizedTool)||/(?:^|[_-])(?:github|git)[_-]+(?:pull[_-]+request|pr|issue|review[_-]+thread)[_-]+(?:check|checks|checkout|diff|fetch|get|inspect|list|read|search|status|view)(?:[_-]|$)/i.test(normalizedTool),isRemoteMutationTool=isRemoteReviewTool&&(hasRemoteMutationVerb||!hasRemoteReadVerb),isRemoteCheckoutTool=/(?:^|[_-])(?:github|git)[_-]+checkout(?:[_-]|$)/i.test(normalizedTool),isShellCheckout=(normalizedTool==="bash"||normalizedTool==="shell")&&(/\bgit\b(?:(?![;&|]).){0,200}\b(?:checkout|switch)\b/i.test(command)||/\bgh\s+pr\s+checkout\b/i.test(command)),containsGitCommitShell=isShellCommandRequiringVerification&&/\bgit\b(?:(?![;&|]).){0,200}\bcommit\b/i.test(command),isStandaloneGitCommitShell=containsGitCommitShell&&isSafeStandaloneGitCommit(command),isPublicationShell=isShellCommandRequiringVerification&&(/\bgit\b(?:(?![;&|]).){0,200}\bpush\b/i.test(command)||/\bgh\s+(?:api|pr|issue|run)\b/i.test(command)),isPublicationTool=!isInternalWorkflowTool&&isRemoteMutationTool,isCoderTask=isDirectAgentTask&&requestedRoles.length>0&&requestedRoles.every((role)=>role==="coder");if(state.mode==="PR_REVIEW"){if(!(isInternalWorkflowTool||isNamedReadOnlyTool||isReadOnlyShell)||Boolean(state.prHeadSha)&&(isRemoteCheckoutTool||isShellCheckout))throw Error("BLOCKED: PR_REVIEW is read-only and fail-closed; only controller tools and positively classified observation tools are allowed, and every agent lane requires structured dispatch_lanes_async");return}if(isDirectAgentTask&&!isCoderTask)throw Error("BLOCKED: PR_FEEDBACK reviewer, test, critic, explorer, and unknown agent lanes require structured dispatch_lanes_async provenance");if(!isInternalWorkflowTool&&!isDirectAgentTask&&!isDirectWrite&&!isShellTool&&!isNamedReadOnlyTool)throw Error("BLOCKED: PR_FEEDBACK rejects unclassified plugin/MCP tools; use positively classified observation tools, built-in structured write tools after verification, or the workflow controller");if(state.prHeadSha&&(isShellCheckout||isRemoteCheckoutTool))throw Error("BLOCKED: PR_FEEDBACK checkout is immutable after exact PR head binding");if(containsGitCommitShell&&state.prFeedbackReadyToPublish)throw Error("BLOCKED: PR_FEEDBACK is armed for publication; the approved commit is immutable");if((containsGitCommitShell||isPublicationShell)&&hasUnsafeShellControlSyntax(command))throw Error("BLOCKED: PR_FEEDBACK publication commands must be standalone shell commands without control, redirection, or command-substitution syntax");if(containsGitCommitShell&&!isStandaloneGitCommitShell)throw Error("BLOCKED: PR_FEEDBACK commit must use a standalone git commit command after every ordered local gate passes");if(state.prFeedbackReadyToPublish){if(normalizedTool==="complete_pr_workflow")return;if(isNamedReadOnlyTool)return;if((normalizedTool==="bash"||normalizedTool==="shell")&&command.length>0&&isAllowedPrWorkflowReadOnlyShell(command,{allowCheckout:!1,allowFetch:!1}))return;if(normalizedTool==="bash"||normalizedTool==="shell"){let armed=(await assertPrFeedbackPublicationArmed(directory,sessionID)).prFeedbackReadyToPublish;if(isSafeExactBoundPush(command,armed))return;throw Error(`BLOCKED: PR_FEEDBACK is armed for publication; only the exact approved push is allowed: ${expectedBoundPushCommand(armed)}`)}throw Error("BLOCKED: PR_FEEDBACK is armed for publication; only read-only inspection, the exact approved push, and complete_pr_workflow are allowed")}if(isStandaloneGitCommitShell){await assertPrFeedbackReadyToPublish(directory,sessionID);return}if(isPublicationShell||isPublicationTool)throw Error("BLOCKED: PR_FEEDBACK publication is not armed; finish every ordered gate, create the one approved commit, and call complete_pr_workflow before publishing");if(isShellCommandRequiringVerification)throw Error("BLOCKED: PR_FEEDBACK shell commands fail closed unless they are explicit read-only intake or the one standalone approved git commit; use structured coder/write tools for fixes and run_pr_feedback_stage_a for validation");if(!isDirectWrite&&!isShellCommandRequiringVerification&&!isRemoteMutationTool&&!isCoderTask)return;await assertPrFeedbackVerificationSettled(directory,sessionID)}async function completePrWorkflow(directory,sessionID,expectedMode,prHeadSha){let state=await requireBoundState(directory,sessionID,expectedMode),normalizedHead=normalizePrHeadSha(prHeadSha);if(state.prHeadSha!==normalizedHead)throw Error(`BLOCKED: cannot complete ${expectedMode} at PR head "${normalizedHead}"; workflow is bound to "${state.prHeadSha}"`);let open3=readDelegations(directory).filter((record2)=>record2.parentSessionId===state.sessionID&&record2.mode?.startsWith("swarm-pr-")&&(record2.status==="pending"||record2.status==="running"));if(open3.length>0)throw Error(`BLOCKED: ${expectedMode} completion has ${open3.length} unsettled PR workflow lane(s)`);if(expectedMode==="PR_REVIEW"){if(assertPrReviewCleanCheckout(directory),await assertPrReviewBaseCoverageSettled(directory,sessionID),!state.prReviewTriggerEvalPath)throw Error("BLOCKED: PR_REVIEW completion requires a persisted trigger evaluation artifact");if((state.prReviewValidationBatches??[]).some((batch)=>batch.phase==="council"))await assertPrReviewValidationSettled(directory,sessionID,"council");await assertPrReviewValidationSettled(directory,sessionID,"reviewer");let criticInventory=derivePrReviewCriticInventory(directory,state);if(criticInventory.length>0){if(!(state.prReviewValidationBatches??[]).some((batch)=>batch.phase==="critic"))throw Error(`BLOCKED: PR_REVIEW reviewer verdicts require critic coverage for: ${criticInventory.join(", ")}`);await assertPrReviewValidationSettled(directory,sessionID,"critic")}}else{let readyState=await assertPrFeedbackReadyToPublish(directory,sessionID),currentDigest=await currentPrFeedbackRevisionDigest(directory,readyState),armed=readyState.prFeedbackReadyToPublish;if(!armed){let localHead=_test_exports.resolveCurrentGitHead(directory)?.trim();if(!localHead)throw Error("BLOCKED: PR_FEEDBACK cannot arm publication without a verified local Git HEAD");if(_test_exports.resolveCommitCountSince(directory,state.prHeadSha,localHead)!==1)throw Error("BLOCKED: PR_FEEDBACK publication requires exactly one descendant commit after the immutable intake head");if(_test_exports.resolveIsExactSingleChildCommit(directory,state.prHeadSha,localHead)!==!0)throw Error("BLOCKED: PR_FEEDBACK publication commit must be a non-merge direct child of the immutable intake head");if(_test_exports.resolveIsWorkingTreeClean(directory)!==!0)throw Error("BLOCKED: PR_FEEDBACK publication requires a clean index and working tree so all approved content is captured by the bound commit");let upstreamTarget=_test_exports.resolveCurrentUpstreamPushTarget(directory);if(!upstreamTarget)throw Error("BLOCKED: PR_FEEDBACK cannot arm publication without a current branch bound to an exact remote name, remote branch ref, and remote-tracking ref");return await persistState(directory,{...readyState,updatedAt:isoNow(),prFeedbackReadyToPublish:{revisionDigest:currentDigest,localHead,remoteName:upstreamTarget.remoteName,remoteBranchRef:upstreamTarget.remoteBranchRef,remoteRef:upstreamTarget.remoteTrackingRef,validatedAt:isoNow()}}),"ready-to-publish"}if(armed.revisionDigest!==currentDigest)throw Error("BLOCKED: PR_FEEDBACK publication revision differs from the independently approved content digest");let publishedHead=_test_exports.resolveCurrentGitHead(directory)?.trim(),remoteRefs=publishedHead?_test_exports.resolveRemoteRefsContainingHead(directory,publishedHead):null,remoteHead=_test_exports.resolveExactRemoteBranchHead(directory,armed.remoteName,armed.remoteBranchRef);if(!publishedHead||publishedHead!==armed.localHead||!remoteRefs?.includes(armed.remoteRef)||remoteHead?.toLowerCase()!==armed.localHead.toLowerCase())throw Error(`BLOCKED: PR_FEEDBACK completion requires approved commit ${armed.localHead} at current Git HEAD and intended remote-tracking ref ${armed.remoteRef} at that exact commit`)}return await _test_exports.beforeTerminalClear?.(),await clearPrWorkflowGateState(directory,sessionID,state.revision),"completed"}async function requireAnyActiveState(directory,sessionID){let state=await readPrWorkflowGateState(directory,sessionID);if(!state)throw Error(`BLOCKED: no active PR workflow gate for session "${normalizeSessionID(sessionID)}"`);return state}async function requireBoundState(directory,sessionID,expectedMode){let state=await requireAnyActiveState(directory,sessionID);if(state.mode!==expectedMode)throw wrongModeError(state,expectedMode);if(!state.prHeadSha)throw Error(`BLOCKED: active ${expectedMode} workflow is not bound to a PR head`);if(expectedMode==="PR_REVIEW")assertCurrentCheckoutHead(directory,state.prHeadSha),assertPrReviewCleanCheckout(directory);return state}function wrongModeError(state,expectedMode){return Error(`BLOCKED: session "${state.sessionID}" is active in ${state.mode}, not ${expectedMode}`)}function normalizeWorkflowLanes(lanes){if(!Array.isArray(lanes)||lanes.length===0)throw Error("BLOCKED: PR workflow lane validation requires at least one lane");let normalized=lanes.map((lane)=>{let workflowLane=lane.workflowLane?.trim(),laneId=lane.laneId?.trim()||workflowLane;if(!workflowLane||!laneId)throw Error("BLOCKED: PR workflow lane validation requires every lane to have non-empty laneId and workflow_lane values");let reviewItemIds=lane.reviewItemIds?.map((itemId)=>itemId.trim());if(reviewItemIds?.some((itemId)=>!itemId))throw Error("BLOCKED: PR workflow review_item_ids must not contain empty values");if(reviewItemIds)assertNoDuplicates(reviewItemIds,"review item ids within one lane");return{laneId,workflowLane,...reviewItemIds?{reviewItemIds}:{}}});return assertNoDuplicates(normalized.map((lane)=>lane.laneId),"lane ids"),assertNoDuplicates(normalized.map((lane)=>lane.workflowLane),"workflow lane ids"),normalized}function normalizeInventoryIds(inventoryIds){if(!Array.isArray(inventoryIds)||inventoryIds.length===0)throw Error("BLOCKED: PR_FEEDBACK inventory declaration requires at least one feedback item id");let normalized=inventoryIds.map((inventoryId)=>{let itemId=inventoryId.trim();if(!itemId)throw Error("BLOCKED: PR_FEEDBACK inventory declaration contains an empty item id");return itemId});return assertNoDuplicates(normalized,"inventory item ids"),normalized.sort()}function normalizeOwnership(ownership){if(!Array.isArray(ownership)||ownership.length===0)throw Error("BLOCKED: PR_FEEDBACK verification ownership requires at least one lane declaration");let normalized=ownership.map((lane)=>{let laneId=lane.laneId?.trim();if(!laneId)throw Error("BLOCKED: PR_FEEDBACK verification ownership requires every lane to have a non-empty laneId");let ownedItemIds=normalizeInventoryIds(lane.ownedItemIds);return{laneId,ownedItemIds}});return assertNoDuplicates(normalized.map((lane)=>lane.laneId),"PR_FEEDBACK verification lane ids"),normalized}function assertNoDuplicates(values,label){let seen=new Set;for(let value of values){if(seen.has(value))throw Error(`BLOCKED: duplicate ${label} are not allowed: ${value}`);seen.add(value)}}function containsProtectedWorkflowPath(value){return/(?:^|[^A-Za-z0-9_.-])\.swarm(?:[\\/]|$)/i.test(value.replace(/\\\\/g,"\\"))}function isAllowedPrReviewReadOnlyToolName(toolName){if(PR_REVIEW_READ_ONLY_TOOL_NAMES.has(toolName))return!0;let tokens=toolName.split(/[._:/-]+/).filter(Boolean);if(tokens.some((token)=>/^(?:add|alter|and|append|apply|approve|cancel|checkout|close|comment|commit|convert|create|delete|destroy|dismiss|drop|edit|execute|grant|insert|mark|merge|move|patch|prepend|publish|push|ready|remove|rename|replace|resolve|rerun|revoke|run|send|submit|then|transfer|truncate|unresolve|update|upload|write)$/i.test(token)))return!1;return tokens.some((token)=>/^(?:check|checks|diff|fetch|find|get|glob|grep|hover|inspect|list|lookup|open|read|references|scan|screenshot|search|show|status|symbols|tree|view)$/i.test(token))}function readOnlyToolArgumentsAreSafe(value,key="",depth=0){if(depth>8)return!1;let keyTokens=key.replace(/([a-z0-9])([A-Z])/g,"$1_$2").split(/[._:/-]+/).filter(Boolean);if(keyTokens.some((token)=>/^(?:append|body|content|create|data|delete|destination|destroy|edit|insert|mutation|output|patch|payload|prepend|remove|replace|save|set|truncate|update|upload|write)$/i.test(token)))return!1;if(keyTokens.some((token)=>/^(?:method|verb)$/i.test(token)))return typeof value==="string"&&/^(?:GET|HEAD)$/i.test(value.trim());if(keyTokens.length===1&&keyTokens.some((token)=>/^(?:action|operation)$/i.test(token)))return typeof value==="string"&&/^(?:check|diff|fetch|find|get|inspect|list|lookup|open|read|scan|search|show|status|view)$/i.test(value.trim());if(/^mode$/i.test(key)&&typeof value==="string")return/^(?:r|rb|read)$/i.test(value.trim());if(typeof value==="string"){if(keyTokens.some((token)=>/^(?:query|request|sql|statement)$/i.test(token))&&/(?:\b(?:alter|call|comment|create|delete|drop|exec(?:ute)?|grant|insert|merge|mutation|replace|revoke|truncate|update|upsert)\b|\bselect\b[\s\S]{0,4000}\binto\s+[A-Za-z_"'`])/i.test(value))return!1;return!/(?:^(?:POST|PUT|PATCH|DELETE|CONNECT|TRACE|write|edit|patch|create|delete|destroy|remove|replace|truncate|update|upload)$|(?:^|[\r\n])\s*(?:POST|PUT|PATCH|DELETE|CONNECT|TRACE)\s+\S+(?:\s+HTTP\/\d(?:\.\d)?)?|\bmutation\b|\b(?:create|drop|alter|truncate)\s+(?:or\s+replace\s+)?(?:table|database|schema|index|view|function|procedure|trigger|sequence)\b|\b(?:delete\s+from|insert\s+into|merge\s+into|replace\s+into|upsert\s+into)\b|\bupdate\s+[A-Za-z0-9_."'`-]+(?:\s+(?:AS\s+)?[A-Za-z0-9_"'`-]+)?\s+set\b|\b(?:grant|revoke)\s+\S+\s+(?:on|from|to)\b|\b(?:call|exec(?:ute)?)\s+[A-Za-z0-9_."'`-]+|\b(?:rm|rmdir|del|remove-item|move-item|set-content|add-content)\b)/i.test(value)}if(value===null||value===void 0||typeof value==="number"||typeof value==="boolean")return!0;if(Array.isArray(value))return value.every((entry)=>readOnlyToolArgumentsAreSafe(entry,key,depth+1));if(typeof value==="object")return Object.entries(value).every(([childKey,childValue])=>readOnlyToolArgumentsAreSafe(childValue,childKey,depth+1));return!1}function isAllowedPrWorkflowReadOnlyShell(command,options){let normalized=command.trim().replace(/\s+/g," ");if(!normalized)return!1;if(/[\r\n;&|<>`]/.test(command)||/\$\(|@\(/.test(command))return!1;let gitMatch=normalized.match(/^git(?: -C (?:"[^"]+"|'[^']+'|\S+))* (.+)$/i);if(gitMatch?.[1])return isAllowedPrWorkflowGitIntake(gitMatch[1],options);if(/^gh /i.test(normalized))return isAllowedPrFeedbackGhIntake(normalized);if(/^rg\b/i.test(normalized)&&/\s--pre(?:-glob)?(?:\s|=|$)/i.test(normalized))return!1;return/^(?:rg|grep|cat|Get-Content|Select-String|Test-Path|Get-ChildItem|ls|dir|pwd)(?:\s|$)/i.test(normalized)}function hasUnsafeShellControlSyntax(command){return/[;&|<>`\r\n]/.test(command)||/\$\(/.test(command)}function isSafeStandaloneGitCommit(command){if(hasUnsafeShellControlSyntax(command))return!1;if(/(?:^|\s)--(?:allow-empty|amend)(?:\s|=|$)/i.test(command))return!1;return/^git(?:\s+-C(?:=|\s+)(?:"[^"\r\n]+"|'[^'\r\n]+'|[^\s;&|<>`]+))?\s+commit(?:\s+(?:"[^"\r\n]*"|'[^'\r\n]*'|[^\s;&|<>`]+))*\s*$/i.test(command.trim())}function boundPushTarget(armed){let remote=armed.remoteName,branch=armed.remoteBranchRef.slice(11);if(!armed.remoteBranchRef.startsWith("refs/heads/")||!branch)return null;if(/\s|[;&|<>`]/.test(remote)||/\s|[;&|<>`]/.test(branch))return null;return{remote,branch}}function expectedBoundPushCommand(armed){let target=boundPushTarget(armed);return target?`git push ${target.remote} ${armed.localHead}:refs/heads/${target.branch}`:"(invalid bound remote-tracking ref; restart the workflow)"}function isSafeExactBoundPush(command,armed){if(hasUnsafeShellControlSyntax(command))return!1;let target=boundPushTarget(armed);if(!target)return!1;let match=command.trim().match(/^git\s+push\s+([^\s;&|<>`]+)\s+([^\s;&|<>`]+)\s*$/i);if(!match)return!1;return match[1]===target.remote&&match[2]===`${armed.localHead}:refs/heads/${target.branch}`}function isAllowedPrWorkflowGitIntake(gitArgs,options){if(/(?:--ext-diff|--textconv|--open-files-in-pager|--output(?:=|\s)|--upload-pack(?:=|\s)|--exec(?:=|\s))/i.test(gitArgs))return!1;if(/^(?:status|log|show|diff|rev-parse|merge-base|ls-files|grep|blame|cat-file|for-each-ref)(?:\s|$)/i.test(gitArgs))return!0;if(options.allowFetch&&/^fetch(?:\s|$)/i.test(gitArgs))return!0;if(/^remote(?:\s+-v)?$/i.test(gitArgs))return!0;if(options.allowCheckout&&isAllowedPreBindBranchSetup(gitArgs))return!0;if(options.allowCheckout&&/^(?:checkout|switch)\s+(?:--detach\s+)?[^\s-][^\s]*$/i.test(gitArgs))return!0;return/^config\s+(?:(?:--show-origin|--show-scope|--global|--local|--system|--worktree)\s+)*(?:--list|--get(?:-all)?\s+\S+)$/i.test(gitArgs)}function isAllowedPreBindBranchSetup(gitArgs){let tokens=gitArgs.trim().split(/\s+/);if(tokens.length===5){let[verb,createFlag,localBranch,trackFlag,upstream]=tokens;return(verb==="checkout"||verb==="switch")&&(createFlag==="-b"||createFlag==="-c")&&trackFlag==="--track"&&isSafeGitRefToken(localBranch)&&isSafeGitRefToken(upstream)&&upstream.includes("/")}if(tokens.length===3&&tokens[0]==="branch"){let upstream=tokens[1].match(/^--set-upstream-to=(.+)$/)?.[1];return Boolean(upstream&&isSafeGitRefToken(upstream)&&upstream.includes("/")&&isSafeGitRefToken(tokens[2]))}return!1}function isSafeGitRefToken(value){return/^[A-Za-z0-9][A-Za-z0-9._/-]*$/.test(value)&&!value.includes("..")&&!value.includes("//")&&!value.includes("@{")&&!value.endsWith("/")&&!value.endsWith(".")&&!value.endsWith(".lock")}function isAllowedPrFeedbackGhIntake(command){if(/^gh\s+pr\s+(?:view|diff|checks|status|list|checkout)(?:\s|$)/i.test(command)||/^gh\s+run\s+(?:view|list|watch)(?:\s|$)/i.test(command)||/^gh\s+issue\s+(?:view|list)(?:\s|$)/i.test(command)||/^gh\s+search\s+(?:code|commits|issues|prs|repos)(?:\s|$)/i.test(command)||/^gh\s+auth\s+status(?:\s|$)/i.test(command))return!0;if(!/^gh\s+api(?:\s|$)/i.test(command))return!1;if(/\bmutation\b/i.test(command))return!1;let method=command.match(/\s(?:--method(?:\s+|=)|-X(?:\s+|=)?)([A-Z]+)/i)?.[1];if(method&&method.toUpperCase()!=="GET")return!1;if(/\s(?:--input|--raw-field)(?:\s|=)/i.test(command)||/\s-F(?:\s|=|\S)/.test(command))return!1;return!/\s(?:--field|-f)(?:\s|=)(?!query=)/i.test(command)}function normalizePrHeadSha(prHeadSha){let normalized=prHeadSha.trim();if(!normalized)throw Error("BLOCKED: PR workflow requires a non-empty pr_head_sha");return normalized}async function currentPrFeedbackRevisionDigest(directory,state){if(!state.prHeadSha)throw Error("BLOCKED: PR_FEEDBACK revision binding requires pr_head_sha");let digest2=await resolvePrWorkflowRevisionDigestForGate(directory,state.prHeadSha);if(!digest2)throw Error("BLOCKED: PR_FEEDBACK could not compute a bounded current-revision digest");return digest2}async function resolvePrWorkflowRevisionDigestForGate(directory,baseHeadSha){if(_test_exports.resolvePrWorkflowRevisionDigest!==resolvePrWorkflowRevisionDigest)return _test_exports.resolvePrWorkflowRevisionDigest(directory,baseHeadSha);return resolvePrWorkflowRevisionDigestAsync(directory,baseHeadSha)}function normalizeBatchId(batchId){let normalized=batchId.trim();if(!normalized)throw Error("BLOCKED: PR workflow requires a non-empty batch id");return normalized}function sameStringArray(left,right){return left.length===right.length&&left.every((value,index)=>value===right[index])}function assertExactStringSet(actual,expected,label){let actualSet=new Set(actual),expectedSet=new Set(expected),missing=[...expectedSet].filter((value)=>!actualSet.has(value)),extra=[...actualSet].filter((value)=>!expectedSet.has(value));if(actual.length!==actualSet.size||actualSet.size!==expectedSet.size||missing.length>0||extra.length>0)throw Error(`BLOCKED: ${label} must exactly cover the mechanically derived inventory; missing: ${missing.join(", ")||"(none)"}; extra: ${extra.join(", ")||"(none)"}`)}function derivePrReviewCandidateInventory(directory,state){let sources=[],selectedBaseDimensions=new Set;for(let batch of[...state.prReviewBaseDispatches??[]].reverse()){let successful=successfulObligationsFromExactBatch(directory,state,batch.batchId,batch.lanes,"swarm-pr-review:base",batch.validatedAt);for(let lane of batch.lanes)if(successful.has(lane.workflowLane)&&!selectedBaseDimensions.has(lane.workflowLane))sources.push({batchId:batch.batchId,laneId:lane.laneId,mode:"swarm-pr-review:base"}),selectedBaseDimensions.add(lane.workflowLane)}let selectedCouncilLanes=new Set;for(let batch of[...state.prReviewValidationBatches??[]].reverse()){if(batch.phase!=="council")continue;let successful=successfulObligationsFromExactBatch(directory,state,batch.batchId,batch.lanes,"swarm-pr-review:council",batch.validatedAt);for(let lane of batch.lanes)if(successful.has(lane.workflowLane)&&!selectedCouncilLanes.has(lane.workflowLane))sources.push({batchId:batch.batchId,laneId:lane.laneId,mode:"swarm-pr-review:council"}),selectedCouncilLanes.add(lane.workflowLane)}if(state.prReviewTriggerEvalPath){let triggerPath=validateSwarmPath(directory,state.prReviewTriggerEvalPath),triggerArtifact;try{triggerArtifact=JSON.parse(readFileSync6(triggerPath,"utf-8"))}catch{throw Error("BLOCKED: PR_REVIEW trigger evaluation artifact is missing or invalid")}let rows=triggerArtifact.rows;if(!Array.isArray(rows))throw Error("BLOCKED: PR_REVIEW trigger evaluation rows are invalid");let rowIds=rows.map((row)=>typeof row==="object"&&row!==null?row.trigger_id:void 0),provenanceTuples=rows.map((row)=>{if(typeof row!=="object"||row===null)return"";let{source_batch_id:batchId,source_lane_id:laneId}=row;return typeof batchId==="string"&&typeof laneId==="string"&&batchId.trim()&&laneId.trim()?`${batchId}\x00${laneId}`:""});if(!(rows.length===PR_REVIEW_REQUIRED_MICRO_LANE_IDS.length&&new Set(rowIds).size===PR_REVIEW_REQUIRED_MICRO_LANE_IDS.length&&provenanceTuples.every(Boolean)&&new Set(provenanceTuples).size===PR_REVIEW_REQUIRED_MICRO_LANE_IDS.length&&PR_REVIEW_REQUIRED_MICRO_LANE_IDS.every((id)=>rowIds.includes(id))&&rows.every((row)=>typeof row==="object"&&row!==null&&row.result==="MATCHED")))throw Error("BLOCKED: PR_REVIEW requires the exact all-MATCHED repository-agnostic micro-lane set with unique source provenance");for(let row of rows)if(typeof row==="object"&&row!==null&&row.result==="MATCHED"&&typeof row.source_batch_id==="string"&&typeof row.source_lane_id==="string")sources.push({batchId:row.source_batch_id,laneId:row.source_lane_id,mode:"swarm-pr-review:micro",workflowLane:row.trigger_id})}let candidateIds=[];for(let source of sources){let resolvedArtifact=!1;for(let record2 of findByBatchId(directory,source.batchId,{parentSessionId:state.sessionID})){if(record2.laneId!==source.laneId||record2.mode!==source.mode||record2.status!=="completed"||record2.workspace?.prHeadSha!==state.prHeadSha||record2.workspace?.gitHead!==state.prHeadSha||record2.result?.outputDegraded===!0||record2.result?.transcriptIncomplete===!0||record2.result?.truncated===!0)continue;let ref=record2.result?.outputRef?.trim(),artifact=ref?readLaneOutput(directory,ref)?.artifact:void 0;if(!artifact||!workflowArtifactHasContractMarker(directory,state,record2,source.mode,source.workflowLane??record2.workflowLane??source.laneId))continue;if(source.workflowLane&&(record2.workflowLane!==source.workflowLane||!prReviewDiscoveryArtifactCoversLane(artifact.text,source.workflowLane)))continue;resolvedArtifact=!0,candidateIds.push(...extractCandidateIds(artifact.text))}if(source.mode==="swarm-pr-review:micro"&&!resolvedArtifact)throw Error(`BLOCKED: PR_REVIEW mandatory micro-lane provenance is missing or invalid for ${source.workflowLane??source.laneId}`)}return assertNoDuplicates(candidateIds,"PR_REVIEW discovery candidate ids"),candidateIds.length>0?candidateIds.sort():["CLEAN-REVIEW"]}function extractCandidateIds(text){let candidateIds=[],markerHeaderSeen=!1;for(let line of text.split(/\r?\n/)){let fields=pipeFields(line);if(fields[0]==="[CANDIDATE]"&&fields[1]?.toLowerCase()==="candidate_id"){markerHeaderSeen=!0;continue}if(fields[0]==="[CANDIDATE]"&&fields.length>=10&&fields.slice(1,10).every(Boolean)){candidateIds.push(fields[1]);continue}if(markerHeaderSeen&&fields.length>=9&&fields[0]&&!fields[0].startsWith("[")&&fields.slice(0,9).every(Boolean))candidateIds.push(fields[0])}return candidateIds}function derivePrReviewCriticInventory(directory,state){return[...deriveLatestPrReviewReviewerVerdicts(directory,state).entries()].filter(([,verdict])=>verdict.classification==="CONFIRMED"&&["CRITICAL","HIGH","MEDIUM"].includes(verdict.severity)).map(([itemId])=>itemId).sort()}function deriveLatestPrReviewReviewerVerdicts(directory,state){let reviewerBatches=(state.prReviewValidationBatches??[]).filter((batch)=>batch.phase==="reviewer");for(let batch of[...reviewerBatches].reverse()){let successful=successfulObligationsFromExactBatch(directory,state,batch.batchId,batch.lanes,"swarm-pr-review:reviewer",batch.validatedAt);if(batch.lanes.some((lane)=>!successful.has(lane.workflowLane))||successful.size!==batch.lanes.length)continue;let required2=batch.lanes.flatMap((lane)=>lane.reviewItemIds??[]),verdicts=new Map;for(let lane of batch.lanes){let ref=findByBatchId(directory,batch.batchId,{parentSessionId:state.sessionID}).find((candidate)=>candidate.laneId===lane.laneId)?.result?.outputRef?.trim(),artifact=ref?readLaneOutput(directory,ref)?.artifact:void 0;if(!artifact)continue;for(let itemId of lane.reviewItemIds??[]){let verdict=parseReviewerVerdict(artifact.text,itemId);if(verdict)verdicts.set(itemId,verdict)}}if(required2.every((itemId)=>verdicts.has(itemId)))return verdicts}return new Map}function successfulObligationsFromExactBatch(directory,state,batchId,expectedLanes,expectedMode,validatedAt,checkWorkflowLane=!0,forbiddenSubagentSessionIds=new Set,expectedRevisionDigest){let records=findByBatchId(directory,batchId,{parentSessionId:state.sessionID}),successful=new Set,validatedAtMs=Date.parse(validatedAt);if(!Number.isFinite(validatedAtMs))return successful;let expectedByLaneId=new Map(expectedLanes.map((lane)=>[lane.laneId,lane]));if(expectedByLaneId.size!==expectedLanes.length)return successful;let recordCountByLaneId=new Map,recordCountBySubagentSessionId=new Map;for(let record2 of records){if(!record2.laneId||!expectedByLaneId.has(record2.laneId))continue;recordCountByLaneId.set(record2.laneId,(recordCountByLaneId.get(record2.laneId)??0)+1);let subagentSessionId=record2.subagentSessionId?.trim();if(subagentSessionId)recordCountBySubagentSessionId.set(subagentSessionId,(recordCountBySubagentSessionId.get(subagentSessionId)??0)+1)}for(let record2 of records){let expectedLane=record2.laneId?expectedByLaneId.get(record2.laneId):void 0,expectedWorkflowLane=expectedLane?.workflowLane,subagentSessionId=record2.subagentSessionId?.trim();if(expectedWorkflowLane!==void 0&&record2.laneId!==void 0&&recordCountByLaneId.get(record2.laneId)===1&&Boolean(subagentSessionId)&&recordCountBySubagentSessionId.get(subagentSessionId)===1&&!forbiddenSubagentSessionIds.has(subagentSessionId)&&record2.createdAt>=validatedAtMs&&(!checkWorkflowLane||record2.workflowLane===expectedWorkflowLane)&&record2.mode===expectedMode&&record2.workspace?.prHeadSha===state.prHeadSha&&record2.workspace?.gitHead===state.prHeadSha&&record2.status==="completed"&&record2.result?.outputDegraded!==!0&&record2.result?.transcriptIncomplete!==!0&&record2.result?.truncated!==!0&&(record2.result?.chars??0)>0&&Boolean(record2.result?.digest?.trim())&&Boolean(record2.result?.outputRef?.trim())&&workflowArtifactHasContractMarker(directory,state,record2,expectedMode,expectedWorkflowLane,expectedLane?.reviewItemIds,expectedRevisionDigest))successful.add(expectedWorkflowLane)}return successful}function workflowArtifactHasContractMarker(directory,state,record2,expectedMode,expectedWorkflowLane,reviewItemIds,expectedRevisionDigest){let ref=record2.result?.outputRef?.trim();if(!ref)return!1;let loaded=readLaneOutput(directory,ref);if(!loaded)return!1;let artifact=loaded.artifact,recordPrHeadSha=record2.workspace?.prHeadSha,recordGitHead=record2.workspace?.gitHead,resolvedRevisionDigest=expectedRevisionDigest??(recordPrHeadSha?_test_exports.resolvePrWorkflowRevisionDigest(directory,recordPrHeadSha):null),expectedReviewScope=state.mode==="PR_REVIEW"&&state.prReviewBaseSha&&state.prHeadSha?`complete PR diff ${state.prReviewBaseSha}...${state.prHeadSha}`:void 0;if(artifact.batchId!==record2.batchId||artifact.laneId!==record2.laneId||artifact.mode!==expectedMode||artifact.sessionId!==record2.subagentSessionId||artifact.parentSessionId!==record2.parentSessionId||artifact.agent!==record2.swarmPrefixedAgent||artifact.role!==record2.normalizedAgent||artifact.source!=="collect_lane_results"||artifact.workflowLane!==record2.workflowLane||artifact.workflowLane!==expectedWorkflowLane||!recordPrHeadSha||artifact.prHeadSha!==recordPrHeadSha||!recordGitHead||artifact.gitHead!==recordGitHead||!resolvedRevisionDigest||artifact.revisionDigest!==resolvedRevisionDigest||expectedReviewScope!==void 0&&(record2.workspace?.scope!==expectedReviewScope||artifact.scope!==expectedReviewScope)||artifact.digest!==record2.result?.digest||artifact.chars!==record2.result?.chars)return!1;if(expectedMode==="swarm-pr-review:reviewer")return Boolean(reviewItemIds?.length&&reviewItemIds.every((itemId)=>Boolean(parseReviewerVerdict(artifact.text,itemId))));if(expectedMode==="swarm-pr-review:critic"){let reviewerVerdicts=deriveLatestPrReviewReviewerVerdicts(directory,state);return Boolean(reviewItemIds?.length&&reviewItemIds.every((itemId)=>Boolean(parseCriticVerdict(artifact.text,itemId,reviewerVerdicts.get(itemId)?.severity))))}if(expectedMode==="swarm-pr-feedback:verification")return/^\[FEEDBACK-VERIFIED\]\s*\|/m.test(artifact.text);let feedbackVerdict={"swarm-pr-feedback:stage-b-reviewer":["[STAGE-B-REVIEW]","APPROVE"],"swarm-pr-feedback:stage-b-test":["[STAGE-B-TEST]","PASS"],"swarm-pr-feedback:closeout-reviewer":["[CLOSEOUT-REVIEW]","APPROVE"],"swarm-pr-feedback:closeout-critic":["[CLOSEOUT-CRITIC]","APPROVE"]}[expectedMode];if(feedbackVerdict)return Boolean(reviewItemIds?.length&&reviewItemIds.every((itemId)=>artifactHasExactPositiveVerdictRow(artifact.text,feedbackVerdict[0],itemId,feedbackVerdict[1])));return prReviewDiscoveryArtifactCoversLane(artifact.text,expectedWorkflowLane)}function prReviewDiscoveryArtifactCoversLane(text,expectedWorkflowLane){let lines=text.split(/\r?\n/),candidateHeaderSeen=!1;for(let line of lines){let fields=pipeFields(line);if(fields.length===0)continue;if(fields[0]==="[CLEAN]"&&fields.length>=4&&fields[1]===expectedWorkflowLane&&fields.slice(1,4).every(Boolean)&&fields[2].length>=12&&fields[3].length>=20)return!0;if(fields[0]==="[CANDIDATE]"){if(fields[1]?.toLowerCase()==="candidate_id"){candidateHeaderSeen=!0;continue}if(fields.length>=10&&fields[2]===expectedWorkflowLane&&fields.slice(1,10).every(Boolean))return!0;continue}if(candidateHeaderSeen&&fields.length>=9&&fields[0]?.toLowerCase()!=="candidate_id"&&fields[1]===expectedWorkflowLane&&fields.slice(0,9).every(Boolean))return!0}return!1}function parseReviewerVerdict(text,itemId){let rows=text.split(/\r?\n/).map(pipeFields).filter((fields2)=>fields2[0]==="[REVIEWED]"&&fields2[1]===itemId);if(rows.length!==1)return null;let fields=rows[0];if(fields.length!==10||!fields.slice(1).every(Boolean))return null;let introduced=fields[5].replace(/^introduced_by_pr\s*:\s*/i,"").toUpperCase();if(!REVIEWER_CLASSIFICATIONS.has(fields[2])||!REVIEWER_EVIDENCE_TYPES.has(fields[3])||!REVIEW_SEVERITIES.has(fields[4])||!["YES","NO","UNKNOWN"].includes(introduced))return null;if(fields[7].length<8||fields[8].length<5||fields[9].length<3)return null;return{classification:fields[2],severity:fields[4]}}function parseCriticVerdict(text,itemId,reviewerSeverity){let rows=text.split(/\r?\n/).map(pipeFields).filter((fields2)=>fields2[0]==="[CRITIC]"&&fields2[1]===itemId);if(rows.length!==1)return null;let fields=rows[0];if(fields.length!==6||!fields.slice(1).every(Boolean)||!CRITIC_STATUSES.has(fields[2])||!REVIEW_SEVERITIES.has(fields[3]))return null;if(fields[2]==="NEEDS_MORE_EVIDENCE")return null;if(fields[2]==="DISPROVED"&&fields[3]!=="NONE")return null;if(fields[2]==="UPHELD"&&!["CRITICAL","HIGH","MEDIUM"].includes(fields[3]))return null;if(fields[2]==="DOWNGRADED"&&fields[3]==="CRITICAL")return null;if(reviewerSeverity){let severityRank=new Map([["NONE",0],["INFO",1],["LOW",2],["MEDIUM",3],["HIGH",4],["CRITICAL",5]]),reviewerRank=severityRank.get(reviewerSeverity),criticRank=severityRank.get(fields[3]);if(reviewerRank===void 0||criticRank===void 0)return null;if(fields[2]==="UPHELD"&&criticRank!==reviewerRank)return null;if(fields[2]==="DOWNGRADED"&&criticRank>=reviewerRank)return null}if(fields[4].length<6||fields[5].length<6)return null;return{status:fields[2],severity:fields[3]}}function artifactHasExactPositiveVerdictRow(text,marker,itemId,positiveVerdict){let rows=text.split(/\r?\n/).map(pipeFields).filter((fields)=>fields[0]===marker&&fields[1]===itemId);return rows.length===1&&rows[0].length>=4&&rows[0][2]===positiveVerdict&&rows[0].slice(1,4).every(Boolean)}function pipeFields(line){if(!line.includes("|"))return[];return line.split("|").map((field)=>field.trim())}function feedbackArtifactCoversItems(directory,state,batchId,laneId,itemIds){let ref=findByBatchId(directory,batchId,{parentSessionId:state.sessionID}).find((candidate)=>candidate.laneId===laneId)?.result?.outputRef?.trim(),loaded=ref?readLaneOutput(directory,ref):null;if(!loaded)return!1;let rows=loaded.artifact.text.split(/\r?\n/).map(pipeFields).filter((fields)=>fields[0]==="[FEEDBACK-VERIFIED]");if(rows.length!==itemIds.length)return!1;return itemIds.every((itemId)=>{let matches=rows.filter((fields)=>fields[1]===itemId);return matches.length===1&&matches[0].length===4&&matches[0].slice(1,4).every(Boolean)&&FEEDBACK_CLASSIFICATIONS.has(matches[0][2])})}async function persistState(directory,state){let validated=PrWorkflowGateStateSchema.parse(state);await withSessionStateMutation(directory,validated.sessionID,async()=>{let current=await readPrWorkflowGateStateFromDisk(directory,validated.sessionID);if(current?current.revision!==validated.revision:validated.revision!==0)throw Error("BLOCKED: PR workflow gate state changed concurrently; reload the active session state before retrying");let nextRevision=validated.revision+1,nextState={...validated,revision:nextRevision},filePath=workflowGateStatePath(directory,validated.sessionID);await fsp2.mkdir(path11.dirname(filePath),{recursive:!0}),await writeAtomicJson2(filePath,nextState),Object.assign(state,nextState),rememberState(directory,nextState)})}async function withSessionStateMutation(directory,sessionID,action){let key=stateCacheKey(directory,sessionID),previous=pendingStateMutationsByProjectSession.get(key)??Promise.resolve(),release,current=new Promise((resolve8)=>{release=resolve8}),queued=previous.then(()=>current);pendingStateMutationsByProjectSession.set(key,queued),await previous;try{let lock=await acquireSessionStateMutationLock(directory,sessionID);try{return await action()}finally{await releaseSessionStateMutationLock(lock)}}finally{if(release(),pendingStateMutationsByProjectSession.get(key)===queued)pendingStateMutationsByProjectSession.delete(key)}}async function acquireSessionStateMutationLock(directory,sessionID){let lockPath=workflowGateStateLockPath(directory,sessionID);await fsp2.mkdir(path11.dirname(lockPath),{recursive:!0});for(let attempt=0;attempt<STATE_MUTATION_LOCK_MAX_ATTEMPTS;attempt++)try{let handle=await fsp2.open(lockPath,"wx"),lock={ownerToken:randomUUID2(),pid:process.pid,createdAtMs:_test_exports.nowMs()};try{await handle.writeFile(JSON.stringify(lock),"utf-8"),await handle.close()}catch(error49){throw await removeSessionStateMutationLockIfOwned(lockPath,lock.ownerToken),error49}return{path:lockPath,ownerToken:lock.ownerToken}}catch(error49){if(error49.code!=="EEXIST")throw error49;if(await reclaimAbandonedSessionStateMutationLock(lockPath))continue;if(attempt<STATE_MUTATION_LOCK_MAX_ATTEMPTS-1)await delay(STATE_MUTATION_LOCK_RETRY_DELAY_MS)}throw Error("BLOCKED: PR workflow gate state is being mutated by another process; retry after that session transition finishes")}async function releaseSessionStateMutationLock(lock){try{await removeSessionStateMutationLockIfOwned(lock.path,lock.ownerToken)}catch{}}async function reclaimAbandonedSessionStateMutationLock(lockPath){let lock=await readSessionStateMutationLock(lockPath);if(lock){if(_test_exports.isProcessAlive(lock.pid))return!1;return removeSessionStateMutationLockIfOwned(lockPath,lock.ownerToken)}try{let stat6=await fsp2.stat(lockPath);if(_test_exports.nowMs()-stat6.mtimeMs<STATE_MUTATION_LOCK_UNINITIALIZED_STALE_MS)return!1;return await fsp2.rm(lockPath,{force:!0}),!0}catch(error49){if(error49.code==="ENOENT")return!0;throw error49}}async function readSessionStateMutationLock(lockPath){let raw;try{raw=await fsp2.readFile(lockPath,"utf-8")}catch(error49){if(error49.code==="ENOENT")return null;throw error49}try{let parsed=JSON.parse(raw);if(typeof parsed==="object"&&parsed!==null&&typeof parsed.ownerToken==="string"&&parsed.ownerToken.length>0&&typeof parsed.pid==="number"&&Number.isInteger(parsed.pid)&&parsed.pid>0&&typeof parsed.createdAtMs==="number"&&Number.isFinite(parsed.createdAtMs))return parsed}catch{}return null}async function removeSessionStateMutationLockIfOwned(lockPath,ownerToken){let lock=await readSessionStateMutationLock(lockPath);if(!lock||lock.ownerToken!==ownerToken)return!1;try{return await fsp2.rm(lockPath),!0}catch(error49){if(error49.code==="ENOENT")return!1;throw error49}}function isProcessAlive(pid){try{return process.kill(pid,0),!0}catch(error49){return error49.code!=="ESRCH"}}async function readPrWorkflowGateStateFromDisk(directory,sessionID){let filePath=workflowGateStatePath(directory,sessionID),raw;try{raw=await fsp2.readFile(filePath,"utf-8")}catch(error49){if(error49.code==="ENOENT")return null;throw error49}let parsedJson;try{parsedJson=JSON.parse(raw)}catch{throw Error(`BLOCKED: PR workflow gate state for session "${sessionID}" is not valid JSON`)}let parsed=PrWorkflowGateStateSchema.safeParse(parsedJson);if(!parsed.success)throw Error(`BLOCKED: PR workflow gate state for session "${sessionID}" is invalid`);return parsed.data}function rememberState(directory,state){let cacheKey=stateCacheKey(directory,state.sessionID);trackedStatesByProjectSession.delete(cacheKey),trackedStatesByProjectSession.set(cacheKey,state);while(trackedStatesByProjectSession.size>MAX_TRACKED_SESSIONS){let oldestKey=trackedStatesByProjectSession.keys().next().value;if(!oldestKey)break;trackedStatesByProjectSession.delete(oldestKey)}}function stateCacheKey(directory,sessionID){let resolved=path11.normalize(path11.resolve(directory));return`${process.platform==="win32"?resolved.toLowerCase():resolved}\x00${normalizeSessionID(sessionID)}`}function workflowGateStatePath(directory,sessionID){return validateSwarmPath(directory,workflowGateStateRelativePath(sessionID))}function workflowGateStateLockPath(directory,sessionID){return validateSwarmPath(directory,workflowGateStateLockRelativePath(sessionID))}function workflowGateStateLockRelativePath(sessionID){return path11.join(WORKFLOW_GATE_DIR,`${safeSessionFileStem(sessionID)}.lock`)}function workflowGateStateRelativePath(sessionID){return path11.join(WORKFLOW_GATE_DIR,`${safeSessionFileStem(sessionID)}.json`)}function safeSessionFileStem(sessionID){let normalized=normalizeSessionID(sessionID),slug=normalized.replace(/[^A-Za-z0-9_.-]/g,"_").slice(0,80)||"session",digest2=createHash5("sha256").update(normalized).digest("hex").slice(0,12);return`${slug}-${digest2}`}function normalizeSessionID(sessionID){let normalized=sessionID.trim();if(!normalized)throw Error("BLOCKED: PR workflow gate requires a non-empty sessionID");return normalized}async function writeAtomicJson2(filePath,value){let tempPath=`${filePath}.tmp.${process.pid}.${randomUUID2()}`,lastError;try{await fsp2.writeFile(tempPath,JSON.stringify(value,null,2),"utf-8");for(let attempt=0;attempt<WINDOWS_RENAME_MAX_RETRIES3;attempt++)try{await fsp2.rename(tempPath,filePath),lastError=void 0;break}catch(error49){lastError=error49;let code=error49.code;if(code!=="EEXIST"&&code!=="EPERM"&&code!=="EBUSY")break;if(attempt<WINDOWS_RENAME_MAX_RETRIES3-1)await delay(RENAME_RETRY_DELAY_MS)}if(lastError)throw lastError}finally{try{await fsp2.rm(tempPath,{force:!0})}catch{}}}function isoNow(){return new Date().toISOString()}function delay(ms){return new Promise((resolve8)=>setTimeout(resolve8,ms))}var PR_REVIEW_BASE_DIMENSION_IDS,PR_REVIEW_REQUIRED_MICRO_LANE_IDS,GATE_SCHEMA_VERSION=1,MAX_TRACKED_SESSIONS=200,MAX_WORKFLOW_BATCHES=128,WINDOWS_RENAME_MAX_RETRIES3=3,RENAME_RETRY_DELAY_MS=10,STATE_MUTATION_LOCK_MAX_ATTEMPTS=50,STATE_MUTATION_LOCK_RETRY_DELAY_MS=10,STATE_MUTATION_LOCK_UNINITIALIZED_STALE_MS=30000,DISPATCH_TOOL_NAME="dispatch_lanes_async",BLOCKING_DISPATCH_TOOL_NAME="dispatch_lanes",WORKFLOW_GATE_DIR="pr-workflow-gates",trackedStatesByProjectSession,pendingStateMutationsByProjectSession,PrReviewBaseDispatchRecordSchema,PrFeedbackLaneOwnershipSchema,PrFeedbackVerificationRecordSchema,PrFeedbackStageACheckReceiptSchema,PrFeedbackStageARecordSchema,PrFeedbackGateBatchRecordSchema,PrFeedbackReadyToPublishRecordSchema,PrReviewValidationBatchRecordSchema,PrWorkflowGateStateSchema,PR_FEEDBACK_PHASE_ORDER,PR_FEEDBACK_PHASE_ROLE,_test_exports,PR_WORKFLOW_CONTROLLER_TOOLS,PR_REVIEW_READ_ONLY_TOOL_NAMES,REVIEWER_CLASSIFICATIONS,REVIEWER_EVIDENCE_TYPES,REVIEW_SEVERITIES,CRITIC_STATUSES,FEEDBACK_CLASSIFICATIONS;var init_pr_workflow_gate=__esm(()=>{init_zod();init_lane_output_store();init_pending_delegations();init_workspace_snapshot();init_constants();init_schema();init_utils2();PR_REVIEW_BASE_DIMENSION_IDS=["intent-architecture","correctness-state","tests-falsifiability","security-trust","reliability-performance","compatibility-delivery"],PR_REVIEW_REQUIRED_MICRO_LANE_IDS=["auth-identity-secrets","untrusted-input-boundaries","subprocess-platform","concurrency-state","dependencies-build-release","api-schema-migrations","test-infrastructure","ui-accessibility-i18n","privacy-observability","generated-provenance","unclassified-risk"],trackedStatesByProjectSession=new Map,pendingStateMutationsByProjectSession=new Map,PrReviewBaseDispatchRecordSchema=exports_external.object({batchId:exports_external.string().min(1),lanes:exports_external.array(exports_external.object({laneId:exports_external.string().min(1),workflowLane:exports_external.enum(["intent-architecture","correctness-state","tests-falsifiability","security-trust","reliability-performance","compatibility-delivery"])}).strict()).min(1),validatedAt:exports_external.string().min(1)}).strict(),PrFeedbackLaneOwnershipSchema=exports_external.object({laneId:exports_external.string().min(1),ownedItemIds:exports_external.array(exports_external.string().min(1)).min(1)}).strict(),PrFeedbackVerificationRecordSchema=exports_external.object({batchId:exports_external.string().min(1),ownership:exports_external.array(PrFeedbackLaneOwnershipSchema).min(1),validatedAt:exports_external.string().min(1)}).strict(),PrFeedbackStageACheckReceiptSchema=exports_external.object({category:exports_external.enum(["build","typecheck","lint","diff-check","reproduction"]),workingDirectory:exports_external.string().min(1).optional(),obligationId:exports_external.string().min(1).optional(),validatorContract:exports_external.object({path:exports_external.string().min(1),id:exports_external.string().min(1)}).strict().optional(),command:exports_external.array(exports_external.string().min(1)).min(1),targets:exports_external.array(exports_external.string().min(1)).min(1).optional(),feedbackTargets:exports_external.array(exports_external.object({feedbackItemId:exports_external.string().min(1),target:exports_external.string().min(1),expectedBehavior:exports_external.string().min(8)}).strict()).min(1).optional(),durationMs:exports_external.number().nonnegative()}).strict(),PrFeedbackStageARecordSchema=exports_external.object({revisionDigest:exports_external.string().min(1),checks:exports_external.array(PrFeedbackStageACheckReceiptSchema).min(2).max(258),feedbackItemIds:exports_external.array(exports_external.string().min(1)).min(1).optional(),applicableCategories:exports_external.array(exports_external.enum(["build","typecheck","lint"])).max(3).optional(),applicableObligations:exports_external.array(exports_external.object({id:exports_external.string().min(1),category:exports_external.enum(["build","typecheck","lint"]),workingDirectory:exports_external.string().min(1),source:exports_external.string().min(1),validatorContract:exports_external.object({path:exports_external.string().min(1),id:exports_external.string().min(1)}).strict().optional()}).strict()).max(256).optional(),validatedAt:exports_external.string().min(1)}).strict(),PrFeedbackGateBatchRecordSchema=exports_external.object({batchId:exports_external.string().min(1),phase:exports_external.enum(["stage-b-reviewer","stage-b-test","closeout-reviewer","closeout-critic"]),laneId:exports_external.string().min(1),itemIds:exports_external.array(exports_external.string().min(1)).min(1),revisionDigest:exports_external.string().min(1),validatedAt:exports_external.string().min(1)}).strict(),PrFeedbackReadyToPublishRecordSchema=exports_external.object({revisionDigest:exports_external.string().min(1),localHead:exports_external.string().min(1),remoteName:exports_external.string().min(1),remoteBranchRef:exports_external.string().startsWith("refs/heads/"),remoteRef:exports_external.string().startsWith("refs/remotes/"),validatedAt:exports_external.string().min(1)}).strict(),PrReviewValidationBatchRecordSchema=exports_external.object({batchId:exports_external.string().min(1),phase:exports_external.enum(["council","reviewer","critic"]),lanes:exports_external.array(exports_external.object({laneId:exports_external.string().min(1),workflowLane:exports_external.string().min(1),reviewItemIds:exports_external.array(exports_external.string().min(1)).min(1).optional()}).strict()).min(1),validatedAt:exports_external.string().min(1)}).strict(),PrWorkflowGateStateSchema=exports_external.object({schemaVersion:exports_external.literal(GATE_SCHEMA_VERSION),revision:exports_external.number().int().nonnegative().default(0),sessionID:exports_external.string().min(1),mode:exports_external.enum(["PR_REVIEW","PR_FEEDBACK"]),activatedAt:exports_external.string().min(1),updatedAt:exports_external.string().min(1),prHeadSha:exports_external.string().min(1).optional(),prReviewBaseRef:exports_external.string().min(1).optional(),prReviewBaseSha:exports_external.string().min(1).optional(),prReviewBaseDispatches:exports_external.array(PrReviewBaseDispatchRecordSchema).max(MAX_WORKFLOW_BATCHES).optional(),prReviewBaseDispatch:PrReviewBaseDispatchRecordSchema.optional(),prReviewTriggerEvalPath:exports_external.string().min(1).optional(),prReviewValidationBatches:exports_external.array(PrReviewValidationBatchRecordSchema).max(MAX_WORKFLOW_BATCHES).optional(),prFeedbackInventory:exports_external.array(exports_external.string().min(1)).min(1).optional(),prFeedbackVerifications:exports_external.array(PrFeedbackVerificationRecordSchema).max(MAX_WORKFLOW_BATCHES).optional(),prFeedbackVerification:PrFeedbackVerificationRecordSchema.optional(),prFeedbackStageA:PrFeedbackStageARecordSchema.optional(),prFeedbackGateBatches:exports_external.array(PrFeedbackGateBatchRecordSchema).max(MAX_WORKFLOW_BATCHES).optional(),prFeedbackReadyToPublish:PrFeedbackReadyToPublishRecordSchema.optional()}).strict();PR_FEEDBACK_PHASE_ORDER=["stage-b-reviewer","stage-b-test","closeout-reviewer","closeout-critic"];PR_FEEDBACK_PHASE_ROLE={"stage-b-reviewer":"reviewer","stage-b-test":"test_engineer","closeout-reviewer":"reviewer","closeout-critic":"critic"};_test_exports={workflowGateStateRelativePath,workflowGateStateLockRelativePath,resetTrackedStateCache:()=>{trackedStatesByProjectSession.clear(),pendingStateMutationsByProjectSession.clear(),_test_exports.beforeTerminalClear=void 0},beforeTerminalClear:void 0,resolveCurrentGitHead,resolveCurrentUpstreamPushTarget,resolveCurrentUpstreamRemoteRef,resolveExactRemoteBranchHead,resolveCommitCountSince,resolveIsWorkingTreeClean,resolveIsExactSingleChildCommit,resolvePrWorkflowRevisionDigest,resolveRemoteRefsContainingHead,parseCriticVerdict,isProcessAlive,nowMs:()=>Date.now()};PR_WORKFLOW_CONTROLLER_TOOLS=new Set(["collect_lane_results","complete_pr_workflow","dispatch_lanes_async","get_async_result","get_async_status","run_pr_feedback_stage_a","write_pr_review_trigger_eval"]),PR_REVIEW_READ_ONLY_TOOL_NAMES=new Set(["ast_grep_search","codesearch","glob","grep","lsp","open","read","search","tree","view","webfetch","websearch"]);REVIEWER_CLASSIFICATIONS=new Set(["CONFIRMED","DISPROVED","UNVERIFIED","PRE_EXISTING"]),REVIEWER_EVIDENCE_TYPES=new Set(["STRUCTURALLY_PROVEN","EXECUTION_PROVEN","STATIC_TRACE_PROVEN","PLAUSIBLE_BUT_UNVERIFIED"]),REVIEW_SEVERITIES=new Set(["CRITICAL","HIGH","MEDIUM","LOW","INFO","NONE"]),CRITIC_STATUSES=new Set(["UPHELD","DOWNGRADED","DISPROVED","NEEDS_MORE_EVIDENCE"]),FEEDBACK_CLASSIFICATIONS=new Set(["CONFIRMED","PARTIAL","DISPROVED","PRE_EXISTING","NEEDS_MORE_EVIDENCE","NEEDS_USER_DECISION"])});var exports_runner_client={};__export(exports_runner_client,{probe:()=>probe,execute:()=>execute,buildDefaultPolicy:()=>buildDefaultPolicy,_resetProbeCache:()=>_resetProbeCache,_internals:()=>_internals7,RUNNER_EXIT_CODES:()=>RUNNER_EXIT_CODES});import{spawn as spawn2,spawnSync as spawnSync2}from"node:child_process";import*as fs8 from"node:fs";import*as os3 from"node:os";import*as path12 from"node:path";import{fileURLToPath}from"node:url";function findRunnerBinary(){let arch=process.arch==="x64"?"x64":"arm64",platform="win32",packagePaths=[path12.resolve(_runtimeDir,"..","..","..","binaries",`win32-${arch}`,"swarm-sandbox-runner.exe"),path12.resolve(_runtimeDir,"..","..","..","..","binaries",`win32-${arch}`,"swarm-sandbox-runner.exe")];for(let p of packagePaths)try{if(fs8.existsSync(p))return p}catch{}try{let result=spawnSync2("where",["swarm-sandbox-runner.exe"],{windowsHide:!0,encoding:"utf-8",timeout:2000,stdio:["ignore","pipe","ignore"]});if(result.status===0&&result.stdout?.trim())return result.stdout.trim().split(`
169
+ `).match(/^# branch\.oid (.+)$/m);if(!oidMatch)return null;let gitHead=/^[0-9a-f]{6,64}$/i.test(oidMatch[1])?oidMatch[1]:oidMatch[1]==="(initial)"?null:null,paths=[];for(let index=0;index<records.length;index++){let record2=records[index];if(!record2)continue;if(record2.startsWith("? ")){paths.push(record2.slice(2));continue}if(record2.startsWith("1 ")){let changedPath=porcelainV2PathAfterFields(record2,8);if(!changedPath)return null;paths.push(changedPath);continue}if(record2.startsWith("2 ")){let changedPath=porcelainV2PathAfterFields(record2,9),originalPath=records[++index];if(!changedPath||!originalPath)return null;paths.push(changedPath,originalPath);continue}if(record2.startsWith("u ")){let changedPath=porcelainV2PathAfterFields(record2,10);if(!changedPath)return null;paths.push(changedPath);continue}return null}return{gitHead,changedFiles:[...new Set(paths)]}}function porcelainV2PathAfterFields(record2,fields){let offset=0;for(let index=0;index<fields;index++){let delimiter=record2.indexOf(" ",offset);if(delimiter<0)return null;offset=delimiter+1}return record2.slice(offset)||null}function captureWorkspaceSnapshot(directory,optionsOrScope=null,prHeadShaArg=null){let scope=typeof optionsOrScope==="object"&&optionsOrScope!==null?optionsOrScope.scope??null:optionsOrScope,configuredPrHeadSha=(()=>{if(typeof optionsOrScope!=="object"||optionsOrScope===null)return prHeadShaArg;return optionsOrScope.prHeadSha??null})(),resolveCurrentPrHeadSha=typeof optionsOrScope==="object"&&optionsOrScope!==null&&optionsOrScope.resolveCurrentPrHeadSha===!0,upstreamBefore=resolveCurrentPrHeadSha?runGit(directory,["rev-parse","@{upstream}"]):null,porcelain=runGit(directory,["status","--porcelain=v2","--branch","-z","--untracked-files=all"]),snapshot=porcelain===null?null:parsePorcelainV2Snapshot(porcelain),upstreamAfter=resolveCurrentPrHeadSha?runGit(directory,["rev-parse","@{upstream}"]):null,prHeadSha=resolveCurrentPrHeadSha?upstreamBefore&&upstreamBefore===upstreamAfter?upstreamBefore:null:configuredPrHeadSha;return{directory:path10.resolve(directory),gitHead:snapshot?.gitHead??null,dirtyHash:porcelain===null?null:digest(porcelain),changedFiles:snapshot?.changedFiles??null,prHeadSha,scope}}function changedFilesSinceSnapshot(directory,baseline){if(!baseline?.gitHead||baseline.changedFiles==null)return null;if(baseline.changedFiles.length>0)return null;let current=captureWorkspaceSnapshot(directory);if(!current.gitHead||current.changedFiles==null)return null;let changed=new Set(current.changedFiles);if(baseline.gitHead!==current.gitHead){let committed=runGit(directory,["diff","--name-only","-z",baseline.gitHead,current.gitHead]);if(committed===null)return null;for(let changedPath of parseNulPaths(committed))changed.add(changedPath)}return[...changed]}function workspaceSnapshotMatches(expected,current){if(!expected)return{ok:!0};if(path10.resolve(expected.directory)!==path10.resolve(current.directory))return{ok:!1,reason:`directory changed: expected ${expected.directory}, got ${current.directory}`};let checks3=["gitHead","dirtyHash","prHeadSha"];for(let key of checks3){let expectedValue=expected[key];if(expectedValue===null)continue;if(current[key]!==expectedValue)return{ok:!1,reason:`${key} changed: expected ${expectedValue}, got ${current[key]??"unknown"}`}}return{ok:!0}}function compareWorkspaceSnapshots(expected,current){let result=workspaceSnapshotMatches(expected,current);if(result.ok)return{stale:!1};return{stale:!0,reason:result.reason}}function digest(text){return createHash4("sha256").update(text).digest("hex")}var GIT_SNAPSHOT_TIMEOUT_MS=3000,GIT_SNAPSHOT_MAX_BUFFER=524288,REVISION_MAX_FILES=5000,REVISION_MAX_TOTAL_BYTES=67108864,REVISION_READ_CHUNK_BYTES=65536,REVISION_YIELD_EVERY_CHUNKS=16,compareWorkspaceSnapshot,_internals6;var init_workspace_snapshot=__esm(()=>{compareWorkspaceSnapshot=workspaceSnapshotMatches;_internals6={spawnSync:child_process.spawnSync,yieldControl:()=>new Promise((resolve7)=>setImmediate(resolve7)),parsePorcelainV2Snapshot}});import{createHash as createHash5,randomUUID as randomUUID2}from"node:crypto";import{readFileSync as readFileSync6}from"node:fs";import*as fsp2 from"node:fs/promises";import*as path11 from"node:path";async function activatePrWorkflow(directory,sessionID,mode,options={}){let normalizedSessionID=normalizeSessionID(sessionID),existing=await readPrWorkflowGateState(directory,normalizedSessionID);if(existing?.mode===mode)return options.prHeadSha?bindPrWorkflowHead(directory,normalizedSessionID,options.prHeadSha):existing;if(existing)throw Error(`BLOCKED: session "${normalizedSessionID}" already has an active ${existing.mode} workflow; complete it before starting ${mode}`);let initialHead=options.prHeadSha?assertCurrentCheckoutHead(directory,options.prHeadSha):void 0,timestamp=isoNow(),nextState={schemaVersion:GATE_SCHEMA_VERSION,revision:0,sessionID:normalizedSessionID,mode,activatedAt:timestamp,updatedAt:timestamp,...initialHead?{prHeadSha:initialHead}:{}};return await persistState(directory,nextState),nextState}async function readPrWorkflowGateState(directory,sessionID){let normalizedSessionID=normalizeSessionID(sessionID),state=await readPrWorkflowGateStateFromDisk(directory,normalizedSessionID);if(state)rememberState(directory,state);else trackedStatesByProjectSession.delete(stateCacheKey(directory,normalizedSessionID));return state}async function clearPrWorkflowGateState(directory,sessionID,expectedRevision){let normalizedSessionID=normalizeSessionID(sessionID);await withSessionStateMutation(directory,normalizedSessionID,async()=>{let current=await readPrWorkflowGateStateFromDisk(directory,normalizedSessionID);if(expectedRevision!==void 0&&(!current||current.revision!==expectedRevision))throw Error("BLOCKED: PR workflow gate state changed during terminal completion; revalidate the current session state before retrying");try{await fsp2.rm(workflowGateStatePath(directory,normalizedSessionID),{force:!0})}catch(error49){if(error49.code!=="ENOENT")throw error49}trackedStatesByProjectSession.delete(stateCacheKey(directory,normalizedSessionID))})}async function abortPrWorkflow(directory,sessionID,options={}){let state=await requireAnyActiveState(directory,sessionID);if(options.expectedMode&&state.mode!==options.expectedMode)throw wrongModeError(state,options.expectedMode);if(state.prFeedbackReadyToPublish)throw Error(`BLOCKED: ${state.mode} is armed for publication; abort is blocked. Complete the workflow with complete_pr_workflow (or push the bound commit first) before aborting.`);let openLanes=readDelegations(directory).filter((record2)=>record2.parentSessionId===state.sessionID&&record2.mode?.startsWith("swarm-pr-")&&(record2.status==="pending"||record2.status==="running"));if(openLanes.length>0){let laneIds=openLanes.map((record2)=>record2.laneId??record2.subagentSessionId??"unknown").filter(Boolean).slice(0,10).join(", ");throw Error(`BLOCKED: ${state.mode} abort refused while ${openLanes.length} PR workflow lane(s) are still in flight (lane ids: ${laneIds}). Collect their results or let them settle before aborting.`)}let sanitizedReason=typeof options.reason==="string"?options.reason.trim().slice(0,500):void 0,abortEvent={type:"pr_workflow_aborted",timestamp:isoNow(),sessionID:state.sessionID,mode:state.mode,...state.prHeadSha?{prHeadSha:state.prHeadSha}:{},openLanes:openLanes.length,...sanitizedReason?{reason:sanitizedReason}:{}};try{let eventsPath=validateSwarmPath(directory,"events.jsonl");await fsp2.appendFile(eventsPath,`${JSON.stringify(abortEvent)}
170
+ `,"utf-8")}catch{}return await clearPrWorkflowGateState(directory,sessionID,state.revision),{mode:state.mode,...state.prHeadSha?{prHeadSha:state.prHeadSha}:{},openLanes:openLanes.length}}async function bindPrWorkflowHead(directory,sessionID,prHeadSha){let state=await requireAnyActiveState(directory,sessionID),normalizedHead=normalizePrHeadSha(prHeadSha);if(assertCurrentCheckoutHead(directory,normalizedHead),state.mode==="PR_REVIEW")assertPrReviewCleanCheckout(directory);if(state.prHeadSha&&state.prHeadSha!==normalizedHead)throw Error(`BLOCKED: active ${state.mode} workflow is bound to PR head "${state.prHeadSha}"; received "${normalizedHead}"`);if(state.prHeadSha===normalizedHead)return state;let nextState={...state,prHeadSha:normalizedHead,updatedAt:isoNow()};return await persistState(directory,nextState),nextState}async function bindPrReviewBase(directory,sessionID,options){let state=await bindPrWorkflowHead(directory,sessionID,options.prHeadSha);if(state.mode!=="PR_REVIEW")throw Error("BLOCKED: only PR_REVIEW can bind a review merge base");let baseRef=options.baseRef.trim(),baseSha=normalizePrHeadSha(options.baseSha).toLowerCase();if(!baseRef)throw Error("BLOCKED: PR_REVIEW base_ref must not be empty");if(state.prReviewBaseRef&&state.prReviewBaseRef!==baseRef||state.prReviewBaseSha&&state.prReviewBaseSha!==baseSha)throw Error(`BLOCKED: active PR_REVIEW is bound to merge-base scope "${state.prReviewBaseRef??"(unbound)"}" at "${state.prReviewBaseSha??"(unbound)"}"; received "${baseRef}" at "${baseSha}"`);if(state.prReviewBaseRef===baseRef&&state.prReviewBaseSha===baseSha)return state;return state={...state,prReviewBaseRef:baseRef,prReviewBaseSha:baseSha,updatedAt:isoNow()},await persistState(directory,state),state}function assertCurrentCheckoutHead(directory,expectedHead){let normalizedExpected=normalizePrHeadSha(expectedHead),currentHead=_test_exports.resolveCurrentGitHead(directory)?.trim();if(!currentHead)throw Error(`BLOCKED: cannot verify the current Git HEAD against PR head "${normalizedExpected}"`);if(currentHead.toLowerCase()!==normalizedExpected.toLowerCase())throw Error(`BLOCKED: current checkout HEAD "${currentHead}" does not match PR head "${normalizedExpected}"`);return normalizedExpected}function assertPrReviewCleanCheckout(directory){if(_test_exports.resolveIsWorkingTreeClean(directory)!==!0)throw Error("BLOCKED: PR_REVIEW requires a clean index and working tree at the exact PR head")}async function enforcePrWorkflowDispatchLanesAsync(directory,sessionID,toolName){let state=await readPrWorkflowGateState(directory,sessionID);if(!state)return null;if(toolName===DISPATCH_TOOL_NAME)return state;if(toolName===BLOCKING_DISPATCH_TOOL_NAME)throw Error(`BLOCKED: active ${state.mode} workflow for session "${state.sessionID}" requires ${DISPATCH_TOOL_NAME}; ${BLOCKING_DISPATCH_TOOL_NAME} is not allowed`);return state}async function enforcePrReviewBaseDimensions(directory,sessionID,lanes,options){let state=await bindPrWorkflowHead(directory,sessionID,options.prHeadSha);if(state.mode!=="PR_REVIEW")throw wrongModeError(state,"PR_REVIEW");let normalizedLanes=normalizeWorkflowLanes(lanes),workflowLaneIds=normalizedLanes.map((lane)=>lane.workflowLane);if(workflowLaneIds.filter((laneId)=>!PR_REVIEW_BASE_DIMENSION_IDS.includes(laneId)).length>0){let expected=PR_REVIEW_BASE_DIMENSION_IDS.join(", "),received=workflowLaneIds.join(", ")||"(none)";throw Error(`BLOCKED: PR_REVIEW base dispatch lane ids must be drawn from: ${expected}. Received: ${received}`)}let batchId=normalizeBatchId(options.batchId),previous=state.prReviewBaseDispatches??[];if(previous.some((record3)=>record3.batchId===batchId))throw Error(`BLOCKED: PR_REVIEW base batch id "${batchId}" is already recorded`);if(previous.length>=MAX_WORKFLOW_BATCHES)throw Error("BLOCKED: PR_REVIEW base batch limit reached");let record2={batchId,lanes:normalizedLanes.map((lane)=>({laneId:lane.laneId,workflowLane:lane.workflowLane})),validatedAt:isoNow()},nextState={...state,updatedAt:isoNow(),prReviewBaseDispatches:[...previous,record2],prReviewBaseDispatch:record2};return await persistState(directory,nextState),nextState}async function assertPrReviewBaseCoverageSettled(directory,sessionID){let state=await requireBoundState(directory,sessionID,"PR_REVIEW"),batches=state.prReviewBaseDispatches??[];if(batches.length===0)throw Error("BLOCKED: PR_REVIEW requires at least one base batch");let covered=new Set;for(let batch of batches){let successful=successfulObligationsFromExactBatch(directory,state,batch.batchId,batch.lanes,"swarm-pr-review:base",batch.validatedAt);for(let obligation of successful)covered.add(obligation)}let missing=PR_REVIEW_BASE_DIMENSION_IDS.filter((dimension)=>!covered.has(dimension));if(missing.length>0||covered.size!==PR_REVIEW_BASE_DIMENSION_IDS.length)throw Error(`BLOCKED: PR_REVIEW base coverage is incomplete; missing dimensions: ${missing.join(", ")||"(none)"}`);return state}async function recordPrReviewValidationBatch(directory,sessionID,phase,lanes,options){let state=await bindPrWorkflowHead(directory,sessionID,options.prHeadSha);if(state.mode!=="PR_REVIEW")throw wrongModeError(state,"PR_REVIEW");if(!state.prReviewTriggerEvalPath)throw Error("BLOCKED: PR_REVIEW validation dispatch requires a completed trigger evaluation");if(phase==="reviewer"&&(state.prReviewValidationBatches??[]).some((batch)=>batch.phase==="council"))state=await assertPrReviewValidationSettled(directory,sessionID,"council");else if(phase==="critic")state=await assertPrReviewValidationSettled(directory,sessionID,"reviewer");let normalizedLanes=normalizeWorkflowLanes(lanes);if((phase==="reviewer"||phase==="critic")&&normalizedLanes.some((lane)=>!lane.reviewItemIds?.length))throw Error(`BLOCKED: PR_REVIEW ${phase} lanes require non-empty review_item_ids ownership`);if(phase==="reviewer"||phase==="critic"){assertNoDuplicates(normalizedLanes.flatMap((lane)=>lane.reviewItemIds??[]),`PR_REVIEW ${phase} review item ownership`);let assigned=normalizedLanes.flatMap((lane)=>lane.reviewItemIds??[]),required2=phase==="reviewer"?derivePrReviewCandidateInventory(directory,state):derivePrReviewCriticInventory(directory,state);assertExactStringSet(assigned,required2,`PR_REVIEW ${phase} ownership`)}let batchId=normalizeBatchId(options.batchId),previous=state.prReviewValidationBatches??[];if(previous.some((batch)=>batch.batchId===batchId))throw Error(`BLOCKED: PR_REVIEW validation batch id "${batchId}" is already recorded`);if(previous.length>=MAX_WORKFLOW_BATCHES)throw Error("BLOCKED: PR_REVIEW validation batch limit reached");let record2={batchId,phase,lanes:normalizedLanes,validatedAt:isoNow()},retained=phase==="reviewer"?previous.filter((batch)=>batch.phase!=="critic"):previous,nextState={...state,updatedAt:isoNow(),prReviewValidationBatches:[...retained,record2]};return await persistState(directory,nextState),nextState}async function assertPrReviewValidationSettled(directory,sessionID,phase){let state=await requireBoundState(directory,sessionID,"PR_REVIEW"),declaredPhases=new Set((state.prReviewValidationBatches??[]).map((batch)=>batch.phase)),phases=phase?[phase]:["council","reviewer","critic"].filter((candidate)=>declaredPhases.has(candidate));for(let requiredPhase of phases){let validationBatches=state.prReviewValidationBatches??[],forbiddenSubagentSessionIds=new Set;if(requiredPhase==="critic")for(let reviewerBatch of validationBatches.filter((batch)=>batch.phase==="reviewer"))for(let record2 of findByBatchId(directory,reviewerBatch.batchId,{parentSessionId:state.sessionID})){let subagentSessionId=record2.subagentSessionId?.trim();if(subagentSessionId)forbiddenSubagentSessionIds.add(subagentSessionId)}let batches=validationBatches.filter((batch)=>batch.phase===requiredPhase);if(requiredPhase==="reviewer"){let latestCouncilIndex=-1;for(let index=0;index<validationBatches.length;index++)if(validationBatches[index]?.phase==="council")latestCouncilIndex=index;if(latestCouncilIndex>=0)batches=validationBatches.slice(latestCouncilIndex+1).filter((batch)=>batch.phase==="reviewer")}if(batches.length===0)throw Error(requiredPhase==="reviewer"&&declaredPhases.has("council")?"BLOCKED: PR_REVIEW requires at least one reviewer batch after the latest council batch":`BLOCKED: PR_REVIEW requires at least one ${requiredPhase} batch`);let allObligations=new Set(batches.flatMap((batch)=>batch.lanes.map((lane)=>lane.workflowLane))),settled=new Set,hasFullySuccessfulExactBatch=!1;for(let batch of batches){let successful=successfulObligationsFromExactBatch(directory,state,batch.batchId,batch.lanes,`swarm-pr-review:${requiredPhase}`,batch.validatedAt,!0,forbiddenSubagentSessionIds);if(successful.size===batch.lanes.length&&batch.lanes.every((lane)=>successful.has(lane.workflowLane)))hasFullySuccessfulExactBatch=!0;for(let obligation of successful)settled.add(obligation)}if((requiredPhase==="reviewer"||requiredPhase==="critic")&&!hasFullySuccessfulExactBatch)throw Error(`BLOCKED: PR_REVIEW ${requiredPhase} requires one fully successful exact batch; complementary partial retries are not a coherent verdict set`);let missing=[...allObligations].filter((obligation)=>!settled.has(obligation));if(missing.length>0)throw Error(`BLOCKED: PR_REVIEW ${requiredPhase} obligations lack successful exact artifacts: ${missing.join(", ")}`)}return state}async function declarePrFeedbackInventory(directory,sessionID,inventoryIds,options){let state=await bindPrWorkflowHead(directory,sessionID,options.prHeadSha);if(state.mode!=="PR_FEEDBACK")throw wrongModeError(state,"PR_FEEDBACK");let normalizedInventory=normalizeInventoryIds(inventoryIds);if(state.prFeedbackInventory){if(!sameStringArray(state.prFeedbackInventory,normalizedInventory))throw Error("BLOCKED: PR_FEEDBACK inventory is immutable after declaration");return state}let nextState={...state,updatedAt:isoNow(),prFeedbackInventory:normalizedInventory,prFeedbackVerifications:[]};return await persistState(directory,nextState),nextState}async function enforcePrFeedbackVerificationOwnership(directory,sessionID,ownership,options){let state=await bindPrWorkflowHead(directory,sessionID,options.prHeadSha);if(state.mode!=="PR_FEEDBACK")throw wrongModeError(state,"PR_FEEDBACK");let inventory=state.prFeedbackInventory;if(!inventory||inventory.length===0)throw Error(`BLOCKED: PR_FEEDBACK verification for session "${state.sessionID}" requires a declared feedback inventory before dispatch`);let normalizedOwnership=normalizeOwnership(ownership),inventorySet=new Set(inventory),claimedByItemId=new Map,previous=state.prFeedbackVerifications??[],batchId=normalizeBatchId(options.batchId);if(previous.some((record3)=>record3.batchId===batchId))throw Error(`BLOCKED: PR_FEEDBACK verification batch id "${batchId}" is already recorded`);if(previous.length>=MAX_WORKFLOW_BATCHES)throw Error("BLOCKED: PR_FEEDBACK verification batch limit reached");for(let record3 of previous)for(let lane of record3.ownership)for(let itemId of lane.ownedItemIds)claimedByItemId.set(itemId,lane.laneId);for(let lane of normalizedOwnership)for(let itemId of lane.ownedItemIds){if(!inventorySet.has(itemId))throw Error(`BLOCKED: PR_FEEDBACK verification lane "${lane.laneId}" owns undeclared item "${itemId}"`);let previousLane=claimedByItemId.get(itemId);if(previousLane&&previousLane!==lane.laneId)throw Error(`BLOCKED: PR_FEEDBACK verification item "${itemId}" is owned by both "${previousLane}" and "${lane.laneId}"`);claimedByItemId.set(itemId,lane.laneId)}let record2={batchId,ownership:normalizedOwnership,validatedAt:isoNow()},nextState={...state,updatedAt:isoNow(),prFeedbackVerifications:[...previous,record2],prFeedbackVerification:record2};return await persistState(directory,nextState),nextState}async function assertPrFeedbackVerificationSettled(directory,sessionID){let state=await requireBoundState(directory,sessionID,"PR_FEEDBACK"),currentDigest=await currentPrFeedbackRevisionDigest(directory,state),inventory=state.prFeedbackInventory,batches=state.prFeedbackVerifications??[];if(!inventory||batches.length===0)throw Error("BLOCKED: PR_FEEDBACK requires an immutable inventory and verification batches");let covered=new Set;for(let batch of batches){let successfulLaneIds=successfulObligationsFromExactBatch(directory,state,batch.batchId,batch.ownership.map((lane)=>({laneId:lane.laneId,workflowLane:lane.laneId})),"swarm-pr-feedback:verification",batch.validatedAt,!1,new Set,currentDigest);for(let lane of batch.ownership){if(!successfulLaneIds.has(lane.laneId))continue;if(!feedbackArtifactCoversItems(directory,state,batch.batchId,lane.laneId,lane.ownedItemIds))continue;for(let itemId of lane.ownedItemIds)covered.add(itemId)}}let missing=inventory.filter((itemId)=>!covered.has(itemId));if(missing.length>0||covered.size!==inventory.length)throw Error(`BLOCKED: PR_FEEDBACK verification ownership is incomplete; missing inventory items: ${missing.join(", ")||"(none)"}`);return state}async function recordPrFeedbackStageA(directory,sessionID,revisionDigest,checks3,options={}){let state=await assertPrFeedbackVerificationSettled(directory,sessionID),currentDigest=await currentPrFeedbackRevisionDigest(directory,state);if(revisionDigest!==currentDigest)throw Error("BLOCKED: PR_FEEDBACK Stage A receipt is stale because the working-tree revision changed during validation");if(checks3.length<2||checks3.length>258)throw Error("BLOCKED: PR_FEEDBACK Stage A requires two to 258 controller-created check receipts");let optionalCategoryOrder=["build","typecheck","lint"],applicableCategories=options.applicableCategories??optionalCategoryOrder.filter((category)=>checks3.some((check2)=>check2.category===category));if(assertNoDuplicates(applicableCategories,"PR_FEEDBACK Stage A applicable categories"),applicableCategories.some((category)=>!optionalCategoryOrder.includes(category)))throw Error("BLOCKED: PR_FEEDBACK Stage A applicability may contain only build, typecheck, and lint");let required2=new Set(["diff-check","reproduction",...applicableCategories]),singletonSeen=new Set,applicableObligations=[...options.applicableObligations??[]];assertNoDuplicates(applicableObligations.map(({id})=>id),"PR_FEEDBACK Stage A applicable obligations");let requiredObligationIds=new Set(applicableObligations.map(({id})=>id)),commandDigests=new Set,reproductionFeedbackItemIds=[];for(let check2 of checks3){if(["diff-check","reproduction"].includes(check2.category)&&singletonSeen.has(check2.category))throw Error(`BLOCKED: PR_FEEDBACK Stage A contains duplicate category "${check2.category}"`);if(singletonSeen.add(check2.category),required2.delete(check2.category),check2.obligationId){let obligation=applicableObligations.find((candidate)=>candidate.id===check2.obligationId);if(!obligation||obligation.category!==check2.category||obligation.workingDirectory!==(check2.workingDirectory??".")||!requiredObligationIds.delete(check2.obligationId))throw Error(`BLOCKED: PR_FEEDBACK Stage A receipt does not match one exact applicable obligation: ${check2.obligationId}`);let sourceContract=obligation.source.includes(".pr-validation.json#")?{path:obligation.source.slice(0,obligation.source.lastIndexOf("#")),id:obligation.source.slice(obligation.source.lastIndexOf("#")+1)}:void 0,requiredContract=obligation.validatorContract??sourceContract;if(requiredContract&&(check2.validatorContract?.path!==requiredContract.path||check2.validatorContract.id!==requiredContract.id))throw Error(`BLOCKED: PR_FEEDBACK Stage A obligation ${obligation.id} requires exact validator contract provenance`)}let commandDigest=createHash5("sha256").update(`${check2.obligationId??check2.category}\x00${check2.workingDirectory??"."}\x00${check2.command.join("\x00")}`).digest("hex");if(commandDigests.has(commandDigest))throw Error("BLOCKED: PR_FEEDBACK Stage A cannot reuse one command as multiple check receipts");if(commandDigests.add(commandDigest),check2.category==="diff-check"&&!sameStringArray(check2.command,["git","diff","--check"]))throw Error("BLOCKED: PR_FEEDBACK Stage A diff-check receipt is not the exact git diff --check command");if(check2.category==="reproduction"&&(!check2.targets?.length||!check2.feedbackTargets?.length||check2.targets.some((target)=>!check2.command.join(" ").includes(target))))throw Error("BLOCKED: PR_FEEDBACK Stage A reproduction receipt requires exact selected targets");if(check2.category==="reproduction"){if(reproductionFeedbackItemIds=check2.feedbackTargets.map((mapping)=>mapping.feedbackItemId),assertNoDuplicates(reproductionFeedbackItemIds,"PR_FEEDBACK Stage A reproduction feedback item mappings"),check2.feedbackTargets.some((mapping)=>!check2.targets.includes(mapping.target)))throw Error("BLOCKED: PR_FEEDBACK Stage A feedback mappings must reference exact executed reproduction targets")}}if(required2.size>0)throw Error(`BLOCKED: PR_FEEDBACK Stage A is missing required checks: ${[...required2].join(", ")}`);if(requiredObligationIds.size>0)throw Error(`BLOCKED: PR_FEEDBACK Stage A is missing applicable workspace obligations: ${[...requiredObligationIds].join(", ")}`);if(!sameStringArray(reproductionFeedbackItemIds,state.prFeedbackInventory??[]))throw Error("BLOCKED: PR_FEEDBACK Stage A reproduction must map every immutable feedback item exactly once and in declared order");let nextState={...state,updatedAt:isoNow(),prFeedbackStageA:{revisionDigest:currentDigest,checks:[...checks3],feedbackItemIds:reproductionFeedbackItemIds,applicableCategories:optionalCategoryOrder.filter((category)=>applicableCategories.includes(category)),applicableObligations,validatedAt:isoNow()},prFeedbackGateBatches:[],prFeedbackReadyToPublish:void 0};return await persistState(directory,nextState),nextState}async function recordPrFeedbackGateBatch(directory,sessionID,phase,lane,options){let state=await bindPrWorkflowHead(directory,sessionID,options.prHeadSha);if(state.mode!=="PR_FEEDBACK")throw wrongModeError(state,"PR_FEEDBACK");let inventory=state.prFeedbackInventory;if(!inventory?.length)throw Error("BLOCKED: PR_FEEDBACK ordered gates require an immutable feedback inventory");let normalized=normalizeOwnership([lane])[0];if(!sameStringArray(normalized.ownedItemIds,inventory))throw Error(`BLOCKED: PR_FEEDBACK ${phase} must own every inventory item exactly once and in declared order`);let phaseIndex=PR_FEEDBACK_PHASE_ORDER.indexOf(phase),prerequisite=PR_FEEDBACK_PHASE_ORDER[phaseIndex-1];if(prerequisite)state=await assertPrFeedbackGatePhaseSettled(directory,sessionID,prerequisite);let{prFeedbackStageA:stageA,prFeedbackInventory:refreshedInventory}=state,currentDigest=await currentPrFeedbackRevisionDigest(directory,state);if(!stageA||!refreshedInventory||stageA.revisionDigest!==currentDigest||!sameStringArray(stageA.feedbackItemIds??[],refreshedInventory)||options.revisionDigest!==currentDigest)throw Error(`BLOCKED: PR_FEEDBACK ${phase} requires fresh Stage A checks on the current revision`);let batchId=normalizeBatchId(options.batchId),previous=state.prFeedbackGateBatches??[];if(previous.some((batch)=>batch.batchId===batchId))throw Error(`BLOCKED: PR_FEEDBACK gate batch id "${batchId}" is already recorded`);let retained=previous.filter((batch)=>PR_FEEDBACK_PHASE_ORDER.indexOf(batch.phase)<phaseIndex),record2={batchId,phase,laneId:normalized.laneId,itemIds:normalized.ownedItemIds,revisionDigest:currentDigest,validatedAt:isoNow()},nextState={...state,updatedAt:isoNow(),prFeedbackGateBatches:[...retained,record2]};return await persistState(directory,nextState),nextState}async function assertPrFeedbackGatePhaseSettled(directory,sessionID,phase){let state=await requireBoundState(directory,sessionID,"PR_FEEDBACK"),currentDigest=await currentPrFeedbackRevisionDigest(directory,state);if(state.prFeedbackStageA?.revisionDigest!==currentDigest)throw Error(`BLOCKED: PR_FEEDBACK ${phase} cannot use stale Stage A evidence`);if(!sameStringArray(state.prFeedbackStageA?.feedbackItemIds??[],state.prFeedbackInventory??[]))throw Error(`BLOCKED: PR_FEEDBACK ${phase} Stage A reproduction is not bound to the exact immutable feedback inventory`);let batch=[...state.prFeedbackGateBatches??[]].reverse().find((candidate)=>candidate.phase===phase);if(!batch||batch.revisionDigest!==currentDigest)throw Error(`BLOCKED: PR_FEEDBACK ${phase} has no validation batch on the current revision`);if(!successfulObligationsFromExactBatch(directory,state,batch.batchId,[{laneId:batch.laneId,workflowLane:phase,reviewItemIds:batch.itemIds}],`swarm-pr-feedback:${phase}`,batch.validatedAt,!0,new Set,currentDigest).has(phase))throw Error(`BLOCKED: PR_FEEDBACK ${phase} requires one complete, non-degraded positive verdict row per inventory item`);if(findByBatchId(directory,batch.batchId,{parentSessionId:state.sessionID}).find((candidate)=>candidate.laneId===batch.laneId)?.workspace?.dirtyHash!==currentDigest)throw Error(`BLOCKED: PR_FEEDBACK ${phase} artifact is not bound to the current revision digest`);return assertIndependentFeedbackGateSessions(directory,state,phase),state}function assertIndependentFeedbackGateSessions(directory,state,throughPhase){let throughIndex=PR_FEEDBACK_PHASE_ORDER.indexOf(throughPhase),batches=(state.prFeedbackGateBatches??[]).filter((batch)=>PR_FEEDBACK_PHASE_ORDER.indexOf(batch.phase)<=throughIndex),seenSessions=new Set;for(let batch of batches){let matching=findByBatchId(directory,batch.batchId,{parentSessionId:state.sessionID}).filter((record3)=>record3.laneId===batch.laneId);if(matching.length!==1)throw Error(`BLOCKED: PR_FEEDBACK ${batch.phase} must resolve from exactly one durable child session`);let record2=matching[0],expectedRole=PR_FEEDBACK_PHASE_ROLE[batch.phase];if(!(record2.normalizedAgent===expectedRole||expectedRole==="critic"&&record2.normalizedAgent.startsWith("critic_")))throw Error(`BLOCKED: PR_FEEDBACK ${batch.phase} requires role ${expectedRole}, received ${record2.normalizedAgent||"(unknown)"}`);if(seenSessions.has(record2.subagentSessionId))throw Error(`BLOCKED: PR_FEEDBACK independent phases reused child session "${record2.subagentSessionId}"`);seenSessions.add(record2.subagentSessionId)}}async function assertPrFeedbackReadyToPublish(directory,sessionID){let state=await assertPrFeedbackVerificationSettled(directory,sessionID);for(let phase of PR_FEEDBACK_PHASE_ORDER)state=await assertPrFeedbackGatePhaseSettled(directory,sessionID,phase);return state}async function assertPrFeedbackPublicationArmed(directory,sessionID){let state=await requireBoundState(directory,sessionID,"PR_FEEDBACK"),armed=state.prFeedbackReadyToPublish;if(!armed)throw Error("BLOCKED: PR_FEEDBACK publication is not armed; call complete_pr_workflow once after every ordered gate passes");let currentDigest=await currentPrFeedbackRevisionDigest(directory,state);if(armed.revisionDigest!==currentDigest)throw Error("BLOCKED: PR_FEEDBACK changed after publication was armed; rerun Stage A and every independent gate");if(_test_exports.resolveCurrentGitHead(directory)?.trim()!==armed.localHead)throw Error("BLOCKED: PR_FEEDBACK current Git HEAD changed after publication was armed");if(_test_exports.resolveIsWorkingTreeClean(directory)!==!0)throw Error("BLOCKED: PR_FEEDBACK working tree changed after publication was armed");let currentTarget=_test_exports.resolveCurrentUpstreamPushTarget(directory);if(!currentTarget||currentTarget.remoteName!==armed.remoteName||currentTarget.remoteBranchRef!==armed.remoteBranchRef||currentTarget.remoteTrackingRef!==armed.remoteRef)throw Error("BLOCKED: PR_FEEDBACK upstream publication target changed after publication was armed");return state}async function markPrReviewTriggerEvaluationComplete(directory,sessionID,artifactPath){let state=await assertPrReviewBaseCoverageSettled(directory,sessionID),normalizedPath=artifactPath.trim();if(!normalizedPath)throw Error("BLOCKED: PR_REVIEW trigger artifact path is required");let nextState={...state,updatedAt:isoNow(),prReviewTriggerEvalPath:normalizedPath};return await persistState(directory,nextState),nextState}async function enforcePrWorkflowToolBefore(directory,sessionID,toolName,args2,generatedAgentNames=[]){let state=await readPrWorkflowGateState(directory,sessionID);if(!state)return;let normalizedTool=toolName.toLowerCase(),isDirectAgentTask=normalizedTool==="task"||normalizedTool==="run_agent",requestedRoles=["subagent_type","agent"].filter((field)=>Object.hasOwn(args2??{},field)).map((field)=>{let value=args2?.[field];if(typeof value!=="string"||!value.trim())return"";return resolveGeneratedAgentRole(value.trim(),generatedAgentNames)}),isDirectWrite=WRITE_TOOL_NAMES.includes(normalizedTool),command=typeof args2?.command==="string"?args2.command.trim():"",serializedArgs=JSON.stringify(args2??{}),referencesProtectedWorkflowEvidence=containsProtectedWorkflowPath(command||serializedArgs),isInternalWorkflowTool=PR_WORKFLOW_CONTROLLER_TOOLS.has(normalizedTool),isShellTool=normalizedTool==="bash"||normalizedTool==="shell",isReadOnlyShell=isShellTool&&command.length>0&&isAllowedPrWorkflowReadOnlyShell(command,{allowCheckout:!state.prHeadSha,allowFetch:!state.prHeadSha}),isNamedReadOnlyTool=isAllowedPrReviewReadOnlyToolName(normalizedTool)&&readOnlyToolArgumentsAreSafe(args2??{});if(referencesProtectedWorkflowEvidence&&!isInternalWorkflowTool&&!isNamedReadOnlyTool&&!isReadOnlyShell)throw Error(`BLOCKED: active ${state.mode} workflow evidence under .swarm is controller-owned and cannot be modified directly`);let isShellCommandRequiringVerification=isShellTool&&command.length>0&&!isReadOnlyShell,isRemoteReviewTool=/(?:git|github|pull|(?:^|[_-])pr(?:[_-]|$)|issue|review)/i.test(normalizedTool),hasRemoteMutationVerb=/(?:^|[_-])(?:add|approve|cancel|close|comment|commit|convert|create|delete|dismiss|edit|mark|merge|push|ready|reopen|rerun|resolve|submit|transfer|unresolve|update)(?:[_-]|$)/i.test(normalizedTool),hasRemoteReadVerb=/(?:^|[_-])(?:github|git)[_-]+(?:check|checks|checkout|diff|fetch|get|inspect|list|read|search|status|view)(?:[_-]|$)/i.test(normalizedTool)||/(?:^|[_-])(?:github|git)[_-]+(?:pull[_-]+request|pr|issue|review[_-]+thread)[_-]+(?:check|checks|checkout|diff|fetch|get|inspect|list|read|search|status|view)(?:[_-]|$)/i.test(normalizedTool),isRemoteMutationTool=isRemoteReviewTool&&(hasRemoteMutationVerb||!hasRemoteReadVerb),isRemoteCheckoutTool=/(?:^|[_-])(?:github|git)[_-]+checkout(?:[_-]|$)/i.test(normalizedTool),isShellCheckout=(normalizedTool==="bash"||normalizedTool==="shell")&&(/\bgit\b(?:(?![;&|]).){0,200}\b(?:checkout|switch)\b/i.test(command)||/\bgh\s+pr\s+checkout\b/i.test(command)),containsGitCommitShell=isShellCommandRequiringVerification&&/\bgit\b(?:(?![;&|]).){0,200}\bcommit\b/i.test(command),isStandaloneGitCommitShell=containsGitCommitShell&&isSafeStandaloneGitCommit(command),isPublicationShell=isShellCommandRequiringVerification&&(/\bgit\b(?:(?![;&|]).){0,200}\bpush\b/i.test(command)||/\bgh\s+(?:api|pr|issue|run)\b/i.test(command)),isPublicationTool=!isInternalWorkflowTool&&isRemoteMutationTool,isCoderTask=isDirectAgentTask&&requestedRoles.length>0&&requestedRoles.every((role)=>role==="coder");if(state.mode==="PR_REVIEW"){if(!(isInternalWorkflowTool||isNamedReadOnlyTool||isReadOnlyShell)||Boolean(state.prHeadSha)&&(isRemoteCheckoutTool||isShellCheckout))throw Error("BLOCKED: PR_REVIEW is read-only and fail-closed; only controller tools and positively classified observation tools are allowed, and every agent lane requires structured dispatch_lanes_async");return}if(isDirectAgentTask&&!isCoderTask)throw Error("BLOCKED: PR_FEEDBACK reviewer, test, critic, explorer, and unknown agent lanes require structured dispatch_lanes_async provenance");if(!isInternalWorkflowTool&&!isDirectAgentTask&&!isDirectWrite&&!isShellTool&&!isNamedReadOnlyTool)throw Error("BLOCKED: PR_FEEDBACK rejects unclassified plugin/MCP tools; use positively classified observation tools, built-in structured write tools after verification, or the workflow controller");if(state.prHeadSha&&(isShellCheckout||isRemoteCheckoutTool))throw Error("BLOCKED: PR_FEEDBACK checkout is immutable after exact PR head binding");if(containsGitCommitShell&&state.prFeedbackReadyToPublish)throw Error("BLOCKED: PR_FEEDBACK is armed for publication; the approved commit is immutable");if((containsGitCommitShell||isPublicationShell)&&hasUnsafeShellControlSyntax(command))throw Error("BLOCKED: PR_FEEDBACK publication commands must be standalone shell commands without control, redirection, or command-substitution syntax");if(containsGitCommitShell&&!isStandaloneGitCommitShell)throw Error("BLOCKED: PR_FEEDBACK commit must use a standalone git commit command after every ordered local gate passes");if(state.prFeedbackReadyToPublish){if(normalizedTool==="complete_pr_workflow")return;if(isNamedReadOnlyTool)return;if((normalizedTool==="bash"||normalizedTool==="shell")&&command.length>0&&isAllowedPrWorkflowReadOnlyShell(command,{allowCheckout:!1,allowFetch:!1}))return;if(normalizedTool==="bash"||normalizedTool==="shell"){let armed=(await assertPrFeedbackPublicationArmed(directory,sessionID)).prFeedbackReadyToPublish;if(isSafeExactBoundPush(command,armed))return;throw Error(`BLOCKED: PR_FEEDBACK is armed for publication; only the exact approved push is allowed: ${expectedBoundPushCommand(armed)}`)}throw Error("BLOCKED: PR_FEEDBACK is armed for publication; only read-only inspection, the exact approved push, and complete_pr_workflow are allowed")}if(isStandaloneGitCommitShell){await assertPrFeedbackReadyToPublish(directory,sessionID);return}if(isPublicationShell||isPublicationTool)throw Error("BLOCKED: PR_FEEDBACK publication is not armed; finish every ordered gate, create the one approved commit, and call complete_pr_workflow before publishing");if(isShellCommandRequiringVerification)throw Error("BLOCKED: PR_FEEDBACK shell commands fail closed unless they are explicit read-only intake or the one standalone approved git commit; use structured coder/write tools for fixes and run_pr_feedback_stage_a for validation");if(!isDirectWrite&&!isShellCommandRequiringVerification&&!isRemoteMutationTool&&!isCoderTask)return;if(normalizedTool==="abort_pr_workflow")return;await assertPrFeedbackVerificationSettled(directory,sessionID)}async function completePrWorkflow(directory,sessionID,expectedMode,prHeadSha){let state=await requireBoundState(directory,sessionID,expectedMode),normalizedHead=normalizePrHeadSha(prHeadSha);if(state.prHeadSha!==normalizedHead)throw Error(`BLOCKED: cannot complete ${expectedMode} at PR head "${normalizedHead}"; workflow is bound to "${state.prHeadSha}"`);let open3=readDelegations(directory).filter((record2)=>record2.parentSessionId===state.sessionID&&record2.mode?.startsWith("swarm-pr-")&&(record2.status==="pending"||record2.status==="running"));if(open3.length>0)throw Error(`BLOCKED: ${expectedMode} completion has ${open3.length} unsettled PR workflow lane(s)`);if(expectedMode==="PR_REVIEW"){if(assertPrReviewCleanCheckout(directory),await assertPrReviewBaseCoverageSettled(directory,sessionID),!state.prReviewTriggerEvalPath)throw Error("BLOCKED: PR_REVIEW completion requires a persisted trigger evaluation artifact");if((state.prReviewValidationBatches??[]).some((batch)=>batch.phase==="council"))await assertPrReviewValidationSettled(directory,sessionID,"council");await assertPrReviewValidationSettled(directory,sessionID,"reviewer");let criticInventory=derivePrReviewCriticInventory(directory,state);if(criticInventory.length>0){if(!(state.prReviewValidationBatches??[]).some((batch)=>batch.phase==="critic"))throw Error(`BLOCKED: PR_REVIEW reviewer verdicts require critic coverage for: ${criticInventory.join(", ")}`);await assertPrReviewValidationSettled(directory,sessionID,"critic")}}else{let readyState=await assertPrFeedbackReadyToPublish(directory,sessionID),currentDigest=await currentPrFeedbackRevisionDigest(directory,readyState),armed=readyState.prFeedbackReadyToPublish;if(!armed){let localHead=_test_exports.resolveCurrentGitHead(directory)?.trim();if(!localHead)throw Error("BLOCKED: PR_FEEDBACK cannot arm publication without a verified local Git HEAD");if(_test_exports.resolveCommitCountSince(directory,state.prHeadSha,localHead)!==1)throw Error("BLOCKED: PR_FEEDBACK publication requires exactly one descendant commit after the immutable intake head");if(_test_exports.resolveIsExactSingleChildCommit(directory,state.prHeadSha,localHead)!==!0)throw Error("BLOCKED: PR_FEEDBACK publication commit must be a non-merge direct child of the immutable intake head");if(_test_exports.resolveIsWorkingTreeClean(directory)!==!0)throw Error("BLOCKED: PR_FEEDBACK publication requires a clean index and working tree so all approved content is captured by the bound commit");let upstreamTarget=_test_exports.resolveCurrentUpstreamPushTarget(directory);if(!upstreamTarget)throw Error("BLOCKED: PR_FEEDBACK cannot arm publication without a current branch bound to an exact remote name, remote branch ref, and remote-tracking ref");return await persistState(directory,{...readyState,updatedAt:isoNow(),prFeedbackReadyToPublish:{revisionDigest:currentDigest,localHead,remoteName:upstreamTarget.remoteName,remoteBranchRef:upstreamTarget.remoteBranchRef,remoteRef:upstreamTarget.remoteTrackingRef,validatedAt:isoNow()}}),"ready-to-publish"}if(armed.revisionDigest!==currentDigest)throw Error("BLOCKED: PR_FEEDBACK publication revision differs from the independently approved content digest");let publishedHead=_test_exports.resolveCurrentGitHead(directory)?.trim(),remoteRefs=publishedHead?_test_exports.resolveRemoteRefsContainingHead(directory,publishedHead):null,remoteHead=_test_exports.resolveExactRemoteBranchHead(directory,armed.remoteName,armed.remoteBranchRef);if(!publishedHead||publishedHead!==armed.localHead||!remoteRefs?.includes(armed.remoteRef)||remoteHead?.toLowerCase()!==armed.localHead.toLowerCase())throw Error(`BLOCKED: PR_FEEDBACK completion requires approved commit ${armed.localHead} at current Git HEAD and intended remote-tracking ref ${armed.remoteRef} at that exact commit`)}return await _test_exports.beforeTerminalClear?.(),await clearPrWorkflowGateState(directory,sessionID,state.revision),"completed"}async function requireAnyActiveState(directory,sessionID){let state=await readPrWorkflowGateState(directory,sessionID);if(!state)throw Error(`BLOCKED: no active PR workflow gate for session "${normalizeSessionID(sessionID)}"`);return state}async function requireBoundState(directory,sessionID,expectedMode){let state=await requireAnyActiveState(directory,sessionID);if(state.mode!==expectedMode)throw wrongModeError(state,expectedMode);if(!state.prHeadSha)throw Error(`BLOCKED: active ${expectedMode} workflow is not bound to a PR head`);if(expectedMode==="PR_REVIEW")assertCurrentCheckoutHead(directory,state.prHeadSha),assertPrReviewCleanCheckout(directory);return state}function wrongModeError(state,expectedMode){return Error(`BLOCKED: session "${state.sessionID}" is active in ${state.mode}, not ${expectedMode}`)}function normalizeWorkflowLanes(lanes){if(!Array.isArray(lanes)||lanes.length===0)throw Error("BLOCKED: PR workflow lane validation requires at least one lane");let normalized=lanes.map((lane)=>{let workflowLane=lane.workflowLane?.trim(),laneId=lane.laneId?.trim()||workflowLane;if(!workflowLane||!laneId)throw Error("BLOCKED: PR workflow lane validation requires every lane to have non-empty laneId and workflow_lane values");let reviewItemIds=lane.reviewItemIds?.map((itemId)=>itemId.trim());if(reviewItemIds?.some((itemId)=>!itemId))throw Error("BLOCKED: PR workflow review_item_ids must not contain empty values");if(reviewItemIds)assertNoDuplicates(reviewItemIds,"review item ids within one lane");return{laneId,workflowLane,...reviewItemIds?{reviewItemIds}:{}}});return assertNoDuplicates(normalized.map((lane)=>lane.laneId),"lane ids"),assertNoDuplicates(normalized.map((lane)=>lane.workflowLane),"workflow lane ids"),normalized}function normalizeInventoryIds(inventoryIds){if(!Array.isArray(inventoryIds)||inventoryIds.length===0)throw Error("BLOCKED: PR_FEEDBACK inventory declaration requires at least one feedback item id");let normalized=inventoryIds.map((inventoryId)=>{let itemId=inventoryId.trim();if(!itemId)throw Error("BLOCKED: PR_FEEDBACK inventory declaration contains an empty item id");return itemId});return assertNoDuplicates(normalized,"inventory item ids"),normalized.sort()}function normalizeOwnership(ownership){if(!Array.isArray(ownership)||ownership.length===0)throw Error("BLOCKED: PR_FEEDBACK verification ownership requires at least one lane declaration");let normalized=ownership.map((lane)=>{let laneId=lane.laneId?.trim();if(!laneId)throw Error("BLOCKED: PR_FEEDBACK verification ownership requires every lane to have a non-empty laneId");let ownedItemIds=normalizeInventoryIds(lane.ownedItemIds);return{laneId,ownedItemIds}});return assertNoDuplicates(normalized.map((lane)=>lane.laneId),"PR_FEEDBACK verification lane ids"),normalized}function assertNoDuplicates(values,label){let seen=new Set;for(let value of values){if(seen.has(value))throw Error(`BLOCKED: duplicate ${label} are not allowed: ${value}`);seen.add(value)}}function containsProtectedWorkflowPath(value){return/(?:^|[^A-Za-z0-9_.-])\.swarm(?:[\\/]|$)/i.test(value.replace(/\\\\/g,"\\"))}function isAllowedPrReviewReadOnlyToolName(toolName){if(PR_REVIEW_READ_ONLY_TOOL_NAMES.has(toolName))return!0;let tokens=toolName.split(/[._:/-]+/).filter(Boolean);if(tokens.some((token)=>/^(?:add|alter|and|append|apply|approve|cancel|checkout|close|comment|commit|convert|create|delete|destroy|dismiss|drop|edit|execute|grant|insert|mark|merge|move|patch|prepend|publish|push|ready|remove|rename|replace|resolve|rerun|revoke|run|send|submit|then|transfer|truncate|unresolve|update|upload|write)$/i.test(token)))return!1;return tokens.some((token)=>/^(?:check|checks|diff|fetch|find|get|glob|grep|hover|inspect|list|lookup|open|read|references|scan|screenshot|search|show|status|symbols|tree|view)$/i.test(token))}function readOnlyToolArgumentsAreSafe(value,key="",depth=0){if(depth>8)return!1;let keyTokens=key.replace(/([a-z0-9])([A-Z])/g,"$1_$2").split(/[._:/-]+/).filter(Boolean);if(keyTokens.some((token)=>/^(?:append|body|content|create|data|delete|destination|destroy|edit|insert|mutation|output|patch|payload|prepend|remove|replace|save|set|truncate|update|upload|write)$/i.test(token)))return!1;if(keyTokens.some((token)=>/^(?:method|verb)$/i.test(token)))return typeof value==="string"&&/^(?:GET|HEAD)$/i.test(value.trim());if(keyTokens.length===1&&keyTokens.some((token)=>/^(?:action|operation)$/i.test(token)))return typeof value==="string"&&/^(?:check|diff|fetch|find|get|inspect|list|lookup|open|read|scan|search|show|status|view)$/i.test(value.trim());if(/^mode$/i.test(key)&&typeof value==="string")return/^(?:r|rb|read)$/i.test(value.trim());if(typeof value==="string"){if(keyTokens.some((token)=>/^(?:query|request|sql|statement)$/i.test(token))&&/(?:\b(?:alter|call|comment|create|delete|drop|exec(?:ute)?|grant|insert|merge|mutation|replace|revoke|truncate|update|upsert)\b|\bselect\b[\s\S]{0,4000}\binto\s+[A-Za-z_"'`])/i.test(value))return!1;return!/(?:^(?:POST|PUT|PATCH|DELETE|CONNECT|TRACE|write|edit|patch|create|delete|destroy|remove|replace|truncate|update|upload)$|(?:^|[\r\n])\s*(?:POST|PUT|PATCH|DELETE|CONNECT|TRACE)\s+\S+(?:\s+HTTP\/\d(?:\.\d)?)?|\bmutation\b|\b(?:create|drop|alter|truncate)\s+(?:or\s+replace\s+)?(?:table|database|schema|index|view|function|procedure|trigger|sequence)\b|\b(?:delete\s+from|insert\s+into|merge\s+into|replace\s+into|upsert\s+into)\b|\bupdate\s+[A-Za-z0-9_."'`-]+(?:\s+(?:AS\s+)?[A-Za-z0-9_"'`-]+)?\s+set\b|\b(?:grant|revoke)\s+\S+\s+(?:on|from|to)\b|\b(?:call|exec(?:ute)?)\s+[A-Za-z0-9_."'`-]+|\b(?:rm|rmdir|del|remove-item|move-item|set-content|add-content)\b)/i.test(value)}if(value===null||value===void 0||typeof value==="number"||typeof value==="boolean")return!0;if(Array.isArray(value))return value.every((entry)=>readOnlyToolArgumentsAreSafe(entry,key,depth+1));if(typeof value==="object")return Object.entries(value).every(([childKey,childValue])=>readOnlyToolArgumentsAreSafe(childValue,childKey,depth+1));return!1}function isAllowedPrWorkflowReadOnlyShell(command,options){let normalized=command.trim().replace(/\s+/g," ");if(!normalized)return!1;if(/[\r\n;&|<>`]/.test(command)||/\$\(|@\(/.test(command))return!1;let gitMatch=normalized.match(/^git(?: -C (?:"[^"]+"|'[^']+'|\S+))* (.+)$/i);if(gitMatch?.[1])return isAllowedPrWorkflowGitIntake(gitMatch[1],options);if(/^gh /i.test(normalized))return isAllowedPrFeedbackGhIntake(normalized);if(/^rg\b/i.test(normalized)&&/\s--pre(?:-glob)?(?:\s|=|$)/i.test(normalized))return!1;return/^(?:rg|grep|cat|Get-Content|Select-String|Test-Path|Get-ChildItem|ls|dir|pwd)(?:\s|$)/i.test(normalized)}function hasUnsafeShellControlSyntax(command){return/[;&|<>`\r\n]/.test(command)||/\$\(/.test(command)}function isSafeStandaloneGitCommit(command){if(hasUnsafeShellControlSyntax(command))return!1;if(/(?:^|\s)--(?:allow-empty|amend)(?:\s|=|$)/i.test(command))return!1;return/^git(?:\s+-C(?:=|\s+)(?:"[^"\r\n]+"|'[^'\r\n]+'|[^\s;&|<>`]+))?\s+commit(?:\s+(?:"[^"\r\n]*"|'[^'\r\n]*'|[^\s;&|<>`]+))*\s*$/i.test(command.trim())}function boundPushTarget(armed){let remote=armed.remoteName,branch=armed.remoteBranchRef.slice(11);if(!armed.remoteBranchRef.startsWith("refs/heads/")||!branch)return null;if(/\s|[;&|<>`]/.test(remote)||/\s|[;&|<>`]/.test(branch))return null;return{remote,branch}}function expectedBoundPushCommand(armed){let target=boundPushTarget(armed);return target?`git push ${target.remote} ${armed.localHead}:refs/heads/${target.branch}`:"(invalid bound remote-tracking ref; restart the workflow)"}function isSafeExactBoundPush(command,armed){if(hasUnsafeShellControlSyntax(command))return!1;let target=boundPushTarget(armed);if(!target)return!1;let match=command.trim().match(/^git\s+push\s+([^\s;&|<>`]+)\s+([^\s;&|<>`]+)\s*$/i);if(!match)return!1;return match[1]===target.remote&&match[2]===`${armed.localHead}:refs/heads/${target.branch}`}function isAllowedPrWorkflowGitIntake(gitArgs,options){if(/(?:--ext-diff|--textconv|--open-files-in-pager|--output(?:=|\s)|--upload-pack(?:=|\s)|--exec(?:=|\s))/i.test(gitArgs))return!1;if(/^(?:status|log|show|diff|rev-parse|merge-base|ls-files|grep|blame|cat-file|for-each-ref)(?:\s|$)/i.test(gitArgs))return!0;if(options.allowFetch&&/^fetch(?:\s|$)/i.test(gitArgs))return!0;if(/^remote(?:\s+-v)?$/i.test(gitArgs))return!0;if(options.allowCheckout&&isAllowedPreBindBranchSetup(gitArgs))return!0;if(options.allowCheckout&&/^(?:checkout|switch)\s+(?:--detach\s+)?[^\s-][^\s]*$/i.test(gitArgs))return!0;return/^config\s+(?:(?:--show-origin|--show-scope|--global|--local|--system|--worktree)\s+)*(?:--list|--get(?:-all)?\s+\S+)$/i.test(gitArgs)}function isAllowedPreBindBranchSetup(gitArgs){let tokens=gitArgs.trim().split(/\s+/);if(tokens.length===5){let[verb,createFlag,localBranch,trackFlag,upstream]=tokens;return(verb==="checkout"||verb==="switch")&&(createFlag==="-b"||createFlag==="-c")&&trackFlag==="--track"&&isSafeGitRefToken(localBranch)&&isSafeGitRefToken(upstream)&&upstream.includes("/")}if(tokens.length===3&&tokens[0]==="branch"){let upstream=tokens[1].match(/^--set-upstream-to=(.+)$/)?.[1];return Boolean(upstream&&isSafeGitRefToken(upstream)&&upstream.includes("/")&&isSafeGitRefToken(tokens[2]))}return!1}function isSafeGitRefToken(value){return/^[A-Za-z0-9][A-Za-z0-9._/-]*$/.test(value)&&!value.includes("..")&&!value.includes("//")&&!value.includes("@{")&&!value.endsWith("/")&&!value.endsWith(".")&&!value.endsWith(".lock")}function isAllowedPrFeedbackGhIntake(command){if(/^gh\s+pr\s+(?:view|diff|checks|status|list|checkout)(?:\s|$)/i.test(command)||/^gh\s+run\s+(?:view|list|watch)(?:\s|$)/i.test(command)||/^gh\s+issue\s+(?:view|list)(?:\s|$)/i.test(command)||/^gh\s+search\s+(?:code|commits|issues|prs|repos)(?:\s|$)/i.test(command)||/^gh\s+auth\s+status(?:\s|$)/i.test(command))return!0;if(!/^gh\s+api(?:\s|$)/i.test(command))return!1;if(/\bmutation\b/i.test(command))return!1;let method=command.match(/\s(?:--method(?:\s+|=)|-X(?:\s+|=)?)([A-Z]+)/i)?.[1];if(method&&method.toUpperCase()!=="GET")return!1;if(/\s(?:--input|--raw-field)(?:\s|=)/i.test(command)||/\s-F(?:\s|=|\S)/.test(command))return!1;return!/\s(?:--field|-f)(?:\s|=)(?!query=)/i.test(command)}function normalizePrHeadSha(prHeadSha){let normalized=prHeadSha.trim();if(!normalized)throw Error("BLOCKED: PR workflow requires a non-empty pr_head_sha");return normalized}async function currentPrFeedbackRevisionDigest(directory,state){if(!state.prHeadSha)throw Error("BLOCKED: PR_FEEDBACK revision binding requires pr_head_sha");let digest2=await resolvePrWorkflowRevisionDigestForGate(directory,state.prHeadSha);if(!digest2)throw Error("BLOCKED: PR_FEEDBACK could not compute a bounded current-revision digest");return digest2}async function resolvePrWorkflowRevisionDigestForGate(directory,baseHeadSha){if(_test_exports.resolvePrWorkflowRevisionDigest!==resolvePrWorkflowRevisionDigest)return _test_exports.resolvePrWorkflowRevisionDigest(directory,baseHeadSha);return resolvePrWorkflowRevisionDigestAsync(directory,baseHeadSha)}function normalizeBatchId(batchId){let normalized=batchId.trim();if(!normalized)throw Error("BLOCKED: PR workflow requires a non-empty batch id");return normalized}function sameStringArray(left,right){return left.length===right.length&&left.every((value,index)=>value===right[index])}function assertExactStringSet(actual,expected,label){let actualSet=new Set(actual),expectedSet=new Set(expected),missing=[...expectedSet].filter((value)=>!actualSet.has(value)),extra=[...actualSet].filter((value)=>!expectedSet.has(value));if(actual.length!==actualSet.size||actualSet.size!==expectedSet.size||missing.length>0||extra.length>0)throw Error(`BLOCKED: ${label} must exactly cover the mechanically derived inventory; missing: ${missing.join(", ")||"(none)"}; extra: ${extra.join(", ")||"(none)"}`)}function derivePrReviewCandidateInventory(directory,state){let sources=[],selectedBaseDimensions=new Set;for(let batch of[...state.prReviewBaseDispatches??[]].reverse()){let successful=successfulObligationsFromExactBatch(directory,state,batch.batchId,batch.lanes,"swarm-pr-review:base",batch.validatedAt);for(let lane of batch.lanes)if(successful.has(lane.workflowLane)&&!selectedBaseDimensions.has(lane.workflowLane))sources.push({batchId:batch.batchId,laneId:lane.laneId,mode:"swarm-pr-review:base"}),selectedBaseDimensions.add(lane.workflowLane)}let selectedCouncilLanes=new Set;for(let batch of[...state.prReviewValidationBatches??[]].reverse()){if(batch.phase!=="council")continue;let successful=successfulObligationsFromExactBatch(directory,state,batch.batchId,batch.lanes,"swarm-pr-review:council",batch.validatedAt);for(let lane of batch.lanes)if(successful.has(lane.workflowLane)&&!selectedCouncilLanes.has(lane.workflowLane))sources.push({batchId:batch.batchId,laneId:lane.laneId,mode:"swarm-pr-review:council"}),selectedCouncilLanes.add(lane.workflowLane)}if(state.prReviewTriggerEvalPath){let triggerPath=validateSwarmPath(directory,state.prReviewTriggerEvalPath),triggerArtifact;try{triggerArtifact=JSON.parse(readFileSync6(triggerPath,"utf-8"))}catch{throw Error("BLOCKED: PR_REVIEW trigger evaluation artifact is missing or invalid")}let rows=triggerArtifact.rows;if(!Array.isArray(rows))throw Error("BLOCKED: PR_REVIEW trigger evaluation rows are invalid");let rowIds=rows.map((row)=>typeof row==="object"&&row!==null?row.trigger_id:void 0),provenanceTuples=rows.map((row)=>{if(typeof row!=="object"||row===null)return"";let{source_batch_id:batchId,source_lane_id:laneId}=row;return typeof batchId==="string"&&typeof laneId==="string"&&batchId.trim()&&laneId.trim()?`${batchId}\x00${laneId}`:""});if(!(rows.length===PR_REVIEW_REQUIRED_MICRO_LANE_IDS.length&&new Set(rowIds).size===PR_REVIEW_REQUIRED_MICRO_LANE_IDS.length&&provenanceTuples.every(Boolean)&&new Set(provenanceTuples).size===PR_REVIEW_REQUIRED_MICRO_LANE_IDS.length&&PR_REVIEW_REQUIRED_MICRO_LANE_IDS.every((id)=>rowIds.includes(id))&&rows.every((row)=>typeof row==="object"&&row!==null&&row.result==="MATCHED")))throw Error("BLOCKED: PR_REVIEW requires the exact all-MATCHED repository-agnostic micro-lane set with unique source provenance");for(let row of rows)if(typeof row==="object"&&row!==null&&row.result==="MATCHED"&&typeof row.source_batch_id==="string"&&typeof row.source_lane_id==="string")sources.push({batchId:row.source_batch_id,laneId:row.source_lane_id,mode:"swarm-pr-review:micro",workflowLane:row.trigger_id})}let candidateIds=[];for(let source of sources){let resolvedArtifact=!1;for(let record2 of findByBatchId(directory,source.batchId,{parentSessionId:state.sessionID})){if(record2.laneId!==source.laneId||record2.mode!==source.mode||record2.status!=="completed"||record2.workspace?.prHeadSha!==state.prHeadSha||record2.workspace?.gitHead!==state.prHeadSha||record2.result?.outputDegraded===!0||record2.result?.transcriptIncomplete===!0||record2.result?.truncated===!0)continue;let ref=record2.result?.outputRef?.trim(),artifact=ref?readLaneOutput(directory,ref)?.artifact:void 0;if(!artifact||!workflowArtifactHasContractMarker(directory,state,record2,source.mode,source.workflowLane??record2.workflowLane??source.laneId))continue;if(source.workflowLane&&(record2.workflowLane!==source.workflowLane||!prReviewDiscoveryArtifactCoversLane(artifact.text,source.workflowLane)))continue;resolvedArtifact=!0,candidateIds.push(...extractCandidateIds(artifact.text))}if(source.mode==="swarm-pr-review:micro"&&!resolvedArtifact)throw Error(`BLOCKED: PR_REVIEW mandatory micro-lane provenance is missing or invalid for ${source.workflowLane??source.laneId}`)}return assertNoDuplicates(candidateIds,"PR_REVIEW discovery candidate ids"),candidateIds.length>0?candidateIds.sort():["CLEAN-REVIEW"]}function extractCandidateIds(text){let candidateIds=[],markerHeaderSeen=!1;for(let line of text.split(/\r?\n/)){let fields=pipeFields(line);if(fields[0]==="[CANDIDATE]"&&fields[1]?.toLowerCase()==="candidate_id"){markerHeaderSeen=!0;continue}if(fields[0]==="[CANDIDATE]"&&fields.length>=10&&fields.slice(1,10).every(Boolean)){candidateIds.push(fields[1]);continue}if(markerHeaderSeen&&fields.length>=9&&fields[0]&&!fields[0].startsWith("[")&&fields.slice(0,9).every(Boolean))candidateIds.push(fields[0])}return candidateIds}function derivePrReviewCriticInventory(directory,state){return[...deriveLatestPrReviewReviewerVerdicts(directory,state).entries()].filter(([,verdict])=>verdict.classification==="CONFIRMED"&&["CRITICAL","HIGH","MEDIUM"].includes(verdict.severity)).map(([itemId])=>itemId).sort()}function deriveLatestPrReviewReviewerVerdicts(directory,state){let reviewerBatches=(state.prReviewValidationBatches??[]).filter((batch)=>batch.phase==="reviewer");for(let batch of[...reviewerBatches].reverse()){let successful=successfulObligationsFromExactBatch(directory,state,batch.batchId,batch.lanes,"swarm-pr-review:reviewer",batch.validatedAt);if(batch.lanes.some((lane)=>!successful.has(lane.workflowLane))||successful.size!==batch.lanes.length)continue;let required2=batch.lanes.flatMap((lane)=>lane.reviewItemIds??[]),verdicts=new Map;for(let lane of batch.lanes){let ref=findByBatchId(directory,batch.batchId,{parentSessionId:state.sessionID}).find((candidate)=>candidate.laneId===lane.laneId)?.result?.outputRef?.trim(),artifact=ref?readLaneOutput(directory,ref)?.artifact:void 0;if(!artifact)continue;for(let itemId of lane.reviewItemIds??[]){let verdict=parseReviewerVerdict(artifact.text,itemId);if(verdict)verdicts.set(itemId,verdict)}}if(required2.every((itemId)=>verdicts.has(itemId)))return verdicts}return new Map}function successfulObligationsFromExactBatch(directory,state,batchId,expectedLanes,expectedMode,validatedAt,checkWorkflowLane=!0,forbiddenSubagentSessionIds=new Set,expectedRevisionDigest){let records=findByBatchId(directory,batchId,{parentSessionId:state.sessionID}),successful=new Set,validatedAtMs=Date.parse(validatedAt);if(!Number.isFinite(validatedAtMs))return successful;let expectedByLaneId=new Map(expectedLanes.map((lane)=>[lane.laneId,lane]));if(expectedByLaneId.size!==expectedLanes.length)return successful;let recordCountByLaneId=new Map,recordCountBySubagentSessionId=new Map;for(let record2 of records){if(!record2.laneId||!expectedByLaneId.has(record2.laneId))continue;recordCountByLaneId.set(record2.laneId,(recordCountByLaneId.get(record2.laneId)??0)+1);let subagentSessionId=record2.subagentSessionId?.trim();if(subagentSessionId)recordCountBySubagentSessionId.set(subagentSessionId,(recordCountBySubagentSessionId.get(subagentSessionId)??0)+1)}for(let record2 of records){let expectedLane=record2.laneId?expectedByLaneId.get(record2.laneId):void 0,expectedWorkflowLane=expectedLane?.workflowLane,subagentSessionId=record2.subagentSessionId?.trim();if(expectedWorkflowLane!==void 0&&record2.laneId!==void 0&&recordCountByLaneId.get(record2.laneId)===1&&Boolean(subagentSessionId)&&recordCountBySubagentSessionId.get(subagentSessionId)===1&&!forbiddenSubagentSessionIds.has(subagentSessionId)&&record2.createdAt>=validatedAtMs&&(!checkWorkflowLane||record2.workflowLane===expectedWorkflowLane)&&record2.mode===expectedMode&&record2.workspace?.prHeadSha===state.prHeadSha&&record2.workspace?.gitHead===state.prHeadSha&&record2.status==="completed"&&record2.result?.outputDegraded!==!0&&record2.result?.transcriptIncomplete!==!0&&record2.result?.truncated!==!0&&(record2.result?.chars??0)>0&&Boolean(record2.result?.digest?.trim())&&Boolean(record2.result?.outputRef?.trim())&&workflowArtifactHasContractMarker(directory,state,record2,expectedMode,expectedWorkflowLane,expectedLane?.reviewItemIds,expectedRevisionDigest))successful.add(expectedWorkflowLane)}return successful}function workflowArtifactHasContractMarker(directory,state,record2,expectedMode,expectedWorkflowLane,reviewItemIds,expectedRevisionDigest){let ref=record2.result?.outputRef?.trim();if(!ref)return!1;let loaded=readLaneOutput(directory,ref);if(!loaded)return!1;let artifact=loaded.artifact,recordPrHeadSha=record2.workspace?.prHeadSha,recordGitHead=record2.workspace?.gitHead,resolvedRevisionDigest=expectedRevisionDigest??(recordPrHeadSha?_test_exports.resolvePrWorkflowRevisionDigest(directory,recordPrHeadSha):null),expectedReviewScope=state.mode==="PR_REVIEW"&&state.prReviewBaseSha&&state.prHeadSha?`complete PR diff ${state.prReviewBaseSha}...${state.prHeadSha}`:void 0;if(artifact.batchId!==record2.batchId||artifact.laneId!==record2.laneId||artifact.mode!==expectedMode||artifact.sessionId!==record2.subagentSessionId||artifact.parentSessionId!==record2.parentSessionId||artifact.agent!==record2.swarmPrefixedAgent||artifact.role!==record2.normalizedAgent||artifact.source!=="collect_lane_results"||artifact.workflowLane!==record2.workflowLane||artifact.workflowLane!==expectedWorkflowLane||!recordPrHeadSha||artifact.prHeadSha!==recordPrHeadSha||!recordGitHead||artifact.gitHead!==recordGitHead||!resolvedRevisionDigest||artifact.revisionDigest!==resolvedRevisionDigest||expectedReviewScope!==void 0&&(record2.workspace?.scope!==expectedReviewScope||artifact.scope!==expectedReviewScope)||artifact.digest!==record2.result?.digest||artifact.chars!==record2.result?.chars)return!1;if(expectedMode==="swarm-pr-review:reviewer")return Boolean(reviewItemIds?.length&&reviewItemIds.every((itemId)=>Boolean(parseReviewerVerdict(artifact.text,itemId))));if(expectedMode==="swarm-pr-review:critic"){let reviewerVerdicts=deriveLatestPrReviewReviewerVerdicts(directory,state);return Boolean(reviewItemIds?.length&&reviewItemIds.every((itemId)=>Boolean(parseCriticVerdict(artifact.text,itemId,reviewerVerdicts.get(itemId)?.severity))))}if(expectedMode==="swarm-pr-feedback:verification")return/^\[FEEDBACK-VERIFIED\]\s*\|/m.test(artifact.text);let feedbackVerdict={"swarm-pr-feedback:stage-b-reviewer":["[STAGE-B-REVIEW]","APPROVE"],"swarm-pr-feedback:stage-b-test":["[STAGE-B-TEST]","PASS"],"swarm-pr-feedback:closeout-reviewer":["[CLOSEOUT-REVIEW]","APPROVE"],"swarm-pr-feedback:closeout-critic":["[CLOSEOUT-CRITIC]","APPROVE"]}[expectedMode];if(feedbackVerdict)return Boolean(reviewItemIds?.length&&reviewItemIds.every((itemId)=>artifactHasExactPositiveVerdictRow(artifact.text,feedbackVerdict[0],itemId,feedbackVerdict[1])));return prReviewDiscoveryArtifactCoversLane(artifact.text,expectedWorkflowLane)}function prReviewDiscoveryArtifactCoversLane(text,expectedWorkflowLane){let lines=text.split(/\r?\n/),candidateHeaderSeen=!1;for(let line of lines){let fields=pipeFields(line);if(fields.length===0)continue;if(fields[0]==="[CLEAN]"&&fields.length>=4&&fields[1]===expectedWorkflowLane&&fields.slice(1,4).every(Boolean)&&fields[2].length>=12&&fields[3].length>=20)return!0;if(fields[0]==="[CANDIDATE]"){if(fields[1]?.toLowerCase()==="candidate_id"){candidateHeaderSeen=!0;continue}if(fields.length>=10&&fields[2]===expectedWorkflowLane&&fields.slice(1,10).every(Boolean))return!0;continue}if(candidateHeaderSeen&&fields.length>=9&&fields[0]?.toLowerCase()!=="candidate_id"&&fields[1]===expectedWorkflowLane&&fields.slice(0,9).every(Boolean))return!0}return!1}function parseReviewerVerdict(text,itemId){let rows=text.split(/\r?\n/).map(pipeFields).filter((fields2)=>fields2[0]==="[REVIEWED]"&&fields2[1]===itemId);if(rows.length!==1)return null;let fields=rows[0];if(fields.length!==10||!fields.slice(1).every(Boolean))return null;let introduced=fields[5].replace(/^introduced_by_pr\s*:\s*/i,"").toUpperCase();if(!REVIEWER_CLASSIFICATIONS.has(fields[2])||!REVIEWER_EVIDENCE_TYPES.has(fields[3])||!REVIEW_SEVERITIES.has(fields[4])||!["YES","NO","UNKNOWN"].includes(introduced))return null;if(fields[7].length<8||fields[8].length<5||fields[9].length<3)return null;return{classification:fields[2],severity:fields[4]}}function parseCriticVerdict(text,itemId,reviewerSeverity){let rows=text.split(/\r?\n/).map(pipeFields).filter((fields2)=>fields2[0]==="[CRITIC]"&&fields2[1]===itemId);if(rows.length!==1)return null;let fields=rows[0];if(fields.length!==6||!fields.slice(1).every(Boolean)||!CRITIC_STATUSES.has(fields[2])||!REVIEW_SEVERITIES.has(fields[3]))return null;if(fields[2]==="NEEDS_MORE_EVIDENCE")return null;if(fields[2]==="DISPROVED"&&fields[3]!=="NONE")return null;if(fields[2]==="UPHELD"&&!["CRITICAL","HIGH","MEDIUM"].includes(fields[3]))return null;if(fields[2]==="DOWNGRADED"&&fields[3]==="CRITICAL")return null;if(reviewerSeverity){let severityRank=new Map([["NONE",0],["INFO",1],["LOW",2],["MEDIUM",3],["HIGH",4],["CRITICAL",5]]),reviewerRank=severityRank.get(reviewerSeverity),criticRank=severityRank.get(fields[3]);if(reviewerRank===void 0||criticRank===void 0)return null;if(fields[2]==="UPHELD"&&criticRank!==reviewerRank)return null;if(fields[2]==="DOWNGRADED"&&criticRank>=reviewerRank)return null}if(fields[4].length<6||fields[5].length<6)return null;return{status:fields[2],severity:fields[3]}}function artifactHasExactPositiveVerdictRow(text,marker,itemId,positiveVerdict){let rows=text.split(/\r?\n/).map(pipeFields).filter((fields)=>fields[0]===marker&&fields[1]===itemId);return rows.length===1&&rows[0].length>=4&&rows[0][2]===positiveVerdict&&rows[0].slice(1,4).every(Boolean)}function pipeFields(line){if(!line.includes("|"))return[];return line.split("|").map((field)=>field.trim())}function feedbackArtifactCoversItems(directory,state,batchId,laneId,itemIds){let ref=findByBatchId(directory,batchId,{parentSessionId:state.sessionID}).find((candidate)=>candidate.laneId===laneId)?.result?.outputRef?.trim(),loaded=ref?readLaneOutput(directory,ref):null;if(!loaded)return!1;let rows=loaded.artifact.text.split(/\r?\n/).map(pipeFields).filter((fields)=>fields[0]==="[FEEDBACK-VERIFIED]");if(rows.length!==itemIds.length)return!1;return itemIds.every((itemId)=>{let matches=rows.filter((fields)=>fields[1]===itemId);return matches.length===1&&matches[0].length===4&&matches[0].slice(1,4).every(Boolean)&&FEEDBACK_CLASSIFICATIONS.has(matches[0][2])})}async function persistState(directory,state){let validated=PrWorkflowGateStateSchema.parse(state);await withSessionStateMutation(directory,validated.sessionID,async()=>{let current=await readPrWorkflowGateStateFromDisk(directory,validated.sessionID);if(current?current.revision!==validated.revision:validated.revision!==0)throw Error("BLOCKED: PR workflow gate state changed concurrently; reload the active session state before retrying");let nextRevision=validated.revision+1,nextState={...validated,revision:nextRevision},filePath=workflowGateStatePath(directory,validated.sessionID);await fsp2.mkdir(path11.dirname(filePath),{recursive:!0}),await writeAtomicJson2(filePath,nextState),Object.assign(state,nextState),rememberState(directory,nextState)})}async function withSessionStateMutation(directory,sessionID,action){let key=stateCacheKey(directory,sessionID),previous=pendingStateMutationsByProjectSession.get(key)??Promise.resolve(),release,current=new Promise((resolve8)=>{release=resolve8}),queued=previous.then(()=>current);pendingStateMutationsByProjectSession.set(key,queued),await previous;try{let lock=await acquireSessionStateMutationLock(directory,sessionID);try{return await action()}finally{await releaseSessionStateMutationLock(lock)}}finally{if(release(),pendingStateMutationsByProjectSession.get(key)===queued)pendingStateMutationsByProjectSession.delete(key)}}async function acquireSessionStateMutationLock(directory,sessionID){let lockPath=workflowGateStateLockPath(directory,sessionID);await fsp2.mkdir(path11.dirname(lockPath),{recursive:!0});for(let attempt=0;attempt<STATE_MUTATION_LOCK_MAX_ATTEMPTS;attempt++)try{let handle=await fsp2.open(lockPath,"wx"),lock={ownerToken:randomUUID2(),pid:process.pid,createdAtMs:_test_exports.nowMs()};try{await handle.writeFile(JSON.stringify(lock),"utf-8"),await handle.close()}catch(error49){throw await removeSessionStateMutationLockIfOwned(lockPath,lock.ownerToken),error49}return{path:lockPath,ownerToken:lock.ownerToken}}catch(error49){if(error49.code!=="EEXIST")throw error49;if(await reclaimAbandonedSessionStateMutationLock(lockPath))continue;if(attempt<STATE_MUTATION_LOCK_MAX_ATTEMPTS-1)await delay(STATE_MUTATION_LOCK_RETRY_DELAY_MS)}throw Error("BLOCKED: PR workflow gate state is being mutated by another process; retry after that session transition finishes")}async function releaseSessionStateMutationLock(lock){try{await removeSessionStateMutationLockIfOwned(lock.path,lock.ownerToken)}catch{}}async function reclaimAbandonedSessionStateMutationLock(lockPath){let lock=await readSessionStateMutationLock(lockPath);if(lock){if(_test_exports.isProcessAlive(lock.pid))return!1;return removeSessionStateMutationLockIfOwned(lockPath,lock.ownerToken)}try{let stat6=await fsp2.stat(lockPath);if(_test_exports.nowMs()-stat6.mtimeMs<STATE_MUTATION_LOCK_UNINITIALIZED_STALE_MS)return!1;return await fsp2.rm(lockPath,{force:!0}),!0}catch(error49){if(error49.code==="ENOENT")return!0;throw error49}}async function readSessionStateMutationLock(lockPath){let raw;try{raw=await fsp2.readFile(lockPath,"utf-8")}catch(error49){if(error49.code==="ENOENT")return null;throw error49}try{let parsed=JSON.parse(raw);if(typeof parsed==="object"&&parsed!==null&&typeof parsed.ownerToken==="string"&&parsed.ownerToken.length>0&&typeof parsed.pid==="number"&&Number.isInteger(parsed.pid)&&parsed.pid>0&&typeof parsed.createdAtMs==="number"&&Number.isFinite(parsed.createdAtMs))return parsed}catch{}return null}async function removeSessionStateMutationLockIfOwned(lockPath,ownerToken){let lock=await readSessionStateMutationLock(lockPath);if(!lock||lock.ownerToken!==ownerToken)return!1;try{return await fsp2.rm(lockPath),!0}catch(error49){if(error49.code==="ENOENT")return!1;throw error49}}function isProcessAlive(pid){try{return process.kill(pid,0),!0}catch(error49){return error49.code!=="ESRCH"}}async function readPrWorkflowGateStateFromDisk(directory,sessionID){let filePath=workflowGateStatePath(directory,sessionID),raw;try{raw=await fsp2.readFile(filePath,"utf-8")}catch(error49){if(error49.code==="ENOENT")return null;throw error49}let parsedJson;try{parsedJson=JSON.parse(raw)}catch{throw Error(`BLOCKED: PR workflow gate state for session "${sessionID}" is not valid JSON`)}let parsed=PrWorkflowGateStateSchema.safeParse(parsedJson);if(!parsed.success)throw Error(`BLOCKED: PR workflow gate state for session "${sessionID}" is invalid`);return parsed.data}function rememberState(directory,state){let cacheKey=stateCacheKey(directory,state.sessionID);trackedStatesByProjectSession.delete(cacheKey),trackedStatesByProjectSession.set(cacheKey,state);while(trackedStatesByProjectSession.size>MAX_TRACKED_SESSIONS){let oldestKey=trackedStatesByProjectSession.keys().next().value;if(!oldestKey)break;trackedStatesByProjectSession.delete(oldestKey)}}function stateCacheKey(directory,sessionID){let resolved=path11.normalize(path11.resolve(directory));return`${process.platform==="win32"?resolved.toLowerCase():resolved}\x00${normalizeSessionID(sessionID)}`}function workflowGateStatePath(directory,sessionID){return validateSwarmPath(directory,workflowGateStateRelativePath(sessionID))}function workflowGateStateLockPath(directory,sessionID){return validateSwarmPath(directory,workflowGateStateLockRelativePath(sessionID))}function workflowGateStateLockRelativePath(sessionID){return path11.join(WORKFLOW_GATE_DIR,`${safeSessionFileStem(sessionID)}.lock`)}function workflowGateStateRelativePath(sessionID){return path11.join(WORKFLOW_GATE_DIR,`${safeSessionFileStem(sessionID)}.json`)}function safeSessionFileStem(sessionID){let normalized=normalizeSessionID(sessionID),slug=normalized.replace(/[^A-Za-z0-9_.-]/g,"_").slice(0,80)||"session",digest2=createHash5("sha256").update(normalized).digest("hex").slice(0,12);return`${slug}-${digest2}`}function normalizeSessionID(sessionID){let normalized=sessionID.trim();if(!normalized)throw Error("BLOCKED: PR workflow gate requires a non-empty sessionID");return normalized}async function writeAtomicJson2(filePath,value){let tempPath=`${filePath}.tmp.${process.pid}.${randomUUID2()}`,lastError;try{await fsp2.writeFile(tempPath,JSON.stringify(value,null,2),"utf-8");for(let attempt=0;attempt<WINDOWS_RENAME_MAX_RETRIES3;attempt++)try{await fsp2.rename(tempPath,filePath),lastError=void 0;break}catch(error49){lastError=error49;let code=error49.code;if(code!=="EEXIST"&&code!=="EPERM"&&code!=="EBUSY")break;if(attempt<WINDOWS_RENAME_MAX_RETRIES3-1)await delay(RENAME_RETRY_DELAY_MS)}if(lastError)throw lastError}finally{try{await fsp2.rm(tempPath,{force:!0})}catch{}}}function isoNow(){return new Date().toISOString()}function delay(ms){return new Promise((resolve8)=>setTimeout(resolve8,ms))}var PR_REVIEW_BASE_DIMENSION_IDS,PR_REVIEW_REQUIRED_MICRO_LANE_IDS,GATE_SCHEMA_VERSION=1,MAX_TRACKED_SESSIONS=200,MAX_WORKFLOW_BATCHES=128,WINDOWS_RENAME_MAX_RETRIES3=3,RENAME_RETRY_DELAY_MS=10,STATE_MUTATION_LOCK_MAX_ATTEMPTS=50,STATE_MUTATION_LOCK_RETRY_DELAY_MS=10,STATE_MUTATION_LOCK_UNINITIALIZED_STALE_MS=30000,DISPATCH_TOOL_NAME="dispatch_lanes_async",BLOCKING_DISPATCH_TOOL_NAME="dispatch_lanes",WORKFLOW_GATE_DIR="pr-workflow-gates",trackedStatesByProjectSession,pendingStateMutationsByProjectSession,PrReviewBaseDispatchRecordSchema,PrFeedbackLaneOwnershipSchema,PrFeedbackVerificationRecordSchema,PrFeedbackStageACheckReceiptSchema,PrFeedbackStageARecordSchema,PrFeedbackGateBatchRecordSchema,PrFeedbackReadyToPublishRecordSchema,PrReviewValidationBatchRecordSchema,PrWorkflowGateStateSchema,PR_FEEDBACK_PHASE_ORDER,PR_FEEDBACK_PHASE_ROLE,_test_exports,PR_WORKFLOW_CONTROLLER_TOOLS,PR_REVIEW_READ_ONLY_TOOL_NAMES,REVIEWER_CLASSIFICATIONS,REVIEWER_EVIDENCE_TYPES,REVIEW_SEVERITIES,CRITIC_STATUSES,FEEDBACK_CLASSIFICATIONS;var init_pr_workflow_gate=__esm(()=>{init_zod();init_lane_output_store();init_pending_delegations();init_workspace_snapshot();init_constants();init_schema();init_utils2();PR_REVIEW_BASE_DIMENSION_IDS=["intent-architecture","correctness-state","tests-falsifiability","security-trust","reliability-performance","compatibility-delivery"],PR_REVIEW_REQUIRED_MICRO_LANE_IDS=["auth-identity-secrets","untrusted-input-boundaries","subprocess-platform","concurrency-state","dependencies-build-release","api-schema-migrations","test-infrastructure","ui-accessibility-i18n","privacy-observability","generated-provenance","unclassified-risk"],trackedStatesByProjectSession=new Map,pendingStateMutationsByProjectSession=new Map,PrReviewBaseDispatchRecordSchema=exports_external.object({batchId:exports_external.string().min(1),lanes:exports_external.array(exports_external.object({laneId:exports_external.string().min(1),workflowLane:exports_external.enum(["intent-architecture","correctness-state","tests-falsifiability","security-trust","reliability-performance","compatibility-delivery"])}).strict()).min(1),validatedAt:exports_external.string().min(1)}).strict(),PrFeedbackLaneOwnershipSchema=exports_external.object({laneId:exports_external.string().min(1),ownedItemIds:exports_external.array(exports_external.string().min(1)).min(1)}).strict(),PrFeedbackVerificationRecordSchema=exports_external.object({batchId:exports_external.string().min(1),ownership:exports_external.array(PrFeedbackLaneOwnershipSchema).min(1),validatedAt:exports_external.string().min(1)}).strict(),PrFeedbackStageACheckReceiptSchema=exports_external.object({category:exports_external.enum(["build","typecheck","lint","diff-check","reproduction"]),workingDirectory:exports_external.string().min(1).optional(),obligationId:exports_external.string().min(1).optional(),validatorContract:exports_external.object({path:exports_external.string().min(1),id:exports_external.string().min(1)}).strict().optional(),command:exports_external.array(exports_external.string().min(1)).min(1),targets:exports_external.array(exports_external.string().min(1)).min(1).optional(),feedbackTargets:exports_external.array(exports_external.object({feedbackItemId:exports_external.string().min(1),target:exports_external.string().min(1),expectedBehavior:exports_external.string().min(8)}).strict()).min(1).optional(),durationMs:exports_external.number().nonnegative()}).strict(),PrFeedbackStageARecordSchema=exports_external.object({revisionDigest:exports_external.string().min(1),checks:exports_external.array(PrFeedbackStageACheckReceiptSchema).min(2).max(258),feedbackItemIds:exports_external.array(exports_external.string().min(1)).min(1).optional(),applicableCategories:exports_external.array(exports_external.enum(["build","typecheck","lint"])).max(3).optional(),applicableObligations:exports_external.array(exports_external.object({id:exports_external.string().min(1),category:exports_external.enum(["build","typecheck","lint"]),workingDirectory:exports_external.string().min(1),source:exports_external.string().min(1),validatorContract:exports_external.object({path:exports_external.string().min(1),id:exports_external.string().min(1)}).strict().optional()}).strict()).max(256).optional(),validatedAt:exports_external.string().min(1)}).strict(),PrFeedbackGateBatchRecordSchema=exports_external.object({batchId:exports_external.string().min(1),phase:exports_external.enum(["stage-b-reviewer","stage-b-test","closeout-reviewer","closeout-critic"]),laneId:exports_external.string().min(1),itemIds:exports_external.array(exports_external.string().min(1)).min(1),revisionDigest:exports_external.string().min(1),validatedAt:exports_external.string().min(1)}).strict(),PrFeedbackReadyToPublishRecordSchema=exports_external.object({revisionDigest:exports_external.string().min(1),localHead:exports_external.string().min(1),remoteName:exports_external.string().min(1),remoteBranchRef:exports_external.string().startsWith("refs/heads/"),remoteRef:exports_external.string().startsWith("refs/remotes/"),validatedAt:exports_external.string().min(1)}).strict(),PrReviewValidationBatchRecordSchema=exports_external.object({batchId:exports_external.string().min(1),phase:exports_external.enum(["council","reviewer","critic"]),lanes:exports_external.array(exports_external.object({laneId:exports_external.string().min(1),workflowLane:exports_external.string().min(1),reviewItemIds:exports_external.array(exports_external.string().min(1)).min(1).optional()}).strict()).min(1),validatedAt:exports_external.string().min(1)}).strict(),PrWorkflowGateStateSchema=exports_external.object({schemaVersion:exports_external.literal(GATE_SCHEMA_VERSION),revision:exports_external.number().int().nonnegative().default(0),sessionID:exports_external.string().min(1),mode:exports_external.enum(["PR_REVIEW","PR_FEEDBACK"]),activatedAt:exports_external.string().min(1),updatedAt:exports_external.string().min(1),prHeadSha:exports_external.string().min(1).optional(),prReviewBaseRef:exports_external.string().min(1).optional(),prReviewBaseSha:exports_external.string().min(1).optional(),prReviewBaseDispatches:exports_external.array(PrReviewBaseDispatchRecordSchema).max(MAX_WORKFLOW_BATCHES).optional(),prReviewBaseDispatch:PrReviewBaseDispatchRecordSchema.optional(),prReviewTriggerEvalPath:exports_external.string().min(1).optional(),prReviewValidationBatches:exports_external.array(PrReviewValidationBatchRecordSchema).max(MAX_WORKFLOW_BATCHES).optional(),prFeedbackInventory:exports_external.array(exports_external.string().min(1)).min(1).optional(),prFeedbackVerifications:exports_external.array(PrFeedbackVerificationRecordSchema).max(MAX_WORKFLOW_BATCHES).optional(),prFeedbackVerification:PrFeedbackVerificationRecordSchema.optional(),prFeedbackStageA:PrFeedbackStageARecordSchema.optional(),prFeedbackGateBatches:exports_external.array(PrFeedbackGateBatchRecordSchema).max(MAX_WORKFLOW_BATCHES).optional(),prFeedbackReadyToPublish:PrFeedbackReadyToPublishRecordSchema.optional()}).strict();PR_FEEDBACK_PHASE_ORDER=["stage-b-reviewer","stage-b-test","closeout-reviewer","closeout-critic"];PR_FEEDBACK_PHASE_ROLE={"stage-b-reviewer":"reviewer","stage-b-test":"test_engineer","closeout-reviewer":"reviewer","closeout-critic":"critic"};_test_exports={workflowGateStateRelativePath,workflowGateStateLockRelativePath,resetTrackedStateCache:()=>{trackedStatesByProjectSession.clear(),pendingStateMutationsByProjectSession.clear(),_test_exports.beforeTerminalClear=void 0},beforeTerminalClear:void 0,resolveCurrentGitHead,resolveCurrentUpstreamPushTarget,resolveCurrentUpstreamRemoteRef,resolveExactRemoteBranchHead,resolveCommitCountSince,resolveIsWorkingTreeClean,resolveIsExactSingleChildCommit,resolvePrWorkflowRevisionDigest,resolveRemoteRefsContainingHead,parseCriticVerdict,isProcessAlive,nowMs:()=>Date.now()};PR_WORKFLOW_CONTROLLER_TOOLS=new Set(["abort_pr_workflow","collect_lane_results","complete_pr_workflow","dispatch_lanes_async","get_async_result","get_async_status","run_pr_feedback_stage_a","write_pr_review_trigger_eval"]),PR_REVIEW_READ_ONLY_TOOL_NAMES=new Set(["ast_grep_search","codesearch","glob","grep","lsp","open","read","search","tree","view","webfetch","websearch"]);REVIEWER_CLASSIFICATIONS=new Set(["CONFIRMED","DISPROVED","UNVERIFIED","PRE_EXISTING"]),REVIEWER_EVIDENCE_TYPES=new Set(["STRUCTURALLY_PROVEN","EXECUTION_PROVEN","STATIC_TRACE_PROVEN","PLAUSIBLE_BUT_UNVERIFIED"]),REVIEW_SEVERITIES=new Set(["CRITICAL","HIGH","MEDIUM","LOW","INFO","NONE"]),CRITIC_STATUSES=new Set(["UPHELD","DOWNGRADED","DISPROVED","NEEDS_MORE_EVIDENCE"]),FEEDBACK_CLASSIFICATIONS=new Set(["CONFIRMED","PARTIAL","DISPROVED","PRE_EXISTING","NEEDS_MORE_EVIDENCE","NEEDS_USER_DECISION"])});async function handleAbortPrWorkflowCommand(directory,args2,sessionID){let tokens=(args2??[]).filter((token)=>token.trim().length>0),modeToken=tokens[0]?.toUpperCase(),knownMode=modeToken&&KNOWN_MODES.has(modeToken)?modeToken:void 0,reasonStartIndex=knownMode?1:0,reason=tokens.slice(reasonStartIndex).join(" ").trim().slice(0,500)||void 0;if(modeToken&&!knownMode)return`Error: Unknown mode "${modeToken}". Expected PR_REVIEW or PR_FEEDBACK.
171
+
172
+ ${USAGE}`;if(!sessionID?.trim())return`Error: abort-pr-workflow requires an active sessionID.
173
+
174
+ ${USAGE}`;try{let summary=await abortPrWorkflow(directory,sessionID,{...knownMode?{expectedMode:knownMode}:{},...reason?{reason}:{}}),headLine=summary.prHeadSha?` (was bound to PR head ${summary.prHeadSha})`:" (was not bound to a PR head)";return`Aborted active ${summary.mode} mechanical gate for session ${sessionID}${headLine}. The durable gate state has been cleared and the auto-resume loop will stop. An audit event was appended to .swarm/events.jsonl.`}catch(error49){return`Error: ${error49 instanceof Error?error49.message:String(error49)}
175
+
176
+ ${USAGE}`}}var USAGE,KNOWN_MODES;var init_abort_pr_workflow=__esm(()=>{init_pr_workflow_gate();USAGE=["Usage: /swarm abort-pr-workflow [PR_REVIEW|PR_FEEDBACK] [reason...]","","Clear an active PR_REVIEW or PR_FEEDBACK mechanical gate for the current session","and stop the auto-resume loop. Use when a PR review or feedback workflow is stuck","(e.g. the working tree cannot reach the PR head, a compound shell command was","rejected, or the wake budget is suspended).","","Arguments:"," mode Optional: PR_REVIEW or PR_FEEDBACK. If omitted, aborts whichever is active."," reason Optional free-text reason (recorded to .swarm/events.jsonl).","","Refuses while the workflow is armed for publication (call complete_pr_workflow","instead) or while PR workflow lanes are still in flight (collect their results first)."].join(`
177
+ `),KNOWN_MODES=new Set(["PR_REVIEW","PR_FEEDBACK"])});var exports_runner_client={};__export(exports_runner_client,{probe:()=>probe,execute:()=>execute,buildDefaultPolicy:()=>buildDefaultPolicy,_resetProbeCache:()=>_resetProbeCache,_internals:()=>_internals7,RUNNER_EXIT_CODES:()=>RUNNER_EXIT_CODES});import{spawn as spawn2,spawnSync as spawnSync2}from"node:child_process";import*as fs8 from"node:fs";import*as os3 from"node:os";import*as path12 from"node:path";import{fileURLToPath}from"node:url";function findRunnerBinary(){let arch=process.arch==="x64"?"x64":"arm64",platform="win32",packagePaths=[path12.resolve(_runtimeDir,"..","..","..","binaries",`win32-${arch}`,"swarm-sandbox-runner.exe"),path12.resolve(_runtimeDir,"..","..","..","..","binaries",`win32-${arch}`,"swarm-sandbox-runner.exe")];for(let p of packagePaths)try{if(fs8.existsSync(p))return p}catch{}try{let result=spawnSync2("where",["swarm-sandbox-runner.exe"],{windowsHide:!0,encoding:"utf-8",timeout:2000,stdio:["ignore","pipe","ignore"]});if(result.status===0&&result.stdout?.trim())return result.stdout.trim().split(`
170
178
  `)[0]?.trim()??null}catch{}return null}function probe(){if(_cachedProbe!==void 0)return _cachedProbe;if(process.platform!=="win32")return _cachedProbe={available:!1,mode:"none",capabilities:null,error:"not Windows"},_cachedProbe;let binary=_internals7.findRunnerBinary();if(!binary)return _cachedProbe={available:!1,mode:"none",capabilities:null,error:"runner binary not found"},warn("Sandbox runner binary not found — degrading to weak sandbox"),_cachedProbe;try{let result=_internals7.spawnRunner(binary,["--probe"],{windowsHide:!0,encoding:"utf-8",timeout:2000,stdio:["ignore","pipe","pipe"],cwd:os3.tmpdir()});if(result.error)return _cachedProbe={available:!1,mode:"none",capabilities:null,error:`probe spawn error: ${result.error.code??result.error.message}`},warn(`Sandbox runner probe failed: ${_cachedProbe.error}`),_cachedProbe;if(result.status!==0)return _cachedProbe={available:!1,mode:"none",capabilities:null,error:`probe exited with code ${result.status}`},warn(`Sandbox runner probe failed: ${_cachedProbe.error}`),_cachedProbe;let capabilities=JSON.parse(result.stdout?.trim()??"{}"),mode="none";if(capabilities.app_container_available)mode="app-container";else if(capabilities.restricted_token_available)mode="restricted-token";return _cachedProbe={available:mode!=="none",mode,capabilities},_cachedProbe}catch(err){let msg=err instanceof Error?err.message:String(err);return _cachedProbe={available:!1,mode:"none",capabilities:null,error:`probe threw: ${msg}`},warn(`Sandbox runner probe threw: ${msg}`),_cachedProbe}}async function execute(command,policy,mode="auto"){let binary=_internals7.findRunnerBinary();if(!binary)throw Error("runner binary not found");let policyJson=JSON.stringify(policy),args2=["--policy-stdin","--mode",mode,"--",...command];return new Promise((resolve9,reject)=>{let proc,timeout=setTimeout(()=>{proc?.kill(),reject(Error("runner execution timeout"))},policy.wall_clock_timeout_ms+5000),unref=timeout.unref;if(typeof unref==="function")unref.call(timeout);try{proc=_internals7.spawnAsync(binary,args2,{windowsHide:!0,stdio:["pipe","pipe","pipe"],cwd:policy.workspace_roots[0]??os3.tmpdir()})}catch(err){clearTimeout(timeout),reject(err);return}proc.stdin?.write(policyJson),proc.stdin?.end();let stdout="",stderr="",events=[];proc.stdout?.on("data",(chunk)=>{stdout+=chunk.toString()}),proc.stderr?.on("data",(chunk)=>{let lines=chunk.toString().split(`
171
179
  `);for(let line of lines){let trimmed=line.trim();if(!trimmed)continue;try{let event=JSON.parse(trimmed);if(event.type){events.push(event);continue}}catch{}stderr+=`${trimmed}
172
180
  `}}),proc.on("error",(err)=>{clearTimeout(timeout),reject(err)}),proc.on("close",(code)=>{clearTimeout(timeout);let runnerMode=events.find((e)=>e.type==="start")?.mode??mode;resolve9({exitCode:code??1,stdout,stderr,events,mode:runnerMode})})})}function _resetProbeCache(){_cachedProbe=void 0}function buildDefaultPolicy(workspaceRoot,runId){let id=runId??`swarm-${crypto.randomUUID?.()??Date.now()}`,appData=process.env.LOCALAPPDATA??path12.join(os3.homedir(),"AppData","Local"),tempRoot=path12.join(appData,"opencode-swarm","sandbox",id,"temp");return{schema_version:1,run_id:id,workspace_roots:[workspaceRoot],writable_roots:[workspaceRoot],read_only_subpaths:[".git",".codex",".agents",".swarm"],temp_root:tempRoot,temp_cap_bytes:524288000,memory_cap_bytes:2147483648,child_process_cap:16,wall_clock_timeout_ms:600000,network_mode:"off",env_allowlist:["PATH","TEMP","TMP","USERPROFILE","SYSTEMROOT"],env_overrides:{HTTP_PROXY:"http://127.0.0.1:1",HTTPS_PROXY:"http://127.0.0.1:1"},path_stubs:["ssh.exe","curl.exe","wget.exe","scp.exe","sftp.exe"],private_desktop:!0,deny_alternate_data_streams:!0,deny_unc_paths:!0,deny_device_paths:!0,deny_symlink_egress:!0}}var _runtimeDir,RUNNER_EXIT_CODES,_cachedProbe,_internals7;var init_runner_client=__esm(()=>{init_logger();_runtimeDir=fileURLToPath(new URL(".",import.meta.url)),RUNNER_EXIT_CODES={SUCCESS:0,CHILD_NON_ZERO:1,POLICY_VIOLATION:64,QUOTA_EXCEEDED:65,WALL_CLOCK_TIMEOUT:66,LAUNCHER_MISCONFIG:67,OS_API_FAILURE:68,PROBE_FAILED:69},_internals7={findRunnerBinary,spawnRunner:spawnSync2,spawnAsync:spawn2}});var exports_capability_probe={};__export(exports_capability_probe,{isWindowsSandboxAvailable:()=>isWindowsSandboxAvailable,isSandboxExecAvailable:()=>isSandboxExecAvailable,isBubblewrapAvailable:()=>isBubblewrapAvailable,SandboxCapabilityProbe:()=>SandboxCapabilityProbe});import{execFile,spawnSync as spawnSync3}from"node:child_process";import*as os4 from"node:os";function withProbeTimeout(cmd,args2,ms){return new Promise((resolve9,reject)=>{let controller=new AbortController,timer=setTimeout(()=>{controller.abort(),proc?.kill()},ms),unref=timer.unref;if(typeof unref==="function")unref.call(timer);let proc;try{proc=execFile(cmd,args2,{signal:controller.signal,timeout:ms,windowsHide:!0,cwd:os4.tmpdir()},(error49,stdout,_stderr)=>{if(clearTimeout(timer),error49){let exc=error49;if(exc.code==="ENOENT"||exc.code==="ENOTFOUND")reject(Error("binary not found"));else reject(error49);return}resolve9(stdout?.trim()??"")})}catch(spawnError){clearTimeout(timer),reject(spawnError)}})}async function probeLinux(){try{if((await withProbeTimeout("bwrap",["--version"],2000)).length>0)return{status:"enabled",strength:"strong",mechanism:"Bubblewrap",platform:"linux"};return{status:"disabled",mechanism:"Bubblewrap",platform:"linux",error:"binary returned empty version"}}catch(err){let msg=err instanceof Error?err.message:String(err);if(msg==="binary not found")return{status:"unsupported",mechanism:"Bubblewrap",platform:"linux",error:msg};return{status:"disabled",mechanism:"Bubblewrap",platform:"linux",error:msg}}}async function probeMacOS(){try{if((await withProbeTimeout("sandbox-exec",["--version"],2000)).length>0)return{status:"enabled",strength:"strong",mechanism:"sandbox-exec",platform:"darwin"};return{status:"disabled",mechanism:"sandbox-exec",platform:"darwin",error:"binary returned empty version"}}catch(err){let msg=err instanceof Error?err.message:String(err);if(msg==="binary not found")return{status:"unsupported",mechanism:"sandbox-exec",platform:"darwin",error:msg};return{status:"disabled",mechanism:"sandbox-exec",platform:"darwin",error:msg}}}function probeWindows(){try{let{probe:runnerProbe}=(init_runner_client(),__toCommonJS(exports_runner_client)),result=runnerProbe();if(result.available)return{status:"enabled",strength:"strong",platform:"win32",mechanism:`native-runner/${result.mode}`}}catch{}try{let result=spawnSync3("cmd",["/c","echo","ok"],{windowsHide:!0,encoding:"utf-8",timeout:5000,stdio:["ignore","pipe","ignore"]});if(result.error)return{status:"disabled",platform:"win32",mechanism:"PowerShell wrapper",error:`cmd.exe probe failed: ${result.error.code}`};return result.status===0?{status:"enabled",strength:"advisory",platform:"win32",mechanism:"PowerShell wrapper"}:{status:"disabled",platform:"win32",mechanism:"PowerShell wrapper",error:"cmd.exe probe returned non-zero"}}catch(err){return{status:"disabled",platform:"win32",mechanism:"PowerShell wrapper",error:String(err)}}}function isBubblewrapAvailable(){return _cached?.status==="enabled"&&_cached?.platform==="linux"}function isSandboxExecAvailable(){return _cached?.status==="enabled"&&_cached?.platform==="darwin"}function isWindowsSandboxAvailable(){return _cached?.status==="enabled"&&_cached?.platform==="win32"}class SandboxCapabilityProbe{async detect(){if(_cached!==void 0)return _cached;let platform=process.platform;switch(platform){case"linux":_cached=await probeLinux();break;case"darwin":_cached=await probeMacOS();break;case"win32":_cached=probeWindows();break;default:_cached={status:"unsupported",mechanism:"unknown",platform,error:`unsupported platform: ${platform}`}}return _cached}}var _cached;var init_capability_probe=()=>{};import{spawnSync as spawnSync4}from"node:child_process";function probeBwrap(){try{let result=spawnSync4("bwrap",["--version"],{windowsHide:!0,encoding:"utf-8",timeout:5000,stdio:["ignore","pipe","ignore"]});if(result.error){let code=result.error.code;if(code&&BWRAP_UNAVAILABLE_CODES.has(code))return warn(`Sandbox disabled: bwrap error (${code}). Falling through to tool-layer enforcement.`),!1;return warn(`Sandbox disabled: bwrap spawn error (${result.error.message}). Falling through to tool-layer enforcement.`),!1}return result.status===BWRAP_VERSION_EXIT&&result.stdout.trim().length>0}catch(err){let message=err instanceof Error?err.message:String(err);return warn(`Sandbox disabled: probe threw (${message}). Falling through to tool-layer enforcement.`),!1}}function shellEscape(s){return s.replace(/'/g,"'\\''")}class BubblewrapSandboxExecutor{mechanism="Bubblewrap";_scopePaths;_tempDir;_available;_disabledReason;constructor(scopePaths=[],tempDir){this._scopePaths=scopePaths,this._tempDir=tempDir,this._available=!1,this._disabledReason=null;try{if(!_internals8.probeBwrap())this._disabledReason="bwrap not available or not functional",warn(`Sandbox disabled: ${this._disabledReason}. Falling through to tool-layer enforcement.`);else this._available=!0}catch(err){let message=err instanceof Error?err.message:String(err);this._disabledReason=`constructor threw: ${message}`,this._available=!1,warn(`Sandbox disabled: ${this._disabledReason}. Falling through to tool-layer enforcement.`)}}isAvailable(){return this._available}disable(reason){this._available=!1,this._disabledReason=reason,warn(`Sandbox disabled: ${reason}. Falling through to tool-layer enforcement.`)}wrapCommand(command,scopePaths,tempDir,envOverrides){if(!this._available)throw new SandboxError("Sandbox not available","SANDBOX_UNAVAILABLE");let temp=tempDir??this._tempDir??"/tmp",bindArgs=[...this._scopePaths,...scopePaths].flatMap((p)=>["--bind",`'${shellEscape(p)}'`,`'${shellEscape(p)}'`]),envArgs=[];if(envOverrides)for(let[key,value]of Object.entries(envOverrides)){if(!isValidEnvKey(key))continue;if(value===null)envArgs.push("--unsetenv",key);else envArgs.push("--setenv",key,value)}return`bwrap ${["--unshare-user","--unshare-net","--unshare-ipc","--die-with-parent","--new-session","--cap-drop","ALL",...bindArgs,"--dev","/dev","--size","500M","--tmpfs",`'${shellEscape(temp)}'`,"--ro-bind","/etc","/etc","--ro-bind","/usr","/usr","--ro-bind","/lib","/lib","--ro-bind","/lib64","/lib64","--proc","/proc","--unshare-pid",...envArgs,"--","bash","-c",`'${shellEscape(command)}'`].join(" ")}`}getEnvOverrides(){return{}}}var BWRAP_VERSION_EXIT=0,BWRAP_UNAVAILABLE_CODES,_internals8;var init_bubblewrap_executor=__esm(()=>{init_logger();init_executor();BWRAP_UNAVAILABLE_CODES=new Set(["ENOENT","EACCES","ENOSPC"]);_internals8={probeBwrap}});var exports_bubblewrap={};__export(exports_bubblewrap,{BubblewrapSandboxExecutor:()=>BubblewrapSandboxExecutor});var init_bubblewrap=__esm(()=>{init_bubblewrap_executor()});import{spawnSync as spawnSync5}from"node:child_process";import{mkdtempSync,writeFileSync as writeFileSync3}from"node:fs";import*as os5 from"node:os";import*as path13 from"node:path";function probeSandboxExec(){try{let result=spawnSync5("sandbox-exec",["--version"],{windowsHide:!0,encoding:"utf-8",timeout:5000,stdio:["ignore","pipe","ignore"]});if(result.error){let code=result.error.code;if(code&&SANDBOX_UNAVAILABLE_CODES.has(code))return warn(`Sandbox disabled: sandbox-exec error (${code}). Falling through to tool-layer enforcement.`),!1;return warn(`Sandbox disabled: spawn error (${result.error.message}). Falling through to tool-layer enforcement.`),!1}return result.status===0}catch(err){let message=err instanceof Error?err.message:String(err);return warn(`Sandbox disabled: probe threw (${message}). Falling through to tool-layer enforcement.`),!1}}function shellEscape2(s){return s.replace(/'/g,"'\\''")}function sbplEscapePath(path14){return path14.split("").filter((ch)=>{let cp=ch.codePointAt(0);return cp>=32&&cp!==127}).join("").replace(/\\/g,"\\\\").replace(/"/g,"\\\"")}function buildSandboxProfile(scopePaths,tempDir,envOverrides){let rwPaths=[...scopePaths];if(tempDir)rwPaths.push(tempDir);let rwAllowLines=rwPaths.map((p)=>`(allow file-write* (subpath "${sbplEscapePath(p)}"))`).join(`
@@ -353,8 +361,8 @@ ${recordLike.kind}
353
361
  ${normalized}`).digest("hex")}function createMemoryId(recordLike){return`mem_${computeMemoryContentHash(recordLike).slice(0,16)}`}function createProposalId(input){return`prop_${createHash14("sha256").update(`${input.createdAt}
354
362
  ${input.proposer}
355
363
  ${normalizeMemoryText(input.text)}`).digest("hex").slice(0,16)}`}function createBundleId(query,generatedAt){let compactTimestamp=generatedAt.replace(/[-:.TZ]/g,"").slice(0,14),hash3=createHash14("sha256").update(`${generatedAt}
356
- ${query}`).digest("hex").slice(0,8);return`bundle_${compactTimestamp}_${hash3}`}function isExpired(record2,now=new Date){if(!record2.expiresAt)return!1;let expires=Date.parse(record2.expiresAt);return Number.isFinite(expires)&&expires<=now.getTime()}function hasEvidenceSource(record2){return Boolean(record2.source.url||record2.source.filePath||record2.source.commitSha||record2.source.ref)}function validateMemoryRecordRules(record2,options){let parsed=MemoryRecordSchema.parse(record2);if(parsed.text.includes(MEMORY_RECALL_SENTINEL))throw new MemoryValidationError("memory text cannot contain the recall sentinel header");let expectedHash=computeMemoryContentHash(parsed),expectedId=createMemoryId(parsed);if(parsed.contentHash!==expectedHash)throw new MemoryValidationError("contentHash does not match memory content");if(parsed.id!==expectedId)throw new MemoryValidationError("id does not match memory content");if(parsed.stability==="durable"&&(parsed.scope.type==="run"||parsed.scope.type==="agent"))throw new MemoryValidationError("durable memories cannot use run or agent scope");if(parsed.stability==="durable"&&(DURABLE_MEMORY_KINDS.has(parsed.kind)||parsed.kind==="api_finding"||parsed.kind==="evidence")&&!hasEvidenceSource(parsed))throw new MemoryValidationError("durable project, repository, API, evidence, and security memories require source evidence");if(EVIDENCE_REQUIRED_KINDS.has(parsed.kind)&&!hasEvidenceSource(parsed))throw new MemoryValidationError(`${parsed.kind} memories require source evidence`);if(parsed.kind==="scratch"&&(!parsed.expiresAt||Date.parse(parsed.expiresAt)-Date.parse(parsed.createdAt)>604800000))throw new MemoryValidationError("scratch memories must expire within 7 days");if(options.rejectDurableSecrets&&parsed.stability==="durable"&&containsSecret(parsed.text))throw new MemoryValidationError("durable memory contains a likely secret");return parsed}function validateMemoryProposal(proposal){return MemoryProposalSchema.parse(proposal)}function validateCuratorMemoryDecision(decision){return CuratorMemoryDecisionSchema.parse(decision)}var MemoryScopeTypeSchema,MemoryScopeRefSchema,MemoryKindSchema,MemorySourceSchema,MemoryRecordSchema,MemoryProposalSchema,NewMemoryRecordSchema,MemoryPatchSchema,ProposalIdSchema,MemoryIdSchema,CuratorDecisionReasonSchema,CuratorMemoryDecisionSchema;var init_schema2=__esm(()=>{init_zod();init_config2();init_errors4();init_redaction();MemoryScopeTypeSchema=exports_external.enum(["global_user","workspace","project","repository","run","agent","cohort"]),MemoryScopeRefSchema=exports_external.object({type:MemoryScopeTypeSchema,userId:exports_external.string().optional(),workspaceId:exports_external.string().optional(),projectId:exports_external.string().optional(),repoId:exports_external.string().optional(),repoRoot:exports_external.string().optional(),runId:exports_external.string().optional(),agentId:exports_external.string().optional(),cohortId:exports_external.string().optional()}).strict(),MemoryKindSchema=exports_external.enum(["user_preference","project_fact","architecture_decision","repo_convention","api_finding","code_pattern","test_pattern","failure_pattern","security_note","evidence","todo","scratch"]),MemorySourceSchema=exports_external.object({type:exports_external.enum(["user","agent","tool","file","repo","commit","test","web","manual"]),ref:exports_external.string().optional(),url:exports_external.string().optional(),filePath:exports_external.string().optional(),commitSha:exports_external.string().optional(),createdBy:exports_external.string().optional()}).strict(),MemoryRecordSchema=exports_external.object({id:exports_external.string().regex(/^mem_[a-f0-9]{16}$/),scope:MemoryScopeRefSchema,kind:MemoryKindSchema,text:exports_external.string().min(1).max(2000),tags:exports_external.array(exports_external.string().min(1).max(64)).max(32),confidence:exports_external.number().min(0).max(1),stability:exports_external.enum(["ephemeral","session","durable"]),source:MemorySourceSchema,createdAt:exports_external.string().datetime(),updatedAt:exports_external.string().datetime(),lastAccessedAt:exports_external.string().datetime().optional(),expiresAt:exports_external.string().datetime().optional(),qValue:exports_external.number().min(0).max(1).optional(),supersedes:exports_external.array(exports_external.string()).optional(),supersededBy:exports_external.string().optional(),contentHash:exports_external.string().regex(/^[a-f0-9]{64}$/),metadata:exports_external.record(exports_external.string(),exports_external.unknown()),cohortId:exports_external.string().optional(),producerSessionId:exports_external.string().optional(),producerAgentRole:exports_external.string().optional(),redactionPolicyVersion:exports_external.number().int().min(0).optional(),schemaVersion:exports_external.number().int().min(0).optional(),providerVersion:exports_external.string().optional(),sourceRevision:exports_external.string().optional()}).strict(),MemoryProposalSchema=exports_external.object({id:exports_external.string().regex(/^prop_[a-f0-9]{16}$/),operation:exports_external.enum(["add","update","delete","ignore","merge","supersede"]),proposedRecord:MemoryRecordSchema.optional(),targetMemoryId:exports_external.string().optional(),relatedMemoryIds:exports_external.array(exports_external.string()).optional(),proposedBy:exports_external.object({agentRole:exports_external.string().optional(),agentId:exports_external.string().optional(),runId:exports_external.string().optional()}).strict(),rationale:exports_external.string().min(1).max(2000),evidenceRefs:exports_external.array(exports_external.string().min(1).max(500)).max(20),status:exports_external.enum(["pending","approved","rejected","superseded","applied"]),reviewer:exports_external.enum(["user","controller","curator_agent","auto_policy"]).optional(),reviewedAt:exports_external.string().datetime().optional(),rejectionReason:exports_external.string().optional(),createdAt:exports_external.string().datetime(),metadata:exports_external.record(exports_external.string(),exports_external.unknown())}).strict(),NewMemoryRecordSchema=exports_external.object({scope:MemoryScopeRefSchema.optional(),kind:MemoryKindSchema,text:exports_external.string().min(1).max(2000),tags:exports_external.array(exports_external.string().min(1).max(64)).max(32).optional(),confidence:exports_external.number().min(0).max(1).optional(),stability:exports_external.enum(["ephemeral","session","durable"]).optional(),source:MemorySourceSchema.optional(),expiresAt:exports_external.string().datetime().optional(),metadata:exports_external.record(exports_external.string(),exports_external.unknown()).optional()}).strict(),MemoryPatchSchema=exports_external.object({scope:MemoryScopeRefSchema.optional(),kind:MemoryKindSchema.optional(),text:exports_external.string().min(1).max(2000).optional(),tags:exports_external.array(exports_external.string().min(1).max(64)).max(32).optional(),confidence:exports_external.number().min(0).max(1).optional(),stability:exports_external.enum(["ephemeral","session","durable"]).optional(),source:MemorySourceSchema.optional(),expiresAt:exports_external.string().datetime().optional(),metadata:exports_external.record(exports_external.string(),exports_external.unknown()).optional()}).strict().refine((patch)=>Object.keys(patch).length>0,{message:"memory patch must not be empty"}),ProposalIdSchema=exports_external.string().regex(/^prop_[a-f0-9]{16}$/),MemoryIdSchema=exports_external.string().regex(/^mem_[a-f0-9]{16}$/),CuratorDecisionReasonSchema=exports_external.string().min(1).max(2000),CuratorMemoryDecisionSchema=exports_external.discriminatedUnion("action",[exports_external.object({action:exports_external.literal("add"),proposalId:ProposalIdSchema,memory:NewMemoryRecordSchema}).strict(),exports_external.object({action:exports_external.literal("update"),proposalId:ProposalIdSchema,targetMemoryId:MemoryIdSchema,patch:MemoryPatchSchema,reason:CuratorDecisionReasonSchema}).strict(),exports_external.object({action:exports_external.literal("supersede"),proposalId:ProposalIdSchema,oldMemoryId:MemoryIdSchema,replacement:NewMemoryRecordSchema,reason:CuratorDecisionReasonSchema}).strict(),exports_external.object({action:exports_external.literal("reject"),proposalId:ProposalIdSchema,reason:CuratorDecisionReasonSchema}).strict(),exports_external.object({action:exports_external.literal("noop"),proposalId:ProposalIdSchema,reason:CuratorDecisionReasonSchema}).strict()])});function validateDecisionMatchesProposal(decision,proposal){if(decision.action==="add"&&proposal.operation!=="add"||decision.action==="update"&&proposal.operation!=="update"||decision.action==="supersede"&&proposal.operation!=="supersede")throw new MemoryValidationError(`curator ${decision.action} decision does not match ${proposal.operation} proposal`);if(decision.action==="update"&&proposal.targetMemoryId&&proposal.targetMemoryId!==decision.targetMemoryId)throw new MemoryValidationError("curator update decision target does not match proposal target");if(decision.action==="supersede"&&proposal.targetMemoryId&&proposal.targetMemoryId!==decision.oldMemoryId)throw new MemoryValidationError("curator supersede decision target does not match proposal target")}function validateCuratorPromotableMemory(record2){if(record2.stability!=="durable")throw new MemoryValidationError("curator memory promotions must be durable facts");if(!DURABLE_MEMORY_KINDS.has(record2.kind))throw new MemoryValidationError("curator memory promotions must use durable fact kinds; store raw docs, search results, and other bulky source material as evidence records instead");if(normalizeMemoryText(record2.text).length>CURATOR_PROMOTED_MEMORY_MAX_TEXT_LENGTH)throw new MemoryValidationError(`curator memory promotions must be concise durable facts under ${CURATOR_PROMOTED_MEMORY_MAX_TEXT_LENGTH} characters`)}function applyPatchToMemory(existing,patch,updatedAt){let base={scope:patch.scope??existing.scope,kind:patch.kind??existing.kind,text:patch.text===void 0?existing.text:normalizeMemoryText(patch.text)},tags=patch.tags===void 0?existing.tags:normalizeTags(patch.tags);return{...existing,...patch,...base,id:createMemoryId(base),tags,updatedAt,contentHash:computeMemoryContentHash(base),metadata:patch.metadata===void 0?existing.metadata:{...existing.metadata,...patch.metadata}}}function markProposalReviewed(proposal,decision,status,reviewedAt,ids){let reason=curatorDecisionReason(decision);return validateMemoryProposal({...proposal,status,reviewer:"curator_agent",reviewedAt,rejectionReason:decision.action==="reject"?reason:void 0,metadata:{...proposal.metadata,curatorDecision:{action:decision.action,reason,...ids,appliedAt:reviewedAt}}})}function curatorDecisionReason(decision){switch(decision.action){case"add":return;case"update":case"supersede":case"reject":case"noop":return decision.reason}}function buildCuratorDecisionEvent(change,proposal){return{...change,proposalOperation:proposal.operation}}function normalizeTags(tags){return Array.from(new Set(tags.map((tag)=>tag.toLowerCase().replace(/[^\w-]/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"")).filter(Boolean))).slice(0,32)}var CURATOR_PROMOTED_MEMORY_MAX_TEXT_LENGTH=500;var init_curator_decision_helpers=__esm(()=>{init_config2();init_errors4();init_schema2()});function clamp01(value){if(value<0)return 0;if(value>1)return 1;return value}function applyEmaUpdate(qOld,reward,eta){if(!Number.isFinite(qOld))return 0;if(!Number.isFinite(reward)||!Number.isFinite(eta))return clamp01(qOld);let next=(1-eta)*qOld+eta*reward;return clamp01(next)}function applyPropagatedEmaUpdate(qOld,reward,eta,fraction){if(!Number.isFinite(fraction)||fraction<=0)return applyEmaUpdate(qOld,reward,0);let cappedFraction=fraction>1?1:fraction;return applyEmaUpdate(qOld,reward,eta*cappedFraction)}function getQValue(record2,fallback=0.5){let raw=record2.metadata?.qValue;if(typeof raw==="number"&&Number.isFinite(raw)&&raw>=0&&raw<=1)return raw;return fallback}function setQValue(record2,value){return{...record2,metadata:{...record2.metadata,qValue:clamp01(Number.isFinite(value)?value:0)}}}function resolveMemoryRecallProfile(agentRole){let role=normalizeMemoryAgentRole(agentRole);return MEMORY_RECALL_PROFILES[role]??MEMORY_RECALL_PROFILES.coder}function normalizeMemoryAgentRole(agentRole){let base=stripKnownSwarmPrefix(agentRole??"architect");if(base==="reviewer"||base==="test_engineer")return"qa";if(base==="critic"||base==="critic_sounding_board"||base==="critic_drift_verifier"||base==="critic_hallucination_verifier"||base==="critic_architecture_supervisor")return"security";if(base==="curator_init"||base==="curator_phase"||base==="curator_postmortem")return"curator";if(base==="docs")return"sme";if(base==="architect"||base==="sme"||base==="coder"||base==="security"||base==="curator")return base;return"coder"}var MEMORY_RECALL_PROFILES;var init_role_profiles=__esm(()=>{init_schema();MEMORY_RECALL_PROFILES={architect:{kinds:["project_fact","architecture_decision","repo_convention","failure_pattern","security_note"],maxItems:10,tokenBudget:1600},sme:{kinds:["api_finding","code_pattern","repo_convention","failure_pattern","evidence"],maxItems:8,tokenBudget:1200},coder:{kinds:["architecture_decision","repo_convention","code_pattern","test_pattern","failure_pattern"],maxItems:8,tokenBudget:1200},qa:{kinds:["test_pattern","failure_pattern","repo_convention","security_note"],maxItems:8,tokenBudget:1200},security:{kinds:["security_note","architecture_decision","repo_convention","evidence"],maxItems:8,tokenBudget:1200},curator:{kinds:["project_fact","architecture_decision","repo_convention","api_finding","code_pattern","test_pattern","failure_pattern","security_note","evidence"],maxItems:20,tokenBudget:3000}}});function tokenize(text){return new Set(text.toLowerCase().replace(/[^\w\s-]/g," ").split(/\s+/).map((token)=>token.trim()).filter(Boolean))}function jaccard(a,b){if(a.size===0&&b.size===0)return 0;let intersection2=0;for(let token of a)if(b.has(token))intersection2++;let union2=a.size+b.size-intersection2;return union2===0?0:intersection2/union2}function clusterByJaccard(items,getText,threshold){let clusters=[];for(let item of items){let tokens=tokenize(getText(item)),placed=!1;for(let cluster of clusters)if(jaccard(tokens,cluster.tokens)>=threshold){cluster.members.push(item),placed=!0;break}if(!placed)clusters.push({tokens,members:[item]})}return clusters.map((cluster)=>cluster.members)}function importanceScore(input,weights){let recency=input.daysSinceLastRecall===null?0:Math.exp(-weights.lambda*Math.max(0,input.daysSinceLastRecall)),denom=Math.log1p(Math.max(1,weights.n)),frequency=denom===0?0:Math.log1p(Math.max(0,input.retrievalCount))/denom,freshness=Math.exp(-weights.mu*Math.max(0,input.daysSinceCreated)),confidence=Math.min(1,Math.max(0,input.confidence));return weights.wRecency*recency+weights.wFrequency*frequency+weights.wFreshness*freshness+weights.wConfidence*confidence}function normalizeKindText(kind){return kind.replace(/_/g," ")}function collectMetadataStrings(metadata,keys){let values=[];for(let key of keys){let value=metadata[key];if(typeof value==="string")values.push(value);if(Array.isArray(value)){for(let item of value)if(typeof item==="string")values.push(item)}}return values}function overlap(a,b){if(a.size===0||b.size===0)return 0;let hits=0;for(let token of a)if(b.has(token))hits++;return hits/Math.max(a.size,1)}function scopeSpecificityBoost(scope){switch(scope.type){case"agent":return 1;case"run":return 0.9;case"repository":return 0.8;case"cohort":return 0.75;case"project":return 0.65;case"workspace":return 0.45;case"global_user":return 0.3}}function kindProfileBoost(kind,request){if(!request.kinds||request.kinds.length===0)return 0.5;return request.kinds.includes(kind)?1:0}function roleProfileBoost(kind,context){return context.roleProfileKinds?.has(kind)?1:0}function sameScope(a,b){return stableScopeKey(a)===stableScopeKey(b)}function scopeAllowed(recordScope,allowedScopes){return allowedScopes.some((scope)=>sameScope(recordScope,scope))}function scoreMemoryRecordDetailed(record2,request,context,qLearningConfig=DEFAULT_QLEARNING_CONFIG){if(!request.includeExpired&&isExpired(record2))return{item:null,skipReason:"filtered"};if(record2.supersededBy)return{item:null,skipReason:"filtered"};if(record2.metadata.deleted===!0)return{item:null,skipReason:"filtered"};if(!scopeAllowed(record2.scope,request.scopes))return{item:null,skipReason:"filtered"};if(request.kinds&&!request.kinds.includes(record2.kind))return{item:null,skipReason:"filtered"};if(request.includeLowQ!==!0&&getQValue(record2,qLearningConfig.initialQValue)<qLearningConfig.suppressionThreshold)return{item:null,skipReason:"suppressed_low_q"};let queryTokens=request.mode==="injection"&&context.taskTokens?context.taskTokens:context.queryTokens,textTokens=tokenize(record2.text),tagTokens=tokenize(record2.tags.join(" ")),fileTokens=tokenize([record2.source.filePath,...collectMetadataStrings(record2.metadata,["file","filePath","files","touchedFiles"])].filter((value)=>typeof value==="string").join(" ")),symbolTokens=tokenize(collectMetadataStrings(record2.metadata,["symbol","symbols"]).join(" ")),kindTokens=tokenize(normalizeKindText(record2.kind)),sourceRefTokens=tokenize(record2.source.ref??""),taskSearchTokens=unionTokens(textTokens,tagTokens,fileTokens,symbolTokens,kindTokens,sourceRefTokens),taskTermOverlap=context.taskTokens?overlap(context.taskTokens,taskSearchTokens):0,kindQueryOverlap=overlap(queryTokens,kindTokens),textOverlap=overlap(queryTokens,textTokens),tagOverlap=overlap(queryTokens,tagTokens),fileOverlap=overlap(queryTokens,fileTokens),symbolOverlap=overlap(queryTokens,symbolTokens),kindMatch=request.kinds?.includes(record2.kind)??!1,scopeMatch=scopeAllowed(record2.scope,request.scopes),roleBoost=roleProfileBoost(record2.kind,context),hasQuerySignal=textOverlap>0||tagOverlap>0||fileOverlap>0||symbolOverlap>0||kindQueryOverlap>0;if(request.mode==="injection"&&request.requireQuerySignal!==!1&&!hasQuerySignal)return{item:null,skipReason:"no_signal"};let baseScore=textOverlap*SCORING_WEIGHTS.textOverlap+tagOverlap*SCORING_WEIGHTS.tagOverlap+fileOverlap*SCORING_WEIGHTS.fileOverlap+symbolOverlap*SCORING_WEIGHTS.symbolOverlap+taskTermOverlap*SCORING_WEIGHTS.taskTermOverlap+scopeSpecificityBoost(record2.scope)*SCORING_WEIGHTS.scopeSpecificityBoost+kindProfileBoost(record2.kind,request)*SCORING_WEIGHTS.kindProfileBoost+roleBoost*SCORING_WEIGHTS.roleBoost+record2.confidence*SCORING_WEIGHTS.confidence,qValue=getQValue(record2,NEUTRAL_Q_VALUE),qValueBoost=(qValue-NEUTRAL_Q_VALUE)*qLearningConfig.qValueBoostWeight,rankingScore=baseScore+qValueBoost,reasonParts=[textOverlap>0?`text_overlap=${textOverlap.toFixed(2)}`:null,tagOverlap>0?`tag_overlap=${tagOverlap.toFixed(2)}`:null,fileOverlap>0?`file_overlap=${fileOverlap.toFixed(2)}`:null,symbolOverlap>0?`symbol_overlap=${symbolOverlap.toFixed(2)}`:null,taskTermOverlap>0?`task_terms=${taskTermOverlap.toFixed(2)}`:null,kindQueryOverlap>0?`kind_query=${kindQueryOverlap.toFixed(2)}`:null,roleBoost>0?"role_profile":null,`scope=${record2.scope.type}`,`confidence=${record2.confidence.toFixed(2)}`,qValue!==NEUTRAL_Q_VALUE?`qvalue=${qValue.toFixed(2)}`:null].filter(Boolean);return{baseScore,item:{record:record2,score:rankingScore,reason:reasonParts.join(", "),signals:{textOverlap,tagOverlap,fileOverlap,symbolOverlap,kindMatch,scopeMatch}}}}function scoreMemoryRecordsWithDiagnostics(records,request,qLearningConfig=DEFAULT_QLEARNING_CONFIG,options){let minScore=request.minScore??0,context=createScoringContext(request),diagnostics={candidateCount:records.length,preScoredFilteredCount:0,scoredCount:0,returnedCount:0,noSignalCount:0,belowThresholdCount:0,suppressedLowQCount:0,exploredCount:0},items=[],suppressedRecords=[];for(let record2 of records){let result=scoreMemoryRecordDetailed(record2,request,context,qLearningConfig);if(!result.item){if(result.skipReason==="filtered")diagnostics.preScoredFilteredCount++;if(result.skipReason==="no_signal")diagnostics.noSignalCount++;if(result.skipReason==="suppressed_low_q")diagnostics.suppressedLowQCount++,suppressedRecords.push(record2);continue}if(diagnostics.scoredCount++,(result.baseScore??result.item.score)<minScore){diagnostics.belowThresholdCount++;continue}items.push(result.item)}if(request.includeLowQ!==!0&&suppressedRecords.length>0&&qLearningConfig.explorationRate>0){if((options?.random??Math.random)()<qLearningConfig.explorationRate){let exploreRequest={...request,includeLowQ:!0},best=null;for(let record2 of suppressedRecords){let rescored=scoreMemoryRecordDetailed(record2,exploreRequest,context,qLearningConfig);if(!rescored.item)continue;let baseScore=rescored.baseScore??rescored.item.score;if(baseScore<minScore)continue;if(!best||baseScore>best.baseScore||baseScore===best.baseScore&&record2.id.localeCompare(best.item.record.id)<0)best={item:rescored.item,baseScore}}if(best)items.push({...best.item,explored:!0}),diagnostics.exploredCount=1}}return items.sort((a,b)=>b.score-a.score||a.record.id.localeCompare(b.record.id)),diagnostics.returnedCount=items.length,{items,diagnostics}}function sliceRecallItemsWithExploration(items,maxItems){let normal=items.filter((item)=>!item.explored),explored=items.filter((item)=>item.explored);return[...normal.slice(0,maxItems),...explored]}function createScoringContext(request){return{taskTokens:request.task?tokenize(request.task):void 0,queryTokens:tokenize(request.query),roleProfileKinds:request.agentRole?new Set(resolveMemoryRecallProfile(request.agentRole).kinds):void 0}}function unionTokens(...sets){let union2=new Set;for(let set2 of sets)for(let token of set2)union2.add(token);return union2}var NEUTRAL_Q_VALUE=0.5,SCORING_WEIGHTS;var init_scoring=__esm(()=>{init_config2();init_role_profiles();init_schema2();SCORING_WEIGHTS={textOverlap:0.38,tagOverlap:0.16,fileOverlap:0.12,symbolOverlap:0.08,taskTermOverlap:0.08,scopeSpecificityBoost:0.12,kindProfileBoost:0.06,roleBoost:0.05,confidence:0.08}});async function buildMemoryMaintenanceReport(provider,options={}){let now=options.now??new Date,limit=Math.max(1,Math.trunc(options.limit??20)),memories=await provider.list({includeExpired:!0,includeInactive:!0}),proposals=await loadMaintenanceProposals(provider,limit),recallUsage=provider.listRecallUsage?await provider.listRecallUsage():[],usageByMemory=summarizeRecallByMemory(recallUsage),usageByRole=summarizeRecallByRole(recallUsage),activeMemories=memories.filter((memory)=>isActiveMemory(memory,now)),deletedMemories=memories.filter((memory)=>memory.metadata.deleted===!0),expiredScratchMemories=memories.filter((memory)=>memory.kind==="scratch"&&isExpired(memory,now)),supersededMemories=memories.filter((memory)=>Boolean(memory.supersededBy)),lowUtilityMemories=activeMemories.filter((memory)=>isLowUtility(memory,usageByMemory,now,{weights:options.importanceWeights??DEFAULT_IMPORTANCE_WEIGHTS,threshold:options.importanceThreshold??DEFAULT_IMPORTANCE_THRESHOLD})).sort(memorySort),neverRecalledMemories=activeMemories.filter((memory)=>!usageByMemory.has(memory.id)).sort(memorySort),qLearning=options.qLearning??DEFAULT_QLEARNING_CONFIG,lowQValueMemories=activeMemories.filter((memory)=>getQValue(memory,qLearning.initialQValue)<qLearning.suppressionThreshold).sort(memorySort),promotionCandidates=activeMemories.filter((memory)=>getQValue(memory,qLearning.initialQValue)>qLearning.promotionThreshold&&(usageByMemory.get(memory.id)?.count??0)>qLearning.promotionMinRetrievals).sort(memorySort),rejectedProposalReasons=proposals.filter((proposal)=>proposal.status==="rejected").sort(proposalSort),pendingProposals=proposals.filter((proposal)=>proposal.status==="pending").sort(proposalSort);return{generatedAt:now.toISOString(),totalMemories:memories.length,activeMemories:activeMemories.length,deletedMemories:deletedMemories.slice(0,limit),expiredScratchMemories:expiredScratchMemories.slice(0,limit),supersededMemories:supersededMemories.slice(0,limit),supersededChains:buildSupersededChains(memories).slice(0,limit),lowUtilityMemories:lowUtilityMemories.slice(0,limit),lowQValueMemories:lowQValueMemories.slice(0,limit),promotionCandidates:promotionCandidates.slice(0,limit),neverRecalledMemories:neverRecalledMemories.slice(0,limit),mostRecalledMemories:Array.from(usageByMemory.values()).sort((a,b)=>b.count-a.count||b.lastRecalledAt.localeCompare(a.lastRecalledAt)||a.memoryId.localeCompare(b.memoryId)).slice(0,limit),recallByAgentRole:Array.from(usageByRole.values()).sort((a,b)=>b.count-a.count||a.agentRole.localeCompare(b.agentRole)).slice(0,limit),rejectedProposalReasons:rejectedProposalReasons.slice(0,limit),pendingProposals:pendingProposals.slice(0,limit),recallEventCount:recallUsage.length}}function shouldCompactMemory(memory,now=new Date){if(memory.metadata.deleted===!0)return"deleted";if(memory.supersededBy)return"superseded";if(memory.kind==="scratch"&&isExpired(memory,now))return"expired_scratch";return null}function isActiveMemory(memory,now){return memory.metadata.deleted!==!0&&!memory.supersededBy&&!isExpired(memory,now)}function isLowUtility(memory,usageByMemory,now,options){if(usageByMemory.has(memory.id))return!1;let created=Date.parse(memory.createdAt),daysSinceCreated=Number.isFinite(created)?Math.max(0,(now.getTime()-created)/MS_PER_DAY):0;return importanceScore({confidence:memory.confidence,retrievalCount:0,daysSinceLastRecall:null,daysSinceCreated},options.weights)<options.threshold}function summarizeRecallByMemory(usageEvents){let byMemory=new Map;for(let event of usageEvents)event.memoryIds.forEach((memoryId,index)=>{let role=event.agentRole??"unknown",existing=byMemory.get(memoryId)??{memoryId,count:0,lastRecalledAt:event.timestamp,agentRoles:{},averageScore:0,scoreTotal:0,scoreCount:0};existing.count++,existing.lastRecalledAt=event.timestamp>existing.lastRecalledAt?event.timestamp:existing.lastRecalledAt,existing.agentRoles[role]=(existing.agentRoles[role]??0)+1;let score=event.scores[index];if(typeof score==="number"&&Number.isFinite(score))existing.scoreTotal+=score,existing.scoreCount++,existing.averageScore=existing.scoreTotal/existing.scoreCount;byMemory.set(memoryId,existing)});return new Map(Array.from(byMemory,([memoryId,value])=>[memoryId,{memoryId,count:value.count,lastRecalledAt:value.lastRecalledAt,agentRoles:value.agentRoles,averageScore:value.averageScore}]))}async function loadMaintenanceProposals(provider,limit){if(!provider.listProposals)return[];let[pending,rejected,recent]=await Promise.all([provider.listProposals({status:"pending",limit}),provider.listProposals({status:"rejected",limit}),provider.listProposals({limit:Math.max(limit*4,100)})]),byId=new Map;for(let proposal of[...pending,...rejected,...recent])byId.set(proposal.id,proposal);return Array.from(byId.values())}function summarizeRecallByRole(usageEvents){let byRole=new Map;for(let event of usageEvents){let role=event.agentRole??"unknown",existing=byRole.get(role)??{agentRole:role,count:0,memoryIds:{}};existing.count++;for(let memoryId of event.memoryIds)existing.memoryIds[memoryId]=(existing.memoryIds[memoryId]??0)+1;byRole.set(role,existing)}return byRole}function buildSupersededChains(memories){let byId=new Map(memories.map((memory)=>[memory.id,memory])),supersededIds=new Set(memories.filter((memory)=>memory.supersededBy).map((memory)=>memory.id));return memories.filter((memory)=>memory.supersededBy&&!(memory.supersedes??[]).some((id)=>supersededIds.has(id))).map((root)=>{let chain=[root.id],seen=new Set(chain),cursor=root;while(cursor?.supersededBy&&!seen.has(cursor.supersededBy))chain.push(cursor.supersededBy),seen.add(cursor.supersededBy),cursor=byId.get(cursor.supersededBy);return{rootId:root.id,chain,reason:typeof root.metadata.supersedeReason==="string"?root.metadata.supersedeReason:void 0}})}function memorySort(a,b){return b.updatedAt.localeCompare(a.updatedAt)||a.id.localeCompare(b.id)}function proposalSort(a,b){let aTime=a.reviewedAt??a.createdAt;return(b.reviewedAt??b.createdAt).localeCompare(aTime)||a.id.localeCompare(b.id)}var DEFAULT_IMPORTANCE_WEIGHTS,DEFAULT_IMPORTANCE_THRESHOLD=0.2,MS_PER_DAY=86400000;var init_maintenance=__esm(()=>{init_config2();init_schema2();init_scoring();DEFAULT_IMPORTANCE_WEIGHTS={wRecency:0.2,wFrequency:0.2,wFreshness:0.15,wConfidence:0.25,lambda:0.05,mu:0.01,n:50}});import{randomUUID as randomUUID4}from"node:crypto";import{existsSync as existsSync15,readFileSync as readFileSync15,writeFileSync as writeFileSync10}from"node:fs";import{appendFile as appendFile2,mkdir as mkdir5,readFile as readFile9,rename as rename6,writeFile as writeFile5}from"node:fs/promises";import*as path34 from"node:path";class LocalJsonlMemoryProvider{name="local-jsonl";rootDirectory;cohortRoot;config;initialized=!1;memories=new Map;proposals=new Map;constructor(rootDirectory,config2={},vettedCohortRoot){this.rootDirectory=rootDirectory,this.cohortRoot=vettedCohortRoot??null,this.config={...DEFAULT_MEMORY_CONFIG,...config2}}pathFor(file2){let filename=file2==="memories"?"memories.jsonl":file2==="proposals"?"proposals.jsonl":file2==="audit"?"audit.jsonl":"reward-events.jsonl";if(this.cohortRoot)return path34.join(this.cohortRoot,filename);let storageDir=this.config.storageDir.replace(/^\.swarm[/\\]?/,"");return validateSwarmPath(this.rootDirectory,path34.join(storageDir,filename))}async initialize(){if(this.initialized)return;if(this.cohortRoot)this.assertCohortConfigFingerprint();let memoryPath=this.pathFor("memories"),proposalPath=this.pathFor("proposals"),memoryLoad=validateLoadedMemories(await readJsonl(memoryPath),this.config),proposalLoad=validateLoadedProposals(await readJsonl(proposalPath),this.config);if(this.memories=new Map(memoryLoad.records.map((record2)=>[record2.id,record2])),this.proposals=new Map(proposalLoad.records.map((proposal)=>[proposal.id,proposal])),this.initialized=!0,memoryLoad.invalidCount>0)await this.audit("invalid_load","memories",`${memoryLoad.invalidCount} invalid memory JSONL row(s) skipped`);if(proposalLoad.invalidCount>0)await this.audit("invalid_load","proposals",`${proposalLoad.invalidCount} invalid proposal JSONL row(s) skipped`)}async upsert(record2){await this.initialize();let existing=this.memories.get(record2.id);if(existing?.metadata.deleted===!0)throw new MemoryValidationError("memory is tombstoned and cannot be upserted");let next=validateMemoryRecordRules({...record2,createdAt:existing?.createdAt??record2.createdAt},{rejectDurableSecrets:this.config.redaction.rejectDurableSecrets});return this.memories.set(next.id,next),await appendJsonl(this.pathFor("memories"),next),await this.audit("upsert",next.id),this.bumpCohortGeneration(),next}async get(id){return await this.initialize(),this.memories.get(id)??null}async delete(id,reason){await this.initialize();let existing=this.memories.get(id);if(!existing)return;if(this.config.hardDelete)this.memories.delete(id),await this.compact();else{let tombstone={...existing,updatedAt:new Date().toISOString(),metadata:{...existing.metadata,deleted:!0,deleteReason:reason}};this.memories.set(id,tombstone),await appendJsonl(this.pathFor("memories"),tombstone)}await this.audit("delete",id,reason),this.bumpCohortGeneration()}async recall(request){return(await this.recallWithDiagnostics(request)).items}async recallWithDiagnostics(request){await this.initialize();let records=await this.list({scopes:request.scopes,kinds:request.kinds,includeExpired:request.includeExpired}),result=scoreMemoryRecordsWithDiagnostics(records,request,this.config.qLearning),sliced=sliceRecallItemsWithExploration(result.items,request.maxItems);return{items:sliced,diagnostics:{...result.diagnostics,exploredCount:sliced.some((item)=>item.explored)?1:0,returnedCount:sliced.length}}}async recordRecallUsage(event){await this.initialize(),await this.audit("recall",event.bundleId,void 0,event)}async listRecallUsage(filter={}){await this.initialize();let events=await readAuditEvents(this.pathFor("audit")),usage=[];for(let event of events){if(event.operation!=="recall")continue;let parsed=parseRecallUsageEvent(event);if(parsed)usage.push(parsed)}if(usage.sort((a,b)=>b.timestamp.localeCompare(a.timestamp)),typeof filter.runId==="string"&&filter.runId.length>0)usage=usage.filter((event)=>event.runId===filter.runId);if(typeof filter.unitId==="string"&&filter.unitId.length>0)usage=usage.filter((event)=>event.unitId===filter.unitId);return usage.slice(0,filter.limit??usage.length)}async appendRewardEvent(event){await this.initialize();let record2={...event,id:randomUUID4()};await appendJsonl(this.pathFor("reward-events"),record2),this.bumpCohortGeneration()}async listRewardEvents(filter={}){await this.initialize();let values=await readJsonl(this.pathFor("reward-events")),events=[];for(let value of values){let parsed=parseRewardEvent(value);if(parsed)events.push(parsed)}if(typeof filter.memoryId==="string"&&filter.memoryId.length>0)events=events.filter((event)=>event.memoryId===filter.memoryId);return events.sort((a,b)=>b.timestamp.localeCompare(a.timestamp)),events.slice(0,filter.limit??events.length)}async list(filter={}){await this.initialize();let records=Array.from(this.memories.values());if(filter.scopes&&filter.scopes.length>0)records=records.filter((record2)=>scopeAllowed(record2.scope,filter.scopes??[]));if(filter.kinds&&filter.kinds.length>0)records=records.filter((record2)=>filter.kinds?.includes(record2.kind));if(!filter.includeExpired){let now=Date.now();records=records.filter((record2)=>{if(!record2.expiresAt)return!0;let expires=Date.parse(record2.expiresAt);return!Number.isFinite(expires)||expires>now})}if(!filter.includeInactive)records=records.filter((record2)=>!record2.supersededBy&&record2.metadata.deleted!==!0);return records.sort((a,b)=>b.updatedAt.localeCompare(a.updatedAt)),records.slice(0,filter.limit??records.length)}async createProposal(proposal){await this.initialize();let next=validateMemoryProposal(proposal);return this.proposals.set(next.id,next),await appendJsonl(this.pathFor("proposals"),next),await this.audit("proposal",next.id),this.bumpCohortGeneration(),next}async listProposals(filter={}){await this.initialize();let proposals=Array.from(this.proposals.values());if(filter.status)proposals=proposals.filter((proposal)=>proposal.status===filter.status);return proposals.sort((a,b)=>b.createdAt.localeCompare(a.createdAt)),proposals.slice(0,filter.limit??proposals.length)}async applyCuratorDecision(decision){await this.initialize();let appliedAt=new Date().toISOString(),proposal=this.proposals.get(decision.proposalId);if(!proposal)throw new MemoryValidationError("memory proposal was not found");if(proposal.status!=="pending")throw new MemoryValidationError("memory proposal is not pending");validateDecisionMatchesProposal(decision,proposal);let memoryId,targetMemoryId,oldMemoryId,replacementMemoryId;if(decision.action==="add"){let memory=this.validateDecisionMemory({...decision.memory,updatedAt:appliedAt});validateCuratorPromotableMemory(memory),this.memories.set(memory.id,memory),await appendJsonl(this.pathFor("memories"),memory),memoryId=memory.id}else if(decision.action==="update"){let existing=this.activeMemory(decision.targetMemoryId),updated=this.validateDecisionMemory(applyPatchToMemory(existing,decision.patch,appliedAt));if(validateCuratorPromotableMemory(updated),updated.id!==existing.id){let tombstone=this.validateDecisionMemory({...existing,updatedAt:appliedAt,metadata:{...existing.metadata,deleted:!0,deleteReason:decision.reason,updateReplacementId:updated.id}});this.memories.set(tombstone.id,tombstone),await appendJsonl(this.pathFor("memories"),tombstone)}this.memories.set(updated.id,updated),await appendJsonl(this.pathFor("memories"),updated),memoryId=updated.id,targetMemoryId=existing.id}else if(decision.action==="supersede"){let oldMemory=this.activeMemory(decision.oldMemoryId),replacement=this.validateDecisionMemory({...decision.replacement,updatedAt:appliedAt,supersedes:Array.from(new Set([...decision.replacement.supersedes??[],oldMemory.id]))});validateCuratorPromotableMemory(replacement);let superseded=this.validateDecisionMemory({...oldMemory,updatedAt:appliedAt,supersededBy:replacement.id,metadata:{...oldMemory.metadata,supersedeReason:decision.reason}});this.memories.set(superseded.id,superseded),this.memories.set(replacement.id,replacement),await appendJsonl(this.pathFor("memories"),superseded),await appendJsonl(this.pathFor("memories"),replacement),oldMemoryId=oldMemory.id,replacementMemoryId=replacement.id,memoryId=replacement.id}let proposalStatus=decision.action==="reject"?"rejected":"applied",reviewedProposal=markProposalReviewed(proposal,decision,proposalStatus,appliedAt,{memoryId,targetMemoryId,oldMemoryId,replacementMemoryId});this.proposals.set(reviewedProposal.id,reviewedProposal),await appendJsonl(this.pathFor("proposals"),reviewedProposal);let change={action:decision.action,proposalId:decision.proposalId,proposalStatus,appliedAt,memoryId,targetMemoryId,oldMemoryId,replacementMemoryId,reason:curatorDecisionReason(decision)};return await this.audit("curator_decision",decision.proposalId,change.reason,buildCuratorDecisionEvent(change,proposal)),this.bumpCohortGeneration(),change}async compact(){await this.initialize(),await writeJsonlAtomic(this.pathFor("memories"),Array.from(this.memories.values())),await this.audit("compact","memories"),this.bumpCohortGeneration()}async compactMaintenance(options={}){await this.initialize();let now=options.now?new Date(options.now):new Date,kept=[],result={dryRun:options.dryRun!==!1,removedDeleted:0,removedSuperseded:0,removedExpiredScratch:0,remaining:0};for(let memory of this.memories.values()){let compactReason=shouldCompactMemory(memory,now);if(compactReason==="deleted"){result.removedDeleted++;continue}if(compactReason==="superseded"){result.removedSuperseded++;continue}if(compactReason==="expired_scratch"){result.removedExpiredScratch++;continue}kept.push(memory)}if(result.remaining=kept.length,result.dryRun)return result;return this.memories=new Map(kept.map((memory)=>[memory.id,memory])),await writeJsonlAtomic(this.pathFor("memories"),kept),await this.audit("compact","memories","removed deleted, superseded, and expired scratch memories",result),this.bumpCohortGeneration(),result}async audit(operation,targetId,reason,eventJson){let event={id:randomUUID4(),operation,targetId,reason,eventJson,timestamp:new Date().toISOString()};await appendJsonl(this.pathFor("audit"),event)}bumpCohortGeneration(){if(!this.cohortRoot)return;try{let markerPath=path34.join(this.cohortRoot,"memory.gen");writeFileSync10(markerPath,String(Date.now()),"utf-8")}catch{}}assertCohortConfigFingerprint(){if(!this.cohortRoot)return;let configPath=path34.join(this.cohortRoot,"memory-cohort-config.json");if(!existsSync15(configPath))return;try{let storedFingerprint=JSON.parse(readFileSync15(configPath,"utf-8")).fingerprint;if(typeof storedFingerprint!=="string")return;let expectedFingerprint=computeMemoryCohortFingerprint(buildMemoryCohortFingerprintInput(this.config));if(storedFingerprint!==expectedFingerprint)throw Error(`memory cohort config fingerprint mismatch: cohort expects ${storedFingerprint}, this worktree computes ${expectedFingerprint}. Provider/embedding/redaction config differs across cohort members. Run \`/swarm memory unlink\` to recover local state, or align configs across linked worktrees.`)}catch(err){if(err instanceof Error&&err.message.includes("fingerprint mismatch"))throw err}}activeMemory(memoryId){let memory=this.memories.get(memoryId);if(!memory)throw new MemoryValidationError("target memory was not found");if(memory.metadata.deleted===!0)throw new MemoryValidationError("target memory is deleted");if(memory.supersededBy)throw new MemoryValidationError("target memory is superseded");return memory}validateDecisionMemory(record2){return validateMemoryRecordRules(record2,{rejectDurableSecrets:this.config.redaction.rejectDurableSecrets})}}function validateLoadedMemories(values,config2){let records=[],invalidCount=0;for(let value of values)try{records.push(validateMemoryRecordRules(value,{rejectDurableSecrets:config2.redaction.rejectDurableSecrets}))}catch{invalidCount++}return{records,invalidCount}}function validateLoadedProposals(values,config2){let records=[],invalidCount=0;for(let value of values)try{let proposal=validateMemoryProposal(value);if(proposal.proposedRecord)validateMemoryRecordRules(proposal.proposedRecord,{rejectDurableSecrets:config2.redaction.rejectDurableSecrets});records.push(proposal)}catch{invalidCount++}return{records,invalidCount}}async function readJsonl(filePath){if(!existsSync15(filePath))return[];let content=await readFile9(filePath,"utf-8"),records=[];for(let line of content.split(`
357
- `)){let trimmed=line.trim();if(!trimmed)continue;try{records.push(JSON.parse(trimmed))}catch{}}return records}async function readAuditEvents(filePath){let values=await readJsonl(filePath),events=[];for(let value of values){if(!value||typeof value!=="object")continue;let candidate=value;if(typeof candidate.id!=="string"||typeof candidate.operation!=="string"||typeof candidate.targetId!=="string"||typeof candidate.timestamp!=="string")continue;events.push(candidate)}return events}function parseRecallUsageEvent(event){let raw=event.eventJson??event.reason;if(typeof raw!=="string"&&(!raw||typeof raw!=="object"))return null;try{let parsed=typeof raw==="string"?JSON.parse(raw):raw;if(!Array.isArray(parsed.memoryIds)||typeof parsed.query!=="string")return null;return{bundleId:typeof parsed.bundleId==="string"?parsed.bundleId:event.targetId,query:parsed.query,scopes:Array.isArray(parsed.scopes)?parsed.scopes:[],kinds:Array.isArray(parsed.kinds)?parsed.kinds:void 0,memoryIds:parsed.memoryIds.filter((memoryId)=>typeof memoryId==="string"),scores:Array.isArray(parsed.scores)?parsed.scores.filter((score)=>typeof score==="number"&&Number.isFinite(score)):[],tokenEstimate:typeof parsed.tokenEstimate==="number"?parsed.tokenEstimate:0,agentRole:typeof parsed.agentRole==="string"?parsed.agentRole:void 0,runId:typeof parsed.runId==="string"?parsed.runId:void 0,unitId:typeof parsed.unitId==="string"?parsed.unitId:void 0,timestamp:typeof parsed.timestamp==="string"?parsed.timestamp:event.timestamp}}catch{return null}}function parseRewardEvent(value){if(!value||typeof value!=="object")return null;let candidate=value;if(typeof candidate.id!=="string"||typeof candidate.memoryId!=="string"||typeof candidate.verdict!=="string"||typeof candidate.reward!=="number"||typeof candidate.timestamp!=="string")return null;return{id:candidate.id,memoryId:candidate.memoryId,runId:typeof candidate.runId==="string"?candidate.runId:void 0,unitId:typeof candidate.unitId==="string"?candidate.unitId:void 0,verdict:candidate.verdict,reward:candidate.reward,qBefore:typeof candidate.qBefore==="number"?candidate.qBefore:void 0,qAfter:typeof candidate.qAfter==="number"?candidate.qAfter:void 0,verdictSynthesisJson:typeof candidate.verdictSynthesisJson==="string"?candidate.verdictSynthesisJson:void 0,timestamp:candidate.timestamp}}async function appendJsonl(filePath,value){await mkdir5(path34.dirname(filePath),{recursive:!0}),await appendFile2(filePath,`${JSON.stringify(value)}
364
+ ${query}`).digest("hex").slice(0,8);return`bundle_${compactTimestamp}_${hash3}`}function isExpired(record2,now=new Date){if(!record2.expiresAt)return!1;let expires=Date.parse(record2.expiresAt);return Number.isFinite(expires)&&expires<=now.getTime()}function hasEvidenceSource(record2){return Boolean(record2.source.url||record2.source.filePath||record2.source.commitSha||record2.source.ref)}function validateMemoryRecordRules(record2,options){let parsed=MemoryRecordSchema.parse(record2);if(parsed.text.includes(MEMORY_RECALL_SENTINEL))throw new MemoryValidationError("memory text cannot contain the recall sentinel header");let expectedHash=computeMemoryContentHash(parsed),expectedId=createMemoryId(parsed);if(parsed.contentHash!==expectedHash)throw new MemoryValidationError("contentHash does not match memory content");if(parsed.id!==expectedId)throw new MemoryValidationError("id does not match memory content");if(parsed.stability==="durable"&&(parsed.scope.type==="run"||parsed.scope.type==="agent"))throw new MemoryValidationError("durable memories cannot use run or agent scope");if(parsed.stability==="durable"&&(DURABLE_MEMORY_KINDS.has(parsed.kind)||parsed.kind==="api_finding"||parsed.kind==="evidence")&&!hasEvidenceSource(parsed))throw new MemoryValidationError("durable project, repository, API, evidence, and security memories require source evidence");if(EVIDENCE_REQUIRED_KINDS.has(parsed.kind)&&!hasEvidenceSource(parsed))throw new MemoryValidationError(`${parsed.kind} memories require source evidence`);if(parsed.kind==="scratch"&&(!parsed.expiresAt||Date.parse(parsed.expiresAt)-Date.parse(parsed.createdAt)>604800000))throw new MemoryValidationError("scratch memories must expire within 7 days");if(options.rejectDurableSecrets&&parsed.stability==="durable"&&containsSecret(parsed.text))throw new MemoryValidationError("durable memory contains a likely secret");return parsed}function validateMemoryProposal(proposal){return MemoryProposalSchema.parse(proposal)}function validateCuratorMemoryDecision(decision){return CuratorMemoryDecisionSchema.parse(decision)}var MemoryScopeTypeSchema,MemoryScopeRefSchema,MemoryKindSchema,MemorySourceSchema,MemoryRecordSchema,MemoryProposalSchema,NewMemoryRecordSchema,MemoryPatchSchema,ProposalIdSchema,MemoryIdSchema,CuratorDecisionReasonSchema,CuratorMemoryDecisionSchema;var init_schema2=__esm(()=>{init_zod();init_config2();init_errors4();init_redaction();MemoryScopeTypeSchema=exports_external.enum(["global_user","workspace","project","repository","run","agent","cohort"]),MemoryScopeRefSchema=exports_external.object({type:MemoryScopeTypeSchema,userId:exports_external.string().optional(),workspaceId:exports_external.string().optional(),projectId:exports_external.string().optional(),repoId:exports_external.string().optional(),repoRoot:exports_external.string().optional(),runId:exports_external.string().optional(),agentId:exports_external.string().optional(),cohortId:exports_external.string().optional()}).strict(),MemoryKindSchema=exports_external.enum(["user_preference","project_fact","architecture_decision","repo_convention","api_finding","code_pattern","test_pattern","failure_pattern","security_note","evidence","todo","scratch"]),MemorySourceSchema=exports_external.object({type:exports_external.enum(["user","agent","tool","file","repo","commit","test","web","manual"]),ref:exports_external.string().optional(),url:exports_external.string().optional(),filePath:exports_external.string().optional(),commitSha:exports_external.string().optional(),createdBy:exports_external.string().optional()}).strict(),MemoryRecordSchema=exports_external.object({id:exports_external.string().regex(/^mem_[a-f0-9]{16}$/),scope:MemoryScopeRefSchema,kind:MemoryKindSchema,text:exports_external.string().min(1).max(2000),tags:exports_external.array(exports_external.string().min(1).max(64)).max(32),confidence:exports_external.number().min(0).max(1),stability:exports_external.enum(["ephemeral","session","durable"]),source:MemorySourceSchema,createdAt:exports_external.string().datetime(),updatedAt:exports_external.string().datetime(),lastAccessedAt:exports_external.string().datetime().optional(),expiresAt:exports_external.string().datetime().optional(),qValue:exports_external.number().min(0).max(1).optional(),supersedes:exports_external.array(exports_external.string()).optional(),supersededBy:exports_external.string().optional(),contentHash:exports_external.string().regex(/^[a-f0-9]{64}$/),metadata:exports_external.record(exports_external.string(),exports_external.unknown()),cohortId:exports_external.string().optional(),producerSessionId:exports_external.string().optional(),producerAgentRole:exports_external.string().optional(),redactionPolicyVersion:exports_external.number().int().min(0).optional(),schemaVersion:exports_external.number().int().min(0).optional(),providerVersion:exports_external.string().optional(),sourceRevision:exports_external.string().optional()}).strict(),MemoryProposalSchema=exports_external.object({id:exports_external.string().regex(/^prop_[a-f0-9]{16}$/),operation:exports_external.enum(["add","update","delete","ignore","merge","supersede"]),proposedRecord:MemoryRecordSchema.optional(),targetMemoryId:exports_external.string().optional(),relatedMemoryIds:exports_external.array(exports_external.string()).optional(),proposedBy:exports_external.object({agentRole:exports_external.string().optional(),agentId:exports_external.string().optional(),runId:exports_external.string().optional()}).strict(),rationale:exports_external.string().min(1).max(2000),evidenceRefs:exports_external.array(exports_external.string().min(1).max(500)).max(20),status:exports_external.enum(["pending","approved","rejected","superseded","applied"]),reviewer:exports_external.enum(["user","controller","curator_agent","auto_policy"]).optional(),reviewedAt:exports_external.string().datetime().optional(),rejectionReason:exports_external.string().optional(),createdAt:exports_external.string().datetime(),metadata:exports_external.record(exports_external.string(),exports_external.unknown())}).strict(),NewMemoryRecordSchema=exports_external.object({scope:MemoryScopeRefSchema.optional(),kind:MemoryKindSchema,text:exports_external.string().min(1).max(2000),tags:exports_external.array(exports_external.string().min(1).max(64)).max(32).optional(),confidence:exports_external.number().min(0).max(1).optional(),stability:exports_external.enum(["ephemeral","session","durable"]).optional(),source:MemorySourceSchema.optional(),expiresAt:exports_external.string().datetime().optional(),metadata:exports_external.record(exports_external.string(),exports_external.unknown()).optional()}).strict(),MemoryPatchSchema=exports_external.object({scope:MemoryScopeRefSchema.optional(),kind:MemoryKindSchema.optional(),text:exports_external.string().min(1).max(2000).optional(),tags:exports_external.array(exports_external.string().min(1).max(64)).max(32).optional(),confidence:exports_external.number().min(0).max(1).optional(),stability:exports_external.enum(["ephemeral","session","durable"]).optional(),source:MemorySourceSchema.optional(),expiresAt:exports_external.string().datetime().optional(),metadata:exports_external.record(exports_external.string(),exports_external.unknown()).optional()}).strict().refine((patch)=>Object.keys(patch).length>0,{message:"memory patch must not be empty"}),ProposalIdSchema=exports_external.string().regex(/^prop_[a-f0-9]{16}$/),MemoryIdSchema=exports_external.string().regex(/^mem_[a-f0-9]{16}$/),CuratorDecisionReasonSchema=exports_external.string().min(1).max(2000),CuratorMemoryDecisionSchema=exports_external.discriminatedUnion("action",[exports_external.object({action:exports_external.literal("add"),proposalId:ProposalIdSchema,memory:NewMemoryRecordSchema}).strict(),exports_external.object({action:exports_external.literal("update"),proposalId:ProposalIdSchema,targetMemoryId:MemoryIdSchema,patch:MemoryPatchSchema,reason:CuratorDecisionReasonSchema}).strict(),exports_external.object({action:exports_external.literal("supersede"),proposalId:ProposalIdSchema,oldMemoryId:MemoryIdSchema,replacement:NewMemoryRecordSchema,reason:CuratorDecisionReasonSchema}).strict(),exports_external.object({action:exports_external.literal("reject"),proposalId:ProposalIdSchema,reason:CuratorDecisionReasonSchema}).strict(),exports_external.object({action:exports_external.literal("noop"),proposalId:ProposalIdSchema,reason:CuratorDecisionReasonSchema}).strict()])});function validateDecisionMatchesProposal(decision,proposal){if(decision.action==="add"&&proposal.operation!=="add"||decision.action==="update"&&proposal.operation!=="update"||decision.action==="supersede"&&proposal.operation!=="supersede")throw new MemoryValidationError(`curator ${decision.action} decision does not match ${proposal.operation} proposal`);if(decision.action==="update"&&proposal.targetMemoryId&&proposal.targetMemoryId!==decision.targetMemoryId)throw new MemoryValidationError("curator update decision target does not match proposal target");if(decision.action==="supersede"&&proposal.targetMemoryId&&proposal.targetMemoryId!==decision.oldMemoryId)throw new MemoryValidationError("curator supersede decision target does not match proposal target")}function validateCuratorPromotableMemory(record2){if(record2.stability!=="durable")throw new MemoryValidationError("curator memory promotions must be durable facts");if(!DURABLE_MEMORY_KINDS.has(record2.kind))throw new MemoryValidationError("curator memory promotions must use durable fact kinds; store raw docs, search results, and other bulky source material as evidence records instead");if(normalizeMemoryText(record2.text).length>CURATOR_PROMOTED_MEMORY_MAX_TEXT_LENGTH)throw new MemoryValidationError(`curator memory promotions must be concise durable facts under ${CURATOR_PROMOTED_MEMORY_MAX_TEXT_LENGTH} characters`)}function applyPatchToMemory(existing,patch,updatedAt){let base={scope:patch.scope??existing.scope,kind:patch.kind??existing.kind,text:patch.text===void 0?existing.text:normalizeMemoryText(patch.text)},tags=patch.tags===void 0?existing.tags:normalizeTags(patch.tags);return{...existing,...patch,...base,id:createMemoryId(base),tags,updatedAt,contentHash:computeMemoryContentHash(base),metadata:patch.metadata===void 0?existing.metadata:{...existing.metadata,...patch.metadata}}}function markProposalReviewed(proposal,decision,status,reviewedAt,ids){let reason=curatorDecisionReason(decision);return validateMemoryProposal({...proposal,status,reviewer:"curator_agent",reviewedAt,rejectionReason:decision.action==="reject"?reason:void 0,metadata:{...proposal.metadata,curatorDecision:{action:decision.action,reason,...ids,appliedAt:reviewedAt}}})}function curatorDecisionReason(decision){switch(decision.action){case"add":return;case"update":case"supersede":case"reject":case"noop":return decision.reason}}function buildCuratorDecisionEvent(change,proposal){return{...change,proposalOperation:proposal.operation}}function normalizeTags(tags){return Array.from(new Set(tags.map((tag)=>tag.toLowerCase().replace(/[^\w-]/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"")).filter(Boolean))).slice(0,32)}var CURATOR_PROMOTED_MEMORY_MAX_TEXT_LENGTH=500;var init_curator_decision_helpers=__esm(()=>{init_config2();init_errors4();init_schema2()});function clamp01(value){if(value<0)return 0;if(value>1)return 1;return value}function applyEmaUpdate(qOld,reward,eta){if(!Number.isFinite(qOld))return 0;if(!Number.isFinite(reward)||!Number.isFinite(eta))return clamp01(qOld);let next=(1-eta)*qOld+eta*reward;return clamp01(next)}function applyPropagatedEmaUpdate(qOld,reward,eta,fraction){if(!Number.isFinite(fraction)||fraction<=0)return applyEmaUpdate(qOld,reward,0);let cappedFraction=fraction>1?1:fraction;return applyEmaUpdate(qOld,reward,eta*cappedFraction)}function getQValue(record2,fallback=0.5){let raw=record2.metadata?.qValue;if(typeof raw==="number"&&Number.isFinite(raw)&&raw>=0&&raw<=1)return raw;return fallback}function setQValue(record2,value){return{...record2,metadata:{...record2.metadata,qValue:clamp01(Number.isFinite(value)?value:0)}}}function resolveMemoryRecallProfile(agentRole){let role=normalizeMemoryAgentRole(agentRole);return MEMORY_RECALL_PROFILES[role]??MEMORY_RECALL_PROFILES.coder}function normalizeMemoryAgentRole(agentRole){let base=stripKnownSwarmPrefix(agentRole??"architect");if(base==="reviewer"||base==="test_engineer")return"qa";if(base==="critic"||base==="critic_sounding_board"||base==="critic_drift_verifier"||base==="critic_hallucination_verifier"||base==="critic_architecture_supervisor")return"security";if(base==="curator_init"||base==="curator_phase"||base==="curator_postmortem")return"curator";if(base==="docs")return"sme";if(base==="architect"||base==="sme"||base==="coder"||base==="security"||base==="curator")return base;return"coder"}var MEMORY_RECALL_PROFILES;var init_role_profiles=__esm(()=>{init_schema();MEMORY_RECALL_PROFILES={architect:{kinds:["project_fact","architecture_decision","repo_convention","failure_pattern","security_note"],maxItems:10,tokenBudget:1600},sme:{kinds:["api_finding","code_pattern","repo_convention","failure_pattern","evidence"],maxItems:8,tokenBudget:1200},coder:{kinds:["architecture_decision","repo_convention","code_pattern","test_pattern","failure_pattern"],maxItems:8,tokenBudget:1200},qa:{kinds:["test_pattern","failure_pattern","repo_convention","security_note"],maxItems:8,tokenBudget:1200},security:{kinds:["security_note","architecture_decision","repo_convention","evidence"],maxItems:8,tokenBudget:1200},curator:{kinds:["project_fact","architecture_decision","repo_convention","api_finding","code_pattern","test_pattern","failure_pattern","security_note","evidence"],maxItems:20,tokenBudget:3000}}});function tokenize(text){return new Set(text.toLowerCase().replace(/[^\w\s-]/g," ").split(/\s+/).map((token)=>token.trim()).filter(Boolean))}function jaccard(a,b){if(a.size===0&&b.size===0)return 0;let intersection2=0;for(let token of a)if(b.has(token))intersection2++;let union2=a.size+b.size-intersection2;return union2===0?0:intersection2/union2}function clusterByJaccard(items,getText,threshold){let clusters=[];for(let item of items){let tokens=tokenize(getText(item)),placed=!1;for(let cluster of clusters)if(jaccard(tokens,cluster.tokens)>=threshold){cluster.members.push(item),placed=!0;break}if(!placed)clusters.push({tokens,members:[item]})}return clusters.map((cluster)=>cluster.members)}function importanceScore(input,weights){let recency=input.daysSinceLastRecall===null?0:Math.exp(-weights.lambda*Math.max(0,input.daysSinceLastRecall)),denom=Math.log1p(Math.max(1,weights.n)),frequency=denom===0?0:Math.log1p(Math.max(0,input.retrievalCount))/denom,freshness=Math.exp(-weights.mu*Math.max(0,input.daysSinceCreated)),confidence=Math.min(1,Math.max(0,input.confidence));return weights.wRecency*recency+weights.wFrequency*frequency+weights.wFreshness*freshness+weights.wConfidence*confidence}function normalizeKindText(kind){return kind.replace(/_/g," ")}function collectMetadataStrings(metadata,keys){let values=[];for(let key of keys){let value=metadata[key];if(typeof value==="string")values.push(value);if(Array.isArray(value)){for(let item of value)if(typeof item==="string")values.push(item)}}return values}function overlap(a,b){if(a.size===0||b.size===0)return 0;let hits=0;for(let token of a)if(b.has(token))hits++;return hits/Math.max(a.size,1)}function scopeSpecificityBoost(scope){switch(scope.type){case"agent":return 1;case"run":return 0.9;case"repository":return 0.8;case"cohort":return 0.75;case"project":return 0.65;case"workspace":return 0.45;case"global_user":return 0.3}}function kindProfileBoost(kind,request){if(!request.kinds||request.kinds.length===0)return 0.5;return request.kinds.includes(kind)?1:0}function roleProfileBoost(kind,context){return context.roleProfileKinds?.has(kind)?1:0}function sameScope(a,b){return stableScopeKey(a)===stableScopeKey(b)}function scopeAllowed(recordScope,allowedScopes){return allowedScopes.some((scope)=>sameScope(recordScope,scope))}function scoreMemoryRecordDetailed(record2,request,context,qLearningConfig=DEFAULT_QLEARNING_CONFIG){if(!request.includeExpired&&isExpired(record2))return{item:null,skipReason:"filtered"};if(record2.supersededBy)return{item:null,skipReason:"filtered"};if(record2.metadata.deleted===!0)return{item:null,skipReason:"filtered"};if(!scopeAllowed(record2.scope,request.scopes))return{item:null,skipReason:"filtered"};if(request.kinds&&!request.kinds.includes(record2.kind))return{item:null,skipReason:"filtered"};if(request.includeLowQ!==!0&&getQValue(record2,qLearningConfig.initialQValue)<qLearningConfig.suppressionThreshold)return{item:null,skipReason:"suppressed_low_q"};let queryTokens=request.mode==="injection"&&context.taskTokens?context.taskTokens:context.queryTokens,textTokens=tokenize(record2.text),tagTokens=tokenize(record2.tags.join(" ")),fileTokens=tokenize([record2.source.filePath,...collectMetadataStrings(record2.metadata,["file","filePath","files","touchedFiles"])].filter((value)=>typeof value==="string").join(" ")),symbolTokens=tokenize(collectMetadataStrings(record2.metadata,["symbol","symbols"]).join(" ")),kindTokens=tokenize(normalizeKindText(record2.kind)),sourceRefTokens=tokenize(record2.source.ref??""),taskSearchTokens=unionTokens(textTokens,tagTokens,fileTokens,symbolTokens,kindTokens,sourceRefTokens),taskTermOverlap=context.taskTokens?overlap(context.taskTokens,taskSearchTokens):0,kindQueryOverlap=overlap(queryTokens,kindTokens),textOverlap=overlap(queryTokens,textTokens),tagOverlap=overlap(queryTokens,tagTokens),fileOverlap=overlap(queryTokens,fileTokens),symbolOverlap=overlap(queryTokens,symbolTokens),kindMatch=request.kinds?.includes(record2.kind)??!1,scopeMatch=scopeAllowed(record2.scope,request.scopes),roleBoost=roleProfileBoost(record2.kind,context),hasQuerySignal=textOverlap>0||tagOverlap>0||fileOverlap>0||symbolOverlap>0||kindQueryOverlap>0;if(request.mode==="injection"&&request.requireQuerySignal!==!1&&!hasQuerySignal)return{item:null,skipReason:"no_signal"};let baseScore=textOverlap*SCORING_WEIGHTS.textOverlap+tagOverlap*SCORING_WEIGHTS.tagOverlap+fileOverlap*SCORING_WEIGHTS.fileOverlap+symbolOverlap*SCORING_WEIGHTS.symbolOverlap+taskTermOverlap*SCORING_WEIGHTS.taskTermOverlap+scopeSpecificityBoost(record2.scope)*SCORING_WEIGHTS.scopeSpecificityBoost+kindProfileBoost(record2.kind,request)*SCORING_WEIGHTS.kindProfileBoost+roleBoost*SCORING_WEIGHTS.roleBoost+record2.confidence*SCORING_WEIGHTS.confidence,qValue=getQValue(record2,NEUTRAL_Q_VALUE),qValueBoost=(qValue-NEUTRAL_Q_VALUE)*qLearningConfig.qValueBoostWeight,rankingScore=baseScore+qValueBoost,reasonParts=[textOverlap>0?`text_overlap=${textOverlap.toFixed(2)}`:null,tagOverlap>0?`tag_overlap=${tagOverlap.toFixed(2)}`:null,fileOverlap>0?`file_overlap=${fileOverlap.toFixed(2)}`:null,symbolOverlap>0?`symbol_overlap=${symbolOverlap.toFixed(2)}`:null,taskTermOverlap>0?`task_terms=${taskTermOverlap.toFixed(2)}`:null,kindQueryOverlap>0?`kind_query=${kindQueryOverlap.toFixed(2)}`:null,roleBoost>0?"role_profile":null,`scope=${record2.scope.type}`,`confidence=${record2.confidence.toFixed(2)}`,qValue!==NEUTRAL_Q_VALUE?`qvalue=${qValue.toFixed(2)}`:null].filter(Boolean);return{baseScore,item:{record:record2,score:rankingScore,reason:reasonParts.join(", "),signals:{textOverlap,tagOverlap,fileOverlap,symbolOverlap,kindMatch,scopeMatch}}}}function scoreMemoryRecordsWithDiagnostics(records,request,qLearningConfig=DEFAULT_QLEARNING_CONFIG,options){let minScore=request.minScore??0,context=createScoringContext(request),diagnostics={candidateCount:records.length,preScoredFilteredCount:0,scoredCount:0,returnedCount:0,noSignalCount:0,belowThresholdCount:0,suppressedLowQCount:0,exploredCount:0},items=[],suppressedRecords=[];for(let record2 of records){let result=scoreMemoryRecordDetailed(record2,request,context,qLearningConfig);if(!result.item){if(result.skipReason==="filtered")diagnostics.preScoredFilteredCount++;if(result.skipReason==="no_signal")diagnostics.noSignalCount++;if(result.skipReason==="suppressed_low_q")diagnostics.suppressedLowQCount++,suppressedRecords.push(record2);continue}if(diagnostics.scoredCount++,(result.baseScore??result.item.score)<minScore){diagnostics.belowThresholdCount++;continue}items.push(result.item)}if(request.includeLowQ!==!0&&suppressedRecords.length>0&&qLearningConfig.explorationRate>0){if((options?.random??Math.random)()<qLearningConfig.explorationRate){let exploreRequest={...request,includeLowQ:!0},best=null;for(let record2 of suppressedRecords){let rescored=scoreMemoryRecordDetailed(record2,exploreRequest,context,qLearningConfig);if(!rescored.item)continue;let baseScore=rescored.baseScore??rescored.item.score;if(baseScore<minScore)continue;if(!best||baseScore>best.baseScore||baseScore===best.baseScore&&record2.id.localeCompare(best.item.record.id)<0)best={item:rescored.item,baseScore}}if(best)items.push({...best.item,explored:!0}),diagnostics.exploredCount=1}}return items.sort((a,b)=>b.score-a.score||a.record.id.localeCompare(b.record.id)),diagnostics.returnedCount=items.length,{items,diagnostics}}function sliceRecallItemsWithExploration(items,maxItems){let normal=items.filter((item)=>!item.explored),explored=items.filter((item)=>item.explored);return[...normal.slice(0,maxItems),...explored]}function createScoringContext(request){return{taskTokens:request.task?tokenize(request.task):void 0,queryTokens:tokenize(request.query),roleProfileKinds:request.agentRole?new Set(resolveMemoryRecallProfile(request.agentRole).kinds):void 0}}function unionTokens(...sets){let union2=new Set;for(let set2 of sets)for(let token of set2)union2.add(token);return union2}var NEUTRAL_Q_VALUE=0.5,SCORING_WEIGHTS;var init_scoring=__esm(()=>{init_config2();init_role_profiles();init_schema2();SCORING_WEIGHTS={textOverlap:0.38,tagOverlap:0.16,fileOverlap:0.12,symbolOverlap:0.08,taskTermOverlap:0.08,scopeSpecificityBoost:0.12,kindProfileBoost:0.06,roleBoost:0.05,confidence:0.08}});async function buildMemoryMaintenanceReport(provider,options={}){let now=options.now??new Date,limit=Math.max(1,Math.trunc(options.limit??20)),memories=await provider.list({includeExpired:!0,includeInactive:!0}),proposals=await loadMaintenanceProposals(provider,limit),recallUsage=provider.listRecallUsage?await provider.listRecallUsage():[],usageByMemory=summarizeRecallByMemory(recallUsage),usageByRole=summarizeRecallByRole(recallUsage),activeMemories=memories.filter((memory)=>isActiveMemory(memory,now)),deletedMemories=memories.filter((memory)=>memory.metadata.deleted===!0),expiredScratchMemories=memories.filter((memory)=>memory.kind==="scratch"&&isExpired(memory,now)),supersededMemories=memories.filter((memory)=>Boolean(memory.supersededBy)),lowUtilityMemories=activeMemories.filter((memory)=>isLowUtility(memory,usageByMemory,now,{weights:options.importanceWeights??DEFAULT_IMPORTANCE_WEIGHTS,threshold:options.importanceThreshold??DEFAULT_IMPORTANCE_THRESHOLD})).sort(memorySort),neverRecalledMemories=activeMemories.filter((memory)=>!usageByMemory.has(memory.id)).sort(memorySort),qLearning=options.qLearning??DEFAULT_QLEARNING_CONFIG,lowQValueMemories=activeMemories.filter((memory)=>getQValue(memory,qLearning.initialQValue)<qLearning.suppressionThreshold).sort(memorySort),promotionCandidates=activeMemories.filter((memory)=>getQValue(memory,qLearning.initialQValue)>qLearning.promotionThreshold&&(usageByMemory.get(memory.id)?.count??0)>qLearning.promotionMinRetrievals).sort(memorySort),rejectedProposalReasons=proposals.filter((proposal)=>proposal.status==="rejected").sort(proposalSort),pendingProposals=proposals.filter((proposal)=>proposal.status==="pending").sort(proposalSort);return{generatedAt:now.toISOString(),totalMemories:memories.length,activeMemories:activeMemories.length,deletedMemories:deletedMemories.slice(0,limit),expiredScratchMemories:expiredScratchMemories.slice(0,limit),supersededMemories:supersededMemories.slice(0,limit),supersededChains:buildSupersededChains(memories).slice(0,limit),lowUtilityMemories:lowUtilityMemories.slice(0,limit),lowQValueMemories:lowQValueMemories.slice(0,limit),promotionCandidates:promotionCandidates.slice(0,limit),neverRecalledMemories:neverRecalledMemories.slice(0,limit),mostRecalledMemories:Array.from(usageByMemory.values()).sort((a,b)=>b.count-a.count||b.lastRecalledAt.localeCompare(a.lastRecalledAt)||a.memoryId.localeCompare(b.memoryId)).slice(0,limit),recallByAgentRole:Array.from(usageByRole.values()).sort((a,b)=>b.count-a.count||a.agentRole.localeCompare(b.agentRole)).slice(0,limit),rejectedProposalReasons:rejectedProposalReasons.slice(0,limit),pendingProposals:pendingProposals.slice(0,limit),recallEventCount:recallUsage.length}}function shouldCompactMemory(memory,now=new Date){if(memory.metadata.deleted===!0)return"deleted";if(memory.supersededBy)return"superseded";if(memory.kind==="scratch"&&isExpired(memory,now))return"expired_scratch";return null}function isActiveMemory(memory,now){return memory.metadata.deleted!==!0&&!memory.supersededBy&&!isExpired(memory,now)}function isLowUtility(memory,usageByMemory,now,options){if(usageByMemory.has(memory.id))return!1;let created=Date.parse(memory.createdAt),daysSinceCreated=Number.isFinite(created)?Math.max(0,(now.getTime()-created)/MS_PER_DAY):0;return importanceScore({confidence:memory.confidence,retrievalCount:0,daysSinceLastRecall:null,daysSinceCreated},options.weights)<options.threshold}function summarizeRecallByMemory(usageEvents){let byMemory=new Map;for(let event of usageEvents)event.memoryIds.forEach((memoryId,index)=>{let role=event.agentRole??"unknown",existing=byMemory.get(memoryId)??{memoryId,count:0,lastRecalledAt:event.timestamp,agentRoles:{},averageScore:0,scoreTotal:0,scoreCount:0};existing.count++,existing.lastRecalledAt=event.timestamp>existing.lastRecalledAt?event.timestamp:existing.lastRecalledAt,existing.agentRoles[role]=(existing.agentRoles[role]??0)+1;let score=event.scores[index];if(typeof score==="number"&&Number.isFinite(score))existing.scoreTotal+=score,existing.scoreCount++,existing.averageScore=existing.scoreTotal/existing.scoreCount;byMemory.set(memoryId,existing)});return new Map(Array.from(byMemory,([memoryId,value])=>[memoryId,{memoryId,count:value.count,lastRecalledAt:value.lastRecalledAt,agentRoles:value.agentRoles,averageScore:value.averageScore}]))}async function loadMaintenanceProposals(provider,limit){if(!provider.listProposals)return[];let[pending,rejected,recent]=await Promise.all([provider.listProposals({status:"pending",limit}),provider.listProposals({status:"rejected",limit}),provider.listProposals({limit:Math.max(limit*4,100)})]),byId=new Map;for(let proposal of[...pending,...rejected,...recent])byId.set(proposal.id,proposal);return Array.from(byId.values())}function summarizeRecallByRole(usageEvents){let byRole=new Map;for(let event of usageEvents){let role=event.agentRole??"unknown",existing=byRole.get(role)??{agentRole:role,count:0,memoryIds:{}};existing.count++;for(let memoryId of event.memoryIds)existing.memoryIds[memoryId]=(existing.memoryIds[memoryId]??0)+1;byRole.set(role,existing)}return byRole}function buildSupersededChains(memories){let byId=new Map(memories.map((memory)=>[memory.id,memory])),supersededIds=new Set(memories.filter((memory)=>memory.supersededBy).map((memory)=>memory.id));return memories.filter((memory)=>memory.supersededBy&&!(memory.supersedes??[]).some((id)=>supersededIds.has(id))).map((root)=>{let chain=[root.id],seen=new Set(chain),cursor=root;while(cursor?.supersededBy&&!seen.has(cursor.supersededBy))chain.push(cursor.supersededBy),seen.add(cursor.supersededBy),cursor=byId.get(cursor.supersededBy);return{rootId:root.id,chain,reason:typeof root.metadata.supersedeReason==="string"?root.metadata.supersedeReason:void 0}})}function memorySort(a,b){return b.updatedAt.localeCompare(a.updatedAt)||a.id.localeCompare(b.id)}function proposalSort(a,b){let aTime=a.reviewedAt??a.createdAt;return(b.reviewedAt??b.createdAt).localeCompare(aTime)||a.id.localeCompare(b.id)}var DEFAULT_IMPORTANCE_WEIGHTS,DEFAULT_IMPORTANCE_THRESHOLD=0.2,MS_PER_DAY=86400000;var init_maintenance=__esm(()=>{init_config2();init_schema2();init_scoring();DEFAULT_IMPORTANCE_WEIGHTS={wRecency:0.2,wFrequency:0.2,wFreshness:0.15,wConfidence:0.25,lambda:0.05,mu:0.01,n:50}});import{randomUUID as randomUUID4}from"node:crypto";import{existsSync as existsSync15,readFileSync as readFileSync15,writeFileSync as writeFileSync10}from"node:fs";import{appendFile as appendFile3,mkdir as mkdir5,readFile as readFile9,rename as rename6,writeFile as writeFile5}from"node:fs/promises";import*as path34 from"node:path";class LocalJsonlMemoryProvider{name="local-jsonl";rootDirectory;cohortRoot;config;initialized=!1;memories=new Map;proposals=new Map;constructor(rootDirectory,config2={},vettedCohortRoot){this.rootDirectory=rootDirectory,this.cohortRoot=vettedCohortRoot??null,this.config={...DEFAULT_MEMORY_CONFIG,...config2}}pathFor(file2){let filename=file2==="memories"?"memories.jsonl":file2==="proposals"?"proposals.jsonl":file2==="audit"?"audit.jsonl":"reward-events.jsonl";if(this.cohortRoot)return path34.join(this.cohortRoot,filename);let storageDir=this.config.storageDir.replace(/^\.swarm[/\\]?/,"");return validateSwarmPath(this.rootDirectory,path34.join(storageDir,filename))}async initialize(){if(this.initialized)return;if(this.cohortRoot)this.assertCohortConfigFingerprint();let memoryPath=this.pathFor("memories"),proposalPath=this.pathFor("proposals"),memoryLoad=validateLoadedMemories(await readJsonl(memoryPath),this.config),proposalLoad=validateLoadedProposals(await readJsonl(proposalPath),this.config);if(this.memories=new Map(memoryLoad.records.map((record2)=>[record2.id,record2])),this.proposals=new Map(proposalLoad.records.map((proposal)=>[proposal.id,proposal])),this.initialized=!0,memoryLoad.invalidCount>0)await this.audit("invalid_load","memories",`${memoryLoad.invalidCount} invalid memory JSONL row(s) skipped`);if(proposalLoad.invalidCount>0)await this.audit("invalid_load","proposals",`${proposalLoad.invalidCount} invalid proposal JSONL row(s) skipped`)}async upsert(record2){await this.initialize();let existing=this.memories.get(record2.id);if(existing?.metadata.deleted===!0)throw new MemoryValidationError("memory is tombstoned and cannot be upserted");let next=validateMemoryRecordRules({...record2,createdAt:existing?.createdAt??record2.createdAt},{rejectDurableSecrets:this.config.redaction.rejectDurableSecrets});return this.memories.set(next.id,next),await appendJsonl(this.pathFor("memories"),next),await this.audit("upsert",next.id),this.bumpCohortGeneration(),next}async get(id){return await this.initialize(),this.memories.get(id)??null}async delete(id,reason){await this.initialize();let existing=this.memories.get(id);if(!existing)return;if(this.config.hardDelete)this.memories.delete(id),await this.compact();else{let tombstone={...existing,updatedAt:new Date().toISOString(),metadata:{...existing.metadata,deleted:!0,deleteReason:reason}};this.memories.set(id,tombstone),await appendJsonl(this.pathFor("memories"),tombstone)}await this.audit("delete",id,reason),this.bumpCohortGeneration()}async recall(request){return(await this.recallWithDiagnostics(request)).items}async recallWithDiagnostics(request){await this.initialize();let records=await this.list({scopes:request.scopes,kinds:request.kinds,includeExpired:request.includeExpired}),result=scoreMemoryRecordsWithDiagnostics(records,request,this.config.qLearning),sliced=sliceRecallItemsWithExploration(result.items,request.maxItems);return{items:sliced,diagnostics:{...result.diagnostics,exploredCount:sliced.some((item)=>item.explored)?1:0,returnedCount:sliced.length}}}async recordRecallUsage(event){await this.initialize(),await this.audit("recall",event.bundleId,void 0,event)}async listRecallUsage(filter={}){await this.initialize();let events=await readAuditEvents(this.pathFor("audit")),usage=[];for(let event of events){if(event.operation!=="recall")continue;let parsed=parseRecallUsageEvent(event);if(parsed)usage.push(parsed)}if(usage.sort((a,b)=>b.timestamp.localeCompare(a.timestamp)),typeof filter.runId==="string"&&filter.runId.length>0)usage=usage.filter((event)=>event.runId===filter.runId);if(typeof filter.unitId==="string"&&filter.unitId.length>0)usage=usage.filter((event)=>event.unitId===filter.unitId);return usage.slice(0,filter.limit??usage.length)}async appendRewardEvent(event){await this.initialize();let record2={...event,id:randomUUID4()};await appendJsonl(this.pathFor("reward-events"),record2),this.bumpCohortGeneration()}async listRewardEvents(filter={}){await this.initialize();let values=await readJsonl(this.pathFor("reward-events")),events=[];for(let value of values){let parsed=parseRewardEvent(value);if(parsed)events.push(parsed)}if(typeof filter.memoryId==="string"&&filter.memoryId.length>0)events=events.filter((event)=>event.memoryId===filter.memoryId);return events.sort((a,b)=>b.timestamp.localeCompare(a.timestamp)),events.slice(0,filter.limit??events.length)}async list(filter={}){await this.initialize();let records=Array.from(this.memories.values());if(filter.scopes&&filter.scopes.length>0)records=records.filter((record2)=>scopeAllowed(record2.scope,filter.scopes??[]));if(filter.kinds&&filter.kinds.length>0)records=records.filter((record2)=>filter.kinds?.includes(record2.kind));if(!filter.includeExpired){let now=Date.now();records=records.filter((record2)=>{if(!record2.expiresAt)return!0;let expires=Date.parse(record2.expiresAt);return!Number.isFinite(expires)||expires>now})}if(!filter.includeInactive)records=records.filter((record2)=>!record2.supersededBy&&record2.metadata.deleted!==!0);return records.sort((a,b)=>b.updatedAt.localeCompare(a.updatedAt)),records.slice(0,filter.limit??records.length)}async createProposal(proposal){await this.initialize();let next=validateMemoryProposal(proposal);return this.proposals.set(next.id,next),await appendJsonl(this.pathFor("proposals"),next),await this.audit("proposal",next.id),this.bumpCohortGeneration(),next}async listProposals(filter={}){await this.initialize();let proposals=Array.from(this.proposals.values());if(filter.status)proposals=proposals.filter((proposal)=>proposal.status===filter.status);return proposals.sort((a,b)=>b.createdAt.localeCompare(a.createdAt)),proposals.slice(0,filter.limit??proposals.length)}async applyCuratorDecision(decision){await this.initialize();let appliedAt=new Date().toISOString(),proposal=this.proposals.get(decision.proposalId);if(!proposal)throw new MemoryValidationError("memory proposal was not found");if(proposal.status!=="pending")throw new MemoryValidationError("memory proposal is not pending");validateDecisionMatchesProposal(decision,proposal);let memoryId,targetMemoryId,oldMemoryId,replacementMemoryId;if(decision.action==="add"){let memory=this.validateDecisionMemory({...decision.memory,updatedAt:appliedAt});validateCuratorPromotableMemory(memory),this.memories.set(memory.id,memory),await appendJsonl(this.pathFor("memories"),memory),memoryId=memory.id}else if(decision.action==="update"){let existing=this.activeMemory(decision.targetMemoryId),updated=this.validateDecisionMemory(applyPatchToMemory(existing,decision.patch,appliedAt));if(validateCuratorPromotableMemory(updated),updated.id!==existing.id){let tombstone=this.validateDecisionMemory({...existing,updatedAt:appliedAt,metadata:{...existing.metadata,deleted:!0,deleteReason:decision.reason,updateReplacementId:updated.id}});this.memories.set(tombstone.id,tombstone),await appendJsonl(this.pathFor("memories"),tombstone)}this.memories.set(updated.id,updated),await appendJsonl(this.pathFor("memories"),updated),memoryId=updated.id,targetMemoryId=existing.id}else if(decision.action==="supersede"){let oldMemory=this.activeMemory(decision.oldMemoryId),replacement=this.validateDecisionMemory({...decision.replacement,updatedAt:appliedAt,supersedes:Array.from(new Set([...decision.replacement.supersedes??[],oldMemory.id]))});validateCuratorPromotableMemory(replacement);let superseded=this.validateDecisionMemory({...oldMemory,updatedAt:appliedAt,supersededBy:replacement.id,metadata:{...oldMemory.metadata,supersedeReason:decision.reason}});this.memories.set(superseded.id,superseded),this.memories.set(replacement.id,replacement),await appendJsonl(this.pathFor("memories"),superseded),await appendJsonl(this.pathFor("memories"),replacement),oldMemoryId=oldMemory.id,replacementMemoryId=replacement.id,memoryId=replacement.id}let proposalStatus=decision.action==="reject"?"rejected":"applied",reviewedProposal=markProposalReviewed(proposal,decision,proposalStatus,appliedAt,{memoryId,targetMemoryId,oldMemoryId,replacementMemoryId});this.proposals.set(reviewedProposal.id,reviewedProposal),await appendJsonl(this.pathFor("proposals"),reviewedProposal);let change={action:decision.action,proposalId:decision.proposalId,proposalStatus,appliedAt,memoryId,targetMemoryId,oldMemoryId,replacementMemoryId,reason:curatorDecisionReason(decision)};return await this.audit("curator_decision",decision.proposalId,change.reason,buildCuratorDecisionEvent(change,proposal)),this.bumpCohortGeneration(),change}async compact(){await this.initialize(),await writeJsonlAtomic(this.pathFor("memories"),Array.from(this.memories.values())),await this.audit("compact","memories"),this.bumpCohortGeneration()}async compactMaintenance(options={}){await this.initialize();let now=options.now?new Date(options.now):new Date,kept=[],result={dryRun:options.dryRun!==!1,removedDeleted:0,removedSuperseded:0,removedExpiredScratch:0,remaining:0};for(let memory of this.memories.values()){let compactReason=shouldCompactMemory(memory,now);if(compactReason==="deleted"){result.removedDeleted++;continue}if(compactReason==="superseded"){result.removedSuperseded++;continue}if(compactReason==="expired_scratch"){result.removedExpiredScratch++;continue}kept.push(memory)}if(result.remaining=kept.length,result.dryRun)return result;return this.memories=new Map(kept.map((memory)=>[memory.id,memory])),await writeJsonlAtomic(this.pathFor("memories"),kept),await this.audit("compact","memories","removed deleted, superseded, and expired scratch memories",result),this.bumpCohortGeneration(),result}async audit(operation,targetId,reason,eventJson){let event={id:randomUUID4(),operation,targetId,reason,eventJson,timestamp:new Date().toISOString()};await appendJsonl(this.pathFor("audit"),event)}bumpCohortGeneration(){if(!this.cohortRoot)return;try{let markerPath=path34.join(this.cohortRoot,"memory.gen");writeFileSync10(markerPath,String(Date.now()),"utf-8")}catch{}}assertCohortConfigFingerprint(){if(!this.cohortRoot)return;let configPath=path34.join(this.cohortRoot,"memory-cohort-config.json");if(!existsSync15(configPath))return;try{let storedFingerprint=JSON.parse(readFileSync15(configPath,"utf-8")).fingerprint;if(typeof storedFingerprint!=="string")return;let expectedFingerprint=computeMemoryCohortFingerprint(buildMemoryCohortFingerprintInput(this.config));if(storedFingerprint!==expectedFingerprint)throw Error(`memory cohort config fingerprint mismatch: cohort expects ${storedFingerprint}, this worktree computes ${expectedFingerprint}. Provider/embedding/redaction config differs across cohort members. Run \`/swarm memory unlink\` to recover local state, or align configs across linked worktrees.`)}catch(err){if(err instanceof Error&&err.message.includes("fingerprint mismatch"))throw err}}activeMemory(memoryId){let memory=this.memories.get(memoryId);if(!memory)throw new MemoryValidationError("target memory was not found");if(memory.metadata.deleted===!0)throw new MemoryValidationError("target memory is deleted");if(memory.supersededBy)throw new MemoryValidationError("target memory is superseded");return memory}validateDecisionMemory(record2){return validateMemoryRecordRules(record2,{rejectDurableSecrets:this.config.redaction.rejectDurableSecrets})}}function validateLoadedMemories(values,config2){let records=[],invalidCount=0;for(let value of values)try{records.push(validateMemoryRecordRules(value,{rejectDurableSecrets:config2.redaction.rejectDurableSecrets}))}catch{invalidCount++}return{records,invalidCount}}function validateLoadedProposals(values,config2){let records=[],invalidCount=0;for(let value of values)try{let proposal=validateMemoryProposal(value);if(proposal.proposedRecord)validateMemoryRecordRules(proposal.proposedRecord,{rejectDurableSecrets:config2.redaction.rejectDurableSecrets});records.push(proposal)}catch{invalidCount++}return{records,invalidCount}}async function readJsonl(filePath){if(!existsSync15(filePath))return[];let content=await readFile9(filePath,"utf-8"),records=[];for(let line of content.split(`
365
+ `)){let trimmed=line.trim();if(!trimmed)continue;try{records.push(JSON.parse(trimmed))}catch{}}return records}async function readAuditEvents(filePath){let values=await readJsonl(filePath),events=[];for(let value of values){if(!value||typeof value!=="object")continue;let candidate=value;if(typeof candidate.id!=="string"||typeof candidate.operation!=="string"||typeof candidate.targetId!=="string"||typeof candidate.timestamp!=="string")continue;events.push(candidate)}return events}function parseRecallUsageEvent(event){let raw=event.eventJson??event.reason;if(typeof raw!=="string"&&(!raw||typeof raw!=="object"))return null;try{let parsed=typeof raw==="string"?JSON.parse(raw):raw;if(!Array.isArray(parsed.memoryIds)||typeof parsed.query!=="string")return null;return{bundleId:typeof parsed.bundleId==="string"?parsed.bundleId:event.targetId,query:parsed.query,scopes:Array.isArray(parsed.scopes)?parsed.scopes:[],kinds:Array.isArray(parsed.kinds)?parsed.kinds:void 0,memoryIds:parsed.memoryIds.filter((memoryId)=>typeof memoryId==="string"),scores:Array.isArray(parsed.scores)?parsed.scores.filter((score)=>typeof score==="number"&&Number.isFinite(score)):[],tokenEstimate:typeof parsed.tokenEstimate==="number"?parsed.tokenEstimate:0,agentRole:typeof parsed.agentRole==="string"?parsed.agentRole:void 0,runId:typeof parsed.runId==="string"?parsed.runId:void 0,unitId:typeof parsed.unitId==="string"?parsed.unitId:void 0,timestamp:typeof parsed.timestamp==="string"?parsed.timestamp:event.timestamp}}catch{return null}}function parseRewardEvent(value){if(!value||typeof value!=="object")return null;let candidate=value;if(typeof candidate.id!=="string"||typeof candidate.memoryId!=="string"||typeof candidate.verdict!=="string"||typeof candidate.reward!=="number"||typeof candidate.timestamp!=="string")return null;return{id:candidate.id,memoryId:candidate.memoryId,runId:typeof candidate.runId==="string"?candidate.runId:void 0,unitId:typeof candidate.unitId==="string"?candidate.unitId:void 0,verdict:candidate.verdict,reward:candidate.reward,qBefore:typeof candidate.qBefore==="number"?candidate.qBefore:void 0,qAfter:typeof candidate.qAfter==="number"?candidate.qAfter:void 0,verdictSynthesisJson:typeof candidate.verdictSynthesisJson==="string"?candidate.verdictSynthesisJson:void 0,timestamp:candidate.timestamp}}async function appendJsonl(filePath,value){await mkdir5(path34.dirname(filePath),{recursive:!0}),await appendFile3(filePath,`${JSON.stringify(value)}
358
366
  `,"utf-8")}async function writeJsonlAtomic(filePath,values){await mkdir5(path34.dirname(filePath),{recursive:!0});let tmp=`${filePath}.tmp.${randomUUID4()}`,content=values.map((value)=>JSON.stringify(value)).join(`
359
367
  `)+(values.length>0?`
360
368
  `:"");await writeFile5(tmp,content,"utf-8"),await rename6(tmp,filePath)}var init_local_jsonl_provider=__esm(()=>{init_utils2();init_config2();init_curator_decision_helpers();init_errors4();init_maintenance();init_redaction();init_schema2();init_scoring()});function sourceText(item){let source=item.record.source;if(source.filePath)return`${source.type} ${source.filePath}`;if(source.url)return`${source.type} ${source.url}`;if(source.commitSha)return`${source.type} ${source.commitSha}`;if(source.ref)return`${source.type} ${source.ref}`;return source.type}function formatItem(item,generatedAt){let record2=item.record,age=ageText(record2.updatedAt||record2.createdAt,generatedAt);return[`- [${record2.id}] kind=${record2.kind} scope=${record2.scope.type} confidence=${record2.confidence.toFixed(2)} age=${age} score=${item.score.toFixed(2)}`,` ${redactSecrets(record2.text)}`,` Source: ${sourceText(item)}`].join(`
@@ -728,11 +736,11 @@ ${warnings.map((w)=>`Detected signal: ${w}`).join(`
728
736
 
729
737
  Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.`)}for(let entry of this.seen.entries()){let seen=entry[1];if(schema===entry[0]){extractToDef(entry);continue}if(params.external){let ext=params.external.registry.get(entry[0])?.id;if(schema!==entry[0]&&ext){extractToDef(entry);continue}}if(this.metadataRegistry.get(entry[0])?.id){extractToDef(entry);continue}if(seen.cycle){extractToDef(entry);continue}if(seen.count>1){if(params.reused==="ref"){extractToDef(entry);continue}}}let flattenRef=(zodSchema,params2)=>{let seen=this.seen.get(zodSchema),schema2=seen.def??seen.schema,_cached2={...schema2};if(seen.ref===null)return;let ref=seen.ref;if(seen.ref=null,ref){flattenRef(ref,params2);let refSchema=this.seen.get(ref).schema;if(refSchema.$ref&&(params2.target==="draft-7"||params2.target==="draft-4"||params2.target==="openapi-3.0"))schema2.allOf=schema2.allOf??[],schema2.allOf.push(refSchema);else Object.assign(schema2,refSchema),Object.assign(schema2,_cached2)}if(!seen.isParent)this.override({zodSchema,jsonSchema:schema2,path:seen.path??[]})};for(let entry of[...this.seen.entries()].reverse())flattenRef(entry[0],{target:this.target});let result={};if(this.target==="draft-2020-12")result.$schema="https://json-schema.org/draft/2020-12/schema";else if(this.target==="draft-7")result.$schema="http://json-schema.org/draft-07/schema#";else if(this.target==="draft-4")result.$schema="http://json-schema.org/draft-04/schema#";else if(this.target==="openapi-3.0");else console.warn(`Invalid target: ${this.target}`);if(params.external?.uri){let id=params.external.registry.get(schema)?.id;if(!id)throw Error("Schema is missing an `id` property");result.$id=params.external.uri(id)}Object.assign(result,root.def);let defs=params.external?.defs??{};for(let entry of this.seen.entries()){let seen=entry[1];if(seen.def&&seen.defId)defs[seen.defId]=seen.def}if(params.external);else if(Object.keys(defs).length>0)if(this.target==="draft-2020-12")result.$defs=defs;else result.definitions=defs;try{return JSON.parse(JSON.stringify(result))}catch(_err){throw Error("Error converting schema to JSON.")}}}function toJSONSchema2(input,_params){if(input instanceof $ZodRegistry2){let gen2=new JSONSchemaGenerator2(_params),defs={};for(let entry of input._idmap.entries()){let[_,schema]=entry;gen2.process(schema)}let schemas3={},external2={registry:input,uri:_params?.uri,defs};for(let entry of input._idmap.entries()){let[key,schema]=entry;schemas3[key]=gen2.emit(schema,{..._params,external:external2})}if(Object.keys(defs).length>0){let defsSegment=gen2.target==="draft-2020-12"?"$defs":"definitions";schemas3.__shared={[defsSegment]:defs}}return{schemas:schemas3}}let gen=new JSONSchemaGenerator2(_params);return gen.process(input),gen.emit(input,_params)}function isTransforming2(_schema,_ctx){let ctx=_ctx??{seen:new Set};if(ctx.seen.has(_schema))return!1;ctx.seen.add(_schema);let def=_schema._zod.def;switch(def.type){case"string":case"number":case"bigint":case"boolean":case"date":case"symbol":case"undefined":case"null":case"any":case"unknown":case"never":case"void":case"literal":case"enum":case"nan":case"file":case"template_literal":return!1;case"array":return isTransforming2(def.element,ctx);case"object":{for(let key in def.shape)if(isTransforming2(def.shape[key],ctx))return!0;return!1}case"union":{for(let option of def.options)if(isTransforming2(option,ctx))return!0;return!1}case"intersection":return isTransforming2(def.left,ctx)||isTransforming2(def.right,ctx);case"tuple":{for(let item of def.items)if(isTransforming2(item,ctx))return!0;if(def.rest&&isTransforming2(def.rest,ctx))return!0;return!1}case"record":return isTransforming2(def.keyType,ctx)||isTransforming2(def.valueType,ctx);case"map":return isTransforming2(def.keyType,ctx)||isTransforming2(def.valueType,ctx);case"set":return isTransforming2(def.valueType,ctx);case"promise":case"optional":case"nonoptional":case"nullable":case"readonly":return isTransforming2(def.innerType,ctx);case"lazy":return isTransforming2(def.getter(),ctx);case"default":return isTransforming2(def.innerType,ctx);case"prefault":return isTransforming2(def.innerType,ctx);case"custom":return!1;case"transform":return!0;case"pipe":return isTransforming2(def.in,ctx)||isTransforming2(def.out,ctx);case"success":return!1;case"catch":return!1;case"function":return!1;default:}throw Error(`Unknown schema type: ${def.type}`)}var init_to_json_schema2=__esm(()=>{init_registries2();init_util2()});var exports_json_schema2={};var init_json_schema2=()=>{};var exports_core5={};__export(exports_core5,{version:()=>version2,util:()=>exports_util2,treeifyError:()=>treeifyError2,toJSONSchema:()=>toJSONSchema2,toDotPath:()=>toDotPath2,safeParseAsync:()=>safeParseAsync3,safeParse:()=>safeParse3,safeEncodeAsync:()=>safeEncodeAsync3,safeEncode:()=>safeEncode3,safeDecodeAsync:()=>safeDecodeAsync3,safeDecode:()=>safeDecode3,registry:()=>registry2,regexes:()=>exports_regexes2,prettifyError:()=>prettifyError2,parseAsync:()=>parseAsync3,parse:()=>parse6,locales:()=>exports_locales2,isValidJWT:()=>isValidJWT2,isValidBase64URL:()=>isValidBase64URL2,isValidBase64:()=>isValidBase642,globalRegistry:()=>globalRegistry2,globalConfig:()=>globalConfig2,formatError:()=>formatError2,flattenError:()=>flattenError2,encodeAsync:()=>encodeAsync3,encode:()=>encode3,decodeAsync:()=>decodeAsync3,decode:()=>decode3,config:()=>config2,clone:()=>clone2,_xid:()=>_xid2,_void:()=>_void3,_uuidv7:()=>_uuidv72,_uuidv6:()=>_uuidv62,_uuidv4:()=>_uuidv42,_uuid:()=>_uuid2,_url:()=>_url2,_uppercase:()=>_uppercase2,_unknown:()=>_unknown2,_union:()=>_union2,_undefined:()=>_undefined5,_ulid:()=>_ulid2,_uint64:()=>_uint642,_uint32:()=>_uint322,_tuple:()=>_tuple2,_trim:()=>_trim2,_transform:()=>_transform2,_toUpperCase:()=>_toUpperCase2,_toLowerCase:()=>_toLowerCase2,_templateLiteral:()=>_templateLiteral2,_symbol:()=>_symbol2,_superRefine:()=>_superRefine2,_success:()=>_success2,_stringbool:()=>_stringbool2,_stringFormat:()=>_stringFormat2,_string:()=>_string2,_startsWith:()=>_startsWith2,_size:()=>_size2,_set:()=>_set2,_safeParseAsync:()=>_safeParseAsync2,_safeParse:()=>_safeParse2,_safeEncodeAsync:()=>_safeEncodeAsync2,_safeEncode:()=>_safeEncode2,_safeDecodeAsync:()=>_safeDecodeAsync2,_safeDecode:()=>_safeDecode2,_regex:()=>_regex2,_refine:()=>_refine2,_record:()=>_record2,_readonly:()=>_readonly2,_property:()=>_property2,_promise:()=>_promise2,_positive:()=>_positive2,_pipe:()=>_pipe2,_parseAsync:()=>_parseAsync2,_parse:()=>_parse2,_overwrite:()=>_overwrite2,_optional:()=>_optional2,_number:()=>_number2,_nullable:()=>_nullable2,_null:()=>_null5,_normalize:()=>_normalize2,_nonpositive:()=>_nonpositive2,_nonoptional:()=>_nonoptional2,_nonnegative:()=>_nonnegative2,_never:()=>_never2,_negative:()=>_negative2,_nativeEnum:()=>_nativeEnum2,_nanoid:()=>_nanoid2,_nan:()=>_nan2,_multipleOf:()=>_multipleOf2,_minSize:()=>_minSize2,_minLength:()=>_minLength2,_min:()=>_gte2,_mime:()=>_mime2,_maxSize:()=>_maxSize2,_maxLength:()=>_maxLength2,_max:()=>_lte2,_map:()=>_map2,_lte:()=>_lte2,_lt:()=>_lt2,_lowercase:()=>_lowercase2,_literal:()=>_literal2,_length:()=>_length2,_lazy:()=>_lazy2,_ksuid:()=>_ksuid2,_jwt:()=>_jwt2,_isoTime:()=>_isoTime2,_isoDuration:()=>_isoDuration2,_isoDateTime:()=>_isoDateTime2,_isoDate:()=>_isoDate2,_ipv6:()=>_ipv62,_ipv4:()=>_ipv42,_intersection:()=>_intersection2,_int64:()=>_int642,_int32:()=>_int322,_int:()=>_int2,_includes:()=>_includes2,_guid:()=>_guid2,_gte:()=>_gte2,_gt:()=>_gt2,_float64:()=>_float642,_float32:()=>_float322,_file:()=>_file2,_enum:()=>_enum3,_endsWith:()=>_endsWith2,_encodeAsync:()=>_encodeAsync2,_encode:()=>_encode2,_emoji:()=>_emoji3,_email:()=>_email2,_e164:()=>_e1642,_discriminatedUnion:()=>_discriminatedUnion2,_default:()=>_default3,_decodeAsync:()=>_decodeAsync2,_decode:()=>_decode2,_date:()=>_date2,_custom:()=>_custom2,_cuid2:()=>_cuid22,_cuid:()=>_cuid3,_coercedString:()=>_coercedString2,_coercedNumber:()=>_coercedNumber2,_coercedDate:()=>_coercedDate2,_coercedBoolean:()=>_coercedBoolean2,_coercedBigint:()=>_coercedBigint2,_cidrv6:()=>_cidrv62,_cidrv4:()=>_cidrv42,_check:()=>_check2,_catch:()=>_catch3,_boolean:()=>_boolean2,_bigint:()=>_bigint2,_base64url:()=>_base64url2,_base64:()=>_base642,_array:()=>_array2,_any:()=>_any2,TimePrecision:()=>TimePrecision2,NEVER:()=>NEVER2,JSONSchemaGenerator:()=>JSONSchemaGenerator2,JSONSchema:()=>exports_json_schema2,Doc:()=>Doc2,$output:()=>$output2,$input:()=>$input2,$constructor:()=>$constructor2,$brand:()=>$brand2,$ZodXID:()=>$ZodXID2,$ZodVoid:()=>$ZodVoid2,$ZodUnknown:()=>$ZodUnknown2,$ZodUnion:()=>$ZodUnion2,$ZodUndefined:()=>$ZodUndefined2,$ZodUUID:()=>$ZodUUID2,$ZodURL:()=>$ZodURL2,$ZodULID:()=>$ZodULID2,$ZodType:()=>$ZodType2,$ZodTuple:()=>$ZodTuple2,$ZodTransform:()=>$ZodTransform2,$ZodTemplateLiteral:()=>$ZodTemplateLiteral2,$ZodSymbol:()=>$ZodSymbol2,$ZodSuccess:()=>$ZodSuccess2,$ZodStringFormat:()=>$ZodStringFormat2,$ZodString:()=>$ZodString2,$ZodSet:()=>$ZodSet2,$ZodRegistry:()=>$ZodRegistry2,$ZodRecord:()=>$ZodRecord2,$ZodRealError:()=>$ZodRealError2,$ZodReadonly:()=>$ZodReadonly2,$ZodPromise:()=>$ZodPromise2,$ZodPrefault:()=>$ZodPrefault2,$ZodPipe:()=>$ZodPipe2,$ZodOptional:()=>$ZodOptional2,$ZodObjectJIT:()=>$ZodObjectJIT2,$ZodObject:()=>$ZodObject2,$ZodNumberFormat:()=>$ZodNumberFormat2,$ZodNumber:()=>$ZodNumber2,$ZodNullable:()=>$ZodNullable2,$ZodNull:()=>$ZodNull2,$ZodNonOptional:()=>$ZodNonOptional2,$ZodNever:()=>$ZodNever2,$ZodNanoID:()=>$ZodNanoID2,$ZodNaN:()=>$ZodNaN2,$ZodMap:()=>$ZodMap2,$ZodLiteral:()=>$ZodLiteral2,$ZodLazy:()=>$ZodLazy2,$ZodKSUID:()=>$ZodKSUID2,$ZodJWT:()=>$ZodJWT2,$ZodIntersection:()=>$ZodIntersection2,$ZodISOTime:()=>$ZodISOTime2,$ZodISODuration:()=>$ZodISODuration2,$ZodISODateTime:()=>$ZodISODateTime2,$ZodISODate:()=>$ZodISODate2,$ZodIPv6:()=>$ZodIPv62,$ZodIPv4:()=>$ZodIPv42,$ZodGUID:()=>$ZodGUID2,$ZodFunction:()=>$ZodFunction2,$ZodFile:()=>$ZodFile2,$ZodError:()=>$ZodError2,$ZodEnum:()=>$ZodEnum2,$ZodEncodeError:()=>$ZodEncodeError2,$ZodEmoji:()=>$ZodEmoji2,$ZodEmail:()=>$ZodEmail2,$ZodE164:()=>$ZodE1642,$ZodDiscriminatedUnion:()=>$ZodDiscriminatedUnion2,$ZodDefault:()=>$ZodDefault2,$ZodDate:()=>$ZodDate2,$ZodCustomStringFormat:()=>$ZodCustomStringFormat2,$ZodCustom:()=>$ZodCustom2,$ZodCodec:()=>$ZodCodec2,$ZodCheckUpperCase:()=>$ZodCheckUpperCase2,$ZodCheckStringFormat:()=>$ZodCheckStringFormat2,$ZodCheckStartsWith:()=>$ZodCheckStartsWith2,$ZodCheckSizeEquals:()=>$ZodCheckSizeEquals2,$ZodCheckRegex:()=>$ZodCheckRegex2,$ZodCheckProperty:()=>$ZodCheckProperty2,$ZodCheckOverwrite:()=>$ZodCheckOverwrite2,$ZodCheckNumberFormat:()=>$ZodCheckNumberFormat2,$ZodCheckMultipleOf:()=>$ZodCheckMultipleOf2,$ZodCheckMinSize:()=>$ZodCheckMinSize2,$ZodCheckMinLength:()=>$ZodCheckMinLength2,$ZodCheckMimeType:()=>$ZodCheckMimeType2,$ZodCheckMaxSize:()=>$ZodCheckMaxSize2,$ZodCheckMaxLength:()=>$ZodCheckMaxLength2,$ZodCheckLowerCase:()=>$ZodCheckLowerCase2,$ZodCheckLessThan:()=>$ZodCheckLessThan2,$ZodCheckLengthEquals:()=>$ZodCheckLengthEquals2,$ZodCheckIncludes:()=>$ZodCheckIncludes2,$ZodCheckGreaterThan:()=>$ZodCheckGreaterThan2,$ZodCheckEndsWith:()=>$ZodCheckEndsWith2,$ZodCheckBigIntFormat:()=>$ZodCheckBigIntFormat2,$ZodCheck:()=>$ZodCheck2,$ZodCatch:()=>$ZodCatch2,$ZodCUID2:()=>$ZodCUID22,$ZodCUID:()=>$ZodCUID3,$ZodCIDRv6:()=>$ZodCIDRv62,$ZodCIDRv4:()=>$ZodCIDRv42,$ZodBoolean:()=>$ZodBoolean2,$ZodBigIntFormat:()=>$ZodBigIntFormat2,$ZodBigInt:()=>$ZodBigInt2,$ZodBase64URL:()=>$ZodBase64URL2,$ZodBase64:()=>$ZodBase642,$ZodAsyncError:()=>$ZodAsyncError2,$ZodArray:()=>$ZodArray2,$ZodAny:()=>$ZodAny2});var init_core5=__esm(()=>{init_util2();init_regexes2();init_locales2();init_json_schema2();init_core4();init_parse3();init_errors5();init_schemas3();init_checks3();init_versions2();init_registries2();init_api2();init_to_json_schema2()});var init_checks4=__esm(()=>{init_core5()});var exports_iso2={};__export(exports_iso2,{time:()=>time4,duration:()=>duration4,datetime:()=>datetime4,date:()=>date6,ZodISOTime:()=>ZodISOTime2,ZodISODuration:()=>ZodISODuration2,ZodISODateTime:()=>ZodISODateTime2,ZodISODate:()=>ZodISODate2});function datetime4(params){return _isoDateTime2(ZodISODateTime2,params)}function date6(params){return _isoDate2(ZodISODate2,params)}function time4(params){return _isoTime2(ZodISOTime2,params)}function duration4(params){return _isoDuration2(ZodISODuration2,params)}var ZodISODateTime2,ZodISODate2,ZodISOTime2,ZodISODuration2;var init_iso2=__esm(()=>{init_core5();init_schemas4();ZodISODateTime2=$constructor2("ZodISODateTime",(inst,def)=>{$ZodISODateTime2.init(inst,def),ZodStringFormat2.init(inst,def)});ZodISODate2=$constructor2("ZodISODate",(inst,def)=>{$ZodISODate2.init(inst,def),ZodStringFormat2.init(inst,def)});ZodISOTime2=$constructor2("ZodISOTime",(inst,def)=>{$ZodISOTime2.init(inst,def),ZodStringFormat2.init(inst,def)});ZodISODuration2=$constructor2("ZodISODuration",(inst,def)=>{$ZodISODuration2.init(inst,def),ZodStringFormat2.init(inst,def)})});var initializer4=(inst,issues)=>{$ZodError2.init(inst,issues),inst.name="ZodError",Object.defineProperties(inst,{format:{value:(mapper)=>formatError2(inst,mapper)},flatten:{value:(mapper)=>flattenError2(inst,mapper)},addIssue:{value:(issue3)=>{inst.issues.push(issue3),inst.message=JSON.stringify(inst.issues,jsonStringifyReplacer2,2)}},addIssues:{value:(issues2)=>{inst.issues.push(...issues2),inst.message=JSON.stringify(inst.issues,jsonStringifyReplacer2,2)}},isEmpty:{get(){return inst.issues.length===0}}})},ZodError2,ZodRealError2;var init_errors6=__esm(()=>{init_core5();init_core5();init_util2();ZodError2=$constructor2("ZodError",initializer4),ZodRealError2=$constructor2("ZodError",initializer4,{Parent:Error})});var parse8,parseAsync4,safeParse4,safeParseAsync4,encode4,decode4,encodeAsync4,decodeAsync4,safeEncode4,safeDecode4,safeEncodeAsync4,safeDecodeAsync4;var init_parse4=__esm(()=>{init_core5();init_errors6();parse8=_parse2(ZodRealError2),parseAsync4=_parseAsync2(ZodRealError2),safeParse4=_safeParse2(ZodRealError2),safeParseAsync4=_safeParseAsync2(ZodRealError2),encode4=_encode2(ZodRealError2),decode4=_decode2(ZodRealError2),encodeAsync4=_encodeAsync2(ZodRealError2),decodeAsync4=_decodeAsync2(ZodRealError2),safeEncode4=_safeEncode2(ZodRealError2),safeDecode4=_safeDecode2(ZodRealError2),safeEncodeAsync4=_safeEncodeAsync2(ZodRealError2),safeDecodeAsync4=_safeDecodeAsync2(ZodRealError2)});function string5(params){return _string2(ZodString2,params)}function email4(params){return _email2(ZodEmail2,params)}function guid4(params){return _guid2(ZodGUID2,params)}function uuid5(params){return _uuid2(ZodUUID2,params)}function uuidv42(params){return _uuidv42(ZodUUID2,params)}function uuidv62(params){return _uuidv62(ZodUUID2,params)}function uuidv72(params){return _uuidv72(ZodUUID2,params)}function url2(params){return _url2(ZodURL2,params)}function httpUrl2(params){return _url2(ZodURL2,{protocol:/^https?$/,hostname:exports_regexes2.domain,...exports_util2.normalizeParams(params)})}function emoji4(params){return _emoji3(ZodEmoji2,params)}function nanoid4(params){return _nanoid2(ZodNanoID2,params)}function cuid6(params){return _cuid3(ZodCUID3,params)}function cuid24(params){return _cuid22(ZodCUID22,params)}function ulid4(params){return _ulid2(ZodULID2,params)}function xid4(params){return _xid2(ZodXID2,params)}function ksuid4(params){return _ksuid2(ZodKSUID2,params)}function ipv44(params){return _ipv42(ZodIPv42,params)}function ipv64(params){return _ipv62(ZodIPv62,params)}function cidrv44(params){return _cidrv42(ZodCIDRv42,params)}function cidrv64(params){return _cidrv62(ZodCIDRv62,params)}function base644(params){return _base642(ZodBase642,params)}function base64url4(params){return _base64url2(ZodBase64URL2,params)}function e1644(params){return _e1642(ZodE1642,params)}function jwt2(params){return _jwt2(ZodJWT2,params)}function stringFormat2(format,fnOrRegex,_params={}){return _stringFormat2(ZodCustomStringFormat2,format,fnOrRegex,_params)}function hostname4(_params){return _stringFormat2(ZodCustomStringFormat2,"hostname",exports_regexes2.hostname,_params)}function hex4(_params){return _stringFormat2(ZodCustomStringFormat2,"hex",exports_regexes2.hex,_params)}function hash3(alg,params){let enc=params?.enc??"hex",format=`${alg}_${enc}`,regex=exports_regexes2[format];if(!regex)throw Error(`Unrecognized hash format: ${format}`);return _stringFormat2(ZodCustomStringFormat2,format,regex,params)}function number5(params){return _number2(ZodNumber2,params)}function int2(params){return _int2(ZodNumberFormat2,params)}function float322(params){return _float322(ZodNumberFormat2,params)}function float642(params){return _float642(ZodNumberFormat2,params)}function int322(params){return _int322(ZodNumberFormat2,params)}function uint322(params){return _uint322(ZodNumberFormat2,params)}function boolean5(params){return _boolean2(ZodBoolean2,params)}function bigint5(params){return _bigint2(ZodBigInt2,params)}function int642(params){return _int642(ZodBigIntFormat2,params)}function uint642(params){return _uint642(ZodBigIntFormat2,params)}function symbol2(params){return _symbol2(ZodSymbol2,params)}function _undefined6(params){return _undefined5(ZodUndefined2,params)}function _null6(params){return _null5(ZodNull2,params)}function any2(){return _any2(ZodAny2)}function unknown2(){return _unknown2(ZodUnknown2)}function never2(params){return _never2(ZodNever2,params)}function _void4(params){return _void3(ZodVoid2,params)}function date7(params){return _date2(ZodDate2,params)}function array2(element,params){return _array2(ZodArray2,element,params)}function keyof2(schema){let shape=schema._zod.def.shape;return _enum4(Object.keys(shape))}function object2(shape,params){let def={type:"object",get shape(){return exports_util2.assignProp(this,"shape",shape?exports_util2.objectClone(shape):{}),this.shape},...exports_util2.normalizeParams(params)};return new ZodObject2(def)}function strictObject2(shape,params){return new ZodObject2({type:"object",get shape(){return exports_util2.assignProp(this,"shape",exports_util2.objectClone(shape)),this.shape},catchall:never2(),...exports_util2.normalizeParams(params)})}function looseObject2(shape,params){return new ZodObject2({type:"object",get shape(){return exports_util2.assignProp(this,"shape",exports_util2.objectClone(shape)),this.shape},catchall:unknown2(),...exports_util2.normalizeParams(params)})}function union2(options,params){return new ZodUnion2({type:"union",options,...exports_util2.normalizeParams(params)})}function discriminatedUnion2(discriminator,options,params){return new ZodDiscriminatedUnion2({type:"union",options,discriminator,...exports_util2.normalizeParams(params)})}function intersection2(left,right){return new ZodIntersection2({type:"intersection",left,right})}function tuple2(items,_paramsOrRest,_params){let hasRest=_paramsOrRest instanceof $ZodType2,params=hasRest?_params:_paramsOrRest;return new ZodTuple2({type:"tuple",items,rest:hasRest?_paramsOrRest:null,...exports_util2.normalizeParams(params)})}function record2(keyType,valueType,params){return new ZodRecord2({type:"record",keyType,valueType,...exports_util2.normalizeParams(params)})}function partialRecord2(keyType,valueType,params){let k=clone2(keyType);return k._zod.values=void 0,new ZodRecord2({type:"record",keyType:k,valueType,...exports_util2.normalizeParams(params)})}function map2(keyType,valueType,params){return new ZodMap2({type:"map",keyType,valueType,...exports_util2.normalizeParams(params)})}function set2(valueType,params){return new ZodSet2({type:"set",valueType,...exports_util2.normalizeParams(params)})}function _enum4(values,params){let entries=Array.isArray(values)?Object.fromEntries(values.map((v)=>[v,v])):values;return new ZodEnum2({type:"enum",entries,...exports_util2.normalizeParams(params)})}function nativeEnum2(entries,params){return new ZodEnum2({type:"enum",entries,...exports_util2.normalizeParams(params)})}function literal2(value,params){return new ZodLiteral2({type:"literal",values:Array.isArray(value)?value:[value],...exports_util2.normalizeParams(params)})}function file2(params){return _file2(ZodFile2,params)}function transform2(fn2){return new ZodTransform2({type:"transform",transform:fn2})}function optional2(innerType){return new ZodOptional2({type:"optional",innerType})}function nullable2(innerType){return new ZodNullable2({type:"nullable",innerType})}function nullish4(innerType){return optional2(nullable2(innerType))}function _default4(innerType,defaultValue){return new ZodDefault2({type:"default",innerType,get defaultValue(){return typeof defaultValue==="function"?defaultValue():exports_util2.shallowClone(defaultValue)}})}function prefault2(innerType,defaultValue){return new ZodPrefault2({type:"prefault",innerType,get defaultValue(){return typeof defaultValue==="function"?defaultValue():exports_util2.shallowClone(defaultValue)}})}function nonoptional2(innerType,params){return new ZodNonOptional2({type:"nonoptional",innerType,...exports_util2.normalizeParams(params)})}function success2(innerType){return new ZodSuccess2({type:"success",innerType})}function _catch4(innerType,catchValue){return new ZodCatch2({type:"catch",innerType,catchValue:typeof catchValue==="function"?catchValue:()=>catchValue})}function nan2(params){return _nan2(ZodNaN2,params)}function pipe2(in_,out){return new ZodPipe2({type:"pipe",in:in_,out})}function codec2(in_,out,params){return new ZodCodec2({type:"pipe",in:in_,out,transform:params.decode,reverseTransform:params.encode})}function readonly2(innerType){return new ZodReadonly2({type:"readonly",innerType})}function templateLiteral2(parts,params){return new ZodTemplateLiteral2({type:"template_literal",parts,...exports_util2.normalizeParams(params)})}function lazy2(getter){return new ZodLazy2({type:"lazy",getter})}function promise2(innerType){return new ZodPromise2({type:"promise",innerType})}function _function2(params){return new ZodFunction2({type:"function",input:Array.isArray(params?.input)?tuple2(params?.input):params?.input??array2(unknown2()),output:params?.output??unknown2()})}function check2(fn2){let ch=new $ZodCheck2({check:"custom"});return ch._zod.check=fn2,ch}function custom2(fn2,_params){return _custom2(ZodCustom2,fn2??(()=>!0),_params)}function refine2(fn2,_params={}){return _refine2(ZodCustom2,fn2,_params)}function superRefine2(fn2){return _superRefine2(fn2)}function _instanceof2(cls,params={error:`Input not instance of ${cls.name}`}){let inst=new ZodCustom2({type:"custom",check:"custom",fn:(data)=>data instanceof cls,abort:!0,...exports_util2.normalizeParams(params)});return inst._zod.bag.Class=cls,inst}function json2(params){let jsonSchema=lazy2(()=>{return union2([string5(params),number5(),boolean5(),_null6(),array2(jsonSchema),record2(string5(),jsonSchema)])});return jsonSchema}function preprocess2(fn2,schema){return pipe2(transform2(fn2),schema)}var ZodType2,_ZodString2,ZodString2,ZodStringFormat2,ZodEmail2,ZodGUID2,ZodUUID2,ZodURL2,ZodEmoji2,ZodNanoID2,ZodCUID3,ZodCUID22,ZodULID2,ZodXID2,ZodKSUID2,ZodIPv42,ZodIPv62,ZodCIDRv42,ZodCIDRv62,ZodBase642,ZodBase64URL2,ZodE1642,ZodJWT2,ZodCustomStringFormat2,ZodNumber2,ZodNumberFormat2,ZodBoolean2,ZodBigInt2,ZodBigIntFormat2,ZodSymbol2,ZodUndefined2,ZodNull2,ZodAny2,ZodUnknown2,ZodNever2,ZodVoid2,ZodDate2,ZodArray2,ZodObject2,ZodUnion2,ZodDiscriminatedUnion2,ZodIntersection2,ZodTuple2,ZodRecord2,ZodMap2,ZodSet2,ZodEnum2,ZodLiteral2,ZodFile2,ZodTransform2,ZodOptional2,ZodNullable2,ZodDefault2,ZodPrefault2,ZodNonOptional2,ZodSuccess2,ZodCatch2,ZodNaN2,ZodPipe2,ZodCodec2,ZodReadonly2,ZodTemplateLiteral2,ZodLazy2,ZodPromise2,ZodFunction2,ZodCustom2,stringbool2=(...args2)=>_stringbool2({Codec:ZodCodec2,Boolean:ZodBoolean2,String:ZodString2},...args2);var init_schemas4=__esm(()=>{init_core5();init_core5();init_checks4();init_iso2();init_parse4();ZodType2=$constructor2("ZodType",(inst,def)=>{return $ZodType2.init(inst,def),inst.def=def,inst.type=def.type,Object.defineProperty(inst,"_def",{value:def}),inst.check=(...checks4)=>{return inst.clone({...def,checks:[...def.checks??[],...checks4.map((ch)=>typeof ch==="function"?{_zod:{check:ch,def:{check:"custom"},onattach:[]}}:ch)]})},inst.clone=(def2,params)=>clone2(inst,def2,params),inst.brand=()=>inst,inst.register=(reg,meta3)=>{return reg.add(inst,meta3),inst},inst.parse=(data,params)=>parse8(inst,data,params,{callee:inst.parse}),inst.safeParse=(data,params)=>safeParse4(inst,data,params),inst.parseAsync=async(data,params)=>parseAsync4(inst,data,params,{callee:inst.parseAsync}),inst.safeParseAsync=async(data,params)=>safeParseAsync4(inst,data,params),inst.spa=inst.safeParseAsync,inst.encode=(data,params)=>encode4(inst,data,params),inst.decode=(data,params)=>decode4(inst,data,params),inst.encodeAsync=async(data,params)=>encodeAsync4(inst,data,params),inst.decodeAsync=async(data,params)=>decodeAsync4(inst,data,params),inst.safeEncode=(data,params)=>safeEncode4(inst,data,params),inst.safeDecode=(data,params)=>safeDecode4(inst,data,params),inst.safeEncodeAsync=async(data,params)=>safeEncodeAsync4(inst,data,params),inst.safeDecodeAsync=async(data,params)=>safeDecodeAsync4(inst,data,params),inst.refine=(check2,params)=>inst.check(refine2(check2,params)),inst.superRefine=(refinement)=>inst.check(superRefine2(refinement)),inst.overwrite=(fn2)=>inst.check(_overwrite2(fn2)),inst.optional=()=>optional2(inst),inst.nullable=()=>nullable2(inst),inst.nullish=()=>optional2(nullable2(inst)),inst.nonoptional=(params)=>nonoptional2(inst,params),inst.array=()=>array2(inst),inst.or=(arg)=>union2([inst,arg]),inst.and=(arg)=>intersection2(inst,arg),inst.transform=(tx)=>pipe2(inst,transform2(tx)),inst.default=(def2)=>_default4(inst,def2),inst.prefault=(def2)=>prefault2(inst,def2),inst.catch=(params)=>_catch4(inst,params),inst.pipe=(target)=>pipe2(inst,target),inst.readonly=()=>readonly2(inst),inst.describe=(description)=>{let cl=inst.clone();return globalRegistry2.add(cl,{description}),cl},Object.defineProperty(inst,"description",{get(){return globalRegistry2.get(inst)?.description},configurable:!0}),inst.meta=(...args2)=>{if(args2.length===0)return globalRegistry2.get(inst);let cl=inst.clone();return globalRegistry2.add(cl,args2[0]),cl},inst.isOptional=()=>inst.safeParse(void 0).success,inst.isNullable=()=>inst.safeParse(null).success,inst}),_ZodString2=$constructor2("_ZodString",(inst,def)=>{$ZodString2.init(inst,def),ZodType2.init(inst,def);let bag=inst._zod.bag;inst.format=bag.format??null,inst.minLength=bag.minimum??null,inst.maxLength=bag.maximum??null,inst.regex=(...args2)=>inst.check(_regex2(...args2)),inst.includes=(...args2)=>inst.check(_includes2(...args2)),inst.startsWith=(...args2)=>inst.check(_startsWith2(...args2)),inst.endsWith=(...args2)=>inst.check(_endsWith2(...args2)),inst.min=(...args2)=>inst.check(_minLength2(...args2)),inst.max=(...args2)=>inst.check(_maxLength2(...args2)),inst.length=(...args2)=>inst.check(_length2(...args2)),inst.nonempty=(...args2)=>inst.check(_minLength2(1,...args2)),inst.lowercase=(params)=>inst.check(_lowercase2(params)),inst.uppercase=(params)=>inst.check(_uppercase2(params)),inst.trim=()=>inst.check(_trim2()),inst.normalize=(...args2)=>inst.check(_normalize2(...args2)),inst.toLowerCase=()=>inst.check(_toLowerCase2()),inst.toUpperCase=()=>inst.check(_toUpperCase2())}),ZodString2=$constructor2("ZodString",(inst,def)=>{$ZodString2.init(inst,def),_ZodString2.init(inst,def),inst.email=(params)=>inst.check(_email2(ZodEmail2,params)),inst.url=(params)=>inst.check(_url2(ZodURL2,params)),inst.jwt=(params)=>inst.check(_jwt2(ZodJWT2,params)),inst.emoji=(params)=>inst.check(_emoji3(ZodEmoji2,params)),inst.guid=(params)=>inst.check(_guid2(ZodGUID2,params)),inst.uuid=(params)=>inst.check(_uuid2(ZodUUID2,params)),inst.uuidv4=(params)=>inst.check(_uuidv42(ZodUUID2,params)),inst.uuidv6=(params)=>inst.check(_uuidv62(ZodUUID2,params)),inst.uuidv7=(params)=>inst.check(_uuidv72(ZodUUID2,params)),inst.nanoid=(params)=>inst.check(_nanoid2(ZodNanoID2,params)),inst.guid=(params)=>inst.check(_guid2(ZodGUID2,params)),inst.cuid=(params)=>inst.check(_cuid3(ZodCUID3,params)),inst.cuid2=(params)=>inst.check(_cuid22(ZodCUID22,params)),inst.ulid=(params)=>inst.check(_ulid2(ZodULID2,params)),inst.base64=(params)=>inst.check(_base642(ZodBase642,params)),inst.base64url=(params)=>inst.check(_base64url2(ZodBase64URL2,params)),inst.xid=(params)=>inst.check(_xid2(ZodXID2,params)),inst.ksuid=(params)=>inst.check(_ksuid2(ZodKSUID2,params)),inst.ipv4=(params)=>inst.check(_ipv42(ZodIPv42,params)),inst.ipv6=(params)=>inst.check(_ipv62(ZodIPv62,params)),inst.cidrv4=(params)=>inst.check(_cidrv42(ZodCIDRv42,params)),inst.cidrv6=(params)=>inst.check(_cidrv62(ZodCIDRv62,params)),inst.e164=(params)=>inst.check(_e1642(ZodE1642,params)),inst.datetime=(params)=>inst.check(datetime4(params)),inst.date=(params)=>inst.check(date6(params)),inst.time=(params)=>inst.check(time4(params)),inst.duration=(params)=>inst.check(duration4(params))});ZodStringFormat2=$constructor2("ZodStringFormat",(inst,def)=>{$ZodStringFormat2.init(inst,def),_ZodString2.init(inst,def)}),ZodEmail2=$constructor2("ZodEmail",(inst,def)=>{$ZodEmail2.init(inst,def),ZodStringFormat2.init(inst,def)});ZodGUID2=$constructor2("ZodGUID",(inst,def)=>{$ZodGUID2.init(inst,def),ZodStringFormat2.init(inst,def)});ZodUUID2=$constructor2("ZodUUID",(inst,def)=>{$ZodUUID2.init(inst,def),ZodStringFormat2.init(inst,def)});ZodURL2=$constructor2("ZodURL",(inst,def)=>{$ZodURL2.init(inst,def),ZodStringFormat2.init(inst,def)});ZodEmoji2=$constructor2("ZodEmoji",(inst,def)=>{$ZodEmoji2.init(inst,def),ZodStringFormat2.init(inst,def)});ZodNanoID2=$constructor2("ZodNanoID",(inst,def)=>{$ZodNanoID2.init(inst,def),ZodStringFormat2.init(inst,def)});ZodCUID3=$constructor2("ZodCUID",(inst,def)=>{$ZodCUID3.init(inst,def),ZodStringFormat2.init(inst,def)});ZodCUID22=$constructor2("ZodCUID2",(inst,def)=>{$ZodCUID22.init(inst,def),ZodStringFormat2.init(inst,def)});ZodULID2=$constructor2("ZodULID",(inst,def)=>{$ZodULID2.init(inst,def),ZodStringFormat2.init(inst,def)});ZodXID2=$constructor2("ZodXID",(inst,def)=>{$ZodXID2.init(inst,def),ZodStringFormat2.init(inst,def)});ZodKSUID2=$constructor2("ZodKSUID",(inst,def)=>{$ZodKSUID2.init(inst,def),ZodStringFormat2.init(inst,def)});ZodIPv42=$constructor2("ZodIPv4",(inst,def)=>{$ZodIPv42.init(inst,def),ZodStringFormat2.init(inst,def)});ZodIPv62=$constructor2("ZodIPv6",(inst,def)=>{$ZodIPv62.init(inst,def),ZodStringFormat2.init(inst,def)});ZodCIDRv42=$constructor2("ZodCIDRv4",(inst,def)=>{$ZodCIDRv42.init(inst,def),ZodStringFormat2.init(inst,def)});ZodCIDRv62=$constructor2("ZodCIDRv6",(inst,def)=>{$ZodCIDRv62.init(inst,def),ZodStringFormat2.init(inst,def)});ZodBase642=$constructor2("ZodBase64",(inst,def)=>{$ZodBase642.init(inst,def),ZodStringFormat2.init(inst,def)});ZodBase64URL2=$constructor2("ZodBase64URL",(inst,def)=>{$ZodBase64URL2.init(inst,def),ZodStringFormat2.init(inst,def)});ZodE1642=$constructor2("ZodE164",(inst,def)=>{$ZodE1642.init(inst,def),ZodStringFormat2.init(inst,def)});ZodJWT2=$constructor2("ZodJWT",(inst,def)=>{$ZodJWT2.init(inst,def),ZodStringFormat2.init(inst,def)});ZodCustomStringFormat2=$constructor2("ZodCustomStringFormat",(inst,def)=>{$ZodCustomStringFormat2.init(inst,def),ZodStringFormat2.init(inst,def)});ZodNumber2=$constructor2("ZodNumber",(inst,def)=>{$ZodNumber2.init(inst,def),ZodType2.init(inst,def),inst.gt=(value,params)=>inst.check(_gt2(value,params)),inst.gte=(value,params)=>inst.check(_gte2(value,params)),inst.min=(value,params)=>inst.check(_gte2(value,params)),inst.lt=(value,params)=>inst.check(_lt2(value,params)),inst.lte=(value,params)=>inst.check(_lte2(value,params)),inst.max=(value,params)=>inst.check(_lte2(value,params)),inst.int=(params)=>inst.check(int2(params)),inst.safe=(params)=>inst.check(int2(params)),inst.positive=(params)=>inst.check(_gt2(0,params)),inst.nonnegative=(params)=>inst.check(_gte2(0,params)),inst.negative=(params)=>inst.check(_lt2(0,params)),inst.nonpositive=(params)=>inst.check(_lte2(0,params)),inst.multipleOf=(value,params)=>inst.check(_multipleOf2(value,params)),inst.step=(value,params)=>inst.check(_multipleOf2(value,params)),inst.finite=()=>inst;let bag=inst._zod.bag;inst.minValue=Math.max(bag.minimum??Number.NEGATIVE_INFINITY,bag.exclusiveMinimum??Number.NEGATIVE_INFINITY)??null,inst.maxValue=Math.min(bag.maximum??Number.POSITIVE_INFINITY,bag.exclusiveMaximum??Number.POSITIVE_INFINITY)??null,inst.isInt=(bag.format??"").includes("int")||Number.isSafeInteger(bag.multipleOf??0.5),inst.isFinite=!0,inst.format=bag.format??null});ZodNumberFormat2=$constructor2("ZodNumberFormat",(inst,def)=>{$ZodNumberFormat2.init(inst,def),ZodNumber2.init(inst,def)});ZodBoolean2=$constructor2("ZodBoolean",(inst,def)=>{$ZodBoolean2.init(inst,def),ZodType2.init(inst,def)});ZodBigInt2=$constructor2("ZodBigInt",(inst,def)=>{$ZodBigInt2.init(inst,def),ZodType2.init(inst,def),inst.gte=(value,params)=>inst.check(_gte2(value,params)),inst.min=(value,params)=>inst.check(_gte2(value,params)),inst.gt=(value,params)=>inst.check(_gt2(value,params)),inst.gte=(value,params)=>inst.check(_gte2(value,params)),inst.min=(value,params)=>inst.check(_gte2(value,params)),inst.lt=(value,params)=>inst.check(_lt2(value,params)),inst.lte=(value,params)=>inst.check(_lte2(value,params)),inst.max=(value,params)=>inst.check(_lte2(value,params)),inst.positive=(params)=>inst.check(_gt2(BigInt(0),params)),inst.negative=(params)=>inst.check(_lt2(BigInt(0),params)),inst.nonpositive=(params)=>inst.check(_lte2(BigInt(0),params)),inst.nonnegative=(params)=>inst.check(_gte2(BigInt(0),params)),inst.multipleOf=(value,params)=>inst.check(_multipleOf2(value,params));let bag=inst._zod.bag;inst.minValue=bag.minimum??null,inst.maxValue=bag.maximum??null,inst.format=bag.format??null});ZodBigIntFormat2=$constructor2("ZodBigIntFormat",(inst,def)=>{$ZodBigIntFormat2.init(inst,def),ZodBigInt2.init(inst,def)});ZodSymbol2=$constructor2("ZodSymbol",(inst,def)=>{$ZodSymbol2.init(inst,def),ZodType2.init(inst,def)});ZodUndefined2=$constructor2("ZodUndefined",(inst,def)=>{$ZodUndefined2.init(inst,def),ZodType2.init(inst,def)});ZodNull2=$constructor2("ZodNull",(inst,def)=>{$ZodNull2.init(inst,def),ZodType2.init(inst,def)});ZodAny2=$constructor2("ZodAny",(inst,def)=>{$ZodAny2.init(inst,def),ZodType2.init(inst,def)});ZodUnknown2=$constructor2("ZodUnknown",(inst,def)=>{$ZodUnknown2.init(inst,def),ZodType2.init(inst,def)});ZodNever2=$constructor2("ZodNever",(inst,def)=>{$ZodNever2.init(inst,def),ZodType2.init(inst,def)});ZodVoid2=$constructor2("ZodVoid",(inst,def)=>{$ZodVoid2.init(inst,def),ZodType2.init(inst,def)});ZodDate2=$constructor2("ZodDate",(inst,def)=>{$ZodDate2.init(inst,def),ZodType2.init(inst,def),inst.min=(value,params)=>inst.check(_gte2(value,params)),inst.max=(value,params)=>inst.check(_lte2(value,params));let c=inst._zod.bag;inst.minDate=c.minimum?new Date(c.minimum):null,inst.maxDate=c.maximum?new Date(c.maximum):null});ZodArray2=$constructor2("ZodArray",(inst,def)=>{$ZodArray2.init(inst,def),ZodType2.init(inst,def),inst.element=def.element,inst.min=(minLength,params)=>inst.check(_minLength2(minLength,params)),inst.nonempty=(params)=>inst.check(_minLength2(1,params)),inst.max=(maxLength,params)=>inst.check(_maxLength2(maxLength,params)),inst.length=(len,params)=>inst.check(_length2(len,params)),inst.unwrap=()=>inst.element});ZodObject2=$constructor2("ZodObject",(inst,def)=>{$ZodObjectJIT2.init(inst,def),ZodType2.init(inst,def),exports_util2.defineLazy(inst,"shape",()=>def.shape),inst.keyof=()=>_enum4(Object.keys(inst._zod.def.shape)),inst.catchall=(catchall)=>inst.clone({...inst._zod.def,catchall}),inst.passthrough=()=>inst.clone({...inst._zod.def,catchall:unknown2()}),inst.loose=()=>inst.clone({...inst._zod.def,catchall:unknown2()}),inst.strict=()=>inst.clone({...inst._zod.def,catchall:never2()}),inst.strip=()=>inst.clone({...inst._zod.def,catchall:void 0}),inst.extend=(incoming)=>{return exports_util2.extend(inst,incoming)},inst.safeExtend=(incoming)=>{return exports_util2.safeExtend(inst,incoming)},inst.merge=(other)=>exports_util2.merge(inst,other),inst.pick=(mask)=>exports_util2.pick(inst,mask),inst.omit=(mask)=>exports_util2.omit(inst,mask),inst.partial=(...args2)=>exports_util2.partial(ZodOptional2,inst,args2[0]),inst.required=(...args2)=>exports_util2.required(ZodNonOptional2,inst,args2[0])});ZodUnion2=$constructor2("ZodUnion",(inst,def)=>{$ZodUnion2.init(inst,def),ZodType2.init(inst,def),inst.options=def.options});ZodDiscriminatedUnion2=$constructor2("ZodDiscriminatedUnion",(inst,def)=>{ZodUnion2.init(inst,def),$ZodDiscriminatedUnion2.init(inst,def)});ZodIntersection2=$constructor2("ZodIntersection",(inst,def)=>{$ZodIntersection2.init(inst,def),ZodType2.init(inst,def)});ZodTuple2=$constructor2("ZodTuple",(inst,def)=>{$ZodTuple2.init(inst,def),ZodType2.init(inst,def),inst.rest=(rest)=>inst.clone({...inst._zod.def,rest})});ZodRecord2=$constructor2("ZodRecord",(inst,def)=>{$ZodRecord2.init(inst,def),ZodType2.init(inst,def),inst.keyType=def.keyType,inst.valueType=def.valueType});ZodMap2=$constructor2("ZodMap",(inst,def)=>{$ZodMap2.init(inst,def),ZodType2.init(inst,def),inst.keyType=def.keyType,inst.valueType=def.valueType});ZodSet2=$constructor2("ZodSet",(inst,def)=>{$ZodSet2.init(inst,def),ZodType2.init(inst,def),inst.min=(...args2)=>inst.check(_minSize2(...args2)),inst.nonempty=(params)=>inst.check(_minSize2(1,params)),inst.max=(...args2)=>inst.check(_maxSize2(...args2)),inst.size=(...args2)=>inst.check(_size2(...args2))});ZodEnum2=$constructor2("ZodEnum",(inst,def)=>{$ZodEnum2.init(inst,def),ZodType2.init(inst,def),inst.enum=def.entries,inst.options=Object.values(def.entries);let keys=new Set(Object.keys(def.entries));inst.extract=(values,params)=>{let newEntries={};for(let value of values)if(keys.has(value))newEntries[value]=def.entries[value];else throw Error(`Key ${value} not found in enum`);return new ZodEnum2({...def,checks:[],...exports_util2.normalizeParams(params),entries:newEntries})},inst.exclude=(values,params)=>{let newEntries={...def.entries};for(let value of values)if(keys.has(value))delete newEntries[value];else throw Error(`Key ${value} not found in enum`);return new ZodEnum2({...def,checks:[],...exports_util2.normalizeParams(params),entries:newEntries})}});ZodLiteral2=$constructor2("ZodLiteral",(inst,def)=>{$ZodLiteral2.init(inst,def),ZodType2.init(inst,def),inst.values=new Set(def.values),Object.defineProperty(inst,"value",{get(){if(def.values.length>1)throw Error("This schema contains multiple valid literal values. Use `.values` instead.");return def.values[0]}})});ZodFile2=$constructor2("ZodFile",(inst,def)=>{$ZodFile2.init(inst,def),ZodType2.init(inst,def),inst.min=(size,params)=>inst.check(_minSize2(size,params)),inst.max=(size,params)=>inst.check(_maxSize2(size,params)),inst.mime=(types2,params)=>inst.check(_mime2(Array.isArray(types2)?types2:[types2],params))});ZodTransform2=$constructor2("ZodTransform",(inst,def)=>{$ZodTransform2.init(inst,def),ZodType2.init(inst,def),inst._zod.parse=(payload,_ctx)=>{if(_ctx.direction==="backward")throw new $ZodEncodeError2(inst.constructor.name);payload.addIssue=(issue3)=>{if(typeof issue3==="string")payload.issues.push(exports_util2.issue(issue3,payload.value,def));else{let _issue=issue3;if(_issue.fatal)_issue.continue=!1;_issue.code??(_issue.code="custom"),_issue.input??(_issue.input=payload.value),_issue.inst??(_issue.inst=inst),payload.issues.push(exports_util2.issue(_issue))}};let output=def.transform(payload.value,payload);if(output instanceof Promise)return output.then((output2)=>{return payload.value=output2,payload});return payload.value=output,payload}});ZodOptional2=$constructor2("ZodOptional",(inst,def)=>{$ZodOptional2.init(inst,def),ZodType2.init(inst,def),inst.unwrap=()=>inst._zod.def.innerType});ZodNullable2=$constructor2("ZodNullable",(inst,def)=>{$ZodNullable2.init(inst,def),ZodType2.init(inst,def),inst.unwrap=()=>inst._zod.def.innerType});ZodDefault2=$constructor2("ZodDefault",(inst,def)=>{$ZodDefault2.init(inst,def),ZodType2.init(inst,def),inst.unwrap=()=>inst._zod.def.innerType,inst.removeDefault=inst.unwrap});ZodPrefault2=$constructor2("ZodPrefault",(inst,def)=>{$ZodPrefault2.init(inst,def),ZodType2.init(inst,def),inst.unwrap=()=>inst._zod.def.innerType});ZodNonOptional2=$constructor2("ZodNonOptional",(inst,def)=>{$ZodNonOptional2.init(inst,def),ZodType2.init(inst,def),inst.unwrap=()=>inst._zod.def.innerType});ZodSuccess2=$constructor2("ZodSuccess",(inst,def)=>{$ZodSuccess2.init(inst,def),ZodType2.init(inst,def),inst.unwrap=()=>inst._zod.def.innerType});ZodCatch2=$constructor2("ZodCatch",(inst,def)=>{$ZodCatch2.init(inst,def),ZodType2.init(inst,def),inst.unwrap=()=>inst._zod.def.innerType,inst.removeCatch=inst.unwrap});ZodNaN2=$constructor2("ZodNaN",(inst,def)=>{$ZodNaN2.init(inst,def),ZodType2.init(inst,def)});ZodPipe2=$constructor2("ZodPipe",(inst,def)=>{$ZodPipe2.init(inst,def),ZodType2.init(inst,def),inst.in=def.in,inst.out=def.out});ZodCodec2=$constructor2("ZodCodec",(inst,def)=>{ZodPipe2.init(inst,def),$ZodCodec2.init(inst,def)});ZodReadonly2=$constructor2("ZodReadonly",(inst,def)=>{$ZodReadonly2.init(inst,def),ZodType2.init(inst,def),inst.unwrap=()=>inst._zod.def.innerType});ZodTemplateLiteral2=$constructor2("ZodTemplateLiteral",(inst,def)=>{$ZodTemplateLiteral2.init(inst,def),ZodType2.init(inst,def)});ZodLazy2=$constructor2("ZodLazy",(inst,def)=>{$ZodLazy2.init(inst,def),ZodType2.init(inst,def),inst.unwrap=()=>inst._zod.def.getter()});ZodPromise2=$constructor2("ZodPromise",(inst,def)=>{$ZodPromise2.init(inst,def),ZodType2.init(inst,def),inst.unwrap=()=>inst._zod.def.innerType});ZodFunction2=$constructor2("ZodFunction",(inst,def)=>{$ZodFunction2.init(inst,def),ZodType2.init(inst,def)});ZodCustom2=$constructor2("ZodCustom",(inst,def)=>{$ZodCustom2.init(inst,def),ZodType2.init(inst,def)})});function setErrorMap2(map3){config2({customError:map3})}function getErrorMap2(){return config2().customError}var ZodIssueCode2,ZodFirstPartyTypeKind2;var init_compat2=__esm(()=>{init_core5();ZodIssueCode2={invalid_type:"invalid_type",too_big:"too_big",too_small:"too_small",invalid_format:"invalid_format",not_multiple_of:"not_multiple_of",unrecognized_keys:"unrecognized_keys",invalid_union:"invalid_union",invalid_key:"invalid_key",invalid_element:"invalid_element",invalid_value:"invalid_value",custom:"custom"};(function(ZodFirstPartyTypeKind3){})(ZodFirstPartyTypeKind2||(ZodFirstPartyTypeKind2={}))});var exports_coerce2={};__export(exports_coerce2,{string:()=>string6,number:()=>number6,date:()=>date8,boolean:()=>boolean6,bigint:()=>bigint6});function string6(params){return _coercedString2(ZodString2,params)}function number6(params){return _coercedNumber2(ZodNumber2,params)}function boolean6(params){return _coercedBoolean2(ZodBoolean2,params)}function bigint6(params){return _coercedBigint2(ZodBigInt2,params)}function date8(params){return _coercedDate2(ZodDate2,params)}var init_coerce2=__esm(()=>{init_core5();init_schemas4()});var exports_external2={};__export(exports_external2,{xid:()=>xid4,void:()=>_void4,uuidv7:()=>uuidv72,uuidv6:()=>uuidv62,uuidv4:()=>uuidv42,uuid:()=>uuid5,util:()=>exports_util2,url:()=>url2,uppercase:()=>_uppercase2,unknown:()=>unknown2,union:()=>union2,undefined:()=>_undefined6,ulid:()=>ulid4,uint64:()=>uint642,uint32:()=>uint322,tuple:()=>tuple2,trim:()=>_trim2,treeifyError:()=>treeifyError2,transform:()=>transform2,toUpperCase:()=>_toUpperCase2,toLowerCase:()=>_toLowerCase2,toJSONSchema:()=>toJSONSchema2,templateLiteral:()=>templateLiteral2,symbol:()=>symbol2,superRefine:()=>superRefine2,success:()=>success2,stringbool:()=>stringbool2,stringFormat:()=>stringFormat2,string:()=>string5,strictObject:()=>strictObject2,startsWith:()=>_startsWith2,size:()=>_size2,setErrorMap:()=>setErrorMap2,set:()=>set2,safeParseAsync:()=>safeParseAsync4,safeParse:()=>safeParse4,safeEncodeAsync:()=>safeEncodeAsync4,safeEncode:()=>safeEncode4,safeDecodeAsync:()=>safeDecodeAsync4,safeDecode:()=>safeDecode4,registry:()=>registry2,regexes:()=>exports_regexes2,regex:()=>_regex2,refine:()=>refine2,record:()=>record2,readonly:()=>readonly2,property:()=>_property2,promise:()=>promise2,prettifyError:()=>prettifyError2,preprocess:()=>preprocess2,prefault:()=>prefault2,positive:()=>_positive2,pipe:()=>pipe2,partialRecord:()=>partialRecord2,parseAsync:()=>parseAsync4,parse:()=>parse8,overwrite:()=>_overwrite2,optional:()=>optional2,object:()=>object2,number:()=>number5,nullish:()=>nullish4,nullable:()=>nullable2,null:()=>_null6,normalize:()=>_normalize2,nonpositive:()=>_nonpositive2,nonoptional:()=>nonoptional2,nonnegative:()=>_nonnegative2,never:()=>never2,negative:()=>_negative2,nativeEnum:()=>nativeEnum2,nanoid:()=>nanoid4,nan:()=>nan2,multipleOf:()=>_multipleOf2,minSize:()=>_minSize2,minLength:()=>_minLength2,mime:()=>_mime2,maxSize:()=>_maxSize2,maxLength:()=>_maxLength2,map:()=>map2,lte:()=>_lte2,lt:()=>_lt2,lowercase:()=>_lowercase2,looseObject:()=>looseObject2,locales:()=>exports_locales2,literal:()=>literal2,length:()=>_length2,lazy:()=>lazy2,ksuid:()=>ksuid4,keyof:()=>keyof2,jwt:()=>jwt2,json:()=>json2,iso:()=>exports_iso2,ipv6:()=>ipv64,ipv4:()=>ipv44,intersection:()=>intersection2,int64:()=>int642,int32:()=>int322,int:()=>int2,instanceof:()=>_instanceof2,includes:()=>_includes2,httpUrl:()=>httpUrl2,hostname:()=>hostname4,hex:()=>hex4,hash:()=>hash3,guid:()=>guid4,gte:()=>_gte2,gt:()=>_gt2,globalRegistry:()=>globalRegistry2,getErrorMap:()=>getErrorMap2,function:()=>_function2,formatError:()=>formatError2,float64:()=>float642,float32:()=>float322,flattenError:()=>flattenError2,file:()=>file2,enum:()=>_enum4,endsWith:()=>_endsWith2,encodeAsync:()=>encodeAsync4,encode:()=>encode4,emoji:()=>emoji4,email:()=>email4,e164:()=>e1644,discriminatedUnion:()=>discriminatedUnion2,decodeAsync:()=>decodeAsync4,decode:()=>decode4,date:()=>date7,custom:()=>custom2,cuid2:()=>cuid24,cuid:()=>cuid6,core:()=>exports_core5,config:()=>config2,coerce:()=>exports_coerce2,codec:()=>codec2,clone:()=>clone2,cidrv6:()=>cidrv64,cidrv4:()=>cidrv44,check:()=>check2,catch:()=>_catch4,boolean:()=>boolean5,bigint:()=>bigint5,base64url:()=>base64url4,base64:()=>base644,array:()=>array2,any:()=>any2,_function:()=>_function2,_default:()=>_default4,_ZodString:()=>_ZodString2,ZodXID:()=>ZodXID2,ZodVoid:()=>ZodVoid2,ZodUnknown:()=>ZodUnknown2,ZodUnion:()=>ZodUnion2,ZodUndefined:()=>ZodUndefined2,ZodUUID:()=>ZodUUID2,ZodURL:()=>ZodURL2,ZodULID:()=>ZodULID2,ZodType:()=>ZodType2,ZodTuple:()=>ZodTuple2,ZodTransform:()=>ZodTransform2,ZodTemplateLiteral:()=>ZodTemplateLiteral2,ZodSymbol:()=>ZodSymbol2,ZodSuccess:()=>ZodSuccess2,ZodStringFormat:()=>ZodStringFormat2,ZodString:()=>ZodString2,ZodSet:()=>ZodSet2,ZodRecord:()=>ZodRecord2,ZodRealError:()=>ZodRealError2,ZodReadonly:()=>ZodReadonly2,ZodPromise:()=>ZodPromise2,ZodPrefault:()=>ZodPrefault2,ZodPipe:()=>ZodPipe2,ZodOptional:()=>ZodOptional2,ZodObject:()=>ZodObject2,ZodNumberFormat:()=>ZodNumberFormat2,ZodNumber:()=>ZodNumber2,ZodNullable:()=>ZodNullable2,ZodNull:()=>ZodNull2,ZodNonOptional:()=>ZodNonOptional2,ZodNever:()=>ZodNever2,ZodNanoID:()=>ZodNanoID2,ZodNaN:()=>ZodNaN2,ZodMap:()=>ZodMap2,ZodLiteral:()=>ZodLiteral2,ZodLazy:()=>ZodLazy2,ZodKSUID:()=>ZodKSUID2,ZodJWT:()=>ZodJWT2,ZodIssueCode:()=>ZodIssueCode2,ZodIntersection:()=>ZodIntersection2,ZodISOTime:()=>ZodISOTime2,ZodISODuration:()=>ZodISODuration2,ZodISODateTime:()=>ZodISODateTime2,ZodISODate:()=>ZodISODate2,ZodIPv6:()=>ZodIPv62,ZodIPv4:()=>ZodIPv42,ZodGUID:()=>ZodGUID2,ZodFunction:()=>ZodFunction2,ZodFirstPartyTypeKind:()=>ZodFirstPartyTypeKind2,ZodFile:()=>ZodFile2,ZodError:()=>ZodError2,ZodEnum:()=>ZodEnum2,ZodEmoji:()=>ZodEmoji2,ZodEmail:()=>ZodEmail2,ZodE164:()=>ZodE1642,ZodDiscriminatedUnion:()=>ZodDiscriminatedUnion2,ZodDefault:()=>ZodDefault2,ZodDate:()=>ZodDate2,ZodCustomStringFormat:()=>ZodCustomStringFormat2,ZodCustom:()=>ZodCustom2,ZodCodec:()=>ZodCodec2,ZodCatch:()=>ZodCatch2,ZodCUID2:()=>ZodCUID22,ZodCUID:()=>ZodCUID3,ZodCIDRv6:()=>ZodCIDRv62,ZodCIDRv4:()=>ZodCIDRv42,ZodBoolean:()=>ZodBoolean2,ZodBigIntFormat:()=>ZodBigIntFormat2,ZodBigInt:()=>ZodBigInt2,ZodBase64URL:()=>ZodBase64URL2,ZodBase64:()=>ZodBase642,ZodArray:()=>ZodArray2,ZodAny:()=>ZodAny2,TimePrecision:()=>TimePrecision2,NEVER:()=>NEVER2,$output:()=>$output2,$input:()=>$input2,$brand:()=>$brand2});var init_external2=__esm(()=>{init_core5();init_core5();init_en2();init_core5();init_locales2();init_iso2();init_iso2();init_coerce2();init_schemas4();init_checks4();init_errors6();init_parse4();init_compat2();config2(en_default2())});var init_zod2=__esm(()=>{init_external2();init_external2()});function tool(input){return input}var init_tool=__esm(()=>{init_zod2();tool.schema=exports_external2});var init_dist=__esm(()=>{init_tool()});function classifyToolError(error93){let msg=(error93 instanceof Error?error93.message??"":String(error93)).toLowerCase();if(msg.includes("not registered")||msg.includes("unknown tool"))return"not_registered";if(msg.includes("not whitelisted")||msg.includes("not allowed"))return"not_whitelisted";if(msg.includes("enoent")||msg.includes("command not found")||msg.includes("binary not found")||msg.includes("no such file or directory"))return"binary_missing";return"execution_error"}function createSwarmTool(opts){return tool({description:opts.description,args:opts.args,execute:async(args2,ctx)=>{let directory=ctx?.directory??process.cwd();try{return await opts.execute(args2,directory,ctx)}catch(error93){let message=error93 instanceof Error?error93.message:String(error93);return JSON.stringify({success:!1,failure_class:classifyToolError(error93),message:"Tool execution failed",errors:[message]},null,2)}}})}var init_create_tool=__esm(()=>{init_dist()});var exports_checkpoint={};__export(exports_checkpoint,{saveCheckpointRecord:()=>saveCheckpointRecord,checkpoint:()=>checkpoint});import*as child_process3 from"node:child_process";import*as fs32 from"node:fs";import*as path63 from"node:path";function containsNonAsciiChars(label){for(let i=0;i<label.length;i++){let charCode=label.charCodeAt(i);if(charCode<32||charCode>126)return!0}return!1}function validateLabel(label){if(!label||label.length===0)return"label is required";if(label.length>MAX_LABEL_LENGTH)return`label exceeds maximum length of ${MAX_LABEL_LENGTH}`;if(label.startsWith("--"))return'label cannot start with "--" (git flag pattern)';if(CONTROL_CHAR_PATTERN.test(label))return"label contains control characters";if(NON_ASCII_PATTERN.test(label))return"label contains non-ASCII or invalid characters";if(containsNonAsciiChars(label))return"label contains non-ASCII characters (must be printable ASCII only)";if(SHELL_METACHARACTERS.test(label))return"label contains shell metacharacters";if(!SAFE_LABEL_PATTERN.test(label))return"label contains invalid characters (use alphanumeric, hyphen, underscore, space)";if(!/[a-zA-Z0-9_]/.test(label))return"label cannot be whitespace-only";if(label.includes("..")||label.includes("/")||label.includes("\\"))return"label contains path traversal sequence";return null}function getCheckpointLogPath(directory){return path63.join(directory,CHECKPOINT_LOG_PATH)}function readCheckpointLog(directory){let logPath=getCheckpointLogPath(directory);try{if(fs32.existsSync(logPath)){let content=fs32.readFileSync(logPath,"utf-8"),parsed=JSON.parse(content);if(!parsed.checkpoints||!Array.isArray(parsed.checkpoints))return{version:1,checkpoints:[]};return parsed}}catch{}return{version:1,checkpoints:[]}}function writeCheckpointLog(log2,directory){let logPath=getCheckpointLogPath(directory),dir=path63.dirname(logPath);if(!fs32.existsSync(dir))fs32.mkdirSync(dir,{recursive:!0});let tempPath=`${logPath}.tmp`;fs32.writeFileSync(tempPath,JSON.stringify(log2,null,2),"utf-8"),fs32.renameSync(tempPath,logPath)}function gitExec2(args2,cwd){for(let attempt=0;attempt<MAX_TRANSIENT_RETRIES;attempt++){let result=child_process3.spawnSync("git",args2,{cwd,encoding:"utf-8",timeout:GIT_TIMEOUT_MS3,stdio:["ignore","pipe","pipe"],windowsHide:!0,maxBuffer:GIT_MAX_BUFFER_BYTES2});if(result.error){let code=result.error.code,message=result.error.message??"";if(!(isTransientSpawnError(result.error)||/ETIMEDOUT|timed out/i.test(message))||attempt>=MAX_TRANSIENT_RETRIES-1)throw Error(`git failed to start: ${code??"unknown"} — ${message}`);transientBackoff(attempt);continue}if(result.status===0)return result.stdout??"";throw Error(result.stderr?.trim()||`git exited with code ${result.status}`)}throw Error("git command failed after transient retries")}function appendRetentionEvent(directory,event){try{let eventsPath=path63.join(directory,".swarm","events.jsonl"),line=`${JSON.stringify({...event,timestamp:new Date().toISOString()})}
730
738
  `;fs32.appendFileSync(eventsPath,line)}catch{}}function getCurrentSha(directory){return gitExec2(["rev-parse","HEAD"],directory).trim()}function isGitRepo2(directory){try{return gitExec2(["rev-parse","--git-dir"],directory),{isRepo:!0}}catch(e){let message=e instanceof Error?e.message:String(e);if(/ETIMEDOUT|timed out/i.test(message)&&!/not a git repository/i.test(message))return{isRepo:!1,warning:"git probe failed after retry exhaustion — treating as not a git repository"};return{isRepo:!1,warning:"git probe failed — directory may not be a git repository"}}}function handleSave(label,directory){try{let maxCheckpoints=20,allowEmptyCommits=!1;try{let{config:config3}=loadPluginConfigWithMeta(directory);maxCheckpoints=config3.checkpoint?.auto_checkpoint_threshold??maxCheckpoints,allowEmptyCommits=config3.checkpoint?.allow_empty_commits===!0}catch{}let log2=readCheckpointLog(directory);if(log2.checkpoints.find((c)=>c.label===label))return JSON.stringify({action:"save",success:!1,error:`duplicate label: "${label}" already exists. Use a different label or delete the existing checkpoint first.`},null,2);let timestamp=new Date().toISOString();if(gitExec2(["add","--all","--",":!.swarm/"],directory),(()=>{try{return gitExec2(["diff","--cached","--quiet"],directory),!1}catch{return!0}})())gitExec2(["commit","-m",`checkpoint: ${label}`],directory);else if(allowEmptyCommits)gitExec2(["commit","--allow-empty","-m",`checkpoint: ${label}`],directory);let newSha=getCurrentSha(directory);if(log2.checkpoints.push({label,sha:newSha,timestamp}),log2.checkpoints.length>maxCheckpoints){let evicted=log2.checkpoints.splice(0,log2.checkpoints.length-maxCheckpoints);try{appendRetentionEvent(directory,{event:"checkpoint_retention_applied",evicted_labels:evicted.map((e)=>e.label),evicted_count:evicted.length,remaining_count:log2.checkpoints.length})}catch{}}return writeCheckpointLog(log2,directory),JSON.stringify({action:"save",success:!0,label,sha:newSha,message:`Checkpoint saved: "${label}"`},null,2)}catch(e){let errorMessage2=e instanceof Error?`save failed: ${e.message}`:"save failed: unknown error";return JSON.stringify({action:"save",success:!1,error:errorMessage2},null,2)}}function saveCheckpointRecord(label,directory){let labelError=validateLabel(label);if(labelError)return{success:!1,error:labelError};try{let log2=readCheckpointLog(directory);if(log2.checkpoints.find((c)=>c.label===label))return{success:!1,error:`duplicate label: "${label}"`};let sha="";if(isGitRepo2(directory).isRepo)try{sha=getCurrentSha(directory)}catch{sha=""}log2.checkpoints.push({label,sha,timestamp:new Date().toISOString()}),writeCheckpointLog(log2,directory);let result={success:!0,sha};if(!sha)result.warning="no git restore target — checkpoint recorded without a SHA (directory may not be a git repository or HEAD is unavailable)";return result}catch(e){return{success:!1,error:e instanceof Error?e.message:"unknown error"}}}function handleRestore(label,directory){try{let log2=readCheckpointLog(directory),checkpoint=log2.checkpoints.find((c)=>c.label===label);if(!checkpoint)return JSON.stringify({action:"restore",success:!1,error:`checkpoint not found: "${label}"`},null,2);let logBeforeReset=log2;return gitExec2(["reset","--hard",checkpoint.sha],directory),writeCheckpointLog(logBeforeReset,directory),JSON.stringify({action:"restore",success:!0,label,sha:checkpoint.sha,message:`Restored to checkpoint: "${label}" (hard reset)`},null,2)}catch(e){let errorMessage2=e instanceof Error?`restore failed: ${e.message}`:"restore failed: unknown error";return JSON.stringify({action:"restore",success:!1,error:errorMessage2},null,2)}}function handleList(directory){let sorted=[...readCheckpointLog(directory).checkpoints].sort((a,b)=>b.timestamp.localeCompare(a.timestamp));return JSON.stringify({action:"list",success:!0,count:sorted.length,checkpoints:sorted},null,2)}function handleDelete(label,directory){try{let log2=readCheckpointLog(directory),initialLength=log2.checkpoints.length;if(log2.checkpoints=log2.checkpoints.filter((c)=>c.label!==label),log2.checkpoints.length===initialLength)return JSON.stringify({action:"delete",success:!1,error:`checkpoint not found: "${label}"`},null,2);return writeCheckpointLog(log2,directory),JSON.stringify({action:"delete",success:!0,label,message:`Checkpoint deleted: "${label}"`},null,2)}catch(e){let errorMessage2=e instanceof Error?`delete failed: ${e.message}`:"delete failed: unknown error";return JSON.stringify({action:"delete",success:!1,error:errorMessage2},null,2)}}var CHECKPOINT_LOG_PATH=".swarm/checkpoints.json",MAX_LABEL_LENGTH=100,GIT_TIMEOUT_MS3=30000,GIT_MAX_BUFFER_BYTES2=5242880,SHELL_METACHARACTERS,SAFE_LABEL_PATTERN,CONTROL_CHAR_PATTERN,NON_ASCII_PATTERN,checkpoint;var init_checkpoint=__esm(()=>{init_zod();init_config();init_create_tool();SHELL_METACHARACTERS=/[;|&$`(){}<>!'"]/,SAFE_LABEL_PATTERN=/^[a-zA-Z0-9_ -]+$/,CONTROL_CHAR_PATTERN=/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/,NON_ASCII_PATTERN=/[^\x20-\x7E]/;checkpoint=createSwarmTool({description:"Save, restore, list, and delete git checkpoints. Use save to create a named snapshot, restore to return tracked files to a checkpoint, list to see all checkpoints, and delete to remove a checkpoint from the log. Git commits are preserved on delete.",args:{action:exports_external.string().describe("Action to perform: save, restore, list, or delete"),label:exports_external.string().optional().describe("Checkpoint label (required for save, restore, delete)")},execute:async(args2,directory)=>{let repoProbe=isGitRepo2(directory);if(!repoProbe.isRepo)return JSON.stringify({action:"unknown",success:!1,error:`${repoProbe.warning??"not a git repository"} — checkpoint tools require a git repository`},null,2);let action,label;try{action=String(args2.action),label=args2.label!==void 0&&args2.label!==null?String(args2.label):void 0}catch{return JSON.stringify({action:"unknown",success:!1,error:"invalid arguments"},null,2)}let validActions=["save","restore","list","delete"];if(!validActions.includes(action))return JSON.stringify({action,success:!1,error:`invalid action: "${action}". Valid actions: ${validActions.join(", ")}`},null,2);if(["save","restore","delete"].includes(action)){if(!label)return JSON.stringify({action,success:!1,error:`label is required for ${action} action`},null,2);let labelError=validateLabel(label);if(labelError)return JSON.stringify({action,success:!1,error:`invalid label: ${labelError}`},null,2)}switch(action){case"save":return handleSave(label,directory);case"restore":return handleRestore(label,directory);case"list":return handleList(directory);case"delete":return handleDelete(label,directory);default:return JSON.stringify({action,success:!1,error:"unreachable"},null,2)}}})});function safeParseResult(result){let jsonStr=typeof result==="string"?result:result.output,parsed=CheckpointResultSchema.safeParse(JSON.parse(jsonStr));if(!parsed.success)return{success:!1,error:`Invalid response: ${parsed.error.message}`};return parsed.data}async function handleCheckpointCommand(directory,args2){let subcommand=args2[0]||"list",label=args2[1];switch(subcommand){case"save":return handleSave2(directory,label);case"restore":return handleRestore2(directory,label);case"delete":return handleDelete2(directory,label);default:return handleList2(directory)}}async function handleSave2(directory,label){if(!label)return"Error: Label required. Usage: `/swarm checkpoint save <label>`";try{let result=await checkpoint.execute({action:"save",label},{directory}),parsed=safeParseResult(result);if(parsed.success)return`✓ Checkpoint saved: "${label}"`;else return`Error: ${parsed.error||"Failed to save checkpoint"}`}catch(error93){return`Error: ${error93 instanceof Error?error93.message:String(error93)}`}}async function handleRestore2(directory,label){if(!label)return"Error: Label required. Usage: `/swarm checkpoint restore <label>`";try{let result=await checkpoint.execute({action:"restore",label},{directory}),parsed=safeParseResult(result);if(parsed.success)return`✓ Restored to checkpoint: "${label}"`;else return`Error: ${parsed.error||"Failed to restore checkpoint"}`}catch(error93){return`Error: ${error93 instanceof Error?error93.message:String(error93)}`}}async function handleDelete2(directory,label){if(!label)return"Error: Label required. Usage: `/swarm checkpoint delete <label>`";try{let result=await checkpoint.execute({action:"delete",label},{directory}),parsed=safeParseResult(result);if(parsed.success)return`✓ Checkpoint deleted: "${label}"`;else return`Error: ${parsed.error||"Failed to delete checkpoint"}`}catch(error93){return`Error: ${error93 instanceof Error?error93.message:String(error93)}`}}async function handleList2(directory){try{let result=await checkpoint.execute({action:"list"},{directory}),parsed=safeParseResult(result);if(!parsed.success)return`Error: ${parsed.error||"Failed to list checkpoints"}`;let checkpoints=parsed.checkpoints||[];if(checkpoints.length===0)return"No checkpoints found. Create one with `/swarm checkpoint save <label>`";return["## Checkpoints","",...checkpoints.map((c)=>`- "${c.label}" — ${new Date(c.timestamp).toLocaleString()}`),"","Commands:","- `/swarm checkpoint save <label>` — Create checkpoint","- `/swarm checkpoint restore <label>` — Restore checkpoint","- `/swarm checkpoint delete <label>` — Delete checkpoint"].join(`
731
- `)}catch(error93){return`Error: ${error93 instanceof Error?error93.message:String(error93)}`}}var CheckpointResultSchema;var init_checkpoint2=__esm(()=>{init_zod();init_checkpoint();CheckpointResultSchema=exports_external.object({action:exports_external.string().optional(),success:exports_external.boolean(),error:exports_external.string().optional(),checkpoints:exports_external.array(exports_external.unknown()).optional()}).passthrough()});import*as child_process4 from"node:child_process";function sanitizeUrl(raw){let urlStr=raw.trim();urlStr=urlStr.replace(/\[\s*MODE\s*:[^\]]*\]/gi,"");let fragmentIdx=urlStr.indexOf("#");if(fragmentIdx!==-1)urlStr=urlStr.slice(0,fragmentIdx);let queryIdx=urlStr.indexOf("?");if(queryIdx!==-1)urlStr=urlStr.slice(0,queryIdx);if(urlStr=urlStr.replace(/^[A-Za-z][A-Za-z0-9+.-]*:\/\/[^@/]+@/,"https://"),urlStr.length>MAX_URL_LEN)urlStr=urlStr.slice(0,MAX_URL_LEN);return urlStr.trim()}function sanitizeErrorEcho(raw,maxLength=80){let stripped="";for(let ch of raw){let cp2=ch.codePointAt(0);if(cp2!==void 0&&(cp2<=31||cp2===127)){stripped+=" ";continue}stripped+=ch}let collapsed=stripped.replace(/\s+/g," ").trim();if(collapsed.length<=maxLength)return collapsed;return`${collapsed.slice(0,maxLength)}…`}function containsControlCharacters(value){for(let ch of value){let cp2=ch.codePointAt(0);if(cp2!==void 0&&(cp2<=31||cp2===127))return!0}return!1}function hasNonAsciiHostname(hostname5){for(let ch of hostname5){let cp2=ch.codePointAt(0);if(cp2!==void 0&&cp2>127)return!0}return!1}function isIpv4MappedPrivateHost(inner){if(IPV4_PRIVATE.test(inner)||IPV4_LOOPBACK.test(inner)||IPV4_LINK_LOCAL.test(inner)||IPV4_PRIVATE_172.test(inner)||IPV4_PRIVATE_192.test(inner)||IPV4_ZERO_NETWORK.test(inner))return!0;let firstSegment=inner.split(":",1)[0];if(!firstSegment)return!1;let firstWord=Number.parseInt(firstSegment,16);if(!Number.isFinite(firstWord))return!1;return firstWord>=0&&firstWord<=255||firstWord>=2560&&firstWord<=2815||firstWord>=32512&&firstWord<=32767||firstWord===43518||firstWord>=44048&&firstWord<=44063||firstWord===49320}function isPrivateHost(url3){let host=url3.hostname.toLowerCase().replace(/^\[|\]$/g,"");if(host==="localhost"||host==="::1"||host==="0.0.0.0"||IPV4_LOOPBACK.test(host)||IPV4_ZERO_NETWORK.test(host))return!0;if(host.startsWith("localhost")||host==="localhost.com")return!0;if(IPV4_PRIVATE.test(host)||IPV4_LINK_LOCAL.test(host)||IPV4_PRIVATE_172.test(host)||IPV4_PRIVATE_192.test(host)||IPV6_LINK_LOCAL.test(host)||IPV6_UNIQUE_LOCAL.test(host))return!0;if(host.startsWith("::ffff:")){let inner=host.slice(7);if(isIpv4MappedPrivateHost(inner))return!0}return!1}function validateAndSanitizeGithubUrl(rawUrl,resource){let sanitized=sanitizeUrl(rawUrl);if(!sanitized)return{error:"Empty URL"};if(!sanitized.startsWith("https://"))return{error:"URL must use HTTPS scheme"};try{let url3=new URL(sanitized);if(hasNonAsciiHostname(url3.hostname))return{error:"Non-ASCII hostnames are not allowed"};if(isPrivateHost(url3))return{error:"Private or localhost URLs are not allowed"};if(!new RegExp(`^https:\\/\\/github\\.com\\/([^/]+)\\/([^/]+)\\/${resource}\\/([0-9]+)\\/?$`).test(sanitized))return{error:resource==="issues"?"URL must be a GitHub issue URL (https://github.com/owner/repo/issues/N)":"URL must be a GitHub pull request URL (https://github.com/owner/repo/pull/N)"};return{sanitized}}catch{return{error:"Invalid URL format"}}}function detectGitRemote(cwd,laneEnv){try{let result=_internals32.spawnSync("git",["remote","get-url","origin"],{encoding:"utf-8",stdio:["ignore","pipe","pipe"],timeout:5000,...cwd?{cwd}:{},envOverrides:laneEnv});if(result.status!==0||result.error)return null;return(result.stdout??"").trim()||null}catch{return null}}function parseGitRemoteUrl(remoteUrl){let httpsMatch=remoteUrl.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?\/?$/i);if(httpsMatch){let owner=httpsMatch[1],repo=httpsMatch[2].replace(/\.git$/,"");if(containsControlCharacters(owner)||containsControlCharacters(repo))return null;return{owner,repo}}let sshMatch=remoteUrl.match(/^git@github\.com:([^/]+)\/([^/]+?)(?:\.git)?$/i);if(sshMatch){let owner=sshMatch[1],repo=sshMatch[2].replace(/\.git$/,"");if(containsControlCharacters(owner)||containsControlCharacters(repo))return null;return{owner,repo}}let pathMatch=remoteUrl.match(/\/([^/]+)\/([^/]+?)(?:\.git)?\/?$/);if(pathMatch){let owner=pathMatch[1],repo=pathMatch[2].replace(/\.git$/,"");if(containsControlCharacters(owner)||containsControlCharacters(repo))return null;return{owner,repo}}return null}var MAX_URL_LEN=2048,IPV4_PRIVATE,IPV4_LOOPBACK,IPV4_LINK_LOCAL,IPV4_PRIVATE_172,IPV4_PRIVATE_192,IPV4_ZERO_NETWORK,IPV6_LINK_LOCAL,IPV6_UNIQUE_LOCAL,_internals32;var init_url_security=__esm(()=>{init_bun_compat();IPV4_PRIVATE=/^10\./,IPV4_LOOPBACK=/^127\./,IPV4_LINK_LOCAL=/^169\.254\./,IPV4_PRIVATE_172=/^172\.(1[6-9]|2\d|3[0-1])\./,IPV4_PRIVATE_192=/^192\.168\./,IPV4_ZERO_NETWORK=/^0\./,IPV6_LINK_LOCAL=/^fe80:/i,IPV6_UNIQUE_LOCAL=/^f[cd][0-9a-f]{2}:/i,_internals32={spawnSync:(cmd,args2,options)=>{let mergedEnv=mergeEnvForChild(options?.env,options?.envOverrides);return child_process4.spawnSync(cmd,args2,{...options,env:mergedEnv})}}});function sanitizeInstructions(raw){let normalized=raw.replace(/\s+/g," ").trim().replace(/\[\s*MODE\s*:[^\]]*\]/gi,"").replace(/\s+/g," ").trim();if(normalized.length<=MAX_INSTRUCTIONS_LEN)return normalized;return`${normalized.slice(0,MAX_INSTRUCTIONS_LEN)}…`}function validateAndSanitizeUrl(rawUrl){return validateAndSanitizeGithubUrl(rawUrl,"pull")}function parsePrRef(input,cwd){let urlMatch=input.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/pull\/(\d+)\/?$/i);if(urlMatch){if(containsControlCharacters(urlMatch[1])||containsControlCharacters(urlMatch[2]))return null;return{owner:urlMatch[1],repo:urlMatch[2],number:parseInt(urlMatch[3],10)}}let shorthandMatch=input.match(/^([^/]+)\/([^#]+)#(\d+)$/);if(shorthandMatch){if(containsControlCharacters(shorthandMatch[1])||containsControlCharacters(shorthandMatch[2]))return null;return{owner:shorthandMatch[1],repo:shorthandMatch[2],number:parseInt(shorthandMatch[3],10)}}let bareMatch=input.match(/^(\d+)$/);if(bareMatch){let prNumber=parseInt(bareMatch[1],10),remoteUrl=detectGitRemote(cwd,void 0);if(!remoteUrl)return null;let parsed=parseGitRemoteUrl(remoteUrl);if(!parsed)return null;return{owner:parsed.owner,repo:parsed.repo,number:prNumber}}return null}function looksLikePrRef(token){return/^https?:\/\//i.test(token)||/^[^/]+\/[^#]+#\d+$/.test(token)||/^\d+$/.test(token)}function resolvePrCommandInput(rest,cwd){if(rest.length===0)return null;let refToken=rest[0],instructions=sanitizeInstructions(rest.slice(1).join(" ")),isFullUrl=/^https?:\/\//i.test(refToken),prInfo=parsePrRef(isFullUrl?sanitizeUrl(refToken):refToken,cwd);if(!prInfo)return{error:`Could not parse PR reference from "${sanitizeErrorEcho(refToken)}"`};let prUrl=`https://github.com/${prInfo.owner}/${prInfo.repo}/pull/${prInfo.number}`,result=validateAndSanitizeUrl(prUrl);if("error"in result)return{error:result.error};return{prUrl:result.sanitized,instructions}}var MAX_INSTRUCTIONS_LEN=1000;var init_pr_ref=__esm(()=>{init_url_security()});function handleCiMonitorCommand(directory,args2){let rest=args2.filter((token)=>token.trim().length>0),resolved=resolvePrCommandInput(rest,directory);if(resolved===null)return USAGE;if("error"in resolved)return`Error: ${resolved.error}
739
+ `)}catch(error93){return`Error: ${error93 instanceof Error?error93.message:String(error93)}`}}var CheckpointResultSchema;var init_checkpoint2=__esm(()=>{init_zod();init_checkpoint();CheckpointResultSchema=exports_external.object({action:exports_external.string().optional(),success:exports_external.boolean(),error:exports_external.string().optional(),checkpoints:exports_external.array(exports_external.unknown()).optional()}).passthrough()});import*as child_process4 from"node:child_process";function sanitizeUrl(raw){let urlStr=raw.trim();urlStr=urlStr.replace(/\[\s*MODE\s*:[^\]]*\]/gi,"");let fragmentIdx=urlStr.indexOf("#");if(fragmentIdx!==-1)urlStr=urlStr.slice(0,fragmentIdx);let queryIdx=urlStr.indexOf("?");if(queryIdx!==-1)urlStr=urlStr.slice(0,queryIdx);if(urlStr=urlStr.replace(/^[A-Za-z][A-Za-z0-9+.-]*:\/\/[^@/]+@/,"https://"),urlStr.length>MAX_URL_LEN)urlStr=urlStr.slice(0,MAX_URL_LEN);return urlStr.trim()}function sanitizeErrorEcho(raw,maxLength=80){let stripped="";for(let ch of raw){let cp2=ch.codePointAt(0);if(cp2!==void 0&&(cp2<=31||cp2===127)){stripped+=" ";continue}stripped+=ch}let collapsed=stripped.replace(/\s+/g," ").trim();if(collapsed.length<=maxLength)return collapsed;return`${collapsed.slice(0,maxLength)}…`}function containsControlCharacters(value){for(let ch of value){let cp2=ch.codePointAt(0);if(cp2!==void 0&&(cp2<=31||cp2===127))return!0}return!1}function hasNonAsciiHostname(hostname5){for(let ch of hostname5){let cp2=ch.codePointAt(0);if(cp2!==void 0&&cp2>127)return!0}return!1}function isIpv4MappedPrivateHost(inner){if(IPV4_PRIVATE.test(inner)||IPV4_LOOPBACK.test(inner)||IPV4_LINK_LOCAL.test(inner)||IPV4_PRIVATE_172.test(inner)||IPV4_PRIVATE_192.test(inner)||IPV4_ZERO_NETWORK.test(inner))return!0;let firstSegment=inner.split(":",1)[0];if(!firstSegment)return!1;let firstWord=Number.parseInt(firstSegment,16);if(!Number.isFinite(firstWord))return!1;return firstWord>=0&&firstWord<=255||firstWord>=2560&&firstWord<=2815||firstWord>=32512&&firstWord<=32767||firstWord===43518||firstWord>=44048&&firstWord<=44063||firstWord===49320}function isPrivateHost(url3){let host=url3.hostname.toLowerCase().replace(/^\[|\]$/g,"");if(host==="localhost"||host==="::1"||host==="0.0.0.0"||IPV4_LOOPBACK.test(host)||IPV4_ZERO_NETWORK.test(host))return!0;if(host.startsWith("localhost")||host==="localhost.com")return!0;if(IPV4_PRIVATE.test(host)||IPV4_LINK_LOCAL.test(host)||IPV4_PRIVATE_172.test(host)||IPV4_PRIVATE_192.test(host)||IPV6_LINK_LOCAL.test(host)||IPV6_UNIQUE_LOCAL.test(host))return!0;if(host.startsWith("::ffff:")){let inner=host.slice(7);if(isIpv4MappedPrivateHost(inner))return!0}return!1}function validateAndSanitizeGithubUrl(rawUrl,resource){let sanitized=sanitizeUrl(rawUrl);if(!sanitized)return{error:"Empty URL"};if(!sanitized.startsWith("https://"))return{error:"URL must use HTTPS scheme"};try{let url3=new URL(sanitized);if(hasNonAsciiHostname(url3.hostname))return{error:"Non-ASCII hostnames are not allowed"};if(isPrivateHost(url3))return{error:"Private or localhost URLs are not allowed"};if(!new RegExp(`^https:\\/\\/github\\.com\\/([^/]+)\\/([^/]+)\\/${resource}\\/([0-9]+)\\/?$`).test(sanitized))return{error:resource==="issues"?"URL must be a GitHub issue URL (https://github.com/owner/repo/issues/N)":"URL must be a GitHub pull request URL (https://github.com/owner/repo/pull/N)"};return{sanitized}}catch{return{error:"Invalid URL format"}}}function detectGitRemote(cwd,laneEnv){try{let result=_internals32.spawnSync("git",["remote","get-url","origin"],{encoding:"utf-8",stdio:["ignore","pipe","pipe"],timeout:5000,...cwd?{cwd}:{},envOverrides:laneEnv});if(result.status!==0||result.error)return null;return(result.stdout??"").trim()||null}catch{return null}}function parseGitRemoteUrl(remoteUrl){let httpsMatch=remoteUrl.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?\/?$/i);if(httpsMatch){let owner=httpsMatch[1],repo=httpsMatch[2].replace(/\.git$/,"");if(containsControlCharacters(owner)||containsControlCharacters(repo))return null;return{owner,repo}}let sshMatch=remoteUrl.match(/^git@github\.com:([^/]+)\/([^/]+?)(?:\.git)?$/i);if(sshMatch){let owner=sshMatch[1],repo=sshMatch[2].replace(/\.git$/,"");if(containsControlCharacters(owner)||containsControlCharacters(repo))return null;return{owner,repo}}let pathMatch=remoteUrl.match(/\/([^/]+)\/([^/]+?)(?:\.git)?\/?$/);if(pathMatch){let owner=pathMatch[1],repo=pathMatch[2].replace(/\.git$/,"");if(containsControlCharacters(owner)||containsControlCharacters(repo))return null;return{owner,repo}}return null}var MAX_URL_LEN=2048,IPV4_PRIVATE,IPV4_LOOPBACK,IPV4_LINK_LOCAL,IPV4_PRIVATE_172,IPV4_PRIVATE_192,IPV4_ZERO_NETWORK,IPV6_LINK_LOCAL,IPV6_UNIQUE_LOCAL,_internals32;var init_url_security=__esm(()=>{init_bun_compat();IPV4_PRIVATE=/^10\./,IPV4_LOOPBACK=/^127\./,IPV4_LINK_LOCAL=/^169\.254\./,IPV4_PRIVATE_172=/^172\.(1[6-9]|2\d|3[0-1])\./,IPV4_PRIVATE_192=/^192\.168\./,IPV4_ZERO_NETWORK=/^0\./,IPV6_LINK_LOCAL=/^fe80:/i,IPV6_UNIQUE_LOCAL=/^f[cd][0-9a-f]{2}:/i,_internals32={spawnSync:(cmd,args2,options)=>{let mergedEnv=mergeEnvForChild(options?.env,options?.envOverrides);return child_process4.spawnSync(cmd,args2,{...options,env:mergedEnv})}}});function sanitizeInstructions(raw){let normalized=raw.replace(/\s+/g," ").trim().replace(/\[\s*MODE\s*:[^\]]*\]/gi,"").replace(/\s+/g," ").trim();if(normalized.length<=MAX_INSTRUCTIONS_LEN)return normalized;return`${normalized.slice(0,MAX_INSTRUCTIONS_LEN)}…`}function validateAndSanitizeUrl(rawUrl){return validateAndSanitizeGithubUrl(rawUrl,"pull")}function parsePrRef(input,cwd){let urlMatch=input.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/pull\/(\d+)\/?$/i);if(urlMatch){if(containsControlCharacters(urlMatch[1])||containsControlCharacters(urlMatch[2]))return null;return{owner:urlMatch[1],repo:urlMatch[2],number:parseInt(urlMatch[3],10)}}let shorthandMatch=input.match(/^([^/]+)\/([^#]+)#(\d+)$/);if(shorthandMatch){if(containsControlCharacters(shorthandMatch[1])||containsControlCharacters(shorthandMatch[2]))return null;return{owner:shorthandMatch[1],repo:shorthandMatch[2],number:parseInt(shorthandMatch[3],10)}}let bareMatch=input.match(/^(\d+)$/);if(bareMatch){let prNumber=parseInt(bareMatch[1],10),remoteUrl=detectGitRemote(cwd,void 0);if(!remoteUrl)return null;let parsed=parseGitRemoteUrl(remoteUrl);if(!parsed)return null;return{owner:parsed.owner,repo:parsed.repo,number:prNumber}}return null}function looksLikePrRef(token){return/^https?:\/\//i.test(token)||/^[^/]+\/[^#]+#\d+$/.test(token)||/^\d+$/.test(token)}function resolvePrCommandInput(rest,cwd){if(rest.length===0)return null;let refToken=rest[0],instructions=sanitizeInstructions(rest.slice(1).join(" ")),isFullUrl=/^https?:\/\//i.test(refToken),prInfo=parsePrRef(isFullUrl?sanitizeUrl(refToken):refToken,cwd);if(!prInfo)return{error:`Could not parse PR reference from "${sanitizeErrorEcho(refToken)}"`};let prUrl=`https://github.com/${prInfo.owner}/${prInfo.repo}/pull/${prInfo.number}`,result=validateAndSanitizeUrl(prUrl);if("error"in result)return{error:result.error};return{prUrl:result.sanitized,instructions}}var MAX_INSTRUCTIONS_LEN=1000;var init_pr_ref=__esm(()=>{init_url_security()});function handleCiMonitorCommand(directory,args2){let rest=args2.filter((token)=>token.trim().length>0),resolved=resolvePrCommandInput(rest,directory);if(resolved===null)return USAGE2;if("error"in resolved)return`Error: ${resolved.error}
732
740
 
733
- ${USAGE}`;if(resolved.instructions)return`Error: /swarm ci-monitor takes only a PR reference — no trailing instructions. Got: "${resolved.instructions}"
741
+ ${USAGE2}`;if(resolved.instructions)return`Error: /swarm ci-monitor takes only a PR reference — no trailing instructions. Got: "${resolved.instructions}"
734
742
 
735
- ${USAGE}`;return`[MODE: CI_MONITOR pr="${resolved.prUrl}"]`}var USAGE;var init_ci_monitor=__esm(()=>{init_pr_ref();USAGE=["Usage: /swarm ci-monitor <pr-url|owner/repo#N|N>","","Drive an already human-reviewed, approved pull request to green and","merged: monitors CI, exhaustively researches and fixes each failure,","iterates until all required checks are green (max 5 fix cycles), then","merges. Only invoke after human review is complete.",""," /swarm ci-monitor https://github.com/owner/repo/pull/42"," /swarm ci-monitor owner/repo#42"," /swarm ci-monitor 42"].join(`
743
+ ${USAGE2}`;return`[MODE: CI_MONITOR pr="${resolved.prUrl}"]`}var USAGE2;var init_ci_monitor=__esm(()=>{init_pr_ref();USAGE2=["Usage: /swarm ci-monitor <pr-url|owner/repo#N|N>","","Drive an already human-reviewed, approved pull request to green and","merged: monitors CI, exhaustively researches and fixes each failure,","iterates until all required checks are green (max 5 fix cycles), then","merges. Only invoke after human review is complete.",""," /swarm ci-monitor https://github.com/owner/repo/pull/42"," /swarm ci-monitor owner/repo#42"," /swarm ci-monitor 42"].join(`
736
744
  `)});import*as fs33 from"node:fs";import*as path64 from"node:path";function isExecutableFile(candidate){try{return fs33.statSync(candidate).isFile()}catch{return!1}}function resolveExecutableFromPath(names,envPath=process.env.PATH??"",platform=process.platform){let pathEntries=envPath.split(path64.delimiter).filter(Boolean),isWindows=platform==="win32";for(let rawName of names){if(!rawName)continue;if(path64.isAbsolute(rawName)&&isExecutableFile(rawName))return rawName;let extensions=isWindows&&path64.extname(rawName)===""?DEFAULT_WINDOWS_EXTENSIONS:[""];for(let dir of pathEntries)for(let ext of extensions){let candidate=path64.join(dir,`${rawName}${ext}`);if(isExecutableFile(candidate))return candidate}}return null}async function readBoundedStream(stream,maxBytes){let reader=stream.getReader(),lockReleased=!1,releaseLock=()=>{if(lockReleased)return;lockReleased=!0;try{reader.releaseLock()}catch{}},cancelAndRelease=async()=>{try{await reader.cancel()}catch{}finally{releaseLock()}};if(maxBytes<=0)return await cancelAndRelease(),{text:"",truncated:!0};let chunks=[],total=0,truncated=!1;try{for(;;){let{done,value}=await reader.read();if(done)break;if(!value)continue;let remaining=maxBytes-total;if(value.byteLength>remaining){if(remaining>0)chunks.push(value.slice(0,remaining)),total+=remaining;truncated=!0,await cancelAndRelease();break}chunks.push(value),total+=value.byteLength}}finally{releaseLock()}let out=new Uint8Array(total),offset=0;for(let chunk of chunks)out.set(chunk,offset),offset+=chunk.byteLength;return{text:new TextDecoder().decode(out),truncated}}function timeoutKillSignal(platform){return platform==="win32"?"SIGTERM":"SIGKILL"}function killProcess(proc){try{proc?.kill(timeoutKillSignal(_internals33.platform()))}catch{}}async function runExternalTool(options){if(!path64.isAbsolute(options.cwd))return{status:"spawn-error",exitCode:null,stdout:"",stderr:"",stdoutTruncated:!1,stderrTruncated:!1,message:"external tool cwd must be absolute"};if(options.abortSignal?.aborted)return{status:"cancelled",exitCode:null,stdout:"",stderr:"",stdoutTruncated:!1,stderrTruncated:!1,message:"external tool execution cancelled before spawn"};let proc,timeoutHandle,abortListener,exitSettled=!1,settledExitCode=null;try{proc=_internals33.bunSpawn([options.executable,...options.args],{cwd:options.cwd,env:options.env,stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:options.timeoutMs});let exitPromise=proc.exited.then((exitCode)=>{return exitSettled=!0,settledExitCode=exitCode,{kind:"exit",exitCode}}),timeout=new Promise((resolve31)=>{timeoutHandle=setTimeout(()=>{if(exitSettled){resolve31({kind:"exit",exitCode:settledExitCode??proc?.exitCode??0});return}killProcess(proc),resolve31({kind:"timeout"})},options.timeoutMs)}),cancelled=new Promise((resolve31)=>{if(!options.abortSignal)return;let handled=!1;if(abortListener=()=>{if(handled)return;handled=!0,killProcess(proc),resolve31({kind:"cancelled"})},options.abortSignal.addEventListener("abort",abortListener,{once:!0}),options.abortSignal.aborted)abortListener()}),stdoutPromise=readBoundedStream(proc.stdout,options.maxStdoutBytes),stderrPromise=readBoundedStream(proc.stderr,options.maxStderrBytes),exitResult=await Promise.race([exitPromise,timeout,cancelled]);if(exitResult.kind==="timeout")return{status:"timeout",exitCode:proc.exitCode,stdout:"",stderr:"",stdoutTruncated:!1,stderrTruncated:!1};if(exitResult.kind==="cancelled")return{status:"cancelled",exitCode:proc.exitCode,stdout:"",stderr:"",stdoutTruncated:!1,stderrTruncated:!1,message:"external tool execution cancelled"};let[stdout,stderr]=await Promise.all([stdoutPromise,stderrPromise]);return{status:"completed",exitCode:exitResult.exitCode,stdout:stdout.text,stderr:stderr.text,stdoutTruncated:stdout.truncated,stderrTruncated:stderr.truncated}}catch(err){return{status:"spawn-error",exitCode:proc?.exitCode??null,stdout:"",stderr:"",stdoutTruncated:!1,stderrTruncated:!1,message:err instanceof Error?err.message:String(err)}}finally{if(timeoutHandle!==void 0)clearTimeout(timeoutHandle);if(abortListener&&options.abortSignal)options.abortSignal.removeEventListener("abort",abortListener);if(proc)try{proc.kill()}catch{}}}var DEFAULT_WINDOWS_EXTENSIONS,_internals33;var init_external_tool_runner=__esm(()=>{init_bun_compat();DEFAULT_WINDOWS_EXTENSIONS=[".exe",".cmd",".bat"];_internals33={bunSpawn,platform:()=>process.platform}});import*as fs34 from"node:fs";import*as fsPromises6 from"node:fs/promises";import*as os14 from"node:os";import*as path65 from"node:path";async function runGit4(args2,cwd,timeoutMs=GIT_TIMEOUT_MS4){let result=await _internals34.runExternalTool({executable:"git",args:args2,cwd,timeoutMs,maxStdoutBytes:OUTPUT_LIMIT_BYTES,maxStderrBytes:OUTPUT_LIMIT_BYTES});return{exitCode:result.exitCode??1,stdout:result.message?[result.message,result.stdout].filter(Boolean).join(`
737
745
  `):result.stdout,stderr:result.stderr,outputTruncated:result.stdoutTruncated||result.stderrTruncated}}async function runValidationCommand(cmd,cwd,timeoutMs=VALIDATION_TIMEOUT_MS){let[executable,...args2]=cmd,result=await _internals34.runExternalTool({executable,args:args2,cwd,timeoutMs,maxStdoutBytes:OUTPUT_LIMIT_BYTES,maxStderrBytes:OUTPUT_LIMIT_BYTES});return{exitCode:result.exitCode??1,stdout:result.message?[result.message,result.stdout].filter(Boolean).join(`
738
746
  `):result.stdout,stderr:result.stderr,outputTruncated:result.stdoutTruncated||result.stderrTruncated}}function isSafeGitRef(ref){return ref.length>0&&ref.length<=255&&/^[A-Za-z0-9][A-Za-z0-9._/@-]*$/.test(ref)&&!ref.includes("..")&&!ref.includes("//")&&!ref.includes("@{")&&!ref.endsWith(".")}async function getCurrentBranchOrRef(directory){let result=await runGit4(["branch","--show-current"],directory);if(result.exitCode===0&&result.stdout.trim())return result.stdout.trim();return(await runGit4(["rev-parse","HEAD"],directory)).stdout.trim()}async function setupWorktree(projectRoot,prRef,baseBranch,onWorktreeCreated){let worktreeBase=path65.join(_internals34.osTmpdir(),"swarm-ci-simulate"),worktreeName=`pr-${Date.now()}-${Math.floor(Math.random()*1e6)}`,worktreePath=path65.join(worktreeBase,worktreeName);await fsPromises6.mkdir(worktreeBase,{recursive:!0});let addResult=await runGit4(["worktree","add","--detach",worktreePath,baseBranch],projectRoot);if(addResult.exitCode!==0)throw Error(`Failed to create worktree: ${addResult.stderr.trim()||addResult.stdout.trim()}`);onWorktreeCreated(worktreePath);let mergeResult=await runGit4(["merge","--no-ff","--no-edit","--",prRef],worktreePath,GIT_TIMEOUT_MS4*2);if(mergeResult.exitCode!==0)throw Error(`Merge failed for '${prRef}': ${mergeResult.stderr.trim()||mergeResult.stdout.trim()}`);return worktreePath}async function cleanupWorktree(worktreePath,projectRoot){let removeResult=await runGit4(["worktree","remove","--force",worktreePath],projectRoot);try{if(_internals34.fs.existsSync(worktreePath))_internals34.fs.rmSync(worktreePath,{recursive:!0,force:!0})}catch{}if(removeResult.exitCode!==0)log(`[ci-simulate] git worktree remove failed: ${removeResult.stderr.trim()||removeResult.stdout.trim()}`)}async function runValidationSuite(worktreePath){let steps=[],commands=[{step:"typecheck",cmd:["bun","run","typecheck"]},{step:"lint",cmd:["bun","run","lint"]},{step:"build",cmd:["bun","run","build"]},{step:"test",cmd:["bun","test"]}];for(let{step,cmd}of commands){let start=Date.now(),result=await runValidationCommand(cmd,worktreePath),durationMs=Date.now()-start;steps.push({step,command:cmd.join(" "),exitCode:result.exitCode,stdout:result.stdout,stderr:result.stderr,durationMs,outputTruncated:result.outputTruncated})}return steps}function formatStepOutput(stdout,stderr,outputTruncated,maxLength=2000){let output=stdout;if(stderr)output+=output?`
@@ -741,11 +749,11 @@ ${stderr}`:stderr;if(output.length>maxLength)output=`${output.slice(0,maxLength)
741
749
  ... (child output truncated to bounded limit)`;return output}function extractFileLineReferences(output){let lines=[],patterns=[/([A-Za-z]:[\\/])?[^\s:]+\.(ts|tsx|js|jsx):(\d+):(\d+)/g,/(?:error|Error|FAIL|Failed)[:\s]+([^\s]+\.(ts|tsx|js|jsx)?:?:\d+)/gi,/FAIL\s+([^\s]+\.(test|spec)\.(ts|tsx|js|jsx))/gi];for(let pattern of patterns){let matches=Array.from(output.matchAll(pattern));for(let match of matches)if(match[0])lines.push(match[0])}return Array.from(new Set(lines))}async function handleCiSimulateCommand(directory,args2){let prRef=args2[0]??await getCurrentBranchOrRef(directory);if(!isSafeGitRef(prRef))return"CI simulation failed: PR ref must be a safe git branch or commit reference.";let lines=[];lines.push("# CI Simulation Report"),lines.push(""),lines.push(`PR ref: **${prRef}**`),lines.push(`Started: ${new Date().toISOString()}`),lines.push("");let worktreePath,result={success:!1,worktreePath:"",steps:[]};try{let baseBranch=_internals34.getDefaultBaseBranch(directory);if(!isSafeGitRef(baseBranch))throw Error("Detected default branch is not a safe git reference.");lines.push("## Setup"),lines.push(""),lines.push(`Creating temporary worktree from ${baseBranch}...`),worktreePath=await setupWorktree(directory,prRef,baseBranch,(createdPath)=>{worktreePath=createdPath}),result.worktreePath=worktreePath,lines.push(`Worktree: \`${worktreePath}\``),lines.push("");let lastCommit=(await runGit4(["log","--oneline","-1","--format=%s"],worktreePath)).stdout.trim();lines.push(`Last commit in worktree: \`${lastCommit}\``),lines.push(""),lines.push("## Validation Suite"),lines.push(""),result.steps=await runValidationSuite(worktreePath);for(let step of result.steps){let status=step.exitCode===0?"✅ PASS":"❌ FAIL";if(lines.push(`### ${status}: ${step.step}`),lines.push(""),lines.push(`Command: \`${step.command}\``),lines.push(`Duration: ${(step.durationMs/1000).toFixed(1)}s`),step.exitCode!==0){lines.push(`Exit code: ${step.exitCode}`);let fileRefs=extractFileLineReferences(`${step.stdout}
742
750
  ${step.stderr}`);if(fileRefs.length>0){lines.push(""),lines.push("**Failure locations:**");for(let ref of fileRefs.slice(0,20))lines.push(` - \`${ref}\``)}lines.push(""),lines.push("**Output:**"),lines.push("```"),lines.push(formatStepOutput(step.stdout,step.stderr,step.outputTruncated)),lines.push("```")}lines.push("")}let allPassed=result.steps.every((s)=>s.exitCode===0);result.success=allPassed,lines.push("## Summary"),lines.push("");let passed=result.steps.filter((s)=>s.exitCode===0).length,failed=result.steps.filter((s)=>s.exitCode!==0).length;if(lines.push(`Validation: ${passed}/${result.steps.length} steps passed, ${failed} failed`),lines.push(""),allPassed)lines.push("✅ **All checks passed — CI simulation succeeded**");else{lines.push("❌ **CI simulation failed — these failures would cause a merge-queue kick-out**"),lines.push(""),lines.push("To reproduce locally, run in the worktree:"),lines.push("```bash"),lines.push(`cd "${worktreePath}"`);for(let step of result.steps.filter((s)=>s.exitCode!==0))lines.push(`# ${step.step}: ${step.command}`);lines.push("```")}}catch(err){let errMsg=err instanceof Error?err.message:String(err);result.error=errMsg,lines.push(""),lines.push("## Error"),lines.push(""),lines.push("```"),lines.push(errMsg),lines.push("```")}finally{if(worktreePath)lines.push(""),lines.push("---"),lines.push(""),lines.push("*Cleaning up temporary worktree...*"),await cleanupWorktree(worktreePath,directory),lines.push(`Worktree removed: \`${worktreePath}\``)}return lines.join(`
743
751
  `)}var GIT_TIMEOUT_MS4=30000,VALIDATION_TIMEOUT_MS=300000,OUTPUT_LIMIT_BYTES=12000,_internals34;var init_ci_simulate=__esm(()=>{init_branch();init_external_tool_runner();init_logger();_internals34={runExternalTool,getDefaultBaseBranch,platform:process.platform,osTmpdir:()=>os14.tmpdir(),fs:{existsSync:fs34.existsSync,rmSync:fs34.rmSync}}});async function handleClarifyCommand(_directory,args2){let description=args2.join(" ").trim();if(description)return`[MODE: CLARIFY-SPEC] ${description}`;return"[MODE: CLARIFY-SPEC] Please enter MODE: CLARIFY-SPEC and clarify the existing spec."}function isAbortError(err){if(typeof err!=="object"||err===null)return!1;let name=err.name;return name==="AbortError"||name==="TimeoutError"}var exports_curator_llm_factory={};__export(exports_curator_llm_factory,{createCuratorLLMDelegate:()=>createCuratorLLMDelegate});function resolveCuratorAgentName(mode,sessionId){let suffix={init:"curator_init",phase:"curator_phase",postmortem:"curator_postmortem",consolidation:"curator_consolidation"}[mode],registeredNames={init:swarmState.curatorInitAgentNames,phase:swarmState.curatorPhaseAgentNames,postmortem:swarmState.curatorPostmortemAgentNames,consolidation:swarmState.curatorConsolidationAgentNames}[mode];if(registeredNames.length===1)return registeredNames[0];if(registeredNames.length===0)return suffix;let prefixMap=new Map;for(let name of registeredNames){let prefix=name.endsWith(suffix)?name.slice(0,name.length-suffix.length):"";prefixMap.set(prefix,name)}let matchForAgent=(agentName)=>{let bestPrefix="",bestName="";for(let[prefix,name]of prefixMap)if(prefix&&agentName.startsWith(prefix)){if(prefix.length>bestPrefix.length)bestPrefix=prefix,bestName=name}return bestName};if(sessionId){let callingAgent=swarmState.activeAgent.get(sessionId);if(callingAgent){let match=matchForAgent(callingAgent);if(match)return match;let defaultCurator=prefixMap.get("");if(defaultCurator)return defaultCurator}}for(let activeAgentName of swarmState.activeAgent.values()){let match=matchForAgent(activeAgentName);if(match)return match}return prefixMap.get("")??registeredNames[0]}function createCuratorLLMDelegate(directory,mode="init",sessionId){let client=swarmState.opencodeClient;if(!client)return;return async(_systemPrompt,userInput,signal)=>{let ephemeralSessionId,cleanup=()=>{if(ephemeralSessionId){let id=ephemeralSessionId;ephemeralSessionId=void 0,client.session.delete({path:{id}}).catch(()=>{})}};if(signal?.aborted)throw Error("CURATOR_LLM_TIMEOUT");let sdkOpts=signal?{signal}:{};try{let createResult=await client.session.create({...sessionId?{body:{parentID:sessionId,title:`curator_${mode} background`}}:{},query:{directory},...sdkOpts});if(!createResult.data)throw Error(`Failed to create curator session: ${JSON.stringify(createResult.error)}`);if(ephemeralSessionId=createResult.data.id,signal?.aborted)throw Error("CURATOR_LLM_TIMEOUT");let agentName=resolveCuratorAgentName(mode,sessionId),promptResult=await client.session.prompt({path:{id:ephemeralSessionId},body:{agent:agentName,tools:{write:!1,edit:!1,patch:!1},parts:[{type:"text",text:userInput}]},...sdkOpts});if(!promptResult.data)throw Error(`Curator LLM prompt failed: ${JSON.stringify(promptResult.error)}`);return promptResult.data.parts.filter((p)=>p.type==="text").map((p)=>p.text).join(`
744
- `)}catch(err){if(isAbortError(err))throw Error("CURATOR_LLM_TIMEOUT");throw err}finally{cleanup()}}}var init_curator_llm_factory=__esm(()=>{init_state2()});import*as os15 from"node:os";import*as path66 from"node:path";function resolveHiveDataDir(){let platform=process.platform,home=process.env.HOME||os15.homedir();if(platform==="win32")return path66.join(process.env.LOCALAPPDATA||path66.join(home,"AppData","Local"),"opencode-swarm","Data");if(platform==="darwin")return path66.join(home,"Library","Application Support","opencode-swarm");return path66.join(process.env.XDG_DATA_HOME||path66.join(home,".local","share"),"opencode-swarm")}function resolveHiveKnowledgePath(){return path66.join(resolveHiveDataDir(),"shared-learnings.jsonl")}function resolveHiveRejectedPath(){return path66.join(resolveHiveDataDir(),"shared-learnings-rejected.jsonl")}function resolveHiveEventsPath(){return path66.join(resolveHiveDataDir(),"shared-knowledge-events.jsonl")}var init_hive_paths=()=>{};function isActiveSwarmKnowledgeEntry(entry){return isActiveStatus(entry.status)}function findActiveSwarmNearDuplicate(lesson,entries,threshold){return findNearDuplicate(lesson,entries.filter(isActiveSwarmKnowledgeEntry),threshold)}function distinctPhaseCount(records){let phases=new Set;for(let record3 of records??[])if(Number.isInteger(record3.phase_number))phases.add(record3.phase_number);return phases.size}function reinforceSwarmKnowledgeEntry(entry,confirmation){if(!isActiveSwarmKnowledgeEntry(entry))return{entryId:entry.id,reinforced:!1,reason:"inactive"};if((entry.confirmed_by??[]).some((record3)=>record3.phase_number===confirmation.phase_number))return{entryId:entry.id,reinforced:!1,reason:"already_confirmed_phase"};return entry.confirmed_by=[...entry.confirmed_by??[],confirmation],entry.updated_at=confirmation.confirmed_at,entry.phases_alive=0,entry.confidence=computeConfidence(distinctPhaseCount(entry.confirmed_by),entry.auto_generated??!1),{entryId:entry.id,reinforced:!0,reason:"reinforced"}}var init_knowledge_reinforcement=__esm(()=>{init_knowledge_store();init_knowledge_types()});var exports_knowledge_events={};__export(exports_knowledge_events,{resolveLegacyApplicationLogPath:()=>resolveLegacyApplicationLogPath,resolveKnowledgeEventsPath:()=>resolveKnowledgeEventsPath,resolveKnowledgeCounterBaselinePath:()=>resolveKnowledgeCounterBaselinePath,resolveHiveEventsPath:()=>resolveHiveEventsPath2,recordKnowledgeEvent:()=>recordKnowledgeEvent,recordHiveKnowledgeEvent:()=>recordHiveKnowledgeEvent,recomputeCounters:()=>recomputeCounters,readLegacyApplicationRecords:()=>readLegacyApplicationRecords,readKnowledgeEvents:()=>readKnowledgeEvents,readKnowledgeCounterRollups:()=>readKnowledgeCounterRollups,readHiveKnowledgeEvents:()=>readHiveKnowledgeEvents,newTraceId:()=>newTraceId,newEventId:()=>newEventId,effectiveRetrievalOutcomes:()=>effectiveRetrievalOutcomes,countViolationsInWindow:()=>countViolationsInWindow,countEntryViolationsInWindow:()=>countEntryViolationsInWindow,countEntryContradictionsInWindow:()=>countEntryContradictionsInWindow,countEmptyTraceTerminals:()=>countEmptyTraceTerminals,applyKnowledgeVerdictFeedback:()=>applyKnowledgeVerdictFeedback,appendKnowledgeEvent:()=>appendKnowledgeEvent,appendHiveKnowledgeEvent:()=>appendHiveKnowledgeEvent,_internals:()=>_internals35,RECEIPT_EVENT_TYPES:()=>RECEIPT_EVENT_TYPES,MAX_VIOLATION_TIMESTAMPS:()=>MAX_VIOLATION_TIMESTAMPS,MAX_EVENT_LOG_ENTRIES:()=>MAX_EVENT_LOG_ENTRIES,KNOWLEDGE_EVENT_SCHEMA_VERSION:()=>KNOWLEDGE_EVENT_SCHEMA_VERSION});import{randomUUID as randomUUID6}from"node:crypto";import{existsSync as existsSync28}from"node:fs";import{appendFile as appendFile5,mkdir as mkdir11,readFile as readFile14,stat as stat9}from"node:fs/promises";import*as path67 from"node:path";function resolveKnowledgeEventsPath(directory){return path67.join(resolveKnowledgeStoreDir(directory),"knowledge-events.jsonl")}function resolveKnowledgeCounterBaselinePath(directory){return path67.join(resolveKnowledgeStoreDir(directory),"knowledge-counter-baseline.json")}function resolveLegacyApplicationLogPath(directory){return path67.join(resolveKnowledgeStoreDir(directory),"knowledge-application.jsonl")}function newTraceId(){return randomUUID6()}function newEventId(){return randomUUID6()}function withDefaults(event){return{schema_version:KNOWLEDGE_EVENT_SCHEMA_VERSION,...event,event_id:event.event_id||newEventId(),timestamp:event.timestamp||new Date().toISOString()}}async function appendKnowledgeEvent(directory,event){let populated=withDefaults(event),filePath=resolveKnowledgeEventsPath(directory),dirPath=path67.dirname(filePath);await mkdir11(dirPath,{recursive:!0});let release;try{release=await import_proper_lockfile3.default.lock(dirPath,{retries:{retries:200,minTimeout:10,maxTimeout:100}}),await appendFile5(filePath,`${JSON.stringify(populated)}
752
+ `)}catch(err){if(isAbortError(err))throw Error("CURATOR_LLM_TIMEOUT");throw err}finally{cleanup()}}}var init_curator_llm_factory=__esm(()=>{init_state2()});import*as os15 from"node:os";import*as path66 from"node:path";function resolveHiveDataDir(){let platform=process.platform,home=process.env.HOME||os15.homedir();if(platform==="win32")return path66.join(process.env.LOCALAPPDATA||path66.join(home,"AppData","Local"),"opencode-swarm","Data");if(platform==="darwin")return path66.join(home,"Library","Application Support","opencode-swarm");return path66.join(process.env.XDG_DATA_HOME||path66.join(home,".local","share"),"opencode-swarm")}function resolveHiveKnowledgePath(){return path66.join(resolveHiveDataDir(),"shared-learnings.jsonl")}function resolveHiveRejectedPath(){return path66.join(resolveHiveDataDir(),"shared-learnings-rejected.jsonl")}function resolveHiveEventsPath(){return path66.join(resolveHiveDataDir(),"shared-knowledge-events.jsonl")}var init_hive_paths=()=>{};function isActiveSwarmKnowledgeEntry(entry){return isActiveStatus(entry.status)}function findActiveSwarmNearDuplicate(lesson,entries,threshold){return findNearDuplicate(lesson,entries.filter(isActiveSwarmKnowledgeEntry),threshold)}function distinctPhaseCount(records){let phases=new Set;for(let record3 of records??[])if(Number.isInteger(record3.phase_number))phases.add(record3.phase_number);return phases.size}function reinforceSwarmKnowledgeEntry(entry,confirmation){if(!isActiveSwarmKnowledgeEntry(entry))return{entryId:entry.id,reinforced:!1,reason:"inactive"};if((entry.confirmed_by??[]).some((record3)=>record3.phase_number===confirmation.phase_number))return{entryId:entry.id,reinforced:!1,reason:"already_confirmed_phase"};return entry.confirmed_by=[...entry.confirmed_by??[],confirmation],entry.updated_at=confirmation.confirmed_at,entry.phases_alive=0,entry.confidence=computeConfidence(distinctPhaseCount(entry.confirmed_by),entry.auto_generated??!1),{entryId:entry.id,reinforced:!0,reason:"reinforced"}}var init_knowledge_reinforcement=__esm(()=>{init_knowledge_store();init_knowledge_types()});var exports_knowledge_events={};__export(exports_knowledge_events,{resolveLegacyApplicationLogPath:()=>resolveLegacyApplicationLogPath,resolveKnowledgeEventsPath:()=>resolveKnowledgeEventsPath,resolveKnowledgeCounterBaselinePath:()=>resolveKnowledgeCounterBaselinePath,resolveHiveEventsPath:()=>resolveHiveEventsPath2,recordKnowledgeEvent:()=>recordKnowledgeEvent,recordHiveKnowledgeEvent:()=>recordHiveKnowledgeEvent,recomputeCounters:()=>recomputeCounters,readLegacyApplicationRecords:()=>readLegacyApplicationRecords,readKnowledgeEvents:()=>readKnowledgeEvents,readKnowledgeCounterRollups:()=>readKnowledgeCounterRollups,readHiveKnowledgeEvents:()=>readHiveKnowledgeEvents,newTraceId:()=>newTraceId,newEventId:()=>newEventId,effectiveRetrievalOutcomes:()=>effectiveRetrievalOutcomes,countViolationsInWindow:()=>countViolationsInWindow,countEntryViolationsInWindow:()=>countEntryViolationsInWindow,countEntryContradictionsInWindow:()=>countEntryContradictionsInWindow,countEmptyTraceTerminals:()=>countEmptyTraceTerminals,applyKnowledgeVerdictFeedback:()=>applyKnowledgeVerdictFeedback,appendKnowledgeEvent:()=>appendKnowledgeEvent,appendHiveKnowledgeEvent:()=>appendHiveKnowledgeEvent,_internals:()=>_internals35,RECEIPT_EVENT_TYPES:()=>RECEIPT_EVENT_TYPES,MAX_VIOLATION_TIMESTAMPS:()=>MAX_VIOLATION_TIMESTAMPS,MAX_EVENT_LOG_ENTRIES:()=>MAX_EVENT_LOG_ENTRIES,KNOWLEDGE_EVENT_SCHEMA_VERSION:()=>KNOWLEDGE_EVENT_SCHEMA_VERSION});import{randomUUID as randomUUID6}from"node:crypto";import{existsSync as existsSync28}from"node:fs";import{appendFile as appendFile6,mkdir as mkdir11,readFile as readFile14,stat as stat9}from"node:fs/promises";import*as path67 from"node:path";function resolveKnowledgeEventsPath(directory){return path67.join(resolveKnowledgeStoreDir(directory),"knowledge-events.jsonl")}function resolveKnowledgeCounterBaselinePath(directory){return path67.join(resolveKnowledgeStoreDir(directory),"knowledge-counter-baseline.json")}function resolveLegacyApplicationLogPath(directory){return path67.join(resolveKnowledgeStoreDir(directory),"knowledge-application.jsonl")}function newTraceId(){return randomUUID6()}function newEventId(){return randomUUID6()}function withDefaults(event){return{schema_version:KNOWLEDGE_EVENT_SCHEMA_VERSION,...event,event_id:event.event_id||newEventId(),timestamp:event.timestamp||new Date().toISOString()}}async function appendKnowledgeEvent(directory,event){let populated=withDefaults(event),filePath=resolveKnowledgeEventsPath(directory),dirPath=path67.dirname(filePath);await mkdir11(dirPath,{recursive:!0});let release;try{release=await import_proper_lockfile3.default.lock(dirPath,{retries:{retries:200,minTimeout:10,maxTimeout:100}}),await appendFile6(filePath,`${JSON.stringify(populated)}
745
753
  `,"utf-8");try{let lines=(await readFile14(filePath,"utf-8")).split(`
746
754
  `).filter((line)=>line.trim().length>0);if(lines.length>MAX_EVENT_LOG_ENTRIES){let evicted=lines.slice(0,lines.length-MAX_EVENT_LOG_ENTRIES),trimmed=lines.slice(lines.length-MAX_EVENT_LOG_ENTRIES);await foldEvictedEventsIntoBaseline(directory,evicted,filePath),await atomicWriteFile(filePath,`${trimmed.join(`
747
755
  `)}
748
- `)}}catch(err){warn(`[knowledge-events] local cap trim failed (non-fatal): ${err instanceof Error?err.message:String(err)}`)}}finally{if(release)await release().catch(()=>{})}return populated}async function recordKnowledgeEvent(directory,event){try{return await appendKnowledgeEvent(directory,event)}catch(err){return warn(`[knowledge-events] recordKnowledgeEvent failed: ${err instanceof Error?err.message:String(err)}`),null}}async function appendHiveKnowledgeEvent(event){let populated=withDefaults(event),filePath=resolveHiveEventsPath2(),dirPath=path67.dirname(filePath);await mkdir11(dirPath,{recursive:!0});let release;try{release=await import_proper_lockfile3.default.lock(dirPath,{retries:{retries:200,minTimeout:10,maxTimeout:100},stale:5000}),await appendFile5(filePath,`${JSON.stringify(populated)}
756
+ `)}}catch(err){warn(`[knowledge-events] local cap trim failed (non-fatal): ${err instanceof Error?err.message:String(err)}`)}}finally{if(release)await release().catch(()=>{})}return populated}async function recordKnowledgeEvent(directory,event){try{return await appendKnowledgeEvent(directory,event)}catch(err){return warn(`[knowledge-events] recordKnowledgeEvent failed: ${err instanceof Error?err.message:String(err)}`),null}}async function appendHiveKnowledgeEvent(event){let populated=withDefaults(event),filePath=resolveHiveEventsPath2(),dirPath=path67.dirname(filePath);await mkdir11(dirPath,{recursive:!0});let release;try{release=await import_proper_lockfile3.default.lock(dirPath,{retries:{retries:200,minTimeout:10,maxTimeout:100},stale:5000}),await appendFile6(filePath,`${JSON.stringify(populated)}
749
757
  `,"utf-8");try{let lines=(await readFile14(filePath,"utf-8")).split(`
750
758
  `).filter((line)=>line.trim().length>0);if(lines.length>MAX_EVENT_LOG_ENTRIES){let trimmed=lines.slice(lines.length-MAX_EVENT_LOG_ENTRIES);await atomicWriteFile(filePath,`${trimmed.join(`
751
759
  `)}
@@ -754,25 +762,25 @@ ${step.stderr}`);if(fileRefs.length>0){lines.push(""),lines.push("**Failure loca
754
762
  `),filePath)}async function readLegacyApplicationRecords(directory){let filePath=resolveLegacyApplicationLogPath(directory);if(!existsSync28(filePath))return[];let content=await readFile14(filePath,"utf-8"),out=[];for(let line of content.split(`
755
763
  `)){let trimmed=line.trim();if(!trimmed)continue;try{out.push(JSON.parse(trimmed))}catch{warn(`[knowledge-events] Skipping corrupted JSONL line in ${filePath}: ${trimmed.slice(0,80)}`)}}return out}function emptyRollup(){return{shown_count:0,acknowledged_count:0,applied_explicit_count:0,ignored_count:0,violated_count:0,contradicted_count:0,n_a_count:0,succeeded_after_shown_count:0,failed_after_shown_count:0,partial_after_shown_count:0,violation_timestamps:[]}}function cloneRollup(input){return{...emptyRollup(),...input,violation_timestamps:[...input.violation_timestamps??[]]}}function cloneRollupMap(input){let out=new Map;for(let[id,rollup]of input)out.set(id,cloneRollup(rollup));return out}function normalizeRollupTimestamps(rollup){if(rollup.violation_timestamps.length>1)rollup.violation_timestamps.sort((a,b)=>a<b?1:a>b?-1:0);if(rollup.violation_timestamps.length>MAX_VIOLATION_TIMESTAMPS)rollup.violation_timestamps=rollup.violation_timestamps.slice(0,MAX_VIOLATION_TIMESTAMPS);return rollup}function mergeRollupInto(target,source){if(target.shown_count+=source.shown_count??0,target.acknowledged_count+=source.acknowledged_count??0,target.applied_explicit_count+=source.applied_explicit_count??0,target.ignored_count+=source.ignored_count??0,target.violated_count+=source.violated_count??0,target.contradicted_count+=source.contradicted_count??0,target.n_a_count+=source.n_a_count??0,target.succeeded_after_shown_count+=source.succeeded_after_shown_count??0,target.failed_after_shown_count+=source.failed_after_shown_count??0,target.partial_after_shown_count+=source.partial_after_shown_count??0,source.last_applied_at)target.last_applied_at=maxIso(target.last_applied_at,source.last_applied_at);if(source.last_acknowledged_at)target.last_acknowledged_at=maxIso(target.last_acknowledged_at,source.last_acknowledged_at);target.violation_timestamps.push(...source.violation_timestamps??[]),normalizeRollupTimestamps(target)}function get(map3,id){let r=map3.get(id);if(!r)r=emptyRollup(),map3.set(id,r);return r}function maxIso(current,candidate){if(!current)return candidate;return candidate>current?candidate:current}async function readCounterBaseline(directory){let filePath=resolveKnowledgeCounterBaselinePath(directory);if(!existsSync28(filePath))return new Map;let raw;try{raw=JSON.parse(await readFile14(filePath,"utf-8"))}catch(err){return warn(`[knowledge-events] corrupted counter baseline at ${filePath}; ignoring folded baseline and replaying live events only: ${err instanceof Error?err.message:String(err)}`),new Map}let map3=new Map;for(let[id,rollup]of Object.entries(raw))map3.set(id,normalizeRollupTimestamps(cloneRollup(rollup)));return map3}async function writeCounterBaseline(directory,baseline){let filePath=resolveKnowledgeCounterBaselinePath(directory),out={};for(let[id,rollup]of[...baseline.entries()].sort(([a],[b])=>a.localeCompare(b)))out[id]=normalizeRollupTimestamps(cloneRollup(rollup));await atomicWriteFile(filePath,`${JSON.stringify(out,null,2)}
756
764
  `)}async function statCacheKey(filePath){try{let fileStat=await stat9(filePath);return`${fileStat.mtimeMs}:${fileStat.ctimeMs}:${fileStat.size}`}catch(err){if(err?.code==="ENOENT")return"missing";throw err}}async function buildCounterRollupCacheKey(directory){let[eventsKey,legacyKey,baselineKey]=await Promise.all([statCacheKey(resolveKnowledgeEventsPath(directory)),statCacheKey(resolveLegacyApplicationLogPath(directory)),statCacheKey(resolveKnowledgeCounterBaselinePath(directory))]);return`${eventsKey}|${legacyKey}|${baselineKey}`}function setCounterRollupCache(directory,key,rollups){if(counterRollupCache.has(directory))counterRollupCache.delete(directory);counterRollupCache.set(directory,{key,rollups:cloneRollupMap(rollups)});while(counterRollupCache.size>MAX_COUNTER_ROLLUP_CACHE_DIRS){let oldestKey=counterRollupCache.keys().next().value;if(oldestKey===void 0)break;counterRollupCache.delete(oldestKey)}}function parseEventLines(lines,filePath){let out=[];for(let line of lines){let trimmed=line.trim();if(!trimmed)continue;try{out.push(JSON.parse(trimmed))}catch{warn(`[knowledge-events] Skipping corrupted JSONL line in ${filePath}: ${trimmed.slice(0,80)}`)}}return out}async function foldEvictedEventsIntoBaseline(directory,evictedLines,filePath){let evictedEvents=parseEventLines(evictedLines,filePath);if(evictedEvents.length===0)return;let baseline=await readCounterBaseline(directory);for(let[id,rollup]of recomputeCounters(evictedEvents))mergeRollupInto(get(baseline,id),rollup);await writeCounterBaseline(directory,baseline)}function recomputeCounters(events,legacyRecords=[],baseline=new Map){let map3=new Map,retrievedIds=new Set;for(let[id,rollup]of baseline)if(map3.set(id,cloneRollup(rollup)),(rollup.shown_count??0)>0)retrievedIds.add(id);for(let e of events)switch(e.type){case"retrieved":{for(let id of e.result_ids)retrievedIds.add(id),get(map3,id).shown_count+=1;break}case"acknowledged":{if(!e.knowledge_id)break;let r=get(map3,e.knowledge_id);r.acknowledged_count+=1,r.last_acknowledged_at=maxIso(r.last_acknowledged_at,e.timestamp);break}case"applied":{if(!e.knowledge_id)break;let r=get(map3,e.knowledge_id);r.applied_explicit_count+=1,r.last_applied_at=maxIso(r.last_applied_at,e.timestamp);break}case"ignored":if(!e.knowledge_id)break;get(map3,e.knowledge_id).ignored_count+=1;break;case"violated":{if(!e.knowledge_id)break;let r=get(map3,e.knowledge_id);r.violated_count+=1,r.violation_timestamps.push(e.timestamp);break}case"contradicted":if(!e.knowledge_id)break;get(map3,e.knowledge_id).contradicted_count+=1;break;case"n_a":if(!e.knowledge_id)break;get(map3,e.knowledge_id).n_a_count+=1;break;case"no_relevant":break;case"outcome":{if(!e.knowledge_id)break;let r=get(map3,e.knowledge_id);if(e.outcome==="success")r.succeeded_after_shown_count+=1;else if(e.outcome==="failure")r.failed_after_shown_count+=1;else if(e.outcome==="partial")r.partial_after_shown_count+=1;break}}for(let rec of legacyRecords){let r=get(map3,rec.knowledgeId);switch(rec.result){case"shown":if(!retrievedIds.has(rec.knowledgeId))r.shown_count+=1;break;case"acknowledged":r.acknowledged_count+=1,r.last_acknowledged_at=maxIso(r.last_acknowledged_at,rec.timestamp);break;case"applied":r.applied_explicit_count+=1,r.last_applied_at=maxIso(r.last_applied_at,rec.timestamp);break;case"ignored":r.ignored_count+=1;break;case"violated":r.violated_count+=1,r.violation_timestamps.push(rec.timestamp);break}}for(let r of map3.values())normalizeRollupTimestamps(r);return map3}function countViolationsInWindow(timestamps,windowDays,now=new Date){let cutoff=now.getTime()-windowDays*24*60*60*1000,count=0;for(let ts of timestamps){let t=Date.parse(ts);if(!Number.isNaN(t)&&t>=cutoff)count+=1}return count}function countEmptyTraceTerminals(events){let n=0;for(let e of events)if(e.type==="no_relevant")n+=1;return n}async function countEntryViolationsInWindow(directory,entryId,windowDays,now=new Date){try{let cutoff=now.getTime()-windowDays*24*60*60*1000,[events,legacyRecords]=await Promise.all([readKnowledgeEvents(directory),readLegacyApplicationRecords(directory)]),count=0;for(let e of events){if(e.type!=="violated"||e.knowledge_id!==entryId)continue;let t=Date.parse(e.timestamp);if(!Number.isNaN(t)&&t>=cutoff)count+=1}for(let rec of legacyRecords){if(rec.result!=="violated"||rec.knowledgeId!==entryId)continue;let t=Date.parse(rec.timestamp);if(!Number.isNaN(t)&&t>=cutoff)count+=1}return count}catch{return 0}}async function countEntryContradictionsInWindow(directory,entryId,windowDays,now=new Date){try{let cutoff=now.getTime()-windowDays*24*60*60*1000,events=await readKnowledgeEvents(directory),count=0;for(let e of events){if(e.type!=="contradicted"||e.knowledge_id!==entryId)continue;let t=Date.parse(e.timestamp);if(!Number.isNaN(t)&&t>=cutoff)count+=1}return count}catch{return 0}}async function readKnowledgeCounterRollups(directory){try{let cacheKey=await buildCounterRollupCacheKey(directory),cached3=counterRollupCache.get(directory);if(cached3?.key===cacheKey)return counterRollupCache.delete(directory),counterRollupCache.set(directory,cached3),cloneRollupMap(cached3.rollups);let[events,legacyRecords,baseline]=await Promise.all([readKnowledgeEvents(directory),readLegacyApplicationRecords(directory),readCounterBaseline(directory)]),rollups=recomputeCounters(events,legacyRecords,baseline);return setCounterRollupCache(directory,cacheKey,rollups),cloneRollupMap(rollups)}catch(err){return warn(`[knowledge-events] readKnowledgeCounterRollups failed: ${err instanceof Error?err.message:String(err)}`),new Map}}function effectiveRetrievalOutcomes(stored,rollup){let base=stored??{applied_count:0,succeeded_after_count:0,failed_after_count:0};if(!rollup)return base;let{n_a_count:_na,...rollupWithoutNa}=rollup;return{...base,...rollupWithoutNa,succeeded_after_shown_count:(base.succeeded_after_shown_count??0)+(rollup.succeeded_after_shown_count??0),failed_after_shown_count:(base.failed_after_shown_count??0)+(rollup.failed_after_shown_count??0)}}async function applyKnowledgeVerdictFeedback(directory,options){try{let events=await readKnowledgeEvents(directory),markerIndex=options?.sinceTimestamp&&options.sinceEventId?events.findIndex((e)=>e.timestamp===options.sinceTimestamp&&e.event_id===options.sinceEventId):-1,actionable=events.filter((e,index)=>{if(e.type!=="applied"&&e.type!=="violated"&&e.type!=="ignored")return!1;if(options?.sinceTimestamp&&e.timestamp<options.sinceTimestamp)return!1;if(options?.sinceTimestamp&&e.timestamp===options.sinceTimestamp){if(!options.sinceEventId)return!1;if(markerIndex<0)return!1;return index>markerIndex}return!0});if(actionable.length===0)return{processed:0,bumps:0};let groups=new Map,lastProcessedTimestamp,lastProcessedEventId;for(let event of actionable){if(typeof event.timestamp==="string"&&(!lastProcessedTimestamp||event.timestamp>=lastProcessedTimestamp))lastProcessedTimestamp=event.timestamp,lastProcessedEventId=event.event_id;let kid=event.knowledge_id;if(!kid)continue;let g=groups.get(kid)??{applied:0,violated:0,ignored:0};if(event.type==="applied")g.applied++;else if(event.type==="violated")g.violated++;else if(event.type==="ignored")g.ignored++;groups.set(kid,g)}let deltas=[];for(let[id,counts]of groups){let positives=counts.applied,negatives=counts.violated+counts.ignored;if(positives===0&&negatives===0)continue;let delta=positives>negatives?VERDICT_CONFIDENCE_BOOST:-VERDICT_CONFIDENCE_DECAY;deltas.push({id,delta})}if(deltas.length>0){let{bumpKnowledgeConfidenceBatch}=await Promise.resolve().then(() => (init_knowledge_store(),exports_knowledge_store));await bumpKnowledgeConfidenceBatch(directory,deltas,options?.floorOptions)}return{processed:groups.size,bumps:deltas.length,lastProcessedTimestamp,lastProcessedEventId}}catch(err){return warn(`[knowledge-events] applyKnowledgeVerdictFeedback failed (fail-open): ${err instanceof Error?err.message:String(err)}`),{processed:0,bumps:0}}}var import_proper_lockfile3,KNOWLEDGE_EVENT_SCHEMA_VERSION=1,MAX_EVENT_LOG_ENTRIES=5000,counterRollupCache,MAX_COUNTER_ROLLUP_CACHE_DIRS=32,RECEIPT_EVENT_TYPES,resolveHiveEventsPath2,MAX_VIOLATION_TIMESTAMPS=10,VERDICT_CONFIDENCE_BOOST=0.03,VERDICT_CONFIDENCE_DECAY=0.05,_internals35;var init_knowledge_events=__esm(()=>{init_task_file();init_hive_paths();init_logger();init_knowledge_link();import_proper_lockfile3=__toESM(require_proper_lockfile(),1),counterRollupCache=new Map,RECEIPT_EVENT_TYPES=new Set(["acknowledged","applied","ignored","contradicted","violated","n_a","override","no_relevant"]);resolveHiveEventsPath2=resolveHiveEventsPath;_internals35={resolveKnowledgeEventsPath,resolveKnowledgeCounterBaselinePath,appendKnowledgeEvent,recordKnowledgeEvent,readKnowledgeEvents,readCounterBaseline,readLegacyApplicationRecords,readKnowledgeCounterRollups,effectiveRetrievalOutcomes,recomputeCounters,applyKnowledgeVerdictFeedback,newTraceId,newEventId,resolveHiveEventsPath:resolveHiveEventsPath2,appendHiveKnowledgeEvent,recordHiveKnowledgeEvent,readHiveKnowledgeEvents,mergeRollupInto}});var exports_config_fingerprint={};__export(exports_config_fingerprint,{cohortConfigFingerprint:()=>cohortConfigFingerprint,_internals:()=>_internals36});import{createHash as createHash16}from"node:crypto";function cohortConfigFingerprint(input){let canonical=JSON.stringify(sortKeys(input));return createHash16("sha256").update(canonical).digest("hex").slice(0,12)}function sortKeys(value){if(Array.isArray(value))return value.map(sortKeys);if(value&&typeof value==="object"){let obj=value,out={};for(let key of Object.keys(obj).sort())out[key]=sortKeys(obj[key]);return out}return value}var _internals36;var init_config_fingerprint=__esm(()=>{_internals36={cohortConfigFingerprint,sortKeys}});import{randomUUID as randomUUID7}from"node:crypto";import{existsSync as existsSync29}from"node:fs";import{mkdir as mkdir12,readFile as readFile15,writeFile as writeFile8}from"node:fs/promises";import*as path68 from"node:path";function readValidatedId(raw){let parsed=JSON.parse(raw);if(parsed&&typeof parsed.worktree_id==="string"&&UUID_RE.test(parsed.worktree_id))return parsed.worktree_id;return}async function resolveWorktreeId(directory){let dir=path68.normalize(path68.resolve(directory,".swarm")),idPath=path68.join(dir,WORKTREE_ID_FILENAME),repairInvalidFile=!1;try{if(_internals37.existsSync(idPath)){let raw=await _internals37.readFile(idPath,"utf-8"),validated=readValidatedId(raw);if(validated!==void 0)return validated;repairInvalidFile=!0}}catch{}let newId=_internals37.randomUUID();try{await _internals37.mkdir(dir,{recursive:!0});let record3={worktree_id:newId,created_at:new Date().toISOString()},payload=`${JSON.stringify(record3,null,2)}
757
- `;if(repairInvalidFile)await _internals37.writeFile(idPath,payload,{encoding:"utf-8",flag:"w"});else try{await _internals37.writeFile(idPath,payload,{encoding:"utf-8",flag:"wx"})}catch(err){if(err?.code==="EEXIST"||_internals37.existsSync(idPath)){let raw=await _internals37.readFile(idPath,"utf-8"),validated=readValidatedId(raw);if(validated!==void 0)return validated}throw err}}catch{}return newId}var WORKTREE_ID_FILENAME="worktree-id.json",UUID_RE,_internals37;var init_worktree_identity=__esm(()=>{UUID_RE=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;_internals37={readFile:readFile15,writeFile:writeFile8,existsSync:existsSync29,mkdir:mkdir12,randomUUID:randomUUID7}});var exports_curation_policy={};__export(exports_curation_policy,{readCohortConfigFingerprint:()=>readCohortConfigFingerprint,buildConfigFingerprintInput:()=>buildConfigFingerprintInput,authorizeCuration:()=>authorizeCuration,_internals:()=>_internals38});import{appendFile as appendFile6,mkdir as mkdir13,readFile as readFile16}from"node:fs/promises";import*as path69 from"node:path";async function authorizeCuration(input,context,quorum=DEFAULT_QUORUM){let{directory,action,entryId}=input,proposal={entryId,action,reason:input.reason,evidenceScope:input.evidenceScope,proposedAt:new Date().toISOString(),status:"pending"},persistProposal=(p)=>{queueMicrotask(async()=>{try{let storeDir=_internals38.resolveKnowledgeStoreDir(directory);await mkdir13(storeDir,{recursive:!0}),await appendFile6(path69.join(storeDir,"curation-proposals.jsonl"),`${JSON.stringify(p)}
758
- `,"utf-8")}catch{}})},linked=_internals38.isLinked(directory);if(linked){let currentFp=_internals38.cohortConfigFingerprint(buildConfigFingerprintInput(context.config)),cohortFp=await _internals38.readCohortConfigFingerprint(directory);if(cohortFp!==null&&currentFp!==cohortFp)return persistProposal(proposal),{authorized:!1,basis:"config-mismatch",detail:`Cohort config fingerprint mismatch: this worktree (${currentFp}) differs from the cohort (${cohortFp}). Cohort members will curate with different semantics. Align knowledge config across linked worktrees before destructive curation.`,proposal}}let entry=context.entry;if(!entry)return persistProposal(proposal),{authorized:!1,basis:"entry-not-found",detail:`Entry ${entryId} not found in the store.`,proposal};if(input.override?.actor==="manual-override"&&input.override.reason)return{authorized:!0,basis:"override",detail:`Operator override: ${input.override.reason}`,expectedRevision:entry.revision,expectedContentHash:entry.content_hash};if(!linked)return{authorized:!0,basis:"config-skipped-unlinked",detail:"Worktree is not cohort-linked; local curation is permitted (no cross-worktree safety concern).",expectedRevision:entry.revision,expectedContentHash:entry.content_hash};if(entry.producer==null)return persistProposal(proposal),{authorized:!1,basis:"protected-unknown-owner",detail:`Entry ${entryId} has no producer provenance (legacy). Destructive action is protected by default; recorded as a proposal. An audited override is required to force it.`,proposal};let actorWorktreeId=input.actorWorktreeId??await _internals38.resolveWorktreeId(directory);if(entry.producer.worktree_id===actorWorktreeId)return{authorized:!0,basis:"owner",detail:`Acting worktree is the proven producer of entry ${entryId}; owner-scoped ${input.evidenceScope} evidence authorized.`,expectedRevision:entry.revision,expectedContentHash:entry.content_hash};if(input.evidenceScope==="local-session")return persistProposal(proposal),{authorized:!1,basis:"not-owner-local-evidence",detail:`Entry ${entryId} is owned by worktree ${entry.producer.worktree_id}; the acting worktree (${actorWorktreeId}) has only local-session evidence. Absence of local evidence is not negative evidence; recorded as a proposal. Use cohort-wide evidence or an override.`,proposal};if(input.evidenceScope==="cohort-wide"){let events=await _internals38.readKnowledgeEvents(directory),NEGATIVE_EVENT_TYPES=new Set(["violated","contradicted"]),cohortEvidence=events.filter((e)=>("type"in e)&&NEGATIVE_EVENT_TYPES.has(e.type??"")&&("knowledge_id"in e)&&e.knowledge_id===entryId).length;if(cohortEvidence>=quorum.minCohortEvidence)return{authorized:!0,basis:"quorum",detail:`Cohort quorum met for entry ${entryId}: ${cohortEvidence} `+`cohort-wide evidence events (≥ ${quorum.minCohortEvidence} required).`,expectedRevision:entry.revision,expectedContentHash:entry.content_hash};return persistProposal(proposal),{authorized:!1,basis:"quorum-insufficient",detail:`Cohort quorum NOT met for entry ${entryId}: ${cohortEvidence} cohort-wide evidence events (< ${quorum.minCohortEvidence} required).`,proposal}}return persistProposal(proposal),{authorized:!1,basis:"not-owner-local-evidence",detail:`Entry ${entryId} is owned by worktree ${entry.producer.worktree_id}; the acting worktree (${actorWorktreeId}) is not the producer and has not supplied cohort-wide quorum evidence.`,proposal}}function buildConfigFingerprintInput(config3){return{dedup_threshold:config3.dedup_threshold,scope_filter:config3.scope_filter,validation_enabled:config3.validation_enabled,evergreen_confidence:config3.evergreen_confidence,evergreen_utility:config3.evergreen_utility,low_utility_threshold:config3.low_utility_threshold,default_max_phases:config3.default_max_phases,todo_max_phases:config3.todo_max_phases,confidence_floor_action:config3.confidence_floor_action,contradiction_threshold_action:config3.contradiction_threshold_action,contradiction_quarantine_threshold:config3.contradiction_quarantine_threshold,schema_version:config3.schema_version,swarm_max_entries:config3.swarm_max_entries,retrieval:{mmr_lambda:config3.retrieval?.mmr_lambda,cold_start_bonus:config3.retrieval?.cold_start_bonus,synonym_min_cooccurrence:config3.retrieval?.synonym_min_cooccurrence}}}async function readCohortConfigFingerprint(directory){if(!_internals38.isLinked(directory))return null;let pointer=_internals38.readLinkPointer(directory);if(!pointer?.linkId)return null;let linkDir=_internals38.resolveLinkDir(pointer.linkId),cohortConfigPath=path69.join(linkDir,"cohort-config.json");try{let raw=await _internals38.readFile(cohortConfigPath,"utf-8"),parsed=JSON.parse(raw);return typeof parsed.fingerprint==="string"?parsed.fingerprint:null}catch{return null}}var DEFAULT_QUORUM,_internals38;var init_curation_policy=__esm(()=>{init_knowledge_events();init_knowledge_link();init_config_fingerprint();init_worktree_identity();DEFAULT_QUORUM={minCohortEvidence:3};_internals38={resolveWorktreeId,readKnowledgeEvents,cohortConfigFingerprint,readCohortConfigFingerprint,readFile:readFile16,isLinked,readLinkPointer,resolveLinkDir,resolveKnowledgeStoreDir}});var exports_knowledge_validator={};__export(exports_knowledge_validator,{validateSkillPath:()=>validateSkillPath,validateSkillCandidatePath:()=>validateSkillCandidatePath,validateLesson:()=>validateLesson,validateActionableFields:()=>validateActionableFields,validateActionability:()=>validateActionability,unarchiveEntry:()=>unarchiveEntry,scanContentSafety:()=>scanContentSafety,restoreEntry:()=>restoreEntry,resolveUnactionablePath:()=>resolveUnactionablePath,quarantineEntry:()=>quarantineEntry,auditEntryHealth:()=>auditEntryHealth,appendUnactionable:()=>appendUnactionable,_internals:()=>_internals39,SECURITY_DEGRADING_PATTERNS:()=>SECURITY_DEGRADING_PATTERNS,RETIRED_SKILL_HISTORY_MAX:()=>RETIRED_SKILL_HISTORY_MAX,INVISIBLE_FORMAT_CHARS:()=>INVISIBLE_FORMAT_CHARS,INJECTION_PATTERNS:()=>INJECTION_PATTERNS,DANGEROUS_COMMAND_WARNING_PATTERNS:()=>DANGEROUS_COMMAND_WARNING_PATTERNS,DANGEROUS_COMMAND_PATTERNS:()=>DANGEROUS_COMMAND_PATTERNS,DANGEROUS_COMMAND_ERROR_PATTERNS:()=>DANGEROUS_COMMAND_ERROR_PATTERNS,ALLOWED_SKILL_PATH_PREFIXES:()=>ALLOWED_SKILL_PATH_PREFIXES,ACTIONABLE_STRING_MAX:()=>ACTIONABLE_STRING_MAX,ACTIONABLE_LIST_MAX:()=>ACTIONABLE_LIST_MAX});import{appendFile as appendFile7,mkdir as mkdir14}from"node:fs/promises";import*as path70 from"node:path";function scanContentSafety(text){if(typeof text!=="string"||text.length===0)return null;let normalized=text.normalize("NFKC").replace(INVISIBLE_FORMAT_CHARS," ").replace(/\s+/g," ").toLowerCase();for(let pattern of DANGEROUS_COMMAND_ERROR_PATTERNS)if(pattern.test(normalized))return"dangerous command pattern detected";for(let pattern of SECURITY_DEGRADING_PATTERNS)if(pattern.test(normalized))return"security-degrading instruction detected";for(let pattern of INJECTION_PATTERNS)if(pattern.test(text))return"injection pattern detected";return null}function normalizeText(text){return text.normalize("NFKC").toLowerCase().replace(/[^\w\s]/g," ").replace(/\s+/g," ").trim()}function extractContextWords(text,word,contextWindow=3){let words=text.split(" "),context=new Set;if(!word.includes(" ")){let from=0,idx=words.indexOf(word,from);while(idx!==-1){let start=Math.max(0,idx-contextWindow),end=Math.min(words.length,idx+contextWindow+1);for(let i2=start;i2<end;i2++)if(i2!==idx&&words[i2]&&words[i2].length>0)context.add(words[i2]);from=idx+1,idx=words.indexOf(word,from)}return context}let termLen=word.split(" ").length,i=0;while(i<=words.length-termLen)if(words.slice(i,i+termLen).join(" ")===word){let start=Math.max(0,i-contextWindow),end=Math.min(words.length,i+termLen+contextWindow);for(let j=start;j<end;j++)if(j<i||j>=i+termLen){if(words[j]&&words[j].length>0)context.add(words[j])}i+=termLen}else i+=1;return context}function hasSignificantOverlap(set1,set22){if(set1.size===0||set22.size===0)return!1;return[...set1].some((word)=>set22.has(word))}function detectContradiction(candidate,existingLessons){let candidateTags=inferTags2(candidate);if(candidateTags.length===0)return!1;let candidateNorm=normalizeText(candidate);for(let existing of existingLessons){let existingTags=inferTags2(existing);if(!candidateTags.some((t)=>existingTags.includes(t)))continue;let existingNorm=normalizeText(existing);for(let[wordA,wordB]of NEGATION_PAIRS){if(candidateNorm.includes(wordA)&&existingNorm.includes(wordB)){let contextA=extractContextWords(candidateNorm,wordA),contextB=extractContextWords(existingNorm,wordB);if(hasSignificantOverlap(contextA,contextB))return!0}if(candidateNorm.includes(wordB)&&existingNorm.includes(wordA)){let contextB=extractContextWords(candidateNorm,wordB),contextA=extractContextWords(existingNorm,wordA);if(hasSignificantOverlap(contextA,contextB))return!0}}}return!1}function isVagueLesson(lesson){let words=normalizeText(lesson).split(/\s+/),hasTechRef=words.some((w)=>TECH_REFERENCE_WORDS.has(w)),hasActionVerb=words.some((w)=>ACTION_VERB_WORDS.has(w));return!hasTechRef&&!hasActionVerb}function validateLesson(candidate,existingLessons,meta3){if(!candidate||typeof candidate!=="string")return{valid:!1,layer:1,reason:"lesson too short (min 15 chars)",severity:"error"};if(!Array.isArray(existingLessons))existingLessons=[];if(candidate.length<15)return{valid:!1,layer:1,reason:"lesson too short (min 15 chars)",severity:"error"};if(candidate.length>280)return{valid:!1,layer:1,reason:"lesson too long (max 280 chars)",severity:"error"};if(!VALID_CATEGORIES.has(meta3.category))return{valid:!1,layer:1,reason:`invalid category: ${meta3.category}`,severity:"error"};let isGlobalScope=meta3.scope==="global",isStackScope=/^stack:[a-zA-Z0-9_-]{1,64}$/.test(meta3.scope);if(!isGlobalScope&&!isStackScope)return{valid:!1,layer:1,reason:"invalid scope: must be 'global' or 'stack:<name>'",severity:"error"};if(!(meta3.confidence>=0&&meta3.confidence<=1))return{valid:!1,layer:1,reason:"confidence out of range [0.0, 1.0]",severity:"error"};let normalizedCandidate=candidate.normalize("NFKC").replace(INVISIBLE_FORMAT_CHARS," ").replace(/\s+/g," ").toLowerCase();for(let pattern of DANGEROUS_COMMAND_ERROR_PATTERNS)if(pattern.test(normalizedCandidate))return{valid:!1,layer:2,reason:"dangerous command pattern detected",severity:"error"};for(let pattern of DANGEROUS_COMMAND_WARNING_PATTERNS)if(pattern.test(normalizedCandidate))return{valid:!0,layer:2,reason:"potentially dangerous command pattern queued for review",severity:"warning"};for(let pattern of SECURITY_DEGRADING_PATTERNS)if(pattern.test(normalizedCandidate))return{valid:!1,layer:2,reason:"security-degrading instruction detected",severity:"error"};for(let pattern of INJECTION_PATTERNS)if(pattern.test(candidate))return{valid:!1,layer:2,reason:"injection pattern detected",severity:"error"};if(detectContradiction(candidate,existingLessons))return{valid:!0,layer:3,reason:"possible contradiction with an existing lesson with shared tags",severity:"warning"};if(isVagueLesson(candidate))return{valid:!0,layer:3,reason:"lesson may be too vague (no tech reference or action verb)",severity:"warning"};return{valid:!0,layer:null,reason:null,severity:null}}function isCleanShortString(s){if(typeof s!=="string")return!1;if(s.length===0||s.length>ACTIONABLE_STRING_MAX)return!1;return!/[\x00-\x08\x0b-\x0c\x0e-\x1f\x7f]/.test(s)}function validateSkillPath(p){if(typeof p!=="string")return!1;if(p.length===0||p.length>256)return!1;if(p.includes("\x00"))return!1;if(path70.isAbsolute(p))return!1;if(p.includes(".."))return!1;let norm=p.replace(/\\/g,"/");return ALLOWED_SKILL_PATH_PREFIXES.some((prefix)=>norm.startsWith(prefix))}function validateSkillCandidatePath(p){if(typeof p!=="string")return!1;if(p.length===0||p.length>256)return!1;if(p.includes("\x00"))return!1;if(path70.isAbsolute(p))return!1;if(p.includes(".."))return!1;let norm=p.replace(/\\/g,"/");if(!norm.startsWith(".swarm/skills/candidates/"))return!1;let filename=norm.slice(25);return/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\.json$/i.test(filename)}function validateActionableFields(fields){let errors5=[];if(!fields)return{valid:!0,errors:errors5};function checkStringList(name,list){if(list===void 0)return;if(!Array.isArray(list)){errors5.push(`${name} must be an array`);return}if(list.length>ACTIONABLE_LIST_MAX)errors5.push(`${name} exceeds ${ACTIONABLE_LIST_MAX} items`);for(let item of list){if(!isCleanShortString(item)){errors5.push(`${name} contains invalid string`);return}let unsafe=scanContentSafety(item);if(unsafe){errors5.push(`${name} contains unsafe content: ${unsafe}`);return}}}function checkNameList(name,list){if(list===void 0)return;if(!Array.isArray(list)){errors5.push(`${name} must be an array`);return}if(list.length>ACTIONABLE_LIST_MAX)errors5.push(`${name} exceeds ${ACTIONABLE_LIST_MAX} items`);for(let item of list)if(typeof item!=="string"||!NAME_PATTERN.test(item)){errors5.push(`${name} contains invalid name`);return}}if(checkStringList("triggers",fields.triggers),checkStringList("required_actions",fields.required_actions),checkStringList("forbidden_actions",fields.forbidden_actions),checkStringList("verification_checks",fields.verification_checks),checkNameList("applies_to_agents",fields.applies_to_agents),checkNameList("applies_to_tools",fields.applies_to_tools),fields.source_refs!==void 0){if(!Array.isArray(fields.source_refs))errors5.push("source_refs must be an array");else if(fields.source_refs.length>ACTIONABLE_LIST_MAX)errors5.push(`source_refs exceeds ${ACTIONABLE_LIST_MAX} items`);else for(let ref of fields.source_refs)if(typeof ref!=="string"||ref.length===0||ref.length>ACTIONABLE_STRING_MAX||SOURCE_REF_FORBIDDEN.test(ref)){errors5.push("source_refs contains invalid value");break}}if(fields.source_knowledge_ids!==void 0){if(!Array.isArray(fields.source_knowledge_ids))errors5.push("source_knowledge_ids must be an array");else for(let id of fields.source_knowledge_ids)if(typeof id!=="string"||id.length===0||id.length>64){errors5.push("source_knowledge_ids contains invalid value");break}}if(fields.directive_priority!==void 0&&!VALID_DIRECTIVE_PRIORITIES.has(String(fields.directive_priority)))errors5.push("directive_priority must be low|medium|high|critical");if(fields.generated_skill_slug!==void 0){if(typeof fields.generated_skill_slug!=="string"||!/^[a-z0-9][a-z0-9-]{0,63}$/.test(fields.generated_skill_slug))errors5.push("generated_skill_slug must be a kebab-case slug")}if(fields.generated_skill_path!==void 0&&!validateSkillPath(fields.generated_skill_path))errors5.push("generated_skill_path must be repo-local under allowed prefix");if(fields.draft_generated_skill_slug!==void 0){if(typeof fields.draft_generated_skill_slug!=="string"||!/^[a-z0-9][a-z0-9-]{0,63}$/.test(fields.draft_generated_skill_slug))errors5.push("draft_generated_skill_slug must be a kebab-case slug")}if(fields.draft_generated_skill_path!==void 0&&!validateSkillPath(fields.draft_generated_skill_path))errors5.push("draft_generated_skill_path must be repo-local under allowed prefix");if(fields.retired_skill_history!==void 0){if(!Array.isArray(fields.retired_skill_history))errors5.push("retired_skill_history must be an array of slugs");else if(fields.retired_skill_history.length>RETIRED_SKILL_HISTORY_MAX)errors5.push(`retired_skill_history exceeds ${RETIRED_SKILL_HISTORY_MAX} items`);else if(!fields.retired_skill_history.every((s)=>typeof s==="string"&&/^[a-z0-9][a-z0-9-]{0,63}$/.test(s)))errors5.push("retired_skill_history entries must be kebab-case slugs")}return{valid:errors5.length===0,errors:errors5}}function hasNonEmptyList(v){return Array.isArray(v)&&v.length>0}function validateActionability(entry){let hasPredicate=hasNonEmptyList(entry.forbidden_actions)||hasNonEmptyList(entry.required_actions)||hasNonEmptyList(entry.verification_checks)||typeof entry.verification_predicate==="string"&&entry.verification_predicate.trim().length>0,hasScope=hasNonEmptyList(entry.applies_to_tools)||hasNonEmptyList(entry.applies_to_agents);if(hasPredicate&&hasScope)return{actionable:!0};return{actionable:!1,reason:!hasPredicate&&!hasScope?"missing_predicate_and_scope":!hasPredicate?"missing_predicate":"missing_scope"}}function resolveUnactionablePath(directory){return path70.join(resolveKnowledgeStoreDir(directory),"knowledge-unactionable.jsonl")}async function appendUnactionable(directory,entry,reason){let filePath=resolveUnactionablePath(directory),dirPath=path70.dirname(filePath);await mkdir14(dirPath,{recursive:!0}),await transactKnowledge(filePath,(existing)=>{let record3={...entry,status:"quarantined_unactionable",unactionable_reason:reason,quarantined_at:new Date().toISOString()},duplicate=findNearDuplicate(record3.lesson,existing,0.6);if(duplicate?.unactionable_reason===reason)return duplicate.quarantined_at=record3.quarantined_at,duplicate.updated_at=record3.updated_at,existing;let next=[...existing,record3];return next.length>200?next.slice(-200):next})}function auditEntryHealth(entry){let utilityScore=entry.utility_score;if((entry.retrieval_outcomes?.shown_count??entry.retrieval_outcomes?.applied_count??0)>=5&&utilityScore!==void 0&&utilityScore<=0)return{healthy:!1,concern:"Low-utility entry"};if(entry.confidence<0.1)return{healthy:!1,concern:"Near-zero confidence"};if(entry.auto_generated===!0&&entry.confirmed_by.length===0)return{healthy:!1,concern:"Unconfirmed auto-generated"};return{healthy:!0}}async function quarantineEntry(directory,entryId,reason,reportedBy,curationContext){if(!directory||directory.includes("..")){warn("[knowledge-validator] quarantineEntry: directory traversal attempt blocked");return}if(!entryId||entryId.includes("\x00")||entryId.includes(`
765
+ `;if(repairInvalidFile)await _internals37.writeFile(idPath,payload,{encoding:"utf-8",flag:"w"});else try{await _internals37.writeFile(idPath,payload,{encoding:"utf-8",flag:"wx"})}catch(err){if(err?.code==="EEXIST"||_internals37.existsSync(idPath)){let raw=await _internals37.readFile(idPath,"utf-8"),validated=readValidatedId(raw);if(validated!==void 0)return validated}throw err}}catch{}return newId}var WORKTREE_ID_FILENAME="worktree-id.json",UUID_RE,_internals37;var init_worktree_identity=__esm(()=>{UUID_RE=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;_internals37={readFile:readFile15,writeFile:writeFile8,existsSync:existsSync29,mkdir:mkdir12,randomUUID:randomUUID7}});var exports_curation_policy={};__export(exports_curation_policy,{readCohortConfigFingerprint:()=>readCohortConfigFingerprint,buildConfigFingerprintInput:()=>buildConfigFingerprintInput,authorizeCuration:()=>authorizeCuration,_internals:()=>_internals38});import{appendFile as appendFile7,mkdir as mkdir13,readFile as readFile16}from"node:fs/promises";import*as path69 from"node:path";async function authorizeCuration(input,context,quorum=DEFAULT_QUORUM){let{directory,action,entryId}=input,proposal={entryId,action,reason:input.reason,evidenceScope:input.evidenceScope,proposedAt:new Date().toISOString(),status:"pending"},persistProposal=(p)=>{queueMicrotask(async()=>{try{let storeDir=_internals38.resolveKnowledgeStoreDir(directory);await mkdir13(storeDir,{recursive:!0}),await appendFile7(path69.join(storeDir,"curation-proposals.jsonl"),`${JSON.stringify(p)}
766
+ `,"utf-8")}catch{}})},linked=_internals38.isLinked(directory);if(linked){let currentFp=_internals38.cohortConfigFingerprint(buildConfigFingerprintInput(context.config)),cohortFp=await _internals38.readCohortConfigFingerprint(directory);if(cohortFp!==null&&currentFp!==cohortFp)return persistProposal(proposal),{authorized:!1,basis:"config-mismatch",detail:`Cohort config fingerprint mismatch: this worktree (${currentFp}) differs from the cohort (${cohortFp}). Cohort members will curate with different semantics. Align knowledge config across linked worktrees before destructive curation.`,proposal}}let entry=context.entry;if(!entry)return persistProposal(proposal),{authorized:!1,basis:"entry-not-found",detail:`Entry ${entryId} not found in the store.`,proposal};if(input.override?.actor==="manual-override"&&input.override.reason)return{authorized:!0,basis:"override",detail:`Operator override: ${input.override.reason}`,expectedRevision:entry.revision,expectedContentHash:entry.content_hash};if(!linked)return{authorized:!0,basis:"config-skipped-unlinked",detail:"Worktree is not cohort-linked; local curation is permitted (no cross-worktree safety concern).",expectedRevision:entry.revision,expectedContentHash:entry.content_hash};if(entry.producer==null)return persistProposal(proposal),{authorized:!1,basis:"protected-unknown-owner",detail:`Entry ${entryId} has no producer provenance (legacy). Destructive action is protected by default; recorded as a proposal. An audited override is required to force it.`,proposal};let actorWorktreeId=input.actorWorktreeId??await _internals38.resolveWorktreeId(directory);if(entry.producer.worktree_id===actorWorktreeId)return{authorized:!0,basis:"owner",detail:`Acting worktree is the proven producer of entry ${entryId}; owner-scoped ${input.evidenceScope} evidence authorized.`,expectedRevision:entry.revision,expectedContentHash:entry.content_hash};if(input.evidenceScope==="local-session")return persistProposal(proposal),{authorized:!1,basis:"not-owner-local-evidence",detail:`Entry ${entryId} is owned by worktree ${entry.producer.worktree_id}; the acting worktree (${actorWorktreeId}) has only local-session evidence. Absence of local evidence is not negative evidence; recorded as a proposal. Use cohort-wide evidence or an override.`,proposal};if(input.evidenceScope==="cohort-wide"){let events=await _internals38.readKnowledgeEvents(directory),NEGATIVE_EVENT_TYPES=new Set(["violated","contradicted"]),cohortEvidence=events.filter((e)=>("type"in e)&&NEGATIVE_EVENT_TYPES.has(e.type??"")&&("knowledge_id"in e)&&e.knowledge_id===entryId).length;if(cohortEvidence>=quorum.minCohortEvidence)return{authorized:!0,basis:"quorum",detail:`Cohort quorum met for entry ${entryId}: ${cohortEvidence} `+`cohort-wide evidence events (≥ ${quorum.minCohortEvidence} required).`,expectedRevision:entry.revision,expectedContentHash:entry.content_hash};return persistProposal(proposal),{authorized:!1,basis:"quorum-insufficient",detail:`Cohort quorum NOT met for entry ${entryId}: ${cohortEvidence} cohort-wide evidence events (< ${quorum.minCohortEvidence} required).`,proposal}}return persistProposal(proposal),{authorized:!1,basis:"not-owner-local-evidence",detail:`Entry ${entryId} is owned by worktree ${entry.producer.worktree_id}; the acting worktree (${actorWorktreeId}) is not the producer and has not supplied cohort-wide quorum evidence.`,proposal}}function buildConfigFingerprintInput(config3){return{dedup_threshold:config3.dedup_threshold,scope_filter:config3.scope_filter,validation_enabled:config3.validation_enabled,evergreen_confidence:config3.evergreen_confidence,evergreen_utility:config3.evergreen_utility,low_utility_threshold:config3.low_utility_threshold,default_max_phases:config3.default_max_phases,todo_max_phases:config3.todo_max_phases,confidence_floor_action:config3.confidence_floor_action,contradiction_threshold_action:config3.contradiction_threshold_action,contradiction_quarantine_threshold:config3.contradiction_quarantine_threshold,schema_version:config3.schema_version,swarm_max_entries:config3.swarm_max_entries,retrieval:{mmr_lambda:config3.retrieval?.mmr_lambda,cold_start_bonus:config3.retrieval?.cold_start_bonus,synonym_min_cooccurrence:config3.retrieval?.synonym_min_cooccurrence}}}async function readCohortConfigFingerprint(directory){if(!_internals38.isLinked(directory))return null;let pointer=_internals38.readLinkPointer(directory);if(!pointer?.linkId)return null;let linkDir=_internals38.resolveLinkDir(pointer.linkId),cohortConfigPath=path69.join(linkDir,"cohort-config.json");try{let raw=await _internals38.readFile(cohortConfigPath,"utf-8"),parsed=JSON.parse(raw);return typeof parsed.fingerprint==="string"?parsed.fingerprint:null}catch{return null}}var DEFAULT_QUORUM,_internals38;var init_curation_policy=__esm(()=>{init_knowledge_events();init_knowledge_link();init_config_fingerprint();init_worktree_identity();DEFAULT_QUORUM={minCohortEvidence:3};_internals38={resolveWorktreeId,readKnowledgeEvents,cohortConfigFingerprint,readCohortConfigFingerprint,readFile:readFile16,isLinked,readLinkPointer,resolveLinkDir,resolveKnowledgeStoreDir}});var exports_knowledge_validator={};__export(exports_knowledge_validator,{validateSkillPath:()=>validateSkillPath,validateSkillCandidatePath:()=>validateSkillCandidatePath,validateLesson:()=>validateLesson,validateActionableFields:()=>validateActionableFields,validateActionability:()=>validateActionability,unarchiveEntry:()=>unarchiveEntry,scanContentSafety:()=>scanContentSafety,restoreEntry:()=>restoreEntry,resolveUnactionablePath:()=>resolveUnactionablePath,quarantineEntry:()=>quarantineEntry,auditEntryHealth:()=>auditEntryHealth,appendUnactionable:()=>appendUnactionable,_internals:()=>_internals39,SECURITY_DEGRADING_PATTERNS:()=>SECURITY_DEGRADING_PATTERNS,RETIRED_SKILL_HISTORY_MAX:()=>RETIRED_SKILL_HISTORY_MAX,INVISIBLE_FORMAT_CHARS:()=>INVISIBLE_FORMAT_CHARS,INJECTION_PATTERNS:()=>INJECTION_PATTERNS,DANGEROUS_COMMAND_WARNING_PATTERNS:()=>DANGEROUS_COMMAND_WARNING_PATTERNS,DANGEROUS_COMMAND_PATTERNS:()=>DANGEROUS_COMMAND_PATTERNS,DANGEROUS_COMMAND_ERROR_PATTERNS:()=>DANGEROUS_COMMAND_ERROR_PATTERNS,ALLOWED_SKILL_PATH_PREFIXES:()=>ALLOWED_SKILL_PATH_PREFIXES,ACTIONABLE_STRING_MAX:()=>ACTIONABLE_STRING_MAX,ACTIONABLE_LIST_MAX:()=>ACTIONABLE_LIST_MAX});import{appendFile as appendFile8,mkdir as mkdir14}from"node:fs/promises";import*as path70 from"node:path";function scanContentSafety(text){if(typeof text!=="string"||text.length===0)return null;let normalized=text.normalize("NFKC").replace(INVISIBLE_FORMAT_CHARS," ").replace(/\s+/g," ").toLowerCase();for(let pattern of DANGEROUS_COMMAND_ERROR_PATTERNS)if(pattern.test(normalized))return"dangerous command pattern detected";for(let pattern of SECURITY_DEGRADING_PATTERNS)if(pattern.test(normalized))return"security-degrading instruction detected";for(let pattern of INJECTION_PATTERNS)if(pattern.test(text))return"injection pattern detected";return null}function normalizeText(text){return text.normalize("NFKC").toLowerCase().replace(/[^\w\s]/g," ").replace(/\s+/g," ").trim()}function extractContextWords(text,word,contextWindow=3){let words=text.split(" "),context=new Set;if(!word.includes(" ")){let from=0,idx=words.indexOf(word,from);while(idx!==-1){let start=Math.max(0,idx-contextWindow),end=Math.min(words.length,idx+contextWindow+1);for(let i2=start;i2<end;i2++)if(i2!==idx&&words[i2]&&words[i2].length>0)context.add(words[i2]);from=idx+1,idx=words.indexOf(word,from)}return context}let termLen=word.split(" ").length,i=0;while(i<=words.length-termLen)if(words.slice(i,i+termLen).join(" ")===word){let start=Math.max(0,i-contextWindow),end=Math.min(words.length,i+termLen+contextWindow);for(let j=start;j<end;j++)if(j<i||j>=i+termLen){if(words[j]&&words[j].length>0)context.add(words[j])}i+=termLen}else i+=1;return context}function hasSignificantOverlap(set1,set22){if(set1.size===0||set22.size===0)return!1;return[...set1].some((word)=>set22.has(word))}function detectContradiction(candidate,existingLessons){let candidateTags=inferTags2(candidate);if(candidateTags.length===0)return!1;let candidateNorm=normalizeText(candidate);for(let existing of existingLessons){let existingTags=inferTags2(existing);if(!candidateTags.some((t)=>existingTags.includes(t)))continue;let existingNorm=normalizeText(existing);for(let[wordA,wordB]of NEGATION_PAIRS){if(candidateNorm.includes(wordA)&&existingNorm.includes(wordB)){let contextA=extractContextWords(candidateNorm,wordA),contextB=extractContextWords(existingNorm,wordB);if(hasSignificantOverlap(contextA,contextB))return!0}if(candidateNorm.includes(wordB)&&existingNorm.includes(wordA)){let contextB=extractContextWords(candidateNorm,wordB),contextA=extractContextWords(existingNorm,wordA);if(hasSignificantOverlap(contextA,contextB))return!0}}}return!1}function isVagueLesson(lesson){let words=normalizeText(lesson).split(/\s+/),hasTechRef=words.some((w)=>TECH_REFERENCE_WORDS.has(w)),hasActionVerb=words.some((w)=>ACTION_VERB_WORDS.has(w));return!hasTechRef&&!hasActionVerb}function validateLesson(candidate,existingLessons,meta3){if(!candidate||typeof candidate!=="string")return{valid:!1,layer:1,reason:"lesson too short (min 15 chars)",severity:"error"};if(!Array.isArray(existingLessons))existingLessons=[];if(candidate.length<15)return{valid:!1,layer:1,reason:"lesson too short (min 15 chars)",severity:"error"};if(candidate.length>280)return{valid:!1,layer:1,reason:"lesson too long (max 280 chars)",severity:"error"};if(!VALID_CATEGORIES.has(meta3.category))return{valid:!1,layer:1,reason:`invalid category: ${meta3.category}`,severity:"error"};let isGlobalScope=meta3.scope==="global",isStackScope=/^stack:[a-zA-Z0-9_-]{1,64}$/.test(meta3.scope);if(!isGlobalScope&&!isStackScope)return{valid:!1,layer:1,reason:"invalid scope: must be 'global' or 'stack:<name>'",severity:"error"};if(!(meta3.confidence>=0&&meta3.confidence<=1))return{valid:!1,layer:1,reason:"confidence out of range [0.0, 1.0]",severity:"error"};let normalizedCandidate=candidate.normalize("NFKC").replace(INVISIBLE_FORMAT_CHARS," ").replace(/\s+/g," ").toLowerCase();for(let pattern of DANGEROUS_COMMAND_ERROR_PATTERNS)if(pattern.test(normalizedCandidate))return{valid:!1,layer:2,reason:"dangerous command pattern detected",severity:"error"};for(let pattern of DANGEROUS_COMMAND_WARNING_PATTERNS)if(pattern.test(normalizedCandidate))return{valid:!0,layer:2,reason:"potentially dangerous command pattern queued for review",severity:"warning"};for(let pattern of SECURITY_DEGRADING_PATTERNS)if(pattern.test(normalizedCandidate))return{valid:!1,layer:2,reason:"security-degrading instruction detected",severity:"error"};for(let pattern of INJECTION_PATTERNS)if(pattern.test(candidate))return{valid:!1,layer:2,reason:"injection pattern detected",severity:"error"};if(detectContradiction(candidate,existingLessons))return{valid:!0,layer:3,reason:"possible contradiction with an existing lesson with shared tags",severity:"warning"};if(isVagueLesson(candidate))return{valid:!0,layer:3,reason:"lesson may be too vague (no tech reference or action verb)",severity:"warning"};return{valid:!0,layer:null,reason:null,severity:null}}function isCleanShortString(s){if(typeof s!=="string")return!1;if(s.length===0||s.length>ACTIONABLE_STRING_MAX)return!1;return!/[\x00-\x08\x0b-\x0c\x0e-\x1f\x7f]/.test(s)}function validateSkillPath(p){if(typeof p!=="string")return!1;if(p.length===0||p.length>256)return!1;if(p.includes("\x00"))return!1;if(path70.isAbsolute(p))return!1;if(p.includes(".."))return!1;let norm=p.replace(/\\/g,"/");return ALLOWED_SKILL_PATH_PREFIXES.some((prefix)=>norm.startsWith(prefix))}function validateSkillCandidatePath(p){if(typeof p!=="string")return!1;if(p.length===0||p.length>256)return!1;if(p.includes("\x00"))return!1;if(path70.isAbsolute(p))return!1;if(p.includes(".."))return!1;let norm=p.replace(/\\/g,"/");if(!norm.startsWith(".swarm/skills/candidates/"))return!1;let filename=norm.slice(25);return/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\.json$/i.test(filename)}function validateActionableFields(fields){let errors5=[];if(!fields)return{valid:!0,errors:errors5};function checkStringList(name,list){if(list===void 0)return;if(!Array.isArray(list)){errors5.push(`${name} must be an array`);return}if(list.length>ACTIONABLE_LIST_MAX)errors5.push(`${name} exceeds ${ACTIONABLE_LIST_MAX} items`);for(let item of list){if(!isCleanShortString(item)){errors5.push(`${name} contains invalid string`);return}let unsafe=scanContentSafety(item);if(unsafe){errors5.push(`${name} contains unsafe content: ${unsafe}`);return}}}function checkNameList(name,list){if(list===void 0)return;if(!Array.isArray(list)){errors5.push(`${name} must be an array`);return}if(list.length>ACTIONABLE_LIST_MAX)errors5.push(`${name} exceeds ${ACTIONABLE_LIST_MAX} items`);for(let item of list)if(typeof item!=="string"||!NAME_PATTERN.test(item)){errors5.push(`${name} contains invalid name`);return}}if(checkStringList("triggers",fields.triggers),checkStringList("required_actions",fields.required_actions),checkStringList("forbidden_actions",fields.forbidden_actions),checkStringList("verification_checks",fields.verification_checks),checkNameList("applies_to_agents",fields.applies_to_agents),checkNameList("applies_to_tools",fields.applies_to_tools),fields.source_refs!==void 0){if(!Array.isArray(fields.source_refs))errors5.push("source_refs must be an array");else if(fields.source_refs.length>ACTIONABLE_LIST_MAX)errors5.push(`source_refs exceeds ${ACTIONABLE_LIST_MAX} items`);else for(let ref of fields.source_refs)if(typeof ref!=="string"||ref.length===0||ref.length>ACTIONABLE_STRING_MAX||SOURCE_REF_FORBIDDEN.test(ref)){errors5.push("source_refs contains invalid value");break}}if(fields.source_knowledge_ids!==void 0){if(!Array.isArray(fields.source_knowledge_ids))errors5.push("source_knowledge_ids must be an array");else for(let id of fields.source_knowledge_ids)if(typeof id!=="string"||id.length===0||id.length>64){errors5.push("source_knowledge_ids contains invalid value");break}}if(fields.directive_priority!==void 0&&!VALID_DIRECTIVE_PRIORITIES.has(String(fields.directive_priority)))errors5.push("directive_priority must be low|medium|high|critical");if(fields.generated_skill_slug!==void 0){if(typeof fields.generated_skill_slug!=="string"||!/^[a-z0-9][a-z0-9-]{0,63}$/.test(fields.generated_skill_slug))errors5.push("generated_skill_slug must be a kebab-case slug")}if(fields.generated_skill_path!==void 0&&!validateSkillPath(fields.generated_skill_path))errors5.push("generated_skill_path must be repo-local under allowed prefix");if(fields.draft_generated_skill_slug!==void 0){if(typeof fields.draft_generated_skill_slug!=="string"||!/^[a-z0-9][a-z0-9-]{0,63}$/.test(fields.draft_generated_skill_slug))errors5.push("draft_generated_skill_slug must be a kebab-case slug")}if(fields.draft_generated_skill_path!==void 0&&!validateSkillPath(fields.draft_generated_skill_path))errors5.push("draft_generated_skill_path must be repo-local under allowed prefix");if(fields.retired_skill_history!==void 0){if(!Array.isArray(fields.retired_skill_history))errors5.push("retired_skill_history must be an array of slugs");else if(fields.retired_skill_history.length>RETIRED_SKILL_HISTORY_MAX)errors5.push(`retired_skill_history exceeds ${RETIRED_SKILL_HISTORY_MAX} items`);else if(!fields.retired_skill_history.every((s)=>typeof s==="string"&&/^[a-z0-9][a-z0-9-]{0,63}$/.test(s)))errors5.push("retired_skill_history entries must be kebab-case slugs")}return{valid:errors5.length===0,errors:errors5}}function hasNonEmptyList(v){return Array.isArray(v)&&v.length>0}function validateActionability(entry){let hasPredicate=hasNonEmptyList(entry.forbidden_actions)||hasNonEmptyList(entry.required_actions)||hasNonEmptyList(entry.verification_checks)||typeof entry.verification_predicate==="string"&&entry.verification_predicate.trim().length>0,hasScope=hasNonEmptyList(entry.applies_to_tools)||hasNonEmptyList(entry.applies_to_agents);if(hasPredicate&&hasScope)return{actionable:!0};return{actionable:!1,reason:!hasPredicate&&!hasScope?"missing_predicate_and_scope":!hasPredicate?"missing_predicate":"missing_scope"}}function resolveUnactionablePath(directory){return path70.join(resolveKnowledgeStoreDir(directory),"knowledge-unactionable.jsonl")}async function appendUnactionable(directory,entry,reason){let filePath=resolveUnactionablePath(directory),dirPath=path70.dirname(filePath);await mkdir14(dirPath,{recursive:!0}),await transactKnowledge(filePath,(existing)=>{let record3={...entry,status:"quarantined_unactionable",unactionable_reason:reason,quarantined_at:new Date().toISOString()},duplicate=findNearDuplicate(record3.lesson,existing,0.6);if(duplicate?.unactionable_reason===reason)return duplicate.quarantined_at=record3.quarantined_at,duplicate.updated_at=record3.updated_at,existing;let next=[...existing,record3];return next.length>200?next.slice(-200):next})}function auditEntryHealth(entry){let utilityScore=entry.utility_score;if((entry.retrieval_outcomes?.shown_count??entry.retrieval_outcomes?.applied_count??0)>=5&&utilityScore!==void 0&&utilityScore<=0)return{healthy:!1,concern:"Low-utility entry"};if(entry.confidence<0.1)return{healthy:!1,concern:"Near-zero confidence"};if(entry.auto_generated===!0&&entry.confirmed_by.length===0)return{healthy:!1,concern:"Unconfirmed auto-generated"};return{healthy:!0}}async function quarantineEntry(directory,entryId,reason,reportedBy,curationContext){if(!directory||directory.includes("..")){warn("[knowledge-validator] quarantineEntry: directory traversal attempt blocked");return}if(!entryId||entryId.includes("\x00")||entryId.includes(`
759
767
  `)){warn("[knowledge-validator] quarantineEntry: invalid entryId rejected");return}if(!["architect","user","auto"].includes(reportedBy))return;let sanitizedReason=reason.slice(0,500).replace(/[\x00-\x08\x0b-\x0c\x0e-\x1f\x7f\x0d]/g,""),knowledgePath=resolveSwarmKnowledgePath(directory),quarantinePath=path70.join(resolveKnowledgeStoreDir(directory),"knowledge-quarantined.jsonl"),rejectedPath=resolveSwarmRejectedPath(directory),swarmDir=resolveKnowledgeStoreDir(directory);await mkdir14(swarmDir,{recursive:!0});let release;try{release=await import_proper_lockfile4.default.lock(swarmDir,{retries:{retries:5,minTimeout:100,maxTimeout:500},stale:5000});let entries=await readKnowledge(knowledgePath),entry=entries.find((e)=>e.id===entryId);if(!entry)return;if(curationContext){let refreshedContext={...curationContext.context,entry},decision=await authorizeCuration(curationContext.input,refreshedContext);if(!decision.authorized){warn(`[knowledge-validator] quarantineEntry blocked by cohort-safety policy (basis: ${decision.basis}): ${decision.detail}`);return}}let remaining=entries.filter((e)=>e.id!==entryId),quarantined={...entry,status:"quarantined",original_status:entry.status,quarantine_reason:sanitizedReason,quarantined_at:new Date().toISOString(),reported_by:reportedBy},jsonlContent=remaining.length>0?`${remaining.map((e)=>JSON.stringify(e)).join(`
760
768
  `)}
761
- `:"";await atomicWriteFile(knowledgePath,jsonlContent),await appendFile7(quarantinePath,`${JSON.stringify(quarantined)}
769
+ `:"";await atomicWriteFile(knowledgePath,jsonlContent),await appendFile8(quarantinePath,`${JSON.stringify(quarantined)}
762
770
  `,"utf-8");let quarantinedEntries=await readKnowledge(quarantinePath);if(quarantinedEntries.length>100){let trimmed=quarantinedEntries.slice(-100),capContent=trimmed.length>0?`${trimmed.map((e)=>JSON.stringify(e)).join(`
763
771
  `)}
764
- `:"";await atomicWriteFile(quarantinePath,capContent)}let rejectedRecord={id:entryId,lesson:entry.lesson,rejection_reason:sanitizedReason,rejected_at:new Date().toISOString(),rejection_layer:3};await appendFile7(rejectedPath,`${JSON.stringify(rejectedRecord)}
772
+ `:"";await atomicWriteFile(quarantinePath,capContent)}let rejectedRecord={id:entryId,lesson:entry.lesson,rejection_reason:sanitizedReason,rejected_at:new Date().toISOString(),rejection_layer:3};await appendFile8(rejectedPath,`${JSON.stringify(rejectedRecord)}
765
773
  `,"utf-8")}finally{if(release)await release()}}async function restoreEntry(directory,entryId,curationContext){if(!directory||directory.includes("..")){warn("[knowledge-validator] restoreEntry: directory traversal attempt blocked");return}if(!entryId||entryId.includes("\x00")||entryId.includes(`
766
774
  `)){warn("[knowledge-validator] restoreEntry: invalid entryId rejected");return}let storeDir=resolveKnowledgeStoreDir(directory),knowledgePath=resolveSwarmKnowledgePath(directory),quarantinePath=path70.join(storeDir,"knowledge-quarantined.jsonl"),rejectedPath=resolveSwarmRejectedPath(directory),swarmDir=storeDir;await mkdir14(swarmDir,{recursive:!0});let release;try{release=await import_proper_lockfile4.default.lock(swarmDir,{retries:{retries:5,minTimeout:100,maxTimeout:500},stale:5000});let quarantinedEntries=await readKnowledge(quarantinePath),entryToRestore=quarantinedEntries.find((e)=>e.id===entryId);if(!entryToRestore)return;if(curationContext){let refreshedContext={...curationContext.context,entry:entryToRestore},decision=await authorizeCuration(curationContext.input,refreshedContext);if(!decision.authorized){warn(`[knowledge-validator] restoreEntry blocked by cohort-safety policy (basis: ${decision.basis}): ${decision.detail}`);return}}let remaining=quarantinedEntries.filter((e)=>e.id!==entryId),{quarantine_reason,quarantined_at,reported_by,original_status,status:_quarantineStatus,...rest}=entryToRestore,original={...rest,status:original_status??"candidate"},validation=validateLesson(original.lesson,[],{category:original.category,scope:original.scope,confidence:original.confidence});if(!validation.valid){warn(`[knowledge-validator] restoreEntry: entry ${entryId} failed re-validation: ${validation.reason}`);return}let jsonlContent=remaining.length>0?`${remaining.map((e)=>JSON.stringify(e)).join(`
767
775
  `)}
768
- `:"";await atomicWriteFile(quarantinePath,jsonlContent),await appendFile7(knowledgePath,`${JSON.stringify(original)}
776
+ `:"";await atomicWriteFile(quarantinePath,jsonlContent),await appendFile8(knowledgePath,`${JSON.stringify(original)}
769
777
  `,"utf-8");let filtered=(await readKnowledge(rejectedPath)).filter((e)=>e.id!==entryId),rejectedContent=filtered.length>0?`${filtered.map((e)=>JSON.stringify(e)).join(`
770
778
  `)}
771
779
  `:"";await atomicWriteFile(rejectedPath,rejectedContent)}finally{if(release)await release()}}async function unarchiveEntry(directory,entryId,curationContext){if(!directory||directory.includes(".."))return warn("[knowledge-validator] unarchiveEntry: directory traversal attempt blocked"),{restored:!1,reason:"not_found"};if(!entryId||entryId.includes("\x00")||entryId.includes(`
772
780
  `))return warn("[knowledge-validator] unarchiveEntry: invalid entryId rejected"),{restored:!1,reason:"not_found"};let storeDir=resolveKnowledgeStoreDir(directory),knowledgePath=resolveSwarmKnowledgePath(directory),swarmDir=storeDir;await mkdir14(swarmDir,{recursive:!0});let release;try{release=await import_proper_lockfile4.default.lock(swarmDir,{retries:{retries:5,minTimeout:100,maxTimeout:500},stale:5000});let entries=await readKnowledge(knowledgePath),target=entries.find((e)=>e.id===entryId);if(!target)return{restored:!1,reason:"not_found"};if(target.status!=="archived")return{restored:!1,reason:"not_archived"};if(curationContext){let refreshedContext={...curationContext.context,entry:target},decision=await authorizeCuration(curationContext.input,refreshedContext);if(!decision.authorized)return warn(`[knowledge-validator] unarchiveEntry blocked by cohort-safety policy (basis: ${decision.basis}): ${decision.detail}`),{restored:!1,reason:"blocked_by_policy"}}let validation=validateLesson(target.lesson,[],{category:target.category,scope:target.scope,confidence:target.confidence});if(!validation.valid)return warn(`[knowledge-validator] unarchiveEntry: entry ${entryId} failed re-validation: ${validation.reason}`),{restored:!1,reason:"invalid_lesson"};let restoredStatus=target.archived_from??"candidate",finalStatus=new Set(["candidate","established","promoted"]).has(restoredStatus)?restoredStatus:"candidate",{archived_from:_af,archived_at:_at,recent_negative_phase_count:_rnpc,last_demotion_phase:_ldp,...rest}=target,restored={...rest,status:finalStatus,updated_at:new Date().toISOString(),recent_negative_phase_count:0,last_demotion_phase:void 0},next=entries.map((e)=>e.id===entryId?restored:e),jsonlContent=next.length>0?`${next.map((e)=>JSON.stringify(e)).join(`
773
781
  `)}
774
- `:"";return await atomicWriteFile(knowledgePath,jsonlContent),{restored:!0,restored_to:finalStatus}}finally{if(release)await release()}}var import_proper_lockfile4,DANGEROUS_COMMAND_ERROR_PATTERNS,DANGEROUS_COMMAND_WARNING_PATTERNS,DANGEROUS_COMMAND_PATTERNS,SECURITY_DEGRADING_PATTERNS,INVISIBLE_FORMAT_CHARS,INJECTION_PATTERNS,VALID_CATEGORIES,TECH_REFERENCE_WORDS,ACTION_VERB_WORDS,NEGATION_PAIRS,ACTIONABLE_STRING_MAX=200,ACTIONABLE_LIST_MAX=20,RETIRED_SKILL_HISTORY_MAX=50,NAME_PATTERN,SOURCE_REF_FORBIDDEN,ALLOWED_SKILL_PATH_PREFIXES,VALID_DIRECTIVE_PRIORITIES,_internals39;var init_knowledge_validator=__esm(()=>{init_task_file();init_curation_policy();init_logger();init_knowledge_link();init_knowledge_store();import_proper_lockfile4=__toESM(require_proper_lockfile(),1),DANGEROUS_COMMAND_ERROR_PATTERNS=[/\brm\s+-rf\b/,/\bsudo\s+rm\b/,/\bmkfs\b/,/\bdd\s+if=/,/:\(\)\s*\{/,/\bchmod\s+-R\s+777\b/i,/\bdeltree\b/,/\brmdir\s+\/s\b/],DANGEROUS_COMMAND_WARNING_PATTERNS=[/\bformat\b/,/\bkill\s+-9\b/,/\bpkill\b/,/\bkillall\b/,/`[^`]*`/,/\$\([^)]*\)/],DANGEROUS_COMMAND_PATTERNS=[...DANGEROUS_COMMAND_ERROR_PATTERNS,...DANGEROUS_COMMAND_WARNING_PATTERNS],SECURITY_DEGRADING_PATTERNS=[/disable\s+.{0,50}firewall/i,/turn\s+off\s+.{0,50}security/i,/skip\s+.{0,50}auth/i,/bypass\s+.{0,50}auth/i,/ignore\s+.{0,50}certificate/i,/disable\s+.{0,50}tls/i,/disable\s+.{0,50}ssl/i,/no\s+.{0,50}validation/i,/disable\s+.{0,50}2fa/i,/remove\s+.{0,50}password/i],INVISIBLE_FORMAT_CHARS=/[\u00AD\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u2069\uFEFF]/g,INJECTION_PATTERNS=[/[\x00-\x08\x0b-\x0c\x0e-\x1f\x7f\x0d]/,/[\u00AD\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u2069\uFEFF]/,/^system\s*:/i,/<script/i,/javascript:/i,/\beval\(/i,/\b__proto__\b/,/\bconstructor\[/,/\.prototype\[/];VALID_CATEGORIES=new Set(["process","architecture","tooling","security","testing","debugging","performance","integration","todo","other"]),TECH_REFERENCE_WORDS=new Set(["git","docker","typescript","bun","vitest","node","python","react","sql","api","hook","test","schema","config","file","function","class","module","import","export"]),ACTION_VERB_WORDS=new Set(["use","avoid","prefer","run","check","always","never","ensure","call","write","add","remove","update","set","enable","disable"]),NEGATION_PAIRS=[["always","never"],["must","must not"],["must","should not"],["enable","disable"],["use","avoid"],["use","don't use"],["recommended","not recommended"]];NAME_PATTERN=/^[a-z][a-z0-9_]{0,63}$/,SOURCE_REF_FORBIDDEN=/(\.\.\/|\.\.\\|\0|[\x00-\x1f\x7f])/,ALLOWED_SKILL_PATH_PREFIXES=[".opencode/skills/generated/",".swarm/skills/proposals/",".swarm/skills/candidates/"],VALID_DIRECTIVE_PRIORITIES=new Set(["low","medium","high","critical"]);_internals39={validateLesson,auditEntryHealth,quarantineEntry,restoreEntry,unarchiveEntry,extractContextWords,hasSignificantOverlap}});var exports_knowledge_store={};__export(exports_knowledge_store,{wordBigrams:()=>wordBigrams,transactKnowledgeWithCas:()=>transactKnowledgeWithCas,transactKnowledge:()=>transactKnowledge,transactFile:()=>transactFile,sweepStaleTodos:()=>sweepStaleTodos,sweepAgedEntries:()=>sweepAgedEntries,selectKnowledgeCapSurvivors:()=>selectKnowledgeCapSurvivors,rewriteKnowledge:()=>rewriteKnowledge,resolveSwarmRetractionsPath:()=>resolveSwarmRetractionsPath,resolveSwarmRejectedPath:()=>resolveSwarmRejectedPath,resolveSwarmKnowledgePath:()=>resolveSwarmKnowledgePath,resolveRewriteHistoryPath:()=>resolveRewriteHistoryPath,resolveHiveRejectedPath:()=>resolveHiveRejectedPath2,resolveHiveKnowledgePath:()=>resolveHiveKnowledgePath2,resolveHiveEventsPath:()=>resolveHiveEventsPath3,resolveHiveDataDir:()=>resolveHiveDataDir,readRewriteHistory:()=>readRewriteHistory,readRetractionRecords:()=>readRetractionRecords,readRejectedLessons:()=>readRejectedLessons,readKnowledge:()=>readKnowledge,normalizeEntry:()=>normalizeEntry,normalize:()=>normalize9,jaccardBigram:()=>jaccardBigram,inferTags:()=>inferTags2,getPlatformConfigDir:()=>getPlatformConfigDir,getArchivedKnowledgeIds:()=>getArchivedKnowledgeIds,findNearDuplicate:()=>findNearDuplicate,enforceKnowledgeCap:()=>enforceKnowledgeCap,confirmEntriesPhase:()=>confirmEntriesPhase,computeOutcomeSignal:()=>computeOutcomeSignal,computeContentHash:()=>computeContentHash,computeConfidence:()=>computeConfidence,bumpKnowledgeConfidenceBatch:()=>bumpKnowledgeConfidenceBatch,appendRewriteHistory:()=>appendRewriteHistory,appendRetractionRecord:()=>appendRetractionRecord,appendRejectedLesson:()=>appendRejectedLesson,appendKnowledgeWithCapEnforcement:()=>appendKnowledgeWithCapEnforcement,appendKnowledge:()=>appendKnowledge,_internals:()=>_internals40,OUTCOME_SIGNAL_SMOOTHING:()=>OUTCOME_SIGNAL_SMOOTHING,MAX_CONFIRMED_BY:()=>MAX_CONFIRMED_BY});import{createHash as createHash17}from"node:crypto";import{existsSync as existsSync30}from"node:fs";import{appendFile as appendFile8,mkdir as mkdir15,readFile as readFile17}from"node:fs/promises";import*as os16 from"node:os";import*as path71 from"node:path";function getPlatformConfigDir(){let platform=process.platform,home=process.env.HOME||os16.homedir();if(platform==="win32")return path71.join(process.env.LOCALAPPDATA||path71.join(home,"AppData","Local"),"opencode-swarm","config");else if(platform==="darwin")return path71.join(home,"Library","Application Support","opencode-swarm");else return path71.join(process.env.XDG_CONFIG_HOME||path71.join(home,".config"),"opencode-swarm")}function resolveSwarmKnowledgePath(directory){return path71.join(resolveKnowledgeStoreDir(directory),"knowledge.jsonl")}function resolveSwarmRejectedPath(directory){return path71.join(resolveKnowledgeStoreDir(directory),"knowledge-rejected.jsonl")}function resolveSwarmRetractionsPath(directory){return path71.join(resolveKnowledgeStoreDir(directory),"knowledge-retractions.jsonl")}function resolveRewriteHistoryPath(directory){return path71.join(resolveKnowledgeStoreDir(directory),"knowledge-rewrites.jsonl")}function parseKnowledgeContent(content,max){let results=[];for(let line of content.split(`
775
- `)){if(Number.isFinite(max)&&results.length>=max)break;let trimmed=line.trim();if(!trimmed)continue;try{results.push(normalizeEntry(JSON.parse(trimmed)))}catch{log(`[knowledge-store] Skipping corrupted JSONL line: ${trimmed.slice(0,80)}`)}}return results}async function readKnowledge(filePath,maxEntries){let resolvedPath=path71.resolve(filePath),cap=maxEntries!==void 0&&maxEntries>0?maxEntries:void 0;if(cap!==void 0){if(!existsSync30(resolvedPath))return[];let content=await readFile17(resolvedPath,"utf-8");return parseKnowledgeContent(content,cap)}return await readCachedParsedFile(resolvedPath,KNOWLEDGE_JSONL_CACHE_NAMESPACE,async()=>{if(!existsSync30(resolvedPath))return null;return await readFile17(resolvedPath,"utf-8")},(content)=>parseKnowledgeContent(content,1/0))??[]}function normalizeEntry(raw){if(!raw||typeof raw!=="object")return raw;let obj=raw;if(!("retrieval_outcomes"in obj))return raw;let ro=obj.retrieval_outcomes;if(!ro||typeof ro!=="object")ro={},obj.retrieval_outcomes=ro;if(typeof ro.shown_count!=="number")ro.shown_count=typeof ro.applied_count==="number"?ro.applied_count:0;if(typeof ro.acknowledged_count!=="number")ro.acknowledged_count=0;if(typeof ro.applied_explicit_count!=="number")ro.applied_explicit_count=0;if(typeof ro.ignored_count!=="number")ro.ignored_count=0;if(typeof ro.violated_count!=="number")ro.violated_count=0;if(typeof ro.contradicted_count!=="number")ro.contradicted_count=0;if(typeof ro.succeeded_after_shown_count!=="number")ro.succeeded_after_shown_count=typeof ro.succeeded_after_count==="number"?ro.succeeded_after_count:0;if(typeof ro.failed_after_shown_count!=="number")ro.failed_after_shown_count=typeof ro.failed_after_count==="number"?ro.failed_after_count:0;try{if(typeof obj.encounter_score!=="number"||Number.isNaN(obj.encounter_score))obj.encounter_score=0}catch{try{Object.defineProperty(obj,"encounter_score",{value:0,writable:!0,configurable:!0,enumerable:!0})}catch{}}if(typeof obj.recent_negative_phase_count!=="number")obj.recent_negative_phase_count=0;if(!Array.isArray(obj.confirmed_by))obj.confirmed_by=[];let arrayFields=["triggers","required_actions","forbidden_actions","applies_to_agents","applies_to_tools","verification_checks","source_refs","source_knowledge_ids"];for(let f of arrayFields){let v=obj[f];if(v!==void 0&&!Array.isArray(v))delete obj[f]}if(!Array.isArray(obj.tags))obj.tags=[];if(typeof obj.revision!=="number"||Number.isNaN(obj.revision))obj.revision=0;return raw}function computeContentHash(lesson){return createHash17("sha256").update(lesson,"utf8").digest("hex").slice(0,12)}async function readRejectedLessons(directory){return readKnowledge(resolveSwarmRejectedPath(directory))}async function readRetractionRecords(directory){return readKnowledge(resolveSwarmRetractionsPath(directory))}async function appendRetractionRecord(directory,record3){await appendKnowledge(resolveSwarmRetractionsPath(directory),record3)}async function appendRewriteHistory(directory,record3){let filePath=resolveRewriteHistoryPath(directory),MAX_REWRITE_HISTORY=2000;await transactKnowledge(filePath,(entries)=>{let next=[...entries,record3];return next.length>2000?next.slice(next.length-2000):next}).catch((err)=>{log(`[knowledge-store] appendRewriteHistory failed (non-blocking): ${String(err)}`)})}async function readRewriteHistory(directory){return readKnowledge(resolveRewriteHistoryPath(directory))}async function appendKnowledge(filePath,entry){let dir=path71.dirname(filePath);await mkdir15(dir,{recursive:!0});let release=null;try{release=await import_proper_lockfile5.default.lock(dir,{retries:{retries:5,minTimeout:100,maxTimeout:500},stale:5000}),await appendFile8(filePath,`${JSON.stringify(entry)}
782
+ `:"";return await atomicWriteFile(knowledgePath,jsonlContent),{restored:!0,restored_to:finalStatus}}finally{if(release)await release()}}var import_proper_lockfile4,DANGEROUS_COMMAND_ERROR_PATTERNS,DANGEROUS_COMMAND_WARNING_PATTERNS,DANGEROUS_COMMAND_PATTERNS,SECURITY_DEGRADING_PATTERNS,INVISIBLE_FORMAT_CHARS,INJECTION_PATTERNS,VALID_CATEGORIES,TECH_REFERENCE_WORDS,ACTION_VERB_WORDS,NEGATION_PAIRS,ACTIONABLE_STRING_MAX=200,ACTIONABLE_LIST_MAX=20,RETIRED_SKILL_HISTORY_MAX=50,NAME_PATTERN,SOURCE_REF_FORBIDDEN,ALLOWED_SKILL_PATH_PREFIXES,VALID_DIRECTIVE_PRIORITIES,_internals39;var init_knowledge_validator=__esm(()=>{init_task_file();init_curation_policy();init_logger();init_knowledge_link();init_knowledge_store();import_proper_lockfile4=__toESM(require_proper_lockfile(),1),DANGEROUS_COMMAND_ERROR_PATTERNS=[/\brm\s+-rf\b/,/\bsudo\s+rm\b/,/\bmkfs\b/,/\bdd\s+if=/,/:\(\)\s*\{/,/\bchmod\s+-R\s+777\b/i,/\bdeltree\b/,/\brmdir\s+\/s\b/],DANGEROUS_COMMAND_WARNING_PATTERNS=[/\bformat\b/,/\bkill\s+-9\b/,/\bpkill\b/,/\bkillall\b/,/`[^`]*`/,/\$\([^)]*\)/],DANGEROUS_COMMAND_PATTERNS=[...DANGEROUS_COMMAND_ERROR_PATTERNS,...DANGEROUS_COMMAND_WARNING_PATTERNS],SECURITY_DEGRADING_PATTERNS=[/disable\s+.{0,50}firewall/i,/turn\s+off\s+.{0,50}security/i,/skip\s+.{0,50}auth/i,/bypass\s+.{0,50}auth/i,/ignore\s+.{0,50}certificate/i,/disable\s+.{0,50}tls/i,/disable\s+.{0,50}ssl/i,/no\s+.{0,50}validation/i,/disable\s+.{0,50}2fa/i,/remove\s+.{0,50}password/i],INVISIBLE_FORMAT_CHARS=/[\u00AD\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u2069\uFEFF]/g,INJECTION_PATTERNS=[/[\x00-\x08\x0b-\x0c\x0e-\x1f\x7f\x0d]/,/[\u00AD\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u2069\uFEFF]/,/^system\s*:/i,/<script/i,/javascript:/i,/\beval\(/i,/\b__proto__\b/,/\bconstructor\[/,/\.prototype\[/];VALID_CATEGORIES=new Set(["process","architecture","tooling","security","testing","debugging","performance","integration","todo","other"]),TECH_REFERENCE_WORDS=new Set(["git","docker","typescript","bun","vitest","node","python","react","sql","api","hook","test","schema","config","file","function","class","module","import","export"]),ACTION_VERB_WORDS=new Set(["use","avoid","prefer","run","check","always","never","ensure","call","write","add","remove","update","set","enable","disable"]),NEGATION_PAIRS=[["always","never"],["must","must not"],["must","should not"],["enable","disable"],["use","avoid"],["use","don't use"],["recommended","not recommended"]];NAME_PATTERN=/^[a-z][a-z0-9_]{0,63}$/,SOURCE_REF_FORBIDDEN=/(\.\.\/|\.\.\\|\0|[\x00-\x1f\x7f])/,ALLOWED_SKILL_PATH_PREFIXES=[".opencode/skills/generated/",".swarm/skills/proposals/",".swarm/skills/candidates/"],VALID_DIRECTIVE_PRIORITIES=new Set(["low","medium","high","critical"]);_internals39={validateLesson,auditEntryHealth,quarantineEntry,restoreEntry,unarchiveEntry,extractContextWords,hasSignificantOverlap}});var exports_knowledge_store={};__export(exports_knowledge_store,{wordBigrams:()=>wordBigrams,transactKnowledgeWithCas:()=>transactKnowledgeWithCas,transactKnowledge:()=>transactKnowledge,transactFile:()=>transactFile,sweepStaleTodos:()=>sweepStaleTodos,sweepAgedEntries:()=>sweepAgedEntries,selectKnowledgeCapSurvivors:()=>selectKnowledgeCapSurvivors,rewriteKnowledge:()=>rewriteKnowledge,resolveSwarmRetractionsPath:()=>resolveSwarmRetractionsPath,resolveSwarmRejectedPath:()=>resolveSwarmRejectedPath,resolveSwarmKnowledgePath:()=>resolveSwarmKnowledgePath,resolveRewriteHistoryPath:()=>resolveRewriteHistoryPath,resolveHiveRejectedPath:()=>resolveHiveRejectedPath2,resolveHiveKnowledgePath:()=>resolveHiveKnowledgePath2,resolveHiveEventsPath:()=>resolveHiveEventsPath3,resolveHiveDataDir:()=>resolveHiveDataDir,readRewriteHistory:()=>readRewriteHistory,readRetractionRecords:()=>readRetractionRecords,readRejectedLessons:()=>readRejectedLessons,readKnowledge:()=>readKnowledge,normalizeEntry:()=>normalizeEntry,normalize:()=>normalize9,jaccardBigram:()=>jaccardBigram,inferTags:()=>inferTags2,getPlatformConfigDir:()=>getPlatformConfigDir,getArchivedKnowledgeIds:()=>getArchivedKnowledgeIds,findNearDuplicate:()=>findNearDuplicate,enforceKnowledgeCap:()=>enforceKnowledgeCap,confirmEntriesPhase:()=>confirmEntriesPhase,computeOutcomeSignal:()=>computeOutcomeSignal,computeContentHash:()=>computeContentHash,computeConfidence:()=>computeConfidence,bumpKnowledgeConfidenceBatch:()=>bumpKnowledgeConfidenceBatch,appendRewriteHistory:()=>appendRewriteHistory,appendRetractionRecord:()=>appendRetractionRecord,appendRejectedLesson:()=>appendRejectedLesson,appendKnowledgeWithCapEnforcement:()=>appendKnowledgeWithCapEnforcement,appendKnowledge:()=>appendKnowledge,_internals:()=>_internals40,OUTCOME_SIGNAL_SMOOTHING:()=>OUTCOME_SIGNAL_SMOOTHING,MAX_CONFIRMED_BY:()=>MAX_CONFIRMED_BY});import{createHash as createHash17}from"node:crypto";import{existsSync as existsSync30}from"node:fs";import{appendFile as appendFile9,mkdir as mkdir15,readFile as readFile17}from"node:fs/promises";import*as os16 from"node:os";import*as path71 from"node:path";function getPlatformConfigDir(){let platform=process.platform,home=process.env.HOME||os16.homedir();if(platform==="win32")return path71.join(process.env.LOCALAPPDATA||path71.join(home,"AppData","Local"),"opencode-swarm","config");else if(platform==="darwin")return path71.join(home,"Library","Application Support","opencode-swarm");else return path71.join(process.env.XDG_CONFIG_HOME||path71.join(home,".config"),"opencode-swarm")}function resolveSwarmKnowledgePath(directory){return path71.join(resolveKnowledgeStoreDir(directory),"knowledge.jsonl")}function resolveSwarmRejectedPath(directory){return path71.join(resolveKnowledgeStoreDir(directory),"knowledge-rejected.jsonl")}function resolveSwarmRetractionsPath(directory){return path71.join(resolveKnowledgeStoreDir(directory),"knowledge-retractions.jsonl")}function resolveRewriteHistoryPath(directory){return path71.join(resolveKnowledgeStoreDir(directory),"knowledge-rewrites.jsonl")}function parseKnowledgeContent(content,max){let results=[];for(let line of content.split(`
783
+ `)){if(Number.isFinite(max)&&results.length>=max)break;let trimmed=line.trim();if(!trimmed)continue;try{results.push(normalizeEntry(JSON.parse(trimmed)))}catch{log(`[knowledge-store] Skipping corrupted JSONL line: ${trimmed.slice(0,80)}`)}}return results}async function readKnowledge(filePath,maxEntries){let resolvedPath=path71.resolve(filePath),cap=maxEntries!==void 0&&maxEntries>0?maxEntries:void 0;if(cap!==void 0){if(!existsSync30(resolvedPath))return[];let content=await readFile17(resolvedPath,"utf-8");return parseKnowledgeContent(content,cap)}return await readCachedParsedFile(resolvedPath,KNOWLEDGE_JSONL_CACHE_NAMESPACE,async()=>{if(!existsSync30(resolvedPath))return null;return await readFile17(resolvedPath,"utf-8")},(content)=>parseKnowledgeContent(content,1/0))??[]}function normalizeEntry(raw){if(!raw||typeof raw!=="object")return raw;let obj=raw;if(!("retrieval_outcomes"in obj))return raw;let ro=obj.retrieval_outcomes;if(!ro||typeof ro!=="object")ro={},obj.retrieval_outcomes=ro;if(typeof ro.shown_count!=="number")ro.shown_count=typeof ro.applied_count==="number"?ro.applied_count:0;if(typeof ro.acknowledged_count!=="number")ro.acknowledged_count=0;if(typeof ro.applied_explicit_count!=="number")ro.applied_explicit_count=0;if(typeof ro.ignored_count!=="number")ro.ignored_count=0;if(typeof ro.violated_count!=="number")ro.violated_count=0;if(typeof ro.contradicted_count!=="number")ro.contradicted_count=0;if(typeof ro.succeeded_after_shown_count!=="number")ro.succeeded_after_shown_count=typeof ro.succeeded_after_count==="number"?ro.succeeded_after_count:0;if(typeof ro.failed_after_shown_count!=="number")ro.failed_after_shown_count=typeof ro.failed_after_count==="number"?ro.failed_after_count:0;try{if(typeof obj.encounter_score!=="number"||Number.isNaN(obj.encounter_score))obj.encounter_score=0}catch{try{Object.defineProperty(obj,"encounter_score",{value:0,writable:!0,configurable:!0,enumerable:!0})}catch{}}if(typeof obj.recent_negative_phase_count!=="number")obj.recent_negative_phase_count=0;if(!Array.isArray(obj.confirmed_by))obj.confirmed_by=[];let arrayFields=["triggers","required_actions","forbidden_actions","applies_to_agents","applies_to_tools","verification_checks","source_refs","source_knowledge_ids"];for(let f of arrayFields){let v=obj[f];if(v!==void 0&&!Array.isArray(v))delete obj[f]}if(!Array.isArray(obj.tags))obj.tags=[];if(typeof obj.revision!=="number"||Number.isNaN(obj.revision))obj.revision=0;return raw}function computeContentHash(lesson){return createHash17("sha256").update(lesson,"utf8").digest("hex").slice(0,12)}async function readRejectedLessons(directory){return readKnowledge(resolveSwarmRejectedPath(directory))}async function readRetractionRecords(directory){return readKnowledge(resolveSwarmRetractionsPath(directory))}async function appendRetractionRecord(directory,record3){await appendKnowledge(resolveSwarmRetractionsPath(directory),record3)}async function appendRewriteHistory(directory,record3){let filePath=resolveRewriteHistoryPath(directory),MAX_REWRITE_HISTORY=2000;await transactKnowledge(filePath,(entries)=>{let next=[...entries,record3];return next.length>2000?next.slice(next.length-2000):next}).catch((err)=>{log(`[knowledge-store] appendRewriteHistory failed (non-blocking): ${String(err)}`)})}async function readRewriteHistory(directory){return readKnowledge(resolveRewriteHistoryPath(directory))}async function appendKnowledge(filePath,entry){let dir=path71.dirname(filePath);await mkdir15(dir,{recursive:!0});let release=null;try{release=await import_proper_lockfile5.default.lock(dir,{retries:{retries:5,minTimeout:100,maxTimeout:500},stale:5000}),await appendFile9(filePath,`${JSON.stringify(entry)}
776
784
  `,"utf-8")}finally{if(release)try{await release()}catch{}}}async function rewriteKnowledge(filePath,entries){let dir=path71.dirname(filePath);await mkdir15(dir,{recursive:!0});let release=null;try{release=await import_proper_lockfile5.default.lock(dir,{retries:{retries:5,minTimeout:100,maxTimeout:500},stale:5000});let content=entries.map((e)=>JSON.stringify(e)).join(`
777
785
  `)+(entries.length>0?`
778
786
  `:"");await atomicWriteFile(filePath,content)}finally{if(release)try{await release()}catch{}}}async function transactFile(filePath,read,write,mutate){let dir=path71.dirname(filePath);try{await mkdir15(dir,{recursive:!0})}catch{return!1}let release=null;try{release=await import_proper_lockfile5.default.lock(dir,{retries:{retries:5,minTimeout:100,maxTimeout:500},stale:5000});let data=await read(filePath),result=mutate(data);if(result===null)return!1;return await write(filePath,result),!0}finally{if(release)try{await release()}catch{}}}async function transactKnowledge(filePath,mutate){return transactFile(filePath,readKnowledge,async(fp,entries)=>{let content=entries.map((e)=>JSON.stringify(e)).join(`
@@ -1184,7 +1192,7 @@ RULES:
1184
1192
  `)}async function escalateViolatedEntries(directory,entryIds,now=new Date){let out=[];for(let id of[...new Set(entryIds)])out.push(await maybeEscalateOnViolation(directory,id,now));return out}async function maybeQuarantineOnContradiction(directory,entryId,threshold,windowDays,now=new Date){try{let count=await countEntryContradictionsInWindow(directory,entryId,windowDays,now);if(count<threshold)return{quarantined:!1,entryId,contradictionsInWindow:count};let entry=(await readKnowledge(resolveSwarmKnowledgePath(directory))).find((e)=>e.id===entryId);if(!entry)return{quarantined:!1,entryId,contradictionsInWindow:count};if(!isActiveStatus(entry.status))return{quarantined:!1,entryId,contradictionsInWindow:count,alreadyInactive:!0};let{quarantineEntry:quarantineEntry2}=await Promise.resolve().then(() => (init_knowledge_validator(),exports_knowledge_validator)),policyConfig;try{let{KnowledgeConfigSchema:KnowledgeConfigSchema2}=await Promise.resolve().then(() => (init_schema(),exports_schema)),{loadPluginConfigWithMeta:loadPluginConfigWithMeta2}=await Promise.resolve().then(() => (init_config(),exports_config)),{config:loadedConfig}=loadPluginConfigWithMeta2(directory);policyConfig=KnowledgeConfigSchema2.parse(loadedConfig.knowledge??{})}catch{policyConfig=void 0}return await quarantineEntry2(directory,entryId,`repeat_contradiction: ${count} contradicted events in ${windowDays}d`,"auto",{input:{directory,action:"quarantine",entryId,reason:`repeat_contradiction: ${count} in ${windowDays}d`,evidenceScope:"cohort-wide"},context:{config:policyConfig,entry}}),{quarantined:!0,entryId,contradictionsInWindow:count}}catch{return{quarantined:!1,entryId}}}var NEAR_DUPLICATE_THRESHOLD=0.6,ESCALATION_WINDOW_DAYS=30,ESCALATION_THRESHOLD=2,ESCALATION_DISPLAY_WINDOW_DAYS=7;var init_knowledge_escalator=__esm(()=>{init_knowledge_events();init_knowledge_store();init_knowledge_types()});function throwIfAborted(signal){if(!signal?.aborted)return;throw Error("Learning metrics computation aborted")}function safeDivide(numerator,denominator){return denominator===0?0:numerator/denominator}function truncateLesson(lesson){if(lesson.length<=MAX_LESSON_DISPLAY_CHARS)return lesson;return`${lesson.slice(0,MAX_LESSON_DISPLAY_CHARS-3)}...`}function isReceiptType(event){return event.type==="acknowledged"||event.type==="applied"||event.type==="ignored"||event.type==="contradicted"||event.type==="violated"||event.type==="n_a"||event.type==="override"}function countWindowedReceipts(events,entryId,windowMs,nowMs){let cutoff=nowMs-windowMs,violations=0,totalReceipts=0;for(let e of events){if(!isReceiptType(e))continue;if(e.knowledge_id!==entryId)continue;if(e.timestamp===void 0)continue;let t=Date.parse(e.timestamp);if(Number.isNaN(t)||t<cutoff)continue;if(totalReceipts++,e.type==="violated")violations++}return{violations,totalReceipts}}function determineTrend(rate7d,rate30d,hasData){if(!hasData)return"no_data";if(rate7d<rate30d)return"improving";if(rate7d>rate30d)return"worsening";return"stable"}function classifyROI(rollup){if(rollup.applied_explicit_count>0&&rollup.succeeded_after_shown_count>rollup.failed_after_shown_count)return"high";if(rollup.applied_explicit_count>0)return"medium";if(rollup.shown_count>0)return"low";return"unused"}async function computeLearningMetrics(directory,options){throwIfAborted(options?.signal);let now=options?.now??new Date,nowMs=now.getTime(),phasesThreshold=options?.currentPhase??DEFAULT_PHASES_ALIVE_THRESHOLD,[events,entries,rollups]=await Promise.all([readKnowledgeEvents(directory),readKnowledge(resolveSwarmKnowledgePath(directory)),readKnowledgeCounterRollups(directory)]);if(throwIfAborted(options?.signal),events.length===0&&entries.length===0)return emptyMetrics();let entryMap=new Map;for(let entry of entries)throwIfAborted(options?.signal),entryMap.set(entry.id,entry);let sessionIds=new Set;for(let e of events)if(throwIfAborted(options?.signal),"session_id"in e&&typeof e.session_id==="string")sessionIds.add(e.session_id);let sessionCount=sessionIds.size,violationTrends=[];for(let[entryId,rollup]of rollups){if(throwIfAborted(options?.signal),rollup.violated_count===0)continue;let entry=entryMap.get(entryId),lesson=entry?.lesson??entryId,priority=entry?.directive_priority??"medium",w7=countWindowedReceipts(events,entryId,SEVEN_DAYS_MS,nowMs),w30=countWindowedReceipts(events,entryId,THIRTY_DAYS_MS,nowMs),rate7d=safeDivide(w7.violations,w7.totalReceipts),rate30d=safeDivide(w30.violations,w30.totalReceipts),hasData=w7.totalReceipts>0||w30.totalReceipts>0;violationTrends.push({entryId,lesson,priority,violationRate7d:rate7d,violationRate30d:rate30d,trend:determineTrend(rate7d,rate30d,hasData)})}let totalViolations7d=0,totalReceipts7d=0,totalViolations30d=0,totalReceipts30d=0;for(let e of events){if(throwIfAborted(options?.signal),!isReceiptType(e))continue;if(e.timestamp===void 0)continue;let t=Date.parse(e.timestamp);if(Number.isNaN(t))continue;if(t>=nowMs-SEVEN_DAYS_MS){if(totalReceipts7d++,e.type==="violated")totalViolations7d++}if(t>=nowMs-THIRTY_DAYS_MS){if(totalReceipts30d++,e.type==="violated")totalViolations30d++}}let overallViolationRate={window7d:safeDivide(totalViolations7d,totalReceipts7d),window30d:safeDivide(totalViolations30d,totalReceipts30d)},priorityGroups=new Map;for(let entry of entries){throwIfAborted(options?.signal);let priority=entry.directive_priority??"medium",rollup=rollups.get(entry.id);if(!rollup)continue;let group=priorityGroups.get(priority);if(!group)group={applied:0,total:0},priorityGroups.set(priority,group);group.applied+=rollup.applied_explicit_count,group.total+=rollup.shown_count}let applicationRateByPriority={};for(let[priority,group]of priorityGroups)applicationRateByPriority[priority]={applied:group.applied,total:group.total,rate:safeDivide(group.applied,group.total)};let timeToLatestApplication=[];for(let entry of entries){let rollup=rollups.get(entry.id),daysToApply=null;if(rollup?.last_applied_at&&entry.created_at){let appliedMs=Date.parse(rollup.last_applied_at),createdMs=Date.parse(entry.created_at);if(!Number.isNaN(appliedMs)&&!Number.isNaN(createdMs)&&appliedMs>=createdMs)daysToApply=(appliedMs-createdMs)/MS_PER_DAY3}timeToLatestApplication.push({entryId:entry.id,lesson:entry.lesson,daysToApply})}let recentEscalations30d=await readRecentEscalations(directory,30,now);throwIfAborted(options?.signal);let last7dCutoff=nowMs-SEVEN_DAYS_MS,last7d=recentEscalations30d.filter((esc3)=>{let t=Date.parse(esc3.at);return!Number.isNaN(t)&&t>=last7dCutoff}).length,totalEscalations=0;for(let e of events)if(throwIfAborted(options?.signal),e.type==="escalation")totalEscalations++;let escalationFrequency={total:totalEscalations,last7d,last30d:recentEscalations30d.length},unacknowledgedCriticalCount=0;for(let entry of entries){if(throwIfAborted(options?.signal),entry.directive_priority!=="critical")continue;let rollup=rollups.get(entry.id);if(!rollup)continue;if(rollup.shown_count>0&&rollup.acknowledged_count===0&&rollup.applied_explicit_count===0)unacknowledgedCriticalCount++}let entryROI=[];for(let entry of entries){throwIfAborted(options?.signal);let rollup=rollups.get(entry.id);if(!rollup){entryROI.push({entryId:entry.id,lesson:entry.lesson,appliedCount:0,shownCount:0,succeededCount:0,failedCount:0,roi:"unused"});continue}entryROI.push({entryId:entry.id,lesson:entry.lesson,appliedCount:rollup.applied_explicit_count,shownCount:rollup.shown_count,succeededCount:rollup.succeeded_after_shown_count,failedCount:rollup.failed_after_shown_count,roi:classifyROI(rollup)})}let neverApplied=[];for(let entry of entries){throwIfAborted(options?.signal);let applied=rollups.get(entry.id)?.applied_explicit_count??0,phasesAlive=entry.phases_alive??0;if(applied===0&&phasesAlive>=phasesThreshold)neverApplied.push({entryId:entry.id,lesson:entry.lesson,phasesAlive})}let learningSummary=buildLearningSummary(overallViolationRate,violationTrends,sessionCount);return{violationTrends,overallViolationRate,applicationRateByPriority,timeToLatestApplication,escalationFrequency,unacknowledgedCriticalCount,entryROI,neverApplied,learningSummary,sessionCount}}function emptyMetrics(){return{violationTrends:[],overallViolationRate:{window7d:0,window30d:0},applicationRateByPriority:{},timeToLatestApplication:[],escalationFrequency:{total:0,last7d:0,last30d:0},unacknowledgedCriticalCount:0,entryROI:[],neverApplied:[],learningSummary:"No learning data yet",sessionCount:0}}function buildLearningSummary(overallRate,trends,sessionCount){let overallTrend=overallRate.window7d<overallRate.window30d?"improving":overallRate.window7d>overallRate.window30d?"worsening":"stable",rate7dPct=(overallRate.window7d*100).toFixed(1),rate30dPct=(overallRate.window30d*100).toFixed(1),line1=`Learning trend: ${overallTrend} — ${rate7dPct}% violation rate (7d), ${rate30dPct}% (30d) across ${sessionCount} sessions`,line2="No improvement data yet",bestDrop=0,bestDropEntry;for(let t of trends){if(t.trend!=="improving")continue;let drop=t.violationRate30d-t.violationRate7d;if(drop>bestDrop)bestDrop=drop,bestDropEntry=t}if(bestDropEntry)line2=`Top improvement: ${truncateLesson(bestDropEntry.lesson)}`;let line3="No concerns detected",worstRise=0,worstEntry;for(let t of trends){if(t.trend!=="worsening")continue;let rise=t.violationRate7d-t.violationRate30d;if(rise>worstRise)worstRise=rise,worstEntry=t}if(worstEntry)line3=`Watch: ${truncateLesson(worstEntry.lesson)}`;return`${line1}
1185
1193
  ${line2}
1186
1194
  ${line3}`}function formatLearningMarkdown(metrics){let lines=[];if(lines.push("## Learning Summary","",metrics.learningSummary,""),lines.push("## Violation Trends",""),metrics.violationTrends.length===0)lines.push("No violation trends recorded.","");else{lines.push("| Entry | Priority | 7d Rate | 30d Rate | Trend |"),lines.push("|-------|----------|---------|----------|-------|");for(let t of metrics.violationTrends)lines.push(`| ${truncateLesson(t.lesson)} | ${t.priority} | ${(t.violationRate7d*100).toFixed(1)}% | ${(t.violationRate30d*100).toFixed(1)}% | ${t.trend} |`);lines.push("")}lines.push("## Application Rates by Priority","");let priorities=Object.keys(metrics.applicationRateByPriority);if(priorities.length===0)lines.push("No application data recorded.","");else{lines.push("| Priority | Applied | Total | Rate |"),lines.push("|----------|---------|-------|------|");for(let p of priorities){let g=metrics.applicationRateByPriority[p];lines.push(`| ${p} | ${g.applied} | ${g.total} | ${(g.rate*100).toFixed(1)}% |`)}lines.push("")}lines.push("## Escalation Activity",""),lines.push(`- Total escalations: ${metrics.escalationFrequency.total}`),lines.push(`- Last 7 days: ${metrics.escalationFrequency.last7d}`),lines.push(`- Last 30 days: ${metrics.escalationFrequency.last30d}`),lines.push(""),lines.push("## Entry ROI","");let top10=[...metrics.entryROI].sort((a,b)=>b.shownCount-a.shownCount).slice(0,10),unused=metrics.entryROI.filter((r)=>r.roi==="unused"),roiEntries=[...top10];for(let u of unused)if(!roiEntries.some((r)=>r.entryId===u.entryId))roiEntries.push(u);if(roiEntries.length===0)lines.push("No ROI data recorded.","");else{lines.push("| Entry | Applied | Shown | Succeeded | Failed | ROI |"),lines.push("|-------|---------|-------|-----------|--------|-----|");for(let r of roiEntries)lines.push(`| ${truncateLesson(r.lesson)} | ${r.appliedCount} | ${r.shownCount} | ${r.succeededCount} | ${r.failedCount} | ${r.roi} |`);lines.push("")}if(lines.push("## Never Applied",""),metrics.neverApplied.length===0)lines.push("All entries have been applied or are below the phase threshold.","");else{lines.push("| Entry | Phases Alive |"),lines.push("|-------|-------------|");for(let n of metrics.neverApplied)lines.push(`| ${truncateLesson(n.lesson)} | ${n.phasesAlive} |`);lines.push("")}lines.push("## Time to Latest Application","");let applied=metrics.timeToLatestApplication.filter((t)=>t.daysToApply!==null).map((t)=>t.daysToApply);if(applied.length===0)lines.push("No application timing data available.","");else{applied.sort((a,b)=>a-b);let median=applied.length%2===0?(applied[applied.length/2-1]+applied[applied.length/2])/2:applied[Math.floor(applied.length/2)],min=applied[0],max=applied[applied.length-1];lines.push(`- Median: ${median.toFixed(1)} days`),lines.push(`- Min: ${min.toFixed(1)} days`),lines.push(`- Max: ${max.toFixed(1)} days`),lines.push(`- Entries with data: ${applied.length}`),lines.push("")}return lines.join(`
1187
- `)}function formatLearningJSON(metrics){return metrics}function formatLearningSummary(metrics){return metrics.learningSummary}var SEVEN_DAYS_MS=604800000,THIRTY_DAYS_MS=2592000000,MS_PER_DAY3=86400000,DEFAULT_PHASES_ALIVE_THRESHOLD=3,MAX_LESSON_DISPLAY_CHARS=60;var init_learning_metrics=__esm(()=>{init_knowledge_escalator();init_knowledge_events();init_knowledge_store()});import{appendFile as appendFile9,mkdir as mkdir17,readFile as readFile19,writeFile as writeFile10}from"node:fs/promises";import*as path74 from"node:path";function resolveSkillChangelogPath(directory,slug){if(slug.includes("..")||slug.includes("/")||slug.includes("\\"))throw Error(`Invalid skill slug: ${slug} — must not contain "..", "/" or "\\"`);return path74.join(directory,".swarm","skill-changelogs",`${slug}.jsonl`)}async function appendSkillChangelog(directory,slug,entry){let filePath=resolveSkillChangelogPath(directory,slug),dirPath=path74.dirname(filePath);await mkdir17(dirPath,{recursive:!0}),await appendFile9(filePath,`${JSON.stringify(entry)}
1195
+ `)}function formatLearningJSON(metrics){return metrics}function formatLearningSummary(metrics){return metrics.learningSummary}var SEVEN_DAYS_MS=604800000,THIRTY_DAYS_MS=2592000000,MS_PER_DAY3=86400000,DEFAULT_PHASES_ALIVE_THRESHOLD=3,MAX_LESSON_DISPLAY_CHARS=60;var init_learning_metrics=__esm(()=>{init_knowledge_escalator();init_knowledge_events();init_knowledge_store()});import{appendFile as appendFile10,mkdir as mkdir17,readFile as readFile19,writeFile as writeFile10}from"node:fs/promises";import*as path74 from"node:path";function resolveSkillChangelogPath(directory,slug){if(slug.includes("..")||slug.includes("/")||slug.includes("\\"))throw Error(`Invalid skill slug: ${slug} — must not contain "..", "/" or "\\"`);return path74.join(directory,".swarm","skill-changelogs",`${slug}.jsonl`)}async function appendSkillChangelog(directory,slug,entry){let filePath=resolveSkillChangelogPath(directory,slug),dirPath=path74.dirname(filePath);await mkdir17(dirPath,{recursive:!0}),await appendFile10(filePath,`${JSON.stringify(entry)}
1188
1196
  `,"utf-8");try{let lines=(await readFile19(filePath,"utf-8")).split(`
1189
1197
  `).filter((line)=>line.trim().length>0);if(lines.length>MAX_CHANGELOG_ENTRIES_PER_SKILL){let trimmed=lines.slice(lines.length-MAX_CHANGELOG_ENTRIES_PER_SKILL);await writeFile10(filePath,`${trimmed.join(`
1190
1198
  `)}
@@ -1247,17 +1255,17 @@ Could not load prior session context.`,contradictions:[],knowledge_entries_revie
1247
1255
  `).filter((l)=>l.trim()),batchEvents=[];for(let line of lines)try{let event=JSON.parse(line);if(event.type==="skill-stale-batch")batchEvents.push({skillIds:event.skillIds??[],retiredCount:event.retiredCount??0,staleCount:event.staleCount??0})}catch{}for(let batch of batchEvents)warn(`[curator] skill-stale-batch: ${batch.skillIds.length} skills affected (${batch.retiredCount} retired, ${batch.staleCount} stale)`)}}catch{}try{let metrics=await computeLearningMetrics(directory,{currentPhase:phase}),summary=formatLearningSummary(metrics);if(summary&&summary!=="No learning data yet")phaseDigest.summary+=`
1248
1256
 
1249
1257
  --- Learning ---
1250
- ${summary}`}catch(learningErr){warn(`[curator] learning summary failed: ${learningErr instanceof Error?learningErr.message:String(learningErr)}`)}let result={phase,digest:phaseDigest,compliance:complianceObservations,knowledge_recommendations:knowledgeRecommendations,summary_updated:summaryUpdated,knowledge_application_findings:knowledgeApplicationFindings,skill_candidates:skillCandidates};return getGlobalEventBus().publish("curator.phase.completed",{phase,compliance_count:complianceObservations.length,summary_updated:summaryUpdated}),result}catch(err){return getGlobalEventBus().publish("curator.error",{operation:"phase",phase,error:String(err)}),{phase,digest:{phase,timestamp:new Date().toISOString(),summary:`Phase ${phase} curator run failed: ${String(err)}`,agents_used:[],tasks_completed:0,tasks_total:0,key_decisions:[],blockers_resolved:[]},compliance:[],knowledge_recommendations:[],summary_updated:!1}}}async function applyCuratorKnowledgeUpdates(directory,recommendations,knowledgeConfig,generation){let applied=0,skipped=0,genStamp=generation!==void 0?{last_curated_generation:generation}:void 0;if(!recommendations||recommendations.length===0)return{applied,skipped};if(knowledgeConfig==null)return{applied:0,skipped:0};let validRecommendations=recommendations.filter((rec)=>rec!=null),knowledgePath=resolveSwarmKnowledgePath(directory),authorizedRevisions=new Map;if(validRecommendations.length>0){let preSnapshot=await _internals46.readKnowledge(knowledgePath),authorizedRecs=[];for(let rec of validRecommendations){if(rec.action!=="archive"&&rec.action!=="rewrite"){authorizedRecs.push(rec);continue}if(!rec.entry_id){authorizedRecs.push(rec);continue}let target=preSnapshot.find((e)=>e.id===rec.entry_id)??null,decision=await authorizeCuration({directory,action:rec.action,entryId:rec.entry_id??"",reason:rec.reason,evidenceScope:"cohort-wide"},{config:knowledgeConfig,entry:target});if(decision.authorized)authorizedRecs.push(rec),authorizedRevisions.set(rec.entry_id,target?.revision??void 0);else skipped++,warn(`[curator] ${rec.action} for '${rec.entry_id}' blocked by cohort-safety (basis: ${decision.basis})`)}validRecommendations=authorizedRecs}let appliedIds=new Set,foundIds=new Set,idResolutionSkipped=0,casDriftSkipped=0,casDriftedIds=new Set,archivedPrevStatus=new Map,contradictedEntries=[];await transactKnowledge(knowledgePath,(entries)=>{appliedIds.clear(),foundIds.clear(),archivedPrevStatus.clear(),contradictedEntries.length=0,casDriftSkipped=0,casDriftedIds.clear();let txApplied=0,modified=!1;for(let e of entries)foundIds.add(e.id);let resolvedRecommendations=resolveKnowledgeRecommendationIds(validRecommendations,entries);validRecommendations=resolvedRecommendations.recommendations,idResolutionSkipped=resolvedRecommendations.diagnostics.length;for(let diagnostic of resolvedRecommendations.diagnostics)warn(`[curator] applyCuratorKnowledgeUpdates: entry_id '${diagnostic.line}' ${diagnostic.reason} — skipping`);let updatedEntries=entries.map((entry)=>{let rec=validRecommendations.find((r)=>r.entry_id===entry.id);if(!rec)return entry;if(generation!==void 0&&alreadyCuratedThisGeneration(entry,generation))return entry;switch(rec.action){case"promote":return appliedIds.add(entry.id),txApplied++,modified=!0,{...entry,hive_eligible:!0,confidence:Math.min(1,(entry.confidence??0)+0.1),updated_at:new Date().toISOString(),...genStamp};case"archive":{if(authorizedRevisions.has(entry.id)&&(entry.revision??0)!==(authorizedRevisions.get(entry.id)??0))return casDriftSkipped++,casDriftedIds.add(entry.id),entry;if(entry.status==="archived")return entry;return appliedIds.add(entry.id),archivedPrevStatus.set(entry.id,entry.status),txApplied++,modified=!0,{...entry,status:"archived",archived_from:entry.status,archived_at:new Date().toISOString(),updated_at:new Date().toISOString(),...genStamp}}case"flag_contradiction":return appliedIds.add(entry.id),txApplied++,modified=!0,contradictedEntries.push({id:entry.id,reason:(rec.reason??"").slice(0,200)}),{...entry,tags:[...entry.tags??[],`contradiction:${(rec.reason??"").slice(0,50)}`],updated_at:new Date().toISOString(),...genStamp};case"rewrite":{if(authorizedRevisions.has(entry.id)&&(entry.revision??0)!==(authorizedRevisions.get(entry.id)??0))return casDriftSkipped++,casDriftedIds.add(entry.id),entry;let newLesson=(rec.lesson??"").trim();if(newLesson.length<15||newLesson.length>280)return entry;if(knowledgeConfig.validation_enabled!==!1){if(!validateLesson(newLesson,[],{category:entry.category,scope:entry.scope,confidence:entry.confidence??0.5}).valid)return warn(`[curator] rewrite for entry '${entry.id}' rejected by content validation`),entry}return appliedIds.add(entry.id),txApplied++,modified=!0,{...entry,lesson:newLesson,updated_at:new Date().toISOString(),confidence:Math.max(0.1,(entry.confidence??0.5)-0.05),revision:(entry.revision??0)+1,content_hash:computeContentHash(newLesson),...genStamp}}default:return entry}});return applied+=txApplied,modified?updatedEntries:null}),skipped+=idResolutionSkipped,skipped+=casDriftSkipped;for(let{id,reason}of contradictedEntries)try{await recordKnowledgeEvent(directory,{type:"contradicted",knowledge_id:id,trace_id:`curator-${randomUUID9()}`,session_id:"curator",agent:"curator",reason:`flag_contradiction: ${reason}`,evidence:{summary:reason}})}catch{}if(contradictedEntries.length>0&&knowledgeConfig.contradiction_threshold_action==="quarantine"){let{maybeQuarantineOnContradiction:maybeQuarantineOnContradiction2}=await Promise.resolve().then(() => (init_knowledge_escalator(),exports_knowledge_escalator));for(let{id}of contradictedEntries)try{await maybeQuarantineOnContradiction2(directory,id,knowledgeConfig.contradiction_quarantine_threshold,knowledgeConfig.contradiction_quarantine_window_days)}catch{}}for(let rec of validRecommendations)if(rec.entry_id!==void 0&&!appliedIds.has(rec.entry_id)){if(casDriftedIds.has(rec.entry_id))continue;if(!foundIds.has(rec.entry_id))warn(`[curator] applyCuratorKnowledgeUpdates: entry_id '${rec.entry_id}' not found — skipping`);skipped++}let archivedRecs=validRecommendations.filter((r)=>r.action==="archive"&&r.entry_id&&appliedIds.has(r.entry_id)),precomputedArchivedIds=archivedRecs.length>0?await getArchivedKnowledgeIds(directory):void 0;for(let rec of archivedRecs)try{await writeArchiveTombstoneAndInvalidateSkills({directory,entryId:rec.entry_id,tier:"swarm",actor:"curator",reason:rec.reason??"curator archive recommendation",mode:"archive",previousStatus:archivedPrevStatus.get(rec.entry_id),sourceLabel:"curator",precomputedArchivedIds})}catch(err){warn(`[curator] archive invalidation for entry '${rec.entry_id}' failed: ${err instanceof Error?err.message:String(err)}`)}let currentLessons=(await readKnowledge(knowledgePath)).map((e)=>e.lesson);for(let rec of validRecommendations){if(rec.entry_id!==void 0)continue;if(rec.action!=="promote"){skipped++;continue}let lesson=(rec.lesson?.trim()??"").slice(0,280);if(lesson.length<15){skipped++;continue}if(currentLessons.some((el)=>el.toLowerCase()===lesson.toLowerCase())){skipped++;continue}if(knowledgeConfig.validation_enabled!==!1){if(!validateLesson(lesson,currentLessons,{category:rec.category??"other",scope:"global",confidence:rec.confidence??0.5}).valid){skipped++;continue}}let now=new Date().toISOString(),newEntry={id:randomUUID9(),tier:"swarm",lesson,category:rec.category??"other",tags:[],scope:"global",confidence:rec.confidence??0.5,status:"candidate",confirmed_by:[],retrieval_outcomes:{applied_count:0,succeeded_after_count:0,failed_after_count:0},schema_version:1,created_at:now,updated_at:now,auto_generated:!0,project_name:path80.basename(directory),triggers:rec.triggers,required_actions:rec.required_actions,forbidden_actions:rec.forbidden_actions,applies_to_agents:rec.applies_to_agents,applies_to_tools:rec.applies_to_tools,verification_checks:rec.verification_checks,directive_priority:rec.directive_priority};if(!validateActionability(newEntry).actionable){try{await appendUnactionable(directory,newEntry,"curator_recommendation_unactionable")}catch{}skipped++;continue}await appendKnowledge(knowledgePath,newEntry),applied++,currentLessons.push(lesson)}return{applied,skipped}}var DEFAULT_CURATOR_LLM_TIMEOUT_MS=300000,MAX_CURATOR_PHASE_DIGESTS=50,MAX_CURATOR_COMPLIANCE_OBSERVATIONS=200,MAX_CURATOR_RECOMMENDATIONS=200,_internals46,UUID_V4,HEX_ID_PREFIX;var init_curator=__esm(()=>{init_explorer();init_event_bus();init_schema();init_curation_policy();init_scan_cursor();init_manager();init_learning_metrics();init_skill_generator();init_skill_reviser();init_state2();init_bun_compat();init_logger();init_knowledge_events();init_knowledge_store();init_knowledge_types();init_knowledge_validator();init_skill_invalidator();init_skill_usage_log();init_utils2();_internals46={parseKnowledgeRecommendations,parseKnowledgeRecommendationsWithDiagnostics,readCuratorSummary,writeCuratorSummary,appendCuratorRecommendation,mergeCuratorPhaseSummary,readCuratorSummaryState,writeCuratorSummaryState,transactFile,filterPhaseEvents,checkPhaseCompliance,normalizeAgentName,autoRetireSkills,readSkillUsageEntries,listSkills,parseDraftFrontmatter,retireOrMarkStale,retireSkill,getArchivedKnowledgeIds,readFileAsync:(filePath,encoding)=>import("node:fs/promises").then((fs37)=>fs37.readFile(filePath,encoding)),readKnowledge,reviseSkill,getSkillVersion,readLatestPostMortemDigest:(directory)=>readLatestPostMortemDigest(directory)},UUID_V4=/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,HEX_ID_PREFIX=/^[0-9a-f]{8,}$/i});function evaluatePromotionPolicy(input){let{entry,config:config3,evidence}=input,gates=[],active=isActiveStatus(entry.status);gates.push({name:"active_status",passed:active,detail:active?`status='${entry.status}' is retrieval-active`:`status='${entry.status}' is inactive (archived/quarantined/quarantined_unactionable)`});let routeDetail=describeEligibilityRoute(entry,config3.auto_promote_days);gates.push({name:"eligibility_route",passed:routeDetail.passed,detail:routeDetail.detail});let minApps=config3.promotion_min_terminal_applications??0,minCohorts=config3.promotion_min_distinct_cohorts??0,distinctCohorts=new Set(evidence.map((e)=>e.cohort_id).filter((c)=>!!c)),appsOk=evidence.length>=minApps,cohortsOk=distinctCohorts.size>=minCohorts;gates.push({name:"validated_terminal_applications",passed:appsOk&&cohortsOk,detail:minApps===0&&minCohorts===0?"threshold 0 — no application-evidence gate active (until #1849)":`${evidence.length} receipt(s) across ${distinctCohorts.size} cohort(s) (need ≥${minApps} app / ≥${minCohorts} cohort)`});let notFloorDemoted=entry.confidence_floor_demoted!==!0;gates.push({name:"confidence_floor",passed:notFloorDemoted,detail:notFloorDemoted?"entry not confidence-floor-demoted":"entry is confidence-floor-demoted; recover above the floor before promoting"});let eligible=gates.every((g)=>g.passed),failed=gates.filter((g)=>!g.passed),reason=eligible?"all policy gates passed":`failed gate(s): ${failed.map((g)=>g.name).join(", ")}`;return{eligible,gates,reason}}function describeEligibilityRoute(entry,autoPromoteDays){if(!isActiveStatus(entry.status))return{passed:!1,detail:"inactive status (route precondition failed)"};let phaseNumbers=new Set;for(let record3 of entry.confirmed_by??[])if(record3&&typeof record3.phase_number==="number")phaseNumbers.add(record3.phase_number);if(entry.hive_eligible===!0&&phaseNumbers.size>=3)return{passed:!0,detail:`route 1: hive_eligible + ${phaseNumbers.size} distinct phase(s)`};if((entry.tags??[]).includes("hive-fast-track"))return{passed:!0,detail:"route 2: hive-fast-track tag"};let createdMs=Date.parse(entry.created_at),ageMs=Number.isFinite(createdMs)?Date.now()-createdMs:0,ageThresholdMs=autoPromoteDays*86400000;if(ageMs>=ageThresholdMs)return{passed:!0,detail:`route 3: age ${Math.round(ageMs/86400000)}d ≥ ${autoPromoteDays}d`};return{passed:!1,detail:`no eligibility route: hive_eligible=${entry.hive_eligible===!0} (${phaseNumbers.size} phases), fast-track=${(entry.tags??[]).includes("hive-fast-track")}, age=${Math.round(ageMs/86400000)}d < ${autoPromoteDays}d`}}function failedGateNames(decision){return decision.gates.filter((g)=>!g.passed).map((g)=>g.name)}var init_hive_policy=__esm(()=>{init_knowledge_types()});import{appendFile as appendFile10,mkdir as mkdir21}from"node:fs/promises";import*as path81 from"node:path";async function transactHiveStore(mutate){let dataDir=_internals47.resolveHiveDataDir(),hivePath=_internals47.resolveHiveKnowledgePath(),rejectedPath=_internals47.resolveHiveRejectedPath(),eventsPath=_internals47.resolveHiveEventsPath(),diagnostics=[];try{await mkdir21(dataDir,{recursive:!0})}catch(err){return diagnostics.push(`hive data dir create failed: ${err instanceof Error?err.message:String(err)}`),{committed:!1,return:void 0,diagnostics}}let release=null;try{try{release=await _internals47.lockfile.lock(dataDir,{...HIVE_LOCK_RETRIES,stale:HIVE_LOCK_STALE_MS})}catch(err){return diagnostics.push(`hive lock acquire failed: ${err instanceof Error?err.message:String(err)}`),{committed:!1,return:void 0,diagnostics}}let entries=await _internals47.readKnowledge(hivePath),outcome=await mutate({entries});if(outcome.kind==="noop")return{committed:!1,return:outcome.return,diagnostics};let committedEntries=outcome.entries;try{for(let entry of committedEntries){if(JSON.stringify(entry),typeof entry.id!=="string"||entry.id.length===0)throw Error("entry missing string id");if(typeof entry.lesson!=="string"||entry.lesson.length===0)throw Error("entry missing non-empty lesson")}}catch(err){return diagnostics.push(`hive validation failed; aborting before commit: ${err instanceof Error?err.message:String(err)}`),{committed:!1,return:void 0,diagnostics}}if(typeof outcome.maxEntries==="number"&&committedEntries.length>outcome.maxEntries)committedEntries=_internals47.selectKnowledgeCapSurvivors(committedEntries,outcome.maxEntries);let content=committedEntries.map((e)=>JSON.stringify(e)).join(`
1258
+ ${summary}`}catch(learningErr){warn(`[curator] learning summary failed: ${learningErr instanceof Error?learningErr.message:String(learningErr)}`)}let result={phase,digest:phaseDigest,compliance:complianceObservations,knowledge_recommendations:knowledgeRecommendations,summary_updated:summaryUpdated,knowledge_application_findings:knowledgeApplicationFindings,skill_candidates:skillCandidates};return getGlobalEventBus().publish("curator.phase.completed",{phase,compliance_count:complianceObservations.length,summary_updated:summaryUpdated}),result}catch(err){return getGlobalEventBus().publish("curator.error",{operation:"phase",phase,error:String(err)}),{phase,digest:{phase,timestamp:new Date().toISOString(),summary:`Phase ${phase} curator run failed: ${String(err)}`,agents_used:[],tasks_completed:0,tasks_total:0,key_decisions:[],blockers_resolved:[]},compliance:[],knowledge_recommendations:[],summary_updated:!1}}}async function applyCuratorKnowledgeUpdates(directory,recommendations,knowledgeConfig,generation){let applied=0,skipped=0,genStamp=generation!==void 0?{last_curated_generation:generation}:void 0;if(!recommendations||recommendations.length===0)return{applied,skipped};if(knowledgeConfig==null)return{applied:0,skipped:0};let validRecommendations=recommendations.filter((rec)=>rec!=null),knowledgePath=resolveSwarmKnowledgePath(directory),authorizedRevisions=new Map;if(validRecommendations.length>0){let preSnapshot=await _internals46.readKnowledge(knowledgePath),authorizedRecs=[];for(let rec of validRecommendations){if(rec.action!=="archive"&&rec.action!=="rewrite"){authorizedRecs.push(rec);continue}if(!rec.entry_id){authorizedRecs.push(rec);continue}let target=preSnapshot.find((e)=>e.id===rec.entry_id)??null,decision=await authorizeCuration({directory,action:rec.action,entryId:rec.entry_id??"",reason:rec.reason,evidenceScope:"cohort-wide"},{config:knowledgeConfig,entry:target});if(decision.authorized)authorizedRecs.push(rec),authorizedRevisions.set(rec.entry_id,target?.revision??void 0);else skipped++,warn(`[curator] ${rec.action} for '${rec.entry_id}' blocked by cohort-safety (basis: ${decision.basis})`)}validRecommendations=authorizedRecs}let appliedIds=new Set,foundIds=new Set,idResolutionSkipped=0,casDriftSkipped=0,casDriftedIds=new Set,archivedPrevStatus=new Map,contradictedEntries=[];await transactKnowledge(knowledgePath,(entries)=>{appliedIds.clear(),foundIds.clear(),archivedPrevStatus.clear(),contradictedEntries.length=0,casDriftSkipped=0,casDriftedIds.clear();let txApplied=0,modified=!1;for(let e of entries)foundIds.add(e.id);let resolvedRecommendations=resolveKnowledgeRecommendationIds(validRecommendations,entries);validRecommendations=resolvedRecommendations.recommendations,idResolutionSkipped=resolvedRecommendations.diagnostics.length;for(let diagnostic of resolvedRecommendations.diagnostics)warn(`[curator] applyCuratorKnowledgeUpdates: entry_id '${diagnostic.line}' ${diagnostic.reason} — skipping`);let updatedEntries=entries.map((entry)=>{let rec=validRecommendations.find((r)=>r.entry_id===entry.id);if(!rec)return entry;if(generation!==void 0&&alreadyCuratedThisGeneration(entry,generation))return entry;switch(rec.action){case"promote":return appliedIds.add(entry.id),txApplied++,modified=!0,{...entry,hive_eligible:!0,confidence:Math.min(1,(entry.confidence??0)+0.1),updated_at:new Date().toISOString(),...genStamp};case"archive":{if(authorizedRevisions.has(entry.id)&&(entry.revision??0)!==(authorizedRevisions.get(entry.id)??0))return casDriftSkipped++,casDriftedIds.add(entry.id),entry;if(entry.status==="archived")return entry;return appliedIds.add(entry.id),archivedPrevStatus.set(entry.id,entry.status),txApplied++,modified=!0,{...entry,status:"archived",archived_from:entry.status,archived_at:new Date().toISOString(),updated_at:new Date().toISOString(),...genStamp}}case"flag_contradiction":return appliedIds.add(entry.id),txApplied++,modified=!0,contradictedEntries.push({id:entry.id,reason:(rec.reason??"").slice(0,200)}),{...entry,tags:[...entry.tags??[],`contradiction:${(rec.reason??"").slice(0,50)}`],updated_at:new Date().toISOString(),...genStamp};case"rewrite":{if(authorizedRevisions.has(entry.id)&&(entry.revision??0)!==(authorizedRevisions.get(entry.id)??0))return casDriftSkipped++,casDriftedIds.add(entry.id),entry;let newLesson=(rec.lesson??"").trim();if(newLesson.length<15||newLesson.length>280)return entry;if(knowledgeConfig.validation_enabled!==!1){if(!validateLesson(newLesson,[],{category:entry.category,scope:entry.scope,confidence:entry.confidence??0.5}).valid)return warn(`[curator] rewrite for entry '${entry.id}' rejected by content validation`),entry}return appliedIds.add(entry.id),txApplied++,modified=!0,{...entry,lesson:newLesson,updated_at:new Date().toISOString(),confidence:Math.max(0.1,(entry.confidence??0.5)-0.05),revision:(entry.revision??0)+1,content_hash:computeContentHash(newLesson),...genStamp}}default:return entry}});return applied+=txApplied,modified?updatedEntries:null}),skipped+=idResolutionSkipped,skipped+=casDriftSkipped;for(let{id,reason}of contradictedEntries)try{await recordKnowledgeEvent(directory,{type:"contradicted",knowledge_id:id,trace_id:`curator-${randomUUID9()}`,session_id:"curator",agent:"curator",reason:`flag_contradiction: ${reason}`,evidence:{summary:reason}})}catch{}if(contradictedEntries.length>0&&knowledgeConfig.contradiction_threshold_action==="quarantine"){let{maybeQuarantineOnContradiction:maybeQuarantineOnContradiction2}=await Promise.resolve().then(() => (init_knowledge_escalator(),exports_knowledge_escalator));for(let{id}of contradictedEntries)try{await maybeQuarantineOnContradiction2(directory,id,knowledgeConfig.contradiction_quarantine_threshold,knowledgeConfig.contradiction_quarantine_window_days)}catch{}}for(let rec of validRecommendations)if(rec.entry_id!==void 0&&!appliedIds.has(rec.entry_id)){if(casDriftedIds.has(rec.entry_id))continue;if(!foundIds.has(rec.entry_id))warn(`[curator] applyCuratorKnowledgeUpdates: entry_id '${rec.entry_id}' not found — skipping`);skipped++}let archivedRecs=validRecommendations.filter((r)=>r.action==="archive"&&r.entry_id&&appliedIds.has(r.entry_id)),precomputedArchivedIds=archivedRecs.length>0?await getArchivedKnowledgeIds(directory):void 0;for(let rec of archivedRecs)try{await writeArchiveTombstoneAndInvalidateSkills({directory,entryId:rec.entry_id,tier:"swarm",actor:"curator",reason:rec.reason??"curator archive recommendation",mode:"archive",previousStatus:archivedPrevStatus.get(rec.entry_id),sourceLabel:"curator",precomputedArchivedIds})}catch(err){warn(`[curator] archive invalidation for entry '${rec.entry_id}' failed: ${err instanceof Error?err.message:String(err)}`)}let currentLessons=(await readKnowledge(knowledgePath)).map((e)=>e.lesson);for(let rec of validRecommendations){if(rec.entry_id!==void 0)continue;if(rec.action!=="promote"){skipped++;continue}let lesson=(rec.lesson?.trim()??"").slice(0,280);if(lesson.length<15){skipped++;continue}if(currentLessons.some((el)=>el.toLowerCase()===lesson.toLowerCase())){skipped++;continue}if(knowledgeConfig.validation_enabled!==!1){if(!validateLesson(lesson,currentLessons,{category:rec.category??"other",scope:"global",confidence:rec.confidence??0.5}).valid){skipped++;continue}}let now=new Date().toISOString(),newEntry={id:randomUUID9(),tier:"swarm",lesson,category:rec.category??"other",tags:[],scope:"global",confidence:rec.confidence??0.5,status:"candidate",confirmed_by:[],retrieval_outcomes:{applied_count:0,succeeded_after_count:0,failed_after_count:0},schema_version:1,created_at:now,updated_at:now,auto_generated:!0,project_name:path80.basename(directory),triggers:rec.triggers,required_actions:rec.required_actions,forbidden_actions:rec.forbidden_actions,applies_to_agents:rec.applies_to_agents,applies_to_tools:rec.applies_to_tools,verification_checks:rec.verification_checks,directive_priority:rec.directive_priority};if(!validateActionability(newEntry).actionable){try{await appendUnactionable(directory,newEntry,"curator_recommendation_unactionable")}catch{}skipped++;continue}await appendKnowledge(knowledgePath,newEntry),applied++,currentLessons.push(lesson)}return{applied,skipped}}var DEFAULT_CURATOR_LLM_TIMEOUT_MS=300000,MAX_CURATOR_PHASE_DIGESTS=50,MAX_CURATOR_COMPLIANCE_OBSERVATIONS=200,MAX_CURATOR_RECOMMENDATIONS=200,_internals46,UUID_V4,HEX_ID_PREFIX;var init_curator=__esm(()=>{init_explorer();init_event_bus();init_schema();init_curation_policy();init_scan_cursor();init_manager();init_learning_metrics();init_skill_generator();init_skill_reviser();init_state2();init_bun_compat();init_logger();init_knowledge_events();init_knowledge_store();init_knowledge_types();init_knowledge_validator();init_skill_invalidator();init_skill_usage_log();init_utils2();_internals46={parseKnowledgeRecommendations,parseKnowledgeRecommendationsWithDiagnostics,readCuratorSummary,writeCuratorSummary,appendCuratorRecommendation,mergeCuratorPhaseSummary,readCuratorSummaryState,writeCuratorSummaryState,transactFile,filterPhaseEvents,checkPhaseCompliance,normalizeAgentName,autoRetireSkills,readSkillUsageEntries,listSkills,parseDraftFrontmatter,retireOrMarkStale,retireSkill,getArchivedKnowledgeIds,readFileAsync:(filePath,encoding)=>import("node:fs/promises").then((fs37)=>fs37.readFile(filePath,encoding)),readKnowledge,reviseSkill,getSkillVersion,readLatestPostMortemDigest:(directory)=>readLatestPostMortemDigest(directory)},UUID_V4=/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,HEX_ID_PREFIX=/^[0-9a-f]{8,}$/i});function evaluatePromotionPolicy(input){let{entry,config:config3,evidence}=input,gates=[],active=isActiveStatus(entry.status);gates.push({name:"active_status",passed:active,detail:active?`status='${entry.status}' is retrieval-active`:`status='${entry.status}' is inactive (archived/quarantined/quarantined_unactionable)`});let routeDetail=describeEligibilityRoute(entry,config3.auto_promote_days);gates.push({name:"eligibility_route",passed:routeDetail.passed,detail:routeDetail.detail});let minApps=config3.promotion_min_terminal_applications??0,minCohorts=config3.promotion_min_distinct_cohorts??0,distinctCohorts=new Set(evidence.map((e)=>e.cohort_id).filter((c)=>!!c)),appsOk=evidence.length>=minApps,cohortsOk=distinctCohorts.size>=minCohorts;gates.push({name:"validated_terminal_applications",passed:appsOk&&cohortsOk,detail:minApps===0&&minCohorts===0?"threshold 0 — no application-evidence gate active (until #1849)":`${evidence.length} receipt(s) across ${distinctCohorts.size} cohort(s) (need ≥${minApps} app / ≥${minCohorts} cohort)`});let notFloorDemoted=entry.confidence_floor_demoted!==!0;gates.push({name:"confidence_floor",passed:notFloorDemoted,detail:notFloorDemoted?"entry not confidence-floor-demoted":"entry is confidence-floor-demoted; recover above the floor before promoting"});let eligible=gates.every((g)=>g.passed),failed=gates.filter((g)=>!g.passed),reason=eligible?"all policy gates passed":`failed gate(s): ${failed.map((g)=>g.name).join(", ")}`;return{eligible,gates,reason}}function describeEligibilityRoute(entry,autoPromoteDays){if(!isActiveStatus(entry.status))return{passed:!1,detail:"inactive status (route precondition failed)"};let phaseNumbers=new Set;for(let record3 of entry.confirmed_by??[])if(record3&&typeof record3.phase_number==="number")phaseNumbers.add(record3.phase_number);if(entry.hive_eligible===!0&&phaseNumbers.size>=3)return{passed:!0,detail:`route 1: hive_eligible + ${phaseNumbers.size} distinct phase(s)`};if((entry.tags??[]).includes("hive-fast-track"))return{passed:!0,detail:"route 2: hive-fast-track tag"};let createdMs=Date.parse(entry.created_at),ageMs=Number.isFinite(createdMs)?Date.now()-createdMs:0,ageThresholdMs=autoPromoteDays*86400000;if(ageMs>=ageThresholdMs)return{passed:!0,detail:`route 3: age ${Math.round(ageMs/86400000)}d ≥ ${autoPromoteDays}d`};return{passed:!1,detail:`no eligibility route: hive_eligible=${entry.hive_eligible===!0} (${phaseNumbers.size} phases), fast-track=${(entry.tags??[]).includes("hive-fast-track")}, age=${Math.round(ageMs/86400000)}d < ${autoPromoteDays}d`}}function failedGateNames(decision){return decision.gates.filter((g)=>!g.passed).map((g)=>g.name)}var init_hive_policy=__esm(()=>{init_knowledge_types()});import{appendFile as appendFile11,mkdir as mkdir21}from"node:fs/promises";import*as path81 from"node:path";async function transactHiveStore(mutate){let dataDir=_internals47.resolveHiveDataDir(),hivePath=_internals47.resolveHiveKnowledgePath(),rejectedPath=_internals47.resolveHiveRejectedPath(),eventsPath=_internals47.resolveHiveEventsPath(),diagnostics=[];try{await mkdir21(dataDir,{recursive:!0})}catch(err){return diagnostics.push(`hive data dir create failed: ${err instanceof Error?err.message:String(err)}`),{committed:!1,return:void 0,diagnostics}}let release=null;try{try{release=await _internals47.lockfile.lock(dataDir,{...HIVE_LOCK_RETRIES,stale:HIVE_LOCK_STALE_MS})}catch(err){return diagnostics.push(`hive lock acquire failed: ${err instanceof Error?err.message:String(err)}`),{committed:!1,return:void 0,diagnostics}}let entries=await _internals47.readKnowledge(hivePath),outcome=await mutate({entries});if(outcome.kind==="noop")return{committed:!1,return:outcome.return,diagnostics};let committedEntries=outcome.entries;try{for(let entry of committedEntries){if(JSON.stringify(entry),typeof entry.id!=="string"||entry.id.length===0)throw Error("entry missing string id");if(typeof entry.lesson!=="string"||entry.lesson.length===0)throw Error("entry missing non-empty lesson")}}catch(err){return diagnostics.push(`hive validation failed; aborting before commit: ${err instanceof Error?err.message:String(err)}`),{committed:!1,return:void 0,diagnostics}}if(typeof outcome.maxEntries==="number"&&committedEntries.length>outcome.maxEntries)committedEntries=_internals47.selectKnowledgeCapSurvivors(committedEntries,outcome.maxEntries);let content=committedEntries.map((e)=>JSON.stringify(e)).join(`
1251
1259
  `)+(committedEntries.length>0?`
1252
1260
  `:"");if(await _internals47.atomicWriteFile(hivePath,content),outcome.rejects&&outcome.rejects.length>0){let rejectBlock=`${outcome.rejects.map((r)=>JSON.stringify(r)).join(`
1253
1261
  `)}
1254
- `;await appendFile10(rejectedPath,rejectBlock,"utf-8")}if(outcome.audit&&outcome.audit.length>0){let auditBlock=`${outcome.audit.map((a)=>a.line).join(`
1262
+ `;await appendFile11(rejectedPath,rejectBlock,"utf-8")}if(outcome.audit&&outcome.audit.length>0){let auditBlock=`${outcome.audit.map((a)=>a.line).join(`
1255
1263
  `)}
1256
- `;await appendFile10(eventsPath,auditBlock,"utf-8");try{await trimHiveEventsUnderLock(eventsPath)}catch(err){warn(`[hive-transaction] hive events cap trim failed (non-fatal): ${err instanceof Error?err.message:String(err)}`)}}return{committed:!0,return:outcome.return,diagnostics}}finally{if(release)try{await release()}catch{}}}async function trimHiveEventsUnderLock(eventsPath){let{readFile:readFile24}=await import("node:fs/promises"),{existsSync:existsSync38}=await import("node:fs");if(!existsSync38(eventsPath))return;let lines=(await readFile24(eventsPath,"utf-8")).split(`
1264
+ `;await appendFile11(eventsPath,auditBlock,"utf-8");try{await trimHiveEventsUnderLock(eventsPath)}catch(err){warn(`[hive-transaction] hive events cap trim failed (non-fatal): ${err instanceof Error?err.message:String(err)}`)}}return{committed:!0,return:outcome.return,diagnostics}}finally{if(release)try{await release()}catch{}}}async function trimHiveEventsUnderLock(eventsPath){let{readFile:readFile24}=await import("node:fs/promises"),{existsSync:existsSync38}=await import("node:fs");if(!existsSync38(eventsPath))return;let lines=(await readFile24(eventsPath,"utf-8")).split(`
1257
1265
  `).filter((l)=>l.trim().length>0);if(lines.length<=MAX_EVENT_LOG_ENTRIES)return;let trimmed=lines.slice(lines.length-MAX_EVENT_LOG_ENTRIES);await atomicWriteFile(eventsPath,`${trimmed.join(`
1258
1266
  `)}
1259
- `)}var import_proper_lockfile7,HIVE_LOCK_STALE_MS=5000,HIVE_LOCK_RETRIES,_internals47;var init_hive_transaction=__esm(()=>{init_task_file();init_hive_paths();init_logger();init_knowledge_events();init_knowledge_store();import_proper_lockfile7=__toESM(require_proper_lockfile(),1),HIVE_LOCK_RETRIES={retries:{retries:5,minTimeout:100,maxTimeout:500}};_internals47={lockfile:import_proper_lockfile7.default,readKnowledge,atomicWriteFile,selectKnowledgeCapSurvivors,resolveHiveDataDir,resolveHiveKnowledgePath,resolveHiveRejectedPath,resolveHiveEventsPath,path:path81}});import{appendFile as appendFile11,mkdir as mkdir22,readFile as readFile24,rename as rename11,writeFile as writeFile15}from"node:fs/promises";import*as path82 from"node:path";function resolvePromotionEvidencePath(directory){return validateSwarmPath(directory,"knowledge-promotion-evidence.jsonl")}function parseRecord(line){try{let o=JSON.parse(line);if(typeof o.cohort_id==="string"&&typeof o.entry_id==="string"&&typeof o.retrieval_trace_id==="string"&&(o.receipt_outcome==="applied"||o.receipt_outcome==="violated"||o.receipt_outcome==="contradicted")&&typeof o.receipt_event_id==="string"&&typeof o.timestamp==="string")return o}catch{}return null}async function appendPromotionEvidence(directory,records){if(records.length===0)return;let filePath=resolvePromotionEvidencePath(directory);try{await mkdir22(path82.dirname(filePath),{recursive:!0});let block=records.map((r)=>JSON.stringify(r)).join(`
1260
- `);await appendFile11(filePath,`${block}
1267
+ `)}var import_proper_lockfile7,HIVE_LOCK_STALE_MS=5000,HIVE_LOCK_RETRIES,_internals47;var init_hive_transaction=__esm(()=>{init_task_file();init_hive_paths();init_logger();init_knowledge_events();init_knowledge_store();import_proper_lockfile7=__toESM(require_proper_lockfile(),1),HIVE_LOCK_RETRIES={retries:{retries:5,minTimeout:100,maxTimeout:500}};_internals47={lockfile:import_proper_lockfile7.default,readKnowledge,atomicWriteFile,selectKnowledgeCapSurvivors,resolveHiveDataDir,resolveHiveKnowledgePath,resolveHiveRejectedPath,resolveHiveEventsPath,path:path81}});import{appendFile as appendFile12,mkdir as mkdir22,readFile as readFile24,rename as rename11,writeFile as writeFile15}from"node:fs/promises";import*as path82 from"node:path";function resolvePromotionEvidencePath(directory){return validateSwarmPath(directory,"knowledge-promotion-evidence.jsonl")}function parseRecord(line){try{let o=JSON.parse(line);if(typeof o.cohort_id==="string"&&typeof o.entry_id==="string"&&typeof o.retrieval_trace_id==="string"&&(o.receipt_outcome==="applied"||o.receipt_outcome==="violated"||o.receipt_outcome==="contradicted")&&typeof o.receipt_event_id==="string"&&typeof o.timestamp==="string")return o}catch{}return null}async function appendPromotionEvidence(directory,records){if(records.length===0)return;let filePath=resolvePromotionEvidencePath(directory);try{await mkdir22(path82.dirname(filePath),{recursive:!0});let block=records.map((r)=>JSON.stringify(r)).join(`
1268
+ `);await appendFile12(filePath,`${block}
1261
1269
  `,"utf-8"),await trimIfOversized(filePath).catch(()=>{})}catch(err){log("[promotion-evidence] append failed (fail-open)",{error:err instanceof Error?err.message:String(err),count:records.length})}}async function trimIfOversized(filePath){let content;try{content=await readFile24(filePath,"utf-8")}catch{return}let lines=content.split(`
1262
1270
  `).filter((l)=>l.trim().length>0);if(lines.length<=MAX_PROMOTION_EVIDENCE_ENTRIES)return;let kept=lines.slice(lines.length-MAX_PROMOTION_EVIDENCE_ENTRIES),tmp=`${filePath}.tmp`;await writeFile15(tmp,`${kept.join(`
1263
1271
  `)}
@@ -1324,7 +1332,7 @@ ${newSection}`;else updatedContent=existingContent+newSection;let swarmDir=path8
1324
1332
  `).slice(0,800)}function buildMicroPrompt(params){let trajectorySummary=summarizeTrajectory(params.trajectory),transcriptTail=(params.transcript??"").slice(-700);return[`A ${params.agent} subagent just finished with outcome: ${params.outcome}.`,"Extract 0-2 GENERALIZABLE, ACTIONABLE lessons that would prevent this class of failure next time. Skip task-specific trivia.","Output ONLY a JSON array (no prose, no fences). Each element MUST have:",' "lesson": string (15-280 chars, generalizable),',' at least one scope field: "applies_to_agents" (e.g. ["coder"]) or "applies_to_tools" (e.g. ["edit"]),',' at least one predicate field: "forbidden_actions" | "required_actions" | "verification_checks" (arrays of short strings).','Optional: "category" (process|testing|debugging|tooling|architecture|...), "directive_priority" (low|medium|high|critical).',"Return [] if there is no generalizable lesson.","",`RECENT TRAJECTORY:
1325
1333
  ${trajectorySummary}`,"",`TRANSCRIPT TAIL:
1326
1334
  ${transcriptTail}`].join(`
1327
- `).slice(0,MICRO_PROMPT_INPUT_CAP)}function parseMicroCandidates(response,meta3){let parsed;try{let start=response.indexOf("["),end=response.lastIndexOf("]");if(start<0||end<=start)return[];parsed=JSON.parse(response.slice(start,end+1))}catch{return[]}if(!Array.isArray(parsed))return[];let out=[];for(let item of parsed){if(out.length>=MAX_CANDIDATES)break;if(!item||typeof item!=="object")continue;let rec=item,lesson=typeof rec.lesson==="string"?rec.lesson.trim():"";if(lesson.length<15||lesson.length>280)continue;let fields={};for(let key of CANDIDATE_ALLOWED_FIELDS){let v=rec[key];if(Array.isArray(v)){let arr=v.filter((x)=>typeof x==="string").map((x)=>x.slice(0,200)).slice(0,20);if(arr.length>0)fields[key]=arr}}let priority=rec.directive_priority;if(priority==="low"||priority==="medium"||priority==="high"||priority==="critical")fields.directive_priority=priority;if(!validateActionableFields(fields).valid)continue;if(!validateActionability(fields).actionable)continue;let category=typeof rec.category==="string"?rec.category:"process";out.push({lesson,category,tags:[],...fields,source:{kind:"micro_reflection",task_id:meta3.taskId,agent:meta3.agent,outcome:meta3.outcome,trajectory_steps:meta3.steps},created_at:new Date().toISOString()})}return out}async function runMicroReflection(params){let outcome=classifyOutcome(params.transcript,params.trajectory),result={outcome,reflected:!1,candidates:0};try{if(!REFLECT_OUTCOMES.has(outcome))return result;if(!params.llmDelegate)return result;let quota=params.quota??{maxCalls:10,window:"utc"};if(!(await reserveQuota(params.directory,{nCalls:1,maxCalls:quota.maxCalls,window:quota.window,scope:"knowledge-enrichment"})).allowed)return result;let prompt=buildMicroPrompt({agent:params.agent,outcome,transcript:params.transcript,trajectory:params.trajectory}),response=await params.llmDelegate("",prompt,AbortSignal.timeout(MICRO_LLM_TIMEOUT_MS));result.reflected=!0;let candidates=parseMicroCandidates(response,{agent:params.agent,outcome,taskId:params.taskId,steps:params.trajectory.length});return await appendInsightCandidates(params.directory,candidates),result.candidates=candidates.length,result}catch(err){return warn(`[micro-reflector] reflection failed (non-fatal): ${err instanceof Error?err.message:String(err)}`),result}}function extractTaskId(prompt){let m=/\btask[_-]?id\s*[:=]\s*([A-Za-z0-9._-]{1,80})/i.exec(prompt);return m?m[1]:void 0}function isTaskTool(tool3){return tool3==="Task"||tool3==="task"}async function microReflectorAfter(directory,input,output,llmDelegate,quota){if(!isTaskTool(input.tool))return;let transcript=typeof output.output==="string"?output.output:"";if(!transcript)return;let argsRecord=(typeof input.callID==="string"?getStoredInputArgs(input.callID):void 0)??input.args??null,argsForParse=argsRecord??input.args,prompt=argsRecord&&typeof argsRecord.prompt==="string"?argsRecord.prompt:"",parsed=parseDelegationArgs(argsForParse),agent=parsed?stripKnownSwarmPrefix(parsed.targetAgent):"unknown",taskId=extractTaskId(prompt),trajectory=taskId?await readTaskTrajectory(directory,taskId):[];await runMicroReflection({directory,taskId,agent,transcript,trajectory,llmDelegate,quota})}var REFLECT_OUTCOMES,MICRO_PROMPT_INPUT_CAP=1800,MICRO_LLM_TIMEOUT_MS=60000,MAX_CANDIDATES=2,TEST_FAIL_RE,LINT_FAIL_RE,REVERT_RE,PARTIAL_RE,INSIGHT_CANDIDATES_MAX_ENTRIES=500,CANDIDATE_ALLOWED_FIELDS;var init_micro_reflector=__esm(()=>{init_schema();init_manager2();init_skill_improver_quota();init_logger();init_stored_input_args();init_knowledge_store();init_knowledge_validator();init_skill_propagation_gate();init_utils2();REFLECT_OUTCOMES=new Set(["failure_test","failure_lint","failure_revert","partial"]);TEST_FAIL_RE=/\b(\d+\s+fail(?:ed|ing|s)?|test(?:s)?\s+fail|failing\s+test|assertion\s+fail|FAIL\b|✗|✘)/i,LINT_FAIL_RE=/\b(lint\s+(?:error|fail)|biome\s+error|eslint\s+error|type\s*error|tsc\s+error|TS\d{3,})/i,REVERT_RE=/\b(revert(?:ed|ing)?|rolled?\s*back|restore[d]?\s+from\s+checkpoint|undo(?:ne)?\s+the\s+change)/i,PARTIAL_RE=/\b(partial(?:ly)\s+complete|did\s+not\s+(?:finish|complete)|could\s+not\s+(?:finish|complete)|ran\s+out\s+of\s+(?:time|context|budget)|remaining\s+work|blocked\s+on|unable\s+to\s+complete|task\s+incomplete)/i;CANDIDATE_ALLOWED_FIELDS=["applies_to_agents","applies_to_tools","forbidden_actions","required_actions","verification_checks","triggers"]});import{createHash as createHash22}from"node:crypto";import{existsSync as existsSync41}from"node:fs";import{appendFile as appendFile12,mkdir as mkdir24,readFile as readFile27,realpath as realpath3,writeFile as writeFile18}from"node:fs/promises";import*as path90 from"node:path";function pruneSeenRetroSections(){let cutoff=Date.now()-86400000;for(let[key,entry]of seenRetroSections)if(entry.timestamp<cutoff)seenRetroSections.delete(key)}function capSeenRetroSections(){let overflow=seenRetroSections.size-MAX_TRACKED_RETRO_SECTIONS;if(overflow<=0)return;let byAge=Array.from(seenRetroSections.entries()).sort((a,b)=>a[1].timestamp-b[1].timestamp);for(let i=0;i<overflow;i++)seenRetroSections.delete(byAge[i][0])}function recordSeenRetroSection(key,value,timestamp){seenRetroSections.set(key,{value,timestamp}),capSeenRetroSections()}function hashContent2(content){return createHash22("sha1").update(content).digest("hex")}async function loadConfigForPolicyCurator(directory){let{KnowledgeConfigSchema:KnowledgeConfigSchema2}=await Promise.resolve().then(() => (init_schema(),exports_schema));try{let{loadPluginConfigWithMeta:loadPluginConfigWithMeta2}=await Promise.resolve().then(() => (init_config(),exports_config)),{config:loadedConfig}=loadPluginConfigWithMeta2(directory);return KnowledgeConfigSchema2.parse(loadedConfig.knowledge??{})}catch{return KnowledgeConfigSchema2.parse({})}}async function canonicalExistingPath(candidate){let resolved=path90.resolve(candidate);try{resolved=await _internals53.realpath(resolved)}catch{}return resolved}function isPathContained(root,candidate){let relative21=path90.relative(root,candidate);return relative21===""||!relative21.startsWith(`..${path90.sep}`)&&relative21!==".."&&!path90.isAbsolute(relative21)}function physicalPathIdentity(candidate){let normalized=candidate.replaceAll("\\","/").normalize("NFC");return process.platform==="win32"?normalized.toLowerCase():normalized}async function resolveEvidencePathScope(directory,relativeEvidencePath){let projectRoot=await canonicalExistingPath(directory),swarmRoot=await canonicalExistingPath(path90.join(projectRoot,".swarm"));if(!isPathContained(projectRoot,swarmRoot))return null;let evidenceRoot=await canonicalExistingPath(path90.join(swarmRoot,"evidence"));if(!isPathContained(swarmRoot,evidenceRoot))return null;let evidenceTarget=await canonicalExistingPath(path90.join(swarmRoot,...relativeEvidencePath.split("/")));if(!isPathContained(evidenceRoot,evidenceTarget))return null;return{projectIdentity:hashContent2(physicalPathIdentity(projectRoot)),evidenceIdentity:hashContent2(physicalPathIdentity(evidenceTarget))}}function sanitizeEvidenceLessons(value){if(!Array.isArray(value))return[];return value.filter((lesson)=>typeof lesson==="string").map((lesson)=>lesson.trim()).filter((lesson)=>lesson.length>0&&lesson.length<=280)}function evidenceProjectName(entry,root){let metadata=isRecord2(entry.metadata)?entry.metadata:null;return typeof entry.project_name==="string"?entry.project_name:typeof metadata?.project_name==="string"?metadata.project_name:typeof root.project_name==="string"?root.project_name:"unknown"}function evidencePhaseNumber(entry,root){return typeof entry.phase_number==="number"?entry.phase_number:typeof root.phase_number==="number"?root.phase_number:1}function extractEvidenceLessonBatches(evidenceData){let rawEntries=Array.isArray(evidenceData.entries)?evidenceData.entries:[evidenceData],batches=[];for(let rawEntry of rawEntries){if(!isRecord2(rawEntry))continue;if(Object.hasOwn(rawEntry,"type")&&rawEntry.type!=="retrospective")continue;let lessons=sanitizeEvidenceLessons(rawEntry.lessons_learned);if(lessons.length===0)continue;let phaseNumber=evidencePhaseNumber(rawEntry,evidenceData),projectName=evidenceProjectName(rawEntry,evidenceData),identity=hashContent2(JSON.stringify([rawEntry.type??"legacy-retrospective",rawEntry.task_id??evidenceData.task_id??"",rawEntry.timestamp??"",rawEntry.agent??"",phaseNumber,projectName,lessons]));batches.push({identity,lessons,projectName,phaseNumber})}return batches}function isWriteToEvidenceFile(input){let trigger=normalizeWriteTrigger(input);return isEvidencePath(trigger?.filePath)}function isRecord2(value){return typeof value==="object"&&value!==null}function normalizePathField(value){return typeof value==="string"?value.replace(/\\/g,"/"):null}function firstPathFromRecord(record3){return normalizePathField(record3.path)??normalizePathField(record3.filePath)??normalizePathField(record3.file)}function normalizeWriteTrigger(input,output){if(!isRecord2(input))return null;let toolName=typeof input.toolName==="string"?input.toolName:typeof input.tool==="string"?input.tool:null;if(!toolName||!WRITE_TOOLS.has(toolName))return null;let inputArgs=isRecord2(input.args)?input.args:null,outputArgs=isRecord2(output)&&isRecord2(output.args)?output.args:null,filePath=firstPathFromRecord(input)??(inputArgs?firstPathFromRecord(inputArgs):null)??(outputArgs?firstPathFromRecord(outputArgs):null);if(!filePath)return null;return{toolName,filePath,sessionID:typeof input.sessionID==="string"?input.sessionID:"default"}}function isEvidencePath(filePath){if(!filePath)return!1;return/(?:^|\/)\.swarm\/+evidence\//i.test(filePath)}function isPlanPath(filePath){return filePath?.includes(".swarm/plan.md")??!1}function extractRetrospectiveSection(planContent){let match=/^###\s+Lessons\s+Learned$/m.exec(planContent);if(!match)return null;let startIndex=match.index,restOfContent=planContent.slice(startIndex),firstNewline=restOfContent.indexOf(`
1335
+ `).slice(0,MICRO_PROMPT_INPUT_CAP)}function parseMicroCandidates(response,meta3){let parsed;try{let start=response.indexOf("["),end=response.lastIndexOf("]");if(start<0||end<=start)return[];parsed=JSON.parse(response.slice(start,end+1))}catch{return[]}if(!Array.isArray(parsed))return[];let out=[];for(let item of parsed){if(out.length>=MAX_CANDIDATES)break;if(!item||typeof item!=="object")continue;let rec=item,lesson=typeof rec.lesson==="string"?rec.lesson.trim():"";if(lesson.length<15||lesson.length>280)continue;let fields={};for(let key of CANDIDATE_ALLOWED_FIELDS){let v=rec[key];if(Array.isArray(v)){let arr=v.filter((x)=>typeof x==="string").map((x)=>x.slice(0,200)).slice(0,20);if(arr.length>0)fields[key]=arr}}let priority=rec.directive_priority;if(priority==="low"||priority==="medium"||priority==="high"||priority==="critical")fields.directive_priority=priority;if(!validateActionableFields(fields).valid)continue;if(!validateActionability(fields).actionable)continue;let category=typeof rec.category==="string"?rec.category:"process";out.push({lesson,category,tags:[],...fields,source:{kind:"micro_reflection",task_id:meta3.taskId,agent:meta3.agent,outcome:meta3.outcome,trajectory_steps:meta3.steps},created_at:new Date().toISOString()})}return out}async function runMicroReflection(params){let outcome=classifyOutcome(params.transcript,params.trajectory),result={outcome,reflected:!1,candidates:0};try{if(!REFLECT_OUTCOMES.has(outcome))return result;if(!params.llmDelegate)return result;let quota=params.quota??{maxCalls:10,window:"utc"};if(!(await reserveQuota(params.directory,{nCalls:1,maxCalls:quota.maxCalls,window:quota.window,scope:"knowledge-enrichment"})).allowed)return result;let prompt=buildMicroPrompt({agent:params.agent,outcome,transcript:params.transcript,trajectory:params.trajectory}),response=await params.llmDelegate("",prompt,AbortSignal.timeout(MICRO_LLM_TIMEOUT_MS));result.reflected=!0;let candidates=parseMicroCandidates(response,{agent:params.agent,outcome,taskId:params.taskId,steps:params.trajectory.length});return await appendInsightCandidates(params.directory,candidates),result.candidates=candidates.length,result}catch(err){return warn(`[micro-reflector] reflection failed (non-fatal): ${err instanceof Error?err.message:String(err)}`),result}}function extractTaskId(prompt){let m=/\btask[_-]?id\s*[:=]\s*([A-Za-z0-9._-]{1,80})/i.exec(prompt);return m?m[1]:void 0}function isTaskTool(tool3){return tool3==="Task"||tool3==="task"}async function microReflectorAfter(directory,input,output,llmDelegate,quota){if(!isTaskTool(input.tool))return;let transcript=typeof output.output==="string"?output.output:"";if(!transcript)return;let argsRecord=(typeof input.callID==="string"?getStoredInputArgs(input.callID):void 0)??input.args??null,argsForParse=argsRecord??input.args,prompt=argsRecord&&typeof argsRecord.prompt==="string"?argsRecord.prompt:"",parsed=parseDelegationArgs(argsForParse),agent=parsed?stripKnownSwarmPrefix(parsed.targetAgent):"unknown",taskId=extractTaskId(prompt),trajectory=taskId?await readTaskTrajectory(directory,taskId):[];await runMicroReflection({directory,taskId,agent,transcript,trajectory,llmDelegate,quota})}var REFLECT_OUTCOMES,MICRO_PROMPT_INPUT_CAP=1800,MICRO_LLM_TIMEOUT_MS=60000,MAX_CANDIDATES=2,TEST_FAIL_RE,LINT_FAIL_RE,REVERT_RE,PARTIAL_RE,INSIGHT_CANDIDATES_MAX_ENTRIES=500,CANDIDATE_ALLOWED_FIELDS;var init_micro_reflector=__esm(()=>{init_schema();init_manager2();init_skill_improver_quota();init_logger();init_stored_input_args();init_knowledge_store();init_knowledge_validator();init_skill_propagation_gate();init_utils2();REFLECT_OUTCOMES=new Set(["failure_test","failure_lint","failure_revert","partial"]);TEST_FAIL_RE=/\b(\d+\s+fail(?:ed|ing|s)?|test(?:s)?\s+fail|failing\s+test|assertion\s+fail|FAIL\b|✗|✘)/i,LINT_FAIL_RE=/\b(lint\s+(?:error|fail)|biome\s+error|eslint\s+error|type\s*error|tsc\s+error|TS\d{3,})/i,REVERT_RE=/\b(revert(?:ed|ing)?|rolled?\s*back|restore[d]?\s+from\s+checkpoint|undo(?:ne)?\s+the\s+change)/i,PARTIAL_RE=/\b(partial(?:ly)\s+complete|did\s+not\s+(?:finish|complete)|could\s+not\s+(?:finish|complete)|ran\s+out\s+of\s+(?:time|context|budget)|remaining\s+work|blocked\s+on|unable\s+to\s+complete|task\s+incomplete)/i;CANDIDATE_ALLOWED_FIELDS=["applies_to_agents","applies_to_tools","forbidden_actions","required_actions","verification_checks","triggers"]});import{createHash as createHash22}from"node:crypto";import{existsSync as existsSync41}from"node:fs";import{appendFile as appendFile13,mkdir as mkdir24,readFile as readFile27,realpath as realpath3,writeFile as writeFile18}from"node:fs/promises";import*as path90 from"node:path";function pruneSeenRetroSections(){let cutoff=Date.now()-86400000;for(let[key,entry]of seenRetroSections)if(entry.timestamp<cutoff)seenRetroSections.delete(key)}function capSeenRetroSections(){let overflow=seenRetroSections.size-MAX_TRACKED_RETRO_SECTIONS;if(overflow<=0)return;let byAge=Array.from(seenRetroSections.entries()).sort((a,b)=>a[1].timestamp-b[1].timestamp);for(let i=0;i<overflow;i++)seenRetroSections.delete(byAge[i][0])}function recordSeenRetroSection(key,value,timestamp){seenRetroSections.set(key,{value,timestamp}),capSeenRetroSections()}function hashContent2(content){return createHash22("sha1").update(content).digest("hex")}async function loadConfigForPolicyCurator(directory){let{KnowledgeConfigSchema:KnowledgeConfigSchema2}=await Promise.resolve().then(() => (init_schema(),exports_schema));try{let{loadPluginConfigWithMeta:loadPluginConfigWithMeta2}=await Promise.resolve().then(() => (init_config(),exports_config)),{config:loadedConfig}=loadPluginConfigWithMeta2(directory);return KnowledgeConfigSchema2.parse(loadedConfig.knowledge??{})}catch{return KnowledgeConfigSchema2.parse({})}}async function canonicalExistingPath(candidate){let resolved=path90.resolve(candidate);try{resolved=await _internals53.realpath(resolved)}catch{}return resolved}function isPathContained(root,candidate){let relative21=path90.relative(root,candidate);return relative21===""||!relative21.startsWith(`..${path90.sep}`)&&relative21!==".."&&!path90.isAbsolute(relative21)}function physicalPathIdentity(candidate){let normalized=candidate.replaceAll("\\","/").normalize("NFC");return process.platform==="win32"?normalized.toLowerCase():normalized}async function resolveEvidencePathScope(directory,relativeEvidencePath){let projectRoot=await canonicalExistingPath(directory),swarmRoot=await canonicalExistingPath(path90.join(projectRoot,".swarm"));if(!isPathContained(projectRoot,swarmRoot))return null;let evidenceRoot=await canonicalExistingPath(path90.join(swarmRoot,"evidence"));if(!isPathContained(swarmRoot,evidenceRoot))return null;let evidenceTarget=await canonicalExistingPath(path90.join(swarmRoot,...relativeEvidencePath.split("/")));if(!isPathContained(evidenceRoot,evidenceTarget))return null;return{projectIdentity:hashContent2(physicalPathIdentity(projectRoot)),evidenceIdentity:hashContent2(physicalPathIdentity(evidenceTarget))}}function sanitizeEvidenceLessons(value){if(!Array.isArray(value))return[];return value.filter((lesson)=>typeof lesson==="string").map((lesson)=>lesson.trim()).filter((lesson)=>lesson.length>0&&lesson.length<=280)}function evidenceProjectName(entry,root){let metadata=isRecord2(entry.metadata)?entry.metadata:null;return typeof entry.project_name==="string"?entry.project_name:typeof metadata?.project_name==="string"?metadata.project_name:typeof root.project_name==="string"?root.project_name:"unknown"}function evidencePhaseNumber(entry,root){return typeof entry.phase_number==="number"?entry.phase_number:typeof root.phase_number==="number"?root.phase_number:1}function extractEvidenceLessonBatches(evidenceData){let rawEntries=Array.isArray(evidenceData.entries)?evidenceData.entries:[evidenceData],batches=[];for(let rawEntry of rawEntries){if(!isRecord2(rawEntry))continue;if(Object.hasOwn(rawEntry,"type")&&rawEntry.type!=="retrospective")continue;let lessons=sanitizeEvidenceLessons(rawEntry.lessons_learned);if(lessons.length===0)continue;let phaseNumber=evidencePhaseNumber(rawEntry,evidenceData),projectName=evidenceProjectName(rawEntry,evidenceData),identity=hashContent2(JSON.stringify([rawEntry.type??"legacy-retrospective",rawEntry.task_id??evidenceData.task_id??"",rawEntry.timestamp??"",rawEntry.agent??"",phaseNumber,projectName,lessons]));batches.push({identity,lessons,projectName,phaseNumber})}return batches}function isWriteToEvidenceFile(input){let trigger=normalizeWriteTrigger(input);return isEvidencePath(trigger?.filePath)}function isRecord2(value){return typeof value==="object"&&value!==null}function normalizePathField(value){return typeof value==="string"?value.replace(/\\/g,"/"):null}function firstPathFromRecord(record3){return normalizePathField(record3.path)??normalizePathField(record3.filePath)??normalizePathField(record3.file)}function normalizeWriteTrigger(input,output){if(!isRecord2(input))return null;let toolName=typeof input.toolName==="string"?input.toolName:typeof input.tool==="string"?input.tool:null;if(!toolName||!WRITE_TOOLS.has(toolName))return null;let inputArgs=isRecord2(input.args)?input.args:null,outputArgs=isRecord2(output)&&isRecord2(output.args)?output.args:null,filePath=firstPathFromRecord(input)??(inputArgs?firstPathFromRecord(inputArgs):null)??(outputArgs?firstPathFromRecord(outputArgs):null);if(!filePath)return null;return{toolName,filePath,sessionID:typeof input.sessionID==="string"?input.sessionID:"default"}}function isEvidencePath(filePath){if(!filePath)return!1;return/(?:^|\/)\.swarm\/+evidence\//i.test(filePath)}function isPlanPath(filePath){return filePath?.includes(".swarm/plan.md")??!1}function extractRetrospectiveSection(planContent){let match=/^###\s+Lessons\s+Learned$/m.exec(planContent);if(!match)return null;let startIndex=match.index,restOfContent=planContent.slice(startIndex),firstNewline=restOfContent.indexOf(`
1328
1336
  `),contentAfterHeading=firstNewline===-1?"":restOfContent.slice(firstNewline+1),nextMatch=/^#{1,2}\s+/m.exec(contentAfterHeading),endIndex;if(nextMatch)endIndex=startIndex+firstNewline+1+nextMatch.index;else endIndex=planContent.length;return planContent.slice(startIndex,endIndex).trim()}function checkRetroChanged(sessionID,section){let hash4=hashContent2(section);if(seenRetroSections.get(sessionID)?.value===hash4)return!1;return recordSeenRetroSection(sessionID,hash4,Date.now()),!0}function extractLessonsFromRetro(section){let lessons=[],lines=section.split(`
1329
1337
  `);for(let line of lines){let trimmed=line.trim(),bulletMatch=/^[-*]\s+(.+)$/.exec(trimmed);if(bulletMatch){let content=bulletMatch[1].trim();if(content)lessons.push(content)}}return lessons}function extractRetractionsAndLessons(allLessons){let retractions=[],normalLessons=[];for(let lesson of allLessons){let upper=lesson.trimStart().toUpperCase();if(upper.startsWith("RETRACT:")||upper.startsWith("BAD RULE:")){let colonIdx=lesson.indexOf(":"),text=colonIdx!==-1?lesson.slice(colonIdx+1).trim():"";if(text)retractions.push(text)}else normalLessons.push(lesson)}return{retractions,normalLessons}}async function processRetractions(retractions,directory){if(retractions.length===0)return;let swarmEntries=await readKnowledge(resolveSwarmKnowledgePath(directory))??[],hiveEntries=await readKnowledge(resolveHiveKnowledgePath2())??[],existingRetractions=await readRetractionRecords(directory),existingSuppressedLessons=new Set(existingRetractions.map((record3)=>record3.normalized_lesson).filter((value)=>typeof value==="string"&&value.length>0)),policyConfig=await loadConfigForPolicyCurator(directory);for(let retractionText of retractions){let normalizedRetraction=normalize9(retractionText),matchedSwarmIds=[],matchedHiveIds=[];for(let entry of swarmEntries)if(normalize9(entry.lesson)===normalizedRetraction)matchedSwarmIds.push(entry.id),await quarantineEntry(directory,entry.id,`Retracted by architect: ${retractionText}`,"architect",{input:{directory,action:"retract",entryId:entry.id,reason:retractionText,evidenceScope:"local-session",actorRole:"architect"},context:{config:policyConfig,entry}}),console.info(`[knowledge-curator] Quarantined entry ${entry.id}: "${entry.lesson}"`);for(let entry of hiveEntries)if(normalize9(entry.lesson)===normalizedRetraction)matchedHiveIds.push(entry.id);if(!existingSuppressedLessons.has(normalizedRetraction))await appendRetractionRecord(directory,{id:crypto.randomUUID(),retracted_lesson:retractionText,normalized_lesson:normalizedRetraction,recorded_at:new Date().toISOString(),reported_by:"architect",matched_swarm_ids:matchedSwarmIds,matched_hive_ids:matchedHiveIds}),existingSuppressedLessons.add(normalizedRetraction)}}function buildV3EnrichmentPrompt(lesson,category,tags){return["Convert this prose lesson into an actionable knowledge directive.","Output ONLY a single JSON object — no code fences, no commentary.","","MANDATORY fields (the directive is rejected without them):","- At least ONE scope field non-empty:",' "applies_to_agents": string[] — roles from: architect, coder, reviewer, test_engineer, sme, docs, designer, critic, curator',' "applies_to_tools": string[] — tool names from: edit, write, patch, bash, read, grep, glob',"- At least ONE predicate field non-empty:",' "forbidden_actions": string[] — concrete actions to never take',' "required_actions": string[] — concrete actions to always take',' "verification_checks": string[] — checks a reviewer can run',"","OPTIONAL fields:",' "triggers": string[] — short phrases that should surface this lesson',' "directive_priority": "low" | "medium" | "high" | "critical"',"","Example output:",'{"applies_to_agents":["coder"],"forbidden_actions":["use async iterators in hot paths"],"required_actions":["use a plain for loop in hot paths"],"triggers":["hot path","async iterator"],"directive_priority":"high"}',"",`LESSON: ${lesson}`,`CATEGORY: ${category}`,`TAGS: ${tags.join(", ")}`].join(`
1330
1338
  `)}function buildV3BatchEnrichmentPrompt(lessons){let lessonLines=lessons.map((item,idx)=>`${idx+1}. LESSON: ${item.lesson}
@@ -1335,7 +1343,7 @@ ${transcriptTail}`].join(`
1335
1343
 
1336
1344
  RETRY: your last output still missed valid directives for items ${unresolved.join(", ")}. ${retryHint} ${preserveClause}Return a full JSON array with valid entries for every item.`}catch(err){warn(`[knowledge-curator] v3 batch enrichment attempt ${attempt+1} failed: ${err instanceof Error?err.message:String(err)}`)}for(let i=0;i<best.length;i++)out[start+i]=best[i]}return out}async function enrichLessonToV3(params){let quota=params.quota??{maxCalls:10,window:"utc"},prompt=buildV3EnrichmentPrompt(params.lesson,params.category,params.tags),userInput=prompt;for(let attempt=0;attempt<2;attempt++)try{if(!(await reserveQuota(params.directory,{nCalls:1,maxCalls:quota.maxCalls,window:quota.window,scope:"knowledge-enrichment"})).allowed)return null;let response=await params.llmDelegate("",userInput,AbortSignal.timeout(ENRICHMENT_LLM_TIMEOUT_MS)),result=parseV3EnrichmentResponse(response);if("fields"in result)return result.fields;userInput=`${prompt}
1337
1345
 
1338
- RETRY: your last output was missing ${result.missing.join("; ")}; produce valid JSON with all required fields.`}catch(err){warn(`[knowledge-curator] v3 enrichment attempt ${attempt+1} failed: ${err instanceof Error?err.message:String(err)}`)}return null}async function appendCuratorSkippedEvent(directory,record3){try{let filePath=path90.join(directory,".swarm","events.jsonl");await mkdir24(path90.dirname(filePath),{recursive:!0}),await appendFile12(filePath,`${JSON.stringify({timestamp:new Date().toISOString(),event:"curator_skipped",entry_id:record3.entry_id,lesson:record3.lesson.slice(0,200),reason:record3.reason})}
1346
+ RETRY: your last output was missing ${result.missing.join("; ")}; produce valid JSON with all required fields.`}catch(err){warn(`[knowledge-curator] v3 enrichment attempt ${attempt+1} failed: ${err instanceof Error?err.message:String(err)}`)}return null}async function appendCuratorSkippedEvent(directory,record3){try{let filePath=path90.join(directory,".swarm","events.jsonl");await mkdir24(path90.dirname(filePath),{recursive:!0}),await appendFile13(filePath,`${JSON.stringify({timestamp:new Date().toISOString(),event:"curator_skipped",entry_id:record3.entry_id,lesson:record3.lesson.slice(0,200),reason:record3.reason})}
1339
1347
  `,"utf-8")}catch{}}function readInsightJsonl2(content){let out=[];for(let line of content.split(`
1340
1348
  `)){let t=line.trim();if(!t)continue;try{out.push(JSON.parse(t))}catch{}}return out}async function consumeInsightCandidates(directory,batchLimit=MESO_INSIGHT_BATCH_LIMIT){try{let filePath=resolveInsightCandidatesPath(directory);if(!existsSync41(filePath))return[];let consumed=[];return await transactFile(filePath,async(p)=>readInsightJsonl2(await readFile27(p,"utf-8").catch(()=>"")),async(p,data)=>{let body=data.length===0?"":`${data.map((c)=>JSON.stringify(c)).join(`
1341
1349
  `)}
@@ -1483,7 +1491,7 @@ Flags:
1483
1491
  `)}catch(err){return["Skill consolidation encountered an error.","",`Error: ${err instanceof Error?err.message:String(err)}`].join(`
1484
1492
  `)}}var init_consolidate=__esm(()=>{init_config();init_schema();init_skill_consolidation()});async function handleCostsCommand(directory,args2){let summary=summarizeTelemetryCosts(directory);if(args2.includes("--json"))return["[COSTS_JSON]",JSON.stringify(summary,null,2),"[/COSTS_JSON]"].join(`
1485
1493
  `);return renderCostSummary(summary)}function renderCostSummary(summary){let lines=["## Swarm Costs","",`Total tracked cost: ${formatUsd(summary.total_cost_usd)}`,`Delegations: ${summary.delegations}`,`Tokens: input ${summary.total_input_tokens.toLocaleString()}, output ${summary.total_output_tokens.toLocaleString()}, reasoning ${summary.total_reasoning_tokens.toLocaleString()}, cache ${summary.total_cache_tokens.toLocaleString()}`,`Cost source: reported ${formatUsd(summary.total_reported_usd)}, estimated ${formatUsd(summary.total_estimated_usd)}, unavailable ${summary.unavailable_delegations}`,"","### By Agent"];return appendCostRows(lines,"Agent",summary.by_agent,"No delegation cost telemetry recorded."),lines.push("","### By Task"),appendCostRows(lines,"Task",summary.by_task,"No task cost telemetry recorded."),lines.push("","### By Gate"),appendCostRows(lines,"Gate",summary.by_gate,"No gate cost telemetry recorded."),lines.push("","### By Retry Loop"),appendCostRows(lines,"Retry",summary.by_retry,"No retry-loop cost telemetry recorded."),lines.join(`
1486
- `)}function appendCostRows(lines,label,rows,emptyMessage){if(rows.length===0){lines.push(emptyMessage);return}lines.push(`| ${label} | Delegations | Cost | Input | Output | Reasoning | Cache | Unavailable |`,"|------|-------------|------|-------|--------|-----------|-------|-------------|");for(let row of rows)lines.push(`| ${row.name} | ${row.delegations} | ${formatUsd(row.cost_usd)} | ${row.input_tokens.toLocaleString()} | ${row.output_tokens.toLocaleString()} | ${row.reasoning_tokens.toLocaleString()} | ${row.cache_tokens.toLocaleString()} | ${row.unavailable_delegations} |`)}function formatUsd(value){return`$${value.toFixed(6)}`}var init_costs=__esm(()=>{init_cost_accounting()});function sanitizeQuestion(raw){let normalized=raw.replace(/\s+/g," ").trim().replace(/\[\s*MODE\s*:[^\]]*\]/gi,"").replace(/\s+/g," ").trim();if(normalized.length<=2000)return normalized;return`${normalized.slice(0,2000)}…`}function sanitizePresetName(raw){let trimmed=raw.trim();if(!trimmed)return null;if(trimmed.length>64)return null;if(!/^[A-Za-z0-9_-]+$/.test(trimmed))return null;return trimmed}function parseArgs2(args2){let out={specReview:!1,rest:[]};for(let i=0;i<args2.length;i++){let token=args2[i];if(token==="--spec-review"){out.specReview=!0;continue}if(token==="--preset"){let next=args2[i+1];if(next!==void 0){let sanitized=sanitizePresetName(next);if(sanitized)out.preset=sanitized;i++}continue}out.rest.push(token)}return out}async function handleCouncilCommand(_directory,args2){let parsed=parseArgs2(args2),question=sanitizeQuestion(parsed.rest.join(" "));if(!question)return USAGE2;let tokens=["MODE: COUNCIL"];if(parsed.preset)tokens.push(`preset=${parsed.preset}`);if(parsed.specReview)tokens.push("spec_review");return`[${tokens.join(" ")}] ${question}`}var USAGE2;var init_council=__esm(()=>{USAGE2=["Usage: /swarm council <question> [--spec-review]",""," question The question to put to the council"," --spec-review Use spec_review mode (single advisory pass on a draft spec)","","Requires council.general.enabled: true and a configured search API key in the resolved config: global ~/.config/opencode/opencode-swarm.json, then project .opencode/opencode-swarm.json overrides."].join(`
1494
+ `)}function appendCostRows(lines,label,rows,emptyMessage){if(rows.length===0){lines.push(emptyMessage);return}lines.push(`| ${label} | Delegations | Cost | Input | Output | Reasoning | Cache | Unavailable |`,"|------|-------------|------|-------|--------|-----------|-------|-------------|");for(let row of rows)lines.push(`| ${row.name} | ${row.delegations} | ${formatUsd(row.cost_usd)} | ${row.input_tokens.toLocaleString()} | ${row.output_tokens.toLocaleString()} | ${row.reasoning_tokens.toLocaleString()} | ${row.cache_tokens.toLocaleString()} | ${row.unavailable_delegations} |`)}function formatUsd(value){return`$${value.toFixed(6)}`}var init_costs=__esm(()=>{init_cost_accounting()});function sanitizeQuestion(raw){let normalized=raw.replace(/\s+/g," ").trim().replace(/\[\s*MODE\s*:[^\]]*\]/gi,"").replace(/\s+/g," ").trim();if(normalized.length<=2000)return normalized;return`${normalized.slice(0,2000)}…`}function sanitizePresetName(raw){let trimmed=raw.trim();if(!trimmed)return null;if(trimmed.length>64)return null;if(!/^[A-Za-z0-9_-]+$/.test(trimmed))return null;return trimmed}function parseArgs2(args2){let out={specReview:!1,rest:[]};for(let i=0;i<args2.length;i++){let token=args2[i];if(token==="--spec-review"){out.specReview=!0;continue}if(token==="--preset"){let next=args2[i+1];if(next!==void 0){let sanitized=sanitizePresetName(next);if(sanitized)out.preset=sanitized;i++}continue}out.rest.push(token)}return out}async function handleCouncilCommand(_directory,args2){let parsed=parseArgs2(args2),question=sanitizeQuestion(parsed.rest.join(" "));if(!question)return USAGE3;let tokens=["MODE: COUNCIL"];if(parsed.preset)tokens.push(`preset=${parsed.preset}`);if(parsed.specReview)tokens.push("spec_review");return`[${tokens.join(" ")}] ${question}`}var USAGE3;var init_council=__esm(()=>{USAGE3=["Usage: /swarm council <question> [--spec-review]",""," question The question to put to the council"," --spec-review Use spec_review mode (single advisory pass on a draft spec)","","Requires council.general.enabled: true and a configured search API key in the resolved config: global ~/.config/opencode/opencode-swarm.json, then project .opencode/opencode-swarm.json overrides."].join(`
1487
1495
  `)});import*as child_process6 from"node:child_process";import{randomUUID as randomUUID10}from"node:crypto";import{readdir as readdir7,readFile as readFile30,stat as stat12}from"node:fs/promises";import*as path98 from"node:path";import{promisify}from"node:util";function getExecFileAsync(){return promisify(child_process6.execFile)}async function parseGitLog(directory,maxCommits){let commitMap=new Map;try{let{stdout}=await getExecFileAsync()("git",["log","--name-only","--pretty=format:COMMIT:%H","--no-merges",`-n${maxCommits}`],{cwd:directory,timeout:1e4}),currentCommit=null;for(let line of stdout.split(`
1488
1496
  `))if(line.startsWith("COMMIT:")){if(currentCommit=line.slice(7),currentCommit&&!commitMap.has(currentCommit))commitMap.set(currentCommit,new Set)}else if(currentCommit&&line.trim()){let filePath=line.trim();if(filePath.startsWith(".swarm/")||filePath.startsWith("node_modules/")||filePath==="")continue;commitMap.get(currentCommit).add(filePath)}}catch{return new Map}return commitMap}function buildCoChangeMatrix(commitMap,maxFilesPerCommit=500){let matrix=new Map,fileCommitCount=new Map;for(let files of commitMap.values()){for(let file3 of files)fileCommitCount.set(file3,(fileCommitCount.get(file3)||0)+1);if(files.size>maxFilesPerCommit)continue;let fileArray=Array.from(files).sort();for(let i=0;i<fileArray.length;i++)for(let j=i+1;j<fileArray.length;j++){let fileA=fileArray[i],fileB=fileArray[j],[key,a,b]=fileA<fileB?[`${fileA}::${fileB}`,fileA,fileB]:[`${fileB}::${fileA}`,fileB,fileA],existing=matrix.get(key);if(existing)existing.coChangeCount++;else matrix.set(key,{fileA:a,fileB:b,coChangeCount:1,npmi:0,lift:0,hasStaticEdge:!1,totalCommits:0,commitsA:0,commitsB:0})}}let totalCommits=commitMap.size;for(let entry of matrix.values()){if(entry.coChangeCount<3)continue;let pAB=entry.coChangeCount/totalCommits,pA=(fileCommitCount.get(entry.fileA)||0)/totalCommits,pB=(fileCommitCount.get(entry.fileB)||0)/totalCommits;if(entry.commitsA=fileCommitCount.get(entry.fileA)||0,entry.commitsB=fileCommitCount.get(entry.fileB)||0,entry.totalCommits=totalCommits,pA>0&&pB>0)entry.lift=pAB/(pA*pB);if(pAB>0){let logPAB=Math.log(pAB),negLogPAB=-logPAB;if(negLogPAB>0){let numerator=logPAB-Math.log(pA*pB);entry.npmi=numerator/negLogPAB,entry.npmi=Math.max(-1,Math.min(1,entry.npmi))}else entry.npmi=1}}return matrix}async function scanSourceFiles(dir){let results=[],skipDirs=new Set(["node_modules",".swarm","dist","build"]);try{let entries=await readdir7(dir,{withFileTypes:!0});for(let entry of entries){let fullPath=path98.join(dir,entry.name);if(entry.isDirectory()){if(skipDirs.has(entry.name))continue;let subFiles=await scanSourceFiles(fullPath);results.push(...subFiles)}else if(entry.isFile()){let ext=path98.extname(entry.name);if([".ts",".tsx",".js",".jsx",".mjs"].includes(ext))results.push(fullPath)}}}catch{}return results}async function getStaticEdges(directory){let edges=new Set,sourceFiles=await scanSourceFiles(directory);for(let sourceFile of sourceFiles)try{let content=await readFile30(sourceFile,"utf-8"),importRegex=/(?:import|require)\s*(?:\(?\s*['"`]|.*?from\s+['"`])([^'"`]+)['"`]/g;for(let match=importRegex.exec(content);match!==null;match=importRegex.exec(content)){let importPath=match[1].trim();if(!importPath.startsWith("."))continue;try{let sourceDir=path98.dirname(sourceFile),resolvedPath=path98.resolve(sourceDir,importPath),extensions=["",".ts",".tsx",".js",".jsx",".mjs","/index.ts","/index.js"],targetFile=null;for(let ext of extensions){let testPath=resolvedPath+ext;try{if((await stat12(testPath)).isFile()){targetFile=testPath;break}}catch{}}if(!targetFile)continue;let relSource=path98.relative(directory,sourceFile).replace(/\\/g,"/"),relTarget=path98.relative(directory,targetFile).replace(/\\/g,"/"),[key]=relSource<relTarget?[`${relSource}::${relTarget}`,relSource,relTarget]:[`${relTarget}::${relSource}`,relTarget,relSource];edges.add(key)}catch{}}}catch{}return edges}function isTestImplementationPair(fileA,fileB){let testPatterns=[".test.ts",".test.js",".spec.ts",".spec.js"],getBaseName=(filePath)=>{let base=path98.basename(filePath);for(let pattern of testPatterns)if(base.endsWith(pattern))return base.slice(0,-pattern.length);return base.replace(/\.(ts|js|tsx|jsx|mjs)$/,"")},baseA=getBaseName(fileA),baseB=getBaseName(fileB);return baseA===baseB&&baseA!==path98.basename(fileA)&&baseA!==path98.basename(fileB)}function hasSharedPrefix(fileA,fileB){let dirA=path98.dirname(fileA),dirB=path98.dirname(fileB);if(dirA!==dirB)return!1;let baseA=path98.basename(fileA).replace(/\.(ts|js|tsx|jsx|mjs)$/,""),baseB=path98.basename(fileB).replace(/\.(ts|js|tsx|jsx|mjs)$/,"");if(baseA.startsWith(baseB)||baseB.startsWith(baseA))return!0;let splitA=baseA.split(/-|_/),splitB=baseB.split(/-|_/);if(splitA.length>0&&splitB.length>0&&splitA[0]===splitB[0])return!0;return!1}async function detectDarkMatter(directory,options){let minCommits=options?.minCommits??20,minCoChanges=options?.minCoChanges??3,npmiThreshold=options?.npmiThreshold??0.5,maxCommitsToAnalyze=options?.maxCommitsToAnalyze??500,maxFilesPerCommit=options?.maxFilesPerCommit??500;try{let{stdout}=await getExecFileAsync()("git",["rev-list","--count","HEAD"],{cwd:directory,timeout:1e4}),totalCommitCount=parseInt(stdout.trim(),10);if(Number.isNaN(totalCommitCount)||totalCommitCount<minCommits)return[]}catch{return[]}let commitMap=await _internals59.parseGitLog(directory,maxCommitsToAnalyze),matrix=_internals59.buildCoChangeMatrix(commitMap,maxFilesPerCommit),staticEdges=await _internals59.getStaticEdges(directory),results=[];for(let entry of matrix.values()){let key=`${entry.fileA}::${entry.fileB}`;if(entry.hasStaticEdge=staticEdges.has(key),entry.coChangeCount<minCoChanges)continue;if(entry.npmi<npmiThreshold)continue;if(entry.hasStaticEdge)continue;if(isTestImplementationPair(entry.fileA,entry.fileB))continue;if(hasSharedPrefix(entry.fileA,entry.fileB))continue;results.push(entry)}return results.sort((a,b)=>b.npmi-a.npmi),results.slice(0,20)}function darkMatterToKnowledgeEntries(pairs,projectName){let entries=[],now=new Date().toISOString();for(let pair of pairs.slice(0,10)){let baseA=path98.basename(pair.fileA),baseB=path98.basename(pair.fileB),lesson=`Files ${pair.fileA} and ${pair.fileB} co-change with NPMI=${pair.npmi.toFixed(3)} but have no import relationship. This hidden coupling suggests a shared architectural concern — changes to one likely require changes to the other.`;if(lesson.length>280)lesson=`Files ${baseA} and ${baseB} co-change with NPMI=${pair.npmi.toFixed(3)} but have no import relationship. This hidden coupling suggests a shared architectural concern — changes to one likely require changes to the other.`;if(lesson.length>280)lesson=`Files ${baseA} and ${baseB} co-change frequently (NPMI=${pair.npmi.toFixed(3)}) without import relationship. This hidden coupling suggests a shared architectural concern.`;if(lesson.length>280)lesson=`Hidden coupling: ${baseA.slice(0,50)}... ↔ ${baseB.slice(0,50)}... (NPMI=${pair.npmi.toFixed(3)})`;let confidence=Math.min(0.3+0.2*Math.min(pair.coChangeCount/10,1),0.5);entries.push({id:randomUUID10(),tier:"swarm",lesson,category:"architecture",tags:["hidden-coupling","co-change","dark-matter"],scope:"global",confidence,status:"candidate",confirmed_by:[],retrieval_outcomes:{applied_count:0,succeeded_after_count:0,failed_after_count:0},schema_version:1,created_at:now,updated_at:now,auto_generated:!0,project_name:projectName,applies_to_agents:["coder","reviewer"],required_actions:[`when modifying ${baseA}, check whether ${baseB} needs a matching change (and vice versa)`.slice(0,200)],verification_checks:[`coupled file ${baseB} was considered when ${baseA} changed`.slice(0,200)],triggers:[baseA,baseB].map((t)=>t.slice(0,80))})}return entries}function formatDarkMatterOutput(pairs){if(pairs.length===0)return`## Dark Matter: Hidden Couplings
1489
1497
 
@@ -1586,7 +1594,7 @@ Requires council.general.enabled: true and a configured search API key (Tavily o
1586
1594
  in the resolved config: global ~/.config/opencode/opencode-swarm.json, then project
1587
1595
  .opencode/opencode-swarm.json overrides.`;if(parsed.depth==="exhaustive"){if(!parsed.maxResearchersExplicit)parsed.maxResearchers=5;if(!parsed.roundsExplicit)parsed.rounds=3}return`[MODE: DEEP_RESEARCH depth=${parsed.depth} max_researchers=${parsed.maxResearchers} rounds=${parsed.rounds} output=${parsed.output}] ${question}`}var DEPTHS;var init_deep_research=__esm(()=>{DEPTHS=new Set(["standard","exhaustive"])});function sanitizeDescription(raw){let normalized=raw.replace(/\s+/g," ").trim().replace(/\[\s*MODE\s*:[^\]]*\]/gi,"").replace(/\[\s*MODE\s*:.*$/gi,"").replace(/\s+/g," ").trim();if(normalized.length<=MAX_DESC_LEN)return normalized;return`${normalized.slice(0,MAX_DESC_LEN)}…`}function cleanFlagValue(raw){if(raw.includes("[")||raw.includes("]")||/\s/.test(raw))return null;if(/\[\s*MODE\s*:/i.test(raw))return null;return raw}function parseArgs6(args2){let result={out:"docs",lang:"auto",update:!1,rest:[]},i=0;while(i<args2.length){let token=args2[i];if(token==="--out"){if(i+1>=args2.length||args2[i+1].startsWith("--"))return{...result,error:`Flag "${token}" requires a value`};let value=args2[++i],clean=cleanFlagValue(value);if(clean===null||value.includes("..")||value.startsWith("/")||value.startsWith("\\")||/^[A-Za-z]:/.test(value))return{...result,error:`Invalid --out value "${value}". Must be a project-relative directory with no brackets or spaces.`};let trimmed=clean.replace(/[/\\]+$/,"");if(!trimmed||trimmed===".")return{...result,error:`Invalid --out value "${value}". Must name a non-empty subdirectory.`};result.out=trimmed}else if(token==="--lang"){if(i+1>=args2.length||args2[i+1].startsWith("--"))return{...result,error:`Flag "${token}" requires a value`};let value=args2[++i],clean=cleanFlagValue(value);if(clean===null)return{...result,error:`Invalid --lang value "${value}". Must be a single token with no brackets or spaces.`};result.lang=clean}else if(token==="--update")result.update=!0;else if(token.startsWith("--"))return{...result,error:`Unknown flag "${token}"`};else result.rest.push(token);i++}return result}async function handleDesignDocsCommand(directory,args2){let parsed=parseArgs6(args2);if(parsed.error)return`Error: ${parsed.error}
1588
1596
 
1589
- ${USAGE3}`;try{let{config:config3}=_internals63.loadPluginConfigWithMeta(directory);if(config3.design_docs?.enabled!==!0)return"Error: design docs are disabled. Set `design_docs.enabled: true` in opencode-swarm.json to enable the docs_design agent and this command.\n\n"+USAGE3}catch(configErr){advisoryWarn(`[design-docs] Could not read opencode-swarm.json (${String(configErr)}). `+"Falling through — the architect will abort if docs_design is not registered.")}let description=sanitizeDescription(parsed.rest.join(" "));if(!description&&!parsed.update)return USAGE3;return`[MODE: DESIGN_DOCS out=${parsed.out} lang=${parsed.lang} update=${parsed.update}] ${description}`.trimEnd()}var MAX_DESC_LEN=2000,_internals63,USAGE3=`Usage: /swarm design-docs <description> [--out <dir>] [--lang <name>] [--update]
1597
+ ${USAGE4}`;try{let{config:config3}=_internals63.loadPluginConfigWithMeta(directory);if(config3.design_docs?.enabled!==!0)return"Error: design docs are disabled. Set `design_docs.enabled: true` in opencode-swarm.json to enable the docs_design agent and this command.\n\n"+USAGE4}catch(configErr){advisoryWarn(`[design-docs] Could not read opencode-swarm.json (${String(configErr)}). `+"Falling through — the architect will abort if docs_design is not registered.")}let description=sanitizeDescription(parsed.rest.join(" "));if(!description&&!parsed.update)return USAGE4;return`[MODE: DESIGN_DOCS out=${parsed.out} lang=${parsed.lang} update=${parsed.update}] ${description}`.trimEnd()}var MAX_DESC_LEN=2000,_internals63,USAGE4=`Usage: /swarm design-docs <description> [--out <dir>] [--lang <name>] [--update]
1590
1598
 
1591
1599
  Generate or sync language-agnostic design docs for the project under build:
1592
1600
  <out>/domain.md, <out>/technical-spec.md, <out>/behavior-spec.md,
@@ -1716,13 +1724,13 @@ The handoff content is included below for manual copy:
1716
1724
  ${markdown}`}}var HANDOFF_SOURCE_SESSION_PREFIX="<!-- opencode-swarm-handoff-source-session:";var init_handoff=__esm(()=>{init_utils2();init_handoff_service();init_snapshot_writer();init_state2();init_bun_compat()});function getStatusText(status){return{complete:"COMPLETE",in_progress:"IN PROGRESS",pending:"PENDING",blocked:"BLOCKED",closed:"CLOSED"}[status]||"PENDING"}function getStatusIcon(status){switch(status){case"complete":return"✅";case"in_progress":return"\uD83D\uDD04";case"blocked":return"\uD83D\uDEAB";case"closed":return"\uD83D\uDD12";default:return"⏳"}}function extractFromPlan(plan){if(plan.phases.length===0)return{hasPlan:!0,phases:[],isLegacy:!1};let phases=[];for(let phase of plan.phases){let completed=phase.tasks.filter((t)=>t.status==="completed").length,total=phase.tasks.length,tasks=total>0?`${completed}/${total}`:"-";phases.push({id:phase.id,name:phase.name,status:phase.status==="completed"?"complete":phase.status,statusText:getStatusText(phase.status),statusIcon:getStatusIcon(phase.status),completedTasks:completed,totalTasks:total,tasksDisplay:tasks})}return{hasPlan:!0,phases,isLegacy:!1}}async function extractFromLegacy(directory){let planContent=await readSwarmFileAsync(directory,"plan.md");if(!planContent)return{hasPlan:!1,phases:[],isLegacy:!0};let phaseRegex=/^## Phase (\d+):?\s*(.+?)(?:\s*\[(COMPLETE|IN PROGRESS|PENDING)\])?\s*$/gm,phases=[],lines=planContent.split(`
1717
1725
  `);for(let match=phaseRegex.exec(planContent);match!==null;match=phaseRegex.exec(planContent)){let num=parseInt(match[1],10),name=match[2].trim(),status=match[3]||"PENDING",mappedStatus="pending";if(status==="COMPLETE")mappedStatus="complete";else if(status==="IN PROGRESS")mappedStatus="in_progress";let headerLineIndex=planContent.substring(0,match.index).split(`
1718
1726
  `).length-1,completed=0,total=0;if(headerLineIndex!==-1)for(let i=headerLineIndex+1;i<lines.length;i++){let line=lines[i];if(/^## Phase \d+/.test(line)||line.trim()==="---"&&total>0)break;if(/^- \[x\]/.test(line))completed++,total++;else if(/^- \[ \]/.test(line))total++}let tasks=total>0?`${completed}/${total}`:"-";phases.push({id:num,name,status:mappedStatus,statusText:getStatusText(mappedStatus),statusIcon:getStatusIcon(mappedStatus),completedTasks:completed,totalTasks:total,tasksDisplay:tasks})}if(phases.length===0)return{hasPlan:!1,phases:[],isLegacy:!0};return{hasPlan:!0,phases,isLegacy:!0}}async function getHistoryData(directory){let plan=await loadPlanJsonOnly(directory);if(plan)return extractFromPlan(plan);return extractFromLegacy(directory)}function formatHistoryMarkdown(history){if(!history.hasPlan||history.phases.length===0)return"No history available.";let tableLines=["## Swarm History","","| Phase | Name | Status | Tasks |","|-------|------|--------|-------|"];for(let phase of history.phases)tableLines.push(`| ${phase.id} | ${phase.name} | ${phase.statusIcon} ${phase.statusText} | ${phase.tasksDisplay} |`);return tableLines.join(`
1719
- `)}async function handleHistoryCommand(directory,_args){let historyData=await getHistoryData(directory);return formatHistoryMarkdown(historyData)}var init_history_service=__esm(()=>{init_utils2();init_manager()});var init_history=__esm(()=>{init_history_service()});import*as fs56 from"node:fs";import*as path120 from"node:path";function validateAndSanitizeUrl2(rawUrl){return validateAndSanitizeGithubUrl(rawUrl,"issues")}function parseArgs8(args2){let out={plan:!1,trace:!1,noRepro:!1,rest:[]};for(let token of args2){if(token==="--plan"){out.plan=!0;continue}if(token==="--trace"){out.trace=!0,out.plan=!0;continue}if(token==="--no-repro"){out.noRepro=!0;continue}out.rest.push(token)}return out}function parseIssueRef(input,directory){let urlMatch=input.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/issues\/(\d+)\/?$/i);if(urlMatch){if(containsControlCharacters(urlMatch[1])||containsControlCharacters(urlMatch[2]))return null;return{owner:urlMatch[1],repo:urlMatch[2],number:parseInt(urlMatch[3],10)}}let shorthandMatch=input.match(/^([^/]+)\/([^#]+)#(\d+)$/);if(shorthandMatch){if(containsControlCharacters(shorthandMatch[1])||containsControlCharacters(shorthandMatch[2]))return null;return{owner:shorthandMatch[1],repo:shorthandMatch[2],number:parseInt(shorthandMatch[3],10)}}let bareMatch=input.match(/^(\d+)$/);if(bareMatch){let issueNumber=parseInt(bareMatch[1],10),remoteUrl=detectGitRemote(directory,void 0);if(!remoteUrl)return null;let parsed=parseGitRemoteUrl(remoteUrl);if(!parsed)return null;return{owner:parsed.owner,repo:parsed.repo,number:issueNumber}}return null}function atomicWriteFileSync2(dir,filename,content){let tmpPath=path120.join(dir,`.tmp-${filename}-${Date.now()}-${process.pid}`),finalPath=path120.join(dir,filename);_internals80.writeFileSync(tmpPath,content,"utf-8");try{_internals80.renameSync(tmpPath,finalPath)}catch{try{_internals80.unlinkSync(finalPath)}catch{}try{_internals80.renameSync(tmpPath,finalPath)}catch(retryErr){try{_internals80.unlinkSync(tmpPath)}catch{}throw retryErr}}}function handleIssueCommand(directory,args2){let parsed=parseArgs8(args2),rawInput=parsed.rest.join(" ").trim();if(!rawInput)return USAGE4;let isFullUrl=/^https?:\/\//i.test(rawInput),issueInfo=parseIssueRef(isFullUrl?sanitizeUrl(rawInput):rawInput,directory);if(!issueInfo)return`Error: Could not parse issue reference from "${sanitizeErrorEcho(rawInput)}"
1727
+ `)}async function handleHistoryCommand(directory,_args){let historyData=await getHistoryData(directory);return formatHistoryMarkdown(historyData)}var init_history_service=__esm(()=>{init_utils2();init_manager()});var init_history=__esm(()=>{init_history_service()});import*as fs56 from"node:fs";import*as path120 from"node:path";function validateAndSanitizeUrl2(rawUrl){return validateAndSanitizeGithubUrl(rawUrl,"issues")}function parseArgs8(args2){let out={plan:!1,trace:!1,noRepro:!1,rest:[]};for(let token of args2){if(token==="--plan"){out.plan=!0;continue}if(token==="--trace"){out.trace=!0,out.plan=!0;continue}if(token==="--no-repro"){out.noRepro=!0;continue}out.rest.push(token)}return out}function parseIssueRef(input,directory){let urlMatch=input.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/issues\/(\d+)\/?$/i);if(urlMatch){if(containsControlCharacters(urlMatch[1])||containsControlCharacters(urlMatch[2]))return null;return{owner:urlMatch[1],repo:urlMatch[2],number:parseInt(urlMatch[3],10)}}let shorthandMatch=input.match(/^([^/]+)\/([^#]+)#(\d+)$/);if(shorthandMatch){if(containsControlCharacters(shorthandMatch[1])||containsControlCharacters(shorthandMatch[2]))return null;return{owner:shorthandMatch[1],repo:shorthandMatch[2],number:parseInt(shorthandMatch[3],10)}}let bareMatch=input.match(/^(\d+)$/);if(bareMatch){let issueNumber=parseInt(bareMatch[1],10),remoteUrl=detectGitRemote(directory,void 0);if(!remoteUrl)return null;let parsed=parseGitRemoteUrl(remoteUrl);if(!parsed)return null;return{owner:parsed.owner,repo:parsed.repo,number:issueNumber}}return null}function atomicWriteFileSync2(dir,filename,content){let tmpPath=path120.join(dir,`.tmp-${filename}-${Date.now()}-${process.pid}`),finalPath=path120.join(dir,filename);_internals80.writeFileSync(tmpPath,content,"utf-8");try{_internals80.renameSync(tmpPath,finalPath)}catch{try{_internals80.unlinkSync(finalPath)}catch{}try{_internals80.renameSync(tmpPath,finalPath)}catch(retryErr){try{_internals80.unlinkSync(tmpPath)}catch{}throw retryErr}}}function handleIssueCommand(directory,args2){let parsed=parseArgs8(args2),rawInput=parsed.rest.join(" ").trim();if(!rawInput)return USAGE5;let isFullUrl=/^https?:\/\//i.test(rawInput),issueInfo=parseIssueRef(isFullUrl?sanitizeUrl(rawInput):rawInput,directory);if(!issueInfo)return`Error: Could not parse issue reference from "${sanitizeErrorEcho(rawInput)}"
1720
1728
 
1721
- ${USAGE4}`;let issueUrl=`https://github.com/${issueInfo.owner}/${issueInfo.repo}/issues/${issueInfo.number}`,result=validateAndSanitizeUrl2(issueUrl);if("error"in result)return`Error: ${result.error}
1729
+ ${USAGE5}`;let issueUrl=`https://github.com/${issueInfo.owner}/${issueInfo.repo}/issues/${issueInfo.number}`,result=validateAndSanitizeUrl2(issueUrl);if("error"in result)return`Error: ${result.error}
1722
1730
 
1723
- ${USAGE4}`;let swarmDir=path120.join(directory,".swarm"),issueReference={url:result.sanitized,owner:issueInfo.owner,repo:issueInfo.repo,number:issueInfo.number,timestamp:new Date().toISOString(),flags:{...parsed.plan&&{plan:!0},...parsed.trace&&{trace:!0},...parsed.noRepro&&{noRepro:!0}}};if(parsed.noRepro)issueReference.noReproWaiver={waived:!0,reason:"--no-repro flag",timestamp:new Date().toISOString()};let traceState={issueNumber:issueInfo.number,lastTransition:null,completed:!1},oldTraceState=null;try{oldTraceState=_internals80.readFileSync(path120.join(swarmDir,"issue-trace-state.json"),"utf-8")}catch{}try{_internals80.mkdirSync(swarmDir,{recursive:!0}),atomicWriteFileSync2(swarmDir,"issue-trace-state.json",JSON.stringify(traceState,null,2)),atomicWriteFileSync2(swarmDir,"issue-reference.json",JSON.stringify(issueReference,null,2))}catch(e){if(oldTraceState!==null)try{atomicWriteFileSync2(swarmDir,"issue-trace-state.json",oldTraceState)}catch{}else try{_internals80.unlinkSync(path120.join(swarmDir,"issue-trace-state.json"))}catch{}try{_internals80.unlinkSync(path120.join(swarmDir,"issue-reference.json"))}catch{}return`Error: Failed to persist issue reference durably: ${e instanceof Error?e.message:String(e)}
1731
+ ${USAGE5}`;let swarmDir=path120.join(directory,".swarm"),issueReference={url:result.sanitized,owner:issueInfo.owner,repo:issueInfo.repo,number:issueInfo.number,timestamp:new Date().toISOString(),flags:{...parsed.plan&&{plan:!0},...parsed.trace&&{trace:!0},...parsed.noRepro&&{noRepro:!0}}};if(parsed.noRepro)issueReference.noReproWaiver={waived:!0,reason:"--no-repro flag",timestamp:new Date().toISOString()};let traceState={issueNumber:issueInfo.number,lastTransition:null,completed:!1},oldTraceState=null;try{oldTraceState=_internals80.readFileSync(path120.join(swarmDir,"issue-trace-state.json"),"utf-8")}catch{}try{_internals80.mkdirSync(swarmDir,{recursive:!0}),atomicWriteFileSync2(swarmDir,"issue-trace-state.json",JSON.stringify(traceState,null,2)),atomicWriteFileSync2(swarmDir,"issue-reference.json",JSON.stringify(issueReference,null,2))}catch(e){if(oldTraceState!==null)try{atomicWriteFileSync2(swarmDir,"issue-trace-state.json",oldTraceState)}catch{}else try{_internals80.unlinkSync(path120.join(swarmDir,"issue-trace-state.json"))}catch{}try{_internals80.unlinkSync(path120.join(swarmDir,"issue-reference.json"))}catch{}return`Error: Failed to persist issue reference durably: ${e instanceof Error?e.message:String(e)}
1724
1732
 
1725
- ${USAGE4}`}let flags=[];if(parsed.plan)flags.push("plan=true");if(parsed.trace)flags.push("trace=true");if(parsed.noRepro)flags.push("noRepro=true");let flagsStr=flags.length>0?` ${flags.join(" ")}`:"";return`[MODE: ISSUE_INGEST issue="${result.sanitized}"${flagsStr}]`}var USAGE4,_internals80;var init_issue=__esm(()=>{init_url_security();USAGE4=["Usage: /swarm issue <url|owner/repo#N|N> [--plan] [--trace] [--no-repro]","","Ingest a GitHub issue into the swarm workflow."," /swarm issue https://github.com/owner/repo/issues/42"," /swarm issue owner/repo#42"," /swarm issue 42 --plan"," /swarm issue 42 --trace --no-repro","","Flags:"," --plan Transition to plan creation after spec generation"," --trace Run the fix workflow end-to-end (implies --plan); compose commit-pr to publish."," --no-repro Skip reproduction step"].join(`
1733
+ ${USAGE5}`}let flags=[];if(parsed.plan)flags.push("plan=true");if(parsed.trace)flags.push("trace=true");if(parsed.noRepro)flags.push("noRepro=true");let flagsStr=flags.length>0?` ${flags.join(" ")}`:"";return`[MODE: ISSUE_INGEST issue="${result.sanitized}"${flagsStr}]`}var USAGE5,_internals80;var init_issue=__esm(()=>{init_url_security();USAGE5=["Usage: /swarm issue <url|owner/repo#N|N> [--plan] [--trace] [--no-repro]","","Ingest a GitHub issue into the swarm workflow."," /swarm issue https://github.com/owner/repo/issues/42"," /swarm issue owner/repo#42"," /swarm issue 42 --plan"," /swarm issue 42 --trace --no-repro","","Flags:"," --plan Transition to plan creation after spec generation"," --trace Run the fix workflow end-to-end (implies --plan); compose commit-pr to publish."," --no-repro Skip reproduction step"].join(`
1726
1734
  `);_internals80={writeFileSync:fs56.writeFileSync,mkdirSync:fs56.mkdirSync,renameSync:fs56.renameSync,unlinkSync:fs56.unlinkSync,readFileSync:fs56.readFileSync,existsSync:fs56.existsSync}});import{randomUUID as randomUUID12}from"node:crypto";import{existsSync as existsSync62,readFileSync as readFileSync45}from"node:fs";import{mkdir as mkdir28,readFile as readFile32,writeFile as writeFile22}from"node:fs/promises";import*as os22 from"node:os";import*as path121 from"node:path";async function migrateKnowledgeToExternal(_directory,_config){let externalSentinelPath=path121.join(_directory,".swarm",".knowledge-external-migrated"),contextPath=path121.join(_directory,".swarm","context.md");if(_internals81.existsSync(externalSentinelPath))return{migrated:!1,entriesMigrated:0,entriesDropped:0,entriesTotal:0,skippedReason:"external-sentinel-exists"};if(!_internals81.existsSync(contextPath))return{migrated:!1,entriesMigrated:0,entriesDropped:0,entriesTotal:0,skippedReason:"no-context-file"};let contextContent=await _internals81.readFile(contextPath,"utf-8");if(contextContent.trim().length===0)return{migrated:!1,entriesMigrated:0,entriesDropped:0,entriesTotal:0,skippedReason:"empty-context"};let lines=contextContent.split(`
1727
1735
  `),entriesCount=0;for(let line of lines)if(line.trimStart().startsWith("- "))entriesCount++;return await _internals81.writeSentinel(externalSentinelPath,entriesCount,entriesCount),{migrated:!0,entriesMigrated:entriesCount,entriesDropped:0,entriesTotal:entriesCount}}async function migrateContextToKnowledge(directory,config3){let sentinelPath=path121.join(directory,".swarm",".knowledge-migrated"),contextPath=path121.join(directory,".swarm","context.md"),knowledgePath=resolveSwarmKnowledgePath(directory);if(existsSync62(sentinelPath))return{migrated:!1,entriesMigrated:0,entriesDropped:0,entriesTotal:0,skippedReason:"sentinel-exists"};if(!existsSync62(contextPath))return{migrated:!1,entriesMigrated:0,entriesDropped:0,entriesTotal:0,skippedReason:"no-context-file"};let contextContent=await readFile32(contextPath,"utf-8");if(contextContent.trim().length===0)return{migrated:!1,entriesMigrated:0,entriesDropped:0,entriesTotal:0,skippedReason:"empty-context"};let rawEntries=_internals81.parseContextMd(contextContent);if(rawEntries.length===0)return await _internals81.writeSentinel(sentinelPath,0,0),{migrated:!0,entriesMigrated:0,entriesDropped:0,entriesTotal:0};let existing=await readKnowledge(knowledgePath),migrated=0,dropped=0,projectName=_internals81.inferProjectName(directory);for(let raw of rawEntries){if(config3.validation_enabled!==!1){let category=raw.categoryHint??_internals81.inferCategoryFromText(raw.text);if(!validateLesson(raw.text,existing.map((e)=>e.lesson),{category,scope:"global",confidence:0.3}).valid){dropped++;continue}}if(findNearDuplicate(raw.text,existing,config3.dedup_threshold??0.6)){dropped++;continue}let inferredTags=inferTags2(raw.text),entry={id:randomUUID12(),tier:"swarm",lesson:_internals81.truncateLesson(raw.text),category:raw.categoryHint??_internals81.inferCategoryFromText(raw.text),tags:[...inferredTags,`migration:${raw.sourceSection}`],scope:"global",confidence:0.3,status:"candidate",confirmed_by:[],retrieval_outcomes:{applied_count:0,succeeded_after_count:0,failed_after_count:0},schema_version:config3.schema_version??KNOWLEDGE_SCHEMA_VERSION,created_at:new Date().toISOString(),updated_at:new Date().toISOString(),project_name:projectName,auto_generated:!0};existing.push(entry),migrated++}if(migrated>0)await rewriteKnowledge(knowledgePath,existing);return await _internals81.writeSentinel(sentinelPath,migrated,dropped),log(`[knowledge-migrator] Migrated ${migrated} entries, dropped ${dropped}`),{migrated:!0,entriesMigrated:migrated,entriesDropped:dropped,entriesTotal:rawEntries.length}}async function migrateHiveKnowledgeLegacy(config3){let legacyHivePath=_internals81.resolveLegacyHiveKnowledgePath(),canonicalHivePath=resolveHiveKnowledgePath2(),sentinelPath=path121.join(path121.dirname(canonicalHivePath),".hive-knowledge-migrated");if(existsSync62(sentinelPath))return{migrated:!1,entriesMigrated:0,entriesDropped:0,entriesTotal:0,skippedReason:"sentinel-exists"};if(!existsSync62(legacyHivePath))return{migrated:!1,entriesMigrated:0,entriesDropped:0,entriesTotal:0,skippedReason:"no-context-file"};let legacyEntries=await readKnowledge(legacyHivePath);if(legacyEntries.length===0)return await _internals81.writeSentinel(sentinelPath,0,0),{migrated:!0,entriesMigrated:0,entriesDropped:0,entriesTotal:0};let existingHiveEntries=await readKnowledge(canonicalHivePath),migrated=0,dropped=0,entryErrors=[];for(let legacyEntry of legacyEntries)try{let lesson=legacyEntry.lesson;if(!lesson||typeof lesson!=="string"||lesson.length<15){dropped++;continue}if(findNearDuplicate(lesson,existingHiveEntries,config3.dedup_threshold??0.6)){dropped++;continue}let category=legacyEntry.category||"process",validationResult=validateLesson(lesson,existingHiveEntries.map((e)=>e.lesson),{category,scope:"global",confidence:0.3});if(!validationResult.valid){let errorMsg=`Validation failed for legacy entry: ${validationResult.reason}`;entryErrors.push(errorMsg),warn(`[knowledge-migrator] ${errorMsg}`),dropped++;continue}let confidence=legacyEntry.confidence??0.8,scopeTag=legacyEntry.scope_tag||"global",legacyId=legacyEntry.id,existingIds=new Set(existingHiveEntries.map((e)=>e.id)),resolvedId=legacyId&&existingIds.has(legacyId)?randomUUID12():legacyId||randomUUID12();if(legacyId&&existingIds.has(legacyId))warn(`[knowledge-migrator] Legacy entry ID collision for "${legacyId}", generating new UUID`);let newHiveEntry={id:resolvedId,tier:"hive",lesson:_internals81.truncateLesson(lesson),category,tags:["migration:legacy-hive"],scope:scopeTag,confidence:Math.min(Math.max(confidence,0),1),status:"established",confirmed_by:[],retrieval_outcomes:{applied_count:0,succeeded_after_count:0,failed_after_count:0},schema_version:KNOWLEDGE_SCHEMA_VERSION,created_at:legacyEntry.created_at||new Date().toISOString(),updated_at:legacyEntry.updated_at||new Date().toISOString(),source_project:"legacy-promotion",encounter_score:1};try{await _internals81.appendKnowledge(canonicalHivePath,newHiveEntry),existingHiveEntries.push(newHiveEntry),migrated++}catch(appendError){let errorMsg=`Failed to append entry: ${appendError instanceof Error?appendError.message:String(appendError)}`;entryErrors.push(errorMsg),warn(`[knowledge-migrator] ${errorMsg}`),dropped++}}catch(entryError){let errorMsg=`Unexpected error processing legacy entry: ${entryError instanceof Error?entryError.message:String(entryError)}`;entryErrors.push(errorMsg),warn(`[knowledge-migrator] ${errorMsg}`),dropped++}return await _internals81.writeSentinel(sentinelPath,migrated,dropped),log(`[knowledge-migrator] Migrated ${migrated} legacy hive entries, dropped ${dropped}`),{migrated:!0,entriesMigrated:migrated,entriesDropped:dropped,entriesTotal:legacyEntries.length,...entryErrors.length>0&&{entryErrors}}}function parseContextMd(content){let sections=_internals81.splitIntoSections(content),entries=[],seen=new Set,sectionPatterns=[{pattern:/^#{1,3}\s+lessons?\s+learned/i,sourceSection:"lessons-learned"},{pattern:/^#{1,3}\s+patterns?/i,sourceSection:"patterns"},{pattern:/^#{1,3}\s+sme\s+cache/i,sourceSection:"sme-cache"},{pattern:/^#{1,3}\s+decisions?/i,sourceSection:"decisions"}];for(let section of sections){let match=sectionPatterns.find((sp)=>sp.pattern.test(section.heading));if(!match)continue;let bullets=_internals81.extractBullets(section.body);for(let bullet of bullets){if(bullet.length<15)continue;let normalized=normalize9(bullet);if(seen.has(normalized))continue;seen.add(normalized),entries.push({text:_internals81.truncateLesson(bullet),sourceSection:match.sourceSection,categoryHint:_internals81.inferCategoryFromText(bullet)})}}return entries}function splitIntoSections(content){let sections=[],headingRegex=/^(#{1,3})\s+(.+)/gm,matches=[],match=headingRegex.exec(content);while(match!==null)matches.push({index:match.index,heading:match[0]}),match=headingRegex.exec(content);for(let i=0;i<matches.length;i++){let current=matches[i],next=matches[i+1],bodyStart=current.index+current.heading.length,bodyEnd=next?next.index:content.length,body=content.slice(bodyStart,bodyEnd).trim();sections.push({heading:current.heading,body})}return sections}function extractBullets(body){let bullets=[],bulletRegex=/^\s*[-*]\s+(.+)/;for(let line of body.split(`
1728
1736
  `)){let match=line.match(bulletRegex);if(match)bullets.push(match[1].trim())}return bullets}function inferCategoryFromText(text){let lower=text.toLowerCase();if(/\b(?:test|spec|vitest|jest)\b/.test(lower))return"testing";if(/\b(?:security|auth|token|password|encrypt)\b/.test(lower))return"security";if(/\b(?:performance|latency|cache|throughput)\b/.test(lower))return"performance";if(/\b(?:architecture|design|pattern|structure)\b/.test(lower))return"architecture";if(/\b(?:debug|error|fix|bug|issue)\b/.test(lower))return"debugging";if(/\b(?:tool|config|setup|install|build)\b/.test(lower))return"tooling";if(/\b(?:integrate|api|hook|connect)\b/.test(lower))return"integration";if(/\b(?:process|workflow|step|approach)\b/.test(lower))return"process";return"other"}function truncateLesson2(text){if(text.length<=280)return text;return`${text.slice(0,277)}...`}function inferProjectName(directory){let packageJsonPath=path121.join(directory,"package.json");if(existsSync62(packageJsonPath))try{let pkg=JSON.parse(readFileSync45(packageJsonPath,"utf-8"));if(pkg.name&&typeof pkg.name==="string")return pkg.name}catch{}return path121.basename(directory)}async function writeSentinel(sentinelPath,migrated,dropped){let sentinel={migrated_at:new Date().toISOString(),source_version:"6.16",target_version:"6.17",entries_migrated:migrated,entries_dropped:dropped,schema_version:1,migration_tool:"knowledge-migrator.ts"};await _internals81.mkdir(path121.dirname(sentinelPath),{recursive:!0}),await _internals81.writeFile(sentinelPath,JSON.stringify(sentinel,null,2),"utf-8")}function resolveLegacyHiveKnowledgePath(){let platform=process.platform,home=process.env.HOME||os22.homedir(),dataDir;if(platform==="win32")dataDir=path121.join(process.env.LOCALAPPDATA||path121.join(home,"AppData","Local"),"opencode-swarm","Data");else if(platform==="darwin")dataDir=path121.join(home,"Library","Application Support","opencode-swarm");else dataDir=path121.join(process.env.XDG_DATA_HOME||path121.join(home,".local","share"),"opencode-swarm");return path121.join(dataDir,"hive-knowledge.jsonl")}var _internals81;var init_knowledge_migrator=__esm(()=>{init_logger();init_knowledge_store();init_knowledge_types();init_knowledge_validator();_internals81={appendKnowledge,migrateContextToKnowledge,migrateKnowledgeToExternal,migrateHiveKnowledgeLegacy,parseContextMd,splitIntoSections,extractBullets,inferCategoryFromText,truncateLesson:truncateLesson2,inferProjectName,writeSentinel,resolveLegacyHiveKnowledgePath,existsSync:existsSync62,readFileSync:readFileSync45,readFile:readFile32,mkdir:mkdir28,writeFile:writeFile22}});import{join as join96}from"node:path";function resolveEntryByPrefix(entries,inputId){let exact=entries.find((e)=>e.id===inputId);if(exact)return{entry:exact};let matches=entries.filter((e)=>e.id.startsWith(inputId));if(matches.length===0)return{error:`No entry found matching '${inputId}'.`};if(matches.length===1)return{entry:matches[0]};let candidates=matches.map((e)=>e.id).join(`
@@ -1749,7 +1757,7 @@ ${formatStatus(directory)}`;let linkDir=resolveLinkDir(linkId),totalMerged=0,tot
1749
1757
  ${familySummary}`:"";return[`\uD83D\uDD17 Linked this worktree to shared knowledge store "${linkId}".`,` migrated the complete knowledge family (${totalMerged} new, ${totalSkipped} already present).`,` shared at: ${linkDir}`,"All swarms linked to this id now read and write the same knowledge."+relinkNote+familyNote].join(`
1750
1758
  `)}var init_link=__esm(()=>{init_config();init_schema();init_knowledge_link();init_cohort_identity();init_config_fingerprint();init_curation_policy();init_family_migration();init_logger()});async function readLatestLoopState(directory){try{let{readdirSync:readdirSync14,statSync:statSync25,readFileSync:readFileSync47}=await import("node:fs"),loopDir=`${directory}/.swarm/loop`,latestMtime=0,latestPath=null;try{let entries=readdirSync14(loopDir,{withFileTypes:!0});for(let entry of entries){if(!entry.isDirectory())continue;let statePath=`${loopDir}/${entry.name}/state.json`;try{let mtime=statSync25(statePath).mtimeMs;if(mtime>latestMtime)latestMtime=mtime,latestPath=statePath}catch{}}}catch{return null}if(!latestPath)return null;let raw=readFileSync47(latestPath,"utf-8");return{autonomy:JSON.parse(raw).params?.autonomy}}catch{return null}}function sanitizeObjective(raw){let normalized=raw.replace(/\s+/g," ").trim().replace(/\[\s*MODE\s*:[^\]]*\]/gi,"").replace(/\s+/g," ").trim();if(normalized.length<=2000)return normalized;return`${normalized.slice(0,2000)}…`}function isPositiveInteger(raw){return/^\d+$/.test(raw)}function parseArgs9(args2){let result={maxCycles:3,autonomy:"auto",autonomyExplicit:!1,depth:"standard",resume:!1,rest:[]},i=0;while(i<args2.length){let token=args2[i];if(token==="--"){result.rest.push(...args2.slice(i+1));break}else if(token==="--max-cycles"){if(i+1>=args2.length)return{...result,error:`Flag "${token}" requires a value`};let value=args2[++i];if(!isPositiveInteger(value)||Number(value)<1||Number(value)>5)return{...result,error:`Invalid --max-cycles value "${value}". Must be an integer between 1 and 5.`};result.maxCycles=Number(value)}else if(token==="--autonomy"){if(i+1>=args2.length)return{...result,error:`Flag "${token}" requires a value`};let value=args2[++i];if(!AUTONOMY_LEVELS.has(value))return{...result,error:`Invalid autonomy "${value}". Must be one of: checkpoint, auto.`};result.autonomy=value,result.autonomyExplicit=!0}else if(token==="--depth"){if(i+1>=args2.length)return{...result,error:`Flag "${token}" requires a value`};let value=args2[++i];if(!DEPTHS2.has(value))return{...result,error:`Invalid depth "${value}". Must be one of: standard, exhaustive.`};result.depth=value}else if(token==="--resume")result.resume=!0;else if(token.startsWith("--")){if(result.rest.length>0){result.rest.push(token),i++;continue}return{...result,error:`Unknown flag "${token}"`}}else result.rest.push(token);i++}return result}async function handleLoopCommand(_directory,args2){let parsed=parseArgs9(args2);if(parsed.error)return`Error: ${parsed.error}
1751
1759
 
1752
- ${USAGE5}`;let objective=sanitizeObjective(parsed.rest.join(" "));if(!objective&&!parsed.resume)return USAGE5;let autonomy=parsed.autonomy;if(parsed.resume&&!parsed.autonomyExplicit){let state=await _internals83.readLatestLoopState(_directory);if(state?.autonomy&&AUTONOMY_LEVELS.has(state.autonomy))autonomy=state.autonomy}let header=`[MODE: LOOP max_cycles=${parsed.maxCycles} autonomy=${autonomy} depth=${parsed.depth} resume=${parsed.resume}]`;if(!objective&&parsed.resume)return`${header} Resume the existing compound-engineering loop from durable state in .swarm/loop/. Read the latest run state, report cycle progress, and continue from the current phase.`;return`${header} ${objective}`}var DEPTHS2,AUTONOMY_LEVELS,_internals83,USAGE5=`Usage: /swarm loop <objective> [--max-cycles 1..5] [--autonomy checkpoint|auto] [--depth standard|exhaustive] [--resume]
1760
+ ${USAGE6}`;let objective=sanitizeObjective(parsed.rest.join(" "));if(!objective&&!parsed.resume)return USAGE6;let autonomy=parsed.autonomy;if(parsed.resume&&!parsed.autonomyExplicit){let state=await _internals83.readLatestLoopState(_directory);if(state?.autonomy&&AUTONOMY_LEVELS.has(state.autonomy))autonomy=state.autonomy}let header=`[MODE: LOOP max_cycles=${parsed.maxCycles} autonomy=${autonomy} depth=${parsed.depth} resume=${parsed.resume}]`;if(!objective&&parsed.resume)return`${header} Resume the existing compound-engineering loop from durable state in .swarm/loop/. Read the latest run state, report cycle progress, and continue from the current phase.`;return`${header} ${objective}`}var DEPTHS2,AUTONOMY_LEVELS,_internals83,USAGE6=`Usage: /swarm loop <objective> [--max-cycles 1..5] [--autonomy checkpoint|auto] [--depth standard|exhaustive] [--resume]
1753
1761
 
1754
1762
  Run a compound-engineering loop: brainstorm → plan → build → review → improve,
1755
1763
  iterating until the objective is met or a budget stop condition fires.
@@ -1767,11 +1775,11 @@ Flags:
1767
1775
  --depth <name> standard (default) or exhaustive (wider exploration)
1768
1776
  --resume resume the existing loop run from durable state in
1769
1777
  .swarm/loop/ instead of starting a new objective`;var init_loop=__esm(()=>{DEPTHS2=new Set(["standard","exhaustive"]),AUTONOMY_LEVELS=new Set(["checkpoint","auto"]);_internals83={readLatestLoopState}});import*as fs57 from"node:fs/promises";import*as os23 from"node:os";import*as path124 from"node:path";async function evaluateMemoryRecallFixtures(options){let fixtureDirectory=path124.resolve(options.fixtureDirectory),providers=options.providers??DEFAULT_PROVIDERS,modes=options.modes??DEFAULT_MODES,generatedAt=new Date().toISOString(),fixtures=await loadRecallEvaluationFixtures(fixtureDirectory),runs=[];for(let fixture of fixtures){let materialized=materializeFixture(fixture);for(let providerName of providers){let tempRoot=await fs57.realpath(await fs57.mkdtemp(path124.join(os23.tmpdir(),"swarm-memory-eval-"))),provider=createEvaluationProvider(providerName,tempRoot);try{await provider.initialize?.();for(let record3 of materialized.records)await provider.upsert(record3);for(let mode of modes){let request=buildRecallRequest(fixture,mode),retrievedIds=(await provider.recall(request)).map((item)=>item.record.id),run=buildRun({fixture,provider:providerName,mode,k:fixture.k??request.maxItems,retrievedIds,materialized});runs.push(run)}}finally{if(await provider.close?.(),!options.keepTempRoots)evictAndClose(tempRoot),await rmTempRoot(tempRoot)}}}return{schema_version:1,generated_at:generatedAt,fixture_directory:fixtureDirectory,providers,modes,summary:summarizeRuns(fixtures.length,runs),runs}}async function rmTempRoot(tempRoot){for(let attempt=0;attempt<10;attempt++)try{await fs57.rm(tempRoot,{recursive:!0,force:!0});return}catch(err){if(attempt===9)throw err;await new Promise((resolve50)=>setTimeout(resolve50,50))}}async function loadRecallEvaluationFixtures(fixtureDirectory){let files=(await fs57.readdir(fixtureDirectory,{withFileTypes:!0})).filter((entry)=>entry.isFile()&&entry.name.endsWith(".json")).map((entry)=>entry.name).sort((a,b)=>a.localeCompare(b)),fixtures=[];for(let file3 of files){let raw=await fs57.readFile(path124.join(fixtureDirectory,file3),"utf-8");fixtures.push(validateFixture(JSON.parse(raw),file3))}return fixtures}function createEvaluationProvider(provider,root){let config3={...DEFAULT_MEMORY_CONFIG,enabled:!0,provider};return createConfiguredMemoryProvider(root,config3)}function buildRecallRequest(fixture,mode){let maxItems=fixture.maxItems??fixture.k??5;return{query:fixture.query,task:fixture.task,agentRole:mode==="curator"?"curator":fixture.agentRole,mode,scopes:fixture.scopes,kinds:fixture.kinds,maxItems,tokenBudget:fixture.tokenBudget??1000,minScore:mode==="injection"?0.25:0,requireQuerySignal:mode==="injection"}}function materializeFixture(fixture){let idsByLabel=new Map,labelsById=new Map,baseRecords=fixture.records.map((record3)=>{let base={scope:record3.scope,kind:record3.kind,text:record3.text},id=createMemoryId(base);return idsByLabel.set(record3.label,id),labelsById.set(id,record3.label),{input:record3,id,base}}),expectedIds=new Set(fixture.expectedLabels.map((label)=>{let id=idsByLabel.get(label);if(!id)throw Error(`fixture ${fixture.name} expected unknown label ${label}`);return id})),allowedScopeKeys=new Set(fixture.scopes.map(stableScopeKey)),staleIds=new Set,crossScopeIds=new Set,sameScopeNoiseIds=new Set;return{records:baseRecords.map(({input,id,base})=>{let supersededBy=input.state?.supersededByLabel?idsByLabel.get(input.state.supersededByLabel):void 0;if(input.state?.supersededByLabel&&!supersededBy)throw Error(`fixture ${fixture.name} record ${input.label} supersedes unknown label ${input.state.supersededByLabel}`);let metadata={...input.metadata??{},fixture:fixture.name,fixtureLabel:input.label,...input.state?.deleted?{deleted:!0}:{}},record3={id,...base,tags:input.tags??[],confidence:input.confidence??0.8,stability:input.stability??"durable",source:input.source??{type:"manual",ref:fixture.name},createdAt:DEFAULT_TIMESTAMP,updatedAt:DEFAULT_TIMESTAMP,expiresAt:input.state?.expiresAt,supersededBy,contentHash:computeMemoryContentHash(base),metadata};if(record3.metadata.deleted===!0||record3.supersededBy||record3.expiresAt&&Date.parse(record3.expiresAt)<=Date.now())staleIds.add(record3.id);if(!allowedScopeKeys.has(stableScopeKey(record3.scope)))crossScopeIds.add(record3.id);else if(!expectedIds.has(record3.id)&&!staleIds.has(record3.id))sameScopeNoiseIds.add(record3.id);return validateMemoryRecordRules(record3,{rejectDurableSecrets:!0})}),idsByLabel,labelsById,expectedIds,staleIds,crossScopeIds,sameScopeNoiseIds}}function buildRun(args2){let{fixture,provider,mode,k,retrievedIds,materialized}=args2,relevantAtK=retrievedIds.slice(0,k).filter((id)=>materialized.expectedIds.has(id)).length,crossScopeLeakCount=retrievedIds.filter((id)=>materialized.crossScopeIds.has(id)).length,staleMemoryCount=retrievedIds.filter((id)=>materialized.staleIds.has(id)).length,noisyInjectionCount=mode==="injection"?retrievedIds.filter((id)=>materialized.sameScopeNoiseIds.has(id)).length:0,sameScopeNoiseCount=retrievedIds.filter((id)=>materialized.sameScopeNoiseIds.has(id)).length,metrics={"precision@k":relevantAtK/Math.max(k,1),"recall@k":relevantAtK/Math.max(materialized.expectedIds.size,1),injection_count:mode==="injection"?retrievedIds.length:0,noisy_injection_count:noisyInjectionCount,same_scope_noise_count:sameScopeNoiseCount,cross_scope_leak_count:crossScopeLeakCount,stale_memory_count:staleMemoryCount};return{fixture:fixture.name,provider,mode,k,query:fixture.query,expected_labels:fixture.expectedLabels,expected_ids:fixture.expectedLabels.map((label)=>materialized.idsByLabel.get(label)??label),retrieved_labels:retrievedIds.map((id)=>materialized.labelsById.get(id)??id),retrieved_ids:retrievedIds,metrics,passed:metrics["recall@k"]>=1&&metrics.noisy_injection_count===0&&metrics.cross_scope_leak_count===0&&metrics.stale_memory_count===0}}function summarizeRuns(fixtureCount,runs){let total=runs.reduce((acc,run)=>{if(acc["precision@k"]+=run.metrics["precision@k"],acc["recall@k"]+=run.metrics["recall@k"],acc.injection_count+=run.metrics.injection_count,acc.noisy_injection_count+=run.metrics.noisy_injection_count,acc.same_scope_noise_count+=run.metrics.same_scope_noise_count,acc.cross_scope_leak_count+=run.metrics.cross_scope_leak_count,acc.stale_memory_count+=run.metrics.stale_memory_count,run.passed)acc.passed_run_count++;return acc},{"precision@k":0,"recall@k":0,injection_count:0,noisy_injection_count:0,same_scope_noise_count:0,cross_scope_leak_count:0,stale_memory_count:0,passed_run_count:0}),denominator=Math.max(runs.length,1);return{fixture_count:fixtureCount,run_count:runs.length,passed_run_count:total.passed_run_count,"precision@k":total["precision@k"]/denominator,"recall@k":total["recall@k"]/denominator,injection_count:total.injection_count,noisy_injection_count:total.noisy_injection_count,same_scope_noise_count:total.same_scope_noise_count,cross_scope_leak_count:total.cross_scope_leak_count,stale_memory_count:total.stale_memory_count}}function validateFixture(value,file3){if(!value||typeof value!=="object")throw Error(`memory recall fixture ${file3} must be an object`);let fixture=value;if(typeof fixture.name!=="string"||!fixture.name)throw Error(`memory recall fixture ${file3} is missing name`);if(typeof fixture.query!=="string"||fixture.query.length<3)throw Error(`memory recall fixture ${file3} has invalid query`);if(!Array.isArray(fixture.scopes)||fixture.scopes.length===0)throw Error(`memory recall fixture ${file3} must define scopes`);let scopes=fixture.scopes.map((scope,index)=>validateScope(scope,file3,`scope #${index+1}`));if(!Array.isArray(fixture.expectedLabels)||fixture.expectedLabels.length===0)throw Error(`memory recall fixture ${file3} must define expectedLabels`);let expectedLabels=fixture.expectedLabels.map((label,index)=>{if(typeof label!=="string"||!label)throw Error(`memory recall fixture ${file3} expectedLabels #${index+1} must be a non-empty string`);return label});if(!Array.isArray(fixture.records)||fixture.records.length===0)throw Error(`memory recall fixture ${file3} must define records`);let records=fixture.records.map((record3,index)=>validateFixtureRecord(record3,file3,index));return{...fixture,name:fixture.name,query:fixture.query,scopes,expectedLabels,records}}function validateFixtureRecord(value,file3,index){if(!value||typeof value!=="object")throw Error(`memory recall fixture ${file3} record #${index+1} must be an object`);let record3=value,labelForError=typeof record3.label==="string"&&record3.label?record3.label:`#${index+1}`;if(typeof record3.label!=="string"||!record3.label)throw Error(`memory recall fixture ${file3} record ${labelForError} is missing label`);let scope=validateScope(record3.scope,file3,`record ${record3.label}`);if(!("kind"in record3)||record3.kind==="")throw Error(`memory recall fixture ${file3} record ${record3.label} is missing kind`);if(typeof record3.kind!=="string")throw Error(`memory recall fixture ${file3} record ${record3.label} has invalid kind`);let parsedKind=MemoryKindSchema.safeParse(record3.kind);if(!parsedKind.success)throw Error(`memory recall fixture ${file3} record ${record3.label} has invalid kind`);if(!("text"in record3)||record3.text==="")throw Error(`memory recall fixture ${file3} record ${record3.label} is missing text`);if(typeof record3.text!=="string")throw Error(`memory recall fixture ${file3} record ${record3.label} has invalid text`);return{...record3,label:record3.label,scope,kind:parsedKind.data,text:record3.text}}function validateScope(value,file3,descriptor){if(!value||typeof value!=="object")throw Error(`memory recall fixture ${file3} ${descriptor} is missing scope`);let scope=value;if(typeof scope.type!=="string")throw Error(`memory recall fixture ${file3} ${descriptor} has invalid scope type`);let parsed=MemoryScopeRefSchema.safeParse(scope);if(!parsed.success)throw Error(`memory recall fixture ${file3} ${descriptor} has invalid scope`);return parsed.data}var DEFAULT_PROVIDERS,DEFAULT_MODES,DEFAULT_TIMESTAMP="2026-05-26T12:00:00.000Z";var init_evaluation=__esm(()=>{init_config2();init_gateway();init_provider_pool();init_schema2();DEFAULT_PROVIDERS=["local-jsonl","sqlite"],DEFAULT_MODES=["manual","injection","curator"]});function extractMemoryProposalsFromAgentOutput(outputText2){let candidates=candidateJsonBlocks(outputText2);for(let candidate of candidates){let parsedJson=parseJsonObject(candidate);if(parsedJson===null)continue;let parsed=AgentOutputMemorySchema.safeParse(parsedJson);if(!parsed.success)return{proposals:[],error:parsed.error.issues.map((issue3)=>issue3.message).join("; ")};if(parsed.data.memoryProposals)return{proposals:parsed.data.memoryProposals}}return{proposals:[]}}function extractCuratorMemoryDecisionsFromAgentOutput(outputText2){let candidates=candidateJsonBlocks(outputText2);for(let candidate of candidates){let parsedJson=parseJsonObject(candidate);if(parsedJson===null)continue;let parsed=CuratorOutputMemoryDecisionSchema.safeParse(parsedJson);if(!parsed.success)return{decisions:[],error:parsed.error.issues.map((issue3)=>issue3.message).join("; ")};if(parsed.data.curatorMemoryDecisions)return{decisions:parsed.data.curatorMemoryDecisions}}return{decisions:[]}}function candidateJsonBlocks(outputText2){let trimmed=outputText2.trim(),candidates=[];if(trimmed.startsWith("{")&&trimmed.endsWith("}"))candidates.push(trimmed);let fencePattern=/```(?:json)?\s*([\s\S]*?)```/gi;for(let match of outputText2.matchAll(fencePattern)){let block=match[1]?.trim();if(block?.startsWith("{")&&block.endsWith("}"))candidates.push(block)}return candidates}function parseJsonObject(candidate){try{let parsed=JSON.parse(candidate);return parsed&&typeof parsed==="object"&&!Array.isArray(parsed)?parsed:null}catch{return null}}var AgentMemoryProposalSchema,AgentOutputMemorySchema,CuratorOutputMemoryDecisionSchema;var init_agent_output_schema=__esm(()=>{init_zod();init_schema2();AgentMemoryProposalSchema=exports_external.object({operation:exports_external.enum(["add","update","delete","ignore","merge","supersede"]),kind:MemoryKindSchema.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()}).strict(),AgentOutputMemorySchema=exports_external.object({memoryProposals:exports_external.array(AgentMemoryProposalSchema).max(20).optional()}).passthrough(),CuratorOutputMemoryDecisionSchema=exports_external.object({curatorMemoryDecisions:exports_external.array(CuratorMemoryDecisionSchema).max(20).optional()}).passthrough()});function buildMemoryRecallPlan(input,options={}){let profile=options.profile??resolveMemoryRecallProfile(input.agentRole),scopes=options.scopes??[];return{query:buildRecallQuery(input),scopes,kinds:[...profile.kinds],maxItems:profile.maxItems,tokenBudget:profile.tokenBudget}}function buildRecallQuery(input){let lines=[`${input.agentRole} task: ${input.agentTask}`,`user goal: ${input.userGoal}`],repoProject=[input.projectId,input.repoId,input.repoRoot].filter((value)=>Boolean(value?.trim())).join(" ");if(repoProject)lines.push(`repo/project: ${repoProject}`);if(input.touchedFiles&&input.touchedFiles.length>0)lines.push(`touched files: ${input.touchedFiles.join(", ")}`);if(input.currentPlanSummary?.trim())lines.push(`current plan: ${input.currentPlanSummary.trim()}`);return lines.join(`
1770
- `)}var init_recall_planner=__esm(()=>{init_role_profiles()});import{appendFile as appendFile13,mkdir as mkdir31}from"node:fs/promises";import*as path125 from"node:path";async function appendMemoryRunLog(directory,runId,event){let safeRunId=sanitizeRunId(runId),relativePath2=path125.join("runs",safeRunId,"memory.jsonl"),filePath=validateSwarmPath(directory,relativePath2);await mkdir31(path125.dirname(filePath),{recursive:!0}),await appendFile13(filePath,`${JSON.stringify({...event,runId:safeRunId,timestamp:event.timestamp??new Date().toISOString()})}
1771
- `,"utf-8")}function sanitizeRunId(runId){return(runId?.trim()||"unknown").replace(/[^A-Za-z0-9._-]/g,"_").slice(0,80)||"unknown"}var init_run_log=__esm(()=>{init_utils2()});import{appendFile as appendFile14,mkdir as mkdir32}from"node:fs/promises";import*as path126 from"node:path";function createMemoryLifecycleHooks(options){let internals={createGateway:options.createGateway??createMemoryGateway,appendRunLog:options.appendRunLog??appendMemoryRunLog};return{messagesTransform:async(input,output)=>{await injectIntoMessages(input,output,options,internals)},toolAfter:async(input,output)=>{await captureTaskOutputProposals(input,output,options,internals)}}}async function injectIntoMessages(input,output,options,internals){let messages=output?.messages;if(!Array.isArray(messages)||messages.length===0)return;if(messagesContainRecall(messages))return;let sessionID=getSessionID(input,messages),agentRole=resolveMessageAgent(messages,options,sessionID),latestUserText=latestTextForRole(messages,"user");if(!latestUserText)return;let agentTask=extractTaskToolPrompt(messages)??latestUserText,unitId=options.getActiveTaskId?.(sessionID),result=await recallForAgent({directory:options.directory,config:options.config,sessionID,agentRole,agentId:agentRole,userGoal:latestUserText,agentTask,unitId,createGateway:internals.createGateway,appendRunLog:internals.appendRunLog});if(result)await maybeWriteUnitIdProbe({directory:options.directory,sessionID,agentRole,unitId,agentTask,bundleId:result.bundle.id});if(!result||result.bundle.items.length===0)return;let insertAt=recallMessageInsertIndex(messages),recallMessage={info:{role:"system",agent:agentRole,sessionID},parts:[{type:"text",text:result.bundle.promptBlock}]};messages.splice(insertAt,0,recallMessage),await internals.appendRunLog(options.directory,sessionID,{event:"prompt_injected",runId:sessionID??"unknown",agentRole,agentId:agentRole,bundleId:result.bundle.id,memoryIds:result.bundle.items.map((item)=>item.record.id),tokenEstimate:result.bundle.tokenEstimate,metadata:{surface:"chat_messages"}})}async function captureTaskOutputProposals(input,output,options,internals){let task=parseTaskToolInput(input);if(!task)return;let outputText2=output?.output;if(typeof outputText2!=="string"||!outputText2.includes("memoryProposals")&&!outputText2.includes("curatorMemoryDecisions"))return;let extracted=outputText2.includes("memoryProposals")?extractMemoryProposalsFromAgentOutput(outputText2):{proposals:[]};if(extracted.error){await internals.appendRunLog(options.directory,task.sessionID,{event:"proposal_rejected_by_validation",runId:task.sessionID??"unknown",agentRole:task.agentRole,agentId:task.agentRole,rejectionReason:extracted.error});return}let decisionExtraction=outputText2.includes("curatorMemoryDecisions")?extractCuratorMemoryDecisionsFromAgentOutput(outputText2):{decisions:[]};if(decisionExtraction.error){await internals.appendRunLog(options.directory,task.sessionID,{event:"curator_decision_rejected_by_validation",runId:task.sessionID??"unknown",agentRole:task.agentRole,agentId:task.agentRole,rejectionReason:decisionExtraction.error});return}if(extracted.proposals.length===0&&decisionExtraction.decisions.length===0)return;let gateway=internals.createGateway({directory:options.directory,sessionID:task.sessionID,agentRole:task.agentRole,agentId:task.agentRole,runId:task.sessionID},{config:options.config});if(!gateway.isEnabled()){await gateway.dispose?.();return}try{for(let proposalInput of extracted.proposals)try{let proposal=await gateway.propose(proposalInput);await internals.appendRunLog(options.directory,task.sessionID,{event:proposal.status==="pending"?"proposal_created":"proposal_rejected_by_validation",runId:task.sessionID??"unknown",agentRole:task.agentRole,agentId:task.agentRole,proposalId:proposal.id,rejectionReason:proposal.rejectionReason})}catch(err){await internals.appendRunLog(options.directory,task.sessionID,{event:"proposal_rejected_by_validation",runId:task.sessionID??"unknown",agentRole:task.agentRole,agentId:task.agentRole,rejectionReason:err instanceof Error?err.message:String(err)})}if(decisionExtraction.decisions.length>0&&!isCuratorAgent(task.agentRole)){await internals.appendRunLog(options.directory,task.sessionID,{event:"curator_decision_rejected_by_validation",runId:task.sessionID??"unknown",agentRole:task.agentRole,agentId:task.agentRole,rejectionReason:"only curator agents may emit curatorMemoryDecisions"});return}if(decisionExtraction.decisions.length>0){let applyCuratorDecisionMethod=gateway.applyCuratorDecision;if(!applyCuratorDecisionMethod){await internals.appendRunLog(options.directory,task.sessionID,{event:"curator_decision_rejected_by_validation",runId:task.sessionID??"unknown",agentRole:task.agentRole,agentId:task.agentRole,rejectionReason:"memory gateway does not support curator decisions"});return}let applyCuratorDecision=applyCuratorDecisionMethod.bind(gateway);for(let decision of decisionExtraction.decisions)try{let change=await applyCuratorDecision(decision);await internals.appendRunLog(options.directory,task.sessionID,{event:"curator_decision_applied",runId:task.sessionID??"unknown",agentRole:task.agentRole,agentId:task.agentRole,proposalId:change.proposalId,memoryIds:[change.memoryId,change.targetMemoryId,change.oldMemoryId,change.replacementMemoryId].filter((id)=>Boolean(id)),rejectionReason:change.reason,metadata:{action:change.action,proposalStatus:change.proposalStatus,eventId:change.eventId}})}catch(err){await internals.appendRunLog(options.directory,task.sessionID,{event:"curator_decision_rejected_by_validation",runId:task.sessionID??"unknown",agentRole:task.agentRole,agentId:task.agentRole,proposalId:decision.proposalId,rejectionReason:err instanceof Error?err.message:String(err),metadata:{action:decision.action}})}}}finally{await gateway.dispose?.()}}async function recallForAgent(input){let gateway=input.createGateway({directory:input.directory,sessionID:input.sessionID,agentRole:input.agentRole,agentId:input.agentId,runId:input.sessionID,unitId:input.unitId},{config:input.config});try{let resolvedConfig=resolveMemoryConfig(input.config);if(!gateway.isEnabled())return await logInjectionSkipped(input,"disabled"),null;if(!resolvedConfig.recall.injection.enabled)return await logInjectionSkipped(input,"disabled"),null;let scopes=gateway.deriveAllowedScopes(),planInput={userGoal:compactText(input.userGoal),runId:input.sessionID??"unknown",agentRole:input.agentRole,agentId:input.agentId,agentTask:compactText(input.agentTask),touchedFiles:extractTouchedFiles(input.agentTask)},plan=buildMemoryRecallPlan(planInput,{scopes});plan.maxItems=resolvedConfig.recall.injection.maxItems,plan.tokenBudget=resolvedConfig.recall.injection.tokenBudget,await input.appendRunLog(input.directory,input.sessionID,{event:"recall_requested",runId:input.sessionID??"unknown",agentRole:input.agentRole,agentId:input.agentId,metadata:{kinds:plan.kinds,maxItems:plan.maxItems,tokenBudget:plan.tokenBudget,scopeTypes:plan.scopes.map((scope)=>scope.type)}});let recallInput={query:plan.query,task:planInput.agentTask,mode:"injection",scopes:plan.scopes,kinds:plan.kinds,maxItems:plan.maxItems,tokenBudget:plan.tokenBudget,minScore:resolvedConfig.recall.injection.minScore,requireQuerySignal:resolvedConfig.recall.injection.requireQuerySignal},bundle=await gateway.recall(recallInput);if(await input.appendRunLog(input.directory,input.sessionID,{event:"recall_returned",runId:input.sessionID??"unknown",agentRole:input.agentRole,agentId:input.agentId,bundleId:bundle.id,memoryIds:bundle.items.map((item)=>item.record.id),scores:bundle.items.map((item)=>item.score),tokenEstimate:bundle.tokenEstimate}),bundle.items.length===0)await logInjectionSkipped(input,bundle.diagnostics?.injectionSkipReason??"no_results",bundle);return{bundle,scopes}}finally{await gateway.dispose?.()}}async function logInjectionSkipped(input,reason,bundle){await input.appendRunLog(input.directory,input.sessionID,{event:"prompt_injection_skipped",runId:input.sessionID??"unknown",agentRole:input.agentRole,agentId:input.agentId,bundleId:bundle?.id,memoryIds:bundle?.items.map((item)=>item.record.id),scores:bundle?.items.map((item)=>item.score),tokenEstimate:bundle?.tokenEstimate,rejectionReason:reason,metadata:{reason,candidateCount:bundle?.diagnostics?.candidateCount,preScoredFilteredCount:bundle?.diagnostics?.preScoredFilteredCount,noSignalCount:bundle?.diagnostics?.noSignalCount,belowThresholdCount:bundle?.diagnostics?.belowThresholdCount}})}async function maybeWriteUnitIdProbe(input){if(process.env.OPENCODE_SWARM_MEMORY_UNITID_PROBE!=="1")return;try{let match=input.agentTask.match(UNITID_PROBE_TASK_ID_PATTERN),record3={sessionID:input.sessionID,agentRole:input.agentRole,resolvedUnitId:input.unitId??null,promptTaskIdCandidate:match?match[1]:null,agentTaskSnippet:input.agentTask.slice(0,160),bundleId:input.bundleId,timestamp:new Date().toISOString()},filePath=validateSwarmPath(input.directory,path126.join("memory","unitid-probe.jsonl"));await mkdir32(path126.dirname(filePath),{recursive:!0}),await appendFile14(filePath,`${JSON.stringify(record3)}
1778
+ `)}var init_recall_planner=__esm(()=>{init_role_profiles()});import{appendFile as appendFile14,mkdir as mkdir31}from"node:fs/promises";import*as path125 from"node:path";async function appendMemoryRunLog(directory,runId,event){let safeRunId=sanitizeRunId(runId),relativePath2=path125.join("runs",safeRunId,"memory.jsonl"),filePath=validateSwarmPath(directory,relativePath2);await mkdir31(path125.dirname(filePath),{recursive:!0}),await appendFile14(filePath,`${JSON.stringify({...event,runId:safeRunId,timestamp:event.timestamp??new Date().toISOString()})}
1779
+ `,"utf-8")}function sanitizeRunId(runId){return(runId?.trim()||"unknown").replace(/[^A-Za-z0-9._-]/g,"_").slice(0,80)||"unknown"}var init_run_log=__esm(()=>{init_utils2()});import{appendFile as appendFile15,mkdir as mkdir32}from"node:fs/promises";import*as path126 from"node:path";function createMemoryLifecycleHooks(options){let internals={createGateway:options.createGateway??createMemoryGateway,appendRunLog:options.appendRunLog??appendMemoryRunLog};return{messagesTransform:async(input,output)=>{await injectIntoMessages(input,output,options,internals)},toolAfter:async(input,output)=>{await captureTaskOutputProposals(input,output,options,internals)}}}async function injectIntoMessages(input,output,options,internals){let messages=output?.messages;if(!Array.isArray(messages)||messages.length===0)return;if(messagesContainRecall(messages))return;let sessionID=getSessionID(input,messages),agentRole=resolveMessageAgent(messages,options,sessionID),latestUserText=latestTextForRole(messages,"user");if(!latestUserText)return;let agentTask=extractTaskToolPrompt(messages)??latestUserText,unitId=options.getActiveTaskId?.(sessionID),result=await recallForAgent({directory:options.directory,config:options.config,sessionID,agentRole,agentId:agentRole,userGoal:latestUserText,agentTask,unitId,createGateway:internals.createGateway,appendRunLog:internals.appendRunLog});if(result)await maybeWriteUnitIdProbe({directory:options.directory,sessionID,agentRole,unitId,agentTask,bundleId:result.bundle.id});if(!result||result.bundle.items.length===0)return;let insertAt=recallMessageInsertIndex(messages),recallMessage={info:{role:"system",agent:agentRole,sessionID},parts:[{type:"text",text:result.bundle.promptBlock}]};messages.splice(insertAt,0,recallMessage),await internals.appendRunLog(options.directory,sessionID,{event:"prompt_injected",runId:sessionID??"unknown",agentRole,agentId:agentRole,bundleId:result.bundle.id,memoryIds:result.bundle.items.map((item)=>item.record.id),tokenEstimate:result.bundle.tokenEstimate,metadata:{surface:"chat_messages"}})}async function captureTaskOutputProposals(input,output,options,internals){let task=parseTaskToolInput(input);if(!task)return;let outputText2=output?.output;if(typeof outputText2!=="string"||!outputText2.includes("memoryProposals")&&!outputText2.includes("curatorMemoryDecisions"))return;let extracted=outputText2.includes("memoryProposals")?extractMemoryProposalsFromAgentOutput(outputText2):{proposals:[]};if(extracted.error){await internals.appendRunLog(options.directory,task.sessionID,{event:"proposal_rejected_by_validation",runId:task.sessionID??"unknown",agentRole:task.agentRole,agentId:task.agentRole,rejectionReason:extracted.error});return}let decisionExtraction=outputText2.includes("curatorMemoryDecisions")?extractCuratorMemoryDecisionsFromAgentOutput(outputText2):{decisions:[]};if(decisionExtraction.error){await internals.appendRunLog(options.directory,task.sessionID,{event:"curator_decision_rejected_by_validation",runId:task.sessionID??"unknown",agentRole:task.agentRole,agentId:task.agentRole,rejectionReason:decisionExtraction.error});return}if(extracted.proposals.length===0&&decisionExtraction.decisions.length===0)return;let gateway=internals.createGateway({directory:options.directory,sessionID:task.sessionID,agentRole:task.agentRole,agentId:task.agentRole,runId:task.sessionID},{config:options.config});if(!gateway.isEnabled()){await gateway.dispose?.();return}try{for(let proposalInput of extracted.proposals)try{let proposal=await gateway.propose(proposalInput);await internals.appendRunLog(options.directory,task.sessionID,{event:proposal.status==="pending"?"proposal_created":"proposal_rejected_by_validation",runId:task.sessionID??"unknown",agentRole:task.agentRole,agentId:task.agentRole,proposalId:proposal.id,rejectionReason:proposal.rejectionReason})}catch(err){await internals.appendRunLog(options.directory,task.sessionID,{event:"proposal_rejected_by_validation",runId:task.sessionID??"unknown",agentRole:task.agentRole,agentId:task.agentRole,rejectionReason:err instanceof Error?err.message:String(err)})}if(decisionExtraction.decisions.length>0&&!isCuratorAgent(task.agentRole)){await internals.appendRunLog(options.directory,task.sessionID,{event:"curator_decision_rejected_by_validation",runId:task.sessionID??"unknown",agentRole:task.agentRole,agentId:task.agentRole,rejectionReason:"only curator agents may emit curatorMemoryDecisions"});return}if(decisionExtraction.decisions.length>0){let applyCuratorDecisionMethod=gateway.applyCuratorDecision;if(!applyCuratorDecisionMethod){await internals.appendRunLog(options.directory,task.sessionID,{event:"curator_decision_rejected_by_validation",runId:task.sessionID??"unknown",agentRole:task.agentRole,agentId:task.agentRole,rejectionReason:"memory gateway does not support curator decisions"});return}let applyCuratorDecision=applyCuratorDecisionMethod.bind(gateway);for(let decision of decisionExtraction.decisions)try{let change=await applyCuratorDecision(decision);await internals.appendRunLog(options.directory,task.sessionID,{event:"curator_decision_applied",runId:task.sessionID??"unknown",agentRole:task.agentRole,agentId:task.agentRole,proposalId:change.proposalId,memoryIds:[change.memoryId,change.targetMemoryId,change.oldMemoryId,change.replacementMemoryId].filter((id)=>Boolean(id)),rejectionReason:change.reason,metadata:{action:change.action,proposalStatus:change.proposalStatus,eventId:change.eventId}})}catch(err){await internals.appendRunLog(options.directory,task.sessionID,{event:"curator_decision_rejected_by_validation",runId:task.sessionID??"unknown",agentRole:task.agentRole,agentId:task.agentRole,proposalId:decision.proposalId,rejectionReason:err instanceof Error?err.message:String(err),metadata:{action:decision.action}})}}}finally{await gateway.dispose?.()}}async function recallForAgent(input){let gateway=input.createGateway({directory:input.directory,sessionID:input.sessionID,agentRole:input.agentRole,agentId:input.agentId,runId:input.sessionID,unitId:input.unitId},{config:input.config});try{let resolvedConfig=resolveMemoryConfig(input.config);if(!gateway.isEnabled())return await logInjectionSkipped(input,"disabled"),null;if(!resolvedConfig.recall.injection.enabled)return await logInjectionSkipped(input,"disabled"),null;let scopes=gateway.deriveAllowedScopes(),planInput={userGoal:compactText(input.userGoal),runId:input.sessionID??"unknown",agentRole:input.agentRole,agentId:input.agentId,agentTask:compactText(input.agentTask),touchedFiles:extractTouchedFiles(input.agentTask)},plan=buildMemoryRecallPlan(planInput,{scopes});plan.maxItems=resolvedConfig.recall.injection.maxItems,plan.tokenBudget=resolvedConfig.recall.injection.tokenBudget,await input.appendRunLog(input.directory,input.sessionID,{event:"recall_requested",runId:input.sessionID??"unknown",agentRole:input.agentRole,agentId:input.agentId,metadata:{kinds:plan.kinds,maxItems:plan.maxItems,tokenBudget:plan.tokenBudget,scopeTypes:plan.scopes.map((scope)=>scope.type)}});let recallInput={query:plan.query,task:planInput.agentTask,mode:"injection",scopes:plan.scopes,kinds:plan.kinds,maxItems:plan.maxItems,tokenBudget:plan.tokenBudget,minScore:resolvedConfig.recall.injection.minScore,requireQuerySignal:resolvedConfig.recall.injection.requireQuerySignal},bundle=await gateway.recall(recallInput);if(await input.appendRunLog(input.directory,input.sessionID,{event:"recall_returned",runId:input.sessionID??"unknown",agentRole:input.agentRole,agentId:input.agentId,bundleId:bundle.id,memoryIds:bundle.items.map((item)=>item.record.id),scores:bundle.items.map((item)=>item.score),tokenEstimate:bundle.tokenEstimate}),bundle.items.length===0)await logInjectionSkipped(input,bundle.diagnostics?.injectionSkipReason??"no_results",bundle);return{bundle,scopes}}finally{await gateway.dispose?.()}}async function logInjectionSkipped(input,reason,bundle){await input.appendRunLog(input.directory,input.sessionID,{event:"prompt_injection_skipped",runId:input.sessionID??"unknown",agentRole:input.agentRole,agentId:input.agentId,bundleId:bundle?.id,memoryIds:bundle?.items.map((item)=>item.record.id),scores:bundle?.items.map((item)=>item.score),tokenEstimate:bundle?.tokenEstimate,rejectionReason:reason,metadata:{reason,candidateCount:bundle?.diagnostics?.candidateCount,preScoredFilteredCount:bundle?.diagnostics?.preScoredFilteredCount,noSignalCount:bundle?.diagnostics?.noSignalCount,belowThresholdCount:bundle?.diagnostics?.belowThresholdCount}})}async function maybeWriteUnitIdProbe(input){if(process.env.OPENCODE_SWARM_MEMORY_UNITID_PROBE!=="1")return;try{let match=input.agentTask.match(UNITID_PROBE_TASK_ID_PATTERN),record3={sessionID:input.sessionID,agentRole:input.agentRole,resolvedUnitId:input.unitId??null,promptTaskIdCandidate:match?match[1]:null,agentTaskSnippet:input.agentTask.slice(0,160),bundleId:input.bundleId,timestamp:new Date().toISOString()},filePath=validateSwarmPath(input.directory,path126.join("memory","unitid-probe.jsonl"));await mkdir32(path126.dirname(filePath),{recursive:!0}),await appendFile15(filePath,`${JSON.stringify(record3)}
1772
1780
  `,"utf-8")}catch{}}function parseTaskToolInput(input){let record3=input,rawTool=typeof record3.tool==="string"?record3.tool:void 0,toolName=rawTool?normalizeToolName(rawTool)??rawTool:void 0;if(toolName!=="Task"&&toolName!=="task")return null;if(!record3.args||typeof record3.args!=="object")return null;let args2=record3.args,prompt=args2.prompt;if(typeof prompt!=="string"||prompt.trim().length===0)return null;let target=typeof args2.subagent_type==="string"?args2.subagent_type:typeof args2.agent==="string"?args2.agent:typeof record3.agent==="string"?record3.agent:"architect";return{sessionID:typeof record3.sessionID==="string"?record3.sessionID:void 0,agentRole:stripKnownSwarmPrefix(target),prompt}}function isCuratorAgent(agentRole){return agentRole==="curator"||agentRole==="curator_init"||agentRole==="curator_phase"||agentRole==="curator_postmortem"}function messagesContainRecall(messages){return messages.some((message)=>message?.parts?.some((part)=>typeof part?.text==="string"&&(part.text.includes(MEMORY_SENTINEL)||part.text.includes("Retrieved Swarm Memory"))))}function getSessionID(input,messages){let inputSession=input?.sessionID;if(typeof inputSession==="string")return inputSession;for(let message of messages){let sessionID=message?.info?.sessionID;if(typeof sessionID==="string")return sessionID}return}function resolveMessageAgent(messages,options,sessionID){let configured=options.getActiveAgentName?.(sessionID);if(configured)return stripKnownSwarmPrefix(configured);for(let message of messages){let agent=message?.info?.agent;if(typeof agent==="string")return stripKnownSwarmPrefix(agent)}return"architect"}function latestTextForRole(messages,role){for(let i=messages.length-1;i>=0;i--){let message=messages[i];if(message.info?.role!==role||!Array.isArray(message.parts))continue;let text=message.parts.map((part)=>part?.text).filter((partText)=>typeof partText==="string").join(`
1773
- `).trim();if(text)return text}return null}function extractTaskToolPrompt(messages){for(let i=messages.length-1;i>=0;i--){let msg=messages[i];if((msg.role??msg.info?.role)!=="assistant")continue;let content=Array.isArray(msg.content)?msg.content:Array.isArray(msg.parts)?msg.parts:[];for(let j=content.length-1;j>=0;j--){let block=content[j];if(block&&typeof block==="object"){let b=block;if(b.type==="tool_use"&&b.name==="Task"){let prompt=b.input?.prompt;if(typeof prompt==="string"&&prompt.length>0)return prompt}}}}return null}function recallMessageInsertIndex(messages){for(let i=messages.length-1;i>=0;i--)if(messages[i]?.info?.role==="user")return i;return messages.length}function extractTouchedFiles(text){let matches=text.match(/\b(?:src|tests|test|docs|scripts|packages)\/[A-Za-z0-9._/@+-]+/g);return Array.from(new Set(matches??[])).slice(0,20)}function compactText(text){let compacted=text.replace(/\s+/g," ").trim();if(compacted.length<=2000)return compacted;return Array.from(compacted).slice(0,2000).join("")}var MEMORY_SENTINEL,UNITID_PROBE_TASK_ID_PATTERN;var init_injector=__esm(()=>{init_agent_output_schema();init_schema();init_normalize_tool_name();init_utils2();init_config2();init_gateway();init_recall_planner();init_run_log();MEMORY_SENTINEL=MEMORY_RECALL_SENTINEL;UNITID_PROBE_TASK_ID_PATTERN=/\bTASK:\s*(\d+(?:\.\d+)+)\b/});var init_memory=__esm(()=>{init_config2();init_errors4();init_evaluation();init_gateway();init_injector();init_jsonl_migration();init_local_jsonl_provider();init_maintenance();init_memory_link();init_prompt_block();init_recall_planner();init_redaction();init_role_profiles();init_run_log();init_schema2();init_sqlite_provider();init_storage_root()});import{appendFile as appendFile15,mkdir as mkdir33,readFile as readFile34}from"node:fs/promises";import*as path127 from"node:path";function resolveLogPath2(target){if(typeof target==="string")return validateSwarmPath(target,LOG_RELATIVE_PATH);if(target.kind==="cohort")return path127.join(target.cohortRoot,LOG_BASENAME);return validateSwarmPath(target.directory,LOG_RELATIVE_PATH)}async function readConsolidationLog(target){let filePath=resolveLogPath2(target),raw;try{raw=await readFile34(filePath,"utf-8")}catch{return[]}let records=[];for(let line of raw.split(`
1774
- `)){let trimmed=line.trim();if(!trimmed)continue;try{records.push(JSON.parse(trimmed))}catch{}}return records}async function appendConsolidationLog(target,record3){let filePath=resolveLogPath2(target);await mkdir33(path127.dirname(filePath),{recursive:!0}),await appendFile15(filePath,`${JSON.stringify(record3)}
1781
+ `).trim();if(text)return text}return null}function extractTaskToolPrompt(messages){for(let i=messages.length-1;i>=0;i--){let msg=messages[i];if((msg.role??msg.info?.role)!=="assistant")continue;let content=Array.isArray(msg.content)?msg.content:Array.isArray(msg.parts)?msg.parts:[];for(let j=content.length-1;j>=0;j--){let block=content[j];if(block&&typeof block==="object"){let b=block;if(b.type==="tool_use"&&b.name==="Task"){let prompt=b.input?.prompt;if(typeof prompt==="string"&&prompt.length>0)return prompt}}}}return null}function recallMessageInsertIndex(messages){for(let i=messages.length-1;i>=0;i--)if(messages[i]?.info?.role==="user")return i;return messages.length}function extractTouchedFiles(text){let matches=text.match(/\b(?:src|tests|test|docs|scripts|packages)\/[A-Za-z0-9._/@+-]+/g);return Array.from(new Set(matches??[])).slice(0,20)}function compactText(text){let compacted=text.replace(/\s+/g," ").trim();if(compacted.length<=2000)return compacted;return Array.from(compacted).slice(0,2000).join("")}var MEMORY_SENTINEL,UNITID_PROBE_TASK_ID_PATTERN;var init_injector=__esm(()=>{init_agent_output_schema();init_schema();init_normalize_tool_name();init_utils2();init_config2();init_gateway();init_recall_planner();init_run_log();MEMORY_SENTINEL=MEMORY_RECALL_SENTINEL;UNITID_PROBE_TASK_ID_PATTERN=/\bTASK:\s*(\d+(?:\.\d+)+)\b/});var init_memory=__esm(()=>{init_config2();init_errors4();init_evaluation();init_gateway();init_injector();init_jsonl_migration();init_local_jsonl_provider();init_maintenance();init_memory_link();init_prompt_block();init_recall_planner();init_redaction();init_role_profiles();init_run_log();init_schema2();init_sqlite_provider();init_storage_root()});import{appendFile as appendFile16,mkdir as mkdir33,readFile as readFile34}from"node:fs/promises";import*as path127 from"node:path";function resolveLogPath2(target){if(typeof target==="string")return validateSwarmPath(target,LOG_RELATIVE_PATH);if(target.kind==="cohort")return path127.join(target.cohortRoot,LOG_BASENAME);return validateSwarmPath(target.directory,LOG_RELATIVE_PATH)}async function readConsolidationLog(target){let filePath=resolveLogPath2(target),raw;try{raw=await readFile34(filePath,"utf-8")}catch{return[]}let records=[];for(let line of raw.split(`
1782
+ `)){let trimmed=line.trim();if(!trimmed)continue;try{records.push(JSON.parse(trimmed))}catch{}}return records}async function appendConsolidationLog(target,record3){let filePath=resolveLogPath2(target);await mkdir33(path127.dirname(filePath),{recursive:!0}),await appendFile16(filePath,`${JSON.stringify(record3)}
1775
1783
  `,"utf-8")}var LOG_RELATIVE_PATH,LOG_BASENAME="consolidation-log.jsonl";var init_consolidation_log=__esm(()=>{init_utils2();LOG_RELATIVE_PATH=path127.join("memory","consolidation-log.jsonl")});import{existsSync as existsSync64}from"node:fs";import*as path128 from"node:path";import{fileURLToPath as fileURLToPath5}from"node:url";async function handleMemoryCommand(_directory,_args){return["## Swarm Memory","","- `/swarm memory status` - show provider, SQLite path, JSONL files, and last migration report","- `/swarm memory pending` - show pending proposals and recent rejection reasons","- `/swarm memory recall-log` - summarize recall usage by agent role and memory ID","- `/swarm memory value-log` - show per-memory learned-utility (q-value) history, recent rewards, and suppression/promotion candidacy","- `/swarm memory stale` - list expired scratch, superseded, deleted, and low-utility memories","- `/swarm memory compact` - dry-run compaction; pass `--confirm` to remove deleted, superseded, and expired scratch records","- `/swarm memory export` - export current memory and proposals to `.swarm/memory/export/*.jsonl`","- `/swarm memory import` - import `.swarm/memory/{memories,proposals}.jsonl` into SQLite","- `/swarm memory migrate` - run the one-time legacy JSONL to SQLite migration","- `/swarm memory evaluate --json` - run the golden recall evaluation fixtures and emit a JSON report","- `/swarm memory consolidation-log [--limit <n>]` - summarize recent episodic→semantic consolidation passes (max 50 per query)","- `/swarm memory link [name]` - share memory across linked worktrees (requires `memory.link.enabled: true`)","- `/swarm memory link status` - show the memory link state (distinct from knowledge link)","- `/swarm memory unlink` - stop sharing memory; copies the cohort family back to local"].join(`
1776
1784
  `)}async function handleMemoryConsolidationLogCommand(directory,args2){let parsed=parseMaintenanceArgs(args2,{usage:"Usage: /swarm memory consolidation-log [--limit <n>] (max 50 records per query)",allowConfirm:!1});if("error"in parsed)return parsed.error;let limit=Math.min(parsed.limit,50),loadedMemory=loadPluginConfig(directory).memory,records=await readConsolidationLog(resolveVettedMemoryRoot(directory,resolveMemoryConfig(loadedMemory??DEFAULT_MEMORY_CONFIG))),recent=records.slice(-limit).reverse(),lines=["## Swarm Memory Consolidation Log","",`- Total recorded passes: \`${records.length}\``,`- Showing: \`${recent.length}\``];if(recent.length===0)return lines.push("","No consolidation passes have been recorded yet."),lines.join(`
1777
1785
  `);for(let record3 of recent)lines.push("",`### Phase ${record3.phaseNumber} — ${record3.completedAt}`,`- Run: \`${record3.runId??"unknown"}\``,`- Clusters: \`${record3.clusterCount}\` (deferred \`${record3.clustersDeferred}\`)`,`- Decisions applied: \`${record3.decisionsEmitted}\` (added \`${record3.added}\`, superseded \`${record3.superseded}\`)`,`- Contradictions: \`${record3.contradictionsDetected}\` | Deduped: \`${record3.deduped}\` | Proposed: \`${record3.proposed}\``,`- Memories decayed: \`${record3.memoriesDecayed}\` | Errored: \`${record3.errored}\``,`- Processed proposals: \`${record3.processedProposalIds.length}\``);return lines.join(`
@@ -1808,9 +1816,9 @@ ${familySummary}`:"";return[`\uD83D\uDD17 Linked this worktree's memory to share
1808
1816
  `);let instructions=sanitizeInstructions(rest.join(" "));return instructions?`[MODE: PR_FEEDBACK] ${instructions}`:"[MODE: PR_FEEDBACK]"}var init_pr_feedback=__esm(()=>{init_pr_ref()});function formatRelativeTime(epochMs){let diffMs=Date.now()-epochMs;if(diffMs<0)return"just now";if(diffMs<5000)return"just now";let diffSeconds=Math.floor(diffMs/1000);if(diffSeconds<60)return`${diffSeconds} seconds ago`;let diffMinutes=Math.floor(diffSeconds/60);if(diffMinutes<60)return`${diffMinutes} minute${diffMinutes===1?"":"s"} ago`;let diffHours=Math.floor(diffMinutes/60);if(diffHours<24)return`${diffHours} hour${diffHours===1?"":"s"} ago`;let diffDays=Math.floor(diffHours/24);return`${diffDays} day${diffDays===1?"":"s"} ago`}function isObject3(value){return typeof value==="object"&&value!==null}function parseMergeGroupRuns(raw,prNumber){let parsed;try{parsed=JSON.parse(raw)}catch{return[]}if(!Array.isArray(parsed))return[];let prToken=`pr-${prNumber}-`,issueToken=`#${prNumber}`,runs=[];for(let item of parsed){if(!isObject3(item))continue;let databaseId=Number(item.databaseId),headBranch=String(item.headBranch??""),displayTitle=String(item.displayTitle??""),name=String(item.name??"");if(!headBranch.includes(prToken)&&!displayTitle.includes(issueToken)&&!name.includes(issueToken))continue;if(!Number.isFinite(databaseId)||databaseId<=0)continue;runs.push({databaseId,headBranch,status:String(item.status??""),conclusion:typeof item.conclusion==="string"?item.conclusion:null,url:String(item.url??""),displayTitle,name})}return runs.slice(0,3)}async function listMergeGroupRuns(directory,repoFullName,prNumber){let result=await runExternalTool({executable:"gh",args:["run","list","--repo",repoFullName,"--event","merge_group","--limit","20","--json","databaseId,headBranch,conclusion,status,url,displayTitle,name"],cwd:directory,timeoutMs:GH_RUN_LIST_TIMEOUT_MS,maxStdoutBytes:GH_RUN_LIST_MAX_BYTES,maxStderrBytes:GH_RUN_LIST_MAX_BYTES});if(result.status!=="completed"||result.exitCode!==0)return{runs:[],error:result.stderr.trim()||result.message||result.status};return{runs:parseMergeGroupRuns(result.stdout,prNumber)}}function formatMergeGroupStatus(status,conclusion,htmlUrl){if(!status)return"Merge group: unknown";let parts=[`Merge group: ${status}`];if(conclusion)parts.push(conclusion);if(htmlUrl)parts.push(`(${htmlUrl})`);return parts.join(" ")}async function handlePrMonitorStatusCommand(directory,_args,sessionID,source){let allActive=await _internals86.listActive(directory),allSessions=source==="cli",subs=allSessions?allActive:allActive.filter((record3)=>record3.sessionID===sessionID);if(subs.length===0)return allSessions?"No active PR subscriptions.":"No active PR subscriptions for this session.";let lines=[];lines.push(allSessions?"PR Monitor Status — all sessions":`PR Monitor Status — Session: ${sessionID}`),lines.push("");let totalActive=allActive.length;lines.push(`Active subscriptions (${subs.length}):`);for(let i=0;i<subs.length;i++){let sub=subs[i],index=i+1;lines.push(` ${index}. ${sub.repoFullName}#${sub.prNumber}`),lines.push(` URL: ${sub.prUrl}`);let mergeGroupRuns=await _internals86.listMergeGroupRuns(directory,sub.repoFullName,sub.prNumber);if(mergeGroupRuns.runs.length>0){lines.push(" Merge-group runs:");for(let run of mergeGroupRuns.runs){let conclusion=run.conclusion??run.status;if(lines.push(` - ${run.databaseId}: ${conclusion} ${run.url}`),run.conclusion&&run.conclusion!=="success")lines.push(` Failed logs: gh run view ${run.databaseId} --repo ${sub.repoFullName} --log-failed`)}}else if(mergeGroupRuns.error)lines.push(` Merge-group runs: unavailable (${mergeGroupRuns.error})`);else lines.push(" Merge-group runs: none found in recent runs");if(lines.push(` Merge-group checks: gh pr checks ${sub.prNumber} --repo ${sub.repoFullName}`),lines.push(` Failed logs: gh run view <run-id> --repo ${sub.repoFullName} --log-failed`),allSessions)lines.push(` Session: ${sub.sessionID}`);if(lines.push(` Last checked: ${formatRelativeTime(sub.lastCheckedAt)}`),lines.push(` Watching: ${sub.isWatching?"yes":"no"}`),lines.push(` ${formatMergeGroupStatus(sub.mergeGroupRunStatus,sub.mergeGroupRunConclusion,sub.mergeGroupRunHtmlUrl)}`),lines.push(` Errors: ${sub.errorCount}`),i<subs.length-1)lines.push("")}if(lines.push(""),!allSessions&&totalActive!==subs.length)lines.push(`Total active across all sessions: ${totalActive}`);return lines.join(`
1809
1817
  `)}var GH_RUN_LIST_TIMEOUT_MS=1e4,GH_RUN_LIST_MAX_BYTES=20000,_internals86;var init_pr_monitor_status=__esm(()=>{init_pr_subscriptions();init_external_tool_runner();_internals86={formatRelativeTime,formatMergeGroupStatus,listActive,listMergeGroupRuns,parseMergeGroupRuns}});function parseArgs10(args2){let out={council:!1,rest:[]};for(let token of args2){if(token==="--council"){out.council=!0;continue}if(token.startsWith("--")){if(out.unknownFlag===void 0)out.unknownFlag=token;continue}if(token.trim().length===0)continue;out.rest.push(token)}return out}function handlePrReviewCommand(directory,args2){let parsed=parseArgs10(args2);if(parsed.unknownFlag)return`Error: Unknown flag "${parsed.unknownFlag}"
1810
1818
 
1811
- ${USAGE6}`;let resolved=resolvePrCommandInput(parsed.rest,directory);if(resolved===null)return USAGE6;if("error"in resolved)return`Error: ${resolved.error}
1819
+ ${USAGE7}`;let resolved=resolvePrCommandInput(parsed.rest,directory);if(resolved===null)return USAGE7;if("error"in resolved)return`Error: ${resolved.error}
1812
1820
 
1813
- ${USAGE6}`;let councilFlag=parsed.council?"council=true":"council=false",signal=`[MODE: PR_REVIEW pr="${resolved.prUrl}" ${councilFlag}]`;return resolved.instructions?`${signal} ${resolved.instructions}`:signal}var USAGE6;var init_pr_review=__esm(()=>{init_pr_ref();USAGE6=["Usage: /swarm pr-review <url|owner/repo#N|N> [--council] [instructions...]","","Run a full swarm PR review on a GitHub pull request."," /swarm pr-review https://github.com/owner/repo/pull/42"," /swarm pr-review owner/repo#42"," /swarm pr-review 42 --council"," /swarm pr-review 42 focus on the auth refactor and the new retry logic","","Flags:"," --council Run adversarial council variant (all lanes assume work is wrong)","","Any text after the PR reference is forwarded to the reviewer as extra instructions."].join(`
1821
+ ${USAGE7}`;let councilFlag=parsed.council?"council=true":"council=false",signal=`[MODE: PR_REVIEW pr="${resolved.prUrl}" ${councilFlag}]`;return resolved.instructions?`${signal} ${resolved.instructions}`:signal}var USAGE7;var init_pr_review=__esm(()=>{init_pr_ref();USAGE7=["Usage: /swarm pr-review <url|owner/repo#N|N> [--council] [instructions...]","","Run a full swarm PR review on a GitHub pull request."," /swarm pr-review https://github.com/owner/repo/pull/42"," /swarm pr-review owner/repo#42"," /swarm pr-review 42 --council"," /swarm pr-review 42 focus on the auth refactor and the new retry logic","","Flags:"," --council Run adversarial council variant (all lanes assume work is wrong)","","Any text after the PR reference is forwarded to the reviewer as extra instructions."].join(`
1814
1822
  `)});async function handlePrSubscribeCommand(directory,args2,sessionID){let rest=args2.filter((t)=>t.trim().length>0);if(rest.length===0)return["Usage: /swarm pr subscribe <pr-url|owner/repo#N|N>","","Subscribes the current session to PR state-change events","for the specified PR. Requires pr_monitor.enabled: true in config.",""," /swarm pr subscribe https://github.com/owner/repo/pull/42"," /swarm pr subscribe owner/repo#42"," /swarm pr subscribe 42"].join(`
1815
1823
  `);let refToken=rest[0],prInfo=parsePrRef(refToken,directory);if(!prInfo){if(looksLikePrRef(refToken))return[`Error: Could not resolve PR reference from "${refToken}".`,"","That looked like a PR reference but could not be resolved.","Pass a full URL or `owner/repo#N`, or verify your git","`origin` remote points to a GitHub repository."].join(`
1816
1824
  `);return[`Error: "${refToken}" is not a valid PR reference.`,"","Expected: full GitHub URL, owner/repo#N shorthand,","or a bare PR number (resolved against origin)."].join(`
@@ -1881,9 +1889,9 @@ ${error93 instanceof Error?error93.message:String(error93)}`}}var init_retrieve=
1881
1889
  `);case"unknown_feature":return[`Unknown Spec-Kit feature '${resolution.feature}'.`,`Available features: ${resolution.available.join(", ")}.`].join(`
1882
1890
  `);case"zero_requirements":return`Spec-Kit feature '${resolution.feature}' contains no parsable functional requirements.`;case"too_large":return`Spec-Kit feature '${resolution.feature}' projected output exceeds the size limit (${resolution.bytes} bytes).`;case"not_speckit":return"No Spec-Kit layout detected (.specify/ marker not present).";case"ok":return""}}async function handleSddStatusCommand(directory,args2){let parsed=parseArgs11(args2);if(parsed.error)return`Error: ${parsed.error}
1883
1891
 
1884
- ${USAGE7}`;if(parsed.feature&&parsed.source&&parsed.source!=="speckit")return`Error: --feature is only valid with --source speckit
1892
+ ${USAGE8}`;if(parsed.feature&&parsed.source&&parsed.source!=="speckit")return`Error: --feature is only valid with --source speckit
1885
1893
 
1886
- ${USAGE7}`;let speckitDetection=detectSpeckit(directory),speckitPresent=speckitDetection.features.length>0,nativeSpecExists=fs78.existsSync(path152.join(directory,SWARM_SPEC_REL2));if(speckitPresent&&!parsed.source&&!nativeSpecExists){if(buildOpenSpecProjectionSync(directory)!==null){let errLines=["Error: Multiple SDD sources detected (openspec, speckit).","Pass --source openspec or --source speckit to select a provider."];return parsed.json?JSON.stringify({error:errLines.join(" "),sources:["openspec","speckit"]},null,2):errLines.join(`
1894
+ ${USAGE8}`;let speckitDetection=detectSpeckit(directory),speckitPresent=speckitDetection.features.length>0,nativeSpecExists=fs78.existsSync(path152.join(directory,SWARM_SPEC_REL2));if(speckitPresent&&!parsed.source&&!nativeSpecExists){if(buildOpenSpecProjectionSync(directory)!==null){let errLines=["Error: Multiple SDD sources detected (openspec, speckit).","Pass --source openspec or --source speckit to select a provider."];return parsed.json?JSON.stringify({error:errLines.join(" "),sources:["openspec","speckit"]},null,2):errLines.join(`
1887
1895
  `)}}let status=loadSddStatusSync(directory,{source:parsed.source,feature:parsed.feature});if(parsed.json)return JSON.stringify({...status,speckit:speckitDetection},null,2);let changes=status.changes.map((change)=>`${change.id} (${change.specs.length} spec file${change.specs.length===1?"":"s"}, proposal=${change.proposal}, design=${change.design}, tasks=${change.tasks})`),speckitLines=["### Spec-Kit",`Spec-Kit provider: ${speckitDetection.markerPresent?"detected":"not present"}`,speckitDetection.features.length>0?`Features:
1888
1896
  ${speckitDetection.features.map((f)=>`- ${f.featureId}`).join(`
1889
1897
  `)}`:"Features: none"].join(`
@@ -1896,14 +1904,14 @@ ${formatList(status.errors)}`:"",status.warnings.length>0?`
1896
1904
  ${formatList([...status.warnings,...status.effectiveSpec?.warnings??[]])}`:""].join(`
1897
1905
  `)}async function handleSddValidateCommand(directory,args2){let parsed=parseArgs11(args2);if(parsed.error)return`Error: ${parsed.error}
1898
1906
 
1899
- ${USAGE7}`;if(parsed.feature&&parsed.source&&parsed.source!=="speckit")return`Error: --feature is only valid with --source speckit
1907
+ ${USAGE8}`;if(parsed.feature&&parsed.source&&parsed.source!=="speckit")return`Error: --feature is only valid with --source speckit
1900
1908
 
1901
- ${USAGE7}`;let useSpeckit=!1,nativeSpecExists=fs78.existsSync(path152.join(directory,SWARM_SPEC_REL2));if(parsed.source==="speckit")useSpeckit=!0;else if(!parsed.source&&!nativeSpecExists){let speckitDetection=detectSpeckit(directory);if(speckitDetection.features.length>0){if(buildOpenSpecProjectionSync(directory)!==null){let errLines=["Error: Multiple SDD sources detected (openspec, speckit).","Pass --source openspec or --source speckit to select a provider."];return parsed.json?JSON.stringify({valid:!1,error:errLines.join(" "),sources:["openspec","speckit"]},null,2):errLines.join(`
1909
+ ${USAGE8}`;let useSpeckit=!1,nativeSpecExists=fs78.existsSync(path152.join(directory,SWARM_SPEC_REL2));if(parsed.source==="speckit")useSpeckit=!0;else if(!parsed.source&&!nativeSpecExists){let speckitDetection=detectSpeckit(directory);if(speckitDetection.features.length>0){if(buildOpenSpecProjectionSync(directory)!==null){let errLines=["Error: Multiple SDD sources detected (openspec, speckit).","Pass --source openspec or --source speckit to select a provider."];return parsed.json?JSON.stringify({valid:!1,error:errLines.join(" "),sources:["openspec","speckit"]},null,2):errLines.join(`
1902
1910
  `)}useSpeckit=!0}else if(speckitDetection.markerPresent){if(buildOpenSpecProjectionSync(directory)===null){let resolution=resolveSpeckitProjection(directory);return parsed.json?JSON.stringify({valid:!1,error:formatSpeckitError(resolution)},null,2):`Error: ${formatSpeckitError(resolution)}
1903
1911
 
1904
- ${USAGE7}`}}}if(useSpeckit){let{resolution,problems}=validateSpeckit(directory,{feature:parsed.feature});if(resolution.kind!=="ok"&&resolution.kind!=="zero_requirements")return parsed.json?JSON.stringify({valid:!1,error:formatSpeckitError(resolution)},null,2):`Error: ${formatSpeckitError(resolution)}
1912
+ ${USAGE8}`}}}if(useSpeckit){let{resolution,problems}=validateSpeckit(directory,{feature:parsed.feature});if(resolution.kind!=="ok"&&resolution.kind!=="zero_requirements")return parsed.json?JSON.stringify({valid:!1,error:formatSpeckitError(resolution)},null,2):`Error: ${formatSpeckitError(resolution)}
1905
1913
 
1906
- ${USAGE7}`;let spec=resolution.kind==="ok"?resolution.spec:null,result2={valid:problems.length===0&&resolution.kind==="ok",provider:"speckit_projection",changeId:null,sourcePaths:spec?.sourcePaths??[],hash:spec?.hash??null,errors:problems,warnings:spec?.warnings??[]};if(parsed.json)return JSON.stringify(result2,null,2);return[`SDD validation: ${result2.valid?"valid":"invalid"}`,`Provider: ${result2.provider}`,`Projected sources: ${result2.sourcePaths.length}`,result2.errors.length>0?`
1914
+ ${USAGE8}`;let spec=resolution.kind==="ok"?resolution.spec:null,result2={valid:problems.length===0&&resolution.kind==="ok",provider:"speckit_projection",changeId:null,sourcePaths:spec?.sourcePaths??[],hash:spec?.hash??null,errors:problems,warnings:spec?.warnings??[]};if(parsed.json)return JSON.stringify(result2,null,2);return[`SDD validation: ${result2.valid?"valid":"invalid"}`,`Provider: ${result2.provider}`,`Projected sources: ${result2.sourcePaths.length}`,result2.errors.length>0?`
1907
1915
  Errors:
1908
1916
  ${formatList(result2.errors)}`:"",result2.warnings.length>0?`
1909
1917
  Warnings:
@@ -1920,29 +1928,29 @@ Warnings:
1920
1928
  ${formatList(result.warnings)}`:""].join(`
1921
1929
  `)}async function handleSddProjectCommand(directory,args2){let parsed=parseArgs11(args2);if(parsed.error)return`Error: ${parsed.error}
1922
1930
 
1923
- ${USAGE7}`;if(parsed.feature&&parsed.source&&parsed.source!=="speckit")return`Error: --feature is only valid with --source speckit
1931
+ ${USAGE8}`;if(parsed.feature&&parsed.source&&parsed.source!=="speckit")return`Error: --feature is only valid with --source speckit
1924
1932
 
1925
- ${USAGE7}`;if(parsed.source==="swarm")return`Error: --source swarm selects the native .swarm/spec.md and does not generate a projection. Use --source openspec or --source speckit.
1933
+ ${USAGE8}`;if(parsed.source==="swarm")return`Error: --source swarm selects the native .swarm/spec.md and does not generate a projection. Use --source openspec or --source speckit.
1926
1934
 
1927
- ${USAGE7}`;if(!parsed.dryRun){let nativeSpecPath=path152.join(directory,SWARM_SPEC_REL2);if(fs78.existsSync(nativeSpecPath)){if(!parsed.overwrite)return["Error: .swarm/spec.md already exists.","Pass --overwrite to replace it.","",USAGE7].join(`
1935
+ ${USAGE8}`;if(!parsed.dryRun){let nativeSpecPath=path152.join(directory,SWARM_SPEC_REL2);if(fs78.existsSync(nativeSpecPath)){if(!parsed.overwrite)return["Error: .swarm/spec.md already exists.","Pass --overwrite to replace it.","",USAGE8].join(`
1928
1936
  `)}}let useSpeckit=!1;if(parsed.source==="speckit")useSpeckit=!0;else if(!parsed.source){let speckitDetection=detectSpeckit(directory);if(speckitDetection.features.length>0){if(buildOpenSpecProjectionSync(directory)!==null)return["Error: Multiple SDD sources detected (openspec, speckit).","Pass --source openspec or --source speckit to select a provider."].join(`
1929
1937
  `);useSpeckit=!0}else if(speckitDetection.markerPresent){if(buildOpenSpecProjectionSync(directory)===null){let resolution=resolveSpeckitProjection(directory);return`Error: ${formatSpeckitError(resolution)}
1930
1938
 
1931
- ${USAGE7}`}}}if(useSpeckit){let resolution=resolveSpeckitProjection(directory,{feature:parsed.feature});if(resolution.kind!=="ok")return`Error: ${formatSpeckitError(resolution)}
1939
+ ${USAGE8}`}}}if(useSpeckit){let resolution=resolveSpeckitProjection(directory,{feature:parsed.feature});if(resolution.kind!=="ok")return`Error: ${formatSpeckitError(resolution)}
1932
1940
 
1933
- ${USAGE7}`;let result2=_internals101.writeProjectedSpecSync(directory,{source:"speckit",feature:resolution.feature,dryRun:parsed.dryRun,overwrite:parsed.overwrite});if(result2.error){if(parsed.json)return JSON.stringify({written:!1,dryRun:parsed.dryRun,path:result2.path,error:result2.error},null,2);return`Error: ${result2.error}
1941
+ ${USAGE8}`;let result2=_internals101.writeProjectedSpecSync(directory,{source:"speckit",feature:resolution.feature,dryRun:parsed.dryRun,overwrite:parsed.overwrite});if(result2.error){if(parsed.json)return JSON.stringify({written:!1,dryRun:parsed.dryRun,path:result2.path,error:result2.error},null,2);return`Error: ${result2.error}
1934
1942
 
1935
- ${USAGE7}`}if(!result2.projection){if(parsed.json)return JSON.stringify({written:!1,dryRun:parsed.dryRun,path:result2.path,error:"no valid Spec-Kit projection could be built"},null,2);return["SDD projection failed: no valid Spec-Kit projection could be built.","",USAGE7].join(`
1943
+ ${USAGE8}`}if(!result2.projection){if(parsed.json)return JSON.stringify({written:!1,dryRun:parsed.dryRun,path:result2.path,error:"no valid Spec-Kit projection could be built"},null,2);return["SDD projection failed: no valid Spec-Kit projection could be built.","",USAGE8].join(`
1936
1944
  `)}let response2={written:result2.written,dryRun:parsed.dryRun,path:result2.path,archivePath:result2.archivePath??null,hash:result2.projection.hash,sourcePaths:result2.projection.sourcePaths,warnings:result2.projection.warnings};if(parsed.json)return JSON.stringify(response2,null,2);return[parsed.dryRun?"SDD projection preview":"SDD projection written",`Path: ${result2.path}`,`Hash: ${result2.projection.hash}`,`Sources: ${result2.projection.sourcePaths.length}`,result2.archivePath?`Archived previous spec: ${result2.archivePath}`:"",result2.projection.warnings.length>0?`
1937
1945
  Warnings:
1938
1946
  ${formatList(result2.projection.warnings)}`:""].join(`
1939
1947
  `)}let result=_internals101.writeProjectedSpecSync(directory,{changeId:parsed.changeId,dryRun:parsed.dryRun,overwrite:parsed.overwrite});if(result.error){if(parsed.json)return JSON.stringify({written:!1,dryRun:parsed.dryRun,path:result.path,error:result.error},null,2);return`Error: ${result.error}
1940
1948
 
1941
- ${USAGE7}`}if(!result.projection){if(parsed.json)return JSON.stringify({written:!1,dryRun:parsed.dryRun,path:result.path,error:"no valid OpenSpec-compatible projection could be built"},null,2);return["SDD projection failed: no valid OpenSpec-compatible projection could be built.","",USAGE7].join(`
1949
+ ${USAGE8}`}if(!result.projection){if(parsed.json)return JSON.stringify({written:!1,dryRun:parsed.dryRun,path:result.path,error:"no valid OpenSpec-compatible projection could be built"},null,2);return["SDD projection failed: no valid OpenSpec-compatible projection could be built.","",USAGE8].join(`
1942
1950
  `)}let response={written:result.written,dryRun:parsed.dryRun,path:result.path,archivePath:result.archivePath??null,hash:result.projection.hash,sourcePaths:result.projection.sourcePaths,warnings:result.projection.warnings};if(parsed.json)return JSON.stringify(response,null,2);return[parsed.dryRun?"SDD projection preview":"SDD projection written",`Path: ${result.path}`,`Hash: ${result.projection.hash}`,`Sources: ${result.projection.sourcePaths.length}`,result.archivePath?`Archived previous spec: ${result.archivePath}`:"",result.projection.warnings.length>0?`
1943
1951
  Warnings:
1944
1952
  ${formatList(result.projection.warnings)}`:""].join(`
1945
- `)}async function handleSddCommand(_directory,_args){return USAGE7}var _internals101,SWARM_SPEC_REL2,USAGE7=`Usage:
1953
+ `)}async function handleSddCommand(_directory,_args){return USAGE8}var _internals101,SWARM_SPEC_REL2,USAGE8=`Usage:
1946
1954
  /swarm sdd status [--json] [--source <provider>]
1947
1955
  /swarm sdd validate [--json] [--change <id>] [--source <provider>] [--feature <id>]
1948
1956
  /swarm sdd project [--dry-run] [--overwrite] [--json] [--change <id>] [--source <provider>] [--feature <id>]
@@ -2060,7 +2068,7 @@ Showing full help:
2060
2068
 
2061
2069
  Showing full help:
2062
2070
 
2063
- `+fullHelp()}async function handleModeCommandWithBundledSkills(ctx,handler,mechanicalMode){if(ctx.packageRoot)await syncBundledProjectSkillsIfMissingAsync(ctx.directory,ctx.packageRoot,!0);let result=await Promise.resolve(handler(ctx.directory,ctx.args));if(/^\s*\[MODE:\s*[A-Z][A-Z0-9_-]*\b/.test(result)){if(mechanicalMode)await activatePrWorkflow(ctx.directory,ctx.sessionID,mechanicalMode)}return result}function validateAliases(){let errors5=[],warnings=[];for(let[name,entry]of Object.entries(COMMAND_REGISTRY)){let cmdEntry=entry;if(cmdEntry.aliasOf){let target=cmdEntry.aliasOf;if(!Object.hasOwn(COMMAND_REGISTRY,target)){errors5.push(`Alias '${name}' points to non-existent command '${target}'`);continue}let visited=new Set,path159=[],current=target;while(current){let currentEntry=COMMAND_REGISTRY[current];if(!currentEntry)break;if(visited.has(current)){let cycleStart=path159.indexOf(current),fullChain=[name,...path159.slice(0,cycleStart>0?cycleStart:path159.length),current].join(" → ");errors5.push(`Circular alias detected: ${fullChain}`);break}visited.add(current),path159.push(current),current=currentEntry.aliasOf||""}}}return{valid:errors5.length===0,errors:errors5,warnings}}function validateToolPolicy(){let warnings=[];for(let[name,entry]of Object.entries(COMMAND_REGISTRY)){let cmdEntry=entry;if(cmdEntry.aliasOf||cmdEntry.subcommandOf)continue;if(cmdEntry.toolPolicy===void 0)warnings.push(`Command '${name}' has no toolPolicy field — it will not be available through the swarm_command tool. Add toolPolicy: 'agent' | 'human-only' | 'restricted' | 'none'.`)}return{valid:warnings.length===0,warnings}}function resolveCommand(tokens){if(tokens.length===0)return null;if(tokens.length>=2){let compound=`${tokens[0]} ${tokens[1]}`;if(Object.hasOwn(COMMAND_REGISTRY,compound)){let entry=COMMAND_REGISTRY[compound],warning=entry.deprecated?`⚠️ "/swarm ${compound}" is deprecated. Use "/swarm ${entry.aliasOf}" instead.`:void 0;return{entry,remainingArgs:tokens.slice(2),key:compound,warning}}}let key=tokens[0];if(Object.hasOwn(COMMAND_REGISTRY,key)){let entry=COMMAND_REGISTRY[key],warning=entry.deprecated?`⚠️ "/swarm ${key}" is deprecated. Use "/swarm ${entry.aliasOf}" instead.`:void 0;return{entry,remainingArgs:tokens.slice(1),key,warning}}return null}var COMMAND_REGISTRY,VALID_COMMANDS,_internals27,validation;var init_registry2=__esm(()=>{init_bundled_skills();init_pr_workflow_gate();init_logger();init_acknowledge_spec_drift();init_agents();init_archive();init_auto_proceed();init_benchmark();init_checkpoint2();init_ci_monitor();init_ci_simulate();init_close();init_codebase_review();init_concurrency();init_config3();init_consolidate();init_costs();init_council();init_coupling();init_curate();init_dark_matter();init_deep_dive();init_deep_research();init_design_docs();init_diagnose();init_doctor();init_epic();init_evidence();init_export();init_full_auto();init_gate_audit2();init_gate_stats2();init_handoff();init_history();init_issue();init_knowledge();init_lanes();init_learning();init_link();init_loop();init_memory2();init_memory_link2();init_plan();init_post_mortem();init_pr_feedback();init_pr_monitor_status();init_pr_review();init_pr_subscribe();init_pr_unsubscribe();init_preflight();init_promote();init_qa_gates();init_reset();init_reset_session();init_retrieve();init_rollback();init_sdd();init_simulate();init_status();init_sync_plan();init_turbo();init_unlink();init_write_retro2();COMMAND_REGISTRY={"acknowledge-spec-drift":{handler:(ctx)=>handleAcknowledgeSpecDriftCommand(ctx.directory,ctx.args,ctx.source==="cli"?"cli":ctx.source==="chat"?"user":"unknown"),description:"Acknowledge that the spec has drifted from the plan and suppress further warnings",args:"",category:"diagnostics",toolPolicy:"restricted"},status:{handler:(ctx)=>handleStatusCommand(ctx.directory,ctx.agents),description:"Show current swarm state",category:"core",clashesWithNativeCcCommand:"/status",toolPolicy:"agent",toolNoArgs:!0},"show-plan":{handler:(ctx)=>handlePlanCommand(ctx.directory,ctx.args),description:"Show current plan (optionally filter by phase number)",category:"core",args:"[phase-number]",toolPolicy:"agent"},plan:{handler:(ctx)=>handlePlanCommand(ctx.directory,ctx.args),description:"Show current plan (deprecated alias for /swarm show-plan)",category:"core",clashesWithNativeCcCommand:"/plan",aliasOf:"show-plan",deprecated:!0},agents:{handler:(ctx)=>Promise.resolve(handleAgentsCommand(ctx.agents,void 0)),description:"List registered agents",category:"core",clashesWithNativeCcCommand:"/agents",toolPolicy:"agent",toolNoArgs:!0},help:{handler:(ctx)=>_internals27.handleHelpCommand(ctx),description:"Show help for swarm commands",category:"core",args:"[command]",details:"Without argument, shows full command listing. With argument, shows detailed help for a specific command.",toolPolicy:"agent"},history:{handler:(ctx)=>handleHistoryCommand(ctx.directory,ctx.args),description:"Show completed phases summary",category:"utility",clashesWithNativeCcCommand:"/history",toolPolicy:"agent",toolNoArgs:!0},config:{handler:(ctx)=>handleConfigCommand(ctx.directory,ctx.args),description:"Show current resolved configuration",category:"config",clashesWithNativeCcCommand:"/config",toolPolicy:"agent",toolNoArgs:!0},"config doctor":{handler:(ctx)=>handleDoctorCommand(ctx.directory,ctx.args),description:"Run config doctor checks",subcommandOf:"config",category:"diagnostics",toolPolicy:"agent",toolNoArgs:!0},"config-doctor":{handler:(ctx)=>handleDoctorCommand(ctx.directory,ctx.args),description:"Run config doctor checks",subcommandOf:"config",category:"diagnostics",aliasOf:"config doctor",deprecated:!0},"doctor tools":{handler:(ctx)=>handleDoctorToolsCommand(ctx.directory,ctx.args),description:"Run tool registration coherence check",category:"diagnostics",toolPolicy:"agent",toolNoArgs:!0},"doctor-tools":{handler:(ctx)=>handleDoctorToolsCommand(ctx.directory,ctx.args),description:"Run tool registration coherence check",category:"diagnostics",aliasOf:"doctor tools",deprecated:!0},diagnose:{handler:(ctx)=>handleDiagnoseCommand(ctx.directory,ctx.args),description:"Run health check on swarm state",category:"diagnostics",toolPolicy:"agent",toolNoArgs:!0},diagnosis:{handler:(ctx)=>handleDiagnoseCommand(ctx.directory,ctx.args),description:"Run health check on swarm state",category:"diagnostics",aliasOf:"diagnose",deprecated:!0},"guardrail explain":{handler:async(ctx)=>{let{handleGuardrailExplain:handleGuardrailExplain2}=await Promise.resolve().then(() => (init_guardrail_explain(),exports_guardrail_explain));return handleGuardrailExplain2(ctx.directory,ctx.args)},description:"Dry-run: show what the guardrails would do to a command or write target (executes nothing)",category:"diagnostics",toolPolicy:"agent",toolNoArgs:!1},"guardrail-explain":{handler:async(ctx)=>{let{handleGuardrailExplain:handleGuardrailExplain2}=await Promise.resolve().then(() => (init_guardrail_explain(),exports_guardrail_explain));return handleGuardrailExplain2(ctx.directory,ctx.args)},description:"Dry-run: show what the guardrails would do to a command or write target (executes nothing)",category:"diagnostics",aliasOf:"guardrail explain",deprecated:!0},"guardrail-log":{handler:async(ctx)=>{let{handleGuardrailLog:handleGuardrailLog2}=await Promise.resolve().then(() => (init_guardrail_log(),exports_guardrail_log));return handleGuardrailLog2(ctx.directory,ctx.args)},description:"Read the guardrail decision log (use --blocks-only for blocks)",category:"diagnostics",toolPolicy:"agent",toolNoArgs:!1},preflight:{handler:(ctx)=>handlePreflightCommand(ctx.directory,ctx.args),description:"Run preflight automation checks",category:"diagnostics",toolPolicy:"agent",toolNoArgs:!0},lanes:{handler:(ctx)=>Promise.resolve(handleLanesCommand(ctx.directory,ctx.args)),description:"List active, awaiting-merge, and conflicted worktree lanes",category:"diagnostics",toolPolicy:"agent",toolNoArgs:!0},"sync-plan":{handler:(ctx)=>handleSyncPlanCommand(ctx.directory,ctx.args),description:"Ensure plan.json and plan.md are synced",args:"",category:"config",toolPolicy:"agent",toolNoArgs:!0},benchmark:{handler:(ctx)=>handleBenchmarkCommand(ctx.directory,ctx.args),description:"Show performance metrics [--cumulative] [--ci-gate] [--max-cost-usd <n>] [--gate-audit-run <id>]",args:"--cumulative, --ci-gate, --max-cost-usd <n>, --gate-audit-run <id>",category:"diagnostics",toolPolicy:"agent"},"gate-audit":{handler:(ctx)=>handleGateAuditCommand(ctx.directory,ctx.args,{packageRoot:ctx.packageRoot,dispatcher:ctx.evaluationModelDispatcher,parentSessionId:ctx.sessionID}),description:"Run the bounded Tier-1 reviewer/test/SAST/mutation/quality gate matrix",args:"--model <id>, --swarm <id>, --gates <csv>, --tasks <csv>, --runs <n>, --max-concurrency <n>, --max-retries <n>, --max-time-ms <n>, --max-cost-usd <n>, --seed <value>, --run-id <id>, --json",details:"Runs immutable curated defects only in disposable copies, records unavailable data honestly, and writes versioned results below .swarm/evidence/gate-audit/. Container tasks are unsupported until a safe array-form runner exists.",category:"diagnostics",toolPolicy:"agent"},"gate-stats":{handler:(ctx)=>handleGateStatsCommand(ctx.directory,ctx.args),description:"Show offline per-model gate catch, false-reject, retry, cost, and reviewer fallback statistics",args:"--json, --min-samples <n>",category:"diagnostics",toolPolicy:"agent"},costs:{handler:(ctx)=>handleCostsCommand(ctx.directory,ctx.args),description:"Show per-agent and per-task token/cost telemetry [--json]",args:"--json",category:"diagnostics",toolPolicy:"agent"},learning:{handler:(ctx)=>handleLearningCommand(ctx.directory,ctx.args),description:"Show learning metrics and violation trends",args:"--json, --phase <N>",details:"Computes aggregate learning metrics from knowledge events: violation-rate trends, directive application rates, escalation frequency, per-entry ROI, and never-applied entries. Surfaces a learning summary for the curator digest.",category:"diagnostics",toolPolicy:"agent"},export:{handler:(ctx)=>handleExportCommand(ctx.directory,ctx.args),description:"Export plan and context as JSON",args:"",details:"Exports the current plan and context as JSON to stdout. Useful for piping to external tools or debugging swarm state.",category:"utility",clashesWithNativeCcCommand:"/export",toolPolicy:"agent",toolNoArgs:!0},evidence:{handler:(ctx)=>handleEvidenceCommand(ctx.directory,ctx.args),description:"Show evidence bundles [taskId]",args:"<taskId>",details:'Displays review results, test verdicts, and other evidence bundles for the given task ID (e.g., "2.1").',category:"utility",toolPolicy:"agent"},"evidence summary":{handler:(ctx)=>handleEvidenceSummaryCommand(ctx.directory),description:"Generate evidence summary with completion ratio and blockers",subcommandOf:"evidence",args:"",details:"Generates a summary showing completion ratio across all tasks, lists blockers, and identifies missing evidence.",category:"utility",toolPolicy:"agent",toolNoArgs:!0},"evidence-summary":{handler:(ctx)=>handleEvidenceSummaryCommand(ctx.directory),description:"Generate evidence summary with completion ratio and blockers",subcommandOf:"evidence",args:"",details:"Generates a summary showing completion ratio across all tasks, lists blockers, and identifies missing evidence.",category:"utility",aliasOf:"evidence summary",deprecated:!0},doctor:{handler:(ctx)=>handleDoctorCommand(ctx.directory,ctx.args),description:"Run config doctor checks",category:"diagnostics",aliasOf:"config doctor",deprecated:!0,clashesWithNativeCcCommand:"/doctor"},info:{handler:(ctx)=>handleStatusCommand(ctx.directory,ctx.agents),description:"Show current swarm state",category:"core",aliasOf:"status",deprecated:!0},"list-agents":{handler:(ctx)=>Promise.resolve(handleAgentsCommand(ctx.agents,void 0)),description:"List registered agents",category:"core",aliasOf:"agents",deprecated:!0},health:{handler:(ctx)=>handleDiagnoseCommand(ctx.directory,ctx.args),description:"Run health check on swarm state",category:"diagnostics",aliasOf:"diagnose",deprecated:!0},check:{handler:(ctx)=>handlePreflightCommand(ctx.directory,ctx.args),description:"Run preflight automation checks",category:"diagnostics",aliasOf:"preflight",deprecated:!0},clear:{handler:(ctx)=>handleResetSessionCommand(ctx.directory,ctx.args),description:"Clear session state while preserving plan, evidence, and knowledge",category:"utility",aliasOf:"reset-session",deprecated:!0},archive:{handler:(ctx)=>handleArchiveCommand(ctx.directory,ctx.args),description:"Archive old evidence bundles [--dry-run]",details:"Archives evidence bundles older than max_age_days (config, default 90) or beyond max_bundles cap (config, default 1000). --dry-run previews which bundles would be archived without deleting them. Applies two-tier retention: age-based first, then count-based on oldest remaining.",args:"--dry-run",category:"utility",toolPolicy:"none"},curate:{handler:(ctx)=>handleCurateCommand(ctx.directory,ctx.args,{sessionID:ctx.sessionID}),description:"Run knowledge curation and hive promotion review",args:"",category:"utility",toolPolicy:"none"},consolidate:{handler:(ctx)=>handleConsolidateCommand(ctx.directory,ctx.args,{sessionID:ctx.sessionID}),description:"Run quota-bounded skill-improver consolidation and stage skill proposals",details:"Runs the same consolidation pass used by scheduled skill_improver trigger points: queue hardening, skill-improver proposal writing, and optional draft-skill generation. It never auto-activates skills. Use --respect-interval to obey the configured cadence instead of forcing a run.",args:"--force, --respect-interval, --evaluate",category:"utility",toolPolicy:"restricted"},coupling:{handler:(ctx)=>handleCouplingCommand(ctx.directory,ctx.args),description:"Measure plan coupling (p) and rank modules driving conflicts (Epic mode preview)",details:"Computes the coupling coefficient p = (conflicting task pairs) / (total task pairs) over the current plan, using Epic mode's combined path + co-change conflict signal. Surfaces per-module contention and a ranked decoupling roadmap. Read-only: runs independent of `turbo.epic.cochange.enabled` so it can be used as a what-if diagnostic before opting into the runtime signal.",args:"--phase <n>, --threshold <-1..1>, --min-co-changes <n>, --format markdown|json, --persist",category:"diagnostics",toolPolicy:"none"},epic:{handler:(ctx)=>handleEpicCommand(ctx.directory,ctx.args,ctx.sessionID),description:"Toggle Epic Mode (autonomous coupling-aware parallel activation) and inspect its decisions",details:"Epic Mode is an additive overlay that composes Lean Turbo. When on, the architect follows the transparent decide-then-dispatch wave flow: declare_scope (per pending task) → epic_decide_phase → epic_plan_waves → for each wave in order, dispatch one Task per taskId in the wave, ALL in one assistant message (each concurrent coder appears as a visible subagent the user can click into) → epic_record_divergence. epic_decide_phase computes the plan-wide coupling coefficient p and gates parallel promotion on p + a hot-module check + a greenfield rule. epic_plan_waves partitions promoted phases into ordered concurrent groups (waves) that respect dependency order and scope disjointness. Subcommands: on, off, status, decide (read-only what-if), last (most recent decision from durable evidence log), calibration (Capability D state: learned threshold + hot modules + recent divergent tasks). Bare /swarm epic shows status. Decision rationale persists to .swarm/evidence/epic-promotions.jsonl after every epic_decide_phase invocation.",args:"on | off | status | decide | last | calibration",category:"diagnostics",toolPolicy:"none"},"dark-matter":{handler:(ctx)=>handleDarkMatterCommand(ctx.directory,ctx.args),description:"Detect hidden file couplings via co-change NPMI analysis",args:"--threshold <number>, --min-commits <number>",category:"diagnostics",toolPolicy:"none"},finalize:{handler:(ctx)=>handleCloseCommand(ctx.directory,ctx.args,{sessionID:ctx.sessionID}),description:"Use /swarm finalize to finalize the swarm project and archive evidence",details:"Idempotent 4-stage terminal finalization: (1) finalize writes retrospectives for in-progress phases, (2) archive creates timestamped bundle of swarm artifacts and evidence, (3) clean removes active-state files for a clean slate, (4) align performs aggressive git reset --hard to the default remote branch, discarding uncommitted changes and gitignored build artifacts (user-created untracked files are preserved); falls back to a cautious reset that preserves uncommitted changes when the aggressive path cannot proceed. WARNING: alignment discards local changes and gitignored files. Resets agent sessions and delegation chains. Reads .swarm/close-lessons.md for explicit lessons and runs curation. Use --skill-review to run the quota-bounded skill_improver in proposal mode. Use --dry-run to preview what finalize would archive, clean, and align without taking the lock or changing anything.",args:"--prune-branches, --skill-review, --dry-run",category:"core",toolPolicy:"none"},close:{handler:(ctx)=>handleCloseCommand(ctx.directory,ctx.args,{sessionID:ctx.sessionID}),description:"Use /swarm close (deprecated alias) to finalize and archive swarm state",details:"Deprecated alias for /swarm finalize. Preserved for backward compatibility. Supports the same flags, including --dry-run.",args:"--prune-branches, --skill-review, --dry-run",category:"core",aliasOf:"finalize",deprecated:!0},"post-mortem":{handler:(ctx)=>handlePostMortemCommand(ctx.directory,ctx.args,{sessionID:ctx.sessionID}),description:"Run the post-mortem agent: project-end synthesis, queue triage, and final curation pass",details:"Reads .swarm/ evidence (knowledge entries, events, curator digests, proposals, retrospectives, drift reports) and produces a post-mortem report at .swarm/post-mortem-{planId}.md. Idempotent: re-runs skip if report exists unless --force is passed. Use --scope session to limit knowledge event aggregation to the current session; project scope is the default.",args:"--force, --scope session|project",category:"core",toolPolicy:"agent"},concurrency:{handler:(ctx)=>handleConcurrencyCommand(ctx.directory,ctx.args,ctx.sessionID),description:"Manage runtime concurrency override for plan execution [set|status|reset]",args:"set <N|preset>, status, reset",details:`Sets, queries, or clears a session-scoped concurrency override for max_concurrent_tasks during plan execution.
2071
+ `+fullHelp()}async function handleModeCommandWithBundledSkills(ctx,handler,mechanicalMode){if(ctx.packageRoot)await syncBundledProjectSkillsIfMissingAsync(ctx.directory,ctx.packageRoot,!0);let result=await Promise.resolve(handler(ctx.directory,ctx.args));if(/^\s*\[MODE:\s*[A-Z][A-Z0-9_-]*\b/.test(result)){if(mechanicalMode)await activatePrWorkflow(ctx.directory,ctx.sessionID,mechanicalMode)}return result}function validateAliases(){let errors5=[],warnings=[];for(let[name,entry]of Object.entries(COMMAND_REGISTRY)){let cmdEntry=entry;if(cmdEntry.aliasOf){let target=cmdEntry.aliasOf;if(!Object.hasOwn(COMMAND_REGISTRY,target)){errors5.push(`Alias '${name}' points to non-existent command '${target}'`);continue}let visited=new Set,path159=[],current=target;while(current){let currentEntry=COMMAND_REGISTRY[current];if(!currentEntry)break;if(visited.has(current)){let cycleStart=path159.indexOf(current),fullChain=[name,...path159.slice(0,cycleStart>0?cycleStart:path159.length),current].join(" → ");errors5.push(`Circular alias detected: ${fullChain}`);break}visited.add(current),path159.push(current),current=currentEntry.aliasOf||""}}}return{valid:errors5.length===0,errors:errors5,warnings}}function validateToolPolicy(){let warnings=[];for(let[name,entry]of Object.entries(COMMAND_REGISTRY)){let cmdEntry=entry;if(cmdEntry.aliasOf||cmdEntry.subcommandOf)continue;if(cmdEntry.toolPolicy===void 0)warnings.push(`Command '${name}' has no toolPolicy field — it will not be available through the swarm_command tool. Add toolPolicy: 'agent' | 'human-only' | 'restricted' | 'none'.`)}return{valid:warnings.length===0,warnings}}function resolveCommand(tokens){if(tokens.length===0)return null;if(tokens.length>=2){let compound=`${tokens[0]} ${tokens[1]}`;if(Object.hasOwn(COMMAND_REGISTRY,compound)){let entry=COMMAND_REGISTRY[compound],warning=entry.deprecated?`⚠️ "/swarm ${compound}" is deprecated. Use "/swarm ${entry.aliasOf}" instead.`:void 0;return{entry,remainingArgs:tokens.slice(2),key:compound,warning}}}let key=tokens[0];if(Object.hasOwn(COMMAND_REGISTRY,key)){let entry=COMMAND_REGISTRY[key],warning=entry.deprecated?`⚠️ "/swarm ${key}" is deprecated. Use "/swarm ${entry.aliasOf}" instead.`:void 0;return{entry,remainingArgs:tokens.slice(1),key,warning}}return null}var COMMAND_REGISTRY,VALID_COMMANDS,_internals27,validation;var init_registry2=__esm(()=>{init_bundled_skills();init_pr_workflow_gate();init_logger();init_abort_pr_workflow();init_acknowledge_spec_drift();init_agents();init_archive();init_auto_proceed();init_benchmark();init_checkpoint2();init_ci_monitor();init_ci_simulate();init_close();init_codebase_review();init_concurrency();init_config3();init_consolidate();init_costs();init_council();init_coupling();init_curate();init_dark_matter();init_deep_dive();init_deep_research();init_design_docs();init_diagnose();init_doctor();init_epic();init_evidence();init_export();init_full_auto();init_gate_audit2();init_gate_stats2();init_handoff();init_history();init_issue();init_knowledge();init_lanes();init_learning();init_link();init_loop();init_memory2();init_memory_link2();init_plan();init_post_mortem();init_pr_feedback();init_pr_monitor_status();init_pr_review();init_pr_subscribe();init_pr_unsubscribe();init_preflight();init_promote();init_qa_gates();init_reset();init_reset_session();init_retrieve();init_rollback();init_sdd();init_simulate();init_status();init_sync_plan();init_turbo();init_unlink();init_write_retro2();COMMAND_REGISTRY={"acknowledge-spec-drift":{handler:(ctx)=>handleAcknowledgeSpecDriftCommand(ctx.directory,ctx.args,ctx.source==="cli"?"cli":ctx.source==="chat"?"user":"unknown"),description:"Acknowledge that the spec has drifted from the plan and suppress further warnings",args:"",category:"diagnostics",toolPolicy:"restricted"},status:{handler:(ctx)=>handleStatusCommand(ctx.directory,ctx.agents),description:"Show current swarm state",category:"core",clashesWithNativeCcCommand:"/status",toolPolicy:"agent",toolNoArgs:!0},"show-plan":{handler:(ctx)=>handlePlanCommand(ctx.directory,ctx.args),description:"Show current plan (optionally filter by phase number)",category:"core",args:"[phase-number]",toolPolicy:"agent"},plan:{handler:(ctx)=>handlePlanCommand(ctx.directory,ctx.args),description:"Show current plan (deprecated alias for /swarm show-plan)",category:"core",clashesWithNativeCcCommand:"/plan",aliasOf:"show-plan",deprecated:!0},agents:{handler:(ctx)=>Promise.resolve(handleAgentsCommand(ctx.agents,void 0)),description:"List registered agents",category:"core",clashesWithNativeCcCommand:"/agents",toolPolicy:"agent",toolNoArgs:!0},help:{handler:(ctx)=>_internals27.handleHelpCommand(ctx),description:"Show help for swarm commands",category:"core",args:"[command]",details:"Without argument, shows full command listing. With argument, shows detailed help for a specific command.",toolPolicy:"agent"},history:{handler:(ctx)=>handleHistoryCommand(ctx.directory,ctx.args),description:"Show completed phases summary",category:"utility",clashesWithNativeCcCommand:"/history",toolPolicy:"agent",toolNoArgs:!0},config:{handler:(ctx)=>handleConfigCommand(ctx.directory,ctx.args),description:"Show current resolved configuration",category:"config",clashesWithNativeCcCommand:"/config",toolPolicy:"agent",toolNoArgs:!0},"config doctor":{handler:(ctx)=>handleDoctorCommand(ctx.directory,ctx.args),description:"Run config doctor checks",subcommandOf:"config",category:"diagnostics",toolPolicy:"agent",toolNoArgs:!0},"config-doctor":{handler:(ctx)=>handleDoctorCommand(ctx.directory,ctx.args),description:"Run config doctor checks",subcommandOf:"config",category:"diagnostics",aliasOf:"config doctor",deprecated:!0},"doctor tools":{handler:(ctx)=>handleDoctorToolsCommand(ctx.directory,ctx.args),description:"Run tool registration coherence check",category:"diagnostics",toolPolicy:"agent",toolNoArgs:!0},"doctor-tools":{handler:(ctx)=>handleDoctorToolsCommand(ctx.directory,ctx.args),description:"Run tool registration coherence check",category:"diagnostics",aliasOf:"doctor tools",deprecated:!0},diagnose:{handler:(ctx)=>handleDiagnoseCommand(ctx.directory,ctx.args),description:"Run health check on swarm state",category:"diagnostics",toolPolicy:"agent",toolNoArgs:!0},diagnosis:{handler:(ctx)=>handleDiagnoseCommand(ctx.directory,ctx.args),description:"Run health check on swarm state",category:"diagnostics",aliasOf:"diagnose",deprecated:!0},"guardrail explain":{handler:async(ctx)=>{let{handleGuardrailExplain:handleGuardrailExplain2}=await Promise.resolve().then(() => (init_guardrail_explain(),exports_guardrail_explain));return handleGuardrailExplain2(ctx.directory,ctx.args)},description:"Dry-run: show what the guardrails would do to a command or write target (executes nothing)",category:"diagnostics",toolPolicy:"agent",toolNoArgs:!1},"guardrail-explain":{handler:async(ctx)=>{let{handleGuardrailExplain:handleGuardrailExplain2}=await Promise.resolve().then(() => (init_guardrail_explain(),exports_guardrail_explain));return handleGuardrailExplain2(ctx.directory,ctx.args)},description:"Dry-run: show what the guardrails would do to a command or write target (executes nothing)",category:"diagnostics",aliasOf:"guardrail explain",deprecated:!0},"guardrail-log":{handler:async(ctx)=>{let{handleGuardrailLog:handleGuardrailLog2}=await Promise.resolve().then(() => (init_guardrail_log(),exports_guardrail_log));return handleGuardrailLog2(ctx.directory,ctx.args)},description:"Read the guardrail decision log (use --blocks-only for blocks)",category:"diagnostics",toolPolicy:"agent",toolNoArgs:!1},preflight:{handler:(ctx)=>handlePreflightCommand(ctx.directory,ctx.args),description:"Run preflight automation checks",category:"diagnostics",toolPolicy:"agent",toolNoArgs:!0},lanes:{handler:(ctx)=>Promise.resolve(handleLanesCommand(ctx.directory,ctx.args)),description:"List active, awaiting-merge, and conflicted worktree lanes",category:"diagnostics",toolPolicy:"agent",toolNoArgs:!0},"sync-plan":{handler:(ctx)=>handleSyncPlanCommand(ctx.directory,ctx.args),description:"Ensure plan.json and plan.md are synced",args:"",category:"config",toolPolicy:"agent",toolNoArgs:!0},benchmark:{handler:(ctx)=>handleBenchmarkCommand(ctx.directory,ctx.args),description:"Show performance metrics [--cumulative] [--ci-gate] [--max-cost-usd <n>] [--gate-audit-run <id>]",args:"--cumulative, --ci-gate, --max-cost-usd <n>, --gate-audit-run <id>",category:"diagnostics",toolPolicy:"agent"},"gate-audit":{handler:(ctx)=>handleGateAuditCommand(ctx.directory,ctx.args,{packageRoot:ctx.packageRoot,dispatcher:ctx.evaluationModelDispatcher,parentSessionId:ctx.sessionID}),description:"Run the bounded Tier-1 reviewer/test/SAST/mutation/quality gate matrix",args:"--model <id>, --swarm <id>, --gates <csv>, --tasks <csv>, --runs <n>, --max-concurrency <n>, --max-retries <n>, --max-time-ms <n>, --max-cost-usd <n>, --seed <value>, --run-id <id>, --json",details:"Runs immutable curated defects only in disposable copies, records unavailable data honestly, and writes versioned results below .swarm/evidence/gate-audit/. Container tasks are unsupported until a safe array-form runner exists.",category:"diagnostics",toolPolicy:"agent"},"gate-stats":{handler:(ctx)=>handleGateStatsCommand(ctx.directory,ctx.args),description:"Show offline per-model gate catch, false-reject, retry, cost, and reviewer fallback statistics",args:"--json, --min-samples <n>",category:"diagnostics",toolPolicy:"agent"},costs:{handler:(ctx)=>handleCostsCommand(ctx.directory,ctx.args),description:"Show per-agent and per-task token/cost telemetry [--json]",args:"--json",category:"diagnostics",toolPolicy:"agent"},learning:{handler:(ctx)=>handleLearningCommand(ctx.directory,ctx.args),description:"Show learning metrics and violation trends",args:"--json, --phase <N>",details:"Computes aggregate learning metrics from knowledge events: violation-rate trends, directive application rates, escalation frequency, per-entry ROI, and never-applied entries. Surfaces a learning summary for the curator digest.",category:"diagnostics",toolPolicy:"agent"},export:{handler:(ctx)=>handleExportCommand(ctx.directory,ctx.args),description:"Export plan and context as JSON",args:"",details:"Exports the current plan and context as JSON to stdout. Useful for piping to external tools or debugging swarm state.",category:"utility",clashesWithNativeCcCommand:"/export",toolPolicy:"agent",toolNoArgs:!0},evidence:{handler:(ctx)=>handleEvidenceCommand(ctx.directory,ctx.args),description:"Show evidence bundles [taskId]",args:"<taskId>",details:'Displays review results, test verdicts, and other evidence bundles for the given task ID (e.g., "2.1").',category:"utility",toolPolicy:"agent"},"evidence summary":{handler:(ctx)=>handleEvidenceSummaryCommand(ctx.directory),description:"Generate evidence summary with completion ratio and blockers",subcommandOf:"evidence",args:"",details:"Generates a summary showing completion ratio across all tasks, lists blockers, and identifies missing evidence.",category:"utility",toolPolicy:"agent",toolNoArgs:!0},"evidence-summary":{handler:(ctx)=>handleEvidenceSummaryCommand(ctx.directory),description:"Generate evidence summary with completion ratio and blockers",subcommandOf:"evidence",args:"",details:"Generates a summary showing completion ratio across all tasks, lists blockers, and identifies missing evidence.",category:"utility",aliasOf:"evidence summary",deprecated:!0},doctor:{handler:(ctx)=>handleDoctorCommand(ctx.directory,ctx.args),description:"Run config doctor checks",category:"diagnostics",aliasOf:"config doctor",deprecated:!0,clashesWithNativeCcCommand:"/doctor"},info:{handler:(ctx)=>handleStatusCommand(ctx.directory,ctx.agents),description:"Show current swarm state",category:"core",aliasOf:"status",deprecated:!0},"list-agents":{handler:(ctx)=>Promise.resolve(handleAgentsCommand(ctx.agents,void 0)),description:"List registered agents",category:"core",aliasOf:"agents",deprecated:!0},health:{handler:(ctx)=>handleDiagnoseCommand(ctx.directory,ctx.args),description:"Run health check on swarm state",category:"diagnostics",aliasOf:"diagnose",deprecated:!0},check:{handler:(ctx)=>handlePreflightCommand(ctx.directory,ctx.args),description:"Run preflight automation checks",category:"diagnostics",aliasOf:"preflight",deprecated:!0},clear:{handler:(ctx)=>handleResetSessionCommand(ctx.directory,ctx.args),description:"Clear session state while preserving plan, evidence, and knowledge",category:"utility",aliasOf:"reset-session",deprecated:!0},archive:{handler:(ctx)=>handleArchiveCommand(ctx.directory,ctx.args),description:"Archive old evidence bundles [--dry-run]",details:"Archives evidence bundles older than max_age_days (config, default 90) or beyond max_bundles cap (config, default 1000). --dry-run previews which bundles would be archived without deleting them. Applies two-tier retention: age-based first, then count-based on oldest remaining.",args:"--dry-run",category:"utility",toolPolicy:"none"},curate:{handler:(ctx)=>handleCurateCommand(ctx.directory,ctx.args,{sessionID:ctx.sessionID}),description:"Run knowledge curation and hive promotion review",args:"",category:"utility",toolPolicy:"none"},consolidate:{handler:(ctx)=>handleConsolidateCommand(ctx.directory,ctx.args,{sessionID:ctx.sessionID}),description:"Run quota-bounded skill-improver consolidation and stage skill proposals",details:"Runs the same consolidation pass used by scheduled skill_improver trigger points: queue hardening, skill-improver proposal writing, and optional draft-skill generation. It never auto-activates skills. Use --respect-interval to obey the configured cadence instead of forcing a run.",args:"--force, --respect-interval, --evaluate",category:"utility",toolPolicy:"restricted"},coupling:{handler:(ctx)=>handleCouplingCommand(ctx.directory,ctx.args),description:"Measure plan coupling (p) and rank modules driving conflicts (Epic mode preview)",details:"Computes the coupling coefficient p = (conflicting task pairs) / (total task pairs) over the current plan, using Epic mode's combined path + co-change conflict signal. Surfaces per-module contention and a ranked decoupling roadmap. Read-only: runs independent of `turbo.epic.cochange.enabled` so it can be used as a what-if diagnostic before opting into the runtime signal.",args:"--phase <n>, --threshold <-1..1>, --min-co-changes <n>, --format markdown|json, --persist",category:"diagnostics",toolPolicy:"none"},epic:{handler:(ctx)=>handleEpicCommand(ctx.directory,ctx.args,ctx.sessionID),description:"Toggle Epic Mode (autonomous coupling-aware parallel activation) and inspect its decisions",details:"Epic Mode is an additive overlay that composes Lean Turbo. When on, the architect follows the transparent decide-then-dispatch wave flow: declare_scope (per pending task) → epic_decide_phase → epic_plan_waves → for each wave in order, dispatch one Task per taskId in the wave, ALL in one assistant message (each concurrent coder appears as a visible subagent the user can click into) → epic_record_divergence. epic_decide_phase computes the plan-wide coupling coefficient p and gates parallel promotion on p + a hot-module check + a greenfield rule. epic_plan_waves partitions promoted phases into ordered concurrent groups (waves) that respect dependency order and scope disjointness. Subcommands: on, off, status, decide (read-only what-if), last (most recent decision from durable evidence log), calibration (Capability D state: learned threshold + hot modules + recent divergent tasks). Bare /swarm epic shows status. Decision rationale persists to .swarm/evidence/epic-promotions.jsonl after every epic_decide_phase invocation.",args:"on | off | status | decide | last | calibration",category:"diagnostics",toolPolicy:"none"},"dark-matter":{handler:(ctx)=>handleDarkMatterCommand(ctx.directory,ctx.args),description:"Detect hidden file couplings via co-change NPMI analysis",args:"--threshold <number>, --min-commits <number>",category:"diagnostics",toolPolicy:"none"},finalize:{handler:(ctx)=>handleCloseCommand(ctx.directory,ctx.args,{sessionID:ctx.sessionID}),description:"Use /swarm finalize to finalize the swarm project and archive evidence",details:"Idempotent 4-stage terminal finalization: (1) finalize writes retrospectives for in-progress phases, (2) archive creates timestamped bundle of swarm artifacts and evidence, (3) clean removes active-state files for a clean slate, (4) align performs aggressive git reset --hard to the default remote branch, discarding uncommitted changes and gitignored build artifacts (user-created untracked files are preserved); falls back to a cautious reset that preserves uncommitted changes when the aggressive path cannot proceed. WARNING: alignment discards local changes and gitignored files. Resets agent sessions and delegation chains. Reads .swarm/close-lessons.md for explicit lessons and runs curation. Use --skill-review to run the quota-bounded skill_improver in proposal mode. Use --dry-run to preview what finalize would archive, clean, and align without taking the lock or changing anything.",args:"--prune-branches, --skill-review, --dry-run",category:"core",toolPolicy:"none"},close:{handler:(ctx)=>handleCloseCommand(ctx.directory,ctx.args,{sessionID:ctx.sessionID}),description:"Use /swarm close (deprecated alias) to finalize and archive swarm state",details:"Deprecated alias for /swarm finalize. Preserved for backward compatibility. Supports the same flags, including --dry-run.",args:"--prune-branches, --skill-review, --dry-run",category:"core",aliasOf:"finalize",deprecated:!0},"post-mortem":{handler:(ctx)=>handlePostMortemCommand(ctx.directory,ctx.args,{sessionID:ctx.sessionID}),description:"Run the post-mortem agent: project-end synthesis, queue triage, and final curation pass",details:"Reads .swarm/ evidence (knowledge entries, events, curator digests, proposals, retrospectives, drift reports) and produces a post-mortem report at .swarm/post-mortem-{planId}.md. Idempotent: re-runs skip if report exists unless --force is passed. Use --scope session to limit knowledge event aggregation to the current session; project scope is the default.",args:"--force, --scope session|project",category:"core",toolPolicy:"agent"},concurrency:{handler:(ctx)=>handleConcurrencyCommand(ctx.directory,ctx.args,ctx.sessionID),description:"Manage runtime concurrency override for plan execution [set|status|reset]",args:"set <N|preset>, status, reset",details:`Sets, queries, or clears a session-scoped concurrency override for max_concurrent_tasks during plan execution.
2064
2072
  When set, the override takes precedence over the plan's locked execution_profile.max_concurrent_tasks.
2065
2073
  `+`The override is session-scoped — it does not modify the plan and is cleared on session reset.
2066
2074
  `+`
@@ -2070,7 +2078,7 @@ Subcommands:
2070
2078
  `+` concurrency status — Show effective concurrency (override, plan baseline, operational effective)
2071
2079
  `+` concurrency reset — Clear the session concurrency override
2072
2080
  `+`
2073
- `+"Session-scoped — resets on new session.",category:"utility",toolPolicy:"none"},simulate:{handler:(ctx)=>handleSimulateCommand(ctx.directory,ctx.args),description:"Dry-run hidden coupling analysis with configurable thresholds",args:"--threshold <number>, --min-commits <number>",category:"diagnostics",toolPolicy:"none"},sdd:{handler:(ctx)=>handleSddCommand(ctx.directory,ctx.args),description:"Manage OpenSpec-compatible SDD artifacts and effective spec projection",args:"status|validate|project [--json] [--change <id>] [--dry-run]",details:"Parent command for spec-driven development artifacts. Use sdd status to inspect .swarm/spec.md plus openspec/ artifacts, sdd validate to validate OpenSpec-compatible deltas, and sdd project to materialize the effective spec into .swarm/spec.md for planning.",category:"utility",toolPolicy:"agent"},"sdd status":{handler:(ctx)=>handleSddStatusCommand(ctx.directory,ctx.args),description:"Show OpenSpec-compatible SDD status and effective spec source",subcommandOf:"sdd",args:"[--json]",category:"utility",toolPolicy:"agent"},"sdd validate":{handler:(ctx)=>handleSddValidateCommand(ctx.directory,ctx.args),description:"Validate OpenSpec-compatible artifacts and effective spec projection",subcommandOf:"sdd",args:"[--json] [--change <id>]",category:"utility",toolPolicy:"agent"},"sdd project":{handler:(ctx)=>handleSddProjectCommand(ctx.directory,ctx.args),description:"Materialize the OpenSpec-compatible effective spec into .swarm/spec.md",subcommandOf:"sdd",args:"[--dry-run] [--overwrite] [--json] [--change <id>]",category:"utility",toolPolicy:"agent"},"sdd-status":{handler:(ctx)=>handleSddStatusCommand(ctx.directory,ctx.args),description:"Show OpenSpec-compatible SDD status and effective spec source",aliasOf:"sdd status",deprecated:!0},"sdd-validate":{handler:(ctx)=>handleSddValidateCommand(ctx.directory,ctx.args),description:"Validate OpenSpec-compatible artifacts and effective spec projection",aliasOf:"sdd validate",deprecated:!0},"sdd-project":{handler:(ctx)=>handleSddProjectCommand(ctx.directory,ctx.args),description:"Materialize the OpenSpec-compatible effective spec into .swarm/spec.md",aliasOf:"sdd project",deprecated:!0},analyze:{handler:(ctx)=>handleAnalyzeCommand(ctx.directory,ctx.args),description:"Analyze spec.md vs plan.md for requirement coverage gaps",args:"",category:"agent",toolPolicy:"none"},clarify:{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handleClarifyCommand),description:"Clarify and refine an existing feature specification",args:"[description-text]",category:"agent",toolPolicy:"none"},specify:{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handleSpecifyCommand),description:"Generate or import a feature specification [description]",args:"[description-text]",category:"agent",toolPolicy:"none"},brainstorm:{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handleBrainstormCommand),description:"Enter architect MODE: BRAINSTORM — structured seven-phase planning workflow [topic]",args:"[topic-text]",details:"Triggers the architect to run the brainstorm workflow: CONTEXT SCAN, single-question DIALOGUE, APPROACHES, DESIGN SECTIONS, SPEC WRITE + SELF-REVIEW, QA GATE SELECTION, TRANSITION. Use for new plans where requirements need to be drawn out before writing spec.md / plan.md.",category:"agent",toolPolicy:"none"},loop:{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handleLoopCommand),description:"Enter architect MODE: LOOP — compound-engineering loop: brainstorm → plan → build → review → improve, iterating until done [objective]",args:"<objective> [--max-cycles 1..5] [--autonomy checkpoint|auto] [--depth standard|exhaustive] [--resume]",details:`Triggers the architect to run the compound-engineering loop defined in ${BUNDLED_PROJECT_SKILL_ROOT}/loop/SKILL.md: BRAINSTORM (requirements) → PLAN (+ critic gate) → BUILD (execute) → REVIEW (independent reviewer + critic on the diff, report-only) → IMPROVE (phase-wrap retrospective + compounding learning capture), then evaluate stop conditions and loop for another improvement cycle if the objective is unmet and budget remains. Generator and reviewer/critic run in separate contexts; failing assertions must be fixed at the root cause, never weakened, mocked, or skipped. Defense-in-depth stop conditions: objective met, --max-cycles budget (default 3), no-progress/plateau, oscillation, unrecoverable error, or explicit user stop. --autonomy auto (default) runs unattended with hard stops still enforced; --autonomy checkpoint pauses at phase gates for user approval. --depth exhaustive widens exploration. --resume continues an existing loop run from durable .swarm/loop/ state. Distinct from full-auto (autonomous cross-phase oversight) and turbo (parallel lanes within a phase): loop is a user-initiated, gated, compounding workflow.`,category:"agent",toolPolicy:"none"},council:{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handleCouncilCommand),description:"Enter architect MODE: COUNCIL — multi-model deliberation [question] [--spec-review]",args:"<question> [--spec-review]",details:"Triggers the architect to convene a three-agent General Council: Generalist (reviewer model), Skeptic (critic model), and Domain Expert (SME model). "+"The architect first runs 1–3 targeted web searches and passes a compiled RESEARCH CONTEXT "+"to all three agents before dispatching them in parallel. Agents deliberate using the NSED peer-review protocol (Round 1 independent analysis, Round 2 MAINTAIN/CONCEDE/NUANCE for disagreements). The architect synthesizes the final answer directly from convene_general_council output. --spec-review switches to single-pass advisory mode for spec review. Requires council.general.enabled: true and a search API key in the resolved config: global ~/.config/opencode/opencode-swarm.json, then project .opencode/opencode-swarm.json overrides.",category:"agent",toolPolicy:"none"},"pr-review":{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handlePrReviewCommand,"PR_REVIEW"),description:"Launch deep PR review with multi-lane analysis [url] [--council]",args:"<pr-url|owner/repo#N|N> [--council]",details:"Launches a structured PR review: reconstructs PR intent via obligation extraction cascade, launches all 6 fixed base explorer lanes through dispatch_lanes_async while the architect keeps doing non-dependent work, polls collect_lane_results incrementally, runs all 11 mandatory repository-agnostic micro-lanes without applicability waivers, validates findings through independent reviewer confirmation, applies critic challenge to HIGH/CRITICAL findings, then synthesizes only after coverage is closed. Failed obligations retry through the same structured async mode and exact PR head; blocking or direct-Task dispatch is not provenance-equivalent, so unclosed coverage leaves the review BLOCKED rather than degraded. --council variant fires adversarial multi-model review. Supports full GitHub URL, owner/repo#N shorthand, or bare PR number (resolves against origin remote).",category:"agent",toolPolicy:"none"},"pr-feedback":{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handlePrFeedbackCommand,"PR_FEEDBACK"),description:"Ingest and close known PR feedback (review comments, CI failures, conflicts) [pr] [instructions]",args:"[url|owner/repo#N|N] [instructions...]",details:"Triggers MODE: PR_FEEDBACK — ingests existing pull-request feedback (review threads, requested changes, CI/check failures, merge conflicts, stale branch state, pasted notes), verifies every claim against source, clusters related problems, fixes confirmed items, validates the branch, and reports closure status for every ledger item. Distinct from /swarm pr-review, which discovers new findings. The PR reference is optional: with none, the architect builds the ledger from the current PR/branch; text after the reference is forwarded as extra instructions. Supports full GitHub URL, owner/repo#N shorthand, or bare PR number (resolved against origin).",category:"agent",toolPolicy:"none"},"ci-monitor":{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handleCiMonitorCommand),description:"Drive an already-reviewed, approved PR to green and merged (monitor CI, fix, merge) [pr]",args:"<pr-url|owner/repo#N|N>",details:"Triggers MODE: CI_MONITOR — takes an already human-reviewed, approved PR, exhaustively researches every CI failure, fixes it end-to-end, iterates until all required checks are green (max 5 fix cycles), then merges via `gh pr merge` with no merge-strategy flag. Invoke only after human review is complete; the skill re-verifies reviewDecision: APPROVED and mergeable state before doing anything destructive. Distinct from /swarm pr-subscribe, which passively watches a PR without a merge terminal. Supports full GitHub URL, owner/repo#N shorthand, or bare PR number (resolved against origin).",category:"agent",toolPolicy:"none"},"pr subscribe":{handler:(ctx)=>handlePrSubscribeCommand(ctx.directory,ctx.args,ctx.sessionID),description:"Subscribe the current session to PR state-change notifications",args:"<pr-url|owner/repo#N|N>",details:'Subscribes the current session to PR state-change events for the specified PR. When pr_monitor.enabled is true, the background polling worker detects CI failures, new comments, review state changes (changes requested / approved), merge conflicts and conflict resolutions, and merge/close events — each gated by its pr_monitor notify_* config flag (notify_ci_success defaults to false). Delivery follows pr_monitor.event_delivery: "prompt" (default) wakes the subscribed session with a structured <pr-activity> message; "advisory" queues session-scoped advisories with dedup tokens for the next turn. Subscriptions are idempotent, capped by pr_monitor.max_subscriptions, and agent-callable. Supports full GitHub URL, owner/repo#N shorthand, or bare PR number (resolved against origin). Requires pr_monitor.enabled: true in config.',category:"agent",toolPolicy:"agent"},"pr-subscribe":{handler:(ctx)=>handlePrSubscribeCommand(ctx.directory,ctx.args,ctx.sessionID),description:"Subscribe the current session to PR state-change notifications",aliasOf:"pr subscribe",deprecated:!0},"pr unsubscribe":{handler:(ctx)=>handlePrUnsubscribeCommand(ctx.directory,ctx.args,ctx.sessionID),description:"Unsubscribe the current session from PR state-change notifications",args:"<pr-url|owner/repo#N|N>",details:"Unsubscribes the current session from PR state-change events for the specified PR. Removes the active subscription record (idempotent; agent-callable). Supports full GitHub URL, owner/repo#N shorthand, or bare PR number (resolved against origin).",category:"agent",toolPolicy:"agent"},"pr-unsubscribe":{handler:(ctx)=>handlePrUnsubscribeCommand(ctx.directory,ctx.args,ctx.sessionID),description:"Unsubscribe the current session from PR state-change notifications",aliasOf:"pr unsubscribe",deprecated:!0},"pr status":{handler:(ctx)=>handlePrMonitorStatusCommand(ctx.directory,ctx.args,ctx.sessionID,ctx.source),description:"Show PR monitor subscription status for the current session",args:"",details:"Displays all active PR subscriptions for the current session. Shows PR URL, last checked time, watching status, and error count per subscription. Also shows total active subscriptions across all sessions.",category:"agent",toolPolicy:"agent",toolNoArgs:!0},"pr-status":{handler:(ctx)=>handlePrMonitorStatusCommand(ctx.directory,ctx.args,ctx.sessionID,ctx.source),description:"Show PR monitor subscription status for the current session",aliasOf:"pr status",deprecated:!0},"ci-simulate":{handler:(ctx)=>handleCiSimulateCommand(ctx.directory,ctx.args),description:"Create a temporary merge-result worktree and run CI before merge queue entry",args:"[--base origin/main] [--head <ref>]",details:"Creates a detached temporary worktree under .swarm/ci-simulate from the base ref, merges the current worktree HEAD (or --head ref), runs fixed local CI gates (typecheck, Biome CI, build, unit/integration/security/smoke tests, drift check), then removes the worktree and prunes metadata. Intended as a pre-queue merge_group simulation helper.",category:"agent",toolPolicy:"agent"},"deep-dive":{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handleDeepDiveCommand),description:"Launch deep codebase audit with parallel explorer waves, dual reviewers, and critic challenge [scope]",args:"<scope> [--profile standard|security|ux|architecture|full] [--max-explorers 1..8] [--json] [--skip-update] [--allow-dirty]",details:"Runs a read-only deep audit of the specified scope using parallel explorer waves (8-file cap per mission, ~3500 line guardrail), always 2 parallel reviewers for verification, and sequential critic challenge on HIGH/CRITICAL findings. Profiles select explorer lanes: standard (5 lanes), security, ux, architecture, full (all 8 lanes). Emits a structured findings report without mutating source code.",category:"agent",toolPolicy:"none"},"deep dive":{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handleDeepDiveCommand),description:"Alias for /swarm deep-dive — launch deep codebase audit",args:"<scope> [--profile standard|security|ux|architecture|full] [--max-explorers 1..8] [--json] [--skip-update] [--allow-dirty]",category:"agent",aliasOf:"deep-dive"},"deep-research":{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handleDeepResearchCommand),description:"Launch a multi-source, fact-checked deep research pass and synthesize a cited report [question]",args:"<question> [--depth standard|exhaustive] [--max-researchers 1..6] [--rounds 1..4] [--brief]",details:"Runs the orchestrator-worker deep-research protocol: the architect decomposes the question into subtopics, gathers evidence with web_search and web_fetch across up to N iterative rounds, dispatches parallel sme synthesis workers, verifies every claim against cited sources with dual reviewers, challenges high-stakes claims with the critic, and presents a cited report in chat. Read-only — does not mutate source code, delegate to coder, or call declare_scope. Requires council.general.enabled and a search API key.",category:"agent",toolPolicy:"none"},"deep research":{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handleDeepResearchCommand),description:"Alias for /swarm deep-research — launch a cited deep research pass",args:"<question> [--depth standard|exhaustive] [--max-researchers 1..6] [--rounds 1..4] [--brief]",category:"agent",aliasOf:"deep-research"},"codebase-review":{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handleCodebaseReviewCommand),description:"Launch codebase-review-swarm for a quote-grounded full-repo or large-subsystem audit",args:"[scope] [--mode phase0|complete|defect|security|correctness|testing|ui|performance|ai-slop|enhancements|custom] [--tracks <list>] [--continue <run-id>] [--json] [--skip-update] [--allow-dirty]",details:"Runs the codebase-review-swarm workflow: Phase 0 inventory, selected-track depth planning, non-diluting review passes, coverage closure, reviewer validation, critic challenge, and .swarm/review-v8 artifacts. Materializes the bundled skill package if missing, then emits a MODE signal; the architect workflow must not mutate source files.",category:"agent",toolPolicy:"none"},"codebase review":{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handleCodebaseReviewCommand),description:"Alias for /swarm codebase-review - launch codebase-review-swarm",args:"[scope] [--mode phase0|complete|defect|security|correctness|testing|ui|performance|ai-slop|enhancements|custom] [--tracks <list>] [--continue <run-id>] [--json] [--skip-update] [--allow-dirty]",category:"agent",aliasOf:"codebase-review"},"design-docs":{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handleDesignDocsCommand),description:"Generate or sync language-agnostic design docs (domain, technical-spec, behavior-spec, reference/) for the project under build [description]",args:"<description> [--out <dir>] [--lang <name>] [--update]",details:"Triggers the architect to enter MODE: DESIGN_DOCS — delegates to the docs_design agent to author/sync docs/domain.md, docs/technical-spec.md, docs/behavior-spec.md, and docs/reference/* (plus reference/traceability.json and design-changelog.md). Normative docs are 100% language-agnostic; all framework-specific material is quarantined under reference/. --update syncs existing docs to current code/spec instead of generating fresh. Requires design_docs.enabled: true.",category:"agent",toolPolicy:"none"},"design docs":{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handleDesignDocsCommand),description:"Alias for /swarm design-docs — generate or sync design docs",args:"<description> [--out <dir>] [--lang <name>] [--update]",category:"agent",aliasOf:"design-docs"},issue:{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handleIssueCommand),description:"Ingest a GitHub issue into the swarm workflow [url] [--plan] [--trace] [--no-repro]",args:"<issue-url|owner/repo#N|N> [--plan] [--trace] [--no-repro]",details:"Triggers the architect to enter MODE: ISSUE_INGEST — ingests a GitHub issue, restructures it into a normalized intake note, localizes root cause through hypothesis-driven tracing, and outputs a resolution spec. --plan transitions to plan creation after spec generation. --trace runs the fix workflow end-to-end (implies --plan); compose commit-pr to publish. --no-repro skips the reproduction step. Supports full GitHub URL, owner/repo#N shorthand, or bare issue number (resolves against origin remote).",category:"agent",toolPolicy:"none"},"qa-gates":{handler:(ctx)=>handleQaGatesCommand(ctx.directory,ctx.args,ctx.sessionID),description:"View or modify QA gate profile for the current plan [enable|override <gate>...]",args:"[show|enable|override] <gate>...",details:"show: display spec-level, session-override, and effective QA gates for the current plan. enable: persist gate(s) into the locked-once profile (architect; rejected after critic approval lock). override: session-only ratchet-tighter enable. Valid gates: reviewer, test_engineer, council_mode, sme_enabled, critic_pre_plan, hallucination_guard, sast_enabled, mutation_test, phase_council, drift_check, final_council.",category:"config",toolPolicy:"none"},link:{handler:(ctx)=>handleLinkCommand(ctx.directory,ctx.args),description:"Tie this worktree to a shared swarm knowledge store [name]",details:"Links the current worktree to a shared knowledge store so multiple swarms working on the same project (e.g. separate git worktrees) pool their lessons instead of each keeping an isolated .swarm/knowledge.jsonl. With no name, ties all worktrees of the same repo via the project hash; with a name, ties any worktrees/repos that use the same name. Existing local lessons are merged (deduped) into the shared store. Use `/swarm link status` to inspect.",args:"[<name> | status]",category:"utility",toolPolicy:"none"},"link status":{handler:(ctx)=>handleLinkCommand(ctx.directory,["status"]),description:"Show whether this worktree shares knowledge via a link",subcommandOf:"link",category:"utility",toolPolicy:"none"},unlink:{handler:(ctx)=>handleUnlinkCommand(ctx.directory,ctx.args),description:"Stop sharing swarm knowledge for this worktree [--no-copy]",details:"Unlinks the current worktree from its shared knowledge store and returns it to a local .swarm/knowledge.jsonl. By default the shared lessons are copied back into the local store (deduped) so nothing is lost; pass --no-copy to skip the copy-back.",args:"[--no-copy]",category:"utility",toolPolicy:"none"},promote:{handler:(ctx)=>handlePromoteCommand(ctx.directory,ctx.args),description:"Manually promote lesson to hive knowledge (policy-gated; --force --reason overrides with audit)",details:'Promotes a lesson directly to hive knowledge (--category flag sets category) or references an existing swarm lesson by ID (--from-swarm). Promotion runs the one policy evaluator inside a single cross-process transaction (#1847). A policy failure blocks promotion unless --force --reason "<why>" is supplied, which records a durable, audited override. An exact entry id alone is never authorization to bypass policy. Either direct text or --from-swarm ID is required.',args:"--category <category>, --from-swarm <lesson-id>, <lesson-text>",category:"utility",toolPolicy:"none"},reset:{handler:(ctx)=>handleResetCommand(ctx.directory,ctx.args),description:"Clear swarm state files [--confirm]",details:"DELETES plan.md, context.md, and summaries/ directory from .swarm/. Stops background automation and clears in-memory queues. SAFETY: requires --confirm flag — without it, displays a warning and tips to export first. Before deleting, auto-backs up the state it removes to .swarm/reset-backups/<timestamp>/ (newest 5 kept) so it can be restored by copying the files back.",args:"--confirm (required)",category:"utility",clashesWithNativeCcCommand:"/reset",toolPolicy:"restricted"},"reset-session":{handler:(ctx)=>handleResetSessionCommand(ctx.directory,ctx.args),description:"Clear session state while preserving plan, evidence, and knowledge",details:"Deletes only .swarm/session/state.json and any other session files. Clears in-memory agent sessions and delegation chains. Preserves plan, evidence, and knowledge for cross-session continuity. Before deleting, auto-backs up the session files it removes to .swarm/reset-backups/<timestamp>/ (newest 5 kept).",args:"",category:"utility",toolPolicy:"restricted"},rollback:{handler:(ctx)=>handleRollbackCommand(ctx.directory,ctx.args),description:"Restore swarm state or project files to a checkpoint",details:"Restores legacy .swarm/ phase checkpoints from checkpoints/phase-<N> when present. Otherwise restores named git checkpoints from .swarm/checkpoints.json by label or list number. Writes rollback event to events.jsonl. Without an argument, lists available checkpoints.",args:"<phase-number|label|list-number>",category:"utility",toolPolicy:"restricted"},retrieve:{handler:(ctx)=>handleRetrieveCommand(ctx.directory,ctx.args),description:"Retrieve full output from a summary <id>",args:"<summary-id>",details:"Loads the full tool output that was previously summarized (referenced by IDs like S1, S2). Use when you need the complete output instead of the truncated summary.",category:"utility",toolPolicy:"agent"},handoff:{handler:(ctx)=>handleHandoffCommand(ctx.directory,ctx.args,ctx.sessionID),description:"Prepare state for clean model switch (new session)",args:"",details:"Generates handoff.md with full session state snapshot, including plan progress, recent decisions, and agent delegation history. Prepended to the next session prompt for seamless model switches.",category:"core",toolPolicy:"none"},turbo:{handler:(ctx)=>handleTurboCommand(ctx.directory,ctx.args,ctx.sessionID),description:"Toggle Turbo Mode strategy for the active session [on|off|lean|standard|epic|status]",args:"on, off, lean, standard, epic, status",details:`Toggles Turbo Mode for the current session. Supports three strategies:
2081
+ `+"Session-scoped — resets on new session.",category:"utility",toolPolicy:"none"},simulate:{handler:(ctx)=>handleSimulateCommand(ctx.directory,ctx.args),description:"Dry-run hidden coupling analysis with configurable thresholds",args:"--threshold <number>, --min-commits <number>",category:"diagnostics",toolPolicy:"none"},sdd:{handler:(ctx)=>handleSddCommand(ctx.directory,ctx.args),description:"Manage OpenSpec-compatible SDD artifacts and effective spec projection",args:"status|validate|project [--json] [--change <id>] [--dry-run]",details:"Parent command for spec-driven development artifacts. Use sdd status to inspect .swarm/spec.md plus openspec/ artifacts, sdd validate to validate OpenSpec-compatible deltas, and sdd project to materialize the effective spec into .swarm/spec.md for planning.",category:"utility",toolPolicy:"agent"},"sdd status":{handler:(ctx)=>handleSddStatusCommand(ctx.directory,ctx.args),description:"Show OpenSpec-compatible SDD status and effective spec source",subcommandOf:"sdd",args:"[--json]",category:"utility",toolPolicy:"agent"},"sdd validate":{handler:(ctx)=>handleSddValidateCommand(ctx.directory,ctx.args),description:"Validate OpenSpec-compatible artifacts and effective spec projection",subcommandOf:"sdd",args:"[--json] [--change <id>]",category:"utility",toolPolicy:"agent"},"sdd project":{handler:(ctx)=>handleSddProjectCommand(ctx.directory,ctx.args),description:"Materialize the OpenSpec-compatible effective spec into .swarm/spec.md",subcommandOf:"sdd",args:"[--dry-run] [--overwrite] [--json] [--change <id>]",category:"utility",toolPolicy:"agent"},"sdd-status":{handler:(ctx)=>handleSddStatusCommand(ctx.directory,ctx.args),description:"Show OpenSpec-compatible SDD status and effective spec source",aliasOf:"sdd status",deprecated:!0},"sdd-validate":{handler:(ctx)=>handleSddValidateCommand(ctx.directory,ctx.args),description:"Validate OpenSpec-compatible artifacts and effective spec projection",aliasOf:"sdd validate",deprecated:!0},"sdd-project":{handler:(ctx)=>handleSddProjectCommand(ctx.directory,ctx.args),description:"Materialize the OpenSpec-compatible effective spec into .swarm/spec.md",aliasOf:"sdd project",deprecated:!0},analyze:{handler:(ctx)=>handleAnalyzeCommand(ctx.directory,ctx.args),description:"Analyze spec.md vs plan.md for requirement coverage gaps",args:"",category:"agent",toolPolicy:"none"},clarify:{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handleClarifyCommand),description:"Clarify and refine an existing feature specification",args:"[description-text]",category:"agent",toolPolicy:"none"},specify:{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handleSpecifyCommand),description:"Generate or import a feature specification [description]",args:"[description-text]",category:"agent",toolPolicy:"none"},brainstorm:{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handleBrainstormCommand),description:"Enter architect MODE: BRAINSTORM — structured seven-phase planning workflow [topic]",args:"[topic-text]",details:"Triggers the architect to run the brainstorm workflow: CONTEXT SCAN, single-question DIALOGUE, APPROACHES, DESIGN SECTIONS, SPEC WRITE + SELF-REVIEW, QA GATE SELECTION, TRANSITION. Use for new plans where requirements need to be drawn out before writing spec.md / plan.md.",category:"agent",toolPolicy:"none"},loop:{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handleLoopCommand),description:"Enter architect MODE: LOOP — compound-engineering loop: brainstorm → plan → build → review → improve, iterating until done [objective]",args:"<objective> [--max-cycles 1..5] [--autonomy checkpoint|auto] [--depth standard|exhaustive] [--resume]",details:`Triggers the architect to run the compound-engineering loop defined in ${BUNDLED_PROJECT_SKILL_ROOT}/loop/SKILL.md: BRAINSTORM (requirements) → PLAN (+ critic gate) → BUILD (execute) → REVIEW (independent reviewer + critic on the diff, report-only) → IMPROVE (phase-wrap retrospective + compounding learning capture), then evaluate stop conditions and loop for another improvement cycle if the objective is unmet and budget remains. Generator and reviewer/critic run in separate contexts; failing assertions must be fixed at the root cause, never weakened, mocked, or skipped. Defense-in-depth stop conditions: objective met, --max-cycles budget (default 3), no-progress/plateau, oscillation, unrecoverable error, or explicit user stop. --autonomy auto (default) runs unattended with hard stops still enforced; --autonomy checkpoint pauses at phase gates for user approval. --depth exhaustive widens exploration. --resume continues an existing loop run from durable .swarm/loop/ state. Distinct from full-auto (autonomous cross-phase oversight) and turbo (parallel lanes within a phase): loop is a user-initiated, gated, compounding workflow.`,category:"agent",toolPolicy:"none"},council:{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handleCouncilCommand),description:"Enter architect MODE: COUNCIL — multi-model deliberation [question] [--spec-review]",args:"<question> [--spec-review]",details:"Triggers the architect to convene a three-agent General Council: Generalist (reviewer model), Skeptic (critic model), and Domain Expert (SME model). "+"The architect first runs 1–3 targeted web searches and passes a compiled RESEARCH CONTEXT "+"to all three agents before dispatching them in parallel. Agents deliberate using the NSED peer-review protocol (Round 1 independent analysis, Round 2 MAINTAIN/CONCEDE/NUANCE for disagreements). The architect synthesizes the final answer directly from convene_general_council output. --spec-review switches to single-pass advisory mode for spec review. Requires council.general.enabled: true and a search API key in the resolved config: global ~/.config/opencode/opencode-swarm.json, then project .opencode/opencode-swarm.json overrides.",category:"agent",toolPolicy:"none"},"abort-pr-workflow":{handler:(ctx)=>handleAbortPrWorkflowCommand(ctx.directory,ctx.args,ctx.sessionID),description:"Clear a stuck PR_REVIEW/PR_FEEDBACK mechanical gate and stop the auto-resume loop [mode] [reason]",args:"[PR_REVIEW|PR_FEEDBACK] [reason...]",details:"Human-only escape hatch for an unrecoverable PR_REVIEW or PR_FEEDBACK mechanical gate. When the architect cannot reach complete_pr_workflow — 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 — running this clears the durable gate state for the current session and stops the auto-resume loop without depending on the trapped model. The agent itself cannot run this command; it must call the abort_pr_workflow tool (or ask you to run this command). Both paths funnel into the same fail-closed abortPrWorkflow hook, which refuses while the workflow is armed for publication or while PR workflow lanes are still in flight. An audit event is appended to .swarm/events.jsonl.",category:"utility",toolPolicy:"restricted"},"pr-review":{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handlePrReviewCommand,"PR_REVIEW"),description:"Launch deep PR review with multi-lane analysis [url] [--council]",args:"<pr-url|owner/repo#N|N> [--council]",details:"Launches a structured PR review: reconstructs PR intent via obligation extraction cascade, launches all 6 fixed base explorer lanes through dispatch_lanes_async while the architect keeps doing non-dependent work, polls collect_lane_results incrementally, runs all 11 mandatory repository-agnostic micro-lanes without applicability waivers, validates findings through independent reviewer confirmation, applies critic challenge to HIGH/CRITICAL findings, then synthesizes only after coverage is closed. Failed obligations retry through the same structured async mode and exact PR head; blocking or direct-Task dispatch is not provenance-equivalent, so unclosed coverage leaves the review BLOCKED rather than degraded. --council variant fires adversarial multi-model review. Supports full GitHub URL, owner/repo#N shorthand, or bare PR number (resolves against origin remote).",category:"agent",toolPolicy:"none"},"pr-feedback":{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handlePrFeedbackCommand,"PR_FEEDBACK"),description:"Ingest and close known PR feedback (review comments, CI failures, conflicts) [pr] [instructions]",args:"[url|owner/repo#N|N] [instructions...]",details:"Triggers MODE: PR_FEEDBACK — ingests existing pull-request feedback (review threads, requested changes, CI/check failures, merge conflicts, stale branch state, pasted notes), verifies every claim against source, clusters related problems, fixes confirmed items, validates the branch, and reports closure status for every ledger item. Distinct from /swarm pr-review, which discovers new findings. The PR reference is optional: with none, the architect builds the ledger from the current PR/branch; text after the reference is forwarded as extra instructions. Supports full GitHub URL, owner/repo#N shorthand, or bare PR number (resolved against origin).",category:"agent",toolPolicy:"none"},"ci-monitor":{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handleCiMonitorCommand),description:"Drive an already-reviewed, approved PR to green and merged (monitor CI, fix, merge) [pr]",args:"<pr-url|owner/repo#N|N>",details:"Triggers MODE: CI_MONITOR — takes an already human-reviewed, approved PR, exhaustively researches every CI failure, fixes it end-to-end, iterates until all required checks are green (max 5 fix cycles), then merges via `gh pr merge` with no merge-strategy flag. Invoke only after human review is complete; the skill re-verifies reviewDecision: APPROVED and mergeable state before doing anything destructive. Distinct from /swarm pr-subscribe, which passively watches a PR without a merge terminal. Supports full GitHub URL, owner/repo#N shorthand, or bare PR number (resolved against origin).",category:"agent",toolPolicy:"none"},"pr subscribe":{handler:(ctx)=>handlePrSubscribeCommand(ctx.directory,ctx.args,ctx.sessionID),description:"Subscribe the current session to PR state-change notifications",args:"<pr-url|owner/repo#N|N>",details:'Subscribes the current session to PR state-change events for the specified PR. When pr_monitor.enabled is true, the background polling worker detects CI failures, new comments, review state changes (changes requested / approved), merge conflicts and conflict resolutions, and merge/close events — each gated by its pr_monitor notify_* config flag (notify_ci_success defaults to false). Delivery follows pr_monitor.event_delivery: "prompt" (default) wakes the subscribed session with a structured <pr-activity> message; "advisory" queues session-scoped advisories with dedup tokens for the next turn. Subscriptions are idempotent, capped by pr_monitor.max_subscriptions, and agent-callable. Supports full GitHub URL, owner/repo#N shorthand, or bare PR number (resolved against origin). Requires pr_monitor.enabled: true in config.',category:"agent",toolPolicy:"agent"},"pr-subscribe":{handler:(ctx)=>handlePrSubscribeCommand(ctx.directory,ctx.args,ctx.sessionID),description:"Subscribe the current session to PR state-change notifications",aliasOf:"pr subscribe",deprecated:!0},"pr unsubscribe":{handler:(ctx)=>handlePrUnsubscribeCommand(ctx.directory,ctx.args,ctx.sessionID),description:"Unsubscribe the current session from PR state-change notifications",args:"<pr-url|owner/repo#N|N>",details:"Unsubscribes the current session from PR state-change events for the specified PR. Removes the active subscription record (idempotent; agent-callable). Supports full GitHub URL, owner/repo#N shorthand, or bare PR number (resolved against origin).",category:"agent",toolPolicy:"agent"},"pr-unsubscribe":{handler:(ctx)=>handlePrUnsubscribeCommand(ctx.directory,ctx.args,ctx.sessionID),description:"Unsubscribe the current session from PR state-change notifications",aliasOf:"pr unsubscribe",deprecated:!0},"pr status":{handler:(ctx)=>handlePrMonitorStatusCommand(ctx.directory,ctx.args,ctx.sessionID,ctx.source),description:"Show PR monitor subscription status for the current session",args:"",details:"Displays all active PR subscriptions for the current session. Shows PR URL, last checked time, watching status, and error count per subscription. Also shows total active subscriptions across all sessions.",category:"agent",toolPolicy:"agent",toolNoArgs:!0},"pr-status":{handler:(ctx)=>handlePrMonitorStatusCommand(ctx.directory,ctx.args,ctx.sessionID,ctx.source),description:"Show PR monitor subscription status for the current session",aliasOf:"pr status",deprecated:!0},"ci-simulate":{handler:(ctx)=>handleCiSimulateCommand(ctx.directory,ctx.args),description:"Create a temporary merge-result worktree and run CI before merge queue entry",args:"[--base origin/main] [--head <ref>]",details:"Creates a detached temporary worktree under .swarm/ci-simulate from the base ref, merges the current worktree HEAD (or --head ref), runs fixed local CI gates (typecheck, Biome CI, build, unit/integration/security/smoke tests, drift check), then removes the worktree and prunes metadata. Intended as a pre-queue merge_group simulation helper.",category:"agent",toolPolicy:"agent"},"deep-dive":{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handleDeepDiveCommand),description:"Launch deep codebase audit with parallel explorer waves, dual reviewers, and critic challenge [scope]",args:"<scope> [--profile standard|security|ux|architecture|full] [--max-explorers 1..8] [--json] [--skip-update] [--allow-dirty]",details:"Runs a read-only deep audit of the specified scope using parallel explorer waves (8-file cap per mission, ~3500 line guardrail), always 2 parallel reviewers for verification, and sequential critic challenge on HIGH/CRITICAL findings. Profiles select explorer lanes: standard (5 lanes), security, ux, architecture, full (all 8 lanes). Emits a structured findings report without mutating source code.",category:"agent",toolPolicy:"none"},"deep dive":{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handleDeepDiveCommand),description:"Alias for /swarm deep-dive — launch deep codebase audit",args:"<scope> [--profile standard|security|ux|architecture|full] [--max-explorers 1..8] [--json] [--skip-update] [--allow-dirty]",category:"agent",aliasOf:"deep-dive"},"deep-research":{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handleDeepResearchCommand),description:"Launch a multi-source, fact-checked deep research pass and synthesize a cited report [question]",args:"<question> [--depth standard|exhaustive] [--max-researchers 1..6] [--rounds 1..4] [--brief]",details:"Runs the orchestrator-worker deep-research protocol: the architect decomposes the question into subtopics, gathers evidence with web_search and web_fetch across up to N iterative rounds, dispatches parallel sme synthesis workers, verifies every claim against cited sources with dual reviewers, challenges high-stakes claims with the critic, and presents a cited report in chat. Read-only — does not mutate source code, delegate to coder, or call declare_scope. Requires council.general.enabled and a search API key.",category:"agent",toolPolicy:"none"},"deep research":{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handleDeepResearchCommand),description:"Alias for /swarm deep-research — launch a cited deep research pass",args:"<question> [--depth standard|exhaustive] [--max-researchers 1..6] [--rounds 1..4] [--brief]",category:"agent",aliasOf:"deep-research"},"codebase-review":{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handleCodebaseReviewCommand),description:"Launch codebase-review-swarm for a quote-grounded full-repo or large-subsystem audit",args:"[scope] [--mode phase0|complete|defect|security|correctness|testing|ui|performance|ai-slop|enhancements|custom] [--tracks <list>] [--continue <run-id>] [--json] [--skip-update] [--allow-dirty]",details:"Runs the codebase-review-swarm workflow: Phase 0 inventory, selected-track depth planning, non-diluting review passes, coverage closure, reviewer validation, critic challenge, and .swarm/review-v8 artifacts. Materializes the bundled skill package if missing, then emits a MODE signal; the architect workflow must not mutate source files.",category:"agent",toolPolicy:"none"},"codebase review":{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handleCodebaseReviewCommand),description:"Alias for /swarm codebase-review - launch codebase-review-swarm",args:"[scope] [--mode phase0|complete|defect|security|correctness|testing|ui|performance|ai-slop|enhancements|custom] [--tracks <list>] [--continue <run-id>] [--json] [--skip-update] [--allow-dirty]",category:"agent",aliasOf:"codebase-review"},"design-docs":{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handleDesignDocsCommand),description:"Generate or sync language-agnostic design docs (domain, technical-spec, behavior-spec, reference/) for the project under build [description]",args:"<description> [--out <dir>] [--lang <name>] [--update]",details:"Triggers the architect to enter MODE: DESIGN_DOCS — delegates to the docs_design agent to author/sync docs/domain.md, docs/technical-spec.md, docs/behavior-spec.md, and docs/reference/* (plus reference/traceability.json and design-changelog.md). Normative docs are 100% language-agnostic; all framework-specific material is quarantined under reference/. --update syncs existing docs to current code/spec instead of generating fresh. Requires design_docs.enabled: true.",category:"agent",toolPolicy:"none"},"design docs":{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handleDesignDocsCommand),description:"Alias for /swarm design-docs — generate or sync design docs",args:"<description> [--out <dir>] [--lang <name>] [--update]",category:"agent",aliasOf:"design-docs"},issue:{handler:(ctx)=>handleModeCommandWithBundledSkills(ctx,handleIssueCommand),description:"Ingest a GitHub issue into the swarm workflow [url] [--plan] [--trace] [--no-repro]",args:"<issue-url|owner/repo#N|N> [--plan] [--trace] [--no-repro]",details:"Triggers the architect to enter MODE: ISSUE_INGEST — ingests a GitHub issue, restructures it into a normalized intake note, localizes root cause through hypothesis-driven tracing, and outputs a resolution spec. --plan transitions to plan creation after spec generation. --trace runs the fix workflow end-to-end (implies --plan); compose commit-pr to publish. --no-repro skips the reproduction step. Supports full GitHub URL, owner/repo#N shorthand, or bare issue number (resolves against origin remote).",category:"agent",toolPolicy:"none"},"qa-gates":{handler:(ctx)=>handleQaGatesCommand(ctx.directory,ctx.args,ctx.sessionID),description:"View or modify QA gate profile for the current plan [enable|override <gate>...]",args:"[show|enable|override] <gate>...",details:"show: display spec-level, session-override, and effective QA gates for the current plan. enable: persist gate(s) into the locked-once profile (architect; rejected after critic approval lock). override: session-only ratchet-tighter enable. Valid gates: reviewer, test_engineer, council_mode, sme_enabled, critic_pre_plan, hallucination_guard, sast_enabled, mutation_test, phase_council, drift_check, final_council.",category:"config",toolPolicy:"none"},link:{handler:(ctx)=>handleLinkCommand(ctx.directory,ctx.args),description:"Tie this worktree to a shared swarm knowledge store [name]",details:"Links the current worktree to a shared knowledge store so multiple swarms working on the same project (e.g. separate git worktrees) pool their lessons instead of each keeping an isolated .swarm/knowledge.jsonl. With no name, ties all worktrees of the same repo via the project hash; with a name, ties any worktrees/repos that use the same name. Existing local lessons are merged (deduped) into the shared store. Use `/swarm link status` to inspect.",args:"[<name> | status]",category:"utility",toolPolicy:"none"},"link status":{handler:(ctx)=>handleLinkCommand(ctx.directory,["status"]),description:"Show whether this worktree shares knowledge via a link",subcommandOf:"link",category:"utility",toolPolicy:"none"},unlink:{handler:(ctx)=>handleUnlinkCommand(ctx.directory,ctx.args),description:"Stop sharing swarm knowledge for this worktree [--no-copy]",details:"Unlinks the current worktree from its shared knowledge store and returns it to a local .swarm/knowledge.jsonl. By default the shared lessons are copied back into the local store (deduped) so nothing is lost; pass --no-copy to skip the copy-back.",args:"[--no-copy]",category:"utility",toolPolicy:"none"},promote:{handler:(ctx)=>handlePromoteCommand(ctx.directory,ctx.args),description:"Manually promote lesson to hive knowledge (policy-gated; --force --reason overrides with audit)",details:'Promotes a lesson directly to hive knowledge (--category flag sets category) or references an existing swarm lesson by ID (--from-swarm). Promotion runs the one policy evaluator inside a single cross-process transaction (#1847). A policy failure blocks promotion unless --force --reason "<why>" is supplied, which records a durable, audited override. An exact entry id alone is never authorization to bypass policy. Either direct text or --from-swarm ID is required.',args:"--category <category>, --from-swarm <lesson-id>, <lesson-text>",category:"utility",toolPolicy:"none"},reset:{handler:(ctx)=>handleResetCommand(ctx.directory,ctx.args),description:"Clear swarm state files [--confirm]",details:"DELETES plan.md, context.md, and summaries/ directory from .swarm/. Stops background automation and clears in-memory queues. SAFETY: requires --confirm flag — without it, displays a warning and tips to export first. Before deleting, auto-backs up the state it removes to .swarm/reset-backups/<timestamp>/ (newest 5 kept) so it can be restored by copying the files back.",args:"--confirm (required)",category:"utility",clashesWithNativeCcCommand:"/reset",toolPolicy:"restricted"},"reset-session":{handler:(ctx)=>handleResetSessionCommand(ctx.directory,ctx.args),description:"Clear session state while preserving plan, evidence, and knowledge",details:"Deletes only .swarm/session/state.json and any other session files. Clears in-memory agent sessions and delegation chains. Preserves plan, evidence, and knowledge for cross-session continuity. Before deleting, auto-backs up the session files it removes to .swarm/reset-backups/<timestamp>/ (newest 5 kept).",args:"",category:"utility",toolPolicy:"restricted"},rollback:{handler:(ctx)=>handleRollbackCommand(ctx.directory,ctx.args),description:"Restore swarm state or project files to a checkpoint",details:"Restores legacy .swarm/ phase checkpoints from checkpoints/phase-<N> when present. Otherwise restores named git checkpoints from .swarm/checkpoints.json by label or list number. Writes rollback event to events.jsonl. Without an argument, lists available checkpoints.",args:"<phase-number|label|list-number>",category:"utility",toolPolicy:"restricted"},retrieve:{handler:(ctx)=>handleRetrieveCommand(ctx.directory,ctx.args),description:"Retrieve full output from a summary <id>",args:"<summary-id>",details:"Loads the full tool output that was previously summarized (referenced by IDs like S1, S2). Use when you need the complete output instead of the truncated summary.",category:"utility",toolPolicy:"agent"},handoff:{handler:(ctx)=>handleHandoffCommand(ctx.directory,ctx.args,ctx.sessionID),description:"Prepare state for clean model switch (new session)",args:"",details:"Generates handoff.md with full session state snapshot, including plan progress, recent decisions, and agent delegation history. Prepended to the next session prompt for seamless model switches.",category:"core",toolPolicy:"none"},turbo:{handler:(ctx)=>handleTurboCommand(ctx.directory,ctx.args,ctx.sessionID),description:"Toggle Turbo Mode strategy for the active session [on|off|lean|standard|epic|status]",args:"on, off, lean, standard, epic, status",details:`Toggles Turbo Mode for the current session. Supports three strategies:
2074
2082
 
2075
2083
  `+`**Standard turbo** — skips non-critical QA gates for faster iteration.
2076
2084
  `+`**Lean turbo** — parallel lane execution with per-lane reviewer gates and file-lock conflict detection.
@@ -2113,7 +2121,7 @@ automatically — advisory and never blocking.
2113
2121
  4. Act on the verdict: address REJECT/CONCERNS findings before completing the phase.
2114
2122
 
2115
2123
  Do NOT dispatch the supervisor yourself as a reviewer of code — it is summary-only.
2116
- \`write_architecture_supervisor_evidence\` persists only; it does not run the supervisor.`}function buildCouncilWorkflow(council){if(council?.enabled!==!0)return"";return"## COUNCIL WORKFLOW\n\nANTI-CONFUSION: Do NOT confuse the three council modes:\n(1) `council_mode` — per-task full council replacing Stage B.\n(2) `phase_council` — phase-level holistic review at `phase_complete`.\n(3) `final_council` — project-level final review after all phases.\nNone of these use the General Council (3-agent advisory). The General Council is an early workflow option gated by `council.general.enabled`, not a QA gate.\n\n## A. PER-TASK COUNCIL (when `council_mode` is ON)\n\nWhen `council_mode` is enabled in the QA gate profile, Stage B (reviewer + test_engineer) is **replaced** by the full 5-member council (critic, reviewer, sme, test_engineer, explorer) per task. Stage A (`pre_check_batch`) still runs as the pre-review gate.\n\n### PREREQUISITES\n- `declare_council_criteria` must be called for each task before council dispatch.\n\n### MANDATORY SEQUENCE — never skip or reorder\n\n#### STEP 1 — DISPATCH all 5 council members in parallel (task-scoped)\nAfter Stage A passes for a task, in a SINGLE message, dispatch `critic`, `reviewer`, `sme`, `test_engineer`, and `explorer` as parallel Agent tasks. Each member receives task-scoped context:\n- `critic` — task diff + task spec + approved-plan baseline (via `get_approved_plan`) + spec-intent drift analysis\n- `reviewer` — task semantic diff summary + blast radius across changed files\n- `sme` — task domain context + knowledge base entries relevant to the task\n- `test_engineer` — changed test files for the task + coverage delta + known mutation gaps\n- `explorer` — task diff + original task intent + prior slop findings\n (hunts for lazy implementations, hallucinated APIs, cargo-cult patterns,\n spec drift, lazy abstractions)\n\nWait for ALL dispatched agents to return their verdict objects before proceeding.\n\n#### STEP 2 — COLLECT verdicts\nRead each agent's response and extract their `CouncilMemberVerdict` object.\nEach member must return: `agent`, `verdict` (APPROVE|CONCERNS|REJECT),\n`confidence` (0.0–1.0), `findings[]`, `criteriaAssessed[]`, `criteriaUnmet[]`,\n`durationMs`.\n\nDo NOT fabricate, infer, or substitute a verdict. If an agent did not return\na valid verdict object, re-dispatch that agent.\n\n#### STEP 3 — CALL submit_council_verdicts (the per-task tool, NOT submit_phase_council_verdicts)\nONLY after collecting real verdicts from all dispatched agents, call\n`submit_council_verdicts` with the collected verdicts. The per-task council\nverdict replaces the Stage B gate — APPROVE advances the task, REJECT blocks it.\n\n#### STEP 4 — ACT on the verdict\n- **APPROVE**: Task passes. Proceed to the next task.\n If `advisoryFindingsCount > 0`, deliver `unifiedFeedbackMd` as a single\n non-blocking advisory note before proceeding.\n- **CONCERNS with `success: false` + `reason: 'blocking_concerns_unresolved'`**:\n The tool blocked because HIGH/CRITICAL findings from CONCERNS members were\n promoted to `requiredFixes`. No evidence was written. Send `unifiedFeedbackMd`\n to the coder — every `requiredFix` must be resolved. Increment `roundNumber`\n and re-convene council after fixes. This is tool-enforced: you cannot bypass it.\n- **CONCERNS with `success: true`**: Only MEDIUM/LOW advisory findings remain.\n Task passes — surface `unifiedFeedbackMd` as a non-blocking note.\n- **REJECT**: Block task advancement. Send `unifiedFeedbackMd` to the coder\n with the BLOCKING flag. The coder must resolve all `requiredFixes` before\n the council is re-convened. Maximum `council.maxRounds` rounds (default 3).\n If `roundNumber >= maxRounds` and verdict is still REJECT, surface\n `unifiedFeedbackMd` to the user and HALT — do NOT auto-advance.\n\n### ANTI-PATTERNS — per-task council bypass violations\n- ✗ Calling `submit_council_verdicts` without first dispatching all 5 members.\n- ✗ Passing verdicts inferred or fabricated rather than received from dispatched agents.\n- ✗ Claiming \"Council APPROVED\" when `membersAbsent` is non-empty.\n- ✗ Falling back to Stage B (reviewer + test_engineer only) when `council_mode` is ON — the full council replaces Stage B.\n- ✗ Skipping `declare_council_criteria` before dispatching council members.\n- ✗ Using `submit_phase_council_verdicts` for per-task verdicts — use `submit_council_verdicts`.\n\n## B. PHASE COUNCIL (when `phase_council` is ON)\n\nCRITICAL: `submit_phase_council_verdicts` does NOT run council members.\nIt synthesizes verdicts that you must collect BEFORE calling it.\n\nWhen `phase_council` is enabled in the QA gate profile, a phase-level council review is required before calling `phase_complete`. This is additive to whichever per-task mechanism is active — Stage B (reviewer + test_engineer) runs per task by default, or the full 5-member per-task council if `council_mode` is ON.\n\n### WHEN TO RUN PHASE COUNCIL\nAfter ALL tasks in the current phase have been marked `completed` and their\nper-task gates have passed, and BEFORE calling `phase_complete`, convene the\nphase council for a Phase Dossier Assembly — a holistic review of cross-cutting concerns,\nbehavioral cohesion, and the full body of work completed in the phase.\n\n### MANDATORY SEQUENCE — never skip or reorder\n\n#### STEP 1 — DISPATCH all 5 council members in parallel (phase-scoped)\nIn a SINGLE message, dispatch `critic`, `reviewer`, `sme`, `test_engineer`,\nand `explorer` as parallel Agent tasks. Each member receives phase-scoped context:\n- `critic` — full diff for the phase + all task specs + approved-plan baseline (via `get_approved_plan`) + spec-intent drift analysis\n- `reviewer` — phase-wide semantic diff summary + blast radius across all changed files\n- `sme` — phase domain context + knowledge base entries relevant to the phase\n- `test_engineer` — all changed test files for the phase + coverage delta + known mutation gaps\n- `explorer` — full phase diff + original task intents + prior slop findings across all tasks\n (hunts for lazy implementations, hallucinated APIs, cargo-cult patterns,\n spec drift, lazy abstractions introduced anywhere in the phase)\n\nWait for ALL dispatched agents to return their verdict objects before proceeding.\n\n#### STEP 2 — COLLECT verdicts\nRead each agent's response and extract their `CouncilMemberVerdict` object.\nEach member must return: `agent`, `verdict` (APPROVE|CONCERNS|REJECT),\n`confidence` (0.0–1.0), `findings[]`, `criteriaAssessed[]`, `criteriaUnmet[]`,\n`durationMs`.\n\nDo NOT fabricate, infer, or substitute a verdict. If an agent did not return\na valid verdict object, re-dispatch that agent.\n\n#### STEP 3 — CALL submit_phase_council_verdicts\nONLY after collecting real verdicts from all dispatched agents, call\n`submit_phase_council_verdicts` with:\n- `phaseNumber`: the phase number just completed (integer, e.g. `1`)\n- `swarmId`: the swarm identifier (e.g. `\"mega\"`)\n- `phaseSummary`: a 2–4 sentence plain-language summary of what the phase accomplished\n- `verdicts`: the array of collected `CouncilMemberVerdict` objects\n- `roundNumber`: 1-indexed (default 1 on first council call for this phase)\n\nThis writes `.swarm/evidence/{phase}/phase-council.json`, which Gate 5 in\n`phase_complete` will read and validate.\n\n#### STEP 4 — READ the response\nInspect `membersAbsent`. If non-empty, dispatch the missing members and re-collect.\nInspect `overallVerdict`.\n\nIf `success: false` and `reason: 'insufficient_quorum'`:\ndispatch ALL absent members in a single parallel batch, wait for all verdicts,\nand re-call `submit_phase_council_verdicts`.\n\n#### STEP 5 — ACT on the verdict, then call phase_complete\n- **APPROVE**: Call `phase_complete`. Gate 5 will pass.\n If `advisoryFindingsCount > 0`, deliver `unifiedFeedbackMd` as a single\n non-blocking advisory note to the team before proceeding.\n- **CONCERNS with `success: false` + `reason: 'blocking_concerns_unresolved'`**:\n The tool blocked because HIGH/CRITICAL findings from CONCERNS members were\n promoted to `requiredFixes`. No evidence was written. Send `unifiedFeedbackMd`\n to the coder — every `requiredFix` must be resolved. Increment `roundNumber`\n and re-convene council after fixes. This is tool-enforced: you cannot bypass it.\n- **CONCERNS with `success: true`**: Only MEDIUM/LOW advisory findings remain.\n Call `phase_complete` and surface `unifiedFeedbackMd` as a non-blocking note.\n- **REJECT**: Block advancement. Send `unifiedFeedbackMd` to the coder\n with the BLOCKING flag. The coder must resolve all `requiredFixes` before\n the phase council is re-convened. Maximum `council.maxRounds` rounds (default 3).\n If `roundNumber >= maxRounds` and verdict is still REJECT, surface\n `unifiedFeedbackMd` to the user and HALT — do NOT auto-advance.\n\n### ANTI-PATTERNS — phase council bypass violations\n- ✗ Calling `submit_phase_council_verdicts` without first dispatching all 5 members.\n- ✗ Passing verdicts inferred or fabricated rather than received from dispatched agents.\n- ✗ Claiming \"Council APPROVED\" when `membersAbsent` is non-empty.\n- ✗ Skipping per-task gates because phase council will catch issues — per-task gates are mandatory regardless.\n- ✗ Calling `phase_complete` before council evidence has been written (Gate 5 will block you).\n- ✗ Treating a prior phase's council verdict as valid for a new phase.\n- ✗ Incrementing `roundNumber` without re-dispatching members for the new round.\n- ✗ Using `submit_council_verdicts` for phase verdicts — use `submit_phase_council_verdicts`.\n\n### ROUND 2 DELIBERATION\nIf round 1 produces REJECT or CONCERNS requiring re-work, every prior-round\ndissenter must be re-dispatched for round 2 focused on the areas they flagged.\nRound 2 must produce NEW agent responses — never reuse round 1 verdicts.\n\n### Retry protocol\nOn re-submission after REJECT/CONCERNS: council members receive (a) the previous\nsynthesis findings plus (b) the diff of what changed since the last round.\nMembers verify prior findings are resolved without re-reviewing unchanged code.\nThe architect resolves any `unresolvedConflicts` in `unifiedFeedbackMd` BEFORE\nsending it to the coder — the coder never sees contradictory instructions."}function buildYourToolsList(council,memoryEnabled=!1,externalSkillsEnabled=!1,turboEnabled=!1,skillsEnabled=!1){let qaCouncilEnabled=council?.enabled===!0,generalCouncilEnabled=council?.general?.enabled===!0;return`Task (delegation), ${[...[...AGENT_TOOL_MAP.architect??[],...memoryEnabled?MEMORY_AGENT_TOOL_MAP.architect??[]:[],...externalSkillsEnabled?EXTERNAL_SKILL_AGENT_TOOL_MAP.architect??[]:[],...qaCouncilEnabled?COUNCIL_AGENT_TOOL_MAP.architect??[]:[],...generalCouncilEnabled?GENERAL_COUNCIL_AGENT_TOOL_MAP.architect??[]:[],...turboEnabled?TURBO_AGENT_TOOL_MAP.architect??[]:[],...skillsEnabled?SKILL_AGENT_TOOL_MAP.architect??[]:[]]].sort().join(", ")}.`}function buildQaGateSelectionDialogue(modeLabel){return`${modeLabel==="BRAINSTORM"?"Now ask the user which QA gates to enable for this plan — do not select on their behalf.":modeLabel==="SPECIFY"?"Ask the user which QA gates to enable for this plan before suggesting the next step.":"No pending gate selection found in `.swarm/context.md`. Ask the user inline now."}
2124
+ \`write_architecture_supervisor_evidence\` persists only; it does not run the supervisor.`}function buildCouncilWorkflow(council){if(council?.enabled!==!0)return"";return"## COUNCIL WORKFLOW\n\nANTI-CONFUSION: Do NOT confuse the three council modes:\n(1) `council_mode` — per-task full council replacing Stage B.\n(2) `phase_council` — phase-level holistic review at `phase_complete`.\n(3) `final_council` — project-level final review after all phases.\nNone of these use the General Council (3-agent advisory). The General Council is an early workflow option gated by `council.general.enabled`, not a QA gate.\n\n## A. PER-TASK COUNCIL (when `council_mode` is ON)\n\nWhen `council_mode` is enabled in the QA gate profile, Stage B (reviewer + test_engineer) is **replaced** by the full 5-member council (critic, reviewer, sme, test_engineer, explorer) per task. Stage A (`pre_check_batch`) still runs as the pre-review gate.\n\n### PREREQUISITES\n- `declare_council_criteria` must be called for each task before council dispatch.\n\n### MANDATORY SEQUENCE — never skip or reorder\n\n#### STEP 1 — DISPATCH all 5 council members in parallel (task-scoped)\nAfter Stage A passes for a task, in a SINGLE message, dispatch `critic`, `reviewer`, `sme`, `test_engineer`, and `explorer` as parallel Agent tasks. Each member receives task-scoped context:\n- `critic` — task diff + task spec + approved-plan baseline (via `get_approved_plan`) + spec-intent drift analysis\n- `reviewer` — task semantic diff summary + blast radius across changed files\n- `sme` — task domain context + knowledge base entries relevant to the task\n- `test_engineer` — changed test files for the task + coverage delta + known mutation gaps\n- `explorer` — task diff + original task intent + prior slop findings\n (hunts for lazy implementations, hallucinated APIs, cargo-cult patterns,\n spec drift, lazy abstractions)\n→ REQUIRED: the `reviewer` member dispatch MUST include a literal `ACCEPTANCE:` line per ACCEPTANCE FIELD RESOLUTION above (same text as the coder delegation for this task). A missing line is BLOCKED by ACCEPTANCE_FIELD_REQUIRED before that member runs. The other four members are not gated by this rule.\n\nWait for ALL dispatched agents to return their verdict objects before proceeding.\n\n#### STEP 2 — COLLECT verdicts\nRead each agent's response and extract their `CouncilMemberVerdict` object.\nEach member must return: `agent`, `verdict` (APPROVE|CONCERNS|REJECT),\n`confidence` (0.0–1.0), `findings[]`, `criteriaAssessed[]`, `criteriaUnmet[]`,\n`durationMs`.\n\nDo NOT fabricate, infer, or substitute a verdict. If an agent did not return\na valid verdict object, re-dispatch that agent.\n\n#### STEP 3 — CALL submit_council_verdicts (the per-task tool, NOT submit_phase_council_verdicts)\nONLY after collecting real verdicts from all dispatched agents, call\n`submit_council_verdicts` with the collected verdicts. The per-task council\nverdict replaces the Stage B gate — APPROVE advances the task, REJECT blocks it.\n\n#### STEP 4 — ACT on the verdict\n- **APPROVE**: Task passes. Proceed to the next task.\n If `advisoryFindingsCount > 0`, deliver `unifiedFeedbackMd` as a single\n non-blocking advisory note before proceeding.\n- **CONCERNS with `success: false` + `reason: 'blocking_concerns_unresolved'`**:\n The tool blocked because HIGH/CRITICAL findings from CONCERNS members were\n promoted to `requiredFixes`. No evidence was written. Send `unifiedFeedbackMd`\n to the coder — every `requiredFix` must be resolved. Increment `roundNumber`\n and re-convene council after fixes. This is tool-enforced: you cannot bypass it.\n- **CONCERNS with `success: true`**: Only MEDIUM/LOW advisory findings remain.\n Task passes — surface `unifiedFeedbackMd` as a non-blocking note.\n- **REJECT**: Block task advancement. Send `unifiedFeedbackMd` to the coder\n with the BLOCKING flag. The coder must resolve all `requiredFixes` before\n the council is re-convened. Maximum `council.maxRounds` rounds (default 3).\n If `roundNumber >= maxRounds` and verdict is still REJECT, surface\n `unifiedFeedbackMd` to the user and HALT — do NOT auto-advance.\n\n### ANTI-PATTERNS — per-task council bypass violations\n- ✗ Calling `submit_council_verdicts` without first dispatching all 5 members.\n- ✗ Passing verdicts inferred or fabricated rather than received from dispatched agents.\n- ✗ Claiming \"Council APPROVED\" when `membersAbsent` is non-empty.\n- ✗ Falling back to Stage B (reviewer + test_engineer only) when `council_mode` is ON — the full council replaces Stage B.\n- ✗ Skipping `declare_council_criteria` before dispatching council members.\n- ✗ Using `submit_phase_council_verdicts` for per-task verdicts — use `submit_council_verdicts`.\n\n## B. PHASE COUNCIL (when `phase_council` is ON)\n\nCRITICAL: `submit_phase_council_verdicts` does NOT run council members.\nIt synthesizes verdicts that you must collect BEFORE calling it.\n\nWhen `phase_council` is enabled in the QA gate profile, a phase-level council review is required before calling `phase_complete`. This is additive to whichever per-task mechanism is active — Stage B (reviewer + test_engineer) runs per task by default, or the full 5-member per-task council if `council_mode` is ON.\n\n### WHEN TO RUN PHASE COUNCIL\nAfter ALL tasks in the current phase have been marked `completed` and their\nper-task gates have passed, and BEFORE calling `phase_complete`, convene the\nphase council for a Phase Dossier Assembly — a holistic review of cross-cutting concerns,\nbehavioral cohesion, and the full body of work completed in the phase.\n\n### MANDATORY SEQUENCE — never skip or reorder\n\n#### STEP 1 — DISPATCH all 5 council members in parallel (phase-scoped)\nIn a SINGLE message, dispatch `critic`, `reviewer`, `sme`, `test_engineer`,\nand `explorer` as parallel Agent tasks. Each member receives phase-scoped context:\n- `critic` — full diff for the phase + all task specs + approved-plan baseline (via `get_approved_plan`) + spec-intent drift analysis\n- `reviewer` — phase-wide semantic diff summary + blast radius across all changed files\n- `sme` — phase domain context + knowledge base entries relevant to the phase\n- `test_engineer` — all changed test files for the phase + coverage delta + known mutation gaps\n- `explorer` — full phase diff + original task intents + prior slop findings across all tasks\n (hunts for lazy implementations, hallucinated APIs, cargo-cult patterns,\n spec drift, lazy abstractions introduced anywhere in the phase)\n→ REQUIRED: the `reviewer` member dispatch MUST include a literal `ACCEPTANCE:` line per ACCEPTANCE FIELD RESOLUTION above (phase-scoped: concatenate the verbatim FR/SC text for every task in this phase when fr_refs is non-empty, otherwise a one-line phase-derived DONE restatement). A missing line is BLOCKED by ACCEPTANCE_FIELD_REQUIRED before that member runs. The other four members are not gated by this rule.\n\nWait for ALL dispatched agents to return their verdict objects before proceeding.\n\n#### STEP 2 — COLLECT verdicts\nRead each agent's response and extract their `CouncilMemberVerdict` object.\nEach member must return: `agent`, `verdict` (APPROVE|CONCERNS|REJECT),\n`confidence` (0.0–1.0), `findings[]`, `criteriaAssessed[]`, `criteriaUnmet[]`,\n`durationMs`.\n\nDo NOT fabricate, infer, or substitute a verdict. If an agent did not return\na valid verdict object, re-dispatch that agent.\n\n#### STEP 3 — CALL submit_phase_council_verdicts\nONLY after collecting real verdicts from all dispatched agents, call\n`submit_phase_council_verdicts` with:\n- `phaseNumber`: the phase number just completed (integer, e.g. `1`)\n- `swarmId`: the swarm identifier (e.g. `\"mega\"`)\n- `phaseSummary`: a 2–4 sentence plain-language summary of what the phase accomplished\n- `verdicts`: the array of collected `CouncilMemberVerdict` objects\n- `roundNumber`: 1-indexed (default 1 on first council call for this phase)\n\nThis writes `.swarm/evidence/{phase}/phase-council.json`, which Gate 5 in\n`phase_complete` will read and validate.\n\n#### STEP 4 — READ the response\nInspect `membersAbsent`. If non-empty, dispatch the missing members and re-collect.\nInspect `overallVerdict`.\n\nIf `success: false` and `reason: 'insufficient_quorum'`:\ndispatch ALL absent members in a single parallel batch, wait for all verdicts,\nand re-call `submit_phase_council_verdicts`.\n\n#### STEP 5 — ACT on the verdict, then call phase_complete\n- **APPROVE**: Call `phase_complete`. Gate 5 will pass.\n If `advisoryFindingsCount > 0`, deliver `unifiedFeedbackMd` as a single\n non-blocking advisory note to the team before proceeding.\n- **CONCERNS with `success: false` + `reason: 'blocking_concerns_unresolved'`**:\n The tool blocked because HIGH/CRITICAL findings from CONCERNS members were\n promoted to `requiredFixes`. No evidence was written. Send `unifiedFeedbackMd`\n to the coder — every `requiredFix` must be resolved. Increment `roundNumber`\n and re-convene council after fixes. This is tool-enforced: you cannot bypass it.\n- **CONCERNS with `success: true`**: Only MEDIUM/LOW advisory findings remain.\n Call `phase_complete` and surface `unifiedFeedbackMd` as a non-blocking note.\n- **REJECT**: Block advancement. Send `unifiedFeedbackMd` to the coder\n with the BLOCKING flag. The coder must resolve all `requiredFixes` before\n the phase council is re-convened. Maximum `council.maxRounds` rounds (default 3).\n If `roundNumber >= maxRounds` and verdict is still REJECT, surface\n `unifiedFeedbackMd` to the user and HALT — do NOT auto-advance.\n\n### ANTI-PATTERNS — phase council bypass violations\n- ✗ Calling `submit_phase_council_verdicts` without first dispatching all 5 members.\n- ✗ Passing verdicts inferred or fabricated rather than received from dispatched agents.\n- ✗ Claiming \"Council APPROVED\" when `membersAbsent` is non-empty.\n- ✗ Skipping per-task gates because phase council will catch issues — per-task gates are mandatory regardless.\n- ✗ Calling `phase_complete` before council evidence has been written (Gate 5 will block you).\n- ✗ Treating a prior phase's council verdict as valid for a new phase.\n- ✗ Incrementing `roundNumber` without re-dispatching members for the new round.\n- ✗ Using `submit_council_verdicts` for phase verdicts — use `submit_phase_council_verdicts`.\n\n### ROUND 2 DELIBERATION\nIf round 1 produces REJECT or CONCERNS requiring re-work, every prior-round\ndissenter must be re-dispatched for round 2 focused on the areas they flagged.\nRound 2 must produce NEW agent responses — never reuse round 1 verdicts.\n\n### Retry protocol\nOn re-submission after REJECT/CONCERNS: council members receive (a) the previous\nsynthesis findings plus (b) the diff of what changed since the last round.\nMembers verify prior findings are resolved without re-reviewing unchanged code.\nThe architect resolves any `unresolvedConflicts` in `unifiedFeedbackMd` BEFORE\nsending it to the coder — the coder never sees contradictory instructions."}function buildYourToolsList(council,memoryEnabled=!1,externalSkillsEnabled=!1,turboEnabled=!1,skillsEnabled=!1){let qaCouncilEnabled=council?.enabled===!0,generalCouncilEnabled=council?.general?.enabled===!0;return`Task (delegation), ${[...[...AGENT_TOOL_MAP.architect??[],...memoryEnabled?MEMORY_AGENT_TOOL_MAP.architect??[]:[],...externalSkillsEnabled?EXTERNAL_SKILL_AGENT_TOOL_MAP.architect??[]:[],...qaCouncilEnabled?COUNCIL_AGENT_TOOL_MAP.architect??[]:[],...generalCouncilEnabled?GENERAL_COUNCIL_AGENT_TOOL_MAP.architect??[]:[],...turboEnabled?TURBO_AGENT_TOOL_MAP.architect??[]:[],...skillsEnabled?SKILL_AGENT_TOOL_MAP.architect??[]:[]]].sort().join(", ")}.`}function buildQaGateSelectionDialogue(modeLabel){return`${modeLabel==="BRAINSTORM"?"Now ask the user which QA gates to enable for this plan — do not select on their behalf.":modeLabel==="SPECIFY"?"Ask the user which QA gates to enable for this plan before suggesting the next step.":"No pending gate selection found in `.swarm/context.md`. Ask the user inline now."}
2117
2125
 
2118
2126
  Present the eleven gates with their defaults (DEFAULT_QA_GATES) as a single user-facing question. Offer the user a one-shot choice: accept defaults, or customize. The eleven gates are:
2119
2127
  - reviewer (default: ON) — code review of coder output
@@ -2511,7 +2519,12 @@ DELEGATION ENVELOPE FIELDS — include these in every delegation for traceabilit
2511
2519
 
2512
2520
  Before delegating to {{AGENT_PREFIX}}reviewer: call check_gate_status for the current task_id and include the gate results in the GATES field of the reviewer message. Format: GATES: lint=PASS/FAIL, sast_scan=PASS/FAIL, secretscan=PASS/FAIL (use PASS/FAIL/skipped for each gate). If no gates have been run yet, use GATES: none.
2513
2521
 
2514
- ACCEPTANCE FIELD RESOLUTION — before every {{AGENT_PREFIX}}coder (and {{AGENT_PREFIX}}reviewer) delegation, populate that delegation's ACCEPTANCE field like this: (1) read the current task's \`fr_refs\` from the plan; (2) if \`fr_refs\` is non-empty, look up EVERY listed FR-###/SC-### id in the current \`.swarm/spec.md\` and copy each one's full requirement text into ACCEPTANCE VERBATIM — byte-for-byte, no summarizing or paraphrasing, and concatenate all of them when a task maps to more than one; (3) if \`fr_refs\` is empty or absent, populate ACCEPTANCE with a task-derived one-line restatement of what DONE looks like instead (the same pattern as \`acceptanceCriteria\` above). ACCEPTANCE must never be empty — lacking a spec mapping is normal and is not a reason to omit it.
2522
+ ACCEPTANCE FIELD RESOLUTION — REQUIRED on every {{AGENT_PREFIX}}coder and {{AGENT_PREFIX}}reviewer Task dispatch. A dispatch with no ACCEPTANCE: line is BLOCKED by the delegation gate before the agent runs (ACCEPTANCE_FIELD_REQUIRED). Resolve it as:
2523
+ 1. Read the current task's \`fr_refs\` from the plan.
2524
+ 2. If \`fr_refs\` is non-empty: look up EVERY listed FR-###/SC-### id in the current \`.swarm/spec.md\` and copy each one's full requirement text into ACCEPTANCE VERBATIM — byte-for-byte, no summarizing or paraphrasing, and concatenate all of them when a task maps to more than one.
2525
+ 3. When the task has no spec mapping: if \`fr_refs\` is empty or absent, populate ACCEPTANCE with a task-derived one-line restatement of what DONE looks like instead (the same pattern as \`acceptanceCriteria\` above).
2526
+ ACCEPTANCE must never be empty — lacking a spec mapping is normal and is not a reason to omit it.
2527
+ NOTE: the plan-task \`acceptance\` field is a different thing. Writing acceptance on the plan task does NOT satisfy this rule. The delegation prompt needs its own literal \`ACCEPTANCE:\` line.
2515
2528
 
2516
2529
  <!-- BEHAVIORAL_GUIDANCE_START -->
2517
2530
  PARTIAL GATE RATIONALIZATIONS — automated gates ≠ agent review. Running SOME gates is NOT compliance:
@@ -2689,7 +2702,7 @@ FILE: src/auth/login.ts
2689
2702
  INPUT: Validate email format, password >= 8 chars
2690
2703
  OUTPUT: Modified file
2691
2704
  CONSTRAINT: Do not modify other functions
2692
- ACCEPTANCE: [copied verbatim from spec.md, or a task-derived DONE restatement see ACCEPTANCE FIELD RESOLUTION]
2705
+ ACCEPTANCE: FR-007 The login endpoint SHALL reject passwords shorter than 8 characters with HTTP 400 and a localized error message.
2693
2706
  SKILLS: file:.claude/skills/engineering-conventions/SKILL.md
2694
2707
 
2695
2708
  {{AGENT_PREFIX}}reviewer
@@ -2697,11 +2710,13 @@ TASK: Review login validation
2697
2710
  FILE: src/auth/login.ts
2698
2711
  CHECK: [security, correctness, edge-cases]
2699
2712
  GATES: lint=PASS, sast_scan=PASS, secretscan=PASS
2700
- ACCEPTANCE: [copied verbatim from spec.md, or a task-derived DONE restatement see ACCEPTANCE FIELD RESOLUTION; same text as the coder delegation for this task]
2713
+ ACCEPTANCE: FR-007 The login endpoint SHALL reject passwords shorter than 8 characters with HTTP 400 and a localized error message.
2701
2714
  SKILLS_USED_BY_CODER: file:.claude/skills/engineering-conventions/SKILL.md
2702
2715
  OUTPUT: VERDICT + RISK + ISSUES + ACCEPTANCE_SATISFACTION
2703
2716
  SKILLS: file:.claude/skills/engineering-conventions/SKILL.md
2704
2717
 
2718
+ NOTE (ACCEPTANCE examples above): the FR-### form applies when fr_refs is non-empty. When the task has no fr_refs, ACCEPTANCE instead carries a one-line task-derived DONE restatement, e.g. "DONE = login rejects <8-char passwords with HTTP 400; the 6 happy-path tests pass." The reviewer delegation for the same task uses the identical ACCEPTANCE text as the coder delegation.
2719
+
2705
2720
  {{AGENT_PREFIX}}test_engineer
2706
2721
  TASK: Generate and run login validation tests
2707
2722
  FILE: src/auth/login.ts
@@ -3019,6 +3034,7 @@ HARD CONSTRAINTS (apply regardless of skill load success):
3019
3034
  - RUN ALL MICRO-LANES: after the base explorer lanes settle, focus every repository-agnostic row from the exact diff/context pack and launch all 11 micro-lanes with \`mode: "swarm-pr-review:micro"\`, the complete all-\`MATCHED\` \`trigger_evaluation\`, and each trigger ID as \`workflow_lane\`. Keyword or path heuristics cannot waive a row. Missing any micro-lane is a BLOCKED coverage gap, not a speed optimization; split the lanes across bounded \`dispatch_lanes_async\` batches and use the same non-idling incremental collection pattern.
3020
3035
  - RUN HEAD-BOUND VALIDATION: dispatch independent reviewers with \`mode: "swarm-pr-review:reviewer"\` and critics with \`mode: "swarm-pr-review:critic"\`, unique \`workflow_lane\` obligations, role-correct agents, and the same exact \`pr_head_sha\`. Critic dispatch is blocked until all declared reviewer obligations have successful artifacts.
3021
3036
  - COMPLETE EXPLICITLY: after final artifacts and synthesis, call \`complete_pr_workflow\` with \`mode: "PR_REVIEW"\` and the bound \`pr_head_sha\`; never leave the session trapped in a stale workflow gate.
3037
+ - ABORT IF UNRECOVERABLE: if the PR head cannot be fetched/checked out (the working tree stays on the wrong branch), a compound \`git fetch && git checkout\` keeps being rejected as read-only shell syntax (run them as TWO separate standalone commands first), or the merge-base bind is unreachable for any reason, call \`abort_pr_workflow\` with \`mode: "PR_REVIEW"\` and a one-line \`reason\` instead of looping. The tool refuses while PR workflow lanes are in flight (collect their results first). Aborting clears the durable gate and stops the auto-resume loop; the user can also run \`/swarm abort-pr-workflow\`. Do NOT abort as a shortcut to avoid coverage obligations — only when the bind/checkout path is genuinely unreachable.
3022
3038
  - Honor any free-text instructions that follow the closing bracket of the signal as additional reviewer focus, without weakening the validation ladder above.
3023
3039
 
3024
3040
  ### MODE: PR_FEEDBACK
@@ -3039,6 +3055,7 @@ HARD CONSTRAINTS (apply regardless of skill load success):
3039
3055
  - DO NOT PUBLISH EARLY: commits, pushes, PR comments/updates, review-thread mutations, and other remote writes remain blocked until every ordered feedback gate settles positively on the same revision digest.
3040
3056
  - After every local gate passes, create the reviewed commit with one standalone \`git commit\`, then call \`complete_pr_workflow\` once. It requires a clean index/worktree and a non-merge direct child whose sole parent is the immutable intake head before binding that post-commit HEAD and arming publication. Push only with \`git push <bound-remote> <bound-commit>:refs/heads/<bound-branch>\`; the literal bound commit and exact bound branch are required, and force flags, wrappers, aliases, fetch-based local-ref forgery, extra refspecs, \`git -C\`, and other remote writes fail closed. Perform read-only remote checks, then call \`complete_pr_workflow\` a second time with the same immutable verification \`pr_head_sha\`; the second call clears only after both the actual remote ref and its local tracking ref resolve to the exact bound commit. Only then perform any explicitly authorized PR comment/body/thread writes.
3041
3057
  - Patch only confirmed items plus the tests/docs they require; report closure status for every ledger item including disproved ones.
3058
+ - ABORT IF UNRECOVERABLE (pre-armed only): if the PR head cannot be fetched/checked out or the verification bind is unreachable for any reason, call \`abort_pr_workflow\` with \`mode: "PR_FEEDBACK"\` and a one-line \`reason\` instead of looping. The tool refuses while PR workflow lanes are in flight (collect their results first) AND refuses once \`prFeedbackReadyToPublish\` is armed — after arming, you MUST complete the workflow with \`complete_pr_workflow\` (or push the bound commit first); aborting an armed gate would drop the immutable-commit binding and leave a half-published commit. Do NOT abort as a shortcut to skip the mechanical gates — only when the bind/verification path is genuinely unreachable.
3042
3059
  - Do NOT resolve or mark GitHub review threads resolved unless the user explicitly instructs it.
3043
3060
  - Honor any free-text instructions that follow the closing bracket of the signal as additional scope, without dropping any ledger item.
3044
3061
  - Quality is the only metric — there is no speed, efficiency, or time exception; time, tokens, and agent dispatches are irrelevant to correctness
@@ -5956,7 +5973,7 @@ ${untracked.slice(0,100).map((f)=>`- ${f}`).join(`
5956
5973
  `;withEventWriteLock(()=>{fs106.appendFileSync(eventsPath,line,"utf-8")})}catch(err){warn(`[auto-review] event write failed: ${err instanceof Error?err.message:String(err)}`)}}async function runAutoReview(input){let{directory,sessionID,trigger,taskId,phase,config:config3}=input,base={type:"auto_review",timestamp:new Date().toISOString(),session_id:sessionID,trigger,task_id:taskId,phase};try{let diffResult=await _internals121.computeExecutionDiff(directory,config3.max_diff_kb*1024);if(diffResult.status==="clean"){writeAutoReviewEvent(directory,{...base,verdict:"skipped",detail:"clean working tree — nothing to review"});return}if(diffResult.status==="error"){writeAutoReviewEvent(directory,{...base,verdict:"error",detail:`diff collection failed: ${diffResult.reason}`});return}let diff=diffResult.diff,agentName=resolveDefaultReviewerAgent(swarmState.generatedAgentNames),prompt=buildReviewPrompt(trigger,diff,taskId,phase),transcript;try{transcript=await _internals121.dispatchReviewer(directory,prompt,agentName,config3.timeout_ms,sessionID)}catch(err){writeAutoReviewEvent(directory,{...base,verdict:"error",detail:`dispatch failed: ${err instanceof Error?err.message:String(err)}`});return}let parsed=parseReviewerOutput(transcript);if(!parsed){writeAutoReviewEvent(directory,{...base,verdict:"unparseable",detail:"reviewer response had no VERDICT line"}),input.injectAdvisory(sessionID,`[AUTO-REVIEW] Automatic ${trigger} review returned no machine-readable verdict. Treat as UNVERIFIED — inspect the diff or re-dispatch @reviewer before proceeding.`);return}let receipt=parsed.verdict==="approved"?buildApprovedReceipt({agent:"reviewer",sessionId:sessionID,scopeContent:diff,scopeDescription:`auto-review-${trigger}-diff`,checkedAspects:["correctness","security","regressions"],validatedClaims:[`AUTO-REVIEW VERDICT: APPROVED${parsed.risk?` (risk ${parsed.risk})`:""}`],caveats:parsed.issues.map((i)=>i.text)}):buildRejectedReceipt({agent:"reviewer",sessionId:sessionID,scopeContent:diff,scopeDescription:`auto-review-${trigger}-diff`,blockingFindings:parsed.issues.map((i)=>({location:i.location??"unknown",summary:i.text,severity:i.severity})),evidenceReferences:parsed.issues.map((i)=>i.location).filter((loc)=>Boolean(loc)),passConditions:parsed.fixes,summary:`Auto-review REJECTED${parsed.risk?` (risk ${parsed.risk})`:""}`}),receiptPath;try{receiptPath=await persistReviewReceipt(directory,receipt)}catch(err){warn(`[auto-review] receipt persistence failed: ${err instanceof Error?err.message:String(err)}`)}if(writeAutoReviewEvent(directory,{...base,verdict:parsed.verdict,detail:parsed.verdict==="approved"?`approved${parsed.risk?` (risk ${parsed.risk})`:""}`:`rejected with ${parsed.issues.length} issue(s)`,receipt_path:receiptPath}),parsed.verdict==="rejected"){let topIssues=parsed.issues.slice(0,3).map((i)=>` • ${i.text}`).join(`
5957
5974
  `);input.injectAdvisory(sessionID,[`[AUTO-REVIEW] Automatic ${trigger} review REJECTED the current diff${parsed.risk?` (risk ${parsed.risk})`:""}.`,topIssues,parsed.fixes.length>0?`Required fixes: ${parsed.fixes.slice(0,3).join("; ")}`:"","Address the findings (delegate to coder, then re-review) before continuing."].filter(Boolean).join(`
5958
5975
  `))}}catch(err){warn(`[auto-review] run failed: ${err instanceof Error?err.message:String(err)}`)}}function createAutoReviewHook(options){let{config:config3,directory,injectAdvisory}=options;if(!config3.enabled)return{toolAfter:async()=>{}};let wantsTask=config3.trigger==="task_completion"||config3.trigger==="both",wantsPhase=config3.trigger==="phase_boundary"||config3.trigger==="both";return{toolAfter:async(input,output)=>{try{let tool3=(normalizeToolName(input.tool)??input.tool??"").toLowerCase(),sessionID=input.sessionID;if(!sessionID)return;let agentName=swarmState.activeAgent.get(sessionID)??swarmState.agentSessions.get(sessionID)?.agentName??"";if(agentName&&stripKnownSwarmPrefix(agentName)!==ORCHESTRATOR_NAME)return;let args2=output.args??void 0,trigger=null,taskId,phase;if(wantsTask&&tool3==="update_task_status"&&args2?.status==="completed")trigger="task_completion",taskId=typeof args2.task_id==="string"?args2.task_id:void 0;else if(wantsPhase&&tool3==="phase_complete")trigger="phase_boundary",phase=typeof args2?.phase==="number"&&Number.isInteger(args2.phase)?args2.phase:void 0;if(!trigger)return;if(inFlightSessions.has(sessionID))return;let last=lastDispatchBySession.get(sessionID)??0;if(_internals121.now()-last<COOLDOWN_MS)return;inFlightSessions.add(sessionID),lastDispatchBySession.delete(sessionID),lastDispatchBySession.set(sessionID,_internals121.now()),evictCooldownMap(),_internals121.runAutoReview({directory,sessionID,trigger,taskId,phase,config:{timeout_ms:config3.timeout_ms,max_diff_kb:config3.max_diff_kb},injectAdvisory}).finally(()=>{inFlightSessions.delete(sessionID)})}catch(err){warn(`[auto-review] hook error: ${err instanceof Error?err.message:String(err)}`)}}}}var _internals121={computeExecutionDiff,dispatchReviewer,runAutoReview,now:()=>Date.now()};init_utils();init_bun_compat();init_utils2();function normalizePath3(filePath){return filePath.replace(/\\/g,"/")}async function readCoChangeJson(directory){try{let filePath=validateSwarmPath(directory,"co-change.json"),content=await bunFile(filePath).text(),data=JSON.parse(content);if(!data||typeof data.version!=="string"||!Array.isArray(data.entries))return null;let seen=new Set,dedupedEntries=[];for(let entry of data.entries){if(typeof entry.fileA!=="string"||typeof entry.fileB!=="string"||typeof entry.coChangeCount!=="number"||typeof entry.npmi!=="number")continue;let normalizedA=normalizePath3(entry.fileA),normalizedB=normalizePath3(entry.fileB),key=[normalizedA,normalizedB].sort().join("|");if(!seen.has(key))seen.add(key),dedupedEntries.push(entry)}return{...data,entries:dedupedEntries}}catch{return null}}function getCoChangePartnersForFile(entries,filePath){let normalizedTarget=normalizePath3(filePath);return entries.filter((entry)=>{let normalizedA=normalizePath3(entry.fileA),normalizedB=normalizePath3(entry.fileB);return normalizedA===normalizedTarget||normalizedB===normalizedTarget})}function createCoChangeSuggesterHook(directory){return safeHook(async(input,_output)=>{let record3=input,toolName=typeof record3.tool==="string"?record3.tool:"";if(!["write","edit","apply_patch","swarm_apply_patch","patch","create_file"].includes(toolName))return;let toolInput=record3.input,filePath=toolInput?.filePath??toolInput?.file_path??toolInput?.path;if(!filePath)return;let coChangeData=await readCoChangeJson(directory);if(!coChangeData)return;let partners=getCoChangePartnersForFile(coChangeData.entries,filePath);if(partners.length===0)return;let partnerList=partners.slice(0,3).map((e)=>{let normalizedFilePath=normalizePath3(filePath);return`${normalizePath3(e.fileA)===normalizedFilePath?e.fileB:e.fileA} (co-change: ${e.coChangeCount}x, npmi: ${e.npmi.toFixed(2)})`}).join(", ");log(`[CO-CHANGE] Files frequently modified with ${filePath}: ${partnerList}`)})}init_utils();init_bun_compat();init_utils2();function parseDarkMatterGaps(content){let unresolved=[],resolved=[],lines=content.split(`
5959
- `);for(let line of lines){let unresolvedMatch=line.match(/^-\s+\[\s*\]\s*(.+)$/);if(unresolvedMatch){unresolved.push(unresolvedMatch[1].trim());continue}let resolvedMatch=line.match(/^-\s+\[x\]\s*(.+)$/i);if(resolvedMatch)resolved.push(resolvedMatch[1].trim())}return{unresolved,resolved}}async function readDarkMatterMd(directory){let filePath=validateSwarmPath(directory,"dark-matter.md"),file3=bunFile(filePath);try{let content=await file3.text();if(!content||!content.trim())return null;return parseDarkMatterGaps(content)}catch{return null}}function createDarkMatterDetectorHook(directory){let callCount=0;async function hook(_input,_output){if(callCount++,callCount%10!==0)return;let gaps=await readDarkMatterMd(directory);if(!gaps||gaps.unresolved.length===0)return;let count=gaps.unresolved.length;log(`[DARK-MATTER] ${count} unresolved coupling gap(s) in .swarm/dark-matter.md. Run /swarm dark-matter to review.`);let displayGaps=gaps.unresolved.slice(0,3);for(let description of displayGaps)log(` - ${description}`);if(count>3)log(` - ... and ${count-3} more`)}return safeHook(hook)}import{appendFile as appendFile20,mkdir as mkdir44}from"node:fs/promises";import*as path193 from"node:path";init_task_file();init_logger();init_knowledge_link();init_knowledge_store();var import_proper_lockfile12=__toESM(require_proper_lockfile(),1);import{existsSync as existsSync99}from"node:fs";import{appendFile as appendFile18,mkdir as mkdir43,readFile as readFile42}from"node:fs/promises";import*as path192 from"node:path";function resolveApplicationLogPath(directory){return path192.join(resolveKnowledgeStoreDir(directory),"knowledge-application.jsonl")}var MAX_LEGACY_APPLICATION_LOG_ENTRIES=5000,ACK_PATTERN=/KNOWLEDGE_(APPLIED|IGNORED|VIOLATED|N_A)\s*:\s*([0-9a-fA-F-]{8,64})(?:\s+reason\s*=\s*([^\n\r]+?)(?=$|[\n\r]|\s+KNOWLEDGE_))?(?=[^0-9a-fA-F-]|$)/g;function parseAcknowledgments(text){if(!text||typeof text!=="string")return[];let out=[];for(let m of text.matchAll(ACK_PATTERN)){let verb=m[1].toLowerCase(),id=m[2],reason=m[3]?.trim().slice(0,280),result=verb==="applied"?"applied":verb==="ignored"?"ignored":verb==="n_a"?"n_a":"violated";out.push({id,result,reason})}return out}async function appendAudit(directory,record3){let filePath=resolveApplicationLogPath(directory),dirPath=path192.dirname(filePath);await mkdir43(dirPath,{recursive:!0});let release;try{release=await import_proper_lockfile12.default.lock(dirPath,{retries:{retries:50,minTimeout:10,maxTimeout:100},stale:5000}),await appendFile18(filePath,`${JSON.stringify(record3)}
5976
+ `);for(let line of lines){let unresolvedMatch=line.match(/^-\s+\[\s*\]\s*(.+)$/);if(unresolvedMatch){unresolved.push(unresolvedMatch[1].trim());continue}let resolvedMatch=line.match(/^-\s+\[x\]\s*(.+)$/i);if(resolvedMatch)resolved.push(resolvedMatch[1].trim())}return{unresolved,resolved}}async function readDarkMatterMd(directory){let filePath=validateSwarmPath(directory,"dark-matter.md"),file3=bunFile(filePath);try{let content=await file3.text();if(!content||!content.trim())return null;return parseDarkMatterGaps(content)}catch{return null}}function createDarkMatterDetectorHook(directory){let callCount=0;async function hook(_input,_output){if(callCount++,callCount%10!==0)return;let gaps=await readDarkMatterMd(directory);if(!gaps||gaps.unresolved.length===0)return;let count=gaps.unresolved.length;log(`[DARK-MATTER] ${count} unresolved coupling gap(s) in .swarm/dark-matter.md. Run /swarm dark-matter to review.`);let displayGaps=gaps.unresolved.slice(0,3);for(let description of displayGaps)log(` - ${description}`);if(count>3)log(` - ... and ${count-3} more`)}return safeHook(hook)}import{appendFile as appendFile21,mkdir as mkdir44}from"node:fs/promises";import*as path193 from"node:path";init_task_file();init_logger();init_knowledge_link();init_knowledge_store();var import_proper_lockfile12=__toESM(require_proper_lockfile(),1);import{existsSync as existsSync99}from"node:fs";import{appendFile as appendFile19,mkdir as mkdir43,readFile as readFile42}from"node:fs/promises";import*as path192 from"node:path";function resolveApplicationLogPath(directory){return path192.join(resolveKnowledgeStoreDir(directory),"knowledge-application.jsonl")}var MAX_LEGACY_APPLICATION_LOG_ENTRIES=5000,ACK_PATTERN=/KNOWLEDGE_(APPLIED|IGNORED|VIOLATED|N_A)\s*:\s*([0-9a-fA-F-]{8,64})(?:\s+reason\s*=\s*([^\n\r]+?)(?=$|[\n\r]|\s+KNOWLEDGE_))?(?=[^0-9a-fA-F-]|$)/g;function parseAcknowledgments(text){if(!text||typeof text!=="string")return[];let out=[];for(let m of text.matchAll(ACK_PATTERN)){let verb=m[1].toLowerCase(),id=m[2],reason=m[3]?.trim().slice(0,280),result=verb==="applied"?"applied":verb==="ignored"?"ignored":verb==="n_a"?"n_a":"violated";out.push({id,result,reason})}return out}async function appendAudit(directory,record3){let filePath=resolveApplicationLogPath(directory),dirPath=path192.dirname(filePath);await mkdir43(dirPath,{recursive:!0});let release;try{release=await import_proper_lockfile12.default.lock(dirPath,{retries:{retries:50,minTimeout:10,maxTimeout:100},stale:5000}),await appendFile19(filePath,`${JSON.stringify(record3)}
5960
5977
  `,"utf-8");try{let lines=(await readFile42(filePath,"utf-8")).split(`
5961
5978
  `).filter((line)=>line.trim().length>0);if(lines.length>MAX_LEGACY_APPLICATION_LOG_ENTRIES){let trimmed=lines.slice(-MAX_LEGACY_APPLICATION_LOG_ENTRIES);await atomicWriteFile(filePath,`${trimmed.join(`
5962
5979
  `)}
@@ -5984,7 +6001,7 @@ ${freshPreamble}`:`<curator_briefing>${truncatedBriefing}</curator_briefing>`}}c
5984
6001
  `+rejected.slice(-3).map((r)=>` ⚠️ REJECTED PATTERN: "${sanitizeLessonForContext(r.lesson).slice(0,80)}" — ${sanitizeLessonForContext(r.rejection_reason)}`).join(`
5985
6002
  `);if(rejectedBlock.length<=remaining)parts.push(rejectedBlock)}}catch(err){warn(`[knowledge-injector] rejected pattern warnings unavailable: ${err instanceof Error?err.message:String(err)}`)}cachedInjectionText=parts.join(`
5986
6003
 
5987
- `),injectKnowledgeMessage(output,cachedInjectionText);let sessionID=sessionId;if(sessionID){let criticalIds=filteredEntries.filter((e)=>renderedDirectiveIdSet.has(e.id)).filter((e)=>e.directive_priority==="critical"&&isActiveStatus(e.status)).map((e)=>e.id);if(cachedCriticalIds=criticalIds,criticalIds.length>0)setCriticalShownIds(sessionID,{ids:criticalIds,phase:`Phase ${currentPhase}`,generatedAt:Date.now()});else clearCriticalShownIds(sessionID)}if(cachedShownIds.length>0){let phaseLabel=`Phase ${currentPhase}`,scoreById=new Map(filteredEntries.map((e)=>[e.id,e.finalScore])),ranks={},scores={};cachedShownIds.forEach((id,idx)=>{ranks[id]=idx+1,scores[id]=scoreById.get(id)??0}),await _internals123.recordKnowledgeEvent(directory,{type:"retrieved",trace_id:search.trace_id,session_id:sessionId??"unknown",phase:retrievalCtx.currentPhase,task_id:retrievalCtx.taskId,agent:"architect",query:retrievalCtx.lastUserMessage??retrievalCtx.currentPhase??"",retrieval_mode:"auto_injection",result_ids:cachedShownIds,ranks,scores}),_internals123.recordKnowledgeShown(directory,cachedShownIds,{phase:phaseLabel,tool:retrievalCtx.currentTool,action:retrievalCtx.currentAction,targetAgent:retrievalCtx.targetAgent,taskId:retrievalCtx.taskId}).catch(()=>{}),_internals123.recordLessonsShown(directory,cachedShownIds,phaseLabel).catch(()=>{}),_internals123.confirmEntriesPhase(directory,cachedShownIds,currentPhase,projectName).catch(()=>{})}})}var _internals123={searchKnowledge,recordKnowledgeEvent,recordKnowledgeShown,readRecentEscalations,buildEscalationBriefing,recordLessonsShown,confirmEntriesPhase};init_knowledge_link();init_logger();init_knowledge_events();var RECEIPT_VALIDITY_MS=1800000,NO_TRACE_SENTINEL="none",VALID_OUTCOMES=new Set(["applied","ignored","contradicted","violated","n_a"]);async function validateReceipt(ctx){let{items,no_relevant_knowledge}=ctx;if(items.length===0&&!no_relevant_knowledge)return reject("empty_receipt","no items and no_relevant_knowledge is false");for(let item of items)if(!VALID_OUTCOMES.has(item.outcome))return reject("invalid_outcome",`item ${item.id}: outcome ${item.outcome}`);if(no_relevant_knowledge&&items.length>0)return reject("invalid_outcome","no_relevant_knowledge cannot be combined with items");let events;try{events=await readKnowledgeEvents(ctx.directory)}catch(err){return log("[receipt-validator] readKnowledgeEvents failed (fail-open, accepting)",{trace_id:ctx.trace_id,error:err instanceof Error?err.message:String(err)}),{ok:!0,accepted:items,idempotent_skips:[],trace:null,closes_no_relevant:no_relevant_knowledge}}if(ctx.trace_id===NO_TRACE_SENTINEL||ctx.trace_id===""){if(items.length>0)return reject("trace_not_found",`items filed against the ${NO_TRACE_SENTINEL} sentinel trace`);return{ok:!0,accepted:[],idempotent_skips:[],trace:null,closes_no_relevant:no_relevant_knowledge}}let trace=findTrace(events,ctx.trace_id);if(!trace)return reject("trace_not_found",`no retrieved event for trace_id ${ctx.trace_id}`);if(trace.session_id!==ctx.session_id)return reject("wrong_session",`trace session ${trace.session_id} != receipt session ${ctx.session_id}`);let parsed=Date.parse(trace.timestamp),ageMs=Date.now()-parsed;if(!Number.isFinite(parsed)||ageMs>RECEIPT_VALIDITY_MS)return reject("expired",Number.isFinite(parsed)?`trace age ${Math.round(ageMs/1000)}s exceeds ${RECEIPT_VALIDITY_MS/1000}s`:`trace timestamp '${trace.timestamp}' is unparseable (fail-closed)`);let prior=new Map;for(let e of events){if(e.type!=="applied"&&e.type!=="ignored"&&e.type!=="contradicted"&&e.type!=="violated"&&e.type!=="n_a")continue;if(e.trace_id!==ctx.trace_id)continue;let kid=e.knowledge_id;if(!kid)continue;prior.set(kid,e.type)}let resultSet=new Set(trace.result_ids),accepted=[],idempotent_skips=[],rejected_items=[];for(let item of items){if(!resultSet.has(item.id)){rejected_items.push({item,reason:"id_not_in_trace"});continue}let prev=prior.get(item.id);if(prev===item.outcome){idempotent_skips.push(item);continue}if(prev!==void 0&&prev!==item.outcome){rejected_items.push({item,reason:"duplicate_conflicting_terminal"});continue}accepted.push(item),prior.set(item.id,item.outcome)}if(rejected_items.length>0&&accepted.length===0&&idempotent_skips.length===0){let first=rejected_items[0];return{ok:!1,rejected:!0,reason:first.reason,detail:`${first.reason} for id ${first.item.id}`,rejected_items}}return{ok:!0,accepted,idempotent_skips,trace,closes_no_relevant:no_relevant_knowledge,...rejected_items.length>0&&{rejected_items}}}function reject(reason,detail){return{ok:!1,rejected:!0,reason,detail}}function findTrace(events,traceId){for(let e of events)if(e.type==="retrieved"&&e.trace_id===traceId)return e;return null}init_promotion_evidence_store();init_skill_propagation_gate();init_utils2();function isTaskTool3(tool3){return tool3==="Task"||tool3==="task"}function extractTaskId2(prompt){let m=/\btask[_-]?id\s*[:=]\s*([A-Za-z0-9._-]{1,80})/i.exec(prompt);return m?m[1]:void 0}async function appendUnacknowledgedCritical(directory,record3){let filePath=validateSwarmPath(directory,"unacknowledged-criticals.jsonl");await mkdir44(path193.dirname(filePath),{recursive:!0}),await appendFile20(filePath,`${JSON.stringify(record3)}
6004
+ `),injectKnowledgeMessage(output,cachedInjectionText);let sessionID=sessionId;if(sessionID){let criticalIds=filteredEntries.filter((e)=>renderedDirectiveIdSet.has(e.id)).filter((e)=>e.directive_priority==="critical"&&isActiveStatus(e.status)).map((e)=>e.id);if(cachedCriticalIds=criticalIds,criticalIds.length>0)setCriticalShownIds(sessionID,{ids:criticalIds,phase:`Phase ${currentPhase}`,generatedAt:Date.now()});else clearCriticalShownIds(sessionID)}if(cachedShownIds.length>0){let phaseLabel=`Phase ${currentPhase}`,scoreById=new Map(filteredEntries.map((e)=>[e.id,e.finalScore])),ranks={},scores={};cachedShownIds.forEach((id,idx)=>{ranks[id]=idx+1,scores[id]=scoreById.get(id)??0}),await _internals123.recordKnowledgeEvent(directory,{type:"retrieved",trace_id:search.trace_id,session_id:sessionId??"unknown",phase:retrievalCtx.currentPhase,task_id:retrievalCtx.taskId,agent:"architect",query:retrievalCtx.lastUserMessage??retrievalCtx.currentPhase??"",retrieval_mode:"auto_injection",result_ids:cachedShownIds,ranks,scores}),_internals123.recordKnowledgeShown(directory,cachedShownIds,{phase:phaseLabel,tool:retrievalCtx.currentTool,action:retrievalCtx.currentAction,targetAgent:retrievalCtx.targetAgent,taskId:retrievalCtx.taskId}).catch(()=>{}),_internals123.recordLessonsShown(directory,cachedShownIds,phaseLabel).catch(()=>{}),_internals123.confirmEntriesPhase(directory,cachedShownIds,currentPhase,projectName).catch(()=>{})}})}var _internals123={searchKnowledge,recordKnowledgeEvent,recordKnowledgeShown,readRecentEscalations,buildEscalationBriefing,recordLessonsShown,confirmEntriesPhase};init_knowledge_link();init_logger();init_knowledge_events();var RECEIPT_VALIDITY_MS=1800000,NO_TRACE_SENTINEL="none",VALID_OUTCOMES=new Set(["applied","ignored","contradicted","violated","n_a"]);async function validateReceipt(ctx){let{items,no_relevant_knowledge}=ctx;if(items.length===0&&!no_relevant_knowledge)return reject("empty_receipt","no items and no_relevant_knowledge is false");for(let item of items)if(!VALID_OUTCOMES.has(item.outcome))return reject("invalid_outcome",`item ${item.id}: outcome ${item.outcome}`);if(no_relevant_knowledge&&items.length>0)return reject("invalid_outcome","no_relevant_knowledge cannot be combined with items");let events;try{events=await readKnowledgeEvents(ctx.directory)}catch(err){return log("[receipt-validator] readKnowledgeEvents failed (fail-open, accepting)",{trace_id:ctx.trace_id,error:err instanceof Error?err.message:String(err)}),{ok:!0,accepted:items,idempotent_skips:[],trace:null,closes_no_relevant:no_relevant_knowledge}}if(ctx.trace_id===NO_TRACE_SENTINEL||ctx.trace_id===""){if(items.length>0)return reject("trace_not_found",`items filed against the ${NO_TRACE_SENTINEL} sentinel trace`);return{ok:!0,accepted:[],idempotent_skips:[],trace:null,closes_no_relevant:no_relevant_knowledge}}let trace=findTrace(events,ctx.trace_id);if(!trace)return reject("trace_not_found",`no retrieved event for trace_id ${ctx.trace_id}`);if(trace.session_id!==ctx.session_id)return reject("wrong_session",`trace session ${trace.session_id} != receipt session ${ctx.session_id}`);let parsed=Date.parse(trace.timestamp),ageMs=Date.now()-parsed;if(!Number.isFinite(parsed)||ageMs>RECEIPT_VALIDITY_MS)return reject("expired",Number.isFinite(parsed)?`trace age ${Math.round(ageMs/1000)}s exceeds ${RECEIPT_VALIDITY_MS/1000}s`:`trace timestamp '${trace.timestamp}' is unparseable (fail-closed)`);let prior=new Map;for(let e of events){if(e.type!=="applied"&&e.type!=="ignored"&&e.type!=="contradicted"&&e.type!=="violated"&&e.type!=="n_a")continue;if(e.trace_id!==ctx.trace_id)continue;let kid=e.knowledge_id;if(!kid)continue;prior.set(kid,e.type)}let resultSet=new Set(trace.result_ids),accepted=[],idempotent_skips=[],rejected_items=[];for(let item of items){if(!resultSet.has(item.id)){rejected_items.push({item,reason:"id_not_in_trace"});continue}let prev=prior.get(item.id);if(prev===item.outcome){idempotent_skips.push(item);continue}if(prev!==void 0&&prev!==item.outcome){rejected_items.push({item,reason:"duplicate_conflicting_terminal"});continue}accepted.push(item),prior.set(item.id,item.outcome)}if(rejected_items.length>0&&accepted.length===0&&idempotent_skips.length===0){let first=rejected_items[0];return{ok:!1,rejected:!0,reason:first.reason,detail:`${first.reason} for id ${first.item.id}`,rejected_items}}return{ok:!0,accepted,idempotent_skips,trace,closes_no_relevant:no_relevant_knowledge,...rejected_items.length>0&&{rejected_items}}}function reject(reason,detail){return{ok:!1,rejected:!0,reason,detail}}function findTrace(events,traceId){for(let e of events)if(e.type==="retrieved"&&e.trace_id===traceId)return e;return null}init_promotion_evidence_store();init_skill_propagation_gate();init_utils2();function isTaskTool3(tool3){return tool3==="Task"||tool3==="task"}function extractTaskId2(prompt){let m=/\btask[_-]?id\s*[:=]\s*([A-Za-z0-9._-]{1,80})/i.exec(prompt);return m?m[1]:void 0}async function appendUnacknowledgedCritical(directory,record3){let filePath=validateSwarmPath(directory,"unacknowledged-criticals.jsonl");await mkdir44(path193.dirname(filePath),{recursive:!0}),await appendFile21(filePath,`${JSON.stringify(record3)}
5988
6005
  `,"utf-8")}async function collectDelegateAcks(params){let result={emitted:[],unacknowledgedCriticals:[]};try{let shown=parseDelegateDirectiveBlock(params.prompt);if(shown.length===0)return result;let shownById=new Map(shown.map((d)=>[d.id,d])),criticalIds=shown.filter((d)=>d.priority==="critical").map((d)=>d.id),acks=parseAcknowledgments(params.transcript),ackedIds=new Set,violatedIds=new Set,sessionId=params.sessionId??"unknown",taskId=params.taskId??extractTaskId2(params.prompt),recoveredTraceId=parseDelegateDirectiveTraceId(params.prompt),traceId=recoveredTraceId??newTraceId(),isLegacyPrompt=recoveredTraceId===void 0,ackItems=[],ackByItemId=new Map;for(let ack of acks){if(!shownById.has(ack.id))continue;if(ack.result==="applied"||ack.result==="ignored"||ack.result==="violated"||ack.result==="n_a"||ack.result==="contradicted")ackItems.push({id:ack.id,outcome:ack.result,reason:ack.reason}),ackByItemId.set(ack.id,ack)}let eventIdByKnowledgeId=new Map;if(isLegacyPrompt)for(let ack of acks){if(!shownById.has(ack.id))continue;if(!ackByItemId.has(ack.id))continue;ackedIds.add(ack.id);let written=await recordKnowledgeEvent(params.directory,{type:ack.result,trace_id:traceId,knowledge_id:ack.id,session_id:sessionId,task_id:taskId,agent:params.agent,reason:ack.reason});if(written?.event_id)eventIdByKnowledgeId.set(ack.id,written.event_id);if(ack.result==="violated")violatedIds.add(ack.id);result.emitted.push({id:ack.id,type:ack.result})}else{let validation2=await validateReceipt({directory:params.directory,trace_id:traceId,session_id:sessionId,task_id:taskId,agent:params.agent,items:ackItems,no_relevant_knowledge:!1});if(validation2.ok){for(let item of validation2.accepted){let ack=ackByItemId.get(item.id);if(!ack)continue;ackedIds.add(item.id);let written=await recordKnowledgeEvent(params.directory,{type:item.outcome,trace_id:traceId,knowledge_id:item.id,session_id:sessionId,task_id:taskId,agent:params.agent,reason:ack.reason});if(written?.event_id)eventIdByKnowledgeId.set(item.id,written.event_id);if(item.outcome==="violated")violatedIds.add(item.id);result.emitted.push({id:item.id,type:item.outcome})}for(let item of validation2.idempotent_skips)ackedIds.add(item.id)}if(!validation2.ok)for(let id of ackByItemId.keys())ackedIds.add(id)}try{let cohortId=await ensureCohortIdCached(params.directory,sessionId),linkId=readLinkPointer(params.directory)?.linkId,now=new Date().toISOString(),evidenceRecords=[];for(let[kid,eid]of eventIdByKnowledgeId){let ack=ackByItemId.get(kid);if(!ack||!cohortId)continue;let outcome=ack.result;if(outcome!=="applied"&&outcome!=="violated"&&outcome!=="contradicted")continue;evidenceRecords.push({cohort_id:cohortId,source_link_id:linkId,entry_id:kid,retrieval_trace_id:traceId,receipt_outcome:outcome,receipt_event_id:eid,phase:void 0,timestamp:now})}await appendPromotionEvidence(params.directory,evidenceRecords)}catch{}for(let id of criticalIds){if(ackedIds.has(id))continue;result.unacknowledgedCriticals.push(id),await recordKnowledgeEvent(params.directory,{type:"violated",trace_id:traceId,knowledge_id:id,session_id:sessionId,task_id:taskId,agent:params.agent,reason:"unacknowledged"}),violatedIds.add(id),result.emitted.push({id,type:"violated"});try{await appendUnacknowledgedCritical(params.directory,{timestamp:new Date().toISOString(),knowledge_id:id,agent:params.agent,session_id:sessionId,task_id:taskId,reason:"unacknowledged"})}catch{}}if(violatedIds.size>0)await escalateViolatedEntries(params.directory,[...violatedIds])}catch{}return result}async function collectDelegateAcksAfter(directory,input,output){if(!isTaskTool3(input.tool))return;let argsRecord=input.args&&typeof input.args==="object"?input.args:null,prompt=argsRecord&&typeof argsRecord.prompt==="string"?argsRecord.prompt:"";if(!prompt)return;let transcript=typeof output.output==="string"?output.output:"";if(!transcript)return;let agent=parseDelegationArgs(input.args)?.targetAgent??"unknown",sessionId=typeof input.sessionID==="string"?input.sessionID:void 0;await collectDelegateAcks({directory,prompt,transcript,agent,sessionId})}var PRIORITY_RANK={critical:0,high:1,medium:2,low:3};function buildDirectiveComplianceBlock(directives){if(directives.length===0)return null;let sorted=[...directives].sort((a,b)=>{let pr=(PRIORITY_RANK[a.priority]??2)-(PRIORITY_RANK[b.priority]??2);if(pr!==0)return pr;return a.id<b.id?-1:a.id>b.id?1:0}),lines=[];lines.push("<directives_to_verify>"),lines.push("Produce a DIRECTIVE_COMPLIANCE verdict for EVERY id below. Run any verification_predicate provided.");for(let d of sorted){if(lines.push(`- id: ${d.id}`),lines.push(` priority: ${d.priority}`),d.lesson)lines.push(` lesson: ${d.lesson}`);if(d.verification_predicate)lines.push(` verification_predicate: ${d.verification_predicate}`)}return lines.push("</directives_to_verify>"),lines.push(""),lines.push(`DIRECTIVE_COMPLIANCE: one line per knowledge directive shown during this phase (the IDs are listed in the DIRECTIVES TO VERIFY block of your prompt). Use exactly one of:
5989
6006
  VERIFIED:<id> evidence=<file:line | predicate_passed>
5990
6007
  VIOLATED:<id> evidence=<file:line | failing_predicate>
@@ -6000,11 +6017,11 @@ ${promptRaw}`,log("[delegate-directive-injection] injected",{caller_agent:caller
6000
6017
  `,"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 fs110 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");fs110.appendFileSync(eventsPath,`${JSON.stringify(event)}
6001
6018
  `,"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 fs111 from"node:fs";import*as path195 from"node:path";import*as child_process13 from"node:child_process";var WIN32_CMD_BINARIES=new Set(["npm","npx","pnpm","yarn"]),_internals124={spawn:child_process13.spawn};function spawnAsync(command,cwd,timeoutMs){return new Promise((resolve69)=>{try{let[rawCmd,...args2]=command,cmd=process.platform==="win32"&&WIN32_CMD_BINARIES.has(rawCmd)&&!rawCmd.includes(".")?`${rawCmd}.cmd`:rawCmd,proc=_internals124.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{}resolve69(null)},timeoutMs);proc.on("close",(code)=>{if(done)return;done=!0,clearTimeout(timer),resolve69({exitCode:code??1,stdout,stderr})}),proc.on("error",()=>{if(done)return;done=!0,clearTimeout(timer),resolve69(null)})}catch{resolve69(null)}})}var emittedSkipAdvisories=new Set;function detectPackageManager(projectDir){if(fs111.existsSync(path195.join(projectDir,"bun.lockb")))return"bun";if(fs111.existsSync(path195.join(projectDir,"pnpm-lock.yaml")))return"pnpm";if(fs111.existsSync(path195.join(projectDir,"yarn.lock")))return"yarn";if(fs111.existsSync(path195.join(projectDir,"package-lock.json")))return"npm";return"bun"}function detectTypecheckCommand(projectDir){let pkgPath=path195.join(projectDir,"package.json");if(fs111.existsSync(pkgPath))try{let pkg=JSON.parse(fs111.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&&!fs111.existsSync(path195.join(projectDir,"tsconfig.json")));if(deps?.typescript||fs111.existsSync(path195.join(projectDir,"tsconfig.json")))return{command:["npx","tsc","--noEmit"],language:"typescript"}}catch{return null}if(fs111.existsSync(path195.join(projectDir,"go.mod")))return{command:["go","vet","./..."],language:"go"};if(fs111.existsSync(path195.join(projectDir,"Cargo.toml")))return{command:["cargo","check"],language:"rust"};if(fs111.existsSync(path195.join(projectDir,"pyproject.toml"))||fs111.existsSync(path195.join(projectDir,"requirements.txt"))||fs111.existsSync(path195.join(projectDir,"setup.py")))return{command:null,language:"python"};try{if(fs111.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.
6002
6019
  ${errorSummary}`)}}}}init_file_locks();init_state2();init_utils();init_core3();init_merge();import*as fs112 from"node:fs";import*as fsPromises10 from"node:fs/promises";import*as path196 from"node:path";var INIT_ORPHAN_RECOVERY_TIMEOUT_MS=1e4,ORPHAN_RECOVERY_LOCK_FILE=".swarm/locks/init-orphan-recovery.lock",_internals125={rmSync:fs112.rmSync,removeWorktree,isLocked,listActiveLocks,tryAcquireLock};async function writeAdvisoryFile(directory,cleanupResult,warnings,attempted,removedWorktrees=[]){let advisoryPath=path196.join(directory,".swarm","advisories","init-orphan-recovery.json"),advisory={initTimestamp:new Date().toISOString(),warnings,errors:cleanupResult.errors,reclaimed:{removedBranches:cleanupResult.removed,removedWorktrees,prunedWorktrees:attempted}};try{await fsPromises10.mkdir(path196.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=path196.resolve(path196.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(path196.join(worktreeRoot,sessionId),{withFileTypes:!0})}catch{continue}for(let laneEntry of sessionEntries){if(!laneEntry.isDirectory())continue;let worktreePath=path196.join(worktreeRoot,sessionId,laneEntry.name);orphanedDirs.push(worktreePath)}}return orphanedDirs}async function isCrossProcessLockHeld(directory){if(_internals125.isLocked(directory,ORPHAN_RECOVERY_LOCK_FILE))return!0;if(_internals125.listActiveLocks(directory).length>0)return!0;return!1}async function removeOrphanedWorktreeDir(worktreePath,projectRoot){let removeResult=await _internals125.removeWorktree(worktreePath,projectRoot);if(!("error"in removeResult))return;try{_internals125.rmSync(worktreePath,{recursive:!0,force:!0});return}catch{return removeResult.error}}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,errors:[]},result.warnings,!1,[]),result}let lockAcquireResult=await _internals125.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:[],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=[];for(let worktreePath of orphanedWorktreeDirs){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:!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:[],errors:[]},result.warnings,!1,[])}return result}init_state2();import*as fs113 from"node:fs/promises";import*as path197 from"node:path";var ADVISORY_FILENAME="init-orphan-recovery.json";function createInitOrphanRecoveryAdvisoryHook(directory){let consumedBySession=new Set;async function readAdvisoryFile(){let advisoryPath=path197.join(directory,".swarm","advisories",ADVISORY_FILENAME);try{let content=await fs113.readFile(advisoryPath,"utf-8");return JSON.parse(content)}catch{return null}}async function deleteAdvisoryFile(){let advisoryPath=path197.join(directory,".swarm","advisories",ADVISORY_FILENAME);try{await fs113.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 fs114 from"node:fs";import*as path199 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 existsSync103,mkdirSync as mkdirSync49,readFileSync as readFileSync76,renameSync as renameSync31,unlinkSync as unlinkSync31,writeFileSync as writeFileSync34}from"node:fs";import*as path198 from"node:path";async function _defaultLoadPlanFromLedger(directory){return loadPlanJsonOnly(directory)}var _internals126={readFileSync:readFileSync76,writeFileSync:writeFileSync34,existsSync:existsSync103,renameSync:renameSync31,mkdirSync:mkdirSync49,unlinkSync:unlinkSync31,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=path198.join(directory,".swarm","issue-reference.json"),raw=_internals126.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=path198.join(directory,".swarm","issue-trace-state.json"),raw=_internals126.readFileSync(filePath,"utf-8"),parsed=JSON.parse(raw);if(!isValidTraceState(parsed))return defaultState;return parsed}catch{return defaultState}}function writeTraceState(directory,state){let swarmDir=path198.join(directory,".swarm");_internals126.mkdirSync(swarmDir,{recursive:!0});let finalPath=path198.join(swarmDir,"issue-trace-state.json"),tmpPath=path198.join(swarmDir,`issue-trace-state.tmp.${process.pid}.${Date.now()}.json`);_internals126.writeFileSync(tmpPath,JSON.stringify(state,null,2),"utf-8");try{_internals126.renameSync(tmpPath,finalPath)}catch{try{_internals126.unlinkSync(finalPath)}catch{}try{_internals126.renameSync(tmpPath,finalPath)}catch(retryErr){try{_internals126.unlinkSync(tmpPath)}catch{}throw retryErr}}}function readSpecIssueNumber(directory){try{let filePath=path198.join(directory,".swarm","spec.md"),raw=_internals126.readFileSync(filePath,"utf-8"),sectionStart=raw.indexOf("## Source Issue");if(sectionStart===-1)return null;let nextHeading=raw.indexOf(`
6003
- ## `,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 _internals126.loadPlanFromLedger(directory);if(!plan||plan.phases.length===0)return{allComplete:!1};return{allComplete:plan.phases.every((phase)=>isPhaseComplete(phase.status))}}function specExists(directory){return _internals126.existsSync(path198.join(directory,".swarm","spec.md"))}function planExists(directory){return _internals126.existsSync(path198.join(directory,".swarm","plan.json"))}var _internals127={readIssueReference,readTraceState,writeTraceState,readSpecIssueNumber,readPlanPhaseStatus,specExists,planExists,isPlanCriticApproved},cachedApproval=null;async function boundedApprovalCheck(directory,timeoutMs){try{let ledgerPath=path199.join(directory,".swarm","plan-ledger.jsonl"),currentSize=-1;try{currentSize=fs114.statSync(ledgerPath).size}catch{let timeout=new Promise((resolve70)=>{setTimeout(()=>resolve70(!1),timeoutMs)});return await Promise.race([_internals127.isPlanCriticApproved(directory),timeout])}if(cachedApproval&&cachedApproval.dir===directory&&cachedApproval.size===currentSize)return cachedApproval.result;let timer;try{let timeout=new Promise((resolve70)=>{timer=setTimeout(()=>resolve70(!1),timeoutMs)}),result=await Promise.race([_internals127.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=_internals127.readIssueReference(directory);if(!issueRef||issueRef.flags.trace!==!0)return;let traceState=_internals127.readTraceState(directory),_specExists=_internals127.specExists(directory),_specIssueNumber=_internals127.readSpecIssueNumber(directory),_planExists=_internals127.planExists(directory),_criticApproved=await boundedApprovalCheck(directory,approvalTimeoutMs),_allPhasesComplete=(await _internals127.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}]});_internals127.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 appendFile21,mkdir as mkdir46}from"node:fs/promises";import*as path200 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");_internals128.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=path200.join(directory,".swarm","events.jsonl");await mkdir46(path200.dirname(filePath),{recursive:!0}),await appendFile21(filePath,`${JSON.stringify(record3)}
6020
+ ## `,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 _internals126.loadPlanFromLedger(directory);if(!plan||plan.phases.length===0)return{allComplete:!1};return{allComplete:plan.phases.every((phase)=>isPhaseComplete(phase.status))}}function specExists(directory){return _internals126.existsSync(path198.join(directory,".swarm","spec.md"))}function planExists(directory){return _internals126.existsSync(path198.join(directory,".swarm","plan.json"))}var _internals127={readIssueReference,readTraceState,writeTraceState,readSpecIssueNumber,readPlanPhaseStatus,specExists,planExists,isPlanCriticApproved},cachedApproval=null;async function boundedApprovalCheck(directory,timeoutMs){try{let ledgerPath=path199.join(directory,".swarm","plan-ledger.jsonl"),currentSize=-1;try{currentSize=fs114.statSync(ledgerPath).size}catch{let timeout=new Promise((resolve70)=>{setTimeout(()=>resolve70(!1),timeoutMs)});return await Promise.race([_internals127.isPlanCriticApproved(directory),timeout])}if(cachedApproval&&cachedApproval.dir===directory&&cachedApproval.size===currentSize)return cachedApproval.result;let timer;try{let timeout=new Promise((resolve70)=>{timer=setTimeout(()=>resolve70(!1),timeoutMs)}),result=await Promise.race([_internals127.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=_internals127.readIssueReference(directory);if(!issueRef||issueRef.flags.trace!==!0)return;let traceState=_internals127.readTraceState(directory),_specExists=_internals127.specExists(directory),_specIssueNumber=_internals127.readSpecIssueNumber(directory),_planExists=_internals127.planExists(directory),_criticApproved=await boundedApprovalCheck(directory,approvalTimeoutMs),_allPhasesComplete=(await _internals127.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}]});_internals127.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 mkdir46}from"node:fs/promises";import*as path200 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");_internals128.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=path200.join(directory,".swarm","events.jsonl");await mkdir46(path200.dirname(filePath),{recursive:!0}),await appendFile22(filePath,`${JSON.stringify(record3)}
6004
6021
  `,"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(`
6005
- `);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 _internals128={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+)/,_internals129={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 _internals129.subscribe(directory,{sessionID,prNumber:prInfo.prNumber,repoFullName:prInfo.repoFullName,prUrl:prInfo.prUrl,maxSubscriptions:config3.max_subscriptions}),_internals129.log("[pr-monitor] Auto-subscribed session to created PR",{sessionID,pr:`${prInfo.repoFullName}#${prInfo.prNumber}`})}catch(err){_internals129.log("[pr-monitor] Auto-subscribe failed (non-fatal)",{error:err instanceof Error?err.message:String(err)})}}}}init_pr_workflow_gate();init_pr_workflow_gate();var DEFAULT_WAKE_TIMEOUT_MS=5000;function blockedText(mode){return[`[${mode} MECHANICAL GATE: FINAL RESPONSE BLOCKED]`,"This workflow still has an active durable gate. The replaced text is not a valid review, closure ledger, or completion verdict.","Continue with the required structured lanes and evidence. Only complete_pr_workflow can clear the gate after every mandatory obligation settles."].join(`
6006
- `)}function createPrWorkflowResponseGate(options){let wakeTimeoutMs=options.wakeTimeoutMs??DEFAULT_WAKE_TIMEOUT_MS,activeWakeSessions=new Set,session=options.client?.session;return{event:async(input)=>{let event2=input.event,sessionID=event2?.properties?.sessionID;if(event2?.type!=="session.idle"||typeof sessionID!=="string"||!sessionID.trim()||activeWakeSessions.has(sessionID))return;let state=await readPrWorkflowGateState(options.directory,sessionID);if(!state||!session)return;activeWakeSessions.add(sessionID);let timer;try{let args2={path:{id:sessionID},body:{parts:[{type:"text",text:`${blockedText(state.mode)}
6007
- Do not stop or summarize. Inspect the durable gate, dispatch or collect the next missing required lane, and continue until complete_pr_workflow succeeds.`}]}},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 Error(`PR workflow resume prompt failed: ${String(result.error)}`)}finally{if(timer)clearTimeout(timer);activeWakeSessions.delete(sessionID)}},textComplete:async(input,output)=>{if(!input.sessionID?.trim())return;let state=await readPrWorkflowGateState(options.directory,input.sessionID);if(!state)return;output.text=blockedText(state.mode)}}}init_pending_delegations();init_pr_workflow_gate();var MAX_PARENT_DEPTH=16,MAX_TRACKED_SESSION_PARENTS=512;function rememberBounded(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())rememberBounded(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;rememberBounded(parents,current,parent),current=parent}return original}}}init_schema();init_bun_compat();init_logger();var import_picomatch2=__toESM(require_picomatch2(),1);import{existsSync as existsSync104,readdirSync as readdirSync29,readFileSync as readFileSync77,statSync as statSync41}from"node:fs";import*as path201 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=path201.resolve(directory),resolved=path201.resolve(baseDir,concrete),rel=path201.relative(baseDir,resolved);if(rel.startsWith("..")||path201.isAbsolute(rel))return null}return v}function findBinaryInPath(binary){let exeName=process.platform==="win32"?`${binary}.exe`:binary;for(let dir of(process.env.PATH??"").split(path201.delimiter)){if(!dir)continue;let candidate=path201.join(dir,exeName);if(existsSync104(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((resolve71)=>setTimeout(()=>resolve71("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=readdirSync29(dir,{withFileTypes:!0})}catch{return}for(let entry of entries){if(visited>=GREP_MAX_FILES)return;let fullPath=path201.join(dir,entry.name),relPath=path201.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=readFileSync77(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(path201.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=path201.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_persistence();init_state2();init_normalize_tool_name();init_write_target_resolver();import*as path202 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=_internals130.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=_internals130.resolveTaskId(session),binding=taskId?_internals130.resolveAuthorizedScopeBinding({directory,taskId,activeSessionId:sessionId}):_internals130.resolveAuthorizedScopeBindingForSession({directory,activeSessionId:sessionId});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=path202.resolve(dir,filePath);return scopeEntries.filter((scope)=>scope.length>0).some((scope)=>{let resolvedScope=path202.resolve(dir,scope);if(resolvedFile===resolvedScope)return!0;let rel=path202.relative(resolvedScope,resolvedFile);return rel.length>0&&!rel.startsWith("..")&&!path202.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 _internals130={sanitizePath,resolveWriteTargets:resolveWriteTargets2,resolveAuthorizedScopeBinding,resolveAuthorizedScopeBindingForSession,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(`
6022
+ `);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 _internals128={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+)/,_internals129={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 _internals129.subscribe(directory,{sessionID,prNumber:prInfo.prNumber,repoFullName:prInfo.repoFullName,prUrl:prInfo.prUrl,maxSubscriptions:config3.max_subscriptions}),_internals129.log("[pr-monitor] Auto-subscribed session to created PR",{sessionID,pr:`${prInfo.repoFullName}#${prInfo.prNumber}`})}catch(err){_internals129.log("[pr-monitor] Auto-subscribe failed (non-fatal)",{error:err instanceof Error?err.message:String(err)})}}}}init_pr_workflow_gate();init_pr_workflow_gate();var DEFAULT_WAKE_TIMEOUT_MS=5000,DEFAULT_MAX_CONSECUTIVE_UNPRODUCTIVE_WAKES=5,DEFAULT_WAKE_COOLDOWN_MS=30000,MAX_TRACKED_WAKE_SESSIONS=200;function blockedText(mode,options={}){let lines=[`[${mode} MECHANICAL GATE: FINAL RESPONSE BLOCKED]`,"This workflow still has an active durable gate. The replaced text is not a valid review, closure ledger, or completion verdict.",`Continue with the required structured lanes and evidence. 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\`. Only \`complete_pr_workflow\` clears the gate on terminal success.`];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.`)}return lines.join(`
6023
+ `)}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,activeWakeSessions=new Set,wakeBudgets=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 resetBudget(sessionID){wakeBudgets.delete(sessionID)}return{event:async(input)=>{let event2=input.event,sessionID=event2?.properties?.sessionID;if(event2?.type!=="session.idle"||typeof sessionID!=="string"||!sessionID.trim()||activeWakeSessions.has(sessionID))return;let state=await readPrWorkflowGateState(options.directory,sessionID);if(!state){resetBudget(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;activeWakeSessions.add(sessionID);let timer;try{let args2={path:{id:sessionID},body:{parts:[{type:"text",text:`${blockedText(state.mode,{suspended:!1,maxConsecutive})}
6024
+ 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 Error(`PR workflow resume prompt failed: ${String(result.error)}`)}finally{if(timer)clearTimeout(timer);activeWakeSessions.delete(sessionID);let postWakeState=await readPrWorkflowGateState(options.directory,sessionID);if(budget.lastWakeAt=now,postWakeState===null)resetBudget(sessionID);else{let currentRevision=postWakeState.revision,effectiveMadeProgress=madeProgress||budget.lastSeenRevision!==void 0&&currentRevision>budget.lastSeenRevision;if(budget.lastSeenRevision=currentRevision,!effectiveMadeProgress){if(budget.consecutiveUnproductive+=1,budget.consecutiveUnproductive>=maxConsecutive)budget.suspended=!0}else budget.consecutiveUnproductive=0}}},textComplete:async(input,output)=>{if(!input.sessionID?.trim())return;let state=await readPrWorkflowGateState(options.directory,input.sessionID);if(!state){resetBudget(input.sessionID);return}let budget=wakeBudgets.get(input.sessionID);output.text=blockedText(state.mode,{suspended:budget?.suspended??!1,maxConsecutive})},_inspectWakeBudget:(sessionID)=>wakeBudgets.get(sessionID)}}init_pending_delegations();init_pr_workflow_gate();var MAX_PARENT_DEPTH=16,MAX_TRACKED_SESSION_PARENTS=512;function rememberBounded(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())rememberBounded(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;rememberBounded(parents,current,parent),current=parent}return original}}}init_schema();init_bun_compat();init_logger();var import_picomatch2=__toESM(require_picomatch2(),1);import{existsSync as existsSync104,readdirSync as readdirSync29,readFileSync as readFileSync77,statSync as statSync41}from"node:fs";import*as path201 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=path201.resolve(directory),resolved=path201.resolve(baseDir,concrete),rel=path201.relative(baseDir,resolved);if(rel.startsWith("..")||path201.isAbsolute(rel))return null}return v}function findBinaryInPath(binary){let exeName=process.platform==="win32"?`${binary}.exe`:binary;for(let dir of(process.env.PATH??"").split(path201.delimiter)){if(!dir)continue;let candidate=path201.join(dir,exeName);if(existsSync104(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((resolve71)=>setTimeout(()=>resolve71("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=readdirSync29(dir,{withFileTypes:!0})}catch{return}for(let entry of entries){if(visited>=GREP_MAX_FILES)return;let fullPath=path201.join(dir,entry.name),relPath=path201.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=readFileSync77(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(path201.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=path201.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_persistence();init_state2();init_normalize_tool_name();init_write_target_resolver();import*as path202 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=_internals130.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=_internals130.resolveTaskId(session),binding=taskId?_internals130.resolveAuthorizedScopeBinding({directory,taskId,activeSessionId:sessionId}):_internals130.resolveAuthorizedScopeBindingForSession({directory,activeSessionId:sessionId});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=path202.resolve(dir,filePath);return scopeEntries.filter((scope)=>scope.length>0).some((scope)=>{let resolvedScope=path202.resolve(dir,scope);if(resolvedFile===resolvedScope)return!0;let rel=path202.relative(resolvedScope,resolvedFile);return rel.length>0&&!rel.startsWith("..")&&!path202.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 _internals130={sanitizePath,resolveWriteTargets:resolveWriteTargets2,resolveAuthorizedScopeBinding,resolveAuthorizedScopeBindingForSession,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(`
6008
6025
  `);try{injectAdvisory(sessionId,advisory)}catch{}}}}init_skill_propagation_gate();init_skill_scoring();init_skill_usage_log();import*as path203 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
6009
6026
 
6010
6027
  ${promptRaw}`,!options.quiet)console.warn("[skill-propagation-gate] No skills above threshold 0.5 — injected SKILLS: none");try{writeWarnEvent(directory,{type:"skill_injection_decision",timestamp:new Date().toISOString(),decision:"none",target_agent:targetAgent,sessionID,reason:"no_skill_above_threshold",threshold:SKILL_INJECTION_THRESHOLD,considered:recommendedSkills.map((s)=>({skillPath:s.skillPath,score:s.score}))})}catch{}return{injected:!0,injectedSkills:[]}}let topSkills=qualified.slice(0,SKILL_INJECTION_TOP_N),newPrompt=`${`SKILLS: ${topSkills.map((s)=>{let desc=readSkillMetadata(s.skillPath,directory).description||"";if(!desc||desc==="No description provided")desc=path203.basename(path203.dirname(s.skillPath));return desc=desc.replace(/,/g,";"),`file:${s.skillPath} (-- ${desc})`}).join(", ")}`}
@@ -6017,7 +6034,7 @@ ${usedByCoderLine}`}return{injected:!0,injectedSkills:topSkills.map((s)=>({skill
6017
6034
  ${findingText}
6018
6035
  Review before proceeding.`;injectSystemMessage(input.sessionID,message)}}}init_bun_compat();init_utils2();import*as fs116 from"node:fs";function recordSteeringConsumed(directory,directiveId){try{let eventsPath=validateSwarmPath(directory,"events.jsonl"),event={type:"steering-consumed",directiveId,timestamp:new Date().toISOString()};fs116.appendFileSync(eventsPath,`${JSON.stringify(event)}
6019
6036
  `,"utf-8")}catch{}}function createSteeringConsumedHook(directory){return safeHook(async()=>{try{let eventsPath=validateSwarmPath(directory,"events.jsonl"),content=await bunFile(eventsPath).text();if(!content.trim())return;let lines=content.trim().split(`
6020
- `),directiveIds=new Set,consumedIds=new Set;for(let line of lines){if(!line.trim())continue;try{let parsed=JSON.parse(line);if(parsed.type==="steering-directive"&&parsed.directiveId)directiveIds.add(parsed.directiveId);else if(parsed.type==="steering-consumed"&&parsed.directiveId)consumedIds.add(parsed.directiveId)}catch{}}for(let directiveId of directiveIds)if(!consumedIds.has(directiveId))recordSteeringConsumed(directory,directiveId)}catch{}})}init_trajectory_logger();init_memory();init_prm();init_compaction_service();init_config_doctor();init_cost_accounting();init_version_check();init_state3();init_utils2();init_state2();init_bun_compat();init_logger();import{renameSync as renameSync32}from"node:fs";var TRANSIENT_SESSION_FIELDS=[{name:"revisionLimitHit",resetValue:!1},{name:"coderRevisions",resetValue:0},{name:"selfFixAttempted",resetValue:!1},{name:"lastGateFailure",resetValue:null},{name:"architectWriteCount",resetValue:0},{name:"selfCodingWarnedAtCount",resetValue:0},{name:"pendingAdvisoryMessages",resetValue:[]},{name:"model_fallback_index",resetValue:0},{name:"modelFallbackExhausted",resetValue:!1},{name:"scopeViolationDetected",resetValue:!1},{name:"delegationActive",resetValue:!1},{name:"autoProceedOverride",resetValue:void 0},{name:"autoProceedNudgeDone",resetValue:void 0}],VALID_TASK_WORKFLOW_STATES=["idle","coder_delegated","pre_check_passed","reviewer_run","tests_run","complete"];function deserializeTaskWorkflowStates(raw){let m=new Map;if(!raw||typeof raw!=="object")return m;for(let[taskId,stateVal]of Object.entries(raw))if(VALID_TASK_WORKFLOW_STATES.includes(stateVal))m.set(taskId,stateVal);return m}function deserializeAgentSession(s){let gateLog=new Map;if(s.gateLog)for(let[taskId,gates]of Object.entries(s.gateLog))gateLog.set(taskId,new Set(gates??[]));let reviewerCallCount=new Map;if(s.reviewerCallCount)for(let[phase,count]of Object.entries(s.reviewerCallCount)){let numPhase=Number(phase);if(Number.isFinite(numPhase))reviewerCallCount.set(numPhase,count)}let partialGateWarningsIssuedForTask=new Set(s.partialGateWarningsIssuedForTask??[]),catastrophicPhaseWarnings=new Set(s.catastrophicPhaseWarnings??[]),phaseAgentsDispatched=new Set(s.phaseAgentsDispatched??[]),lastCompletedPhaseAgentsDispatched=new Set(s.lastCompletedPhaseAgentsDispatched??[]),stageBCompletion=new Map;if(s.stageBCompletion)for(let[taskId,agents]of Object.entries(s.stageBCompletion))stageBCompletion.set(taskId,new Set(agents));let windows={};for(let[key,win]of Object.entries(s.windows??{})){if(!win||typeof win!=="object")continue;windows[key]={...win,transientRetryCount:"transientRetryCount"in win?win.transientRetryCount??0:0}}return{agentName:s.agentName,lastToolCallTime:s.lastToolCallTime,lastAgentEventTime:s.lastAgentEventTime,delegationActive:s.delegationActive,activeInvocationId:s.activeInvocationId,lastInvocationIdByAgent:s.lastInvocationIdByAgent??{},windows,lastCompactionHint:s.lastCompactionHint??0,architectWriteCount:s.architectWriteCount??0,lastCoderDelegationTaskId:s.lastCoderDelegationTaskId??null,currentTaskId:s.currentTaskId??null,turboMode:s.turboMode??!1,turboStrategy:s.turboStrategy==="lean"||s.turboStrategy==="standard"?s.turboStrategy:void 0,leanTurboActive:s.leanTurboActive??!1,leanTurboCurrentPhase:typeof s.leanTurboCurrentPhase==="number"?s.leanTurboCurrentPhase:void 0,epicModeActive:s.epicModeActive??!1,gateLog,reviewerCallCount,lastGateFailure:s.lastGateFailure??null,partialGateWarningsIssuedForTask,selfFixAttempted:s.selfFixAttempted??!1,selfCodingWarnedAtCount:s.selfCodingWarnedAtCount??0,catastrophicPhaseWarnings,lastPhaseCompleteTimestamp:s.lastPhaseCompleteTimestamp??0,lastPhaseCompletePhase:s.lastPhaseCompletePhase??0,phaseAgentsDispatched,lastCompletedPhaseAgentsDispatched,qaSkipCount:s.qaSkipCount??0,qaSkipTaskIds:s.qaSkipTaskIds??[],taskWorkflowStates:deserializeTaskWorkflowStates(s.taskWorkflowStates),lastGateOutcome:null,declaredCoderScope:null,lastScopeViolation:null,scopeViolationDetected:s.scopeViolationDetected,modifiedFilesThisCoderTask:[],loopDetectionWindow:[],pendingAdvisoryMessages:s.pendingAdvisoryMessages??[],model_fallback_index:s.model_fallback_index??0,modelFallbackExhausted:s.modelFallbackExhausted??!1,coderRevisions:s.coderRevisions??0,revisionLimitHit:s.revisionLimitHit??!1,fullAutoMode:s.fullAutoMode??!1,fullAutoInteractionCount:s.fullAutoInteractionCount??0,fullAutoDeadlockCount:s.fullAutoDeadlockCount??0,fullAutoLastQuestionHash:s.fullAutoLastQuestionHash??null,maxConcurrencyOverride:typeof s.maxConcurrencyOverride==="number"?Math.min(64,Math.max(1,s.maxConcurrencyOverride)):void 0,autoProceedOverride:s.autoProceedOverride,autoProceedNudgeDone:s.autoProceedNudgeDone,prmPatternCounts:new Map,prmEscalationLevel:0,prmLastPatternDetected:null,prmTrajectoryStep:0,prmHardStopPending:!1,sessionRehydratedAt:s.sessionRehydratedAt??0,stageBCompletion,prSubscriptions:new Map,cachedCohortId:typeof s.cachedCohortId==="string"?s.cachedCohortId:void 0,lastObservedModel:typeof s.lastObservedModel==="string"?s.lastObservedModel:void 0,lastObservedProviderID:typeof s.lastObservedProviderID==="string"?s.lastObservedProviderID:void 0}}async function readSnapshot(directory){try{let resolvedPath=validateSwarmPath(directory,"session/state.json"),content=await bunFile(resolvedPath).text();if(!content.trim())return null;let parsed=JSON.parse(content,(key,value)=>{if(key==="__proto__"||key==="constructor")return;return value});if(parsed.version!==1&&parsed.version!==2){try{let quarantinePath=validateSwarmPath(directory,"session/state.json.quarantine");renameSync32(resolvedPath,quarantinePath)}catch{}return null}return parsed}catch{return null}}async function rehydrateState(snapshot,directory){if(swarmState.pendingRehydrations.size>0)await Promise.allSettled([...swarmState.pendingRehydrations]);if(swarmState.toolAggregates.clear(),swarmState.activeAgent.clear(),swarmState.delegationChains.clear(),swarmState.agentSessions.clear(),snapshot.toolAggregates)for(let[key,value]of Object.entries(snapshot.toolAggregates))swarmState.toolAggregates.set(key,value);if(snapshot.activeAgent)for(let[key,value]of Object.entries(snapshot.activeAgent))swarmState.activeAgent.set(key,value);if(snapshot.delegationChains)for(let[key,value]of Object.entries(snapshot.delegationChains))swarmState.delegationChains.set(key,value);let now=Date.now();if(snapshot.agentSessions)for(let[sessionId,serializedSession]of Object.entries(snapshot.agentSessions)){if(!serializedSession||typeof serializedSession!=="object"||typeof serializedSession.agentName!=="string"||typeof serializedSession.lastToolCallTime!=="number"||typeof serializedSession.delegationActive!=="boolean"){log(`[snapshot-reader] Skipping malformed session ${sessionId}: missing required fields (agentName, lastToolCallTime, delegationActive)`);continue}let session=deserializeAgentSession(serializedSession);if(session.lastToolCallTime=now,session.lastAgentEventTime=now,session.sessionRehydratedAt=now,session.windows)for(let window2 of Object.values(session.windows))window2.startedAtMs=now,window2.lastSuccessTimeMs=now,window2.hardLimitHit=!1,window2.toolCalls=0,window2.consecutiveErrors=0,window2.recentToolCalls=[],window2.warningIssued=!1,window2.warningReason="";for(let field of TRANSIENT_SESSION_FIELDS)session[field.name]=field.resetValue;if(session.fullAutoMode){let runStillActive=!1;if(directory)try{runStillActive=loadFullAutoRunState(directory,sessionId)?.status==="running"}catch{runStillActive=!1}if(!runStillActive)session.fullAutoMode=!1}swarmState.agentSessions.set(sessionId,session)}}async function loadSnapshot(directory){try{await buildRehydrationCache(directory);let snapshot=await readSnapshot(directory);if(snapshot!==null){await rehydrateState(snapshot,directory);for(let session of swarmState.agentSessions.values())applyRehydrationCache(session)}}catch{}}init_snapshot_writer();init_state2();init_telemetry();init_zod();init_external_tool_runner();init_path_security();init_create_tool();import*as fs117 from"node:fs";import*as path205 from"node:path";var ACTIONLINT_TIMEOUT_MS=15000,ACTIONLINT_MAX_STDOUT_BYTES=4194304,ACTIONLINT_MAX_STDERR_BYTES=131072,DEFAULT_MAX_RESULTS=200,HARD_CAP_RESULTS=2000,MAX_WORKFLOW_FILES=500,MAX_WORKFLOW_DIRS=200,MAX_WORKFLOW_DEPTH=20;function resolveActionlintBinary(){return _internals131.resolveExecutableFromPath(["actionlint"])}function normalizeRelativeWorkflowFile(file3,workspace){if(!file3||containsControlChars(file3)||containsPathTraversal(file3))return null;if(path205.isAbsolute(file3)||/^[A-Za-z]:[/\\]/.test(file3))return null;let normalizedInput=file3.split(/[\\/]+/).filter(Boolean).join(path205.sep);if(!/\.(ya?ml)$/i.test(normalizedInput))return null;try{let realWorkspace=fs117.realpathSync(workspace),resolved=path205.resolve(realWorkspace,normalizedInput),realFile=fs117.realpathSync(resolved),relative41=path205.relative(realWorkspace,realFile);if(!relative41||relative41.startsWith("..")||path205.isAbsolute(relative41))return null;return relative41.split(path205.sep).join("/")}catch{return null}}function discoverWorkflowFiles(workspace){let root=path205.join(workspace,".github","workflows");if(!fs117.existsSync(root))return{files:[],truncated:!1};let files=[],dirCount=0,truncated=!1,visit=(dir,depth=0)=>{if(files.length>=MAX_WORKFLOW_FILES||dirCount>=MAX_WORKFLOW_DIRS||depth>MAX_WORKFLOW_DEPTH){truncated=!0;return}dirCount++;let entries;try{entries=fs117.readdirSync(dir,{withFileTypes:!0})}catch{return}for(let entry of entries){if(files.length>=MAX_WORKFLOW_FILES||dirCount>=MAX_WORKFLOW_DIRS){truncated=!0;break}let full=path205.join(dir,entry.name);if(entry.isDirectory())visit(full,depth+1);else if(entry.isFile()&&/\.(ya?ml)$/i.test(entry.name)){let rel=normalizeRelativeWorkflowFile(path205.relative(workspace,full),workspace);if(rel)files.push(rel)}}};return visit(root),{files,truncated}}function parseActionlintOutput(stdout,workspace,maxResults){let findings=[],total=0;for(let line of stdout.split(`
6037
+ `),directiveIds=new Set,consumedIds=new Set;for(let line of lines){if(!line.trim())continue;try{let parsed=JSON.parse(line);if(parsed.type==="steering-directive"&&parsed.directiveId)directiveIds.add(parsed.directiveId);else if(parsed.type==="steering-consumed"&&parsed.directiveId)consumedIds.add(parsed.directiveId)}catch{}}for(let directiveId of directiveIds)if(!consumedIds.has(directiveId))recordSteeringConsumed(directory,directiveId)}catch{}})}init_trajectory_logger();init_memory();init_prm();init_compaction_service();init_config_doctor();init_cost_accounting();init_version_check();init_state3();init_utils2();init_state2();init_bun_compat();init_logger();import{renameSync as renameSync32}from"node:fs";var TRANSIENT_SESSION_FIELDS=[{name:"revisionLimitHit",resetValue:!1},{name:"coderRevisions",resetValue:0},{name:"selfFixAttempted",resetValue:!1},{name:"lastGateFailure",resetValue:null},{name:"architectWriteCount",resetValue:0},{name:"selfCodingWarnedAtCount",resetValue:0},{name:"pendingAdvisoryMessages",resetValue:[]},{name:"model_fallback_index",resetValue:0},{name:"modelFallbackExhausted",resetValue:!1},{name:"scopeViolationDetected",resetValue:!1},{name:"delegationActive",resetValue:!1},{name:"autoProceedOverride",resetValue:void 0},{name:"autoProceedNudgeDone",resetValue:void 0}],VALID_TASK_WORKFLOW_STATES=["idle","coder_delegated","pre_check_passed","reviewer_run","tests_run","complete"];function deserializeTaskWorkflowStates(raw){let m=new Map;if(!raw||typeof raw!=="object")return m;for(let[taskId,stateVal]of Object.entries(raw))if(VALID_TASK_WORKFLOW_STATES.includes(stateVal))m.set(taskId,stateVal);return m}function deserializeAgentSession(s){let gateLog=new Map;if(s.gateLog)for(let[taskId,gates]of Object.entries(s.gateLog))gateLog.set(taskId,new Set(gates??[]));let reviewerCallCount=new Map;if(s.reviewerCallCount)for(let[phase,count]of Object.entries(s.reviewerCallCount)){let numPhase=Number(phase);if(Number.isFinite(numPhase))reviewerCallCount.set(numPhase,count)}let partialGateWarningsIssuedForTask=new Set(s.partialGateWarningsIssuedForTask??[]),catastrophicPhaseWarnings=new Set(s.catastrophicPhaseWarnings??[]),phaseAgentsDispatched=new Set(s.phaseAgentsDispatched??[]),lastCompletedPhaseAgentsDispatched=new Set(s.lastCompletedPhaseAgentsDispatched??[]),stageBCompletion=new Map;if(s.stageBCompletion)for(let[taskId,agents]of Object.entries(s.stageBCompletion))stageBCompletion.set(taskId,new Set(agents));let windows={};for(let[key,win]of Object.entries(s.windows??{})){if(!win||typeof win!=="object")continue;windows[key]={...win,transientRetryCount:"transientRetryCount"in win?win.transientRetryCount??0:0}}return{agentName:s.agentName,lastToolCallTime:s.lastToolCallTime,lastAgentEventTime:s.lastAgentEventTime,delegationActive:s.delegationActive,activeInvocationId:s.activeInvocationId,lastInvocationIdByAgent:s.lastInvocationIdByAgent??{},windows,lastCompactionHint:s.lastCompactionHint??0,architectWriteCount:s.architectWriteCount??0,lastCoderDelegationTaskId:s.lastCoderDelegationTaskId??null,currentTaskId:s.currentTaskId??null,turboMode:s.turboMode??!1,turboStrategy:s.turboStrategy==="lean"||s.turboStrategy==="standard"?s.turboStrategy:void 0,leanTurboActive:s.leanTurboActive??!1,leanTurboCurrentPhase:typeof s.leanTurboCurrentPhase==="number"?s.leanTurboCurrentPhase:void 0,epicModeActive:s.epicModeActive??!1,gateLog,reviewerCallCount,lastGateFailure:s.lastGateFailure??null,partialGateWarningsIssuedForTask,selfFixAttempted:s.selfFixAttempted??!1,selfCodingWarnedAtCount:s.selfCodingWarnedAtCount??0,catastrophicPhaseWarnings,lastPhaseCompleteTimestamp:s.lastPhaseCompleteTimestamp??0,lastPhaseCompletePhase:s.lastPhaseCompletePhase??0,phaseAgentsDispatched,lastCompletedPhaseAgentsDispatched,qaSkipCount:s.qaSkipCount??0,qaSkipTaskIds:s.qaSkipTaskIds??[],taskWorkflowStates:deserializeTaskWorkflowStates(s.taskWorkflowStates),lastGateOutcome:null,declaredCoderScope:null,lastScopeViolation:null,scopeViolationDetected:s.scopeViolationDetected,modifiedFilesThisCoderTask:[],loopDetectionWindow:[],pendingAdvisoryMessages:s.pendingAdvisoryMessages??[],model_fallback_index:s.model_fallback_index??0,modelFallbackExhausted:s.modelFallbackExhausted??!1,coderRevisions:s.coderRevisions??0,revisionLimitHit:s.revisionLimitHit??!1,fullAutoMode:s.fullAutoMode??!1,fullAutoInteractionCount:s.fullAutoInteractionCount??0,fullAutoDeadlockCount:s.fullAutoDeadlockCount??0,fullAutoLastQuestionHash:s.fullAutoLastQuestionHash??null,maxConcurrencyOverride:typeof s.maxConcurrencyOverride==="number"?Math.min(64,Math.max(1,s.maxConcurrencyOverride)):void 0,autoProceedOverride:s.autoProceedOverride,autoProceedNudgeDone:s.autoProceedNudgeDone,prmPatternCounts:new Map,prmEscalationLevel:0,prmLastPatternDetected:null,prmTrajectoryStep:0,prmHardStopPending:!1,sessionRehydratedAt:s.sessionRehydratedAt??0,stageBCompletion,prSubscriptions:new Map,cachedCohortId:typeof s.cachedCohortId==="string"?s.cachedCohortId:void 0,lastObservedModel:typeof s.lastObservedModel==="string"?s.lastObservedModel:void 0,lastObservedProviderID:typeof s.lastObservedProviderID==="string"?s.lastObservedProviderID:void 0}}async function readSnapshot(directory){try{let resolvedPath=validateSwarmPath(directory,"session/state.json"),content=await bunFile(resolvedPath).text();if(!content.trim())return null;let parsed=JSON.parse(content,(key,value)=>{if(key==="__proto__"||key==="constructor")return;return value});if(parsed.version!==1&&parsed.version!==2){try{let quarantinePath=validateSwarmPath(directory,"session/state.json.quarantine");renameSync32(resolvedPath,quarantinePath)}catch{}return null}return parsed}catch{return null}}async function rehydrateState(snapshot,directory){if(swarmState.pendingRehydrations.size>0)await Promise.allSettled([...swarmState.pendingRehydrations]);if(swarmState.toolAggregates.clear(),swarmState.activeAgent.clear(),swarmState.delegationChains.clear(),swarmState.agentSessions.clear(),snapshot.toolAggregates)for(let[key,value]of Object.entries(snapshot.toolAggregates))swarmState.toolAggregates.set(key,value);if(snapshot.activeAgent)for(let[key,value]of Object.entries(snapshot.activeAgent))swarmState.activeAgent.set(key,value);if(snapshot.delegationChains)for(let[key,value]of Object.entries(snapshot.delegationChains))swarmState.delegationChains.set(key,value);let now=Date.now();if(snapshot.agentSessions)for(let[sessionId,serializedSession]of Object.entries(snapshot.agentSessions)){if(!serializedSession||typeof serializedSession!=="object"||typeof serializedSession.agentName!=="string"||typeof serializedSession.lastToolCallTime!=="number"||typeof serializedSession.delegationActive!=="boolean"){log(`[snapshot-reader] Skipping malformed session ${sessionId}: missing required fields (agentName, lastToolCallTime, delegationActive)`);continue}let session=deserializeAgentSession(serializedSession);if(session.lastToolCallTime=now,session.lastAgentEventTime=now,session.sessionRehydratedAt=now,session.windows)for(let window2 of Object.values(session.windows))window2.startedAtMs=now,window2.lastSuccessTimeMs=now,window2.hardLimitHit=!1,window2.toolCalls=0,window2.consecutiveErrors=0,window2.recentToolCalls=[],window2.warningIssued=!1,window2.warningReason="";for(let field of TRANSIENT_SESSION_FIELDS)session[field.name]=field.resetValue;if(session.fullAutoMode){let runStillActive=!1;if(directory)try{runStillActive=loadFullAutoRunState(directory,sessionId)?.status==="running"}catch{runStillActive=!1}if(!runStillActive)session.fullAutoMode=!1}swarmState.agentSessions.set(sessionId,session)}}async function loadSnapshot(directory){try{await buildRehydrationCache(directory);let snapshot=await readSnapshot(directory);if(snapshot!==null){await rehydrateState(snapshot,directory);for(let session of swarmState.agentSessions.values())applyRehydrationCache(session)}}catch{}}init_snapshot_writer();init_state2();init_telemetry();init_zod();init_pr_workflow_gate();init_create_tool();var AbortPrWorkflowArgsSchema=exports_external.object({mode:exports_external.enum(["PR_REVIEW","PR_FEEDBACK"]).optional(),reason:exports_external.string().trim().max(500).optional()}).strict();async function executeAbortPrWorkflow(args2,directory,context={}){let parsed=AbortPrWorkflowArgsSchema.safeParse(args2);if(!parsed.success)return JSON.stringify({success:!1,message:`Invalid PR workflow abort: ${parsed.error.issues.map((issue3)=>`${issue3.path.join(".")}: ${issue3.message}`).join("; ")}`});if(!context.sessionID?.trim())return JSON.stringify({success:!1,message:"PR workflow abort requires an active sessionID"});try{let summary=await abortPrWorkflow(directory,context.sessionID,parsed.data.mode?{expectedMode:parsed.data.mode,reason:parsed.data.reason}:{reason:parsed.data.reason});return JSON.stringify({success:!0,mode:summary.mode,...summary.prHeadSha?{pr_head_sha:summary.prHeadSha}:{},open_lanes:summary.openLanes,gate_cleared:!0})}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:String(error93)})}}var abort_pr_workflow=createSwarmTool({description:"Abort an active PR_REVIEW or PR_FEEDBACK mechanical gate and clear its durable session state, stopping the auto-resume loop. Use only when the workflow cannot reach complete_pr_workflow — 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. Refuses to abort while the workflow is armed for publication (call complete_pr_workflow instead) or while PR workflow lanes are still in flight (collect their results first). Records a best-effort audit event to .swarm/events.jsonl. Prefer this tool over leaving the session trapped in a stale gate.",args:{mode:AbortPrWorkflowArgsSchema.shape.mode,reason:AbortPrWorkflowArgsSchema.shape.reason},execute:executeAbortPrWorkflow});init_zod();init_external_tool_runner();init_path_security();init_create_tool();import*as fs117 from"node:fs";import*as path205 from"node:path";var ACTIONLINT_TIMEOUT_MS=15000,ACTIONLINT_MAX_STDOUT_BYTES=4194304,ACTIONLINT_MAX_STDERR_BYTES=131072,DEFAULT_MAX_RESULTS=200,HARD_CAP_RESULTS=2000,MAX_WORKFLOW_FILES=500,MAX_WORKFLOW_DIRS=200,MAX_WORKFLOW_DEPTH=20;function resolveActionlintBinary(){return _internals131.resolveExecutableFromPath(["actionlint"])}function normalizeRelativeWorkflowFile(file3,workspace){if(!file3||containsControlChars(file3)||containsPathTraversal(file3))return null;if(path205.isAbsolute(file3)||/^[A-Za-z]:[/\\]/.test(file3))return null;let normalizedInput=file3.split(/[\\/]+/).filter(Boolean).join(path205.sep);if(!/\.(ya?ml)$/i.test(normalizedInput))return null;try{let realWorkspace=fs117.realpathSync(workspace),resolved=path205.resolve(realWorkspace,normalizedInput),realFile=fs117.realpathSync(resolved),relative41=path205.relative(realWorkspace,realFile);if(!relative41||relative41.startsWith("..")||path205.isAbsolute(relative41))return null;return relative41.split(path205.sep).join("/")}catch{return null}}function discoverWorkflowFiles(workspace){let root=path205.join(workspace,".github","workflows");if(!fs117.existsSync(root))return{files:[],truncated:!1};let files=[],dirCount=0,truncated=!1,visit=(dir,depth=0)=>{if(files.length>=MAX_WORKFLOW_FILES||dirCount>=MAX_WORKFLOW_DIRS||depth>MAX_WORKFLOW_DEPTH){truncated=!0;return}dirCount++;let entries;try{entries=fs117.readdirSync(dir,{withFileTypes:!0})}catch{return}for(let entry of entries){if(files.length>=MAX_WORKFLOW_FILES||dirCount>=MAX_WORKFLOW_DIRS){truncated=!0;break}let full=path205.join(dir,entry.name);if(entry.isDirectory())visit(full,depth+1);else if(entry.isFile()&&/\.(ya?ml)$/i.test(entry.name)){let rel=normalizeRelativeWorkflowFile(path205.relative(workspace,full),workspace);if(rel)files.push(rel)}}};return visit(root),{files,truncated}}function parseActionlintOutput(stdout,workspace,maxResults){let findings=[],total=0;for(let line of stdout.split(`
6021
6038
  `)){if(!line.trim())continue;try{let entry=JSON.parse(line),file3=typeof entry.filepath==="string"?normalizeRelativeWorkflowFile(path205.isAbsolute(entry.filepath)?path205.relative(workspace,entry.filepath):entry.filepath,workspace):null;if(!file3)continue;if(total++,findings.length>=maxResults)continue;findings.push({file:file3,line:typeof entry.line==="number"?entry.line:1,column:typeof entry.column==="number"?entry.column:1,kind:typeof entry.kind==="string"?entry.kind:"unknown",message:typeof entry.message==="string"?entry.message:"",endColumn:typeof entry.end_column==="number"?entry.end_column:void 0})}catch{}}return{findings,total}}function sanitizeMaxResults(value){let numeric=typeof value==="number"&&Number.isFinite(value)?value:DEFAULT_MAX_RESULTS;return Math.min(Math.max(0,numeric),HARD_CAP_RESULTS)}var actionlint_scan=createSwarmTool({description:"Run actionlint against GitHub Actions workflow YAML files and return structured findings. Read-only; resolves actionlint lazily.",args:{files:exports_external.array(exports_external.string()).optional().describe("Optional workspace-relative workflow YAML files. Defaults to .github/workflows/**/*.yml,yaml."),max_results:exports_external.number().default(DEFAULT_MAX_RESULTS).describe("Maximum findings to return")},execute:async(args2,directory)=>{let obj=typeof args2==="object"&&args2!==null?args2:{},maxResults=sanitizeMaxResults(obj.max_results),requestedFiles=Array.isArray(obj.files)?obj.files:void 0;if(requestedFiles?.some((f)=>typeof f!=="string"))return JSON.stringify({error:!0,type:"invalid-input",message:"files must be an array of strings"},null,2);let discovery=requestedFiles?{files:requestedFiles.map((f)=>normalizeRelativeWorkflowFile(f,directory)).filter((f)=>Boolean(f)),truncated:!1}:_internals131.discoverWorkflowFiles(directory),files=discovery.files;if(requestedFiles&&files.length!==requestedFiles.length)return JSON.stringify({error:!0,type:"path-escape",message:"files must be existing workspace-relative GitHub Actions YAML files"},null,2);let uniqueFiles=Array.from(new Set(files)),cappedFiles=uniqueFiles.slice(0,MAX_WORKFLOW_FILES),discoveryTruncated=discovery.truncated||uniqueFiles.length>cappedFiles.length;if(files=cappedFiles,files.length===0)return JSON.stringify({clean:!discoveryTruncated,findings:[],total:0,truncated:discoveryTruncated,files:[],command:["actionlint","-format","{{json .}}"],note:discoveryTruncated?`Workflow discovery was truncated at ${MAX_WORKFLOW_FILES} files, ${MAX_WORKFLOW_DIRS} directories, or depth ${MAX_WORKFLOW_DEPTH}; result is incomplete.`:"No GitHub Actions workflow YAML files found"},null,2);let executable=_internals131.resolveActionlintBinary();if(!executable)return JSON.stringify({error:!0,type:"actionlint-not-found",message:"actionlint executable not found. Install actionlint and ensure it is on PATH."},null,2);let lintArgs=["-format","{{json .}}",...files.map((file3)=>`./${file3}`)],run=await _internals131.runExternalTool({executable,args:lintArgs,cwd:directory,timeoutMs:ACTIONLINT_TIMEOUT_MS,maxStdoutBytes:ACTIONLINT_MAX_STDOUT_BYTES,maxStderrBytes:ACTIONLINT_MAX_STDERR_BYTES});if(run.status==="timeout")return JSON.stringify({error:!0,type:"timeout",message:`actionlint timed out after ${ACTIONLINT_TIMEOUT_MS}ms`},null,2);if(run.status==="spawn-error")return JSON.stringify({error:!0,type:"unknown",message:run.message??"actionlint failed to start"},null,2);let{findings,total}=parseActionlintOutput(run.stdout,directory,maxResults);if(run.exitCode!==0&&findings.length===0&&run.stderr)return JSON.stringify({error:!0,type:"unknown",message:run.stderr.split(`
6022
6039
  `)[0]},null,2);return JSON.stringify({findings,total,truncated:discoveryTruncated||total>maxResults||run.stdoutTruncated||run.stderrTruncated,files,command:["actionlint",...lintArgs],outputTruncated:run.stdoutTruncated||run.stderrTruncated,clean:findings.length===0&&total===0&&!discoveryTruncated&&!run.stdoutTruncated&&!run.stderrTruncated,note:discoveryTruncated?`Workflow discovery was truncated at ${MAX_WORKFLOW_FILES} files, ${MAX_WORKFLOW_DIRS} directories, or depth ${MAX_WORKFLOW_DEPTH}; result is incomplete.`:void 0},null,2)}}),_internals131={resolveExecutableFromPath,resolveActionlintBinary,runExternalTool,discoverWorkflowFiles,parseActionlintOutput};init_zod();init_config();import{existsSync as existsSync107,mkdirSync as mkdirSync50,mkdtempSync as mkdtempSync4,readFileSync as readFileSync79,realpathSync as realpathSync26,renameSync as renameSync33,rmdirSync as rmdirSync2,unlinkSync as unlinkSync32,writeFileSync as writeFileSync35}from"node:fs";import*as path206 from"node:path";class SequenceMatcher{a;b;isJunk;autoJunk;b2j=new Map;popularSet=new Set;matchingBlocks=null;constructor(isJunk,a,b,autoJunk=!0){this.a=a,this.b=b,this.isJunk=isJunk,this.autoJunk=autoJunk,this.chainB()}setSeqs(a,b){this.a=a,this.b=b,this.matchingBlocks=null,this.chainB()}chainB(){let b=this.b,b2j=new Map;for(let i=0;i<b.length;i++){let ch=b[i],positions=b2j.get(ch);if(positions===void 0)b2j.set(ch,[i]);else positions.push(i)}if(this.isJunk){let junk=[];for(let ch of b2j.keys())if(this.isJunk(ch))junk.push(ch);for(let ch of junk)b2j.delete(ch)}if(this.popularSet=new Set,this.autoJunk&&b.length>=200){let threshold=b.length*0.01+0.5,popular=[];for(let[ch,indices]of b2j)if(indices.length>threshold)popular.push(ch);for(let ch of popular)this.popularSet.add(ch),b2j.delete(ch)}this.b2j=b2j}findLongestMatch(alo,ahi,blo,bhi){let a=this.a,b=this.b,b2j=this.b2j,bestI=alo,bestJ=blo,bestSize=0,j2len=new Map;for(let i=alo;i<ahi;i++){let ch=a[i],positions=b2j.get(ch);if(positions===void 0){j2len.clear();continue}let newJ2len=new Map;for(let j of positions){if(j<blo)continue;if(j>=bhi)break;let size=(j2len.get(j-1)??0)+1;if(newJ2len.set(j,size),size>bestSize)bestI=i-size+1,bestJ=j-size+1,bestSize=size}j2len.clear();for(let[k,v]of newJ2len)j2len.set(k,v)}while(bestI>alo&&bestJ>blo&&a[bestI-1]===b[bestJ-1])bestI--,bestJ--,bestSize++;while(bestI+bestSize<ahi&&bestJ+bestSize<bhi&&a[bestI+bestSize]===b[bestJ+bestSize])bestSize++;return{a:bestI,b:bestJ,size:bestSize}}getMatchingBlocks(){if(this.matchingBlocks!==null)return this.matchingBlocks;let la=this.a.length,lb=this.b.length,matches=[],stack=[[0,la,0,lb]];while(stack.length>0){let[alo,ahi,blo,bhi]=stack.pop(),m=this.findLongestMatch(alo,ahi,blo,bhi),{a:i,b:j,size}=m;if(size>0){if(matches.push(m),alo<i&&blo<j)stack.push([alo,i,blo,j]);if(i+size<ahi&&j+size<bhi)stack.push([i+size,ahi,j+size,bhi])}}return matches.sort((x,y)=>x.a-y.a||x.b-y.b),matches.push({a:la,b:lb,size:0}),this.matchingBlocks=matches,matches}ratio(){let matches=this.getMatchingBlocks(),m=0;for(let block of matches)m+=block.size;let t=this.a.length+this.b.length;if(t===0)return 1;return 2*m/t}getOpcodes(){let blocks=this.getMatchingBlocks(),opcodes=[],i=0,j=0;for(let block of blocks){let{a:ai,b:bj,size}=block;if(i<ai&&j<bj)opcodes.push({tag:"replace",i1:i,i2:ai,j1:j,j2:bj});else if(i<ai)opcodes.push({tag:"delete",i1:i,i2:ai,j1:j,j2:bj});else if(j<bj)opcodes.push({tag:"insert",i1:i,i2:ai,j1:j,j2:bj});if(size>0)opcodes.push({tag:"equal",i1:ai,i2:ai+size,j1:bj,j2:bj+size});i=ai+size,j=bj+size}return opcodes}}var UNICODE_MAP={"“":'"',"”":'"',"‘":"'","’":"'","—":"--","–":"-","…":"..."," ":" "};function unicodeNormalize(text){let out=text;for(let[char,repl]of Object.entries(UNICODE_MAP))out=out.split(char).join(repl);return out}function leadingWhitespace(line){let i=0;while(i<line.length&&(line[i]===" "||line[i]==="\t"))i++;return line.slice(0,i)}function firstMeaningfulLine(text){for(let line of text.split(`
6023
6040
  `))if(line.trim())return line;return null}function fuzzyFindAndReplace(content,oldString,newString,replaceAll=!1,options={}){if(!oldString)return{content,matchCount:0,strategy:null,error:"old_string cannot be empty"};if(oldString===newString)return{content,matchCount:0,strategy:null,error:"old_string and new_string are identical"};let strategies=[["exact",strategyExact],["line_trimmed",strategyLineTrimmed],["whitespace_normalized",strategyWhitespaceNormalized],["indentation_flexible",strategyIndentationFlexible],["escape_normalized",strategyEscapeNormalized],["trimmed_boundary",strategyTrimmedBoundary],["unicode_normalized",strategyUnicodeNormalized],["block_anchor",strategyBlockAnchor]];if(options.includeContextAware!==!1)strategies.push(["context_aware",strategyContextAware]);for(let[strategyName,strategyFn]of strategies){let matches=strategyFn(content,oldString);if(matches.length===0)continue;if(matches.length>1&&!replaceAll)return{content,matchCount:0,strategy:null,error:`Found ${matches.length} matches for old_string. Provide more context to make it unique, or use replace_all=true.`};if(strategyName!=="exact"){let driftErr=detectEscapeDrift(content,matches,oldString,newString);if(driftErr)return{content,matchCount:0,strategy:null,error:driftErr}}let effectiveNew=maybeUnescapeNewString(newString,content,matches);if(strategyName==="unicode_normalized"||strategyName==="block_anchor"||strategyName==="context_aware")effectiveNew=preserveUnicodeInReplacement(content,matches,oldString,effectiveNew);return{content:applyReplacements(content,matches,effectiveNew,strategyName!=="exact"?oldString:null),matchCount:matches.length,strategy:strategyName,error:null}}return{content,matchCount:0,strategy:null,error:"Could not find a match for old_string in the file"}}function detectEscapeDrift(content,matches,oldString,newString){if(!newString.includes("\\'")&&!newString.includes("\\\""))return null;let matchedRegions="";for(let[start,end]of matches)matchedRegions+=content.slice(start,end);for(let suspect of["\\'","\\\""])if(newString.includes(suspect)&&oldString.includes(suspect)&&!matchedRegions.includes(suspect)){let plain=suspect[1];return`Escape-drift detected: old_string and new_string contain the literal sequence ${JSON.stringify(suspect)} but the matched region of the file does not. This is almost always a tool-call serialization artifact where an apostrophe or quote got prefixed with a spurious backslash. Re-read the file with read_file and pass old_string/new_string without backslash-escaping ${JSON.stringify(plain)} characters.`}return null}function maybeUnescapeNewString(newString,content,matches){if(!newString.includes("\\t")&&!newString.includes("\\r"))return newString;let matchedRegions="";for(let[start,end]of matches)matchedRegions+=content.slice(start,end);let out=newString;if(out.includes("\\t")&&matchedRegions.includes("\t"))out=out.split("\\t").join("\t");if(out.includes("\\r")&&matchedRegions.includes("\r"))out=out.split("\\r").join("\r");return out}function reindentReplacement(fileRegion,oldString,newString){if(!newString)return newString;let oldFirst=firstMeaningfulLine(oldString),fileFirst=firstMeaningfulLine(fileRegion);if(oldFirst===null||fileFirst===null)return newString;let oldIndent=leadingWhitespace(oldFirst),fileIndent=leadingWhitespace(fileFirst);if(oldIndent===fileIndent)return newString;let outLines=[];for(let line of newString.split(`
@@ -6294,7 +6311,7 @@ Ignoring will not affect already-tracked files. To stop tracking them, run:
6294
6311
  `).map((f)=>f.trim()).filter((f)=>f.length>0);let proc2=_internals165.bunSpawn(["git","diff","--name-only","HEAD"],{cwd:directory,...GIT_DIFF_SPAWN_OPTIONS}),exitCode2,stdout2;try{[exitCode2,stdout2]=await Promise.all([proc2.exited,proc2.stdout.text()])}finally{try{proc2.kill()}catch{}}if(exitCode2===0)return stdout2.trim().split(`
6295
6312
  `).map((f)=>f.trim()).filter((f)=>f.length>0);return null}catch{return null}}async function validateDiffScope(taskId,directory){try{let declaredScope=getDeclaredScope(taskId,directory);if(!declaredScope)return null;let changedFiles=await getChangedFiles2(directory);if(!changedFiles)return null;let nonSwarmFiles=changedFiles.filter((f)=>!f.replace(/\\/g,"/").replace(/^\.\//,"").startsWith(".swarm/")),normalise=(p)=>p.replace(/\\/g,"/").replace(/^\.\//,""),normScope=new Set(declaredScope.map(normalise)),undeclared=nonSwarmFiles.map(normalise).filter((f)=>!normScope.has(f));if(undeclared.length===0)return null;let scopeStr=declaredScope.join(", "),undeclaredStr=undeclared.slice(0,5).join(", "),extra=undeclared.length>5?` (+${undeclared.length-5} more)`:"";return`SCOPE WARNING: Task ${taskId} declared scope [${scopeStr}] but also modified [${undeclaredStr}${extra}]. Reviewer should verify these changes are intentional.`}catch{return null}}init_file_locks();init_manager();init_utils3();init_state2();init_telemetry();init_file_locks();import*as fs160 from"node:fs";import*as path257 from"node:path";var _internals166={listActiveLocks,verifyLeanTurboTaskCompletion},TIER_3_PATTERNS=[/^architect.*\.ts$/i,/^delegation.*\.ts$/i,/^guardrails.*\.ts$/i,/^adversarial.*\.ts$/i,/^sanitiz.*\.ts$/i,/^auth.*$/i,/^permission.*$/i,/^crypto.*$/i,/^secret.*$/i,/^security.*\.ts$/i];function matchesTier3Pattern(files){for(let file3 of files){let fileName=path257.basename(file3);for(let pattern of TIER_3_PATTERNS)if(pattern.test(fileName))return!0}return!1}function verifyLeanTurboTaskCompletion(directory,taskId,sessionID){let persisted=null;try{let statePath=path257.join(directory,".swarm","turbo-state.json");if(!fs160.existsSync(statePath))return{ok:!1,reason:"Lean Turbo state file not found"};let raw=fs160.readFileSync(statePath,"utf-8");persisted=JSON.parse(raw)}catch{return{ok:!1,reason:"Lean Turbo state file unreadable or malformed"}}if(typeof persisted!=="object"||persisted===null||typeof persisted.sessions!=="object"||persisted.sessions===null||Array.isArray(persisted.sessions))return{ok:!1,reason:"Lean Turbo state malformed: missing expected fields"};let runState=null;for(let sessionState of Object.values(persisted.sessions))if(typeof sessionState==="object"&&sessionState!==null&&sessionState.strategy==="lean"&&sessionState.status==="running"){if(sessionID!==void 0&&sessionState.sessionID!==sessionID)continue;runState=sessionState;break}if(!runState)return{ok:!1,reason:"No active Lean Turbo run state found"};if(!Array.isArray(runState.lanes)||!Array.isArray(runState.degradedTasks))return{ok:!1,reason:"Lean Turbo state malformed: missing expected fields"};let lane=runState.lanes.find((l)=>typeof l==="object"&&l!==null&&Array.isArray(l.taskIds)&&typeof l.laneId==="string"&&l.taskIds.includes(taskId));if(!lane)return{ok:!1,reason:`Task ${taskId} not found in any Lean Turbo lane`,laneFound:!1};let degradedTask=runState.degradedTasks.find((dt)=>typeof dt==="object"&&dt!==null&&dt.taskId===taskId);if(degradedTask)return{ok:!1,reason:`Task ${taskId} is degraded: ${degradedTask.reason}`,laneFound:!0};if(lane.status!=="completed")return{ok:!1,reason:`Lane ${lane.laneId} is not completed (status: ${lane.status})`,laneFound:!0,evidence:{laneId:lane.laneId,laneStatus:lane.status,taskIds:lane.taskIds}};if(lane.laneId.length===0||lane.laneId.includes("/")||lane.laneId.includes("\\")||lane.laneId.includes(".."))return{ok:!1,reason:`Lane ID contains invalid characters: ${lane.laneId}`,laneFound:!0,evidence:{laneId:lane.laneId,laneStatus:lane.status,taskIds:lane.taskIds}};let phase=runState.phase??0,evidencePath=path257.join(directory,".swarm","evidence",String(phase),"lean-turbo",`${lane.laneId}.json`),expectedDir=path257.join(directory,".swarm","evidence",String(phase),"lean-turbo"),resolvedPath=path257.resolve(evidencePath),resolvedDir=path257.resolve(expectedDir);if(!resolvedPath.startsWith(resolvedDir+path257.sep)&&resolvedPath!==resolvedDir)return{ok:!1,reason:`Lane ID causes path traversal: ${lane.laneId}`,laneFound:!0,evidence:{laneId:lane.laneId,laneStatus:lane.status,taskIds:lane.taskIds}};if(!fs160.existsSync(evidencePath))return{ok:!1,reason:`Lane ${lane.laneId} evidence file not found: ${evidencePath}`,laneFound:!0,evidence:{laneId:lane.laneId,laneStatus:lane.status,taskIds:lane.taskIds}};let laneLocks=_internals166.listActiveLocks(directory).filter((lock)=>lock.laneId===lane.laneId);if(laneLocks.length>0)return{ok:!1,reason:`Active file locks exist for lane ${lane.laneId}: ${laneLocks.map((l)=>l.filePath).join(", ")}`,laneFound:!0,evidence:{laneId:lane.laneId,laneStatus:lane.status,taskIds:lane.taskIds}};let filesTouched=[];try{let planPath=path257.join(directory,".swarm","plan.json"),planRaw=fs160.readFileSync(planPath,"utf-8"),plan=JSON.parse(planRaw);for(let planPhase of plan.phases??[])for(let task of planPhase.tasks??[])if(task.id===taskId&&task.files_touched){filesTouched=task.files_touched;break}}catch{return{ok:!1,reason:`Cannot verify Tier-3 patterns for task ${taskId}: plan.json unreadable`,laneFound:!0,evidence:{laneId:lane.laneId,laneStatus:lane.status,taskIds:lane.taskIds}}}if(filesTouched.length>0&&matchesTier3Pattern(filesTouched))return{ok:!1,reason:`Task ${taskId} touches Tier-3 security-sensitive files and cannot bypass Stage B`,laneFound:!0,evidence:{laneId:lane.laneId,laneStatus:lane.status,taskIds:lane.taskIds}};return{ok:!0,reason:`Task ${taskId} in completed lane ${lane.laneId}`,laneFound:!0,evidence:{laneId:lane.laneId,laneStatus:lane.status,taskIds:lane.taskIds}}}init_logger();init_task_id();init_create_tool();init_resolve_working_directory();var _internals167={tryAcquireLock,updateTaskStatus,resolveWorkingDirectory,loadPlan,readTaskEvidenceRaw,hasActiveLeanTurbo,hasActiveTurboMode,verifyLeanTurboTaskCompletion,hasPassedDurableGateEvidence,emitReviewerGateDecision:telemetry.reviewerGateDecision},VALID_STATUSES2=["pending","in_progress","completed","blocked"];function validateStatus(status){if(!VALID_STATUSES2.includes(status))return`Invalid status "${status}". Must be one of: ${VALID_STATUSES2.join(", ")}`;return}function validateTaskId(taskId){if(validateTaskIdFormat(taskId))return`Invalid task_id "${taskId}". Must match pattern N.M or N.M.P (e.g., "1.1", "1.2.3")`;return}function reviewerGateDecision(taskId,sessionID,result,reasonCode,evidenceKind){try{_internals167.emitReviewerGateDecision(sessionID??"",taskId,result.blocked,reasonCode,evidenceKind)}catch{}return result}var TIER_3_PATTERNS2=[/^architect.*\.ts$/i,/^delegation.*\.ts$/i,/^guardrails.*\.ts$/i,/^adversarial.*\.ts$/i,/^sanitiz.*\.ts$/i,/^auth.*$/i,/^permission.*$/i,/^crypto.*$/i,/^secret.*$/i,/^security.*\.ts$/i];function matchesTier3Pattern2(files){for(let file3 of files){let fileName=path258.basename(file3);for(let pattern of TIER_3_PATTERNS2)if(pattern.test(fileName))return!0}return!1}function hasPassedDurableGateEvidence(workingDirectory,taskId){let evidence=readTaskEvidenceRaw(workingDirectory,taskId);if(!evidence||!Array.isArray(evidence.required_gates)||evidence.required_gates.length===0)return!1;return evidence.required_gates.every((gate)=>evidence.gates?.[gate]!=null)}function checkReviewerGate(taskId,workingDirectory,stageBParallelEnabled=!1,sessionID,fallbackDir){try{let skipStandardTurboBypass=!1;if(_internals167.hasActiveLeanTurbo()){let resolvedDir2=workingDirectory;try{let leanCheck=_internals167.verifyLeanTurboTaskCompletion(resolvedDir2,taskId,sessionID);if(leanCheck.ok)return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:`Lean Turbo bypass: ${leanCheck.reason}`},"lean_turbo_completed_lane","fallback");if(leanCheck.laneFound!==!1)skipStandardTurboBypass=!0}catch{skipStandardTurboBypass=!0}}if(!skipStandardTurboBypass&&_internals167.hasActiveTurboMode()){let resolvedDir2=workingDirectory;try{let planPath=path258.join(resolvedDir2,".swarm","plan.json"),planRaw=fs161.readFileSync(planPath,"utf-8"),plan=JSON.parse(planRaw);for(let planPhase of plan.phases??[])for(let task of planPhase.tasks??[])if(task.id===taskId&&task.files_touched){if(!matchesTier3Pattern2(task.files_touched))return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:"Turbo Mode bypass"},"standard_turbo_non_tier3","fallback");break}}catch{}}let resolvedDir;if(fallbackDir){let resolveResult=_internals167.resolveWorkingDirectory(workingDirectory,fallbackDir);if(resolveResult.success)resolvedDir=resolveResult.directory;else resolvedDir=fallbackDir}else if(workingDirectory)resolvedDir=workingDirectory;let evidenceIncompleteReason=null;try{if(!resolvedDir);else{let evidence=_internals167.readTaskEvidenceRaw(resolvedDir,taskId);if(evidence===null);else if(evidence.required_gates&&Array.isArray(evidence.required_gates)&&evidence.gates){if(evidence.required_gates.length>0&&evidence.required_gates.every((gate)=>evidence.gates[gate]!=null))return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:""},"durable_evidence_complete","genuine");let missingGates=evidence.required_gates.filter((gate)=>evidence.gates[gate]==null);evidenceIncompleteReason=evidence.required_gates.length===0?`Task ${taskId} has an evidence file with no required gates. Delegate reviewer and test_engineer before marking task as completed.`:`Task ${taskId} is missing required gates: [${missingGates.join(", ")}]. Required: [${evidence.required_gates.join(", ")}]. Completed: [${Object.keys(evidence.gates).join(", ")}]. Delegate the missing gate agents before marking task as completed.`}}}catch(error93){return log(`[gate-evidence] Evidence file for task ${taskId} is corrupt or unreadable:`,error93 instanceof Error?error93.message:String(error93)),telemetry.gateFailed("","qa_gate",taskId,"Evidence file corrupt or unreadable"),reviewerGateDecision(taskId,sessionID,{blocked:!0,reason:`Evidence file for task ${taskId} is corrupt or unreadable. Fix the file at .swarm/evidence/${taskId}.json or delete it to fall through to session state.`},"corrupt_evidence","data_quality")}if(swarmState.agentSessions.size===0&&!evidenceIncompleteReason)return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:""},"no_active_sessions","fallback");let validSessionCount=0;for(let[_sessionId,session]of swarmState.agentSessions){if(!(session.taskWorkflowStates instanceof Map))continue;validSessionCount++;let state=getTaskState(session,taskId);if(state==="tests_run"||state==="complete")return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:""},"workflow_state_complete","genuine");if(stageBParallelEnabled&&hasBothStageBCompletions(session,taskId))return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:""},"stage_b_parallel_complete","genuine")}if(validSessionCount===0&&!evidenceIncompleteReason)return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:""},"zero_valid_sessions","data_quality");let stateEntries=[];for(let[sessionId,session]of swarmState.agentSessions){if(!(session.taskWorkflowStates instanceof Map))continue;let state=getTaskState(session,taskId);stateEntries.push(`${sessionId}: ${state}`)}if(resolvedDir)try{let planPath=path258.join(resolvedDir,".swarm","plan.json"),planRaw=fs161.readFileSync(planPath,"utf-8"),plan=JSON.parse(planRaw);for(let planPhase of plan.phases??[])for(let task of planPhase.tasks??[])if(task.id===taskId&&task.status==="completed"&&_internals167.hasPassedDurableGateEvidence(resolvedDir,taskId))return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:""},"restart_recovery_complete","genuine")}catch{}{let hasReviewer=!1,hasTestEngineer=!1;for(let[sessionId,chain]of swarmState.delegationChains){let session=swarmState.agentSessions.get(sessionId);if(session&&(session.currentTaskId===taskId||session.lastCoderDelegationTaskId===taskId))for(let delegation of chain){let target=stripKnownSwarmPrefix(delegation.to);if(target==="reviewer")hasReviewer=!0;if(target==="test_engineer")hasTestEngineer=!0}}if(hasReviewer&&hasTestEngineer)return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:""},"scoped_delegation_complete","genuine");if(!evidenceIncompleteReason&&(!hasReviewer||!hasTestEngineer)){for(let[sessionId,chain]of swarmState.delegationChains){if(chain.some((d)=>stripKnownSwarmPrefix(d.to)==="coder"))continue;let chainSession=swarmState.agentSessions.get(sessionId);if(chainSession){let chainTaskId=chainSession.currentTaskId||chainSession.lastCoderDelegationTaskId;if(chainTaskId&&chainTaskId!==taskId)continue}for(let delegation of chain){let target=stripKnownSwarmPrefix(delegation.to);if(target==="reviewer")hasReviewer=!0;if(target==="test_engineer")hasTestEngineer=!0}}if(hasReviewer&&hasTestEngineer)return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:""},"unscoped_delegation_complete","genuine")}}let currentStateStr=stateEntries.length>0?stateEntries.join(", "):"no active sessions",chainEntries=[];for(let[sessionId,chain]of swarmState.delegationChains){let session=swarmState.agentSessions.get(sessionId);if(session&&(session.currentTaskId===taskId||session.lastCoderDelegationTaskId===taskId)){let targets=chain.map((d)=>stripKnownSwarmPrefix(d.to));chainEntries.push(`${sessionId}: [${targets.join(", ")}]`)}}let chainSummary=chainEntries.length>0?chainEntries.join("; "):"no chains for this task",rehydratedSessionCount=[...swarmState.agentSessions.values()].filter((s)=>s.sessionRehydratedAt>0).length,finalReason=[`Task ${taskId} has not passed QA gates.`,` Session states: [${currentStateStr}].`,` Delegation chains: [${chainSummary}].`,` Evidence: [${evidenceIncompleteReason??"no evidence file found"}].`,` Rehydrated sessions: ${rehydratedSessionCount}.`," Missing required state: tests_run or complete."].join(`
6296
6313
  `);return telemetry.gateFailed("","qa_gate",taskId,evidenceIncompleteReason?"Missing gates: evidence incomplete":"Missing state: tests_run or complete"),reviewerGateDecision(taskId,sessionID,{blocked:!0,reason:finalReason},"required_gates_missing","block")}catch{return reviewerGateDecision(taskId,sessionID,{blocked:!1,reason:""},"inspection_error","fallback")}}async function checkReviewerGateWithScope(taskId,workingDirectory,sessionID,fallbackDir){let result=checkReviewerGate(taskId,workingDirectory,!0,sessionID,fallbackDir),scopeWarning=await validateDiffScope(taskId,workingDirectory).catch(()=>null);if(!scopeWarning)return result;return{...result,reason:result.reason?`${result.reason}
6297
- ${scopeWarning}`:scopeWarning}}function recoverTaskStateFromDelegations(taskId,directory){let hasReviewer=!1,hasTestEngineer=!1;for(let[sessionId,chain]of swarmState.delegationChains){let session=swarmState.agentSessions.get(sessionId);if(session&&(session.currentTaskId===taskId||session.lastCoderDelegationTaskId===taskId))for(let delegation of chain){let target=stripKnownSwarmPrefix(delegation.to);if(target==="reviewer")hasReviewer=!0;if(target==="test_engineer")hasTestEngineer=!0}}let hasDurableIncompleteGates=!1;if(directory)try{let taskEvidence=readTaskEvidenceRaw(directory,taskId);if(taskEvidence?.gates&&Array.isArray(taskEvidence.required_gates)&&taskEvidence.required_gates.length>0){let gates=taskEvidence.gates;hasDurableIncompleteGates=taskEvidence.required_gates.some((g)=>gates[g]==null)}}catch{hasDurableIncompleteGates=!0}if(!hasDurableIncompleteGates&&(!hasReviewer||!hasTestEngineer))for(let[sessionId,chain]of swarmState.delegationChains){if(chain.some((d)=>stripKnownSwarmPrefix(d.to)==="coder"))continue;let chainSession=swarmState.agentSessions.get(sessionId);if(chainSession){let chainTaskId=chainSession.currentTaskId||chainSession.lastCoderDelegationTaskId;if(chainTaskId&&chainTaskId!==taskId)continue}for(let delegation of chain){let target=stripKnownSwarmPrefix(delegation.to);if(target==="reviewer")hasReviewer=!0;if(target==="test_engineer")hasTestEngineer=!0}}if((!hasReviewer||!hasTestEngineer)&&directory)try{let evidence=readTaskEvidenceRaw(directory,taskId);if(evidence?.gates&&Array.isArray(evidence.required_gates)){if(evidence.gates.reviewer!=null)hasReviewer=!0;if(evidence.gates.test_engineer!=null)hasTestEngineer=!0}}catch{}if(!hasReviewer&&!hasTestEngineer)return;if(swarmState.agentSessions.size===0)try{startAgentSession("recovery-session","architect")}catch{}for(let[,session]of swarmState.agentSessions){if(!(session.taskWorkflowStates instanceof Map))continue;let currentState=getTaskState(session,taskId);if(currentState==="tests_run"||currentState==="complete")continue;if(hasReviewer&&currentState==="idle")try{advanceTaskState(session,taskId,"coder_delegated")}catch{}if(hasReviewer)recordStageBCompletion(session,taskId,"reviewer");if(hasTestEngineer)recordStageBCompletion(session,taskId,"test_engineer");if(hasReviewer){let stateNow=getTaskState(session,taskId);if(stateNow==="coder_delegated"||stateNow==="pre_check_passed")try{advanceTaskState(session,taskId,"reviewer_run")}catch{}}if(hasTestEngineer){if(getTaskState(session,taskId)==="reviewer_run")try{advanceTaskState(session,taskId,"tests_run")}catch{}}}}function checkCouncilGate(workingDirectory,taskId){let councilEnabled=!1,effectiveMinimum=3;try{let config3=loadPluginConfig(workingDirectory);councilEnabled=config3.council?.enabled===!0,effectiveMinimum=config3.council?.requireAllMembers?5:config3.council?.minimumMembers??3}catch{return{blocked:!1,reason:"",active:!1}}if(!councilEnabled)return{blocked:!1,reason:"",active:!1};try{let planPath=path258.join(workingDirectory,".swarm","plan.json"),planRaw=fs161.readFileSync(planPath,"utf-8"),planObj=JSON.parse(planRaw);if(planObj.swarm&&planObj.title){let planId=derivePlanId(planObj),profile=getProfile(workingDirectory,planId);if(!profile||!profile.gates.council_mode)return{blocked:!1,reason:"",active:!1}}}catch{return{blocked:!1,reason:"",active:!1}}let evidence;try{evidence=readTaskEvidenceRaw(workingDirectory,taskId)}catch{return{blocked:!0,reason:"council gate required but not yet run — architect must call submit_council_verdicts before advancing this task",active:!0}}let councilGate=evidence?.gates?.council;if(!councilGate)return{blocked:!0,reason:"council gate required but not yet run — architect must call submit_council_verdicts before advancing this task",active:!0};if(councilGate.verdict==="REJECT")return{blocked:!0,reason:"council gate blocked advancement — resolve requiredFixes and re-run submit_council_verdicts",active:!0};let rawQuorumSize=councilGate.quorumSize,quorumSize=typeof rawQuorumSize==="number"&&Number.isFinite(rawQuorumSize)&&rawQuorumSize>=1?rawQuorumSize:1;if(quorumSize<effectiveMinimum)return{blocked:!0,reason:`council gate blocked advancement — recorded verdict has insufficient quorum (${quorumSize} of ${effectiveMinimum} required members). Re-run submit_council_verdicts with the missing council members.`,active:!0};return{blocked:!1,reason:"",active:!0}}async function executeUpdateTaskStatus(args2,fallbackDir,ctx){let statusError=validateStatus(args2.status);if(statusError)return{success:!1,message:"Validation failed",errors:[statusError]};let taskIdError=validateTaskId(args2.task_id);if(taskIdError)return{success:!1,message:"Validation failed",errors:[taskIdError]};let directory,resolveResult=_internals167.resolveWorkingDirectory(args2.working_directory,fallbackDir);if(!resolveResult.success)return{success:!1,message:resolveResult.message,errors:[resolveResult.message]};directory=resolveResult.directory;let planPath=path258.join(directory,".swarm","plan.json");if(!fs161.existsSync(planPath))return{success:!1,message:`Invalid working_directory: plan not found in "${directory}"`,errors:[`Invalid working_directory: plan not found in "${directory}"`]};if(fallbackDir&&directory!==fallbackDir){let canonicalDir=fs161.realpathSync(path258.resolve(directory)),canonicalRoot=fs161.realpathSync(path258.resolve(fallbackDir));if(canonicalDir.startsWith(canonicalRoot+path258.sep))return{success:!1,message:`Invalid working_directory: "${directory}" is a subdirectory of the project root "${fallbackDir}". Pass the project root path or omit working_directory entirely.`,errors:[`Subdirectory rejected: use project root "${fallbackDir}" instead`]}}let loadedPlan=null;try{loadedPlan=await _internals167.loadPlan(directory)}catch{loadedPlan=null}if(loadedPlan?._ledgerReplayStale===!0){let staleReason=loadedPlan._ledgerReplayStaleReason??"plan.json is stale relative to the authoritative ledger (.swarm/plan-ledger.jsonl)";return{success:!1,message:`Task status update refused: plan.json is stale relative to the ledger (ledger replay failed). ${staleReason}`,errors:[staleReason],recovery_guidance:"Plan state could not be reconciled with the authoritative ledger (.swarm/plan-ledger.jsonl). Restore from a critic-approved snapshot or re-run plan recovery to rebuild plan.json from the ledger, then retry update_task_status."}}if(args2.status==="in_progress"&&args2.force!==!0){let currentTask=loadedPlan?.phases.flatMap((p)=>p.tasks).find((t)=>t.id===args2.task_id);if(currentTask&&currentTask.status!=="pending"&&currentTask.status!=="in_progress")return{success:!1,message:`Task ${args2.task_id} is settled (${currentTask.status}); cannot re-open to in_progress. Use force:true only for manual repair.`,errors:[`Task ${args2.task_id} is settled (${currentTask.status}); cannot re-open to in_progress. Use force:true only for manual repair.`]}}if(args2.status==="in_progress"&&args2.force===!0)log(`[update-task-status] Force-override: re-opening settled task ${args2.task_id} to in_progress`);if(args2.status==="in_progress")for(let[_sessionId,session]of swarmState.agentSessions){if(getTaskState(session,args2.task_id)==="idle")try{advanceTaskState(session,args2.task_id,"coder_delegated")}catch{}session.currentTaskId=args2.task_id}if(args2.status==="in_progress")try{let evidencePath=path258.join(directory,".swarm","evidence",`${args2.task_id}.json`);fs161.mkdirSync(path258.dirname(evidencePath),{recursive:!0});let fd=fs161.openSync(evidencePath,"wx"),writeOk=!1;try{fs161.writeSync(fd,JSON.stringify({taskId:args2.task_id,required_gates:[],gates:{}},null,2)),writeOk=!0}finally{if(fs161.closeSync(fd),!writeOk)try{fs161.unlinkSync(evidencePath)}catch{}}}catch{}if(args2.status==="completed"){recoverTaskStateFromDelegations(args2.task_id,directory);let phaseRequiresReviewer=!0;try{let planPath2=path258.join(directory,".swarm","plan.json"),planRaw=fs161.readFileSync(planPath2,"utf-8"),taskPhase=JSON.parse(planRaw).phases.find((p)=>p.tasks.some((t)=>t.id===args2.task_id));if(taskPhase?.required_agents&&!taskPhase.required_agents.includes("reviewer"))phaseRequiresReviewer=!1}catch{}let councilCheck=checkCouncilGate(directory,args2.task_id);if(councilCheck.blocked)return{success:!1,message:"Gate check failed: council gate not yet satisfied for task "+args2.task_id,errors:[councilCheck.reason]};if(phaseRequiresReviewer&&!councilCheck.active){let reviewerCheck=await checkReviewerGateWithScope(args2.task_id,directory,ctx?.sessionID,fallbackDir);if(reviewerCheck.blocked)return{success:!1,message:"Gate check failed: required QA gates not yet satisfied for task "+args2.task_id,errors:[reviewerCheck.reason]}}}let lockTaskId=`update-task-status-${args2.task_id}-${Date.now()}`,planFilePath="plan.json",agentName="update-task-status";for(let[,agent]of swarmState.activeAgent){agentName=agent;break}let lockResult;try{lockResult=await _internals167.tryAcquireLock(directory,planFilePath,agentName,lockTaskId)}catch(error93){return{success:!1,message:"Failed to acquire lock for task status update",errors:[error93 instanceof Error?error93.message:String(error93)]}}if(!lockResult.acquired)return{success:!1,message:`Task status write blocked: plan.json is locked by ${lockResult.existing?.agent??"another agent"} (task: ${lockResult.existing?.taskId??"unknown"})`,errors:["Concurrent plan write detected — retry after the current write completes"],recovery_guidance:"Wait a moment and retry update_task_status. The lock will expire automatically if the holding agent fails."};try{let updatedPlan=await _internals167.updateTaskStatus(directory,args2.task_id,args2.status,{force:args2.force});if(args2.status==="completed")for(let[_sessionId,session]of swarmState.agentSessions){if(!(session.taskWorkflowStates instanceof Map))continue;if(getTaskState(session,args2.task_id)==="tests_run")try{advanceTaskState(session,args2.task_id,"complete")}catch{}}return{success:!0,message:"Task status updated successfully",task_id:args2.task_id,new_status:args2.status,current_phase:updatedPlan.current_phase}}catch(error93){return{success:!1,message:"Failed to update task status",errors:[error93 instanceof Error?error93.message:String(error93)]}}finally{if(lockResult?.acquired&&lockResult.lock._release)try{await lockResult.lock._release()}catch(releaseError){log("[update-task-status] Lock release failed:",releaseError)}}}var update_task_status=createSwarmTool({description:"Update the status of a specific task in the implementation plan. Task status can be one of: pending, in_progress, completed, blocked.",args:{task_id:exports_external.string().min(1).regex(/^\d+\.\d+(\.\d+)*$/,"Task ID must be in N.M or N.M.P format").describe('Task ID in N.M format, e.g. "1.1", "1.2.3"'),status:exports_external.enum(["pending","in_progress","completed","blocked"]).describe("New status for the task: pending, in_progress, completed, or blocked"),working_directory:exports_external.string().optional().describe("Working directory where the plan is located"),force:exports_external.boolean().optional().default(!1).describe("Force override to permit re-opening a settled task (completed/blocked/failed) to in_progress. Use only for manual repair.")},execute:async(args2,_directory,_ctx)=>{return JSON.stringify(await executeUpdateTaskStatus(args2,_directory,_ctx),null,2)}});init_zod();init_loader();import{lookup}from"node:dns/promises";import*as http from"node:http";import*as https from"node:https";import{isIP}from"node:net";import{Readable}from"node:stream";import*as zlib from"node:zlib";init_utils2();init_redaction();import{createHash as createHash37}from"node:crypto";import{appendFile as appendFile22,mkdir as mkdir50}from"node:fs/promises";import*as path259 from"node:path";var EVIDENCE_CACHE_FILE2="evidence-cache/documents.jsonl",MAX_EVIDENCE_TEXT_LENGTH=4000;async function writeEvidenceDocuments(directory,inputs,now=()=>new Date){let filePath=validateSwarmPath(directory,EVIDENCE_CACHE_FILE2),capturedAt=now().toISOString(),records=inputs.map((input)=>createEvidenceDocumentRecord(input,capturedAt)).filter((record3)=>record3!==null);if(records.length>0)await mkdir50(path259.dirname(filePath),{recursive:!0}),await appendFile22(filePath,`${records.map((record3)=>JSON.stringify(record3)).join(`
6314
+ ${scopeWarning}`:scopeWarning}}function recoverTaskStateFromDelegations(taskId,directory){let hasReviewer=!1,hasTestEngineer=!1;for(let[sessionId,chain]of swarmState.delegationChains){let session=swarmState.agentSessions.get(sessionId);if(session&&(session.currentTaskId===taskId||session.lastCoderDelegationTaskId===taskId))for(let delegation of chain){let target=stripKnownSwarmPrefix(delegation.to);if(target==="reviewer")hasReviewer=!0;if(target==="test_engineer")hasTestEngineer=!0}}let hasDurableIncompleteGates=!1;if(directory)try{let taskEvidence=readTaskEvidenceRaw(directory,taskId);if(taskEvidence?.gates&&Array.isArray(taskEvidence.required_gates)&&taskEvidence.required_gates.length>0){let gates=taskEvidence.gates;hasDurableIncompleteGates=taskEvidence.required_gates.some((g)=>gates[g]==null)}}catch{hasDurableIncompleteGates=!0}if(!hasDurableIncompleteGates&&(!hasReviewer||!hasTestEngineer))for(let[sessionId,chain]of swarmState.delegationChains){if(chain.some((d)=>stripKnownSwarmPrefix(d.to)==="coder"))continue;let chainSession=swarmState.agentSessions.get(sessionId);if(chainSession){let chainTaskId=chainSession.currentTaskId||chainSession.lastCoderDelegationTaskId;if(chainTaskId&&chainTaskId!==taskId)continue}for(let delegation of chain){let target=stripKnownSwarmPrefix(delegation.to);if(target==="reviewer")hasReviewer=!0;if(target==="test_engineer")hasTestEngineer=!0}}if((!hasReviewer||!hasTestEngineer)&&directory)try{let evidence=readTaskEvidenceRaw(directory,taskId);if(evidence?.gates&&Array.isArray(evidence.required_gates)){if(evidence.gates.reviewer!=null)hasReviewer=!0;if(evidence.gates.test_engineer!=null)hasTestEngineer=!0}}catch{}if(!hasReviewer&&!hasTestEngineer)return;if(swarmState.agentSessions.size===0)try{startAgentSession("recovery-session","architect")}catch{}for(let[,session]of swarmState.agentSessions){if(!(session.taskWorkflowStates instanceof Map))continue;let currentState=getTaskState(session,taskId);if(currentState==="tests_run"||currentState==="complete")continue;if(hasReviewer&&currentState==="idle")try{advanceTaskState(session,taskId,"coder_delegated")}catch{}if(hasReviewer)recordStageBCompletion(session,taskId,"reviewer");if(hasTestEngineer)recordStageBCompletion(session,taskId,"test_engineer");if(hasReviewer){let stateNow=getTaskState(session,taskId);if(stateNow==="coder_delegated"||stateNow==="pre_check_passed")try{advanceTaskState(session,taskId,"reviewer_run")}catch{}}if(hasTestEngineer){if(getTaskState(session,taskId)==="reviewer_run")try{advanceTaskState(session,taskId,"tests_run")}catch{}}}}function checkCouncilGate(workingDirectory,taskId){let councilEnabled=!1,effectiveMinimum=3;try{let config3=loadPluginConfig(workingDirectory);councilEnabled=config3.council?.enabled===!0,effectiveMinimum=config3.council?.requireAllMembers?5:config3.council?.minimumMembers??3}catch{return{blocked:!1,reason:"",active:!1}}if(!councilEnabled)return{blocked:!1,reason:"",active:!1};try{let planPath=path258.join(workingDirectory,".swarm","plan.json"),planRaw=fs161.readFileSync(planPath,"utf-8"),planObj=JSON.parse(planRaw);if(planObj.swarm&&planObj.title){let planId=derivePlanId(planObj),profile=getProfile(workingDirectory,planId);if(!profile||!profile.gates.council_mode)return{blocked:!1,reason:"",active:!1}}}catch{return{blocked:!1,reason:"",active:!1}}let evidence;try{evidence=readTaskEvidenceRaw(workingDirectory,taskId)}catch{return{blocked:!0,reason:"council gate required but not yet run — architect must call submit_council_verdicts before advancing this task",active:!0}}let councilGate=evidence?.gates?.council;if(!councilGate)return{blocked:!0,reason:"council gate required but not yet run — architect must call submit_council_verdicts before advancing this task",active:!0};if(councilGate.verdict==="REJECT")return{blocked:!0,reason:"council gate blocked advancement — resolve requiredFixes and re-run submit_council_verdicts",active:!0};let rawQuorumSize=councilGate.quorumSize,quorumSize=typeof rawQuorumSize==="number"&&Number.isFinite(rawQuorumSize)&&rawQuorumSize>=1?rawQuorumSize:1;if(quorumSize<effectiveMinimum)return{blocked:!0,reason:`council gate blocked advancement — recorded verdict has insufficient quorum (${quorumSize} of ${effectiveMinimum} required members). Re-run submit_council_verdicts with the missing council members.`,active:!0};return{blocked:!1,reason:"",active:!0}}async function executeUpdateTaskStatus(args2,fallbackDir,ctx){let statusError=validateStatus(args2.status);if(statusError)return{success:!1,message:"Validation failed",errors:[statusError]};let taskIdError=validateTaskId(args2.task_id);if(taskIdError)return{success:!1,message:"Validation failed",errors:[taskIdError]};let directory,resolveResult=_internals167.resolveWorkingDirectory(args2.working_directory,fallbackDir);if(!resolveResult.success)return{success:!1,message:resolveResult.message,errors:[resolveResult.message]};directory=resolveResult.directory;let planPath=path258.join(directory,".swarm","plan.json");if(!fs161.existsSync(planPath))return{success:!1,message:`Invalid working_directory: plan not found in "${directory}"`,errors:[`Invalid working_directory: plan not found in "${directory}"`]};if(fallbackDir&&directory!==fallbackDir){let canonicalDir=fs161.realpathSync(path258.resolve(directory)),canonicalRoot=fs161.realpathSync(path258.resolve(fallbackDir));if(canonicalDir.startsWith(canonicalRoot+path258.sep))return{success:!1,message:`Invalid working_directory: "${directory}" is a subdirectory of the project root "${fallbackDir}". Pass the project root path or omit working_directory entirely.`,errors:[`Subdirectory rejected: use project root "${fallbackDir}" instead`]}}let loadedPlan=null;try{loadedPlan=await _internals167.loadPlan(directory)}catch{loadedPlan=null}if(loadedPlan?._ledgerReplayStale===!0){let staleReason=loadedPlan._ledgerReplayStaleReason??"plan.json is stale relative to the authoritative ledger (.swarm/plan-ledger.jsonl)";return{success:!1,message:`Task status update refused: plan.json is stale relative to the ledger (ledger replay failed). ${staleReason}`,errors:[staleReason],recovery_guidance:"Plan state could not be reconciled with the authoritative ledger (.swarm/plan-ledger.jsonl). Restore from a critic-approved snapshot or re-run plan recovery to rebuild plan.json from the ledger, then retry update_task_status."}}if(args2.status==="in_progress"&&args2.force!==!0){let currentTask=loadedPlan?.phases.flatMap((p)=>p.tasks).find((t)=>t.id===args2.task_id);if(currentTask&&currentTask.status!=="pending"&&currentTask.status!=="in_progress")return{success:!1,message:`Task ${args2.task_id} is settled (${currentTask.status}); cannot re-open to in_progress. Use force:true only for manual repair.`,errors:[`Task ${args2.task_id} is settled (${currentTask.status}); cannot re-open to in_progress. Use force:true only for manual repair.`]}}if(args2.status==="in_progress"&&args2.force===!0)log(`[update-task-status] Force-override: re-opening settled task ${args2.task_id} to in_progress`);if(args2.status==="in_progress")for(let[_sessionId,session]of swarmState.agentSessions){if(getTaskState(session,args2.task_id)==="idle")try{advanceTaskState(session,args2.task_id,"coder_delegated")}catch{}session.currentTaskId=args2.task_id}if(args2.status==="in_progress")try{let evidencePath=path258.join(directory,".swarm","evidence",`${args2.task_id}.json`);fs161.mkdirSync(path258.dirname(evidencePath),{recursive:!0});let fd=fs161.openSync(evidencePath,"wx"),writeOk=!1;try{fs161.writeSync(fd,JSON.stringify({taskId:args2.task_id,required_gates:[],gates:{}},null,2)),writeOk=!0}finally{if(fs161.closeSync(fd),!writeOk)try{fs161.unlinkSync(evidencePath)}catch{}}}catch{}if(args2.status==="completed"){recoverTaskStateFromDelegations(args2.task_id,directory);let phaseRequiresReviewer=!0;try{let planPath2=path258.join(directory,".swarm","plan.json"),planRaw=fs161.readFileSync(planPath2,"utf-8"),taskPhase=JSON.parse(planRaw).phases.find((p)=>p.tasks.some((t)=>t.id===args2.task_id));if(taskPhase?.required_agents&&!taskPhase.required_agents.includes("reviewer"))phaseRequiresReviewer=!1}catch{}let councilCheck=checkCouncilGate(directory,args2.task_id);if(councilCheck.blocked)return{success:!1,message:"Gate check failed: council gate not yet satisfied for task "+args2.task_id,errors:[councilCheck.reason]};if(phaseRequiresReviewer&&!councilCheck.active){let reviewerCheck=await checkReviewerGateWithScope(args2.task_id,directory,ctx?.sessionID,fallbackDir);if(reviewerCheck.blocked)return{success:!1,message:"Gate check failed: required QA gates not yet satisfied for task "+args2.task_id,errors:[reviewerCheck.reason]}}}let lockTaskId=`update-task-status-${args2.task_id}-${Date.now()}`,planFilePath="plan.json",agentName="update-task-status";for(let[,agent]of swarmState.activeAgent){agentName=agent;break}let lockResult;try{lockResult=await _internals167.tryAcquireLock(directory,planFilePath,agentName,lockTaskId)}catch(error93){return{success:!1,message:"Failed to acquire lock for task status update",errors:[error93 instanceof Error?error93.message:String(error93)]}}if(!lockResult.acquired)return{success:!1,message:`Task status write blocked: plan.json is locked by ${lockResult.existing?.agent??"another agent"} (task: ${lockResult.existing?.taskId??"unknown"})`,errors:["Concurrent plan write detected — retry after the current write completes"],recovery_guidance:"Wait a moment and retry update_task_status. The lock will expire automatically if the holding agent fails."};try{let updatedPlan=await _internals167.updateTaskStatus(directory,args2.task_id,args2.status,{force:args2.force});if(args2.status==="completed")for(let[_sessionId,session]of swarmState.agentSessions){if(!(session.taskWorkflowStates instanceof Map))continue;if(getTaskState(session,args2.task_id)==="tests_run")try{advanceTaskState(session,args2.task_id,"complete")}catch{}}return{success:!0,message:"Task status updated successfully",task_id:args2.task_id,new_status:args2.status,current_phase:updatedPlan.current_phase}}catch(error93){return{success:!1,message:"Failed to update task status",errors:[error93 instanceof Error?error93.message:String(error93)]}}finally{if(lockResult?.acquired&&lockResult.lock._release)try{await lockResult.lock._release()}catch(releaseError){log("[update-task-status] Lock release failed:",releaseError)}}}var update_task_status=createSwarmTool({description:"Update the status of a specific task in the implementation plan. Task status can be one of: pending, in_progress, completed, blocked.",args:{task_id:exports_external.string().min(1).regex(/^\d+\.\d+(\.\d+)*$/,"Task ID must be in N.M or N.M.P format").describe('Task ID in N.M format, e.g. "1.1", "1.2.3"'),status:exports_external.enum(["pending","in_progress","completed","blocked"]).describe("New status for the task: pending, in_progress, completed, or blocked"),working_directory:exports_external.string().optional().describe("Working directory where the plan is located"),force:exports_external.boolean().optional().default(!1).describe("Force override to permit re-opening a settled task (completed/blocked/failed) to in_progress. Use only for manual repair.")},execute:async(args2,_directory,_ctx)=>{return JSON.stringify(await executeUpdateTaskStatus(args2,_directory,_ctx),null,2)}});init_zod();init_loader();import{lookup}from"node:dns/promises";import*as http from"node:http";import*as https from"node:https";import{isIP}from"node:net";import{Readable}from"node:stream";import*as zlib from"node:zlib";init_utils2();init_redaction();import{createHash as createHash37}from"node:crypto";import{appendFile as appendFile23,mkdir as mkdir50}from"node:fs/promises";import*as path259 from"node:path";var EVIDENCE_CACHE_FILE2="evidence-cache/documents.jsonl",MAX_EVIDENCE_TEXT_LENGTH=4000;async function writeEvidenceDocuments(directory,inputs,now=()=>new Date){let filePath=validateSwarmPath(directory,EVIDENCE_CACHE_FILE2),capturedAt=now().toISOString(),records=inputs.map((input)=>createEvidenceDocumentRecord(input,capturedAt)).filter((record3)=>record3!==null);if(records.length>0)await mkdir50(path259.dirname(filePath),{recursive:!0}),await appendFile23(filePath,`${records.map((record3)=>JSON.stringify(record3)).join(`
6298
6315
  `)}
6299
6316
  `,"utf-8");return{path:".swarm/evidence-cache/documents.jsonl",records,refs:records.map((record3)=>record3.ref)}}function createEvidenceDocumentRecord(input,defaultCapturedAt){let text=normalizeEvidenceText(input.text??input.snippet??"");if(!text)return null;let capturedAt=input.capturedAt??defaultCapturedAt,base={sourceType:input.sourceType,query:normalizeOptional(input.query),title:normalizeOptional(input.title),url:normalizeOptional(input.url),text},id=createEvidenceDocumentId(base);return{id,ref:`evidence-cache:${id}`,...base,capturedAt,createdBy:normalizeOptional(input.createdBy),metadata:input.metadata??{}}}function createEvidenceDocumentId(input){return`evd_${createHash37("sha256").update([input.sourceType,input.query??"",input.title??"",input.url??"",input.text].join(`
6300
6317
  `)).digest("hex").slice(0,16)}`}function normalizeEvidenceText(text){let normalized=redactSecrets(text.replace(/\s+/g," ").trim());return truncateEvidenceText(normalized,MAX_EVIDENCE_TEXT_LENGTH)}function truncateEvidenceText(text,maxLength){if(text.length<=maxLength)return text;let truncated=text.slice(0,maxLength),lastPlaceholderStart=truncated.lastIndexOf("[REDACTED:"),lastPlaceholderEnd=truncated.lastIndexOf("]");if(lastPlaceholderStart>lastPlaceholderEnd)return truncated.slice(0,lastPlaceholderStart).trimEnd();return truncated}function normalizeOptional(value){let normalized=value?.replace(/\s+/g," ").trim();return normalized?redactSecrets(normalized):void 0}init_create_tool();init_resolve_working_directory();var DEFAULT_MAX_BYTES=1e6,MAX_BYTES_HARD_CAP=5000000,DEFAULT_TIMEOUT_MS5=15000,MAX_TIMEOUT_MS3=30000,MAX_REDIRECTS=5,MAX_TEXT_LENGTH2=50000,ArgsSchema6=exports_external.object({url:exports_external.string().min(1).max(2048),max_bytes:exports_external.number().int().min(1024).max(MAX_BYTES_HARD_CAP).optional(),timeout_ms:exports_external.number().int().min(1000).max(MAX_TIMEOUT_MS3).optional(),working_directory:exports_external.string().optional()});function isBlockedAddress(address){let family=isIP(address);if(family===4)return isBlockedIPv4(address);if(family===6)return isBlockedIPv6(address);return!0}function isBlockedIPv4(address){let parts=address.split(".");if(parts.length!==4)return!0;let octets=parts.map((p)=>Number(p));if(octets.some((o)=>!Number.isInteger(o)||o<0||o>255))return!0;let[a,b]=octets;if(a===0)return!0;if(a===10)return!0;if(a===127)return!0;if(a===169&&b===254)return!0;if(a===172&&b>=16&&b<=31)return!0;if(a===192&&b===168)return!0;if(a===100&&b>=64&&b<=127)return!0;if(a===198&&(b===18||b===19))return!0;if(a===192&&b===0&&octets[2]===0)return!0;if(a===192&&b===0&&octets[2]===2)return!0;if(a===198&&b===51&&octets[2]===100)return!0;if(a===203&&b===0&&octets[2]===113)return!0;if(a===192&&b===88&&octets[2]===99)return!0;if(a>=224)return!0;return!1}function expandIPv6(input){let s=input.toLowerCase().split("%")[0];if(!s)return null;if(s.includes(".")){let colon=s.lastIndexOf(":");if(colon===-1)return null;let v4=s.slice(colon+1).split(".");if(v4.length!==4)return null;let o=v4.map((p)=>Number(p));if(o.some((n)=>!Number.isInteger(n)||n<0||n>255))return null;let h1=(o[0]<<8|o[1]).toString(16),h2=(o[2]<<8|o[3]).toString(16);s=`${s.slice(0,colon+1)}${h1}:${h2}`}let halves=s.split("::");if(halves.length>2)return null;let parseGroups=(part)=>{if(part==="")return[];let groups=part.split(":"),out=[];for(let g of groups){if(!/^[0-9a-f]{1,4}$/.test(g))return null;out.push(Number.parseInt(g,16))}return out},head2=parseGroups(halves[0]);if(head2===null)return null;if(halves.length===2){let tail2=parseGroups(halves[1]);if(tail2===null)return null;let missing=8-head2.length-tail2.length;if(missing<1)return null;return[...head2,...Array(missing).fill(0),...tail2]}return head2.length===8?head2:null}function isBlockedIPv6(raw){let h=expandIPv6(raw);if(!h)return!0;if(h.every((x)=>x===0))return!0;if(h.slice(0,7).every((x)=>x===0)&&h[7]===1)return!0;let mappedV4=h.slice(0,5).every((x)=>x===0)&&h[5]===65535,compatV4=h.slice(0,6).every((x)=>x===0)&&!(h[6]===0&&h[7]<=1);if(mappedV4||compatV4){let v4=`${h[6]>>8}.${h[6]&255}.${h[7]>>8}.${h[7]&255}`;return isBlockedIPv4(v4)}let first=h[0];if(first>=64512&&first<=65023)return!0;if(first>=65152&&first<=65215)return!0;if(first>=65280)return!0;return!1}async function validateFetchUrl(candidate,dnsLookup){let url3;try{url3=new URL(candidate)}catch{return{ok:!1,reason:"invalid_url",message:`Not a valid URL: ${candidate}`}}if(url3.protocol!=="http:"&&url3.protocol!=="https:")return{ok:!1,reason:"blocked_scheme",message:`Only http and https URLs are allowed (got "${url3.protocol}").`};let host=url3.hostname.replace(/^\[|\]$/g,"");if(isIP(host)){if(isBlockedAddress(host))return{ok:!1,reason:"blocked_host",message:`Refusing to fetch a private, loopback, or reserved address: ${host}`};return{ok:!0,url:url3,address:host}}let resolved;try{resolved=await dnsLookup(host,{all:!0})}catch(err2){return{ok:!1,reason:"dns_failure",message:`Could not resolve host "${host}": ${err2 instanceof Error?err2.message:String(err2)}`}}if(resolved.length===0)return{ok:!1,reason:"dns_failure",message:`Host "${host}" resolved to no addresses.`};for(let{address}of resolved)if(isBlockedAddress(address))return{ok:!1,reason:"blocked_host",message:`Host "${host}" resolves to a private, loopback, or reserved address (${address}).`};return{ok:!0,url:url3,address:resolved[0].address}}function isAllowedContentType(contentType){if(!contentType)return!0;let type=contentType.split(";")[0].trim().toLowerCase();if(type.startsWith("text/"))return!0;if(type==="application/json"||type==="application/xml")return!0;if(type==="application/xhtml+xml"||type.endsWith("+json")||type.endsWith("+xml"))return!0;return!1}function extractTitle(html){let lower=html.toLowerCase(),start=lower.indexOf("<title");if(start===-1)return;let tagEnd=lower.indexOf(">",start);if(tagEnd===-1)return;let contentStart=tagEnd+1,end=lower.indexOf("</title",contentStart);if(end===-1)return;let content=html.slice(contentStart,end);return decodeEntities(content.replace(/\s+/g," ").trim())||void 0}var NAMED_ENTITIES={amp:"&",lt:"<",gt:">",quot:'"',apos:"'",nbsp:" ","#39":"'"};function decodeEntities(text){return text.replace(/&(#x?[0-9a-f]+|[a-z]+);/gi,(whole,body)=>{let key=body.toLowerCase();if(key in NAMED_ENTITIES)return NAMED_ENTITIES[key];if(body.startsWith("#x")||body.startsWith("#X")){let code=Number.parseInt(body.slice(2),16);return Number.isFinite(code)?safeFromCodePoint(code):whole}if(body.startsWith("#")){let code=Number.parseInt(body.slice(1),10);return Number.isFinite(code)?safeFromCodePoint(code):whole}return whole})}function safeFromCodePoint(code){try{return String.fromCodePoint(code)}catch{return""}}function stripSpans(input,open5,close){let lower=input.toLowerCase(),out="",i=0;while(i<input.length){let start=lower.indexOf(open5,i);if(start===-1){out+=input.slice(i);break}out+=input.slice(i,start);let end=lower.indexOf(close,start+open5.length);if(end===-1)break;i=end+close.length}return out}function htmlToText(html){let withoutScripts=stripSpans(html,"<script","</script>");withoutScripts=stripSpans(withoutScripts,"<style","</style>"),withoutScripts=stripSpans(withoutScripts,"<noscript","</noscript>"),withoutScripts=stripSpans(withoutScripts,"<!--","-->");let noTags=withoutScripts.replace(/<\/(p|div|li|h[1-6]|tr|section|article|header|footer)>/gi,`
@@ -6304,13 +6321,13 @@ ${scopeWarning}`:scopeWarning}}function recoverTaskStateFromDelegations(taskId,d
6304
6321
 
6305
6322
  `).trim()}function makeAbortError(){try{return new DOMException("The operation was aborted","AbortError")}catch{let err2=Error("The operation was aborted");return err2.name="AbortError",err2}}function performHttpRequest(args2){let{url:url3,pinnedAddress,signal,headers}=args2,isHttps=url3.protocol==="https:",port=url3.port?Number(url3.port):isHttps?443:80,hostNoBrackets=url3.hostname.replace(/^\[|\]$/g,""),useSni=isHttps&&isIP(hostNoBrackets)===0,options={host:pinnedAddress,port,path:`${url3.pathname}${url3.search}`,method:"GET",headers:{Host:url3.host,...headers}};if(useSni)options.servername=url3.hostname;return new Promise((resolve99,reject2)=>{let req,onResponse=(res)=>{let normHeaders={};for(let[key,value]of Object.entries(res.headers))normHeaders[key]=Array.isArray(value)?value[0]:value;res.on("error",()=>{}),resolve99({status:res.statusCode??0,headers:normHeaders,body:res,cancel:()=>req.destroy()})};req=isHttps?https.request(options,onResponse):http.request(options,onResponse);let onAbort=()=>req.destroy(makeAbortError());if(signal.aborted)req.destroy(makeAbortError());else signal.addEventListener("abort",onAbort,{once:!0});req.on("error",reject2),req.end()})}async function boundedFetch(start,maxBytes,timeoutMs,deps){let current=start,controller=new AbortController,timer=setTimeout(()=>controller.abort(),timeoutMs);try{for(let hop=0;hop<=MAX_REDIRECTS;hop++){let raw;try{raw=await deps.httpRequest({url:current.url,pinnedAddress:current.address,signal:controller.signal,headers:{Accept:"text/html,application/xhtml+xml,text/plain,application/json;q=0.9,*/*;q=0.5"}})}catch(err2){if(controller.signal.aborted)return{ok:!1,reason:"timeout",message:`Fetch exceeded ${timeoutMs}ms for ${current.url.toString()}`};return{ok:!1,reason:"network_error",message:err2 instanceof Error?err2.message:String(err2)}}if(raw.status>=300&&raw.status<400){let location=raw.headers.location;if(raw.cancel?.(),!location)return{ok:!1,reason:"bad_redirect",message:`Redirect ${raw.status} with no Location header.`};let next;try{next=new URL(location,current.url)}catch{return{ok:!1,reason:"bad_redirect",message:`Invalid redirect target: ${location}`}}let revalidated=await validateFetchUrl(next.toString(),deps.dnsLookup);if(!revalidated.ok)return revalidated;if(hop===MAX_REDIRECTS)return{ok:!1,reason:"too_many_redirects",message:`Exceeded ${MAX_REDIRECTS} redirect hops.`};current={url:revalidated.url,address:revalidated.address};continue}if(raw.status<200||raw.status>=300)return raw.cancel?.(),{ok:!1,reason:"http_error",message:`HTTP ${raw.status} for ${current.url.toString()}`};let contentType=raw.headers["content-type"]??null;if(!isAllowedContentType(contentType))return raw.cancel?.(),{ok:!1,reason:"unsupported_content_type",message:`Refusing to read non-text content type "${contentType}".`};let activeBody=raw.body;if(raw.body!==null&&raw.body instanceof Readable){let encoding=(raw.headers["content-encoding"]??"").toLowerCase(),decoder=null;if(encoding==="gzip"||encoding==="x-gzip")decoder=raw.body.pipe(zlib.createGunzip());else if(encoding==="deflate")decoder=raw.body.pipe(zlib.createInflate());else if(encoding==="br")decoder=raw.body.pipe(zlib.createBrotliDecompress());if(decoder)decoder.on("error",()=>{}),activeBody=decoder}let body;try{body=await readBounded(activeBody,maxBytes)}catch(err2){if(raw.cancel?.(),controller.signal.aborted)return{ok:!1,reason:"timeout",message:`Fetch exceeded ${timeoutMs}ms while reading the body of ${current.url.toString()}`};return{ok:!1,reason:"network_error",message:err2 instanceof Error?err2.message:String(err2)}}return raw.cancel?.(),{ok:!0,outcome:{status:raw.status,finalUrl:current.url.toString(),contentType,bytes:body.bytes,truncated:body.truncated}}}return{ok:!1,reason:"too_many_redirects",message:`Exceeded ${MAX_REDIRECTS} redirect hops.`}}finally{clearTimeout(timer)}}async function readBounded(body,maxBytes){if(!body)return{bytes:new Uint8Array(0),truncated:!1};let chunks=[],received=0,truncated=!1;for await(let value of body){if(!value||value.byteLength===0)continue;if(chunks.push(value),received+=value.byteLength,received>maxBytes){truncated=!0;break}}let merged=new Uint8Array(Math.min(received,maxBytes)),offset=0;for(let chunk of chunks){if(offset>=merged.length)break;let slice=chunk.subarray(0,merged.length-offset);merged.set(slice,offset),offset+=slice.byteLength}return{bytes:merged,truncated}}var web_fetch=createSwarmTool({description:"Fetch the readable text of a single http(s) URL for architect-driven deep research (MODE: DEEP_RESEARCH). Returns decoded page text (HTML stripped to plain text), the document title, the final URL after redirects, and an evidence reference stored alongside web_search results. Use it to read primary sources that web_search only surfaces as snippets. Config-gated on council.general.enabled; no search API key required. Blocks private/loopback/link-local/metadata addresses (re-validated across redirects), enforces a timeout, and caps the response body size.",args:{url:exports_external.string().min(1).max(2048).describe("Absolute http(s) URL to fetch (1–2048 chars)."),max_bytes:exports_external.number().int().min(1024).max(MAX_BYTES_HARD_CAP).optional().describe(`Max decoded response bytes to read (1024..${MAX_BYTES_HARD_CAP}, default ${DEFAULT_MAX_BYTES}).`),timeout_ms:exports_external.number().int().min(1000).max(MAX_TIMEOUT_MS3).optional().describe(`Request timeout in ms (1000..${MAX_TIMEOUT_MS3}, default ${DEFAULT_TIMEOUT_MS5}).`),working_directory:exports_external.string().optional().describe("Project root for config resolution and evidence storage. Optional.")},execute:async(args2,directory)=>{let parsed=ArgsSchema6.safeParse(args2);if(!parsed.success){let fail={success:!1,reason:"invalid_args",message:parsed.error.issues.map((i)=>`${i.path.join(".")}: ${i.message}`).join("; ")};return JSON.stringify(fail,null,2)}let dirResult=resolveWorkingDirectory(parsed.data.working_directory,directory);if(!dirResult.success){let fail={success:!1,reason:"invalid_working_directory",message:dirResult.message};return JSON.stringify(fail,null,2)}let generalConfig=_internals168.loadPluginConfig(dirResult.directory).council?.general;if(!generalConfig||generalConfig.enabled!==!0)return JSON.stringify({success:!1,reason:"council_general_disabled",message:"web_fetch is disabled - set council.general.enabled: true in the resolved config: global ~/.config/opencode/opencode-swarm.json or project .opencode/opencode-swarm.json."},null,2);let validated=await validateFetchUrl(parsed.data.url,_internals168.dnsLookup);if(!validated.ok){let fail={success:!1,reason:validated.reason,message:validated.message};return JSON.stringify(fail,null,2)}let maxBytes=parsed.data.max_bytes??DEFAULT_MAX_BYTES,timeoutMs=parsed.data.timeout_ms??DEFAULT_TIMEOUT_MS5,result=await boundedFetch({url:validated.url,address:validated.address},maxBytes,timeoutMs,_internals168);if(!result.ok){let fail={success:!1,reason:result.reason,message:result.message};return JSON.stringify(fail,null,2)}let{outcome}=result,raw=new TextDecoder("utf-8",{fatal:!1}).decode(outcome.bytes),isHtml=(outcome.contentType??"").toLowerCase().includes("html")||/<html|<!doctype html/i.test(raw),title=isHtml?extractTitle(raw):void 0,bodyText=isHtml?htmlToText(raw):raw.replace(/\s*\n\s*/g,`
6306
6323
  `).trim(),text=bodyText.length>MAX_TEXT_LENGTH2?`${bodyText.slice(0,MAX_TEXT_LENGTH2)}…`:bodyText,textTruncated=outcome.truncated||bodyText.length>MAX_TEXT_LENGTH2,evidence=await captureFetchEvidence(dirResult.directory,outcome.finalUrl,title,text),ok2={success:!0,url:parsed.data.url,finalUrl:outcome.finalUrl,status:outcome.status,contentType:outcome.contentType??void 0,title,text,truncated:textTruncated,bytesReturned:outcome.bytes.byteLength,evidence};return JSON.stringify(ok2,null,2)}});async function captureFetchEvidence(directory,url3,title,text){try{let written=await _internals168.writeEvidenceDocuments(directory,[{sourceType:"crawl",url:url3,title,text,createdBy:"web_fetch"}]);return{stored:written.records.length>0,ref:written.refs[0],path:written.path}}catch(err2){return{stored:!1,error:err2 instanceof Error?err2.message:String(err2)}}}var _internals168={httpRequest:performHttpRequest,dnsLookup:lookup,loadPluginConfig,writeEvidenceDocuments};init_zod();init_loader();var CURRENT_INTENT_RE=/\b(?:latest|current|currently|today|now|newest|recent|recently|up\s*-?\s*to\s*-?\s*date|this\s+(?:week|month|year)|as\s+of\s+(?:today|now))\b/i,HISTORICAL_INTENT_RE=/\b(?:history|historical|archive|archived|in\s+20\d{2}|during\s+20\d{2}|from\s+20\d{2}|for\s+20\d{2}|as\s+of\s+20\d{2})\b/i;function applySearchQueryPolicy(rawQuery,now=new Date){let originalQuery=rawQuery,query=rawQuery.trim().replace(/\s+/g," "),currentYear=now.getUTCFullYear(),temporalIntent=detectTemporalIntent(query),removedStaleYears=[];if(temporalIntent==="current")query=removeTrailingStaleCutoffYears(query,currentYear,removedStaleYears);return{originalQuery,query,temporalIntent,freshness:temporalIntent==="current"?chooseFreshness(query):void 0,removedStaleYears}}function detectTemporalIntent(query){if(CURRENT_INTENT_RE.test(query))return"current";if(HISTORICAL_INTENT_RE.test(query))return"historical";return"unspecified"}function chooseFreshness(query){if(/\b(?:today|now|as\s+of\s+(?:today|now))\b/i.test(query))return"day";if(/\bthis\s+week\b/i.test(query))return"week";if(/\b(?:recent|recently|this\s+month)\b/i.test(query))return"month";return"year"}function removeTrailingStaleCutoffYears(query,currentYear,removed){return query.replace(/\s+(?:as\s+of\s+)?(20\d{2})\s*$/i,(match,year)=>{if(Number(year)>=currentYear)return match;return removed.push(year),""}).replace(/\s+/g," ").trim()}class WebSearchError extends Error{cause;constructor(message,cause){super(message);this.cause=cause;this.name="WebSearchError"}}class WebSearchConfigError extends Error{constructor(message){super(message);this.name="WebSearchConfigError"}}class TavilyProvider{apiKey;constructor(apiKey){this.apiKey=apiKey}async search(query,maxResults,options={}){let requestBody={api_key:this.apiKey,query,max_results:maxResults,search_depth:"advanced"};if(options.freshness)requestBody.time_range=options.freshness;let response;try{response=await fetch("https://api.tavily.com/search",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(requestBody)})}catch(err2){throw new WebSearchError(`Tavily network error for query "${query}"`,err2)}if(!response.ok)throw new WebSearchError(`Tavily HTTP ${response.status} for query "${query}"`);let body;try{body=await response.json()}catch(err2){throw new WebSearchError("Tavily returned non-JSON response",err2)}let results=body?.results;if(!Array.isArray(results))return[];return results.filter((r)=>typeof r?.title==="string"&&typeof r?.url==="string"&&typeof r?.content==="string").map((r)=>({title:r.title,url:r.url,snippet:r.content,query}))}}class BraveProvider{apiKey;constructor(apiKey){this.apiKey=apiKey}async search(query,maxResults,options={}){let url3=new URL("https://api.search.brave.com/res/v1/web/search");url3.searchParams.set("q",query),url3.searchParams.set("count",String(maxResults));let freshness=toBraveFreshness(options.freshness);if(freshness)url3.searchParams.set("freshness",freshness);let response;try{response=await fetch(url3.toString(),{method:"GET",headers:{"X-Subscription-Token":this.apiKey,Accept:"application/json"}})}catch(err2){throw new WebSearchError(`Brave network error for query "${query}"`,err2)}if(!response.ok)throw new WebSearchError(`Brave HTTP ${response.status} for query "${query}"`);let body;try{body=await response.json()}catch(err2){throw new WebSearchError("Brave returned non-JSON response",err2)}let results=body?.web?.results;if(!Array.isArray(results))return[];return results.filter((r)=>typeof r?.title==="string"&&typeof r?.url==="string"&&typeof r?.description==="string").map((r)=>({title:r.title,url:r.url,snippet:r.description,query}))}}function toBraveFreshness(freshness){switch(freshness){case"day":return"pd";case"week":return"pw";case"month":return"pm";case"year":return"py";default:return}}function resolveApiKey(provider,configKey){if(configKey&&configKey.length>0)return configKey;let envName=provider==="tavily"?"TAVILY_API_KEY":"BRAVE_SEARCH_API_KEY",fromEnv=process.env[envName];return fromEnv&&fromEnv.length>0?fromEnv:void 0}function createWebSearchProvider(config3){let apiKey=resolveApiKey(config3.searchProvider,config3.searchApiKey);if(!apiKey){let envName=config3.searchProvider==="tavily"?"TAVILY_API_KEY":"BRAVE_SEARCH_API_KEY";throw new WebSearchConfigError(`No API key for search provider "${config3.searchProvider}". Set council.general.searchApiKey in the resolved config (global ~/.config/opencode/opencode-swarm.json, project .opencode/opencode-swarm.json override) or export ${envName}.`)}switch(config3.searchProvider){case"tavily":return new TavilyProvider(apiKey);case"brave":return new BraveProvider(apiKey)}}init_create_tool();init_resolve_working_directory();var MAX_RESULTS_HARD_CAP=10,ArgsSchema7=exports_external.object({query:exports_external.string().min(1).max(500),max_results:exports_external.number().int().min(1).max(20).optional(),freshness:exports_external.enum(["auto","none","day","week","month","year"]).default("auto"),working_directory:exports_external.string().optional()}),web_search=createSwarmTool({description:"External web search for architect-driven council research, SME domain research, and skill-improver research. Returns titled results with snippets and URLs. Used by the architect in MODE: COUNCIL to gather a RESEARCH CONTEXT before dispatching council agents and by SME to evaluate external skill/source candidates. Normalizes current-intent queries, strips trailing stale cutoff years, and applies provider freshness filters by default. Requires council.general.enabled and a configured search API key (Tavily or Brave) in the resolved config: global ~/.config/opencode/opencode-swarm.json, then project .opencode/opencode-swarm.json overrides. max_results is capped at 10 with default from council.general.maxSourcesPerMember.",args:{query:exports_external.string().min(1).max(500).describe("Search query string (1–500 characters)."),freshness:exports_external.enum(["auto","none","day","week","month","year"]).optional().describe('Optional freshness filter. Query normalization always runs; "auto" infers provider freshness from current/recency terms, while "none" disables provider freshness filtering.'),max_results:exports_external.number().int().min(1).max(20).optional().describe(`Number of results to request (1–20). Hard-capped at ${MAX_RESULTS_HARD_CAP}. Defaults to council.general.maxSourcesPerMember.`),working_directory:exports_external.string().optional().describe("Project root for config resolution. Optional.")},execute:async(args2,directory)=>{let parsed=ArgsSchema7.safeParse(args2);if(!parsed.success){let fail={success:!1,reason:"invalid_args",message:parsed.error.issues.map((i)=>`${i.path.join(".")}: ${i.message}`).join("; ")};return JSON.stringify(fail,null,2)}let dirResult=resolveWorkingDirectory(parsed.data.working_directory,directory);if(!dirResult.success){let fail={success:!1,reason:"invalid_working_directory",message:dirResult.message};return JSON.stringify(fail,null,2)}let generalConfig=loadPluginConfig(dirResult.directory).council?.general;if(!generalConfig||generalConfig.enabled!==!0)return JSON.stringify({success:!1,reason:"council_general_disabled",message:"web_search is disabled - set council.general.enabled: true in the resolved config: global ~/.config/opencode/opencode-swarm.json or project .opencode/opencode-swarm.json."},null,2);let requested=parsed.data.max_results??generalConfig.maxSourcesPerMember,maxResults=Math.min(requested,MAX_RESULTS_HARD_CAP),policy=applySearchQueryPolicy(parsed.data.query),requestedFreshness=parsed.data.freshness??"auto",freshness=requestedFreshness==="auto"?policy.freshness:requestedFreshness==="none"?void 0:requestedFreshness,provider;try{provider=createWebSearchProvider(generalConfig)}catch(err2){let fail={success:!1,reason:err2 instanceof WebSearchConfigError?"missing_api_key":"provider_init_failed",message:err2 instanceof Error?err2.message:String(err2)};return JSON.stringify(fail,null,2)}try{let results=await provider.search(policy.query,maxResults,{freshness}),evidence=await captureSearchEvidence(dirResult.directory,policy.query,results),scannedResults=results.map(({title,url:url3,snippet})=>{let titleScan=scanExternalContent(title,{trustLevel:"low"}),snippetScan=scanExternalContent(snippet,{trustLevel:"low"}),threatLevel=titleScan.threatLevel==="error"||snippetScan.threatLevel==="error"?"error":titleScan.threatLevel==="warning"||snippetScan.threatLevel==="warning"?"warning":"none";return{title:titleScan.clean?title:titleScan.neutralized,url:url3,snippet:snippetScan.clean?snippet:snippetScan.neutralized,evidenceRef:evidence.refByUrl.get(url3),threatLevel}}),ok2={success:!0,query:policy.query,originalQuery:policy.originalQuery,temporalIntent:policy.temporalIntent,freshness,removedStaleYears:policy.removedStaleYears,totalResults:results.length,results:scannedResults,evidence:{stored:evidence.stored,path:evidence.path,refs:evidence.refs,error:evidence.error}};return JSON.stringify(ok2,null,2)}catch(err2){let fail={success:!1,reason:err2 instanceof WebSearchError?"search_failed":"unknown",message:err2 instanceof Error?err2.message:String(err2)};return JSON.stringify(fail,null,2)}}});async function captureSearchEvidence(directory,query,results){try{let written=await _internals169.writeEvidenceDocuments(directory,results.map((result)=>({sourceType:"web_search",query,title:result.title,url:result.url,snippet:result.snippet,createdBy:"web_search"}))),refByUrl=new Map;for(let record3 of written.records)if(record3.url)refByUrl.set(record3.url,record3.ref);return{stored:written.records.length>0,path:written.path,refs:written.refs,refByUrl}}catch(err2){return{stored:!1,refs:[],refByUrl:new Map,error:err2 instanceof Error?err2.message:String(err2)}}}var _internals169={writeEvidenceDocuments};init_zod();init_loader();init_schema();init_curator_llm_factory();init_knowledge_curator();init_skill_generator();init_schema3();init_store2();init_create_tool();init_resolve_working_directory();import*as path260 from"node:path";var FindingSchema2=exports_external.object({severity:exports_external.enum(["low","medium","high","critical"]),category:exports_external.string().min(1),agents:exports_external.array(exports_external.string().min(1)).default([]),tasks:exports_external.array(exports_external.string().min(1)).default([]),evidence_refs:exports_external.array(exports_external.string().min(1)).default([]),description:exports_external.string().min(1),recommendation:exports_external.string().default("")}),KnowledgeRecommendationSchema2=exports_external.object({lesson:exports_external.string().min(1),target_agents:exports_external.array(exports_external.string().min(1)).default([]),confidence:exports_external.number().min(0).max(1).default(0.5),evidence_refs:exports_external.array(exports_external.string().min(1)).default([])}),ArgsSchema8=exports_external.object({phase:exports_external.number().int().min(0).max(999),verdict:exports_external.enum(["APPROVE","CONCERNS","REJECT"]),findings:exports_external.array(FindingSchema2).default([]),knowledge_recommendations:exports_external.array(KnowledgeRecommendationSchema2).default([]),working_directory:exports_external.string().optional(),provenance_agent_name:exports_external.string().min(1).optional(),provenance_session_id:exports_external.string().min(1).optional()}),write_architecture_supervisor_evidence=createSwarmTool({description:"Persist the architecture supervisor verdict for a phase. PREREQUISITE: dispatch critic_architecture_supervisor as an Agent task with the phase + agent summaries, collect its strict-JSON verdict (verdict/findings/knowledge_recommendations), then call this tool with those values. Writes .swarm/evidence/{phase}/"+"architecture-supervisor.json. This tool persists only — it does not contact the "+"supervisor. Architect-only; config-gated via architectural_supervision.enabled.",args:{phase:exports_external.number().int().min(0).max(999).describe("Phase number being reviewed."),verdict:exports_external.enum(["APPROVE","CONCERNS","REJECT"]).describe("Supervisor verdict."),findings:exports_external.array(FindingSchema2).optional().describe("System-level findings from the supervisor."),knowledge_recommendations:exports_external.array(KnowledgeRecommendationSchema2).optional().describe("Durable lessons proposed by the supervisor."),working_directory:exports_external.string().optional(),provenance_agent_name:exports_external.string().min(1).optional().describe("Agent name that produced this evidence (optional provenance)."),provenance_session_id:exports_external.string().min(1).optional().describe("Session ID of the agent that produced this evidence (optional provenance).")},execute:async(rawArgs,directory)=>{let parsed=ArgsSchema8.safeParse(rawArgs);if(!parsed.success)return JSON.stringify({success:!1,reason:"invalid arguments",errors:parsed.error.issues.map((i)=>({path:i.path.join("."),message:i.message}))},null,2);let args2=parsed.data,dirResult=resolveWorkingDirectory(args2.working_directory,directory);if(!dirResult.success)return JSON.stringify({success:!1,reason:dirResult.message},null,2);let provenance=args2.provenance_agent_name||args2.provenance_session_id?{agent_name:args2.provenance_agent_name,session_id:args2.provenance_session_id,captured_at:new Date().toISOString()}:void 0,report={schema_version:SUMMARY_SCHEMA_VERSION,phase:args2.phase,verdict:args2.verdict,findings:args2.findings,knowledge_recommendations:args2.knowledge_recommendations,created_at:new Date().toISOString(),...provenance?{provenance}:{}},evidencePath=writeSupervisorReport(dirResult.directory,report),knowledgeProposed=0,knowledgeReinforced=0,knowledgeQuarantined=0;try{let config3=loadPluginConfig(dirResult.directory);if(config3.architectural_supervision?.persist_knowledge_recommendations&&args2.knowledge_recommendations.length>0){let knowledgeConfig=KnowledgeConfigSchema.parse(config3.knowledge??{}),lessons=args2.knowledge_recommendations.map((r)=>r.lesson),result=await curateAndStoreSwarm(lessons,path260.basename(dirResult.directory),{phase_number:args2.phase},dirResult.directory,knowledgeConfig,{skipAutoPromotion:!0,llmDelegate:createCuratorLLMDelegate(dirResult.directory,"phase"),enrichmentQuota:{maxCalls:knowledgeConfig.enrichment.max_calls_per_day,window:knowledgeConfig.enrichment.quota_window}});knowledgeProposed=result.stored,knowledgeReinforced=result.reinforced,knowledgeQuarantined=result.quarantined}}catch{}let skillsProposed=0;try{let config3=loadPluginConfig(dirResult.directory),hasFailureLoop=args2.findings.some((f)=>f.category==="failure_loop");if(config3.architectural_supervision?.persist_knowledge_recommendations&&hasFailureLoop)skillsProposed=(await generateSkills({directory:dirResult.directory,mode:"draft"})).written.length}catch{}return JSON.stringify({success:!0,phase:args2.phase,verdict:args2.verdict,findings_count:args2.findings.length,knowledge_proposed:knowledgeProposed,knowledge_reinforced:knowledgeReinforced,knowledge_quarantined:knowledgeQuarantined,skills_proposed:skillsProposed,evidence_path:evidencePath},null,2)}});init_zod();init_qa_gate_profile();import fs162 from"node:fs";import path261 from"node:path";function normalizeVerdict2(verdict){if(!LIVE_VERDICT_SET_2.includes(verdict))throw Error(`Invalid verdict: must be 'APPROVED' or 'NEEDS_REVISION', got '${verdict}'`);switch(verdict){case"APPROVED":return"approved";case"NEEDS_REVISION":return"rejected";default:return verdict.toLowerCase()}}function normalizeVerdict4(verdict){if(!LIVE_VERDICT_SET_4.includes(verdict))throw Error(`Invalid verdict: must be 'PASS', 'WARN', 'FAIL', or 'SKIP', got '${verdict}'`);switch(verdict){case"PASS":return"pass";case"WARN":return"warn";case"FAIL":return"fail";case"SKIP":return"skip";default:return verdict.toLowerCase()}}var LIVE_VERDICT_SET_2=["APPROVED","NEEDS_REVISION"],LIVE_VERDICT_SET_4=["PASS","WARN","FAIL","SKIP"],VERDICT_SET_2=LIVE_VERDICT_SET_2,VERDICT_SET_4=LIVE_VERDICT_SET_4;function isAcceptedVerdict2(v){return LIVE_VERDICT_SET_2.includes(v)}function isAcceptedVerdict4(v){return LIVE_VERDICT_SET_4.includes(v)}init_utils2();init_ledger();init_manager();init_utils3();init_logger();init_create_tool();async function executeWriteDriftEvidence(args2,directory){let phase=args2.phase;if(!Number.isInteger(phase)||phase<1)return JSON.stringify({success:!1,phase,message:"Invalid phase: must be a positive integer"},null,2);if(!isAcceptedVerdict2(args2.verdict))return JSON.stringify({success:!1,phase,message:"Invalid verdict: must be 'APPROVED' or 'NEEDS_REVISION'"},null,2);let summary=args2.summary;if(typeof summary!=="string"||summary.trim().length===0)return JSON.stringify({success:!1,phase,message:"Invalid summary: must be a non-empty string"},null,2);let normalizedVerdict=_internals170.normalizeVerdict2(args2.verdict),provenance=args2.provenanceAgentName||args2.provenanceSessionId?{agent_name:args2.provenanceAgentName,session_id:args2.provenanceSessionId,captured_at:new Date().toISOString()}:void 0,evidenceContent={entries:[{type:"drift-verification",verdict:normalizedVerdict,summary:summary.trim(),timestamp:new Date().toISOString(),requirementCoverage:args2.requirementCoverage,...provenance?{provenance}:{}}]},filename="drift-verifier.json",relativePath2=path261.join("evidence",String(phase),filename),validatedPath;try{validatedPath=validateSwarmPath(directory,relativePath2)}catch(error93){return JSON.stringify({success:!1,phase,message:error93 instanceof Error?error93.message:"Failed to validate path"},null,2)}let evidenceDir=path261.dirname(validatedPath);try{await fs162.promises.mkdir(evidenceDir,{recursive:!0});let tempPath=path261.join(evidenceDir,`.${filename}.tmp`);await fs162.promises.writeFile(tempPath,JSON.stringify(evidenceContent,null,2),"utf-8"),await fs162.promises.rename(tempPath,validatedPath);let snapshotInfo,snapshotError,qaProfileLocked,qaProfileLockError;if(normalizedVerdict==="approved")try{let currentPlan=await loadPlanJsonOnly(directory);if(currentPlan){let snapshotEvent=await takeSnapshotEvent(directory,currentPlan,{source:"critic_approved",approvalMetadata:{phase,verdict:"APPROVED",summary:summary.trim(),approved_at:new Date().toISOString()}});snapshotInfo={seq:snapshotEvent.seq,timestamp:snapshotEvent.timestamp};try{let planId=derivePlanId(currentPlan),locked=lockProfile(directory,planId,snapshotEvent.seq);qaProfileLocked={plan_id:planId,locked_at:locked.locked_at??"",locked_by_snapshot_seq:locked.locked_by_snapshot_seq??-1}}catch(lockErr){let msg=lockErr instanceof Error?lockErr.message:String(lockErr);if(!/No QA gate profile/i.test(msg))qaProfileLockError=msg,log("[write_drift_evidence] QA gate profile lock failed:",msg)}}else snapshotError="plan.json not available for snapshot"}catch(err2){snapshotError=err2 instanceof Error?err2.message:String(err2),log("[write_drift_evidence] critic-approved snapshot failed:",snapshotError)}return JSON.stringify({success:!0,phase,verdict:normalizedVerdict,message:`Drift evidence written to .swarm/evidence/${phase}/drift-verifier.json`,approvedSnapshot:snapshotInfo,snapshotError,qaProfileLocked,qaProfileLockError},null,2)}catch(error93){return JSON.stringify({success:!1,phase,message:error93 instanceof Error?error93.message:String(error93)},null,2)}}var _internals170={normalizeVerdict2,VERDICT_SET_2,isAcceptedVerdict2},write_drift_evidence=createSwarmTool({description:"Write drift verification evidence for a completed phase. Normalizes verdict (APPROVED->approved, NEEDS_REVISION->rejected) and writes a gate-contract formatted EvidenceBundle to .swarm/evidence/{phase}/drift-verifier.json. Use this after critic_drift_verifier delegation to persist the verification result.",args:{phase:exports_external.number().int().min(1).describe("The phase number for the drift verification (e.g., 1, 2, 3)"),verdict:exports_external.enum(VERDICT_SET_2).describe("Verdict of the drift verification: 'APPROVED' or 'NEEDS_REVISION'"),summary:exports_external.string().describe("Human-readable summary of the drift verification"),requirementCoverage:exports_external.string().optional().describe("Requirement coverage report from req_coverage tool (JSON string)"),provenanceAgentName:exports_external.string().min(1).optional().describe("Agent name that produced this evidence (optional provenance)"),provenanceSessionId:exports_external.string().min(1).optional().describe("Session ID of the agent that produced this evidence (optional provenance)")},execute:async(args2,directory)=>{let rawPhase=args2.phase!==void 0?Number(args2.phase):0;try{let writeDriftEvidenceArgs={phase:Number(args2.phase),verdict:String(args2.verdict),summary:String(args2.summary??""),requirementCoverage:args2.requirementCoverage!==void 0?String(args2.requirementCoverage):void 0,provenanceAgentName:args2.provenanceAgentName!==void 0?String(args2.provenanceAgentName):void 0,provenanceSessionId:args2.provenanceSessionId!==void 0?String(args2.provenanceSessionId):void 0};return await executeWriteDriftEvidence(writeDriftEvidenceArgs,directory)}catch(error93){return JSON.stringify({success:!1,phase:rawPhase,message:error93 instanceof Error?error93.message:"Unknown error"},null,2)}}});init_zod();init_loader();import fs163 from"node:fs";import path262 from"node:path";init_utils2();init_config2();init_gateway();init_reward_capture();init_ledger();init_manager();init_utils3();init_logger();init_create_tool();var FINAL_COUNCIL_MEMBERS=["critic","reviewer","sme","test_engineer","explorer"],VerdictSchema3=exports_external.object({agent:exports_external.enum(FINAL_COUNCIL_MEMBERS),verdict:exports_external.enum(["APPROVE","CONCERNS","REJECT"]),confidence:exports_external.number().min(0).max(1),findings:exports_external.array(exports_external.object({severity:exports_external.enum(["CRITICAL","HIGH","MEDIUM","LOW"]),category:exports_external.string().min(1),location:exports_external.string(),detail:exports_external.string(),evidence:exports_external.string()})),criteriaAssessed:exports_external.array(exports_external.string()),criteriaUnmet:exports_external.array(exports_external.string()),durationMs:exports_external.number().nonnegative()}),ArgsSchema9=exports_external.object({phase:exports_external.number().int().min(1).max(1000),projectSummary:exports_external.string().min(1),roundNumber:exports_external.number().int().min(1).max(10).optional(),verdicts:exports_external.array(VerdictSchema3).min(1).max(5)});function normalizeFinalVerdict(verdict,requiredFixesCount){if(verdict==="APPROVE")return"approved";if(verdict==="REJECT")return"rejected";return requiredFixesCount>0?"rejected":"concerns"}async function executeWriteFinalCouncilEvidence(args2,directory,ctx){let parsed=ArgsSchema9.safeParse(args2);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 input=parsed.data,config3=loadPluginConfig(directory),requiredMembers=FINAL_COUNCIL_MEMBERS.length,distinctMembers=new Set(input.verdicts.map((v)=>v.agent)),membersVoted=[...distinctMembers],membersAbsent=FINAL_COUNCIL_MEMBERS.filter((m)=>!distinctMembers.has(m));if(membersVoted.length<requiredMembers)return JSON.stringify({success:!1,reason:"insufficient_quorum",message:`Final council quorum not met: ${membersVoted.length} of ${requiredMembers} required members provided verdicts. Members voted: [${membersVoted.join(", ")}]. Members absent: [${membersAbsent.join(", ")}]. Dispatch the absent council members with project-scoped context and collect their verdicts before calling write_final_council_evidence.`,membersVoted,membersAbsent,quorumRequired:requiredMembers},null,2);let synthesis=synthesizeFinalCouncilAdvisory(input.projectSummary.trim(),input.verdicts,input.roundNumber??1,config3.council);if(synthesis.overallVerdict==="CONCERNS"&&synthesis.blockingConcernsCount>0)return JSON.stringify({success:!1,reason:"blocking_concerns_unresolved",overallVerdict:synthesis.overallVerdict,blockingConcernsCount:synthesis.blockingConcernsCount,requiredFixes:synthesis.requiredFixes,unifiedFeedbackMd:synthesis.unifiedFeedbackMd,message:`Final council returned CONCERNS with ${synthesis.blockingConcernsCount} HIGH/CRITICAL finding(s) promoted to requiredFixes. These must be resolved before the project can close. Do NOT write evidence or proceed — address every requiredFix and resubmit.`},null,2);let plan=await loadPlan(directory);if(!plan)return JSON.stringify({success:!1,reason:"plan_not_found",message:"Cannot write final council evidence: plan.json not found. The plan must be loaded and available before writing final council evidence.",phase:input.phase,plan_id:"unknown"},null,2);let planId=derivePlanId(plan),planHash=computePlanHash(plan),planIdentityHash=derivePlanIdentityHash(plan),normalizedVerdict=normalizeFinalVerdict(synthesis.overallVerdict,synthesis.requiredFixes.length),evidenceEntry={type:"final-council",phase:input.phase,plan_id:planId,plan_hash:planHash,plan_identity_hash:planIdentityHash,verdict:normalizedVerdict,rawCouncilVerdict:synthesis.overallVerdict,quorumSize:synthesis.quorumSize,membersVoted,membersAbsent,requiredFixes:synthesis.requiredFixes,advisoryFindings:synthesis.advisoryFindings,advisoryNotes:synthesis.advisoryNotes,unresolvedConflicts:synthesis.unresolvedConflicts,roundNumber:synthesis.roundNumber,allCriteriaMet:synthesis.allCriteriaMet,memberVerdicts:synthesis.memberVerdicts,unifiedFeedbackMd:synthesis.unifiedFeedbackMd,projectSummary:synthesis.projectSummary,timestamp:synthesis.timestamp},filename="final-council.json",relativePath2=path262.join("evidence",filename),validatedPath;try{validatedPath=validateSwarmPath(directory,relativePath2)}catch(error93){return JSON.stringify({success:!1,phase:input.phase,message:error93 instanceof Error?error93.message:"Failed to validate path"},null,2)}let evidenceContent={entries:[evidenceEntry]},evidenceDir=path262.dirname(validatedPath);try{await fs163.promises.mkdir(evidenceDir,{recursive:!0});let tempPath=path262.join(evidenceDir,`.${filename}.tmp`);await fs163.promises.writeFile(tempPath,JSON.stringify(evidenceContent,null,2),"utf-8"),await fs163.promises.rename(tempPath,validatedPath);try{let memoryConfig=config3.memory;if(memoryConfig?.enabled===!0&&ctx?.sessionID){let provider=createConfiguredMemoryProvider(directory,memoryConfig);try{await applyCouncilReward(provider,{runId:ctx.sessionID,unitId:void 0,reward:COUNCIL_VERDICT_REWARDS[synthesis.overallVerdict],eta:memoryConfig.qLearning.learningRate,initialQValue:memoryConfig.qLearning.initialQValue,qLearning:memoryConfig.qLearning,timestamp:new Date().toISOString(),verdictLabel:synthesis.overallVerdict})}finally{await provider.close?.()}}}catch(rewardErr){warn(`[write-final-council-evidence] final council reward capture failed: ${rewardErr instanceof Error?rewardErr.message:String(rewardErr)}`)}return JSON.stringify({success:!0,phase:input.phase,overallVerdict:synthesis.overallVerdict,verdict:normalizedVerdict,vetoedBy:synthesis.vetoedBy,roundNumber:synthesis.roundNumber,allCriteriaMet:synthesis.allCriteriaMet,requiredFixesCount:synthesis.requiredFixes.length,advisoryFindingsCount:synthesis.advisoryFindings.length,unresolvedConflictsCount:synthesis.unresolvedConflicts.length,advisoryNotes:synthesis.advisoryNotes,membersVoted,membersAbsent,quorumSize:synthesis.quorumSize,quorumMet:!0,evidencePath:synthesis.evidencePath,unifiedFeedbackMd:synthesis.unifiedFeedbackMd,message:"Final council evidence written to .swarm/evidence/final-council.json"},null,2)}catch(error93){return JSON.stringify({success:!1,phase:input.phase,message:error93 instanceof Error?error93.message:String(error93)},null,2)}}var write_final_council_evidence=createSwarmTool({description:"Write final council evidence for a completed project. This is not General Council mode and does not use convene_general_council. PREREQUISITE: dispatch critic, reviewer, sme, test_engineer, and explorer as project-scoped Agent tasks, collect their CouncilMemberVerdict JSON, then call this tool to synthesize and persist .swarm/evidence/final-council.json.",args:{phase:exports_external.number().int().min(1).max(1000).describe("The final phase number for the project being reviewed"),projectSummary:exports_external.string().min(1).describe("Summary of the completed project and total work reviewed"),roundNumber:exports_external.number().int().min(1).max(10).optional().describe("1-indexed final council round number. Defaults to 1."),verdicts:exports_external.array(VerdictSchema3).min(1).max(5).describe("Collected CouncilMemberVerdict objects from critic, reviewer, sme, test_engineer, and explorer.")},execute:async(args2,directory,ctx)=>{let parsed=ArgsSchema9.safeParse(args2);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);return await executeWriteFinalCouncilEvidence(parsed.data,directory,ctx)}});init_zod();import fs164 from"node:fs";import path263 from"node:path";init_utils2();init_create_tool();async function executeWriteHallucinationEvidence(args2,directory){let phase=args2.phase;if(!Number.isInteger(phase)||phase<1)return JSON.stringify({success:!1,phase,message:"Invalid phase: must be a positive integer"},null,2);if(!isAcceptedVerdict2(args2.verdict))return JSON.stringify({success:!1,phase,message:"Invalid verdict: must be 'APPROVED' or 'NEEDS_REVISION'"},null,2);let summary=args2.summary;if(typeof summary!=="string"||summary.trim().length===0)return JSON.stringify({success:!1,phase,message:"Invalid summary: must be a non-empty string"},null,2);let normalizedVerdict=_internals171.normalizeVerdict2(args2.verdict),evidenceContent={entries:[{type:"hallucination-verification",verdict:normalizedVerdict,summary:summary.trim(),timestamp:new Date().toISOString(),findings:args2.findings}]},filename="hallucination-guard.json",relativePath2=path263.join("evidence",String(phase),filename),validatedPath;try{validatedPath=validateSwarmPath(directory,relativePath2)}catch(error93){return JSON.stringify({success:!1,phase,message:error93 instanceof Error?error93.message:"Failed to validate path"},null,2)}let evidenceDir=path263.dirname(validatedPath);try{await fs164.promises.mkdir(evidenceDir,{recursive:!0});let tempPath=path263.join(evidenceDir,`.${filename}.tmp`);return await fs164.promises.writeFile(tempPath,JSON.stringify(evidenceContent,null,2),"utf-8"),await fs164.promises.rename(tempPath,validatedPath),JSON.stringify({success:!0,phase,verdict:normalizedVerdict,message:`Hallucination evidence written to .swarm/evidence/${phase}/hallucination-guard.json`},null,2)}catch(error93){return JSON.stringify({success:!1,phase,message:error93 instanceof Error?error93.message:String(error93)},null,2)}}var _internals171={normalizeVerdict2,VERDICT_SET_2,isAcceptedVerdict2},write_hallucination_evidence=createSwarmTool({description:"Write hallucination verification evidence for a completed phase. Normalizes verdict (APPROVED->approved, NEEDS_REVISION->rejected) and writes a gate-contract formatted EvidenceBundle to .swarm/evidence/{phase}/hallucination-guard.json. Use this after critic_hallucination_verifier delegation to persist the verification result. Unlike write_drift_evidence, this tool does NOT lock the QA gate profile.",args:{phase:exports_external.number().int().min(1).describe("The phase number for the hallucination verification (e.g., 1, 2, 3)"),verdict:exports_external.enum(VERDICT_SET_2).describe("Verdict of the hallucination verification: 'APPROVED' or 'NEEDS_REVISION'"),summary:exports_external.string().describe("Human-readable summary of the hallucination verification"),findings:exports_external.string().optional().describe("Optional bullet list of FABRICATED/DRIFTED/UNSUPPORTED/BROKEN findings (for NEEDS_REVISION)")},execute:async(args2,directory)=>{let rawPhase=args2.phase!==void 0?Number(args2.phase):0;try{let typedArgs={phase:Number(args2.phase),verdict:String(args2.verdict),summary:String(args2.summary??""),findings:args2.findings!==void 0?String(args2.findings):void 0};return await executeWriteHallucinationEvidence(typedArgs,directory)}catch(error93){return JSON.stringify({success:!1,phase:rawPhase,message:error93 instanceof Error?error93.message:"Unknown error"},null,2)}}});init_zod();import fs165 from"node:fs";import path264 from"node:path";init_utils2();init_create_tool();async function executeWriteMutationEvidence(args2,directory){let phase=args2.phase;if(!Number.isInteger(phase)||phase<1)return JSON.stringify({success:!1,phase,message:"Invalid phase: must be a positive integer"},null,2);if(!isAcceptedVerdict4(args2.verdict))return JSON.stringify({success:!1,phase,message:"Invalid verdict: must be 'PASS', 'WARN', 'FAIL', or 'SKIP'"},null,2);if(args2.killRate!==void 0){if(typeof args2.killRate!=="number"||Number.isNaN(args2.killRate))return JSON.stringify({success:!1,phase,message:"Invalid killRate: must be a number"},null,2)}if(args2.adjustedKillRate!==void 0){if(typeof args2.adjustedKillRate!=="number"||Number.isNaN(args2.adjustedKillRate))return JSON.stringify({success:!1,phase,message:"Invalid adjustedKillRate: must be a number"},null,2)}let summary=args2.summary;if(typeof summary!=="string"||summary.trim().length===0)return JSON.stringify({success:!1,phase,message:"Invalid summary: must be a non-empty string"},null,2);let normalizedVerdict=_internals172.normalizeVerdict4(args2.verdict),evidenceEntry={type:"mutation-gate",verdict:normalizedVerdict,killRate:args2.killRate??0,adjustedKillRate:args2.adjustedKillRate??0,summary:summary.trim(),timestamp:new Date().toISOString()};if(args2.survivedMutants!==void 0)evidenceEntry.survivedMutants=args2.survivedMutants;let evidenceContent={entries:[evidenceEntry]},filename="mutation-gate.json",relativePath2=path264.join("evidence",String(phase),filename),validatedPath;try{validatedPath=validateSwarmPath(directory,relativePath2)}catch(error93){return JSON.stringify({success:!1,phase,message:error93 instanceof Error?error93.message:"Failed to validate path"},null,2)}let evidenceDir=path264.dirname(validatedPath);try{await fs165.promises.mkdir(evidenceDir,{recursive:!0});let tempPath=path264.join(evidenceDir,`.${filename}.tmp`);return await fs165.promises.writeFile(tempPath,JSON.stringify(evidenceContent,null,2),"utf-8"),await fs165.promises.rename(tempPath,validatedPath),JSON.stringify({success:!0,phase,verdict:normalizedVerdict,message:`Mutation gate evidence written to .swarm/evidence/${phase}/mutation-gate.json`},null,2)}catch(error93){return JSON.stringify({success:!1,phase,message:error93 instanceof Error?error93.message:String(error93)},null,2)}}var _internals172={normalizeVerdict4,VERDICT_SET_4,isAcceptedVerdict4},write_mutation_evidence=createSwarmTool({description:'Write mutation gate evidence for a completed phase. Accepts phase, verdict (PASS/WARN/FAIL/SKIP), killRate, adjustedKillRate, summary, and optional survivedMutants. Normalizes uppercase verdicts to lowercase (PASS→pass, WARN→warn, FAIL→fail, SKIP→skip) and writes entries[0].type="mutation-gate" to .swarm/evidence/{phase}/mutation-gate.json using atomic temp+rename write. Use this after mutation_test tool returns to persist the gate verdict.',args:{phase:exports_external.number().int().min(1).describe("The phase number for the mutation gate (e.g., 1, 2, 3)"),verdict:exports_external.enum(VERDICT_SET_4).describe("Verdict of the mutation gate: 'PASS', 'WARN', 'FAIL', or 'SKIP'"),killRate:exports_external.number().optional().describe("The raw kill rate (e.g., 0.85)"),adjustedKillRate:exports_external.number().optional().describe("The adjusted kill rate accounting for timeout survived mutants (e.g., 0.87)"),summary:exports_external.string().describe("Human-readable summary of the mutation gate result"),survivedMutants:exports_external.string().optional().describe("Optional JSON-serialized list of survived mutants")},execute:async(args2,directory)=>{let rawPhase=args2.phase!==void 0?Number(args2.phase):0;try{let typedArgs={phase:Number(args2.phase),verdict:String(args2.verdict),killRate:args2.killRate!==void 0?Number(args2.killRate):void 0,adjustedKillRate:args2.adjustedKillRate!==void 0?Number(args2.adjustedKillRate):void 0,summary:String(args2.summary??""),survivedMutants:args2.survivedMutants!==void 0?String(args2.survivedMutants):void 0};return await executeWriteMutationEvidence(typedArgs,directory)}catch(error93){return JSON.stringify({success:!1,phase:rawPhase,message:error93 instanceof Error?error93.message:"Unknown error"},null,2)}}});init_zod();init_lane_output_store();init_pending_delegations();init_workspace_snapshot();init_pr_workflow_gate();init_utils2();init_create_tool();import{randomUUID as randomUUID18}from"node:crypto";import fs166 from"node:fs";import path265 from"node:path";var _internals173={resolvePrWorkflowRevisionDigest,resolveMergeBase:resolveExactMergeBase},PR_REVIEW_TRIGGER_DEFINITIONS=[{id:"auth-identity-secrets",scope:"universal",trigger_row:"authentication, authorization, identity, sessions, permissions, secrets, cryptography",micro_lane:"Identity and secret boundaries"},{id:"untrusted-input-boundaries",scope:"universal",trigger_row:"parsing, serialization, queries, templates/rendering, file or network input/output",micro_lane:"Untrusted input and sink analysis"},{id:"subprocess-platform",scope:"universal",trigger_row:"subprocesses, shell commands, filesystem operations, OS/runtime-specific code",micro_lane:"Subprocess and platform safety"},{id:"concurrency-state",scope:"universal",trigger_row:"queues, caches, retries, transactions, locks, state machines, async coordination",micro_lane:"Concurrency and state transitions"},{id:"dependencies-build-release",scope:"universal",trigger_row:"dependency manifests, lockfiles, installers, build scripts, CI, packaging, deployment",micro_lane:"Dependency and delivery integrity"},{id:"api-schema-migrations",scope:"universal",trigger_row:"public API, wire/schema/config/storage formats, migrations, feature flags",micro_lane:"Compatibility and migration safety"},{id:"test-infrastructure",scope:"universal",trigger_row:"tests, mocks, fixtures, harnesses, coverage, CI matrices",micro_lane:"Test validity and isolation"},{id:"ui-accessibility-i18n",scope:"universal",trigger_row:"user interfaces, interaction flows, rendering, accessibility, localization",micro_lane:"UI and human-interface quality"},{id:"privacy-observability",scope:"universal",trigger_row:"telemetry, logs, analytics, traces, retention, diagnostics",micro_lane:"Privacy and observability safety"},{id:"generated-provenance",scope:"universal",trigger_row:"generated, vendored, binary, model-produced, codegen or checked-in build artifacts",micro_lane:"Generated artifact provenance"},{id:"unclassified-risk",scope:"universal",trigger_row:"any changed artifact or behavior not confidently classified by the rows above",micro_lane:"Unclassified high-risk fallback"}],TriggerEvalRowSchema=exports_external.object({trigger_id:exports_external.string().min(1),result:exports_external.literal("MATCHED"),evidence:exports_external.string().trim().min(1).max(4000),source_batch_id:exports_external.string().trim().min(1).optional(),source_lane_id:exports_external.string().trim().min(1).optional()}).strict(),WritePrReviewTriggerEvalArgsSchema=exports_external.object({run_id:exports_external.string().regex(/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/,"run_id must be a safe relative identifier"),pr_head_sha:exports_external.string().trim().regex(/^[0-9a-f]{6,64}$/i),base_sha:exports_external.string().trim().regex(/^[0-9a-f]{6,64}$/i).optional(),base_ref:exports_external.string().trim().regex(/^(?!-)[A-Za-z0-9][A-Za-z0-9._/-]{0,255}$/).optional(),rows:exports_external.array(TriggerEvalRowSchema).min(1)}).strict();function failure2(message){return JSON.stringify({success:!1,message},null,2)}async function executeWritePrReviewTriggerEval(args2,directory,context={}){let parsed=WritePrReviewTriggerEvalArgsSchema.safeParse(args2);if(!parsed.success)return failure2(`Invalid trigger evaluation: ${parsed.error.issues.map((issue3)=>`${issue3.path.join(".")}: ${issue3.message}`).join("; ")}`);let expectedIds=new Set(PR_REVIEW_REQUIRED_MICRO_LANE_IDS),seenIds=new Set,duplicateIds=new Set;for(let row of parsed.data.rows){if(seenIds.has(row.trigger_id))duplicateIds.add(row.trigger_id);seenIds.add(row.trigger_id)}if(duplicateIds.size>0)return failure2(`duplicate trigger IDs: ${[...duplicateIds].join(", ")}`);let unknownIds=[...seenIds].filter((id)=>!expectedIds.has(id));if(unknownIds.length>0)return failure2(`unknown trigger IDs: ${unknownIds.join(", ")}`);let missingIds=[...expectedIds].filter((id)=>!seenIds.has(id));if(missingIds.length>0)return failure2(`missing trigger IDs: ${missingIds.join(", ")}`);let provenance=new Set;for(let row of parsed.data.rows)if(row.result==="MATCHED"){if(!row.source_batch_id||!row.source_lane_id)return failure2(`MATCHED rows require source_batch_id and source_lane_id: ${row.trigger_id}`);let tuple3=`${row.source_batch_id}\x00${row.source_lane_id}`;if(provenance.has(tuple3))return failure2(`MATCHED rows require unique dispatch provenance: ${row.trigger_id}`);provenance.add(tuple3)}let sessionID=context.sessionID?.trim();if(!sessionID)return failure2("PR_REVIEW trigger evaluation requires the current session to have an active, bound PR_REVIEW gate");let gateState;try{gateState=await readPrWorkflowGateState(directory,sessionID)}catch(error93){return failure2(error93 instanceof Error?error93.message:String(error93))}if(gateState?.mode!=="PR_REVIEW"||!gateState.prHeadSha)return failure2("PR_REVIEW trigger evaluation requires the current session to have an active, bound PR_REVIEW gate");if(gateState.prHeadSha!==parsed.data.pr_head_sha)return failure2(`PR_REVIEW trigger evaluation head mismatch: expected ${gateState.prHeadSha}, received ${parsed.data.pr_head_sha}`);try{await assertPrReviewBaseCoverageSettled(directory,sessionID)}catch(error93){return failure2(error93 instanceof Error?error93.message:String(error93))}let currentRevisionDigest=_internals173.resolvePrWorkflowRevisionDigest(directory,parsed.data.pr_head_sha);if(!currentRevisionDigest)return failure2("Active PR_REVIEW trigger evaluation could not bind the current exact revision digest");for(let row of parsed.data.rows){if(row.result!=="MATCHED")continue;let record3=findByBatchId(directory,row.source_batch_id,{parentSessionId:sessionID}).find((candidate)=>candidate.laneId===row.source_lane_id),outputRef=record3?.result?.outputRef?.trim(),outputArtifact=outputRef?readLaneOutput(directory,outputRef):null;if(!record3||record3.mode!=="swarm-pr-review:micro"||record3.workflowLane!==row.trigger_id||record3.status!=="completed"||record3.result?.outputDegraded===!0||record3.result?.transcriptIncomplete===!0||record3.result?.truncated===!0||(record3.result?.chars??0)<=0||!record3.result?.digest?.trim()||!record3.result?.outputRef?.trim()||!outputArtifact||outputArtifact.artifact.batchId!==row.source_batch_id||outputArtifact.artifact.laneId!==row.source_lane_id||outputArtifact.artifact.mode!=="swarm-pr-review:micro"||outputArtifact.artifact.sessionId!==record3.subagentSessionId||outputArtifact.artifact.parentSessionId!==record3.parentSessionId||outputArtifact.artifact.agent!==record3.swarmPrefixedAgent||outputArtifact.artifact.role!==record3.normalizedAgent||outputArtifact.artifact.source!=="collect_lane_results"||outputArtifact.artifact.workflowLane!==record3.workflowLane||outputArtifact.artifact.workflowLane!==row.trigger_id||outputArtifact.artifact.prHeadSha!==record3.workspace?.prHeadSha||outputArtifact.artifact.gitHead!==record3.workspace?.gitHead||outputArtifact.artifact.revisionDigest!==currentRevisionDigest||outputArtifact.artifact.digest!==record3.result?.digest||outputArtifact.artifact.chars!==record3.result?.chars||!prReviewDiscoveryArtifactCoversLane(outputArtifact.artifact.text,row.trigger_id)||record3.workspace?.prHeadSha!==parsed.data.pr_head_sha||record3.workspace?.gitHead!==parsed.data.pr_head_sha)return failure2(`MATCHED trigger ${row.trigger_id} does not reference a completed non-degraded micro-lane artifact`)}if(!parsed.data.base_sha)return failure2("Active PR_REVIEW trigger evaluation requires the exact merge-base base_sha");if(!parsed.data.base_ref)return failure2("Active PR_REVIEW trigger evaluation requires the exact live base_ref used to verify base_sha");let resolvedMergeBase=_internals173.resolveMergeBase(directory,parsed.data.base_ref,parsed.data.pr_head_sha);if(!resolvedMergeBase)return failure2("Active PR_REVIEW trigger evaluation could not resolve the exact merge base from base_ref and pr_head_sha");if(resolvedMergeBase.toLowerCase()!==parsed.data.base_sha.toLowerCase())return failure2(`PR_REVIEW merge-base mismatch: expected ${resolvedMergeBase}, received ${parsed.data.base_sha}`);if(gateState.prReviewBaseRef!==parsed.data.base_ref||gateState.prReviewBaseSha!==parsed.data.base_sha.toLowerCase())return failure2(`PR_REVIEW trigger evaluation scope mismatch: workflow is bound to ${gateState.prReviewBaseRef??"(unbound)"} at ${gateState.prReviewBaseSha??"(unbound)"}, received ${parsed.data.base_ref} at ${parsed.data.base_sha}`);let rowsById=new Map(parsed.data.rows.map((row)=>[row.trigger_id,row])),artifactRows=PR_REVIEW_TRIGGER_DEFINITIONS.map((definition)=>{let row=rowsById.get(definition.id);if(!row)throw Error(`Missing validated trigger row: ${definition.id}`);return{trigger_id:definition.id,scope:definition.scope,trigger_row:definition.trigger_row,micro_lane:definition.micro_lane,result:row.result,evidence:row.evidence,source_batch_id:row.source_batch_id,source_lane_id:row.source_lane_id}}),matchedCount=artifactRows.length,artifact={schema_version:1,run_id:parsed.data.run_id,pr_head_sha:parsed.data.pr_head_sha,base_ref:parsed.data.base_ref,base_sha:parsed.data.base_sha,evaluated_at:new Date().toISOString(),trigger_count:artifactRows.length,matched_count:matchedCount,no_match_count:0,dispatched_micro_lane_count:matchedCount,rows:artifactRows},relativePath2=path265.join("pr-review",parsed.data.run_id,"trigger-eval.json"),destination;try{destination=validateSwarmPath(directory,relativePath2)}catch(error93){return failure2(error93 instanceof Error?error93.message:String(error93))}let parent=path265.dirname(destination),tempPath=path265.join(parent,`.trigger-eval.${randomUUID18()}.tmp`);try{await fs166.promises.mkdir(parent,{recursive:!0}),await fs166.promises.writeFile(tempPath,`${JSON.stringify(artifact,null,2)}
6307
- `,{encoding:"utf-8",flag:"wx"}),await fs166.promises.rename(tempPath,destination)}catch(error93){return failure2(`Failed to persist trigger evaluation: ${error93 instanceof Error?error93.message:String(error93)}`)}finally{await fs166.promises.rm(tempPath,{force:!0}).catch(()=>{return})}return await markPrReviewTriggerEvaluationComplete(directory,sessionID,relativePath2.split(path265.sep).join("/")),JSON.stringify({success:!0,path:relativePath2.split(path265.sep).join("/"),trigger_count:artifactRows.length,matched_count:matchedCount,no_match_count:0,dispatched_micro_lane_count:matchedCount},null,2)}var write_pr_review_trigger_eval=createSwarmTool({description:"Persist the complete, exact-set PR-review micro-lane ledger after every repository-agnostic lane has completed.",args:{run_id:WritePrReviewTriggerEvalArgsSchema.shape.run_id,pr_head_sha:WritePrReviewTriggerEvalArgsSchema.shape.pr_head_sha,base_sha:WritePrReviewTriggerEvalArgsSchema.shape.base_sha,base_ref:WritePrReviewTriggerEvalArgsSchema.shape.base_ref,rows:WritePrReviewTriggerEvalArgsSchema.shape.rows},execute:executeWritePrReviewTriggerEval});init_write_retro();function defineHandlers(handlers){return handlers}var TOOL_MANIFEST=defineHandlers({diff:()=>diff,diff_summary:()=>diff_summary,syntax_check:()=>syntax_check,placeholder_scan:()=>placeholder_scan,imports:()=>imports,lint:()=>lint,secretscan:()=>secretscan,sast_scan:()=>sast_scan,build_check:()=>build_check,pre_check_batch:()=>pre_check_batch,quality_budget:()=>quality_budget,symbols:()=>symbols,complexity_hotspots:()=>complexity_hotspots,schema_drift:()=>schema_drift,todo_extract:()=>todo_extract,evidence_check:()=>evidence_check,check_gate_status:()=>check_gate_status,completion_verify:()=>completion_verify,complete_pr_workflow:()=>complete_pr_workflow,run_pr_feedback_stage_a:()=>run_pr_feedback_stage_a,submit_council_verdicts:()=>submit_council_verdicts,submit_phase_council_verdicts:()=>submit_phase_council_verdicts,declare_council_criteria:()=>declare_council_criteria,sbom_generate:()=>sbom_generate,checkpoint:()=>checkpoint,pkg_audit:()=>pkg_audit,parse_lane_candidates:()=>parse_lane_candidates,write_pr_review_trigger_eval:()=>write_pr_review_trigger_eval,test_runner:()=>test_runner,test_impact:()=>test_impact,mutation_test:()=>mutation_test,generate_mutants:()=>generate_mutants,detect_domains:()=>detect_domains,git_blame:()=>git_blame,gitingest:()=>gitingest,retrieve_summary:()=>retrieve_summary,retrieve_lane_output:()=>retrieve_lane_output,extract_code_blocks:()=>extract_code_blocks,phase_complete:()=>phase_complete,save_plan:()=>save_plan,update_task_status:()=>update_task_status,lint_spec:()=>lint_spec,write_retro:()=>write_retro,write_drift_evidence:()=>write_drift_evidence,write_hallucination_evidence:()=>write_hallucination_evidence,write_mutation_evidence:()=>write_mutation_evidence,declare_scope:()=>declare_scope,knowledge_query:()=>knowledge_query,doc_scan:()=>doc_scan,doc_extract:()=>doc_extract,curator_analyze:()=>curator_analyze,knowledge_add:()=>knowledge_add,knowledge_recall:()=>knowledge_recall,knowledge_remove:()=>knowledge_remove,co_change_analyzer:()=>co_change_analyzer,context_status:()=>context_status,search:()=>search,ast_grep:()=>ast_grep,actionlint_scan:()=>actionlint_scan,osv_scan:()=>osv_scan,gh_evidence:()=>gh_evidence,batch_symbols:()=>batch_symbols,suggest_patch:()=>suggestPatch,req_coverage:()=>req_coverage,get_approved_plan:()=>get_approved_plan,repo_map:()=>repo_map,get_qa_gate_profile:()=>get_qa_gate_profile,set_qa_gates:()=>set_qa_gates,web_search:()=>web_search,web_fetch:()=>web_fetch,convene_general_council:()=>convene_general_council,write_final_council_evidence:()=>write_final_council_evidence,skill_generate:()=>skill_generate,skill_list:()=>skill_list,skill_apply:()=>skill_apply,skill_inspect:()=>skill_inspect,run_stale_reconciliation:()=>run_stale_reconciliation,skill_regenerate:()=>skill_regenerate,skill_retire:()=>skill_retire,skill_improve:()=>skill_improve,spec_write:()=>spec_write,knowledge_receipt:()=>knowledge_receipt,knowledge_archive:()=>knowledge_archive,swarm_memory_recall:()=>swarm_memory_recall,swarm_memory_propose:()=>swarm_memory_propose,swarm_command:()=>swarm_command,dispatch_lanes:()=>dispatch_lanes,dispatch_lanes_async:()=>dispatch_lanes_async,collect_lane_results:()=>collect_lane_results,summarize_work:()=>summarize_work,write_architecture_supervisor_evidence:()=>write_architecture_supervisor_evidence,lean_turbo_plan_lanes:()=>lean_turbo_plan_lanes,lean_turbo_acquire_locks:()=>lean_turbo_acquire_locks,lean_turbo_runner_status:()=>lean_turbo_runner_status,lean_turbo_review:()=>lean_turbo_review,lean_turbo_run_phase:()=>lean_turbo_run_phase,lean_turbo_status:()=>lean_turbo_status,swarm_apply_patch:()=>swarmApplyPatch2,external_skill_discover:()=>external_skill_discover,external_skill_list:()=>external_skill_list,external_skill_inspect:()=>external_skill_inspect,external_skill_promote:()=>external_skill_promote,external_skill_reject:()=>external_skill_reject,external_skill_delete:()=>external_skill_delete,external_skill_revoke:()=>external_skill_revoke,epic_decide_phase:()=>epic_decide_phase,epic_plan_waves:()=>epic_plan_waves,epic_record_divergence:()=>epic_record_divergence});function buildPluginToolObject(agents,config3,evaluationModelDispatcher){let tools={},knowledgeEnabled=config3?.knowledge?.enabled!==!1,knowledgeTools=new Set(["knowledge_add","knowledge_recall","knowledge_remove","knowledge_query","knowledge_receipt","knowledge_archive"]);for(let[name,handler]of Object.entries(TOOL_MANIFEST)){if(!knowledgeEnabled&&knowledgeTools.has(name))continue;tools[name]=handler()}return tools.swarm_command=createSwarmCommandTool(agents,evaluationModelDispatcher),tools}init_utils();function truncateToolOutput(output,maxLines,toolName,tailLines=10){if(!output)return output;if(tailLines>=maxLines)tailLines=Math.floor(maxLines/2);let lines=output.split(`
6324
+ `,{encoding:"utf-8",flag:"wx"}),await fs166.promises.rename(tempPath,destination)}catch(error93){return failure2(`Failed to persist trigger evaluation: ${error93 instanceof Error?error93.message:String(error93)}`)}finally{await fs166.promises.rm(tempPath,{force:!0}).catch(()=>{return})}return await markPrReviewTriggerEvaluationComplete(directory,sessionID,relativePath2.split(path265.sep).join("/")),JSON.stringify({success:!0,path:relativePath2.split(path265.sep).join("/"),trigger_count:artifactRows.length,matched_count:matchedCount,no_match_count:0,dispatched_micro_lane_count:matchedCount},null,2)}var write_pr_review_trigger_eval=createSwarmTool({description:"Persist the complete, exact-set PR-review micro-lane ledger after every repository-agnostic lane has completed.",args:{run_id:WritePrReviewTriggerEvalArgsSchema.shape.run_id,pr_head_sha:WritePrReviewTriggerEvalArgsSchema.shape.pr_head_sha,base_sha:WritePrReviewTriggerEvalArgsSchema.shape.base_sha,base_ref:WritePrReviewTriggerEvalArgsSchema.shape.base_ref,rows:WritePrReviewTriggerEvalArgsSchema.shape.rows},execute:executeWritePrReviewTriggerEval});init_write_retro();function defineHandlers(handlers){return handlers}var TOOL_MANIFEST=defineHandlers({diff:()=>diff,diff_summary:()=>diff_summary,syntax_check:()=>syntax_check,placeholder_scan:()=>placeholder_scan,imports:()=>imports,lint:()=>lint,secretscan:()=>secretscan,sast_scan:()=>sast_scan,build_check:()=>build_check,pre_check_batch:()=>pre_check_batch,quality_budget:()=>quality_budget,symbols:()=>symbols,complexity_hotspots:()=>complexity_hotspots,schema_drift:()=>schema_drift,todo_extract:()=>todo_extract,evidence_check:()=>evidence_check,check_gate_status:()=>check_gate_status,completion_verify:()=>completion_verify,complete_pr_workflow:()=>complete_pr_workflow,abort_pr_workflow:()=>abort_pr_workflow,run_pr_feedback_stage_a:()=>run_pr_feedback_stage_a,submit_council_verdicts:()=>submit_council_verdicts,submit_phase_council_verdicts:()=>submit_phase_council_verdicts,declare_council_criteria:()=>declare_council_criteria,sbom_generate:()=>sbom_generate,checkpoint:()=>checkpoint,pkg_audit:()=>pkg_audit,parse_lane_candidates:()=>parse_lane_candidates,write_pr_review_trigger_eval:()=>write_pr_review_trigger_eval,test_runner:()=>test_runner,test_impact:()=>test_impact,mutation_test:()=>mutation_test,generate_mutants:()=>generate_mutants,detect_domains:()=>detect_domains,git_blame:()=>git_blame,gitingest:()=>gitingest,retrieve_summary:()=>retrieve_summary,retrieve_lane_output:()=>retrieve_lane_output,extract_code_blocks:()=>extract_code_blocks,phase_complete:()=>phase_complete,save_plan:()=>save_plan,update_task_status:()=>update_task_status,lint_spec:()=>lint_spec,write_retro:()=>write_retro,write_drift_evidence:()=>write_drift_evidence,write_hallucination_evidence:()=>write_hallucination_evidence,write_mutation_evidence:()=>write_mutation_evidence,declare_scope:()=>declare_scope,knowledge_query:()=>knowledge_query,doc_scan:()=>doc_scan,doc_extract:()=>doc_extract,curator_analyze:()=>curator_analyze,knowledge_add:()=>knowledge_add,knowledge_recall:()=>knowledge_recall,knowledge_remove:()=>knowledge_remove,co_change_analyzer:()=>co_change_analyzer,context_status:()=>context_status,search:()=>search,ast_grep:()=>ast_grep,actionlint_scan:()=>actionlint_scan,osv_scan:()=>osv_scan,gh_evidence:()=>gh_evidence,batch_symbols:()=>batch_symbols,suggest_patch:()=>suggestPatch,req_coverage:()=>req_coverage,get_approved_plan:()=>get_approved_plan,repo_map:()=>repo_map,get_qa_gate_profile:()=>get_qa_gate_profile,set_qa_gates:()=>set_qa_gates,web_search:()=>web_search,web_fetch:()=>web_fetch,convene_general_council:()=>convene_general_council,write_final_council_evidence:()=>write_final_council_evidence,skill_generate:()=>skill_generate,skill_list:()=>skill_list,skill_apply:()=>skill_apply,skill_inspect:()=>skill_inspect,run_stale_reconciliation:()=>run_stale_reconciliation,skill_regenerate:()=>skill_regenerate,skill_retire:()=>skill_retire,skill_improve:()=>skill_improve,spec_write:()=>spec_write,knowledge_receipt:()=>knowledge_receipt,knowledge_archive:()=>knowledge_archive,swarm_memory_recall:()=>swarm_memory_recall,swarm_memory_propose:()=>swarm_memory_propose,swarm_command:()=>swarm_command,dispatch_lanes:()=>dispatch_lanes,dispatch_lanes_async:()=>dispatch_lanes_async,collect_lane_results:()=>collect_lane_results,summarize_work:()=>summarize_work,write_architecture_supervisor_evidence:()=>write_architecture_supervisor_evidence,lean_turbo_plan_lanes:()=>lean_turbo_plan_lanes,lean_turbo_acquire_locks:()=>lean_turbo_acquire_locks,lean_turbo_runner_status:()=>lean_turbo_runner_status,lean_turbo_review:()=>lean_turbo_review,lean_turbo_run_phase:()=>lean_turbo_run_phase,lean_turbo_status:()=>lean_turbo_status,swarm_apply_patch:()=>swarmApplyPatch2,external_skill_discover:()=>external_skill_discover,external_skill_list:()=>external_skill_list,external_skill_inspect:()=>external_skill_inspect,external_skill_promote:()=>external_skill_promote,external_skill_reject:()=>external_skill_reject,external_skill_delete:()=>external_skill_delete,external_skill_revoke:()=>external_skill_revoke,epic_decide_phase:()=>epic_decide_phase,epic_plan_waves:()=>epic_plan_waves,epic_record_divergence:()=>epic_record_divergence});function buildPluginToolObject(agents,config3,evaluationModelDispatcher){let tools={},knowledgeEnabled=config3?.knowledge?.enabled!==!1,knowledgeTools=new Set(["knowledge_add","knowledge_recall","knowledge_remove","knowledge_query","knowledge_receipt","knowledge_archive"]);for(let[name,handler]of Object.entries(TOOL_MANIFEST)){if(!knowledgeEnabled&&knowledgeTools.has(name))continue;tools[name]=handler()}return tools.swarm_command=createSwarmCommandTool(agents,evaluationModelDispatcher),tools}init_utils();function truncateToolOutput(output,maxLines,toolName,tailLines=10){if(!output)return output;if(tailLines>=maxLines)tailLines=Math.floor(maxLines/2);let lines=output.split(`
6308
6325
  `);if(lines.length<=maxLines)return output;let omittedCount=lines.length-maxLines,headLines=lines.slice(0,maxLines-tailLines),tailContent=lines.slice(-tailLines),footerLines=[];if(footerLines.push(""),footerLines.push(`[... ${omittedCount} line${omittedCount===1?"":"s"} omitted ...]`),toolName)footerLines.push(`Tool: ${toolName}`);return footerLines.push("Use /swarm retrieve <id> to get the full content"),`${headLines.join(`
6309
6326
  `)}
6310
6327
  ${tailContent.join(`
6311
6328
  `)}
6312
6329
  ${footerLines.join(`
6313
6330
  `)}`}init_warning_buffer();init_fixtures();init_gate_ground_truth();init_gate_ground_truth();init_hashing();init_p_limit();init_zod();init_external_tool_runner();init_contracts();init_disposable_worktree();init_hashing();init_store();import*as fs167 from"node:fs";import*as path266 from"node:path";var ScorerOutputSchema=exports_external.object({v:exports_external.literal(1),score:exports_external.number().finite(),cost:CostRecordSchema,metadata:exports_external.record(exports_external.string(),exports_external.unknown()).optional()}).strict(),BuiltinVerdictSchema=exports_external.object({v:exports_external.literal(1),caught:exports_external.boolean(),reason:exports_external.string().optional()}).strict();class ScorerFailure extends Error{outcome;failureCode;retryable;constructor(outcome,failureCode,retryable){super(failureCode);this.outcome=outcome;this.failureCode=failureCode;this.retryable=retryable;this.name="ScorerFailure"}}function aggregateCost(results){if(results.some((result)=>result.cost.source==="unavailable"))return{source:"unavailable"};return{source:results.some((result)=>result.cost.source==="estimated")?"estimated":"reported",usd:results.reduce((sum,result)=>sum+(result.cost.usd??0),0)}}function failureResult2(args2){return{v:1,taskId:args2.task.id,category:args2.task.category,protected:args2.task.protected,repetition:args2.repetition,candidateId:args2.candidate.id,seed:args2.seed,outcome:args2.outcome,scoreRange:args2.task.scorer.scoreRange,cost:args2.cost??{source:"unavailable"},durationMs:args2.durationMs,retries:0,failureCode:args2.failureCode}}function parseBuiltinScore(text){let value;try{value=JSON.parse(text.trim())}catch{throw new ScorerFailure("malformed","builtin-invalid-json",!1)}let parsed=BuiltinVerdictSchema.safeParse(value);if(!parsed.success)throw new ScorerFailure("malformed","builtin-schema-invalid",!1);let verdict=parsed.data;return{v:1,score:verdict.caught?1:0,cost:{source:"unavailable"},metadata:verdict.reason?{reason:verdict.reason}:void 0}}async function scoreExecution(args2){if(args2.task.scorer.kind==="builtin")return parseBuiltinScore(args2.execution.text);let sourceEnvironment=resolveContainedExistingPath(args2.inputRoot,args2.task.environment.path),sourceExecutable=resolveContainedExistingPath(args2.inputRoot,args2.task.scorer.argv[0]),scorerRelative=path266.relative(sourceEnvironment,sourceExecutable);if(!scorerRelative||scorerRelative===".."||scorerRelative.startsWith(`..${path266.sep}`)||path266.isAbsolute(scorerRelative))throw new ScorerFailure("malformed","scorer-outside-task-package",!1);let isolatedExecutable=resolveContainedExistingPath(args2.isolatedRoot,scorerRelative);if(!fs167.statSync(isolatedExecutable).isFile())throw new ScorerFailure("malformed","scorer-not-a-file",!1);let extension=path266.extname(isolatedExecutable).toLowerCase(),isJavaScript=[".cjs",".js",".mjs"].includes(extension),executable=isJavaScript?process.execPath:isolatedExecutable,scorerArgs=isJavaScript?[isolatedExecutable,...args2.task.scorer.argv.slice(1)]:args2.task.scorer.argv.slice(1),artifactDirectory=path266.join(args2.isolatedRoot,".artifacts");fs167.mkdirSync(artifactDirectory,{recursive:!0}),fs167.writeFileSync(path266.join(artifactDirectory,"model-output.json"),JSON.stringify({v:1,text:args2.execution.text}));let result=await _internals174.runExternalTool({executable,args:scorerArgs,cwd:args2.isolatedRoot,timeoutMs:Math.min(args2.task.scorer.timeoutMs,args2.timeoutMs),maxStdoutBytes:args2.maxOutputBytes,maxStderrBytes:args2.maxOutputBytes,abortSignal:args2.abortSignal,env:{...process.env,SWARM_EVAL_TASK_ID:args2.task.id,SWARM_EVAL_CANDIDATE_ID:args2.candidate.id,SWARM_EVAL_ARTIFACT_DIR:artifactDirectory,SWARM_EVAL_SEED:args2.seed}});if(result.status==="timeout")throw new ScorerFailure("timeout","scorer-timeout",!1);if(result.status==="cancelled")throw new ScorerFailure("cancelled","scorer-cancelled",!1);if(result.status==="spawn-error")throw new ScorerFailure("infrastructure_failure","scorer-spawn-failure",!0);if(result.exitCode!==0)throw new ScorerFailure("infrastructure_failure",`scorer-exit-${result.exitCode??"none"}`,!0);if(result.stdoutTruncated||result.stderrTruncated)throw new ScorerFailure("malformed","scorer-output-truncated",!1);let value;try{value=JSON.parse(result.stdout.trim())}catch{throw new ScorerFailure("malformed","scorer-invalid-json",!1)}let parsed=ScorerOutputSchema.safeParse(value);if(!parsed.success)throw new ScorerFailure("malformed","scorer-schema-invalid",!1);return parsed.data}async function runExecutorWithinBudget(args2){let startedAt=Date.now(),controller=new AbortController,timedOut=!1,parentAbort=()=>controller.abort();if(args2.parentSignal.addEventListener("abort",parentAbort,{once:!0}),args2.parentSignal.aborted)controller.abort();let timer=setTimeout(()=>{timedOut=!0,controller.abort()},args2.maxTimeMs);try{let aborted3=new Promise((resolve99)=>{let finish=()=>resolve99({status:timedOut?"timeout":"cancelled",text:"",durationMs:Date.now()-startedAt,cost:{source:"unavailable"},error:timedOut?"executor-task-timeout":"executor-cancelled"});if(controller.signal.addEventListener("abort",finish,{once:!0}),controller.signal.aborted)finish()});return await Promise.race([args2.options.executor({task:args2.task,candidate:args2.candidate,isolatedRoot:args2.isolatedRoot,instruction:args2.instruction,payload:args2.payload,seed:args2.seed,abortSignal:controller.signal}),aborted3])}finally{clearTimeout(timer),args2.parentSignal.removeEventListener("abort",parentAbort),controller.abort()}}async function executePairMember(args2){let startedAt=Date.now(),seed=canonicalHash(`${args2.options.seed}:${args2.task.id}:${args2.candidate.id}:${args2.repetition}`);if(args2.signal.aborted)return failureResult2({...args2,seed,outcome:"cancelled",durationMs:0,failureCode:"cancelled-before-execution"});if(args2.task.environment.kind==="container")return failureResult2({...args2,seed,outcome:"unsupported",durationMs:0,failureCode:"container-runner-unavailable"});try{return await _internals174.withDisposableWorktree({projectRoot:args2.options.projectRoot,baseRef:args2.baseSha,abortSignal:args2.signal,run:async(worktree)=>{let isolatedRoot=path266.join(worktree.path,".swarm-evaluation-task");fs167.mkdirSync(isolatedRoot,{recursive:!0});try{fs167.cpSync(resolveContainedExistingPath(args2.inputRoot,args2.task.environment.path),isolatedRoot,{recursive:!0,errorOnExist:!1});let instruction=fs167.readFileSync(resolveContainedExistingPath(args2.inputRoot,args2.task.instructionPath),"utf8"),payload=fs167.readFileSync(resolveContainedExistingPath(args2.inputRoot,args2.candidate.payloadPath),"utf8"),remainingBeforeExecution=args2.options.budgets.maxTaskTimeMs-(Date.now()-startedAt);if(remainingBeforeExecution<=0)return failureResult2({...args2,seed,outcome:"timeout",durationMs:Date.now()-startedAt,failureCode:"task-budget-exhausted-before-executor"});let execution=await runExecutorWithinBudget({options:args2.options,task:args2.task,candidate:args2.candidate,isolatedRoot,instruction,payload,seed,parentSignal:args2.signal,maxTimeMs:remainingBeforeExecution});if(execution.status!=="completed")return failureResult2({...args2,seed,outcome:execution.status==="infrastructure_failure"?"infrastructure_failure":execution.status,durationMs:execution.durationMs,cost:execution.cost,failureCode:execution.error??`executor-${execution.status}`});if(Buffer.byteLength(execution.text,"utf8")>args2.options.budgets.maxOutputBytes)return failureResult2({...args2,seed,outcome:"malformed",durationMs:Date.now()-startedAt,cost:execution.cost,failureCode:"executor-output-truncated"});let scored;try{let remainingBeforeScorer=args2.options.budgets.maxTaskTimeMs-(Date.now()-startedAt);if(remainingBeforeScorer<=0)throw new ScorerFailure("timeout","task-budget-exhausted-before-scorer",!1);scored=await scoreExecution({task:args2.task,candidate:args2.candidate,inputRoot:args2.inputRoot,isolatedRoot,execution,seed,maxOutputBytes:args2.options.budgets.maxOutputBytes,timeoutMs:remainingBeforeScorer,abortSignal:args2.signal})}catch(error93){let scorerFailure=error93 instanceof ScorerFailure?error93:void 0;return failureResult2({...args2,seed,outcome:args2.signal.aborted?"cancelled":scorerFailure?.outcome??"malformed",durationMs:Date.now()-startedAt,cost:execution.cost,failureCode:scorerFailure?.failureCode??(error93 instanceof Error?error93.message.slice(0,160):"scorer-error")})}let[minimum,maximum]=args2.task.scorer.scoreRange;if(scored.score<minimum||scored.score>maximum)return failureResult2({...args2,seed,outcome:"malformed",durationMs:Date.now()-startedAt,cost:scored.cost,failureCode:"score-out-of-range"});return{v:1,taskId:args2.task.id,category:args2.task.category,protected:args2.task.protected,repetition:args2.repetition,candidateId:args2.candidate.id,seed,outcome:"scored",score:scored.score,scoreRange:args2.task.scorer.scoreRange,cost:scored.cost,durationMs:Date.now()-startedAt,retries:0,metadata:scored.metadata}}finally{fs167.rmSync(isolatedRoot,{recursive:!0,force:!0})}}})}catch(error93){return failureResult2({...args2,seed,outcome:"infrastructure_failure",durationMs:Date.now()-startedAt,failureCode:canonicalHash(String(error93)).slice(0,32)})}}async function executePairMemberWithRetries(args2){let result;for(let attempt=0;attempt<=args2.options.budgets.maxRetries;attempt++)if(result=await executePairMember(args2),result.retries=attempt,result.outcome!=="infrastructure_failure"||args2.signal.aborted)return result;return result}async function runEvaluation(options){let inputRoot=options.inputRoot??options.projectRoot,tasks=options.tasks.map((task)=>EvaluationTaskV1Schema.parse(task));if(tasks.length===0||tasks.length>options.budgets.maxTasks)throw Error("evaluation task count exceeds its declared budget");if(tasks.some((task)=>task.split!==options.split))throw Error("evaluation task split does not match the run split");let baseline=EvaluationCandidateV1Schema.parse(options.baseline),candidate=EvaluationCandidateV1Schema.parse(options.candidate);for(let item of[baseline,candidate])if(await computeCandidateInputContentHash(inputRoot,item)!==item.contentHash)throw Error(`candidate ${item.id} content hash is invalid`);let snapshotDraft={v:1,id:`taskset-${canonicalHash(tasks.map((task)=>task.id)).slice(0,20)}`,split:options.split,tasks,createdAt:new Date().toISOString()};for(let task of tasks)await admitEvaluationTask(options.projectRoot,task,inputRoot);let taskSet={...snapshotDraft,contentHash:computeTaskSetContentHash(snapshotDraft)},storedTaskSet=await saveTaskSetSnapshot(options.projectRoot,taskSet,inputRoot),runId=`eval-${canonicalHash({baseline:baseline.contentHash,candidate:candidate.contentHash,taskSet:storedTaskSet.contentHash,split:options.split,seed:options.seed,models:options.models,budgets:options.budgets}).slice(0,32)}`,existingRun=await readEvaluationRun(options.projectRoot,runId);if(existingRun)return existingRun;if(options.split==="test")await claimHeldOutTest(options.projectRoot,{v:1,runId,taskSetHash:storedTaskSet.contentHash,baselineHash:baseline.contentHash,candidateHash:candidate.contentHash,claimedAt:new Date().toISOString()});let before=await _internals174.captureWorkingTreeFingerprint(options.projectRoot),controller=new AbortController,externallyCancelled=options.abortSignal?.aborted??!1,timedOut=!1,budgetInconclusive=!1,scheduledSpendUsd=0,externalAbort=()=>{externallyCancelled=!0,controller.abort()};if(options.abortSignal?.addEventListener("abort",externalAbort,{once:!0}),externallyCancelled)controller.abort();let totalExecutions=tasks.length*2*options.budgets.maxRepetitions,executionWaves=Math.ceil(totalExecutions/options.budgets.maxConcurrency),totalTimeoutMs=Math.min(2147483647,options.budgets.maxTaskTimeMs*executionWaves*(options.budgets.maxRetries+1)+1000),timeout=setTimeout(()=>{timedOut=!0,controller.abort()},totalTimeoutMs);try{let limit=pLimit(options.budgets.maxConcurrency),jobs=[];for(let task of tasks)for(let item of[baseline,candidate])for(let repetition=0;repetition<options.budgets.maxRepetitions;repetition++)jobs.push(limit(()=>executePairMemberWithRetries({options,inputRoot,task,candidate:item,repetition,signal:controller.signal,baseSha:before.head}).then((result)=>{if(options.budgets.maxSpendUsd!==void 0){if(result.cost.source==="unavailable")budgetInconclusive=!0,controller.abort();else if(scheduledSpendUsd+=result.cost.usd??0,scheduledSpendUsd>options.budgets.maxSpendUsd)budgetInconclusive=!0,controller.abort()}return result})));let results=await Promise.all(jobs);for(let task of tasks)if(await computeTaskInputContentHash(inputRoot,task)!==task.contentHash)throw Error(`task ${task.id} changed during evaluation`);for(let item of[baseline,candidate])if(await computeCandidateInputContentHash(inputRoot,item)!==item.contentHash)throw Error(`candidate ${item.id} changed during evaluation`);let cost=aggregateCost(results),spendUnknown=options.budgets.maxSpendUsd!==void 0&&cost.source==="unavailable",overSpend=options.budgets.maxSpendUsd!==void 0&&cost.source!=="unavailable"&&(cost.usd??0)>options.budgets.maxSpendUsd,incomplete=results.some((result)=>result.outcome!=="scored"),runDraft={v:1,runId,createdAt:new Date().toISOString(),status:externallyCancelled||timedOut?"cancelled":incomplete||spendUnknown||overSpend||budgetInconclusive?"inconclusive":"complete",baseline,candidate,taskSet:{id:storedTaskSet.id,contentHash:storedTaskSet.contentHash,taskIds:tasks.map((task)=>task.id)},split:options.split,seed:options.seed,models:options.models,environment:{platform:process.platform,arch:process.arch,runtime:`node-${process.versions.node};bun-${process.versions.bun??"compat"}`,baseSha:before.head,activeTreeHash:canonicalHash(before),taskSetHash:storedTaskSet.contentHash},budgets:options.budgets,results,cost},run=EvaluationRunV1Schema.parse({...runDraft,integrityHash:computeRunIntegrityHash(runDraft)});return await saveEvaluationRun(options.projectRoot,run),run}finally{clearTimeout(timeout),options.abortSignal?.removeEventListener("abort",externalAbort);let after=await _internals174.captureWorkingTreeFingerprint(options.projectRoot);if(before.head!==after.head||before.porcelainHash!==after.porcelainHash)throw Error("evaluation changed the active working tree")}}var _internals174={captureWorkingTreeFingerprint,runExternalTool,withDisposableWorktree};init_contracts();init_hashing();function normalize24(result){if(result.outcome!=="scored"||result.score===void 0)return;let[minimum,maximum]=result.scoreRange;if(maximum<=minimum||result.score<minimum||result.score>maximum)return;return(result.score-minimum)/(maximum-minimum)}function resultKey(result){return`${result.taskId}\x00${result.repetition}`}function collectPairs(candidateResults,referenceResults){let references=new Map(referenceResults.map((result)=>[resultKey(result),result])),pairs=[];for(let candidateResult of candidateResults){let referenceResult=references.get(resultKey(candidateResult));if(!referenceResult)continue;let candidate=normalize24(candidateResult),reference=normalize24(referenceResult);if(candidate===void 0||reference===void 0)continue;pairs.push({key:resultKey(candidateResult),category:candidateResult.category,protected:candidateResult.protected||referenceResult.protected,reference,candidate,referenceResult,candidateResult})}return pairs.sort((left,right)=>left.key.localeCompare(right.key))}function mean(values){return values.length===0?0:values.reduce((total,value)=>total+value,0)/values.length}function seededRandom(seedHash){let state=Number.parseInt(seedHash.slice(0,8),16)>>>0;return()=>{state+=1831565813;let value=state;return value=Math.imul(value^value>>>15,value|1),value^=value+Math.imul(value^value>>>7,value|61),((value^value>>>14)>>>0)/4294967296}}function percentile(sorted,probability){if(sorted.length===0)return 0;let position=(sorted.length-1)*probability,lower=Math.floor(position),upper=Math.ceil(position);if(lower===upper)return sorted[lower]??0;let fraction=position-lower;return(sorted[lower]??0)*(1-fraction)+(sorted[upper]??0)*fraction}function pairedBootstrapConfidenceInterval(deltas,seedHash,resamples=1e4){if(deltas.length===0)return[0,0];let random=seededRandom(seedHash),estimates=Array(resamples);for(let sample=0;sample<resamples;sample++){let total=0;for(let index=0;index<deltas.length;index++)total+=deltas[Math.floor(random()*deltas.length)]??0;estimates[sample]=total/deltas.length}return estimates.sort((left,right)=>left-right),[percentile(estimates,0.025),percentile(estimates,0.975)]}function availableCosts(pairs){return pairs.every((pair)=>pair.candidateResult.cost.source!=="unavailable"&&pair.referenceResult.cost.source!=="unavailable")}function makeComparison(pairs,scheduledPairs,referenceRunId,referenceCandidateId,seedHash){let deltas=pairs.map((pair)=>pair.candidate-pair.reference);return{baselineRunId:referenceRunId,baselineCandidateId:referenceCandidateId,baselineMean:mean(pairs.map((pair)=>pair.reference)),candidateMean:mean(pairs.map((pair)=>pair.candidate)),pairedDelta:mean(deltas),confidenceInterval:pairedBootstrapConfidenceInterval(deltas,seedHash),validPairs:pairs.length,missingPairs:Math.max(0,scheduledPairs-pairs.length),coverage:scheduledPairs===0?0:Math.min(1,pairs.length/scheduledPairs)}}function decidePromotion(input){let run=input.run,policy=PromotionPolicyV1Schema.parse({v:1,...input.policy??{}}),policyHash=canonicalHash(policy),seedHash=sha256(`${run.seed}${run.taskSet.contentHash}${run.baseline.contentHash}${run.candidate.contentHash}${policyHash}`),scheduledPairs=run.taskSet.taskIds.length*run.budgets.maxRepetitions,candidateResults=run.results.filter((result)=>result.candidateId===run.candidate.id),baselineResults=run.results.filter((result)=>result.candidateId===run.baseline.id),baselinePairs=collectPairs(candidateResults,baselineResults),historicalCompatible=input.historicalBest!==void 0&&input.historicalBest.taskSet.contentHash===run.taskSet.contentHash&&input.historicalBest.split===run.split,historicalResults=historicalCompatible?input.historicalBest?.results.filter((result)=>result.candidateId===input.historicalBest?.candidate.id):[],historicalPairs=collectPairs(candidateResults,historicalResults??[]),historicalSeed=sha256(`${seedHash}:historical-best`),baseline=makeComparison(baselinePairs,scheduledPairs,run.runId,run.baseline.id,seedHash),historicalBest=makeComparison(historicalPairs,scheduledPairs,input.historicalBest?.runId??"unavailable",input.historicalBest?.candidate.id??"unavailable",historicalSeed),categories=[...new Set(baselinePairs.map((pair)=>pair.category))].sort().map((category)=>{let pairs=baselinePairs.filter((pair)=>pair.category===category),categoryProtected=pairs.some((pair)=>pair.protected),tolerance=policy.protectedCategoryTolerances[category]??0,baselineMean=mean(pairs.map((pair)=>pair.reference)),candidateMean=mean(pairs.map((pair)=>pair.candidate)),pairedDelta=candidateMean-baselineMean;return{category,protected:categoryProtected,tolerance,baselineMean,candidateMean,pairedDelta,regression:categoryProtected&&pairedDelta<-tolerance}}),reasons=[],status="inconclusive";if(!historicalCompatible)reasons.push("historical_best_incompatible_or_missing");if(baseline.validPairs<policy.minValidPairs)reasons.push("baseline_insufficient_valid_pairs");if(historicalBest.validPairs<policy.minValidPairs)reasons.push("historical_best_insufficient_valid_pairs");if(baseline.coverage<policy.minCoverage)reasons.push("baseline_insufficient_coverage");if(historicalBest.coverage<policy.minCoverage)reasons.push("historical_best_insufficient_coverage");if(policy.requireAvailableCosts&&(!availableCosts(baselinePairs)||!availableCosts(historicalPairs)||run.cost.source==="unavailable"||input.historicalBest?.cost.source==="unavailable"))reasons.push("promotion_cost_unavailable");let evidenceSufficient=reasons.length===0,protectedRegressions=categories.filter((category)=>category.regression);for(let category of protectedRegressions)reasons.push(`protected_category_regression:${category.category}`);let baselineDecisiveRegression=baseline.confidenceInterval[1]<-policy.deadband,historicalDecisiveRegression=historicalBest.confidenceInterval[1]<-policy.deadband;if(evidenceSufficient&&(baselineDecisiveRegression||historicalDecisiveRegression)){if(status="reject",baselineDecisiveRegression)reasons.push("decisive_regression:baseline");if(historicalDecisiveRegression)reasons.push("decisive_regression:historical_best")}else if(evidenceSufficient&&protectedRegressions.length>0)status="reject";else if(evidenceSufficient&&baseline.confidenceInterval[0]>policy.deadband&&historicalBest.confidenceInterval[0]>policy.deadband)status="accept",reasons.push("improvement_exceeds_deadband_for_baseline_and_historical_best");else if(evidenceSufficient)reasons.push("confidence_interval_overlaps_deadband");let historicalRun=input.historicalBest,decisionCore={runId:run.runId,status,reasons,baseline,historicalBest,deadband:policy.deadband,bootstrap:{resamples:1e4,confidence:0.95,seedHash},categories,lineage:{baselineRunId:run.runId,historicalBestRunId:historicalRun?.runId??"unavailable",taskSetHash:run.taskSet.contentHash,baselineHash:run.baseline.contentHash,candidateHash:run.candidate.contentHash,historicalBestHash:historicalRun?.candidate.contentHash??"0".repeat(64)},policyHash,unavailableQualityMetrics:["complexity_delta","public_api_delta"]};return PromotionDecisionV1Schema.parse({v:1,decisionId:`promotion-${canonicalHash(decisionCore)}`,decidedAt:input.decidedAt??new Date().toISOString(),...decisionCore})}init_store();async function evaluateCandidateV1(options){let run=await runEvaluation(options),decision=decidePromotion({run,historicalBest:options.historicalBest,policy:options.policy,decidedAt:options.decidedAt}),storedDecision=await savePromotionDecision(options.projectRoot,decision);return{run,decision:storedDecision}}var evaluationV1=Object.freeze(Object.assign((options)=>evaluateCandidateV1(options),{evaluateCandidate:evaluateCandidateV1,runEvaluation,decidePromotion:(input)=>decidePromotion(input),hashTaskInput:computeTaskInputContentHash,hashCandidateInput:computeCandidateInputContentHash,recordTestImpactGroundTruth:recordTestImpactGateGroundTruth}));var _heartbeatTimers=new Map,MAX_TRACKED_HEARTBEAT_SESSIONS=500;function capSessionMap(map3,max){while(map3.size>max){let oldest=map3.keys().next().value;if(oldest===void 0)break;map3.delete(oldest)}}var SWARM_COMMAND_SYSTEM_RULE_TAG="[opencode-swarm:swarm-command-rule]",PACKAGE_ROOT2=path268.resolve(path268.dirname(fileURLToPath6(import.meta.url)),".."),SYNC_BUNDLED_SKILLS_TIMEOUT_MS=2000;function createSwarmCommandSystemRuleHook(agentDefinitions,registeredAgents){return async(input,output)=>{let{sessionID}=input,activeAgentName=sessionID?swarmState.activeAgent.get(sessionID):void 0;if(!agentHasSwarmCommandTool(activeAgentName,agentDefinitions,registeredAgents))return;let system=Array.isArray(output.system)?output.system:[];if(system.some((entry)=>entry.includes(SWARM_COMMAND_SYSTEM_RULE_TAG))){output.system=system;return}system.push([SWARM_COMMAND_SYSTEM_RULE_TAG,"When a user asks for a supported /swarm command and the message instructs you to call the `swarm_command` tool, call that tool exactly once with the provided JSON arguments. After the tool returns, show the tool output verbatim and do not add extra swarm state, summaries, or invented command output."].join(`
6314
- `)),output.system=system}}var OpenCodeSwarm=async(ctx)=>{try{return await initializeOpenCodeSwarm(ctx)}catch(err2){let stack=err2 instanceof Error?err2.stack??err2.message:String(err2);throw console.error("[opencode-swarm] FATAL: plugin initialization failed. Plugin will not be available."),console.error(stack),err2}},MAX_TRACKED_ASSISTANT_USAGE_EVENTS=200,latestAssistantUsageBySession=new Map;function rememberAssistantUsageEvent(input){let event=isPlainRecord(input)?input.event:void 0;if(!isPlainRecord(event))return;if(event.type==="message.updated"){let properties=isPlainRecord(event.properties)?event.properties:void 0,info=isPlainRecord(properties?.info)?properties.info:void 0;if(info?.role==="assistant")rememberAssistantUsage(info.sessionID,info);return}if(event.type==="message.part.updated"){let properties=isPlainRecord(event.properties)?event.properties:void 0,part=isPlainRecord(properties?.part)?properties.part:void 0;if(part?.type==="step-finish")rememberAssistantUsage(part.sessionID,part)}}function rememberAssistantUsage(sessionID,raw){if(typeof sessionID!=="string"||sessionID.trim()==="")return;latestAssistantUsageBySession.set(sessionID,raw);while(latestAssistantUsageBySession.size>MAX_TRACKED_ASSISTANT_USAGE_EVENTS){let oldest=latestAssistantUsageBySession.keys().next().value;if(oldest===void 0)break;latestAssistantUsageBySession.delete(oldest)}}function consumeAssistantUsageForTask(parentSessionID,taskOutput){let sessionIDs=[parentSessionID,...collectSessionIDs(taskOutput)];for(let sessionID of sessionIDs){let usage=latestAssistantUsageBySession.get(sessionID);if(usage!==void 0)return latestAssistantUsageBySession.delete(sessionID),usage}return}function collectSessionIDs(raw){let found=[],seen=new Set,visit=(value,depth)=>{if(depth>3||!isPlainRecord(value)||seen.has(value))return;seen.add(value);for(let key of["sessionID","sessionId","session_id"]){let candidate=value[key];if(typeof candidate==="string"&&candidate.trim()!=="")found.push(candidate)}for(let key of["metadata","data","info","message","response","output"])visit(value[key],depth+1)};return visit(raw,0),[...new Set(found)]}function resolveDelegationModel(config3,agentName,baseAgentName){let topLevelModel=config3.agents?.[agentName]?.model??config3.agents?.[baseAgentName]?.model;if(topLevelModel)return topLevelModel;let swarmID=inferSwarmID(agentName,baseAgentName),swarmAgents=swarmID?config3.swarms?.[swarmID]?.agents:void 0;return swarmAgents?.[agentName]?.model??swarmAgents?.[baseAgentName]?.model??DEFAULT_MODELS[baseAgentName]??DEFAULT_MODELS.default}function inferSwarmID(agentName,baseAgentName){if(!agentName||agentName===baseAgentName)return;for(let separator of["_","-"," "]){let suffix=`${separator}${baseAgentName}`;if(agentName.endsWith(suffix)&&agentName.length>suffix.length)return agentName.slice(0,-suffix.length)}return}function isPlainRecord(value){return typeof value==="object"&&value!==null&&!Array.isArray(value)}async function initializeOpenCodeSwarm(ctx){clearDeferredWarnings();let{config:config3,loadedFromFile}=await loadPluginConfigWithMetaAsync(ctx.directory);if(config3.full_auto?.enabled===!0){let criticModel=config3.full_auto.critic_model??config3.agents?.critic?.model??DEFAULT_MODELS.critic,architectModel=config3.agents?.architect?.model??DEFAULT_MODELS.default;if(criticModel===architectModel)if(!config3.quiet)console.warn("[opencode-swarm] Full-auto mode warning: critic model matches architect model. Model validation is advisory-only; full-auto remains enabled. (Runtime architect model is determined by the orchestrator)");else addDeferredWarning("[opencode-swarm] Full-auto mode warning: critic model matches architect model. Model validation is advisory-only; full-auto remains enabled. (Runtime architect model is determined by the orchestrator)")}{let noFallback=[],hasNoFallback=(cfg)=>cfg.model&&(!cfg.fallback_models||cfg.fallback_models.length===0);if(config3.agents){for(let[name,cfg]of Object.entries(config3.agents))if(hasNoFallback(cfg))noFallback.push(`${name}(${cfg.model})`)}if(config3.swarms){for(let[swarmId,swarm]of Object.entries(config3.swarms))if(swarm.agents){for(let[name,cfg]of Object.entries(swarm.agents))if(hasNoFallback(cfg))noFallback.push(`${swarmId}/${name}(${cfg.model})`)}}if(noFallback.length>0){let msg=`[opencode-swarm] WARNING: ${noFallback.length} agent(s) use a custom model without fallback_models: `+noFallback.join(", ")+'. Add "fallback_models": ["model-a"] to each agent config for reliability.';if(!config3.quiet)console.warn(msg);else addDeferredWarning(msg)}}swarmState.fullAutoEnabledInConfig=config3.full_auto?.enabled===!0,swarmState.opencodeClient=ctx.client,await withTimeout(loadSnapshot(ctx.directory),5000,Error("loadSnapshot exceeded 5s budget; continuing without snapshot rehydration")).catch((err2)=>{let msg=err2 instanceof Error?err2.message:String(err2);log("loadSnapshot timed out or failed (non-fatal)",{error:msg})}),initTelemetry(ctx.directory);let repoGraphHook=createRepoGraphBuilderHook(ctx.directory,void 0,{excludeDirs:config3.repo_graph?.exclude_dirs});if(queueMicrotask(()=>{let watchdog=setTimeout(()=>{log("[repo-graph] init exceeded 30s budget; scan will continue but is overdue")},30000);if(typeof watchdog.unref==="function")watchdog.unref();repoGraphHook.init().catch(()=>{}).finally(()=>clearTimeout(watchdog))}),await withTimeout(ensureSwarmGitExcluded(ctx.directory,{quiet:config3.quiet}),ENSURE_SWARM_GIT_EXCLUDED_OUTER_TIMEOUT_MS,Error(`ensureSwarmGitExcluded exceeded ${ENSURE_SWARM_GIT_EXCLUDED_OUTER_TIMEOUT_MS}ms budget; continuing without git-hygiene check`)).catch((err2)=>{let msg=err2 instanceof Error?err2.message:String(err2);log("ensureSwarmGitExcluded timed out or failed (non-fatal)",{error:msg})}),queueMicrotask(()=>{runInitOrphanRecovery(ctx.directory).catch((err2)=>{let msg=err2 instanceof Error?err2.message:String(err2);log("initOrphanRecovery failed (non-fatal)",{error:msg})})}),writeSwarmConfigExampleIfNew(ctx.directory),writeProjectConfigIfNew(ctx.directory,config3.quiet),queueMicrotask(()=>{withTimeout(syncBundledProjectSkillsIfMissingAsync(ctx.directory,PACKAGE_ROOT2,config3.quiet),SYNC_BUNDLED_SKILLS_TIMEOUT_MS,Error(`syncBundledProjectSkillsIfMissingAsync exceeded ${SYNC_BUNDLED_SKILLS_TIMEOUT_MS}ms budget; continuing without skill materialization (command-path sync remains a backstop)`)).catch((err2)=>{let msg=err2 instanceof Error?err2.message:String(err2);log("bundled skill materialization timed out or failed (non-fatal)",{error:msg})})}),config3.version_check!==!1)scheduleVersionCheck(package_default.version,(msg)=>{if(config3.quiet)addDeferredWarning(msg);else console.warn(msg)});let projectContext=await withTimeout((async()=>{return(await Promise.resolve().then(() => (init_project_context(),exports_project_context))).buildProjectContext(ctx.directory)})(),300,Error("language-backend detection exceeded 300ms; continuing with unresolved sentinels")).catch((err2)=>{let msg=err2 instanceof Error?err2.message:String(err2);return log("language-backend detection timed out or failed (non-fatal)",{error:msg}),null}),agents=getAgentConfigs(config3,ctx.directory,void 0,projectContext??void 0),agentDefinitions=createAgents(config3,projectContext??void 0),agentDefinitionMap=Object.fromEntries(agentDefinitions.map((agent)=>[agent.name,agent]));swarmState.curatorInitAgentNames=Object.keys(agents).filter((k)=>k==="curator_init"||k.endsWith("_curator_init")),swarmState.curatorPhaseAgentNames=Object.keys(agents).filter((k)=>k==="curator_phase"||k.endsWith("_curator_phase")),swarmState.curatorPostmortemAgentNames=Object.keys(agents).filter((k)=>k==="curator_postmortem"||k.endsWith("_curator_postmortem")),swarmState.curatorConsolidationAgentNames=Object.keys(agents).filter((k)=>k==="curator_consolidation"||k.endsWith("_curator_consolidation")),swarmState.skillImproverAgentNames=Object.keys(agents).filter((k)=>k==="skill_improver"||k.endsWith("_skill_improver")),swarmState.specWriterAgentNames=Object.keys(agents).filter((k)=>k==="spec_writer"||k.endsWith("_spec_writer")),swarmState.generatedAgentNames=Object.keys(agents);let pipelineHook=createPipelineTrackerHook(config3,ctx.directory),systemEnhancerHook=createSystemEnhancerHook(config3,ctx.directory),contextCapsuleInjectHook=createContextCapsuleInjectHook(config3,ctx.directory),compactionHook=createCompactionCustomizerHook(config3,ctx.directory),contextBudgetHandler=createContextBudgetHandler(config3),evaluationModelDispatcher=createEvaluationModelDispatcher(ctx.client),commandHandler=createSwarmCommandHandler(ctx.directory,agentDefinitionMap,{getActiveAgentName:(sessionID)=>swarmState.activeAgent.get(sessionID),packageRoot:PACKAGE_ROOT2,registeredAgents:agents,evaluationModelDispatcher}),swarmCommandSystemRuleHook=createSwarmCommandSystemRuleHook(agentDefinitionMap,agents),activityHooks=createAgentActivityHooks(config3,ctx.directory),prmHook=createPrmHook(config3.prm??PrmConfigSchema.parse({}),ctx.directory),trajectoryLoggerHook=createTrajectoryLoggerHook({enabled:!0,max_lines:1000},ctx.directory),delegationGateHooks=createDelegationGateHook(config3,ctx.directory),backgroundCompletionObserver=createBackgroundCompletionObserver({config:{enabled:config3.hooks?.background_subagents===!0},directory:ctx.directory}),delegationSanitizerHook=createDelegationSanitizerHook(ctx.directory),memoryLifecycleHooks=createMemoryLifecycleHooks({directory:ctx.directory,config:config3.memory,getActiveAgentName:(sessionID)=>sessionID?swarmState.activeAgent.get(sessionID):void 0,getActiveTaskId:(sessionID)=>sessionID?swarmState.agentSessions.get(sessionID)?.currentTaskId??void 0:void 0}),guardrailsFallback=config3.guardrails?.enabled===!1?{...config3.guardrails,enabled:!1}:config3.guardrails??{},guardrailsConfig=GuardrailsConfigSchema.parse(guardrailsFallback);if(loadedFromFile&&guardrailsConfig.enabled===!1)warn(""),warn("══════════════════════════════════════════════════════════════"),warn("[opencode-swarm] \uD83D\uDD34 SECURITY WARNING: GUARDRAILS ARE DISABLED"),warn("══════════════════════════════════════════════════════════════"),warn("Guardrails have been explicitly disabled in user configuration."),warn("This disables safety measures including:"),warn(" - Tool call limits"),warn(" - Duration limits"),warn(" - Repetition detection"),warn(" - Error rate limits"),warn(" - Idle timeouts"),warn(""),warn("Only disable guardrails if you fully understand the security implications."),warn('To re-enable guardrails, set "guardrails.enabled" to true in your config.'),warn("══════════════════════════════════════════════════════════════"),warn("");let delegationHandler=createDelegationTrackerHook(config3,guardrailsConfig.enabled),authorityConfig=AuthorityConfigSchema.parse(config3.authority??{}),worktreeDirOverride=resolveWorktreeIsolationConfig(config3).worktree_dir,worktreeBaseDirOverrides=worktreeDirOverride?[worktreeDirOverride]:[],guardrailsHooks=createGuardrailsHooks(ctx.directory,void 0,guardrailsConfig,authorityConfig,worktreeBaseDirOverrides),fullAutoInterceptHook=createFullAutoInterceptHook(config3,ctx.directory),fullAutoPermissionHook=createFullAutoPermissionHook({config:config3,directory:ctx.directory}),fullAutoInputProbeHook=createFullAutoInputProbeHook({config:config3,directory:ctx.directory}),fullAutoDelegationHook=createFullAutoDelegationHook({config:config3,directory:ctx.directory}),ccCommandInterceptHook=createCcCommandInterceptHook({}),issueTraceHook=createIssueTraceHook(config3,ctx.directory),watchdogConfig=WatchdogConfigSchema.parse(config3.watchdog??{}),advisoryInjector=(sessionId,message)=>{let s=swarmState.agentSessions.get(sessionId);if(s)s.pendingAdvisoryMessages??=[],s.pendingAdvisoryMessages.push(message)},scopeGuardHook=createScopeGuardHook({enabled:watchdogConfig.scope_guard,skip_in_turbo:watchdogConfig.skip_in_turbo},ctx.directory,advisoryInjector),prWorkflowResponseGate=createPrWorkflowResponseGate({directory:ctx.directory,client:ctx.client}),prWorkflowSessionResolver=createPrWorkflowSessionResolver({directory:ctx.directory,client:ctx.client}),delegationLedgerHook=createDelegationLedgerHook({enabled:watchdogConfig.delegation_ledger},ctx.directory,advisoryInjector),initOrphanRecoveryAdvisoryHook=createInitOrphanRecoveryAdvisoryHook(ctx.directory),selfReviewConfig=SelfReviewConfigSchema.parse(config3.self_review??{}),selfReviewHook=createSelfReviewHook({enabled:selfReviewConfig.enabled,skip_in_turbo:selfReviewConfig.skip_in_turbo},advisoryInjector),autoReviewHook=createAutoReviewHook({config:AutoReviewConfigSchema.parse(config3.auto_review??{}),directory:ctx.directory,injectAdvisory:advisoryInjector}),summaryConfig=SummaryConfigSchema.parse(config3.summaries??{}),toolSummarizerHook=createToolSummarizerHook(summaryConfig,ctx.directory),knowledgeConfigBase=config3.knowledge??{},knowledgeConfig=KnowledgeConfigSchema.parse(knowledgeConfigBase),skillImproverConfig=SkillImproverConfigSchema.parse(config3.skill_improver??{}),skillPropagationConfig=SkillPropagationConfigSchema.parse(config3.skillPropagation??{});if(skillImproverConfig.enabled&&skillImproverConfig.trigger==="scheduled")queueMicrotask(()=>{Promise.resolve().then(() => (init_skill_consolidation(),exports_skill_consolidation)).then(({runSkillConsolidationFireAndForget:runSkillConsolidationFireAndForget2})=>{runSkillConsolidationFireAndForget2({directory:ctx.directory,config:skillImproverConfig,source:"startup",enrichmentQuota:{maxCalls:knowledgeConfig.enrichment.max_calls_per_day,window:knowledgeConfig.enrichment.quota_window},evaluateDrafts:!0},void 0,(err2)=>{let msg=err2 instanceof Error?err2.message:String(err2);log("scheduled skill consolidation failed (non-fatal)",{error:msg})})}).catch((err2)=>{let msg=err2 instanceof Error?err2.message:String(err2);log("failed to schedule skill consolidation (non-fatal)",{error:msg})})});let knowledgeCuratorHook=knowledgeConfig.enabled?createKnowledgeCuratorHook(ctx.directory,knowledgeConfig,{llmDelegateFactory:(sessionID)=>createCuratorLLMDelegate(ctx.directory,"phase",sessionID),enrichmentQuota:{maxCalls:knowledgeConfig.enrichment.max_calls_per_day,window:knowledgeConfig.enrichment.quota_window}}):void 0,hivePromoterHook=knowledgeConfig.enabled&&knowledgeConfig.hive_enabled?createHivePromoterHook(ctx.directory,knowledgeConfig):void 0,knowledgeInjectorHook=knowledgeConfig.enabled?createKnowledgeInjectorHook(ctx.directory,knowledgeConfig,config3.context_budget?.model_limits??{},config3.context_budget?.unified_injection_tokens):void 0,steeringConsumedHook=createSteeringConsumedHook(ctx.directory),coChangeSuggesterHook=createCoChangeSuggesterHook(ctx.directory),darkMatterDetectorHook=createDarkMatterDetectorHook(ctx.directory),slopDetectorHook=config3.slop_detector?.enabled!==!1?createSlopDetectorHook(config3.slop_detector??{enabled:!0,classThreshold:3,commentStripThreshold:5,diffLineThreshold:200,importHygieneThreshold:2},ctx.directory,(sessionId,message)=>{let s=swarmState.agentSessions.get(sessionId);if(s)s.pendingAdvisoryMessages??=[],s.pendingAdvisoryMessages.push(message)}):null,incrementalVerifyHook=config3.incremental_verify?.enabled!==!1?createIncrementalVerifyHook(config3.incremental_verify??{enabled:!0,command:null,timeoutMs:30000,triggerAgents:["coder"]},ctx.directory,(sessionId,message)=>{let s=swarmState.agentSessions.get(sessionId);if(s)s.pendingAdvisoryMessages??=[],s.pendingAdvisoryMessages.push(message)}):null,compactionServiceHook=config3.compaction_service?.enabled!==!1?createCompactionService(config3.compaction_service??{enabled:!0,observationThreshold:40,reflectionThreshold:60,emergencyThreshold:80,preserveLastNTurns:5},ctx.directory,(sessionId,message)=>{let s=swarmState.agentSessions.get(sessionId);if(s)s.pendingAdvisoryMessages??=[],s.pendingAdvisoryMessages.push(message)}):null,snapshotWriterHook=createSnapshotWriterHook(ctx.directory),automationConfig=AutomationConfigSchema.parse(config3.automation??{}),automationManager,preflightTriggerManager,statusArtifact,prMonitorWorker=null;if(automationConfig.mode!=="manual"){automationManager=createAutomationManager(automationConfig),automationManager.start();let{PreflightTriggerManager:PTM}=await Promise.resolve().then(() => (init_trigger(),exports_trigger));preflightTriggerManager=new PTM(automationConfig);let{AutomationStatusArtifact:ASA}=await Promise.resolve().then(() => (init_status_artifact(),exports_status_artifact)),swarmDir=path268.resolve(ctx.directory,".swarm");if(statusArtifact=new ASA(swarmDir),statusArtifact.updateConfig(automationConfig.mode,automationConfig.capabilities),automationConfig.capabilities?.evidence_auto_summaries===!0){let{createEvidenceSummaryIntegration:createEvidenceSummaryIntegration2}=await Promise.resolve().then(() => (init_evidence_summary_integration(),exports_evidence_summary_integration));createEvidenceSummaryIntegration2({automationConfig,directory:ctx.directory,projectDir:ctx.directory,summaryFilename:"evidence-summary.json"}),log("Evidence summary integration initialized",{directory:ctx.directory})}if(automationConfig.capabilities?.phase_preflight===!0){let{createPreflightIntegration:createPreflightIntegration2}=await Promise.resolve().then(() => (init_preflight_integration(),exports_preflight_integration));try{let{manager}=createPreflightIntegration2({automationConfig,directory:ctx.directory,swarmDir});preflightTriggerManager=manager,log("Preflight integration initialized",{directory:ctx.directory})}catch(err2){log("Preflight integration failed to initialize (non-fatal)",{error:err2 instanceof Error?err2.message:String(err2)})}}if(automationConfig.capabilities?.plan_sync===!0)try{new PlanSyncWorker({directory:ctx.directory}).start(),log("PlanSyncWorker initialized",{directory:ctx.directory})}catch(err2){log("PlanSyncWorker failed to initialize (non-fatal)",{error:err2 instanceof Error?err2.message:String(err2)})}log("Automation framework initialized",{mode:automationConfig.mode,enabled:automationManager?.isEnabled(),running:automationManager?.isActive(),preflightEnabled:preflightTriggerManager?.isEnabled()})}let prMonitorConfig=PrMonitorConfigSchema.parse(config3.pr_monitor??{});function ensurePrMonitorWorkerRunning(directory){try{if(!prMonitorConfig.enabled)return;if(!prMonitorWorker)prMonitorWorker=new PrMonitorWorker({directory,config:prMonitorConfig});if(!prMonitorWorker.isRunning())prMonitorWorker.start(),log("PR Monitor Worker started",{directory})}catch(err2){error48("[pr-monitor] Worker failed to start (non-fatal)",{error:err2 instanceof Error?err2.message:String(err2)})}}setOnSubscriptionCreated((directory,_record3)=>{ensurePrMonitorWorkerRunning(directory)});let prEventCleanup=null,prEventDelivery=null;if(prMonitorConfig.enabled){try{let{registerPrEventSubscribers:registerPrEventSubscribers2}=await Promise.resolve().then(() => (init_pr_event_subscribers(),exports_pr_event_subscribers));prEventCleanup=registerPrEventSubscribers2({directory:ctx.directory,config:prMonitorConfig})}catch(err2){log("[pr-monitor] Failed to register PR event subscribers (non-fatal)",{error:err2 instanceof Error?err2.message:String(err2)})}if(prMonitorConfig.event_delivery==="prompt")try{let deliveryModule=await Promise.resolve().then(() => (init_pr_event_delivery(),exports_pr_event_delivery));deliveryModule.registerPrEventDelivery({client:ctx.client,directory:ctx.directory,config:prMonitorConfig}),prEventDelivery={noteSessionIdle:deliveryModule.noteSessionIdle,unregisterPrEventDelivery:deliveryModule.unregisterPrEventDelivery}}catch(err2){log("[pr-monitor] Failed to register wake delivery (non-fatal)",{error:err2 instanceof Error?err2.message:String(err2)})}}let prAutoSubscribeHook=createPrAutoSubscribeHook(ctx.directory,prMonitorConfig);if(prMonitorConfig.enabled)queueMicrotask(()=>{listActive(ctx.directory).then((active)=>{if(active.length>0)ensurePrMonitorWorkerRunning(ctx.directory)}).catch((err2)=>{error48("[pr-monitor] Startup scan failed (non-fatal)",{error:err2 instanceof Error?err2.message:String(err2)})})});let cleanupAutomation=()=>{automationManager?.stop(),prMonitorWorker?.stop(),prEventCleanup?.(),prEventDelivery?.unregisterPrEventDelivery()};if(process.on("exit",cleanupAutomation),shouldRunOnStartup(automationConfig)){let enableAutofix=automationConfig.capabilities?.config_doctor_autofix===!0;Promise.resolve().then(() => (init_config_doctor(),exports_config_doctor)).then(({runConfigDoctorWithFixes:runConfigDoctorWithFixes2})=>{runConfigDoctorWithFixes2(ctx.directory,config3,enableAutofix).then((doctorResult)=>{if(doctorResult.result.findings.length>0){log("Config Doctor ran on startup",{findings:doctorResult.result.findings.length,errors:doctorResult.result.summary.error,warnings:doctorResult.result.summary.warn,appliedFixes:doctorResult.appliedFixes.length,autofixEnabled:enableAutofix});try{let autoFixableCount=doctorResult.result.findings.filter((f)=>f.autoFixable).length,appliedCount=doctorResult.appliedFixes.length;if(!enableAutofix&&autoFixableCount>0){let msg=`[opencode-swarm] Config Doctor found ${autoFixableCount} auto-fixable issue(s). Run /swarm config doctor --fix to apply.`;if(!config3.quiet)console.warn(msg);else addDeferredWarning(msg)}else if(enableAutofix){let parts=[];if(appliedCount>0)parts.push(`applied ${appliedCount} fix(es) automatically`);let unapplied=Math.max(0,autoFixableCount-appliedCount);if(unapplied>0)parts.push(`${unapplied} auto-fixable issue(s) need explicit review — run /swarm config doctor --fix`);if(parts.length>0){let msg=`[opencode-swarm] Config Doctor: ${parts.join("; ")}.`;if(!config3.quiet)console.warn(msg);else addDeferredWarning(msg)}}}catch{}}}).catch((err2)=>{log("Config Doctor error (non-fatal)",{error:err2 instanceof Error?err2.message:String(err2)})})})}return log("Plugin initialized",{maxIterations:config3.max_iterations,agentCount:Object.keys(agents).length,hooks:{pipeline:!!pipelineHook["experimental.chat.messages.transform"],systemEnhancer:!!systemEnhancerHook["experimental.chat.system.transform"],compaction:!!compactionHook["experimental.session.compacting"],contextBudget:!!contextBudgetHandler,commands:!0,agentActivity:config3.hooks?.agent_activity!==!1,delegationTracker:config3.hooks?.delegation_tracker===!0,guardrails:guardrailsConfig.enabled,toolSummarizer:summaryConfig.enabled,knowledge:knowledgeConfig.enabled},automation:{mode:automationConfig.mode,capabilities:automationConfig.capabilities}}),{name:"opencode-swarm",agent:agents,tool:buildPluginToolObject(agentDefinitionMap,config3,evaluationModelDispatcher),event:async(input)=>{try{rememberAssistantUsageEvent(input);let lifecycleEvent=input.event;if(lifecycleEvent?.type==="message.part.updated"){let part=lifecycleEvent.properties?.part,metadata=part?.state?.metadata,partTool=typeof part?.tool==="string"?normalizeToolName(part.tool)?.toLowerCase():void 0,eventParentSessionID=typeof part?.sessionID==="string"&&part.sessionID.trim()!==""?part.sessionID:void 0,eventChildSessionID=typeof metadata?.sessionId==="string"&&metadata.sessionId.trim()!==""?metadata.sessionId:void 0;if(part?.type==="tool"&&partTool==="task"&&typeof part.callID==="string"&&part.callID.trim()!==""&&eventParentSessionID!==void 0&&eventChildSessionID!==void 0&&eventParentSessionID!==eventChildSessionID)await delegationGateHooks.taskMetadata({callID:part.callID,parentSessionID:eventParentSessionID,childSessionID:eventChildSessionID})}let lifecycleStatus=lifecycleEvent?.properties?.status;if(lifecycleEvent?.type==="session.deleted"||lifecycleEvent?.type==="session.removed"||lifecycleEvent?.type==="session.idle"||lifecycleEvent?.type==="session.error"||lifecycleEvent?.type==="session.status"&&(lifecycleStatus==="idle"||typeof lifecycleStatus==="object"&&(lifecycleStatus.type==="idle"||lifecycleStatus.type==="error"))){let properties=lifecycleEvent.properties,sessionID=properties?.sessionID??properties?.sessionId??properties?.info?.sessionID??properties?.info?.id??properties?.id;if(sessionID)delegationGateHooks.sessionEnded(sessionID,lifecycleEvent.type==="session.deleted"||lifecycleEvent.type==="session.removed")}if(prWorkflowSessionResolver.observeEvent(input),await prWorkflowResponseGate.event(input),prEventDelivery){let evt=input.event;if(evt?.type==="session.idle"&&typeof evt.properties?.sessionID==="string")prEventDelivery.noteSessionIdle(evt.properties.sessionID)}await backgroundCompletionObserver.event(input)}catch(err2){warn(`[swarm] event hook error: ${err2 instanceof Error?err2.message:String(err2)}`)}},config:async(opencodeConfig)=>{let isObjectRecord=(value)=>typeof value==="object"&&value!==null,pluginConfig=opencodeConfig;if(!isObjectRecord(pluginConfig.agent))pluginConfig.agent={};let agentConfig=pluginConfig.agent;Object.assign(agentConfig,agents);let autoSelect=config3?.auto_select_architect;if(autoSelect)if(Object.keys(agents).some((name)=>stripKnownSwarmPrefix(name)==="architect")){for(let builtin of["build","plan"]){let existing=agentConfig[builtin];if(isObjectRecord(existing)&&existing.disable===!0)continue;agentConfig[builtin]={...isObjectRecord(existing)?existing:{},disable:!0}}if(autoSelect===!0){let primaryArchitects=Object.entries(agents).filter(([name,cfg])=>stripKnownSwarmPrefix(name)==="architect"&&isObjectRecord(cfg)&&cfg.mode==="primary");if(primaryArchitects.length>1){let names=primaryArchitects.map(([n])=>n).join(", ");addDeferredWarning(`[swarm] auto_select_architect is true but ${primaryArchitects.length} architect agents are primary (${names}). Consider setting auto_select_architect to a specific agent name.`)}}if(typeof autoSelect==="string"&&autoSelect!==""){let targetName=autoSelect;if(Object.hasOwn(agents,targetName)&&stripKnownSwarmPrefix(targetName)==="architect"){for(let[name,cfg]of Object.entries(agents))if(stripKnownSwarmPrefix(name)==="architect"&&name!==targetName)agentConfig[name]={...isObjectRecord(cfg)?cfg:{},mode:"subagent"};let targetExisting=agentConfig[targetName],targetAgent=agents[targetName];agentConfig[targetName]={...isObjectRecord(targetExisting)?targetExisting:{},...isObjectRecord(targetAgent)?targetAgent:{},mode:"primary"}}else addDeferredWarning(`[swarm] auto_select_architect is set to "${targetName}" but that is not a known architect agent. No architect demotion applied.`)}}else addDeferredWarning("[swarm] auto_select_architect is enabled but no architect agents were found in the generated set. The option has no effect.");let shortcutDescription=(cmd)=>{let entry=COMMAND_REGISTRY[cmd];if(!entry?.description)return`Use /swarm ${cmd}`;let desc=entry.description.charAt(0).toLowerCase()+entry.description.slice(1);return`Use /swarm ${cmd} to ${desc}`};opencodeConfig.command={...opencodeConfig.command||{},swarm:{template:"/swarm $ARGUMENTS",description:(()=>{return`Swarm management commands: /swarm [${VALID_COMMANDS.filter((cmd)=>{let entry=COMMAND_REGISTRY[cmd];return!entry.aliasOf&&!entry.deprecated&&!entry.subcommandOf}).join("|")}]`})()},"swarm-status":{template:"/swarm status",description:"Use /swarm status to show current swarm status and active phase"},"swarm-show-plan":{template:"/swarm show-plan $ARGUMENTS",description:"Use /swarm show-plan to view or filter the current execution plan"},"swarm-plan":{template:"/swarm plan $ARGUMENTS",description:"Deprecated alias for /swarm show-plan"},"swarm-agents":{template:"/swarm agents",description:"Use /swarm agents to list registered swarm agents"},"swarm-history":{template:"/swarm history",description:"Use /swarm history to show completed phases summary"},"swarm-config":{template:"/swarm config $ARGUMENTS",description:"Use /swarm config to show or validate configuration"},"swarm-evidence":{template:"/swarm evidence $ARGUMENTS",description:"Use /swarm evidence to view evidence bundles and summaries"},"swarm-handoff":{template:"/swarm handoff",description:"Use /swarm handoff to prepare handoff brief for switching models mid-task"},"swarm-archive":{template:"/swarm archive",description:"Use /swarm archive to archive old evidence bundles"},"swarm-diagnose":{template:"/swarm diagnose",description:"Use /swarm diagnose to run health checks on swarm state"},"swarm-diagnosis":{template:"/swarm diagnosis",description:"Use /swarm diagnosis to run health checks on swarm state"},"swarm-preflight":{template:"/swarm preflight",description:"Use /swarm preflight to run preflight automation checks"},"swarm-sync-plan":{template:"/swarm sync-plan",description:"Use /swarm sync-plan to sync plan.json with plan.md"},"swarm-benchmark":{template:"/swarm benchmark",description:"Use /swarm benchmark to show performance metrics"},"swarm-gate-audit":{template:"/swarm gate-audit $ARGUMENTS",description:"Use /swarm gate-audit to run the bounded Tier-1 production gate matrix"},"swarm-gate-stats":{template:"/swarm gate-stats $ARGUMENTS",description:"Use /swarm gate-stats to summarize stored gate-audit evidence"},"swarm-costs":{template:"/swarm costs $ARGUMENTS",description:"Use /swarm costs to show per-agent, task, gate, and retry token/cost totals"},"swarm-export":{template:"/swarm export",description:"Use /swarm export to export plan and context as JSON"},"swarm-reset":{template:"/swarm reset --confirm",description:"Use /swarm reset --confirm to clear swarm state (requires --confirm)"},"swarm-rollback":{template:"/swarm rollback $ARGUMENTS",description:"Use /swarm rollback to restore swarm state to a checkpoint"},"swarm-retrieve":{template:"/swarm retrieve $ARGUMENTS",description:"Use /swarm retrieve to retrieve full output from summary"},"swarm-clarify":{template:"/swarm clarify $ARGUMENTS",description:"Use /swarm clarify to clarify and refine a feature specification"},"swarm-analyze":{template:"/swarm analyze",description:"Use /swarm analyze to analyze spec vs plan for coverage gaps"},"swarm-specify":{template:"/swarm specify $ARGUMENTS",description:"Use /swarm specify to generate or import a feature specification"},"swarm-brainstorm":{template:"/swarm brainstorm $ARGUMENTS",description:"Use /swarm brainstorm to enter the architect MODE: BRAINSTORM planning workflow"},"swarm-loop":{template:"/swarm loop $ARGUMENTS",description:"Use /swarm loop <objective> to run a compound-engineering loop: brainstorm → plan → build → review → improve, iterating until done [--max-cycles 1..5] [--autonomy checkpoint|auto] [--depth standard|exhaustive] [--resume]"},"swarm-council":{template:"/swarm council $ARGUMENTS",description:"Use /swarm council <question> to convene a multi-model General Council deliberation (generalist / skeptic / domain expert) [--spec-review]"},"swarm-pr-review":{template:"/swarm pr-review $ARGUMENTS",description:"Use /swarm pr-review to launch deep PR review with multi-lane analysis"},"swarm-pr-feedback":{template:"/swarm pr-feedback $ARGUMENTS",description:"Use /swarm pr-feedback to ingest and close known PR feedback (review comments, CI failures, conflicts) without a fresh broad review"},"swarm-ci-monitor":{template:"/swarm ci-monitor $ARGUMENTS",description:"Use /swarm ci-monitor to drive an already-reviewed, approved PR to green and merged (monitor CI, fix, merge)"},"swarm-pr-subscribe":{template:"/swarm pr subscribe $ARGUMENTS",description:shortcutDescription("pr subscribe")},"swarm-pr-unsubscribe":{template:"/swarm pr unsubscribe $ARGUMENTS",description:shortcutDescription("pr unsubscribe")},"swarm-pr-status":{template:"/swarm pr status",description:shortcutDescription("pr status")},"swarm-ci-simulate":{template:"/swarm ci-simulate $ARGUMENTS",description:shortcutDescription("ci-simulate")},"swarm-learning":{template:"/swarm learning",description:shortcutDescription("learning")},"swarm-post-mortem":{template:"/swarm post-mortem $ARGUMENTS",description:shortcutDescription("post-mortem")},"swarm-deep-dive":{template:"/swarm deep-dive $ARGUMENTS",description:"Use /swarm deep-dive to launch a read-only deep audit with parallel explorer waves, dual reviewers, and critic challenge"},"swarm-deep-research":{template:"/swarm deep-research $ARGUMENTS",description:"Use /swarm deep-research <question> to run a multi-source, fact-checked deep research pass and synthesize a cited report [--depth standard|exhaustive] [--max-researchers 1..6] [--rounds 1..4] [--brief]"},"swarm-codebase-review":{template:"/swarm codebase-review $ARGUMENTS",description:"Use /swarm codebase-review to launch codebase-review-swarm for a quote-grounded full-repo or large-subsystem audit"},"swarm-design-docs":{template:"/swarm design-docs $ARGUMENTS",description:"Use /swarm design-docs to generate or sync language-agnostic design docs for the project under build"},"swarm-sdd":{template:"/swarm sdd $ARGUMENTS",description:"Use /swarm sdd to inspect OpenSpec-compatible SDD artifacts"},"swarm-sdd-status":{template:"/swarm sdd status",description:"Use /swarm sdd status to show effective spec and OpenSpec artifact status"},"swarm-sdd-validate":{template:"/swarm sdd validate $ARGUMENTS",description:"Use /swarm sdd validate to validate OpenSpec-compatible SDD artifacts"},"swarm-sdd-project":{template:"/swarm sdd project $ARGUMENTS",description:"Use /swarm sdd project to materialize OpenSpec artifacts into .swarm/spec.md"},"swarm-issue":{template:"/swarm issue $ARGUMENTS",description:"Use /swarm issue to ingest a GitHub issue into the swarm workflow"},"swarm-qa-gates":{template:"/swarm qa-gates $ARGUMENTS",description:"Use /swarm qa-gates to view or modify QA gate profile for the current plan"},"swarm-dark-matter":{template:"/swarm dark-matter",description:"Use /swarm dark-matter to detect hidden file couplings"},"swarm-knowledge":{template:"/swarm knowledge $ARGUMENTS",description:"Use /swarm knowledge for knowledge management (quarantine/restore/migrate)"},"swarm-memory":{template:"/swarm memory $ARGUMENTS",description:"Use /swarm memory for memory status, JSONL export/import, and SQLite migration"},"swarm-memory-status":{template:"/swarm memory status",description:"Use /swarm memory status to show provider and migration status"},"swarm-memory-export":{template:"/swarm memory export",description:"Use /swarm memory export to write current memory to JSONL"},"swarm-memory-import":{template:"/swarm memory import",description:"Use /swarm memory import to import legacy JSONL into SQLite"},"swarm-memory-migrate":{template:"/swarm memory migrate",description:"Use /swarm memory migrate to run the one-time SQLite migration"},"swarm-curate":{template:"/swarm curate",description:"Use /swarm curate to curate knowledge artifacts and entries"},"swarm-consolidate":{template:"/swarm consolidate $ARGUMENTS",description:"Use /swarm consolidate to run quota-bounded skill-improver consolidation"},"swarm-concurrency":{template:"/swarm concurrency $ARGUMENTS",description:"Use /swarm concurrency to manage runtime concurrency override for plan execution"},"swarm-turbo":{template:"/swarm turbo",description:"Use /swarm turbo to enable turbo mode for faster execution"},"swarm-epic":{template:"/swarm epic $ARGUMENTS",description:shortcutDescription("epic")},"swarm-coupling":{template:"/swarm coupling $ARGUMENTS",description:shortcutDescription("coupling")},"swarm-lanes":{template:"/swarm lanes",description:shortcutDescription("lanes")},"swarm-guardrail-explain":{template:"/swarm guardrail explain $ARGUMENTS",description:shortcutDescription("guardrail explain")},"swarm-guardrail-log":{template:"/swarm guardrail-log $ARGUMENTS",description:shortcutDescription("guardrail-log")},"swarm-full-auto":{template:"/swarm full-auto $ARGUMENTS",description:"Toggle Full-Auto Mode for the active session [on|off]"},"swarm-auto-proceed":{template:"/swarm auto-proceed $ARGUMENTS",description:"Toggle auto-proceed mode for automatic phase advancement"},"swarm-write-retro":{template:"/swarm write-retro $ARGUMENTS",description:"Use /swarm write-retro to manually write a phase retrospective"},"swarm-reset-session":{template:"/swarm reset-session",description:"Use /swarm reset-session to clear session state and delegation chains"},"swarm-simulate":{template:"/swarm simulate $ARGUMENTS",description:"Use /swarm simulate to run a simulated agent session"},"swarm-promote":{template:"/swarm promote $ARGUMENTS",description:"Use /swarm promote to promote knowledge entries to production"},"swarm-checkpoint":{template:"/swarm checkpoint $ARGUMENTS",description:"Use /swarm checkpoint to save or restore git checkpoints"},"swarm-config-doctor":{template:"/swarm config doctor",description:"Use /swarm config doctor to diagnose configuration issues"},"swarm-evidence-summary":{template:"/swarm evidence summary",description:"Use /swarm evidence summary to generate evidence summaries"},"swarm-finalize":{template:"/swarm finalize",description:"Use /swarm finalize to archive the swarm project and close active state"},"swarm-close":{template:"/swarm close",description:"Deprecated alias for /swarm finalize"},"swarm-acknowledge-spec-drift":{template:"/swarm acknowledge-spec-drift",description:"Use /swarm acknowledge-spec-drift to acknowledge spec drift and suppress further warnings"},"swarm-doctor-tools":{template:"/swarm doctor tools",description:"Use /swarm doctor tools to run tool registration coherence check"},"swarm-link":{template:"/swarm link $ARGUMENTS",description:"Use /swarm link to link this worktree to a shared knowledge store [name|status]"},"swarm-unlink":{template:"/swarm unlink $ARGUMENTS",description:"Use /swarm unlink to unlink this worktree from the shared knowledge store [--no-copy]"}},log("Config applied",{agents:Object.keys(agents),commands:["swarm"]})},"experimental.chat.messages.transform":composeHandlers(...[(_input,output)=>{if(process.env.DEBUG_SWARM)console.error("[DIAG] messagesTransform START");let mctx=resolveMessageTransformContext(output);if(mctx.sessionID){let archAgent=swarmState.activeAgent.get(mctx.sessionID),archSession=swarmState.agentSessions.get(mctx.sessionID),agentName=archAgent??archSession?.agentName??"";if(stripKnownSwarmPrefix(agentName)===ORCHESTRATOR_NAME)try{delegationLedgerHook.onArchitectResume(mctx.sessionID)}catch{}}return Promise.resolve()},pipelineHook["experimental.chat.messages.transform"],contextBudgetHandler,initOrphanRecoveryAdvisoryHook.messagesTransform,guardrailsHooks.messagesTransform,fullAutoInterceptHook?.messagesTransform,ccCommandInterceptHook?.messagesTransform,delegationGateHooks.messagesTransform,issueTraceHook.messagesTransform,delegationSanitizerHook,memoryLifecycleHooks.messagesTransform,knowledgeInjectorHook,(_input,output)=>{try{let mctx=resolveMessageTransformContext(output);return knowledgeApplicationTransformScan(ctx.directory,output,mctx.sessionID)}catch{return Promise.resolve()}},(_input,output)=>{try{if(!skillPropagationConfig.enabled)return Promise.resolve();let mctx=resolveMessageTransformContext(output);return skillPropagationTransformScan(ctx.directory,output,mctx.sessionID,skillPropagationConfig)}catch{return Promise.resolve()}},(_input,output)=>{if(output.messages)output.messages=consolidateSystemMessages(output.messages);if(process.env.DEBUG_SWARM)console.error("[DIAG] messagesTransform DONE");return Promise.resolve()}].filter((fn2)=>Boolean(fn2))),"experimental.text.complete":prWorkflowResponseGate.textComplete,"experimental.chat.system.transform":composeHandlers(...[async(_input,_output)=>{if(process.env.DEBUG_SWARM)console.error("[DIAG] systemTransform START")},systemEnhancerHook["experimental.chat.system.transform"],async(_input,_output)=>{if(process.env.DEBUG_SWARM)console.error("[DIAG] systemTransform enhancer DONE")},contextCapsuleInjectHook["experimental.chat.system.transform"],(input,_output)=>{try{let{sessionID}=input;if(!sessionID)return Promise.resolve();let lastTime=_heartbeatTimers.get(sessionID);if(Date.now()-(lastTime??0)>30000)_heartbeatTimers.set(sessionID,Date.now()),capSessionMap(_heartbeatTimers,MAX_TRACKED_HEARTBEAT_SESSIONS),telemetry.heartbeat(sessionID)}catch{}return Promise.resolve()},automationConfig.capabilities?.phase_preflight===!0&&preflightTriggerManager?createPhaseMonitorHook(ctx.directory,preflightTriggerManager,void 0,(sessionId)=>createCuratorLLMDelegate(ctx.directory,"init",sessionId)):knowledgeConfig.enabled?createPhaseMonitorHook(ctx.directory,void 0,void 0,(sessionId)=>createCuratorLLMDelegate(ctx.directory,"init",sessionId)):void 0,swarmCommandSystemRuleHook,(_input,output)=>{if(Array.isArray(output.system)&&output.system.length>1)output.system=[output.system.join(`
6331
+ `)),output.system=system}}var OpenCodeSwarm=async(ctx)=>{try{return await initializeOpenCodeSwarm(ctx)}catch(err2){let stack=err2 instanceof Error?err2.stack??err2.message:String(err2);throw console.error("[opencode-swarm] FATAL: plugin initialization failed. Plugin will not be available."),console.error(stack),err2}},MAX_TRACKED_ASSISTANT_USAGE_EVENTS=200,latestAssistantUsageBySession=new Map;function rememberAssistantUsageEvent(input){let event=isPlainRecord(input)?input.event:void 0;if(!isPlainRecord(event))return;if(event.type==="message.updated"){let properties=isPlainRecord(event.properties)?event.properties:void 0,info=isPlainRecord(properties?.info)?properties.info:void 0;if(info?.role==="assistant")rememberAssistantUsage(info.sessionID,info);return}if(event.type==="message.part.updated"){let properties=isPlainRecord(event.properties)?event.properties:void 0,part=isPlainRecord(properties?.part)?properties.part:void 0;if(part?.type==="step-finish")rememberAssistantUsage(part.sessionID,part)}}function rememberAssistantUsage(sessionID,raw){if(typeof sessionID!=="string"||sessionID.trim()==="")return;latestAssistantUsageBySession.set(sessionID,raw);while(latestAssistantUsageBySession.size>MAX_TRACKED_ASSISTANT_USAGE_EVENTS){let oldest=latestAssistantUsageBySession.keys().next().value;if(oldest===void 0)break;latestAssistantUsageBySession.delete(oldest)}}function consumeAssistantUsageForTask(parentSessionID,taskOutput){let sessionIDs=[parentSessionID,...collectSessionIDs(taskOutput)];for(let sessionID of sessionIDs){let usage=latestAssistantUsageBySession.get(sessionID);if(usage!==void 0)return latestAssistantUsageBySession.delete(sessionID),usage}return}function collectSessionIDs(raw){let found=[],seen=new Set,visit=(value,depth)=>{if(depth>3||!isPlainRecord(value)||seen.has(value))return;seen.add(value);for(let key of["sessionID","sessionId","session_id"]){let candidate=value[key];if(typeof candidate==="string"&&candidate.trim()!=="")found.push(candidate)}for(let key of["metadata","data","info","message","response","output"])visit(value[key],depth+1)};return visit(raw,0),[...new Set(found)]}function resolveDelegationModel(config3,agentName,baseAgentName){let topLevelModel=config3.agents?.[agentName]?.model??config3.agents?.[baseAgentName]?.model;if(topLevelModel)return topLevelModel;let swarmID=inferSwarmID(agentName,baseAgentName),swarmAgents=swarmID?config3.swarms?.[swarmID]?.agents:void 0;return swarmAgents?.[agentName]?.model??swarmAgents?.[baseAgentName]?.model??DEFAULT_MODELS[baseAgentName]??DEFAULT_MODELS.default}function inferSwarmID(agentName,baseAgentName){if(!agentName||agentName===baseAgentName)return;for(let separator of["_","-"," "]){let suffix=`${separator}${baseAgentName}`;if(agentName.endsWith(suffix)&&agentName.length>suffix.length)return agentName.slice(0,-suffix.length)}return}function isPlainRecord(value){return typeof value==="object"&&value!==null&&!Array.isArray(value)}async function initializeOpenCodeSwarm(ctx){clearDeferredWarnings();let{config:config3,loadedFromFile}=await loadPluginConfigWithMetaAsync(ctx.directory);if(config3.full_auto?.enabled===!0){let criticModel=config3.full_auto.critic_model??config3.agents?.critic?.model??DEFAULT_MODELS.critic,architectModel=config3.agents?.architect?.model??DEFAULT_MODELS.default;if(criticModel===architectModel)if(!config3.quiet)console.warn("[opencode-swarm] Full-auto mode warning: critic model matches architect model. Model validation is advisory-only; full-auto remains enabled. (Runtime architect model is determined by the orchestrator)");else addDeferredWarning("[opencode-swarm] Full-auto mode warning: critic model matches architect model. Model validation is advisory-only; full-auto remains enabled. (Runtime architect model is determined by the orchestrator)")}{let noFallback=[],hasNoFallback=(cfg)=>cfg.model&&(!cfg.fallback_models||cfg.fallback_models.length===0);if(config3.agents){for(let[name,cfg]of Object.entries(config3.agents))if(hasNoFallback(cfg))noFallback.push(`${name}(${cfg.model})`)}if(config3.swarms){for(let[swarmId,swarm]of Object.entries(config3.swarms))if(swarm.agents){for(let[name,cfg]of Object.entries(swarm.agents))if(hasNoFallback(cfg))noFallback.push(`${swarmId}/${name}(${cfg.model})`)}}if(noFallback.length>0){let msg=`[opencode-swarm] WARNING: ${noFallback.length} agent(s) use a custom model without fallback_models: `+noFallback.join(", ")+'. Add "fallback_models": ["model-a"] to each agent config for reliability.';if(!config3.quiet)console.warn(msg);else addDeferredWarning(msg)}}swarmState.fullAutoEnabledInConfig=config3.full_auto?.enabled===!0,swarmState.opencodeClient=ctx.client,await withTimeout(loadSnapshot(ctx.directory),5000,Error("loadSnapshot exceeded 5s budget; continuing without snapshot rehydration")).catch((err2)=>{let msg=err2 instanceof Error?err2.message:String(err2);log("loadSnapshot timed out or failed (non-fatal)",{error:msg})}),initTelemetry(ctx.directory);let repoGraphHook=createRepoGraphBuilderHook(ctx.directory,void 0,{excludeDirs:config3.repo_graph?.exclude_dirs});if(queueMicrotask(()=>{let watchdog=setTimeout(()=>{log("[repo-graph] init exceeded 30s budget; scan will continue but is overdue")},30000);if(typeof watchdog.unref==="function")watchdog.unref();repoGraphHook.init().catch(()=>{}).finally(()=>clearTimeout(watchdog))}),await withTimeout(ensureSwarmGitExcluded(ctx.directory,{quiet:config3.quiet}),ENSURE_SWARM_GIT_EXCLUDED_OUTER_TIMEOUT_MS,Error(`ensureSwarmGitExcluded exceeded ${ENSURE_SWARM_GIT_EXCLUDED_OUTER_TIMEOUT_MS}ms budget; continuing without git-hygiene check`)).catch((err2)=>{let msg=err2 instanceof Error?err2.message:String(err2);log("ensureSwarmGitExcluded timed out or failed (non-fatal)",{error:msg})}),queueMicrotask(()=>{runInitOrphanRecovery(ctx.directory).catch((err2)=>{let msg=err2 instanceof Error?err2.message:String(err2);log("initOrphanRecovery failed (non-fatal)",{error:msg})})}),writeSwarmConfigExampleIfNew(ctx.directory),writeProjectConfigIfNew(ctx.directory,config3.quiet),queueMicrotask(()=>{withTimeout(syncBundledProjectSkillsIfMissingAsync(ctx.directory,PACKAGE_ROOT2,config3.quiet),SYNC_BUNDLED_SKILLS_TIMEOUT_MS,Error(`syncBundledProjectSkillsIfMissingAsync exceeded ${SYNC_BUNDLED_SKILLS_TIMEOUT_MS}ms budget; continuing without skill materialization (command-path sync remains a backstop)`)).catch((err2)=>{let msg=err2 instanceof Error?err2.message:String(err2);log("bundled skill materialization timed out or failed (non-fatal)",{error:msg})})}),config3.version_check!==!1)scheduleVersionCheck(package_default.version,(msg)=>{if(config3.quiet)addDeferredWarning(msg);else console.warn(msg)});let projectContext=await withTimeout((async()=>{return(await Promise.resolve().then(() => (init_project_context(),exports_project_context))).buildProjectContext(ctx.directory)})(),300,Error("language-backend detection exceeded 300ms; continuing with unresolved sentinels")).catch((err2)=>{let msg=err2 instanceof Error?err2.message:String(err2);return log("language-backend detection timed out or failed (non-fatal)",{error:msg}),null}),agents=getAgentConfigs(config3,ctx.directory,void 0,projectContext??void 0),agentDefinitions=createAgents(config3,projectContext??void 0),agentDefinitionMap=Object.fromEntries(agentDefinitions.map((agent)=>[agent.name,agent]));swarmState.curatorInitAgentNames=Object.keys(agents).filter((k)=>k==="curator_init"||k.endsWith("_curator_init")),swarmState.curatorPhaseAgentNames=Object.keys(agents).filter((k)=>k==="curator_phase"||k.endsWith("_curator_phase")),swarmState.curatorPostmortemAgentNames=Object.keys(agents).filter((k)=>k==="curator_postmortem"||k.endsWith("_curator_postmortem")),swarmState.curatorConsolidationAgentNames=Object.keys(agents).filter((k)=>k==="curator_consolidation"||k.endsWith("_curator_consolidation")),swarmState.skillImproverAgentNames=Object.keys(agents).filter((k)=>k==="skill_improver"||k.endsWith("_skill_improver")),swarmState.specWriterAgentNames=Object.keys(agents).filter((k)=>k==="spec_writer"||k.endsWith("_spec_writer")),swarmState.generatedAgentNames=Object.keys(agents);let pipelineHook=createPipelineTrackerHook(config3,ctx.directory),systemEnhancerHook=createSystemEnhancerHook(config3,ctx.directory),contextCapsuleInjectHook=createContextCapsuleInjectHook(config3,ctx.directory),compactionHook=createCompactionCustomizerHook(config3,ctx.directory),contextBudgetHandler=createContextBudgetHandler(config3),evaluationModelDispatcher=createEvaluationModelDispatcher(ctx.client),commandHandler=createSwarmCommandHandler(ctx.directory,agentDefinitionMap,{getActiveAgentName:(sessionID)=>swarmState.activeAgent.get(sessionID),packageRoot:PACKAGE_ROOT2,registeredAgents:agents,evaluationModelDispatcher}),swarmCommandSystemRuleHook=createSwarmCommandSystemRuleHook(agentDefinitionMap,agents),activityHooks=createAgentActivityHooks(config3,ctx.directory),prmHook=createPrmHook(config3.prm??PrmConfigSchema.parse({}),ctx.directory),trajectoryLoggerHook=createTrajectoryLoggerHook({enabled:!0,max_lines:1000},ctx.directory),delegationGateHooks=createDelegationGateHook(config3,ctx.directory),backgroundCompletionObserver=createBackgroundCompletionObserver({config:{enabled:config3.hooks?.background_subagents===!0},directory:ctx.directory}),delegationSanitizerHook=createDelegationSanitizerHook(ctx.directory),memoryLifecycleHooks=createMemoryLifecycleHooks({directory:ctx.directory,config:config3.memory,getActiveAgentName:(sessionID)=>sessionID?swarmState.activeAgent.get(sessionID):void 0,getActiveTaskId:(sessionID)=>sessionID?swarmState.agentSessions.get(sessionID)?.currentTaskId??void 0:void 0}),guardrailsFallback=config3.guardrails?.enabled===!1?{...config3.guardrails,enabled:!1}:config3.guardrails??{},guardrailsConfig=GuardrailsConfigSchema.parse(guardrailsFallback);if(loadedFromFile&&guardrailsConfig.enabled===!1)warn(""),warn("══════════════════════════════════════════════════════════════"),warn("[opencode-swarm] \uD83D\uDD34 SECURITY WARNING: GUARDRAILS ARE DISABLED"),warn("══════════════════════════════════════════════════════════════"),warn("Guardrails have been explicitly disabled in user configuration."),warn("This disables safety measures including:"),warn(" - Tool call limits"),warn(" - Duration limits"),warn(" - Repetition detection"),warn(" - Error rate limits"),warn(" - Idle timeouts"),warn(""),warn("Only disable guardrails if you fully understand the security implications."),warn('To re-enable guardrails, set "guardrails.enabled" to true in your config.'),warn("══════════════════════════════════════════════════════════════"),warn("");let delegationHandler=createDelegationTrackerHook(config3,guardrailsConfig.enabled),authorityConfig=AuthorityConfigSchema.parse(config3.authority??{}),worktreeDirOverride=resolveWorktreeIsolationConfig(config3).worktree_dir,worktreeBaseDirOverrides=worktreeDirOverride?[worktreeDirOverride]:[],guardrailsHooks=createGuardrailsHooks(ctx.directory,void 0,guardrailsConfig,authorityConfig,worktreeBaseDirOverrides),fullAutoInterceptHook=createFullAutoInterceptHook(config3,ctx.directory),fullAutoPermissionHook=createFullAutoPermissionHook({config:config3,directory:ctx.directory}),fullAutoInputProbeHook=createFullAutoInputProbeHook({config:config3,directory:ctx.directory}),fullAutoDelegationHook=createFullAutoDelegationHook({config:config3,directory:ctx.directory}),ccCommandInterceptHook=createCcCommandInterceptHook({}),issueTraceHook=createIssueTraceHook(config3,ctx.directory),watchdogConfig=WatchdogConfigSchema.parse(config3.watchdog??{}),advisoryInjector=(sessionId,message)=>{let s=swarmState.agentSessions.get(sessionId);if(s)s.pendingAdvisoryMessages??=[],s.pendingAdvisoryMessages.push(message)},scopeGuardHook=createScopeGuardHook({enabled:watchdogConfig.scope_guard,skip_in_turbo:watchdogConfig.skip_in_turbo},ctx.directory,advisoryInjector),prWorkflowResponseGate=createPrWorkflowResponseGate({directory:ctx.directory,client:ctx.client}),prWorkflowSessionResolver=createPrWorkflowSessionResolver({directory:ctx.directory,client:ctx.client}),delegationLedgerHook=createDelegationLedgerHook({enabled:watchdogConfig.delegation_ledger},ctx.directory,advisoryInjector),initOrphanRecoveryAdvisoryHook=createInitOrphanRecoveryAdvisoryHook(ctx.directory),selfReviewConfig=SelfReviewConfigSchema.parse(config3.self_review??{}),selfReviewHook=createSelfReviewHook({enabled:selfReviewConfig.enabled,skip_in_turbo:selfReviewConfig.skip_in_turbo},advisoryInjector),autoReviewHook=createAutoReviewHook({config:AutoReviewConfigSchema.parse(config3.auto_review??{}),directory:ctx.directory,injectAdvisory:advisoryInjector}),summaryConfig=SummaryConfigSchema.parse(config3.summaries??{}),toolSummarizerHook=createToolSummarizerHook(summaryConfig,ctx.directory),knowledgeConfigBase=config3.knowledge??{},knowledgeConfig=KnowledgeConfigSchema.parse(knowledgeConfigBase),skillImproverConfig=SkillImproverConfigSchema.parse(config3.skill_improver??{}),skillPropagationConfig=SkillPropagationConfigSchema.parse(config3.skillPropagation??{});if(skillImproverConfig.enabled&&skillImproverConfig.trigger==="scheduled")queueMicrotask(()=>{Promise.resolve().then(() => (init_skill_consolidation(),exports_skill_consolidation)).then(({runSkillConsolidationFireAndForget:runSkillConsolidationFireAndForget2})=>{runSkillConsolidationFireAndForget2({directory:ctx.directory,config:skillImproverConfig,source:"startup",enrichmentQuota:{maxCalls:knowledgeConfig.enrichment.max_calls_per_day,window:knowledgeConfig.enrichment.quota_window},evaluateDrafts:!0},void 0,(err2)=>{let msg=err2 instanceof Error?err2.message:String(err2);log("scheduled skill consolidation failed (non-fatal)",{error:msg})})}).catch((err2)=>{let msg=err2 instanceof Error?err2.message:String(err2);log("failed to schedule skill consolidation (non-fatal)",{error:msg})})});let knowledgeCuratorHook=knowledgeConfig.enabled?createKnowledgeCuratorHook(ctx.directory,knowledgeConfig,{llmDelegateFactory:(sessionID)=>createCuratorLLMDelegate(ctx.directory,"phase",sessionID),enrichmentQuota:{maxCalls:knowledgeConfig.enrichment.max_calls_per_day,window:knowledgeConfig.enrichment.quota_window}}):void 0,hivePromoterHook=knowledgeConfig.enabled&&knowledgeConfig.hive_enabled?createHivePromoterHook(ctx.directory,knowledgeConfig):void 0,knowledgeInjectorHook=knowledgeConfig.enabled?createKnowledgeInjectorHook(ctx.directory,knowledgeConfig,config3.context_budget?.model_limits??{},config3.context_budget?.unified_injection_tokens):void 0,steeringConsumedHook=createSteeringConsumedHook(ctx.directory),coChangeSuggesterHook=createCoChangeSuggesterHook(ctx.directory),darkMatterDetectorHook=createDarkMatterDetectorHook(ctx.directory),slopDetectorHook=config3.slop_detector?.enabled!==!1?createSlopDetectorHook(config3.slop_detector??{enabled:!0,classThreshold:3,commentStripThreshold:5,diffLineThreshold:200,importHygieneThreshold:2},ctx.directory,(sessionId,message)=>{let s=swarmState.agentSessions.get(sessionId);if(s)s.pendingAdvisoryMessages??=[],s.pendingAdvisoryMessages.push(message)}):null,incrementalVerifyHook=config3.incremental_verify?.enabled!==!1?createIncrementalVerifyHook(config3.incremental_verify??{enabled:!0,command:null,timeoutMs:30000,triggerAgents:["coder"]},ctx.directory,(sessionId,message)=>{let s=swarmState.agentSessions.get(sessionId);if(s)s.pendingAdvisoryMessages??=[],s.pendingAdvisoryMessages.push(message)}):null,compactionServiceHook=config3.compaction_service?.enabled!==!1?createCompactionService(config3.compaction_service??{enabled:!0,observationThreshold:40,reflectionThreshold:60,emergencyThreshold:80,preserveLastNTurns:5},ctx.directory,(sessionId,message)=>{let s=swarmState.agentSessions.get(sessionId);if(s)s.pendingAdvisoryMessages??=[],s.pendingAdvisoryMessages.push(message)}):null,snapshotWriterHook=createSnapshotWriterHook(ctx.directory),automationConfig=AutomationConfigSchema.parse(config3.automation??{}),automationManager,preflightTriggerManager,statusArtifact,prMonitorWorker=null;if(automationConfig.mode!=="manual"){automationManager=createAutomationManager(automationConfig),automationManager.start();let{PreflightTriggerManager:PTM}=await Promise.resolve().then(() => (init_trigger(),exports_trigger));preflightTriggerManager=new PTM(automationConfig);let{AutomationStatusArtifact:ASA}=await Promise.resolve().then(() => (init_status_artifact(),exports_status_artifact)),swarmDir=path268.resolve(ctx.directory,".swarm");if(statusArtifact=new ASA(swarmDir),statusArtifact.updateConfig(automationConfig.mode,automationConfig.capabilities),automationConfig.capabilities?.evidence_auto_summaries===!0){let{createEvidenceSummaryIntegration:createEvidenceSummaryIntegration2}=await Promise.resolve().then(() => (init_evidence_summary_integration(),exports_evidence_summary_integration));createEvidenceSummaryIntegration2({automationConfig,directory:ctx.directory,projectDir:ctx.directory,summaryFilename:"evidence-summary.json"}),log("Evidence summary integration initialized",{directory:ctx.directory})}if(automationConfig.capabilities?.phase_preflight===!0){let{createPreflightIntegration:createPreflightIntegration2}=await Promise.resolve().then(() => (init_preflight_integration(),exports_preflight_integration));try{let{manager}=createPreflightIntegration2({automationConfig,directory:ctx.directory,swarmDir});preflightTriggerManager=manager,log("Preflight integration initialized",{directory:ctx.directory})}catch(err2){log("Preflight integration failed to initialize (non-fatal)",{error:err2 instanceof Error?err2.message:String(err2)})}}if(automationConfig.capabilities?.plan_sync===!0)try{new PlanSyncWorker({directory:ctx.directory}).start(),log("PlanSyncWorker initialized",{directory:ctx.directory})}catch(err2){log("PlanSyncWorker failed to initialize (non-fatal)",{error:err2 instanceof Error?err2.message:String(err2)})}log("Automation framework initialized",{mode:automationConfig.mode,enabled:automationManager?.isEnabled(),running:automationManager?.isActive(),preflightEnabled:preflightTriggerManager?.isEnabled()})}let prMonitorConfig=PrMonitorConfigSchema.parse(config3.pr_monitor??{});function ensurePrMonitorWorkerRunning(directory){try{if(!prMonitorConfig.enabled)return;if(!prMonitorWorker)prMonitorWorker=new PrMonitorWorker({directory,config:prMonitorConfig});if(!prMonitorWorker.isRunning())prMonitorWorker.start(),log("PR Monitor Worker started",{directory})}catch(err2){error48("[pr-monitor] Worker failed to start (non-fatal)",{error:err2 instanceof Error?err2.message:String(err2)})}}setOnSubscriptionCreated((directory,_record3)=>{ensurePrMonitorWorkerRunning(directory)});let prEventCleanup=null,prEventDelivery=null;if(prMonitorConfig.enabled){try{let{registerPrEventSubscribers:registerPrEventSubscribers2}=await Promise.resolve().then(() => (init_pr_event_subscribers(),exports_pr_event_subscribers));prEventCleanup=registerPrEventSubscribers2({directory:ctx.directory,config:prMonitorConfig})}catch(err2){log("[pr-monitor] Failed to register PR event subscribers (non-fatal)",{error:err2 instanceof Error?err2.message:String(err2)})}if(prMonitorConfig.event_delivery==="prompt")try{let deliveryModule=await Promise.resolve().then(() => (init_pr_event_delivery(),exports_pr_event_delivery));deliveryModule.registerPrEventDelivery({client:ctx.client,directory:ctx.directory,config:prMonitorConfig}),prEventDelivery={noteSessionIdle:deliveryModule.noteSessionIdle,unregisterPrEventDelivery:deliveryModule.unregisterPrEventDelivery}}catch(err2){log("[pr-monitor] Failed to register wake delivery (non-fatal)",{error:err2 instanceof Error?err2.message:String(err2)})}}let prAutoSubscribeHook=createPrAutoSubscribeHook(ctx.directory,prMonitorConfig);if(prMonitorConfig.enabled)queueMicrotask(()=>{listActive(ctx.directory).then((active)=>{if(active.length>0)ensurePrMonitorWorkerRunning(ctx.directory)}).catch((err2)=>{error48("[pr-monitor] Startup scan failed (non-fatal)",{error:err2 instanceof Error?err2.message:String(err2)})})});let cleanupAutomation=()=>{automationManager?.stop(),prMonitorWorker?.stop(),prEventCleanup?.(),prEventDelivery?.unregisterPrEventDelivery()};if(process.on("exit",cleanupAutomation),shouldRunOnStartup(automationConfig)){let enableAutofix=automationConfig.capabilities?.config_doctor_autofix===!0;Promise.resolve().then(() => (init_config_doctor(),exports_config_doctor)).then(({runConfigDoctorWithFixes:runConfigDoctorWithFixes2})=>{runConfigDoctorWithFixes2(ctx.directory,config3,enableAutofix).then((doctorResult)=>{if(doctorResult.result.findings.length>0){log("Config Doctor ran on startup",{findings:doctorResult.result.findings.length,errors:doctorResult.result.summary.error,warnings:doctorResult.result.summary.warn,appliedFixes:doctorResult.appliedFixes.length,autofixEnabled:enableAutofix});try{let autoFixableCount=doctorResult.result.findings.filter((f)=>f.autoFixable).length,appliedCount=doctorResult.appliedFixes.length;if(!enableAutofix&&autoFixableCount>0){let msg=`[opencode-swarm] Config Doctor found ${autoFixableCount} auto-fixable issue(s). Run /swarm config doctor --fix to apply.`;if(!config3.quiet)console.warn(msg);else addDeferredWarning(msg)}else if(enableAutofix){let parts=[];if(appliedCount>0)parts.push(`applied ${appliedCount} fix(es) automatically`);let unapplied=Math.max(0,autoFixableCount-appliedCount);if(unapplied>0)parts.push(`${unapplied} auto-fixable issue(s) need explicit review — run /swarm config doctor --fix`);if(parts.length>0){let msg=`[opencode-swarm] Config Doctor: ${parts.join("; ")}.`;if(!config3.quiet)console.warn(msg);else addDeferredWarning(msg)}}}catch{}}}).catch((err2)=>{log("Config Doctor error (non-fatal)",{error:err2 instanceof Error?err2.message:String(err2)})})})}return log("Plugin initialized",{maxIterations:config3.max_iterations,agentCount:Object.keys(agents).length,hooks:{pipeline:!!pipelineHook["experimental.chat.messages.transform"],systemEnhancer:!!systemEnhancerHook["experimental.chat.system.transform"],compaction:!!compactionHook["experimental.session.compacting"],contextBudget:!!contextBudgetHandler,commands:!0,agentActivity:config3.hooks?.agent_activity!==!1,delegationTracker:config3.hooks?.delegation_tracker===!0,guardrails:guardrailsConfig.enabled,toolSummarizer:summaryConfig.enabled,knowledge:knowledgeConfig.enabled},automation:{mode:automationConfig.mode,capabilities:automationConfig.capabilities}}),{name:"opencode-swarm",agent:agents,tool:buildPluginToolObject(agentDefinitionMap,config3,evaluationModelDispatcher),event:async(input)=>{try{rememberAssistantUsageEvent(input);let lifecycleEvent=input.event;if(lifecycleEvent?.type==="message.part.updated"){let part=lifecycleEvent.properties?.part,metadata=part?.state?.metadata,partTool=typeof part?.tool==="string"?normalizeToolName(part.tool)?.toLowerCase():void 0,eventParentSessionID=typeof part?.sessionID==="string"&&part.sessionID.trim()!==""?part.sessionID:void 0,eventChildSessionID=typeof metadata?.sessionId==="string"&&metadata.sessionId.trim()!==""?metadata.sessionId:void 0;if(part?.type==="tool"&&partTool==="task"&&typeof part.callID==="string"&&part.callID.trim()!==""&&eventParentSessionID!==void 0&&eventChildSessionID!==void 0&&eventParentSessionID!==eventChildSessionID)await delegationGateHooks.taskMetadata({callID:part.callID,parentSessionID:eventParentSessionID,childSessionID:eventChildSessionID})}let lifecycleStatus=lifecycleEvent?.properties?.status;if(lifecycleEvent?.type==="session.deleted"||lifecycleEvent?.type==="session.removed"||lifecycleEvent?.type==="session.idle"||lifecycleEvent?.type==="session.error"||lifecycleEvent?.type==="session.status"&&(lifecycleStatus==="idle"||typeof lifecycleStatus==="object"&&(lifecycleStatus.type==="idle"||lifecycleStatus.type==="error"))){let properties=lifecycleEvent.properties,sessionID=properties?.sessionID??properties?.sessionId??properties?.info?.sessionID??properties?.info?.id??properties?.id;if(sessionID)delegationGateHooks.sessionEnded(sessionID,lifecycleEvent.type==="session.deleted"||lifecycleEvent.type==="session.removed")}if(prWorkflowSessionResolver.observeEvent(input),await prWorkflowResponseGate.event(input),prEventDelivery){let evt=input.event;if(evt?.type==="session.idle"&&typeof evt.properties?.sessionID==="string")prEventDelivery.noteSessionIdle(evt.properties.sessionID)}await backgroundCompletionObserver.event(input)}catch(err2){warn(`[swarm] event hook error: ${err2 instanceof Error?err2.message:String(err2)}`)}},config:async(opencodeConfig)=>{let isObjectRecord=(value)=>typeof value==="object"&&value!==null,pluginConfig=opencodeConfig;if(!isObjectRecord(pluginConfig.agent))pluginConfig.agent={};let agentConfig=pluginConfig.agent;Object.assign(agentConfig,agents);let autoSelect=config3?.auto_select_architect;if(autoSelect)if(Object.keys(agents).some((name)=>stripKnownSwarmPrefix(name)==="architect")){for(let builtin of["build","plan"]){let existing=agentConfig[builtin];if(isObjectRecord(existing)&&existing.disable===!0)continue;agentConfig[builtin]={...isObjectRecord(existing)?existing:{},disable:!0}}if(autoSelect===!0){let primaryArchitects=Object.entries(agents).filter(([name,cfg])=>stripKnownSwarmPrefix(name)==="architect"&&isObjectRecord(cfg)&&cfg.mode==="primary");if(primaryArchitects.length>1){let names=primaryArchitects.map(([n])=>n).join(", ");addDeferredWarning(`[swarm] auto_select_architect is true but ${primaryArchitects.length} architect agents are primary (${names}). Consider setting auto_select_architect to a specific agent name.`)}}if(typeof autoSelect==="string"&&autoSelect!==""){let targetName=autoSelect;if(Object.hasOwn(agents,targetName)&&stripKnownSwarmPrefix(targetName)==="architect"){for(let[name,cfg]of Object.entries(agents))if(stripKnownSwarmPrefix(name)==="architect"&&name!==targetName)agentConfig[name]={...isObjectRecord(cfg)?cfg:{},mode:"subagent"};let targetExisting=agentConfig[targetName],targetAgent=agents[targetName];agentConfig[targetName]={...isObjectRecord(targetExisting)?targetExisting:{},...isObjectRecord(targetAgent)?targetAgent:{},mode:"primary"}}else addDeferredWarning(`[swarm] auto_select_architect is set to "${targetName}" but that is not a known architect agent. No architect demotion applied.`)}}else addDeferredWarning("[swarm] auto_select_architect is enabled but no architect agents were found in the generated set. The option has no effect.");let shortcutDescription=(cmd)=>{let entry=COMMAND_REGISTRY[cmd];if(!entry?.description)return`Use /swarm ${cmd}`;let desc=entry.description.charAt(0).toLowerCase()+entry.description.slice(1);return`Use /swarm ${cmd} to ${desc}`};opencodeConfig.command={...opencodeConfig.command||{},swarm:{template:"/swarm $ARGUMENTS",description:(()=>{return`Swarm management commands: /swarm [${VALID_COMMANDS.filter((cmd)=>{let entry=COMMAND_REGISTRY[cmd];return!entry.aliasOf&&!entry.deprecated&&!entry.subcommandOf}).join("|")}]`})()},"swarm-status":{template:"/swarm status",description:"Use /swarm status to show current swarm status and active phase"},"swarm-show-plan":{template:"/swarm show-plan $ARGUMENTS",description:"Use /swarm show-plan to view or filter the current execution plan"},"swarm-plan":{template:"/swarm plan $ARGUMENTS",description:"Deprecated alias for /swarm show-plan"},"swarm-agents":{template:"/swarm agents",description:"Use /swarm agents to list registered swarm agents"},"swarm-history":{template:"/swarm history",description:"Use /swarm history to show completed phases summary"},"swarm-config":{template:"/swarm config $ARGUMENTS",description:"Use /swarm config to show or validate configuration"},"swarm-evidence":{template:"/swarm evidence $ARGUMENTS",description:"Use /swarm evidence to view evidence bundles and summaries"},"swarm-handoff":{template:"/swarm handoff",description:"Use /swarm handoff to prepare handoff brief for switching models mid-task"},"swarm-archive":{template:"/swarm archive",description:"Use /swarm archive to archive old evidence bundles"},"swarm-diagnose":{template:"/swarm diagnose",description:"Use /swarm diagnose to run health checks on swarm state"},"swarm-diagnosis":{template:"/swarm diagnosis",description:"Use /swarm diagnosis to run health checks on swarm state"},"swarm-preflight":{template:"/swarm preflight",description:"Use /swarm preflight to run preflight automation checks"},"swarm-sync-plan":{template:"/swarm sync-plan",description:"Use /swarm sync-plan to sync plan.json with plan.md"},"swarm-benchmark":{template:"/swarm benchmark",description:"Use /swarm benchmark to show performance metrics"},"swarm-gate-audit":{template:"/swarm gate-audit $ARGUMENTS",description:"Use /swarm gate-audit to run the bounded Tier-1 production gate matrix"},"swarm-gate-stats":{template:"/swarm gate-stats $ARGUMENTS",description:"Use /swarm gate-stats to summarize stored gate-audit evidence"},"swarm-costs":{template:"/swarm costs $ARGUMENTS",description:"Use /swarm costs to show per-agent, task, gate, and retry token/cost totals"},"swarm-export":{template:"/swarm export",description:"Use /swarm export to export plan and context as JSON"},"swarm-reset":{template:"/swarm reset --confirm",description:"Use /swarm reset --confirm to clear swarm state (requires --confirm)"},"swarm-rollback":{template:"/swarm rollback $ARGUMENTS",description:"Use /swarm rollback to restore swarm state to a checkpoint"},"swarm-retrieve":{template:"/swarm retrieve $ARGUMENTS",description:"Use /swarm retrieve to retrieve full output from summary"},"swarm-clarify":{template:"/swarm clarify $ARGUMENTS",description:"Use /swarm clarify to clarify and refine a feature specification"},"swarm-analyze":{template:"/swarm analyze",description:"Use /swarm analyze to analyze spec vs plan for coverage gaps"},"swarm-specify":{template:"/swarm specify $ARGUMENTS",description:"Use /swarm specify to generate or import a feature specification"},"swarm-brainstorm":{template:"/swarm brainstorm $ARGUMENTS",description:"Use /swarm brainstorm to enter the architect MODE: BRAINSTORM planning workflow"},"swarm-loop":{template:"/swarm loop $ARGUMENTS",description:"Use /swarm loop <objective> to run a compound-engineering loop: brainstorm → plan → build → review → improve, iterating until done [--max-cycles 1..5] [--autonomy checkpoint|auto] [--depth standard|exhaustive] [--resume]"},"swarm-council":{template:"/swarm council $ARGUMENTS",description:"Use /swarm council <question> to convene a multi-model General Council deliberation (generalist / skeptic / domain expert) [--spec-review]"},"swarm-pr-review":{template:"/swarm pr-review $ARGUMENTS",description:"Use /swarm pr-review to launch deep PR review with multi-lane analysis"},"swarm-pr-feedback":{template:"/swarm pr-feedback $ARGUMENTS",description:"Use /swarm pr-feedback to ingest and close known PR feedback (review comments, CI failures, conflicts) without a fresh broad review"},"swarm-abort-pr-workflow":{template:"/swarm abort-pr-workflow $ARGUMENTS",description:"Use /swarm abort-pr-workflow to clear a stuck PR_REVIEW/PR_FEEDBACK mechanical gate and stop the auto-resume loop (human-only escape hatch)"},"swarm-ci-monitor":{template:"/swarm ci-monitor $ARGUMENTS",description:"Use /swarm ci-monitor to drive an already-reviewed, approved PR to green and merged (monitor CI, fix, merge)"},"swarm-pr-subscribe":{template:"/swarm pr subscribe $ARGUMENTS",description:shortcutDescription("pr subscribe")},"swarm-pr-unsubscribe":{template:"/swarm pr unsubscribe $ARGUMENTS",description:shortcutDescription("pr unsubscribe")},"swarm-pr-status":{template:"/swarm pr status",description:shortcutDescription("pr status")},"swarm-ci-simulate":{template:"/swarm ci-simulate $ARGUMENTS",description:shortcutDescription("ci-simulate")},"swarm-learning":{template:"/swarm learning",description:shortcutDescription("learning")},"swarm-post-mortem":{template:"/swarm post-mortem $ARGUMENTS",description:shortcutDescription("post-mortem")},"swarm-deep-dive":{template:"/swarm deep-dive $ARGUMENTS",description:"Use /swarm deep-dive to launch a read-only deep audit with parallel explorer waves, dual reviewers, and critic challenge"},"swarm-deep-research":{template:"/swarm deep-research $ARGUMENTS",description:"Use /swarm deep-research <question> to run a multi-source, fact-checked deep research pass and synthesize a cited report [--depth standard|exhaustive] [--max-researchers 1..6] [--rounds 1..4] [--brief]"},"swarm-codebase-review":{template:"/swarm codebase-review $ARGUMENTS",description:"Use /swarm codebase-review to launch codebase-review-swarm for a quote-grounded full-repo or large-subsystem audit"},"swarm-design-docs":{template:"/swarm design-docs $ARGUMENTS",description:"Use /swarm design-docs to generate or sync language-agnostic design docs for the project under build"},"swarm-sdd":{template:"/swarm sdd $ARGUMENTS",description:"Use /swarm sdd to inspect OpenSpec-compatible SDD artifacts"},"swarm-sdd-status":{template:"/swarm sdd status",description:"Use /swarm sdd status to show effective spec and OpenSpec artifact status"},"swarm-sdd-validate":{template:"/swarm sdd validate $ARGUMENTS",description:"Use /swarm sdd validate to validate OpenSpec-compatible SDD artifacts"},"swarm-sdd-project":{template:"/swarm sdd project $ARGUMENTS",description:"Use /swarm sdd project to materialize OpenSpec artifacts into .swarm/spec.md"},"swarm-issue":{template:"/swarm issue $ARGUMENTS",description:"Use /swarm issue to ingest a GitHub issue into the swarm workflow"},"swarm-qa-gates":{template:"/swarm qa-gates $ARGUMENTS",description:"Use /swarm qa-gates to view or modify QA gate profile for the current plan"},"swarm-dark-matter":{template:"/swarm dark-matter",description:"Use /swarm dark-matter to detect hidden file couplings"},"swarm-knowledge":{template:"/swarm knowledge $ARGUMENTS",description:"Use /swarm knowledge for knowledge management (quarantine/restore/migrate)"},"swarm-memory":{template:"/swarm memory $ARGUMENTS",description:"Use /swarm memory for memory status, JSONL export/import, and SQLite migration"},"swarm-memory-status":{template:"/swarm memory status",description:"Use /swarm memory status to show provider and migration status"},"swarm-memory-export":{template:"/swarm memory export",description:"Use /swarm memory export to write current memory to JSONL"},"swarm-memory-import":{template:"/swarm memory import",description:"Use /swarm memory import to import legacy JSONL into SQLite"},"swarm-memory-migrate":{template:"/swarm memory migrate",description:"Use /swarm memory migrate to run the one-time SQLite migration"},"swarm-curate":{template:"/swarm curate",description:"Use /swarm curate to curate knowledge artifacts and entries"},"swarm-consolidate":{template:"/swarm consolidate $ARGUMENTS",description:"Use /swarm consolidate to run quota-bounded skill-improver consolidation"},"swarm-concurrency":{template:"/swarm concurrency $ARGUMENTS",description:"Use /swarm concurrency to manage runtime concurrency override for plan execution"},"swarm-turbo":{template:"/swarm turbo",description:"Use /swarm turbo to enable turbo mode for faster execution"},"swarm-epic":{template:"/swarm epic $ARGUMENTS",description:shortcutDescription("epic")},"swarm-coupling":{template:"/swarm coupling $ARGUMENTS",description:shortcutDescription("coupling")},"swarm-lanes":{template:"/swarm lanes",description:shortcutDescription("lanes")},"swarm-guardrail-explain":{template:"/swarm guardrail explain $ARGUMENTS",description:shortcutDescription("guardrail explain")},"swarm-guardrail-log":{template:"/swarm guardrail-log $ARGUMENTS",description:shortcutDescription("guardrail-log")},"swarm-full-auto":{template:"/swarm full-auto $ARGUMENTS",description:"Toggle Full-Auto Mode for the active session [on|off]"},"swarm-auto-proceed":{template:"/swarm auto-proceed $ARGUMENTS",description:"Toggle auto-proceed mode for automatic phase advancement"},"swarm-write-retro":{template:"/swarm write-retro $ARGUMENTS",description:"Use /swarm write-retro to manually write a phase retrospective"},"swarm-reset-session":{template:"/swarm reset-session",description:"Use /swarm reset-session to clear session state and delegation chains"},"swarm-simulate":{template:"/swarm simulate $ARGUMENTS",description:"Use /swarm simulate to run a simulated agent session"},"swarm-promote":{template:"/swarm promote $ARGUMENTS",description:"Use /swarm promote to promote knowledge entries to production"},"swarm-checkpoint":{template:"/swarm checkpoint $ARGUMENTS",description:"Use /swarm checkpoint to save or restore git checkpoints"},"swarm-config-doctor":{template:"/swarm config doctor",description:"Use /swarm config doctor to diagnose configuration issues"},"swarm-evidence-summary":{template:"/swarm evidence summary",description:"Use /swarm evidence summary to generate evidence summaries"},"swarm-finalize":{template:"/swarm finalize",description:"Use /swarm finalize to archive the swarm project and close active state"},"swarm-close":{template:"/swarm close",description:"Deprecated alias for /swarm finalize"},"swarm-acknowledge-spec-drift":{template:"/swarm acknowledge-spec-drift",description:"Use /swarm acknowledge-spec-drift to acknowledge spec drift and suppress further warnings"},"swarm-doctor-tools":{template:"/swarm doctor tools",description:"Use /swarm doctor tools to run tool registration coherence check"},"swarm-link":{template:"/swarm link $ARGUMENTS",description:"Use /swarm link to link this worktree to a shared knowledge store [name|status]"},"swarm-unlink":{template:"/swarm unlink $ARGUMENTS",description:"Use /swarm unlink to unlink this worktree from the shared knowledge store [--no-copy]"}},log("Config applied",{agents:Object.keys(agents),commands:["swarm"]})},"experimental.chat.messages.transform":composeHandlers(...[(_input,output)=>{if(process.env.DEBUG_SWARM)console.error("[DIAG] messagesTransform START");let mctx=resolveMessageTransformContext(output);if(mctx.sessionID){let archAgent=swarmState.activeAgent.get(mctx.sessionID),archSession=swarmState.agentSessions.get(mctx.sessionID),agentName=archAgent??archSession?.agentName??"";if(stripKnownSwarmPrefix(agentName)===ORCHESTRATOR_NAME)try{delegationLedgerHook.onArchitectResume(mctx.sessionID)}catch{}}return Promise.resolve()},pipelineHook["experimental.chat.messages.transform"],contextBudgetHandler,initOrphanRecoveryAdvisoryHook.messagesTransform,guardrailsHooks.messagesTransform,fullAutoInterceptHook?.messagesTransform,ccCommandInterceptHook?.messagesTransform,delegationGateHooks.messagesTransform,issueTraceHook.messagesTransform,delegationSanitizerHook,memoryLifecycleHooks.messagesTransform,knowledgeInjectorHook,(_input,output)=>{try{let mctx=resolveMessageTransformContext(output);return knowledgeApplicationTransformScan(ctx.directory,output,mctx.sessionID)}catch{return Promise.resolve()}},(_input,output)=>{try{if(!skillPropagationConfig.enabled)return Promise.resolve();let mctx=resolveMessageTransformContext(output);return skillPropagationTransformScan(ctx.directory,output,mctx.sessionID,skillPropagationConfig)}catch{return Promise.resolve()}},(_input,output)=>{if(output.messages)output.messages=consolidateSystemMessages(output.messages);if(process.env.DEBUG_SWARM)console.error("[DIAG] messagesTransform DONE");return Promise.resolve()}].filter((fn2)=>Boolean(fn2))),"experimental.text.complete":prWorkflowResponseGate.textComplete,"experimental.chat.system.transform":composeHandlers(...[async(_input,_output)=>{if(process.env.DEBUG_SWARM)console.error("[DIAG] systemTransform START")},systemEnhancerHook["experimental.chat.system.transform"],async(_input,_output)=>{if(process.env.DEBUG_SWARM)console.error("[DIAG] systemTransform enhancer DONE")},contextCapsuleInjectHook["experimental.chat.system.transform"],(input,_output)=>{try{let{sessionID}=input;if(!sessionID)return Promise.resolve();let lastTime=_heartbeatTimers.get(sessionID);if(Date.now()-(lastTime??0)>30000)_heartbeatTimers.set(sessionID,Date.now()),capSessionMap(_heartbeatTimers,MAX_TRACKED_HEARTBEAT_SESSIONS),telemetry.heartbeat(sessionID)}catch{}return Promise.resolve()},automationConfig.capabilities?.phase_preflight===!0&&preflightTriggerManager?createPhaseMonitorHook(ctx.directory,preflightTriggerManager,void 0,(sessionId)=>createCuratorLLMDelegate(ctx.directory,"init",sessionId)):knowledgeConfig.enabled?createPhaseMonitorHook(ctx.directory,void 0,void 0,(sessionId)=>createCuratorLLMDelegate(ctx.directory,"init",sessionId)):void 0,swarmCommandSystemRuleHook,(_input,output)=>{if(Array.isArray(output.system)&&output.system.length>1)output.system=[output.system.join(`
6315
6332
 
6316
6333
  `)];return Promise.resolve()}].filter(Boolean)),"experimental.session.compacting":compactionHook["experimental.session.compacting"],"command.execute.before":safeHook(commandHandler),"tool.execute.before":async(input,output)=>{if(process.env.DEBUG_SWARM)console.error(`[DIAG] toolBefore tool=${normalizeToolName(input.tool)??input.tool} session=${input.sessionID}`);if(!swarmState.activeAgent.has(input.sessionID))swarmState.activeAgent.set(input.sessionID,ORCHESTRATOR_NAME);let session=swarmState.agentSessions.get(input.sessionID),activeAgent=swarmState.activeAgent.get(input.sessionID);if(session&&activeAgent&&activeAgent!==ORCHESTRATOR_NAME){if(stripKnownSwarmPrefix(activeAgent)!==ORCHESTRATOR_NAME){if(!session.delegationActive&&Date.now()-session.lastAgentEventTime>1e4)swarmState.activeAgent.set(input.sessionID,ORCHESTRATOR_NAME),ensureAgentSession(input.sessionID,ORCHESTRATOR_NAME)}}await guardrailsHooks.toolBefore(input,output),await scopeGuardHook.toolBefore(input,output),await delegationGateHooks.toolBefore(input,output);let prWorkflowControllerSessionID=await prWorkflowSessionResolver.resolve(input.sessionID);await enforcePrWorkflowToolBefore(ctx.directory,prWorkflowControllerSessionID,normalizeToolName(input.tool)??input.tool,input.args,swarmState.generatedAgentNames),await fullAutoDelegationHook.toolBefore(input,output),await fullAutoPermissionHook.toolBefore(input,output),await knowledgeApplicationGateBefore(ctx.directory,{tool:input.tool,agent:resolveToolBeforeContext(input,output).agent,sessionID:input.sessionID},KnowledgeApplicationConfigSchema.parse(config3.knowledge_application??{}));let skillResult=await skillPropagationGateBefore(ctx.directory,{tool:input.tool,agent:resolveToolBeforeContext(input,output).agent,sessionID:input.sessionID,args:resolveToolBeforeContext(input,output).args??void 0},skillPropagationConfig);if(skillResult.blocked)throw Error(skillResult.reason??"Blocked by skill propagation gate");if(skillResult.reason){let skillSession=ensureAgentSession(input.sessionID,swarmState.activeAgent.get(input.sessionID)??ORCHESTRATOR_NAME);skillSession.pendingAdvisoryMessages??=[],skillSession.pendingAdvisoryMessages.push(skillResult.reason)}let toolBeforeCtx=resolveToolBeforeContext(input,output),toolBeforeArgs=toolBeforeCtx.args??{};if(injectSkillsIntoDelegation(ctx.directory,toolBeforeArgs,skillResult.recommendedSkills,stripKnownSwarmPrefix(parseDelegationArgs(toolBeforeArgs)?.targetAgent??"")||toolBeforeCtx.agent,input.sessionID,{quiet:config3.quiet}),knowledgeConfig.enabled)await injectDelegateDirectivesBefore(ctx.directory,{tool:input.tool,agent:toolBeforeCtx.agent,sessionID:input.sessionID,args:toolBeforeArgs},knowledgeConfig),setStoredInputArgs(input.callID,output.args);if(swarmState.lastBudgetPct>=50){let pressureSession=ensureAgentSession(input.sessionID,swarmState.activeAgent.get(input.sessionID)??ORCHESTRATOR_NAME);if(!pressureSession.contextPressureWarningSent)pressureSession.contextPressureWarningSent=!0,pressureSession.pendingAdvisoryMessages??=[],pressureSession.pendingAdvisoryMessages.push(`CONTEXT PRESSURE: ${swarmState.lastBudgetPct.toFixed(1)}% of context window used. Prioritize completing the current task before starting new work.`)}await safeHook(activityHooks.toolBefore)(input,output)},"tool.execute.after":async(input,output)=>{let _dbg=!!process.env.DEBUG_SWARM,_toolName=normalizeToolName(input.tool)??input.tool;if(_dbg)console.error(`[DIAG] toolAfter START tool=${_toolName} session=${input.sessionID}`);let normalizedTool=normalizeToolName(input.tool),isTaskTool7=normalizedTool==="Task"||normalizedTool==="task",afterCtx=resolveToolAfterContext(input),hookChain=async()=>{if(await activityHooks.toolAfter(input,output),_dbg)console.error(`[DIAG] toolAfter activity done tool=${_toolName}`);if(await safeHook(trajectoryLoggerHook.toolAfter)(input,output),_dbg)console.error(`[DIAG] toolAfter trajectoryLogger done tool=${_toolName}`);if(knowledgeConfig.enabled)await safeHook(()=>collectDelegateAcksAfter(ctx.directory,{tool:input.tool,sessionID:input.sessionID,args:afterCtx.args},output))(input,output),await safeHook(()=>collectReviewerVerdictsAfter(ctx.directory,{tool:input.tool,sessionID:input.sessionID,args:afterCtx.args},output))(input,output),await safeHook(()=>microReflectorAfter(ctx.directory,input,output,createCuratorLLMDelegate(ctx.directory,"phase",input.sessionID),{maxCalls:knowledgeConfig.enrichment.max_calls_per_day,window:knowledgeConfig.enrichment.quota_window}))(input,output);if(await safeHook(async()=>{await collectReviewerReceiptAfter(ctx.directory,{tool:input.tool,sessionID:input.sessionID,args:afterCtx.args},output)})(input,output),await safeHook(autoReviewHook.toolAfter)(input,output),await safeHook(prmHook.toolAfter)(input,output),await guardrailsHooks.toolAfter(input,output),_dbg)console.error(`[DIAG] toolAfter guardrails done tool=${_toolName}`);if(await safeHook(delegationLedgerHook.toolAfter)(input,output),_dbg)console.error(`[DIAG] toolAfter ledger done tool=${_toolName}`);if(await safeHook(selfReviewHook.toolAfter)(input,output),_dbg)console.error(`[DIAG] toolAfter selfReview done tool=${_toolName}`);if(await safeHook(memoryLifecycleHooks.toolAfter)(input,output),_dbg)console.error(`[DIAG] toolAfter memory done tool=${_toolName}`);if(await safeHook(delegationGateHooks.toolAfter)(input,output),_dbg)console.error(`[DIAG] toolAfter delegationGate done tool=${_toolName}`);if(await safeHook(fullAutoInputProbeHook.toolAfter)(input,output),await safeHook(fullAutoDelegationHook.toolAfter)(input,output),await safeHook(prAutoSubscribeHook.toolAfter)(input,output),isTaskTool7&&typeof output.output==="string")try{let adversarialMatches=detectAdversarialPatterns(output.output);if(adversarialMatches.length>0){let sessionId=input.sessionID,session=swarmState.agentSessions.get(sessionId);if(session)session.pendingAdvisoryMessages??=[],session.pendingAdvisoryMessages.push(`ADVERSARIAL PATTERN DETECTED: ${adversarialMatches.map((p)=>p.pattern).join(", ")}. Review agent output for potential prompt injection or gate bypass.`);if("adversarialPatternDetected"in telemetry)telemetry.adversarialPatternDetected(input.sessionID,adversarialMatches)}}catch{}try{recordToolCall(normalizedTool,resolveToolAfterContext(input).args,input.sessionID)}catch{}try{let spiralMatch=await detectDebuggingSpiral(ctx.directory,input.sessionID);if(spiralMatch){let taskId=swarmState.agentSessions.get(input.sessionID)?.currentTaskId??`session-${input.sessionID.slice(0,12)}`,spiralResult=await handleDebuggingSpiral(spiralMatch,taskId,ctx.directory),session=swarmState.agentSessions.get(input.sessionID);if(session)session.pendingAdvisoryMessages??=[],session.pendingAdvisoryMessages.push(spiralResult.message)}}catch{}if(knowledgeCuratorHook)await safeHook(knowledgeCuratorHook)(input,output);if(hivePromoterHook)await safeHook(hivePromoterHook)(input,output);if(_dbg)console.error(`[DIAG] toolAfter knowledge done tool=${_toolName}`);if(await safeHook(steeringConsumedHook)(input,output),await safeHook(coChangeSuggesterHook)(input,output),await safeHook(darkMatterDetectorHook)(input,output),_dbg)console.error(`[DIAG] toolAfter intelligence done tool=${_toolName}`);if(await snapshotWriterHook(input,output),await toolSummarizerHook?.(input,output),_dbg)console.error(`[DIAG] toolAfter snapshot+summarizer done tool=${_toolName}`);let execMode=config3.execution_mode??"balanced";if(execMode==="strict"){if(slopDetectorHook)await slopDetectorHook.toolAfter(input,output);if(incrementalVerifyHook)await incrementalVerifyHook.toolAfter(input,output)}if(execMode!=="fast"&&compactionServiceHook)await compactionServiceHook.toolAfter(input,output);if(await safeHook(repoGraphHook.toolAfter)(input,output),isTaskTool7&&config3.context_map?.enabled===!0&&input.sessionID)try{let contextMapTaskId=swarmState.agentSessions.get(input.sessionID)?.currentTaskId??null;if(contextMapTaskId){let agentOutput=typeof output.output==="string"?output.output:"";updateContextMapAfterAgent({task_id:contextMapTaskId,agent_role:swarmState.activeAgent.get(input.sessionID)??"unknown",files_touched:[],implementation_summary:agentOutput.slice(0,500),task_goal:"",final_status:"completed",directory:ctx.directory})}}catch{}let toolOutputConfig=config3.tool_output;if(toolOutputConfig&&toolOutputConfig.truncation_enabled!==!1&&typeof output.output==="string"){let defaultTruncatableTools=new Set(["diff","symbols","bash","shell","test_runner","lint","pre_check_batch","complexity_hotspots","pkg_audit","sbom_generate","schema_drift"]),configuredTools=toolOutputConfig.truncation_tools,truncatableTools=configuredTools&&configuredTools.length>0?new Set(configuredTools):defaultTruncatableTools,maxLines=toolOutputConfig.per_tool?.[input.tool]??toolOutputConfig.max_lines??150;if(truncatableTools.has(input.tool))output.output=truncateToolOutput(output.output,maxLines,input.tool,10)}};try{await hookChain()}catch(err2){let warning=`[swarm] toolAfter hook chain error tool=${_toolName}: ${err2 instanceof Error?err2.message:String(err2)}`;if(!config3.quiet)console.warn(warning);else addDeferredWarning(warning)}if(isTaskTool7){let sessionId=input.sessionID,agentName=swarmState.activeAgent.get(sessionId)||"unknown",baseAgentName=stripKnownSwarmPrefix(agentName),preHandoffSession=swarmState.agentSessions.get(sessionId),activeWindow=getActiveWindow(sessionId),configuredModel=resolveDelegationModel(config3,agentName,baseAgentName),assistantUsage=consumeAssistantUsageForTask(sessionId,output),costFields=buildDelegationCostFields({raw:{metadata:output.metadata,output,assistant:assistantUsage},model:configuredModel,gate:preHandoffSession?.lastDelegationReason,retry_index:activeWindow?.transientRetryCount,pricing:config3.pricing});swarmState.activeAgent.set(sessionId,ORCHESTRATOR_NAME),ensureAgentSession(sessionId,ORCHESTRATOR_NAME);let taskSession=swarmState.agentSessions.get(sessionId);if(taskSession){if(taskSession.delegationActive=!1,taskSession.lastAgentEventTime=Date.now(),telemetry.delegationEnd(sessionId,agentName,taskSession.currentTaskId||"","completed",costFields),baseAgentName==="reviewer"||baseAgentName==="test_engineer"||baseAgentName==="critic"||baseAgentName==="critic_sounding_board")taskSession.pendingAdvisoryMessages??=[],taskSession.pendingAdvisoryMessages.push(`[PIPELINE] ${baseAgentName} delegation complete for task ${taskSession.currentTaskId??"unknown"}. `+"Resume the QA gate pipeline — check your task pipeline steps for the next required action. "+"Do not stop here.");if(baseAgentName==="critic_sounding_board"){let rawResponse=typeof output.output==="string"?output.output:"",parsed=parseSoundingBoardResponse(rawResponse);if(taskSession.pendingAdvisoryMessages??=[],parsed){let verdictMsg=`[SOUNDING_BOARD] Verdict: ${parsed.verdict}. ${parsed.reasoning}`;if(parsed.improvedQuestion)verdictMsg+=` Rephrase to: ${parsed.improvedQuestion}`;if(parsed.answer)verdictMsg+=` Answer: ${parsed.answer}`;if(parsed.warning)verdictMsg+=` WARNING: ${parsed.warning}`;taskSession.pendingAdvisoryMessages.push(verdictMsg),taskSession.lastDelegationReason="critic_consultation"}else taskSession.pendingAdvisoryMessages.push(`[SOUNDING_BOARD] WARNING: Could not parse a structured verdict from critic_sounding_board response (${rawResponse.length} chars). `+"Treat as REPHRASE — review the raw response before surfacing to user or escalating. "+"Do not silently accept as resolved.")}}if(_dbg)console.error(`[DIAG] Task handoff DONE session=${sessionId} activeAgent=${swarmState.activeAgent.get(sessionId)}`)}if(deleteStoredInputArgs(input.callID),_dbg)console.error(`[DIAG] toolAfter COMPLETE tool=${_toolName}`)},"chat.message":safeHook(async(input,output)=>{if(process.env.DEBUG_SWARM)console.error(`[DIAG] chat.message agent=${input.agent??"none"} session=${input.sessionID}`);if(await delegationHandler(input,output),input?.sessionID)try{await cacheCohortIdAtMessage(ctx.directory,input.sessionID)}catch{}try{if(input?.sessionID&&input?.agent){if(stripKnownSwarmPrefix(String(input.agent))==="architect")tickAndMaybeDispatchCadence(ctx.directory,input.sessionID,"architectTurns",config3,{activeAgent:String(input.agent)})}}catch{}if(process.env.DEBUG_SWARM)console.error(`[DIAG] chat.message DONE agent=${input.agent??"none"}`)}),automation:automationManager}}var src_default={id:"opencode-swarm",server:OpenCodeSwarm};export{recordTestImpactGateGroundTruth,loadTier1EvaluationTasks,evaluationV1,evaluateCandidateV1,src_default as default,capSessionMap};