opencode-swarm 7.78.8 → 7.79.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -70,4 +70,4 @@ export declare function buildCouncilWorkflow(council?: CouncilWorkflowConfig): s
70
70
  * BRAINSTORM, and PLAN inline paths stay in lockstep.
71
71
  */
72
72
  export declare function buildQaGateSelectionDialogue(modeLabel: 'BRAINSTORM' | 'SPECIFY' | 'PLAN'): string;
73
- export declare function createArchitectAgent(model: string, customPrompt?: string, customAppendPrompt?: string, adversarialTesting?: AdversarialTestingConfig, council?: CouncilWorkflowConfig, uiReview?: UIReviewConfig, memoryEnabled?: boolean, architecturalSupervision?: ArchitectureSupervisionWorkflowConfig, designDocsEnabled?: boolean, externalSkillsEnabled?: boolean): AgentDefinition;
73
+ export declare function createArchitectAgent(model: string, customPrompt?: string, customAppendPrompt?: string, adversarialTesting?: AdversarialTestingConfig, council?: CouncilWorkflowConfig, uiReview?: UIReviewConfig, memoryEnabled?: boolean, architecturalSupervision?: ArchitectureSupervisionWorkflowConfig, designDocsEnabled?: boolean, externalSkillsEnabled?: boolean, turboEnabled?: boolean): AgentDefinition;
package/dist/cli/index.js CHANGED
@@ -52,7 +52,7 @@ var package_default;
52
52
  var init_package = __esm(() => {
53
53
  package_default = {
54
54
  name: "opencode-swarm",
55
- version: "7.78.8",
55
+ version: "7.79.1",
56
56
  description: "Architect-centric agentic swarm plugin for OpenCode - hub-and-spoke orchestration with SME consultation, code generation, and QA review",
57
57
  main: "dist/index.js",
58
58
  types: "dist/index.d.ts",
@@ -17406,15 +17406,15 @@ var init_tool_metadata = __esm(() => {
17406
17406
  },
17407
17407
  submit_council_verdicts: {
17408
17408
  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)",
17409
- agents: ["architect"]
17409
+ agents: []
17410
17410
  },
17411
17411
  submit_phase_council_verdicts: {
17412
17412
  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)",
17413
- agents: ["architect"]
17413
+ agents: []
17414
17414
  },
17415
17415
  declare_council_criteria: {
17416
17416
  description: "pre-declare acceptance criteria for a task before the coder starts work; criteria are read back during council evaluation",
17417
- agents: ["architect"]
17417
+ agents: []
17418
17418
  },
17419
17419
  sbom_generate: {
17420
17420
  description: "SBOM generation for dependency inventory",
@@ -17676,19 +17676,19 @@ var init_tool_metadata = __esm(() => {
17676
17676
  },
17677
17677
  web_search: {
17678
17678
  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.",
17679
- agents: ["architect", "sme", "researcher", "skill_improver"]
17679
+ agents: ["sme", "researcher", "skill_improver"]
17680
17680
  },
17681
17681
  web_fetch: {
17682
17682
  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.",
17683
- agents: ["architect"]
17683
+ agents: []
17684
17684
  },
17685
17685
  convene_general_council: {
17686
17686
  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.",
17687
- agents: ["architect"]
17687
+ agents: []
17688
17688
  },
17689
17689
  write_final_council_evidence: {
17690
17690
  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 \u2014 this tool synthesizes only. Rejects on insufficient quorum or CONCERNS with unresolved requiredFixes; normalizes verdicts to approved/concerns/rejected. Architect-only.",
17691
- agents: ["architect"]
17691
+ agents: []
17692
17692
  },
17693
17693
  skill_generate: {
17694
17694
  description: "compile knowledge entries into a structured SKILL.md draft",
@@ -17722,10 +17722,6 @@ var init_tool_metadata = __esm(() => {
17722
17722
  description: "author or update .swarm/spec.md for the current project",
17723
17723
  agents: ["spec_writer"]
17724
17724
  },
17725
- knowledge_ack: {
17726
- description: "record an explicit KNOWLEDGE_APPLIED/IGNORED/VIOLATED acknowledgment",
17727
- agents: ["architect"]
17728
- },
17729
17725
  knowledge_receipt: {
17730
17726
  description: "file a receipt for retrieved knowledge (applied/ignored/contradicted + new lessons), recorded as immutable knowledge events",
17731
17727
  agents: ["architect", "coder"]
@@ -17782,27 +17778,27 @@ var init_tool_metadata = __esm(() => {
17782
17778
  },
17783
17779
  lean_turbo_plan_lanes: {
17784
17780
  description: "partition phase tasks into parallel lanes based on file-scope conflicts for Lean Turbo execution",
17785
- agents: ["architect"]
17781
+ agents: []
17786
17782
  },
17787
17783
  lean_turbo_acquire_locks: {
17788
17784
  description: "acquire file locks for all files in a lane (all-or-nothing) before lane execution",
17789
- agents: ["architect"]
17785
+ agents: []
17790
17786
  },
17791
17787
  lean_turbo_runner_status: {
17792
17788
  description: "read Lean Turbo run state from .swarm/turbo-state.json",
17793
- agents: ["architect"]
17789
+ agents: []
17794
17790
  },
17795
17791
  lean_turbo_review: {
17796
17792
  description: "dispatch a read-only reviewer agent to evaluate a completed Lean Turbo phase",
17797
- agents: ["architect"]
17793
+ agents: []
17798
17794
  },
17799
17795
  lean_turbo_run_phase: {
17800
17796
  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.",
17801
- agents: ["architect"]
17797
+ agents: []
17802
17798
  },
17803
17799
  lean_turbo_status: {
17804
17800
  description: "returns Lean Turbo configuration and active status for the current session",
17805
- agents: ["architect"]
17801
+ agents: []
17806
17802
  },
17807
17803
  apply_patch: {
17808
17804
  description: "Apply a unified diff patch to workspace files with exact context matching, atomic writes, and path validation",
@@ -17888,7 +17884,7 @@ function freezeSet(items) {
17888
17884
  });
17889
17885
  return proxy;
17890
17886
  }
17891
- var OPENCODE_NATIVE_AGENTS, CLAUDE_CODE_NATIVE_COMMANDS, EXTERNAL_SKILL_TOOL_NAMES, EXTERNAL_SKILL_AGENT_TOOL_MAP, DEFAULT_AGENT_CONFIGS;
17887
+ var OPENCODE_NATIVE_AGENTS, CLAUDE_CODE_NATIVE_COMMANDS, 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, DEFAULT_AGENT_CONFIGS;
17892
17888
  var init_constants = __esm(() => {
17893
17889
  init_agent_names();
17894
17890
  init_tool_metadata();
@@ -18021,6 +18017,34 @@ var init_constants = __esm(() => {
18021
18017
  EXTERNAL_SKILL_AGENT_TOOL_MAP = {
18022
18018
  architect: [...EXTERNAL_SKILL_TOOL_NAMES]
18023
18019
  };
18020
+ COUNCIL_TOOL_NAMES = [
18021
+ "submit_council_verdicts",
18022
+ "submit_phase_council_verdicts",
18023
+ "declare_council_criteria",
18024
+ "write_final_council_evidence"
18025
+ ];
18026
+ COUNCIL_AGENT_TOOL_MAP = {
18027
+ architect: [...COUNCIL_TOOL_NAMES]
18028
+ };
18029
+ GENERAL_COUNCIL_TOOL_NAMES = [
18030
+ "convene_general_council",
18031
+ "web_search",
18032
+ "web_fetch"
18033
+ ];
18034
+ GENERAL_COUNCIL_AGENT_TOOL_MAP = {
18035
+ architect: [...GENERAL_COUNCIL_TOOL_NAMES]
18036
+ };
18037
+ TURBO_TOOL_NAMES = [
18038
+ "lean_turbo_plan_lanes",
18039
+ "lean_turbo_acquire_locks",
18040
+ "lean_turbo_runner_status",
18041
+ "lean_turbo_review",
18042
+ "lean_turbo_run_phase",
18043
+ "lean_turbo_status"
18044
+ ];
18045
+ TURBO_AGENT_TOOL_MAP = {
18046
+ architect: [...TURBO_TOOL_NAMES]
18047
+ };
18024
18048
  DEFAULT_AGENT_CONFIGS = {
18025
18049
  coder: {
18026
18050
  model: "opencode/minimax-m2.5-free",
@@ -18434,7 +18458,7 @@ var init_schema = __esm(() => {
18434
18458
  });
18435
18459
  SummaryConfigSchema = exports_external.object({
18436
18460
  enabled: exports_external.boolean().default(true),
18437
- threshold_bytes: exports_external.number().min(1024).max(1048576).default(102400),
18461
+ threshold_bytes: exports_external.number().min(1024).max(1048576).default(16384),
18438
18462
  max_summary_chars: exports_external.number().min(100).max(5000).default(1000),
18439
18463
  max_stored_bytes: exports_external.number().min(10240).max(104857600).default(10485760),
18440
18464
  retention_days: exports_external.number().min(1).max(365).default(7),
@@ -9,6 +9,12 @@ export declare const MEMORY_TOOL_NAMES: readonly ["swarm_memory_recall", "swarm_
9
9
  export declare const MEMORY_AGENT_TOOL_MAP: Partial<Record<AgentName, ToolName[]>>;
10
10
  export declare const EXTERNAL_SKILL_TOOL_NAMES: readonly ["external_skill_discover", "external_skill_list", "external_skill_inspect", "external_skill_promote", "external_skill_reject", "external_skill_delete", "external_skill_revoke"];
11
11
  export declare const EXTERNAL_SKILL_AGENT_TOOL_MAP: Partial<Record<AgentName, ToolName[]>>;
12
+ export declare const COUNCIL_TOOL_NAMES: readonly ["submit_council_verdicts", "submit_phase_council_verdicts", "declare_council_criteria", "write_final_council_evidence"];
13
+ export declare const COUNCIL_AGENT_TOOL_MAP: Partial<Record<AgentName, ToolName[]>>;
14
+ export declare const GENERAL_COUNCIL_TOOL_NAMES: readonly ["convene_general_council", "web_search", "web_fetch"];
15
+ export declare const GENERAL_COUNCIL_AGENT_TOOL_MAP: Partial<Record<AgentName, ToolName[]>>;
16
+ export declare const TURBO_TOOL_NAMES: readonly ["lean_turbo_plan_lanes", "lean_turbo_acquire_locks", "lean_turbo_runner_status", "lean_turbo_review", "lean_turbo_run_phase", "lean_turbo_status"];
17
+ export declare const TURBO_AGENT_TOOL_MAP: Partial<Record<AgentName, ToolName[]>>;
12
18
  /**
13
19
  * Human-readable descriptions for tools shown in the architect Available Tools block.
14
20
  * Used to generate the Available Tools section of the architect prompt at construction time.
package/dist/index.js CHANGED
@@ -69,7 +69,7 @@ var package_default;
69
69
  var init_package = __esm(() => {
70
70
  package_default = {
71
71
  name: "opencode-swarm",
72
- version: "7.78.8",
72
+ version: "7.79.1",
73
73
  description: "Architect-centric agentic swarm plugin for OpenCode - hub-and-spoke orchestration with SME consultation, code generation, and QA review",
74
74
  main: "dist/index.js",
75
75
  types: "dist/index.d.ts",
@@ -330,15 +330,15 @@ var init_tool_metadata = __esm(() => {
330
330
  },
331
331
  submit_council_verdicts: {
332
332
  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)",
333
- agents: ["architect"]
333
+ agents: []
334
334
  },
335
335
  submit_phase_council_verdicts: {
336
336
  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)",
337
- agents: ["architect"]
337
+ agents: []
338
338
  },
339
339
  declare_council_criteria: {
340
340
  description: "pre-declare acceptance criteria for a task before the coder starts work; criteria are read back during council evaluation",
341
- agents: ["architect"]
341
+ agents: []
342
342
  },
343
343
  sbom_generate: {
344
344
  description: "SBOM generation for dependency inventory",
@@ -600,19 +600,19 @@ var init_tool_metadata = __esm(() => {
600
600
  },
601
601
  web_search: {
602
602
  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.",
603
- agents: ["architect", "sme", "researcher", "skill_improver"]
603
+ agents: ["sme", "researcher", "skill_improver"]
604
604
  },
605
605
  web_fetch: {
606
606
  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.",
607
- agents: ["architect"]
607
+ agents: []
608
608
  },
609
609
  convene_general_council: {
610
610
  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.",
611
- agents: ["architect"]
611
+ agents: []
612
612
  },
613
613
  write_final_council_evidence: {
614
614
  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.",
615
- agents: ["architect"]
615
+ agents: []
616
616
  },
617
617
  skill_generate: {
618
618
  description: "compile knowledge entries into a structured SKILL.md draft",
@@ -646,10 +646,6 @@ var init_tool_metadata = __esm(() => {
646
646
  description: "author or update .swarm/spec.md for the current project",
647
647
  agents: ["spec_writer"]
648
648
  },
649
- knowledge_ack: {
650
- description: "record an explicit KNOWLEDGE_APPLIED/IGNORED/VIOLATED acknowledgment",
651
- agents: ["architect"]
652
- },
653
649
  knowledge_receipt: {
654
650
  description: "file a receipt for retrieved knowledge (applied/ignored/contradicted + new lessons), recorded as immutable knowledge events",
655
651
  agents: ["architect", "coder"]
@@ -706,27 +702,27 @@ var init_tool_metadata = __esm(() => {
706
702
  },
707
703
  lean_turbo_plan_lanes: {
708
704
  description: "partition phase tasks into parallel lanes based on file-scope conflicts for Lean Turbo execution",
709
- agents: ["architect"]
705
+ agents: []
710
706
  },
711
707
  lean_turbo_acquire_locks: {
712
708
  description: "acquire file locks for all files in a lane (all-or-nothing) before lane execution",
713
- agents: ["architect"]
709
+ agents: []
714
710
  },
715
711
  lean_turbo_runner_status: {
716
712
  description: "read Lean Turbo run state from .swarm/turbo-state.json",
717
- agents: ["architect"]
713
+ agents: []
718
714
  },
719
715
  lean_turbo_review: {
720
716
  description: "dispatch a read-only reviewer agent to evaluate a completed Lean Turbo phase",
721
- agents: ["architect"]
717
+ agents: []
722
718
  },
723
719
  lean_turbo_run_phase: {
724
720
  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.",
725
- agents: ["architect"]
721
+ agents: []
726
722
  },
727
723
  lean_turbo_status: {
728
724
  description: "returns Lean Turbo configuration and active status for the current session",
729
- agents: ["architect"]
725
+ agents: []
730
726
  },
731
727
  apply_patch: {
732
728
  description: "Apply a unified diff patch to workspace files with exact context matching, atomic writes, and path validation",
@@ -848,7 +844,7 @@ function isLowCapabilityModel(modelId) {
848
844
  const lower = (modelId || "").toLowerCase();
849
845
  return LOW_CAPABILITY_MODELS.some((substr) => lower.includes(substr));
850
846
  }
851
- var OPENCODE_NATIVE_AGENTS, CLAUDE_CODE_NATIVE_COMMANDS, MEMORY_AGENT_TOOL_MAP, EXTERNAL_SKILL_TOOL_NAMES, EXTERNAL_SKILL_AGENT_TOOL_MAP, WRITE_TOOL_NAMES, DEFAULT_MODELS, DEFAULT_SCORING_CONFIG, LOW_CAPABILITY_MODELS, TURBO_MODE_BANNER = `## \uD83D\uDE80 TURBO MODE ACTIVE
847
+ 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, WRITE_TOOL_NAMES, DEFAULT_MODELS, DEFAULT_SCORING_CONFIG, LOW_CAPABILITY_MODELS, TURBO_MODE_BANNER = `## \uD83D\uDE80 TURBO MODE ACTIVE
852
848
 
853
849
  **Speed optimization enabled for this session.**
854
850
 
@@ -1054,6 +1050,34 @@ var init_constants = __esm(() => {
1054
1050
  EXTERNAL_SKILL_AGENT_TOOL_MAP = {
1055
1051
  architect: [...EXTERNAL_SKILL_TOOL_NAMES]
1056
1052
  };
1053
+ COUNCIL_TOOL_NAMES = [
1054
+ "submit_council_verdicts",
1055
+ "submit_phase_council_verdicts",
1056
+ "declare_council_criteria",
1057
+ "write_final_council_evidence"
1058
+ ];
1059
+ COUNCIL_AGENT_TOOL_MAP = {
1060
+ architect: [...COUNCIL_TOOL_NAMES]
1061
+ };
1062
+ GENERAL_COUNCIL_TOOL_NAMES = [
1063
+ "convene_general_council",
1064
+ "web_search",
1065
+ "web_fetch"
1066
+ ];
1067
+ GENERAL_COUNCIL_AGENT_TOOL_MAP = {
1068
+ architect: [...GENERAL_COUNCIL_TOOL_NAMES]
1069
+ };
1070
+ TURBO_TOOL_NAMES = [
1071
+ "lean_turbo_plan_lanes",
1072
+ "lean_turbo_acquire_locks",
1073
+ "lean_turbo_runner_status",
1074
+ "lean_turbo_review",
1075
+ "lean_turbo_run_phase",
1076
+ "lean_turbo_status"
1077
+ ];
1078
+ TURBO_AGENT_TOOL_MAP = {
1079
+ architect: [...TURBO_TOOL_NAMES]
1080
+ };
1057
1081
  WRITE_TOOL_NAMES = [
1058
1082
  "write",
1059
1083
  "edit",
@@ -15615,7 +15639,7 @@ var init_schema = __esm(() => {
15615
15639
  });
15616
15640
  SummaryConfigSchema = exports_external.object({
15617
15641
  enabled: exports_external.boolean().default(true),
15618
- threshold_bytes: exports_external.number().min(1024).max(1048576).default(102400),
15642
+ threshold_bytes: exports_external.number().min(1024).max(1048576).default(16384),
15619
15643
  max_summary_chars: exports_external.number().min(100).max(5000).default(1000),
15620
15644
  max_stored_bytes: exports_external.number().min(10240).max(104857600).default(10485760),
15621
15645
  retention_days: exports_external.number().min(1).max(365).default(7),
@@ -93644,25 +93668,19 @@ Members verify prior findings are resolved without re-reviewing unchanged code.
93644
93668
  The architect resolves any \`unresolvedConflicts\` in \`unifiedFeedbackMd\` BEFORE
93645
93669
  sending it to the coder — the coder never sees contradictory instructions.`;
93646
93670
  }
93647
- function buildYourToolsList(council, memoryEnabled = false, externalSkillsEnabled = false) {
93671
+ function buildYourToolsList(council, memoryEnabled = false, externalSkillsEnabled = false, turboEnabled = false) {
93672
+ const qaCouncilEnabled = council?.enabled === true;
93673
+ const generalCouncilEnabled = council?.general?.enabled === true;
93648
93674
  const tools = [
93649
93675
  ...AGENT_TOOL_MAP.architect ?? [],
93650
93676
  ...memoryEnabled ? MEMORY_AGENT_TOOL_MAP.architect ?? [] : [],
93651
- ...externalSkillsEnabled ? EXTERNAL_SKILL_AGENT_TOOL_MAP.architect ?? [] : []
93677
+ ...externalSkillsEnabled ? EXTERNAL_SKILL_AGENT_TOOL_MAP.architect ?? [] : [],
93678
+ ...qaCouncilEnabled ? COUNCIL_AGENT_TOOL_MAP.architect ?? [] : [],
93679
+ ...generalCouncilEnabled ? GENERAL_COUNCIL_AGENT_TOOL_MAP.architect ?? [] : [],
93680
+ ...turboEnabled ? TURBO_AGENT_TOOL_MAP.architect ?? [] : []
93652
93681
  ];
93653
93682
  const sorted = [...tools].sort();
93654
- const qaCouncilEnabled = council?.enabled === true;
93655
- const generalCouncilEnabled = council?.general?.enabled === true;
93656
- const filtered = sorted.filter((t) => {
93657
- if (!qaCouncilEnabled && (t === "submit_council_verdicts" || t === "declare_council_criteria" || t === "submit_phase_council_verdicts")) {
93658
- return false;
93659
- }
93660
- if (!generalCouncilEnabled && t === "convene_general_council") {
93661
- return false;
93662
- }
93663
- return true;
93664
- });
93665
- return `Task (delegation), ${filtered.join(", ")}.`;
93683
+ return `Task (delegation), ${sorted.join(", ")}.`;
93666
93684
  }
93667
93685
  function buildQaGateSelectionDialogue(modeLabel) {
93668
93686
  const leadIn = 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.";
@@ -93711,25 +93729,19 @@ If the user accepts the default (1), skip writing this section entirely — seri
93711
93729
  \`\`\`
93712
93730
  If the user keeps the default phase-level behavior, do not write this section.`;
93713
93731
  }
93714
- function buildAvailableToolsList(council, memoryEnabled = false, externalSkillsEnabled = false) {
93732
+ function buildAvailableToolsList(council, memoryEnabled = false, externalSkillsEnabled = false, turboEnabled = false) {
93733
+ const qaCouncilEnabled = council?.enabled === true;
93734
+ const generalCouncilEnabled = council?.general?.enabled === true;
93715
93735
  const tools = [
93716
93736
  ...AGENT_TOOL_MAP.architect ?? [],
93717
93737
  ...memoryEnabled ? MEMORY_AGENT_TOOL_MAP.architect ?? [] : [],
93718
- ...externalSkillsEnabled ? EXTERNAL_SKILL_AGENT_TOOL_MAP.architect ?? [] : []
93738
+ ...externalSkillsEnabled ? EXTERNAL_SKILL_AGENT_TOOL_MAP.architect ?? [] : [],
93739
+ ...qaCouncilEnabled ? COUNCIL_AGENT_TOOL_MAP.architect ?? [] : [],
93740
+ ...generalCouncilEnabled ? GENERAL_COUNCIL_AGENT_TOOL_MAP.architect ?? [] : [],
93741
+ ...turboEnabled ? TURBO_AGENT_TOOL_MAP.architect ?? [] : []
93719
93742
  ];
93720
93743
  const sorted = [...tools].sort();
93721
- const qaCouncilEnabled = council?.enabled === true;
93722
- const generalCouncilEnabled = council?.general?.enabled === true;
93723
- const filtered = sorted.filter((t) => {
93724
- if (!qaCouncilEnabled && (t === "submit_council_verdicts" || t === "declare_council_criteria" || t === "submit_phase_council_verdicts")) {
93725
- return false;
93726
- }
93727
- if (!generalCouncilEnabled && t === "convene_general_council") {
93728
- return false;
93729
- }
93730
- return true;
93731
- });
93732
- return filtered.map((t) => {
93744
+ return sorted.map((t) => {
93733
93745
  const desc = TOOL_DESCRIPTIONS[t];
93734
93746
  return desc ? `${t} (${desc})` : t;
93735
93747
  }).join(", ");
@@ -93862,7 +93874,7 @@ function buildSlashCommandsList() {
93862
93874
  return lines.join(`
93863
93875
  `);
93864
93876
  }
93865
- function createArchitectAgent(model, customPrompt, customAppendPrompt, adversarialTesting, council, uiReview, memoryEnabled = false, architecturalSupervision, designDocsEnabled = false, externalSkillsEnabled = false) {
93877
+ function createArchitectAgent(model, customPrompt, customAppendPrompt, adversarialTesting, council, uiReview, memoryEnabled = false, architecturalSupervision, designDocsEnabled = false, externalSkillsEnabled = false, turboEnabled = false) {
93866
93878
  let prompt = ARCHITECT_PROMPT;
93867
93879
  if (customPrompt) {
93868
93880
  prompt = customPrompt;
@@ -93871,7 +93883,7 @@ function createArchitectAgent(model, customPrompt, customAppendPrompt, adversari
93871
93883
 
93872
93884
  ${customAppendPrompt}`;
93873
93885
  }
93874
- prompt = prompt?.replace("{{YOUR_TOOLS}}", buildYourToolsList(council, memoryEnabled, externalSkillsEnabled))?.replace("{{AVAILABLE_TOOLS}}", buildAvailableToolsList(council, memoryEnabled, externalSkillsEnabled))?.replace("{{SLASH_COMMANDS}}", buildSlashCommandsList());
93886
+ prompt = prompt?.replace("{{YOUR_TOOLS}}", buildYourToolsList(council, memoryEnabled, externalSkillsEnabled, turboEnabled))?.replace("{{AVAILABLE_TOOLS}}", buildAvailableToolsList(council, memoryEnabled, externalSkillsEnabled, turboEnabled))?.replace("{{SLASH_COMMANDS}}", buildSlashCommandsList());
93875
93887
  prompt = prompt?.replace(/\{\{QA_GATE_DIALOGUE_SPECIFY\}\}/g, buildQaGateSelectionDialogue("SPECIFY"))?.replace(/\{\{QA_GATE_DIALOGUE_BRAINSTORM\}\}/g, buildQaGateSelectionDialogue("BRAINSTORM"))?.replace(/\{\{QA_GATE_DIALOGUE_PLAN\}\}/g, buildQaGateSelectionDialogue("PLAN"));
93876
93888
  const councilBlock = buildCouncilWorkflow(council);
93877
93889
  const hasPlaceholder = prompt?.includes("{{COUNCIL_WORKFLOW}}") === true;
@@ -94172,6 +94184,7 @@ diff → syntax_check → placeholder_scan → imports → lint fix → build_ch
94172
94184
  Stage A tools return pass/fail. Fix failures by returning to coder.
94173
94185
  Stage A passing means: code compiles, parses, no secrets, no placeholders, no lint errors.
94174
94186
  Stage A passing does NOT mean: code is correct, secure, tested, or reviewed.
94187
+ PREFERRED AGGREGATOR: pre_check_batch runs lint:check + secretscan + sast_scan + quality_budget in PARALLEL (up to 4 concurrent). Prefer calling pre_check_batch over running those four tools individually — it produces the same verdicts faster and is the recommended approach for post-implementation verification. NOTE: pre_check_batch does NOT expose capture_baseline, changed_files scoping, or per-tool severity_threshold parameters. When you need SAST baseline capture or file-scoped scanning, call sast_scan or secretscan directly.
94175
94188
 
94176
94189
  VERIFICATION PROTOCOL: After the coder reports DONE, and before running Stage B gates:
94177
94190
  1. Read at least ONE of the modified files yourself to confirm the change exists
@@ -94354,7 +94367,7 @@ For every applicable directive in the block:
94354
94367
  - If runtime evidence shows a directive was violated (reviewer rejection, failing test, scope breach), record \`KNOWLEDGE_VIOLATED: <id> reason=<reason>\` and re-plan.
94355
94368
  - NEVER silently ignore a \`priority: critical\` directive. The knowledge_application gate may run in 'enforce' mode; in that mode an omitted ack on a critical directive blocks the action.
94356
94369
 
94357
- You may also call the \`knowledge_ack\` tool to record an outcome explicitly when chat-text markers would be ambiguous (e.g. inside structured tool args).
94370
+ Chat-text markers (KNOWLEDGE_APPLIED/IGNORED/VIOLATED) are the sole mechanism that satisfies the knowledge-application enforcement gate. The \`knowledge_receipt\` tool records knowledge-usage receipts for audit but does NOT satisfy the gate.
94358
94371
 
94359
94372
  ## SKILL IMPROVER (low-frequency, expensive-model adviser)
94360
94373
 
@@ -97477,7 +97490,7 @@ function createSwarmAgents(swarmId, swarmConfig, isDefault, pluginConfig, projec
97477
97490
  const prefixName = (name2) => `${prefix}${name2}`;
97478
97491
  if (!isAgentDisabled("architect", swarmAgents, swarmPrefix)) {
97479
97492
  const architectPrompts = getPrompts("architect");
97480
- const architect = createArchitectAgent(getModel("architect"), architectPrompts.prompt, architectPrompts.appendPrompt, pluginConfig?.adversarial_testing, pluginConfig?.council, pluginConfig?.ui_review, pluginConfig?.memory?.enabled === true, pluginConfig?.architectural_supervision, pluginConfig?.design_docs?.enabled === true, pluginConfig?.external_skills?.curation_enabled === true);
97493
+ const architect = createArchitectAgent(getModel("architect"), architectPrompts.prompt, architectPrompts.appendPrompt, pluginConfig?.adversarial_testing, pluginConfig?.council, pluginConfig?.ui_review, pluginConfig?.memory?.enabled === true, pluginConfig?.architectural_supervision, pluginConfig?.design_docs?.enabled === true, pluginConfig?.external_skills?.curation_enabled === true, pluginConfig?.turbo !== undefined);
97481
97494
  architect.name = prefixName("architect");
97482
97495
  const swarmName = swarmConfig.name || swarmId;
97483
97496
  const swarmIdentity = isDefault ? "default" : swarmId;
@@ -97794,20 +97807,30 @@ function getAgentConfigs(config3, directory, sessionId, projectContext) {
97794
97807
  allowedTools = Array.from(new Set([...allowedTools ?? [], ...externalSkillTools]));
97795
97808
  }
97796
97809
  }
97797
- if (baseAgentName === "architect" && config3?.council?.enabled === true && override !== undefined) {
97798
- const required3 = [
97799
- "declare_council_criteria",
97800
- "submit_council_verdicts"
97801
- ];
97802
- const missing = required3.filter((t) => !override.includes(t));
97803
- if (missing.length > 0) {
97804
- throw new Error(`[opencode-swarm] Conflicting config: council.enabled=true but tool_filter.overrides.architect omits ${missing.join(", ")}. ` + `Either set council.enabled=false, remove the architect override entirely to fall back on AGENT_TOOL_MAP, or add the missing council tools to the override. ` + `Refusing to silently override your explicit tool_filter.overrides.architect.`);
97810
+ if (config3?.council?.enabled === true) {
97811
+ const councilTools = COUNCIL_AGENT_TOOL_MAP[baseAgentName] ?? [];
97812
+ if (councilTools.length > 0) {
97813
+ allowedTools = Array.from(new Set([...allowedTools ?? [], ...councilTools]));
97814
+ }
97815
+ }
97816
+ if (config3?.council?.general?.enabled === true) {
97817
+ const generalCouncilTools = GENERAL_COUNCIL_AGENT_TOOL_MAP[baseAgentName] ?? [];
97818
+ if (generalCouncilTools.length > 0) {
97819
+ allowedTools = Array.from(new Set([...allowedTools ?? [], ...generalCouncilTools]));
97820
+ }
97821
+ }
97822
+ if (config3?.turbo !== undefined) {
97823
+ const turboTools = TURBO_AGENT_TOOL_MAP[baseAgentName] ?? [];
97824
+ if (turboTools.length > 0) {
97825
+ allowedTools = Array.from(new Set([...allowedTools ?? [], ...turboTools]));
97805
97826
  }
97806
97827
  }
97807
97828
  if (baseAgentName === "architect" && config3?.council?.enabled !== true && override !== undefined) {
97808
97829
  const councilTools = [
97809
97830
  "declare_council_criteria",
97810
- "submit_council_verdicts"
97831
+ "submit_council_verdicts",
97832
+ "submit_phase_council_verdicts",
97833
+ "write_final_council_evidence"
97811
97834
  ];
97812
97835
  const present = councilTools.filter((t) => override.includes(t));
97813
97836
  if (present.length > 0 && !quiet) {
@@ -128996,65 +129019,6 @@ var imports = createSwarmTool({
128996
129019
  }
128997
129020
  });
128998
129021
 
128999
- // src/tools/knowledge-ack.ts
129000
- init_zod();
129001
- import { randomUUID as randomUUID13 } from "node:crypto";
129002
- init_state();
129003
- init_logger();
129004
- init_create_tool();
129005
- var knowledge_ack = createSwarmTool({
129006
- description: "Record an acknowledgment outcome (applied/ignored/violated) for a previously-injected knowledge directive. Updates retrieval-outcome counters and appends a record to .swarm/knowledge-application.jsonl.",
129007
- args: {
129008
- id: exports_external.string().min(8).describe("Knowledge entry id from <swarm_knowledge_directives>."),
129009
- result: exports_external.enum(["applied", "ignored", "violated"]),
129010
- reason: exports_external.string().max(280).optional(),
129011
- phase: exports_external.string().optional(),
129012
- task_id: exports_external.string().optional(),
129013
- action: exports_external.string().optional(),
129014
- tool: exports_external.string().optional(),
129015
- target_agent: exports_external.string().optional(),
129016
- generated_skill_path: exports_external.string().optional()
129017
- },
129018
- execute: async (args2, directory, ctx) => {
129019
- const a = args2 ?? {};
129020
- if (!a.id || typeof a.id !== "string" || a.id.length < 8) {
129021
- return JSON.stringify({ recorded: false, error: "invalid id" });
129022
- }
129023
- if (a.result !== "applied" && a.result !== "ignored" && a.result !== "violated") {
129024
- return JSON.stringify({ recorded: false, error: "invalid result" });
129025
- }
129026
- const ack = {
129027
- id: a.id,
129028
- result: a.result,
129029
- reason: a.reason
129030
- };
129031
- let sessionId = ctx?.sessionID;
129032
- if (!sessionId) {
129033
- warn("[knowledge-ack] No sessionID in tool context — dedup disabled for this acknowledgment");
129034
- sessionId = randomUUID13();
129035
- }
129036
- const dedupKey = buildAckDedupKey(sessionId, a.id, a.result);
129037
- if (swarmState.knowledgeAckDedup.has(dedupKey)) {
129038
- return JSON.stringify({
129039
- recorded: false,
129040
- reason: "duplicate_ack",
129041
- id: a.id,
129042
- result: a.result
129043
- }, null, 2);
129044
- }
129045
- addKnowledgeAckDedup(dedupKey);
129046
- await recordAcknowledgment(directory, ack, {
129047
- phase: a.phase,
129048
- taskId: a.task_id,
129049
- action: a.action,
129050
- tool: a.tool,
129051
- targetAgent: a.target_agent,
129052
- sessionId
129053
- });
129054
- return JSON.stringify({ recorded: true, id: a.id, result: a.result }, null, 2);
129055
- }
129056
- });
129057
-
129058
129022
  // src/tools/knowledge-add.ts
129059
129023
  init_zod();
129060
129024
  init_config();
@@ -129063,7 +129027,7 @@ init_knowledge_store();
129063
129027
  init_knowledge_validator();
129064
129028
  init_manager();
129065
129029
  init_create_tool();
129066
- import { randomUUID as randomUUID14 } from "node:crypto";
129030
+ import { randomUUID as randomUUID13 } from "node:crypto";
129067
129031
  var VALID_CATEGORIES2 = [
129068
129032
  "process",
129069
129033
  "architecture",
@@ -129162,7 +129126,7 @@ var knowledge_add = createSwarmTool({
129162
129126
  }
129163
129127
  } catch {}
129164
129128
  const entry = {
129165
- id: randomUUID14(),
129129
+ id: randomUUID13(),
129166
129130
  tier: "swarm",
129167
129131
  lesson,
129168
129132
  category,
@@ -146699,7 +146663,6 @@ var TOOL_MANIFEST = defineHandlers({
146699
146663
  skill_retire: () => skill_retire,
146700
146664
  skill_improve: () => skill_improve,
146701
146665
  spec_write: () => spec_write,
146702
- knowledge_ack: () => knowledge_ack,
146703
146666
  knowledge_receipt: () => knowledge_receipt,
146704
146667
  knowledge_archive: () => knowledge_archive,
146705
146668
  swarm_memory_recall: () => swarm_memory_recall,
@@ -146733,7 +146696,6 @@ function buildPluginToolObject(agents, config3) {
146733
146696
  "knowledge_recall",
146734
146697
  "knowledge_remove",
146735
146698
  "knowledge_query",
146736
- "knowledge_ack",
146737
146699
  "knowledge_receipt",
146738
146700
  "knowledge_archive"
146739
146701
  ]);
@@ -32,7 +32,6 @@ export { get_qa_gate_profile } from './get-qa-gate-profile';
32
32
  export { git_blame } from './git-blame';
33
33
  export { fetchGitingest, type GitingestArgs, gitingest } from './gitingest';
34
34
  export { imports } from './imports';
35
- export { knowledge_ack } from './knowledge-ack';
36
35
  export { knowledge_add } from './knowledge-add';
37
36
  export { knowledge_archive } from './knowledge-archive';
38
37
  export { knowledge_query } from './knowledge-query';
@@ -1,5 +1,5 @@
1
1
  /**
2
- * knowledge_receipt — the strong successor to knowledge_ack.
2
+ * knowledge_receipt — the knowledge acknowledgment tool (replaces the former knowledge_ack).
3
3
  *
4
4
  * An agent files a single receipt summarizing how it considered the knowledge
5
5
  * surfaced by a retrieval (referenced by `trace_id`): which entries were
@@ -94,7 +94,6 @@ export declare const TOOL_MANIFEST: {
94
94
  skill_retire: () => ToolDefinition;
95
95
  skill_improve: () => ToolDefinition;
96
96
  spec_write: () => ToolDefinition;
97
- knowledge_ack: () => ToolDefinition;
98
97
  knowledge_receipt: () => ToolDefinition;
99
98
  knowledge_archive: () => ToolDefinition;
100
99
  swarm_memory_recall: () => ToolDefinition;
@@ -101,15 +101,15 @@ export declare const TOOL_METADATA: {
101
101
  };
102
102
  submit_council_verdicts: {
103
103
  description: string;
104
- agents: "architect"[];
104
+ agents: never[];
105
105
  };
106
106
  submit_phase_council_verdicts: {
107
107
  description: string;
108
- agents: "architect"[];
108
+ agents: never[];
109
109
  };
110
110
  declare_council_criteria: {
111
111
  description: string;
112
- agents: "architect"[];
112
+ agents: never[];
113
113
  };
114
114
  sbom_generate: {
115
115
  description: string;
@@ -261,19 +261,19 @@ export declare const TOOL_METADATA: {
261
261
  };
262
262
  web_search: {
263
263
  description: string;
264
- agents: ("sme" | "architect" | "researcher" | "skill_improver")[];
264
+ agents: ("sme" | "researcher" | "skill_improver")[];
265
265
  };
266
266
  web_fetch: {
267
267
  description: string;
268
- agents: "architect"[];
268
+ agents: never[];
269
269
  };
270
270
  convene_general_council: {
271
271
  description: string;
272
- agents: "architect"[];
272
+ agents: never[];
273
273
  };
274
274
  write_final_council_evidence: {
275
275
  description: string;
276
- agents: "architect"[];
276
+ agents: never[];
277
277
  };
278
278
  skill_generate: {
279
279
  description: string;
@@ -307,10 +307,6 @@ export declare const TOOL_METADATA: {
307
307
  description: string;
308
308
  agents: "spec_writer"[];
309
309
  };
310
- knowledge_ack: {
311
- description: string;
312
- agents: "architect"[];
313
- };
314
310
  knowledge_receipt: {
315
311
  description: string;
316
312
  agents: ("coder" | "architect")[];
@@ -345,27 +341,27 @@ export declare const TOOL_METADATA: {
345
341
  };
346
342
  lean_turbo_plan_lanes: {
347
343
  description: string;
348
- agents: "architect"[];
344
+ agents: never[];
349
345
  };
350
346
  lean_turbo_acquire_locks: {
351
347
  description: string;
352
- agents: "architect"[];
348
+ agents: never[];
353
349
  };
354
350
  lean_turbo_runner_status: {
355
351
  description: string;
356
- agents: "architect"[];
352
+ agents: never[];
357
353
  };
358
354
  lean_turbo_review: {
359
355
  description: string;
360
- agents: "architect"[];
356
+ agents: never[];
361
357
  };
362
358
  lean_turbo_run_phase: {
363
359
  description: string;
364
- agents: "architect"[];
360
+ agents: never[];
365
361
  };
366
362
  lean_turbo_status: {
367
363
  description: string;
368
- agents: "architect"[];
364
+ agents: never[];
369
365
  };
370
366
  apply_patch: {
371
367
  description: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-swarm",
3
- "version": "7.78.8",
3
+ "version": "7.79.1",
4
4
  "description": "Architect-centric agentic swarm plugin for OpenCode - hub-and-spoke orchestration with SME consultation, code generation, and QA review",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",