opencode-swarm 7.94.1 → 7.96.0

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 (31) hide show
  1. package/.opencode/skills/council/SKILL.md +4 -2
  2. package/.opencode/skills/deep-research/SKILL.md +13 -7
  3. package/.opencode/skills/execute/SKILL.md +2 -2
  4. package/.opencode/skills/swarm-pr-review/SKILL.md +1 -1
  5. package/dist/cli/{config-doctor-ecmx9scq.js → config-doctor-h1xrvq83.js} +2 -2
  6. package/dist/cli/{evidence-summary-service-mr9sns2d.js → evidence-summary-service-g4x5e3e3.js} +1 -1
  7. package/dist/cli/{guardrail-explain-we8mhb6y.js → guardrail-explain-0hw3kyab.js} +6 -6
  8. package/dist/cli/{guardrail-log-0q6pvbpx.js → guardrail-log-9yyeccv5.js} +3 -3
  9. package/dist/cli/{index-y1z6yaq4.js → index-4c5jpmn9.js} +3 -3
  10. package/dist/cli/{index-dgjsa6hy.js → index-b223mczb.js} +1 -1
  11. package/dist/cli/{index-q8qx8p47.js → index-d3ds25vx.js} +2 -2
  12. package/dist/cli/{index-a59fjg9v.js → index-q0t7gpf2.js} +17 -13
  13. package/dist/cli/{index-jv0bz96v.js → index-r0zbs7ny.js} +7 -7
  14. package/dist/cli/{index-tx5czwpd.js → index-rdc6nvmw.js} +1 -1
  15. package/dist/cli/{index-79dcqsg9.js → index-tqbb2jx6.js} +29 -2
  16. package/dist/cli/{index-vqg905es.js → index-xx3sv77e.js} +1 -1
  17. package/dist/cli/index.js +5 -5
  18. package/dist/cli/{schema-jy18ftky.js → schema-a8fneygm.js} +1 -1
  19. package/dist/index.js +2222 -1037
  20. package/dist/plan/checkpoint.d.ts +16 -2
  21. package/dist/tools/actionlint-scan.d.ts +29 -0
  22. package/dist/tools/ast-grep.d.ts +26 -0
  23. package/dist/tools/dispatch-lanes.d.ts +18 -0
  24. package/dist/tools/gh-evidence.d.ts +10 -0
  25. package/dist/tools/index.d.ts +4 -0
  26. package/dist/tools/manifest.d.ts +4 -0
  27. package/dist/tools/osv-scan.d.ts +27 -0
  28. package/dist/tools/search.d.ts +27 -0
  29. package/dist/tools/tool-metadata.d.ts +16 -0
  30. package/dist/utils/external-tool-runner.d.ts +25 -0
  31. package/package.json +1 -1
@@ -114,8 +114,10 @@ Do NOT share other agents' responses at this stage.
114
114
  (synthesis outline, citation normalization, disagreement categories). Only
115
115
  use `wait: true` if lanes are still pending and no more independent work
116
116
  remains. All three lanes must be settled before proceeding to synthesis.
117
- If `dispatch_lanes_async` is unavailable, use blocking parallel dispatch
118
- and record that async advisory lanes were unavailable. The
117
+ If `dispatch_lanes_async` is unavailable, use blocking `dispatch_lanes`
118
+ and record that async advisory lanes were unavailable; do not substitute
119
+ per-agent Task calls for this fallback unless lane tools are unavailable and
120
+ you explicitly verify equivalent agent type, prompt, scope, and isolation. The
119
121
  `round1Responses` array will contain entries with `memberId` of
120
122
  `council_generalist`, `council_skeptic`, and `council_domain_expert` and
121
123
  `role` of `generalist`, `skeptic`, and `domain_expert` respectively. If
@@ -118,13 +118,19 @@ include:
118
118
  - `OUTPUT`: claims with evidence refs, contradictions noted, confidence (0–1)
119
119
  - `SKILLS: none`
120
120
 
121
- The sme synthesizes only from the provided evidence — it does not fetch. Before
122
- Step 5, call `collect_lane_results` with `wait: true` for every open synthesis
123
- batch. Collect all completed worker responses into a candidate findings set, each
124
- finding tagged with its subtopic, evidence refs, and the worker's confidence.
125
- Treat missing, stale, cancelled, or failed lanes as explicit coverage gaps. If
126
- `dispatch_lanes_async` is unavailable, use blocking parallel dispatch and record
127
- that async advisory lanes were unavailable.
121
+ The sme synthesizes only from the provided evidence — it does not fetch. While
122
+ synthesis lanes run, poll with `collect_lane_results` without `wait` (or
123
+ `wait: false`) to process completed worker responses as they settle while
124
+ continuing independent architect work between polls. Before Step 5, call
125
+ `collect_lane_results` with `wait: true` for every open synthesis batch only if
126
+ lanes are still pending and no independent work remains. Collect all completed
127
+ worker responses into a candidate findings set, each finding tagged with its
128
+ subtopic, evidence refs, and the worker's confidence. Treat missing, stale,
129
+ cancelled, or failed lanes as explicit coverage gaps. If `dispatch_lanes_async`
130
+ is unavailable, use blocking `dispatch_lanes` and record that async advisory
131
+ lanes were unavailable; do not substitute per-agent Task calls for this fallback
132
+ unless lane tools are unavailable and you explicitly verify equivalent agent
133
+ type, prompt, scope, and isolation.
128
134
 
129
135
  ## Step 5 — Dual-Reviewer Claim Verification
130
136
 
@@ -204,9 +204,9 @@ This step supplements (not replaces) the existing regression-sweep and test-drif
204
204
 
205
205
  ## Dispatch-lanes empty-output fallback
206
206
 
207
- When an agent dispatched via `dispatch_lanes` returns empty output (0 chars, `output_digest` matching SHA-256 of empty string `e3b0c442...b855`), this indicates a suspected incompatibility between the `dispatch_lanes` code path and that specific agent.
207
+ This fallback applies only to a settled, blocking `dispatch_lanes` result with empty output (0 chars, `output_digest` matching SHA-256 of empty string `e3b0c442...b855`). It does **not** apply to `dispatch_lanes_async` rows that are still pending/running, an early `collect_lane_results` poll, or an async result whose full text is available through `retrieve_lane_output`.
208
208
 
209
- **Do NOT re-dispatch via `dispatch_lanes`** it will fail again (confirmed pattern). Immediately retry the **same agent** via the **Task tool** (`Task(subagent_type=..., prompt=...)`), which uses a different session-creation code path. Record which dispatch mechanism succeeded for debugging.
209
+ For read-only advisory lanes, do **not** jump straight to Task. First re-collect async lanes with `collect_lane_results` (`wait: true` when no independent work remains) and inspect any `output_ref` with `retrieve_lane_output`. If a settled blocking `dispatch_lanes` lane is genuinely empty, prefer retrying the same agent through `dispatch_lanes_async` when promptAsync is available. Use the **Task tool** (`Task(subagent_type=..., prompt=...)`) only as a last-resort equivalent dispatch mechanism after the lane tools are unavailable or have produced a confirmed empty settled result; record the same agent, same prompt, same scope, and which dispatch mechanism succeeded.
210
210
 
211
211
  If the Task tool also returns empty, **then** escalate to substitute review (4-member council without the broken agent) or surface to the user. Never fabricate or substitute a verdict for the missing agent.
212
212
 
@@ -517,7 +517,7 @@ Before Phase 4 or synthesis, all base lanes must be settled. `dispatch_lanes_asy
517
517
 
518
518
  For ANY lane that failed (either mode):
519
519
  1. **Retry** (max 2 attempts) with materially different parameters — different session, different prompt decomposition, or blocking `dispatch_lanes`.
520
- 2. If retries fail, **deploy an equivalent alternative** and **verify equivalence**: same agent type, same prompt, same scope, same isolation. State the equivalence verification explicitly. Different dispatch mechanism (e.g., Task tool instead of `dispatch_lanes_async`) IS acceptable when these criteria are met. Use `retrieve_lane_output` to inspect the full artifact before declaring equivalence or failure.
520
+ 2. If retries fail, **deploy an equivalent alternative** and **verify equivalence**: same agent type, same prompt, same scope, same isolation. State the equivalence verification explicitly. Task is not an early-poll or empty-partial-output fallback; use it only as a last-resort equivalent dispatch mechanism after `dispatch_lanes_async` is unavailable or a settled lane result is confirmed failed/empty, and after blocking `dispatch_lanes` is unavailable or inappropriate. Use `retrieve_lane_output` to inspect the full artifact before declaring equivalence or failure.
521
521
  3. If no equivalent alternative can be verified, **report to the user as INCOMPLETE**. Present partial findings from successful lanes alongside the INCOMPLETE verdict. The user decides whether to accept reduced coverage. The architect NEVER makes that call.
522
522
 
523
523
  ### Candidate extraction via parser
@@ -12,8 +12,8 @@ import {
12
12
  shouldRunOnStartup,
13
13
  writeBackupArtifact,
14
14
  writeDoctorArtifact
15
- } from "./index-vqg905es.js";
16
- import"./index-79dcqsg9.js";
15
+ } from "./index-xx3sv77e.js";
16
+ import"./index-tqbb2jx6.js";
17
17
  import"./index-5e4e2hvv.js";
18
18
  import"./index-p0arc26j.js";
19
19
  import"./index-zgwm4ryv.js";
@@ -6,7 +6,7 @@ import {
6
6
  loadPlanJsonOnly,
7
7
  mergeDurableGateEntriesFromEvidence,
8
8
  readDurableGateEvidence
9
- } from "./index-y1z6yaq4.js";
9
+ } from "./index-4c5jpmn9.js";
10
10
  import"./index-mh1ej70w.js";
11
11
  import"./index-kv4dd5c5.js";
12
12
  import"./index-gn8n22th.js";
@@ -1,15 +1,15 @@
1
1
  // @bun
2
2
  import {
3
3
  handleGuardrailExplain
4
- } from "./index-q8qx8p47.js";
5
- import"./index-a59fjg9v.js";
6
- import"./index-dgjsa6hy.js";
4
+ } from "./index-d3ds25vx.js";
5
+ import"./index-q0t7gpf2.js";
6
+ import"./index-b223mczb.js";
7
7
  import"./index-2a6ppa65.js";
8
8
  import"./index-fjxjb66n.js";
9
9
  import"./index-hb10a2g8.js";
10
- import"./index-vqg905es.js";
11
- import"./index-79dcqsg9.js";
12
- import"./index-y1z6yaq4.js";
10
+ import"./index-xx3sv77e.js";
11
+ import"./index-tqbb2jx6.js";
12
+ import"./index-4c5jpmn9.js";
13
13
  import"./index-adz3nk9b.js";
14
14
  import"./index-v4fcn4tr.js";
15
15
  import"./index-mh1ej70w.js";
@@ -1,9 +1,9 @@
1
1
  // @bun
2
2
  import {
3
3
  handleGuardrailLog
4
- } from "./index-tx5czwpd.js";
5
- import"./index-dgjsa6hy.js";
6
- import"./index-79dcqsg9.js";
4
+ } from "./index-rdc6nvmw.js";
5
+ import"./index-b223mczb.js";
6
+ import"./index-tqbb2jx6.js";
7
7
  import"./index-5e4e2hvv.js";
8
8
  import"./index-p0arc26j.js";
9
9
  import"./index-zgwm4ryv.js";
@@ -2236,7 +2236,7 @@ async function loadPlan(directory) {
2236
2236
  await rebuildPlan(directory, rebuilt, {
2237
2237
  reason: "ledger_hash_mismatch_recovery"
2238
2238
  });
2239
- warn("[loadPlan] Rebuilt plan from ledger. Checkpoint available at .swarm/SWARM_PLAN.md if it exists.");
2239
+ warn("[loadPlan] Rebuilt plan from ledger. Checkpoint available at .swarm/plan-export/SWARM_PLAN.md if it exists.");
2240
2240
  return rebuilt;
2241
2241
  }
2242
2242
  } catch (replayError) {
@@ -2259,7 +2259,7 @@ async function loadPlan(directory) {
2259
2259
  return approved.plan;
2260
2260
  }
2261
2261
  } catch {}
2262
- warn(`[loadPlan] Ledger replay failed during hash-mismatch rebuild: ${replayError instanceof Error ? replayError.message : String(replayError)}. Returning stale plan.json. To recover: check .swarm/SWARM_PLAN.md for a checkpoint, or run /swarm reset-session.`);
2262
+ warn(`[loadPlan] Ledger replay failed during hash-mismatch rebuild: ${replayError instanceof Error ? replayError.message : String(replayError)}. Returning stale plan.json. To recover: check .swarm/plan-export/SWARM_PLAN.md for a checkpoint, or run /swarm reset-session.`);
2263
2263
  }
2264
2264
  }
2265
2265
  }
@@ -2306,7 +2306,7 @@ async function loadPlan(directory) {
2306
2306
  return validated;
2307
2307
  }
2308
2308
  } catch (error2) {
2309
- warn(`[loadPlan] plan.json validation failed: ${error2 instanceof Error ? error2.message : String(error2)}. Attempting rebuild from ledger. If rebuild fails, check .swarm/SWARM_PLAN.md for a checkpoint.`);
2309
+ warn(`[loadPlan] plan.json validation failed: ${error2 instanceof Error ? error2.message : String(error2)}. Attempting rebuild from ledger. If rebuild fails, check .swarm/plan-export/SWARM_PLAN.md for a checkpoint.`);
2310
2310
  let rawPlanId = null;
2311
2311
  try {
2312
2312
  const rawParsed = JSON.parse(planJsonContent);
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  import {
3
3
  stripKnownSwarmPrefix
4
- } from "./index-79dcqsg9.js";
4
+ } from "./index-tqbb2jx6.js";
5
5
  import {
6
6
  init_logger,
7
7
  warn
@@ -12,14 +12,14 @@ import {
12
12
  detectPosixWrites,
13
13
  detectWindowsWrites,
14
14
  resolveWriteTargets
15
- } from "./index-a59fjg9v.js";
15
+ } from "./index-q0t7gpf2.js";
16
16
  import {
17
17
  checkFileAuthority,
18
18
  classifyFile,
19
19
  isInDeclaredScope,
20
20
  redactPath,
21
21
  redactShellCommand
22
- } from "./index-dgjsa6hy.js";
22
+ } from "./index-b223mczb.js";
23
23
 
24
24
  // src/services/guardrail-explain-service.ts
25
25
  import path from "path";
@@ -57,7 +57,7 @@ import {
57
57
  readDoctorArtifact,
58
58
  removeStraySwarmDir,
59
59
  runConfigDoctor
60
- } from "./index-vqg905es.js";
60
+ } from "./index-xx3sv77e.js";
61
61
  import {
62
62
  AGENT_TOOL_MAP,
63
63
  ALL_SUBAGENT_NAMES,
@@ -70,7 +70,7 @@ import {
70
70
  TOOL_NAME_SET,
71
71
  resolveExternalSkillsConfig,
72
72
  stripKnownSwarmPrefix
73
- } from "./index-79dcqsg9.js";
73
+ } from "./index-tqbb2jx6.js";
74
74
  import {
75
75
  MAX_TRANSIENT_RETRIES,
76
76
  PlanSchema,
@@ -114,7 +114,7 @@ import {
114
114
  transientBackoff,
115
115
  validateProjectRoot,
116
116
  writeProjectedSpecSync
117
- } from "./index-y1z6yaq4.js";
117
+ } from "./index-4c5jpmn9.js";
118
118
  import {
119
119
  _internals as _internals2,
120
120
  _internals1 as _internals3,
@@ -909,7 +909,7 @@ var init_executor = __esm(() => {
909
909
  // package.json
910
910
  var package_default = {
911
911
  name: "opencode-swarm",
912
- version: "7.94.1",
912
+ version: "7.96.0",
913
913
  description: "Architect-centric agentic swarm plugin for OpenCode - hub-and-spoke orchestration with SME consultation, code generation, and QA review",
914
914
  main: "dist/index.js",
915
915
  types: "dist/index.d.ts",
@@ -13070,7 +13070,7 @@ async function runFinalizeStage(ctx) {
13070
13070
  }
13071
13071
  }
13072
13072
  try {
13073
- const { CuratorConfigSchema: CCS } = await import("./schema-jy18ftky.js");
13073
+ const { CuratorConfigSchema: CCS } = await import("./schema-a8fneygm.js");
13074
13074
  const { config: pmLoadedConfig } = _internals20.loadPluginConfigWithMeta(ctx.directory);
13075
13075
  const curatorCfg = CCS.parse(pmLoadedConfig.curator ?? {});
13076
13076
  if (curatorCfg.enabled && curatorCfg.postmortem_enabled) {
@@ -13351,6 +13351,8 @@ async function runCleanStage(ctx) {
13351
13351
  }
13352
13352
  let swarmPlanFilesRemoved = 0;
13353
13353
  const candidates = [
13354
+ path25.join(ctx.directory, ".swarm", "plan-export", "SWARM_PLAN.json"),
13355
+ path25.join(ctx.directory, ".swarm", "plan-export", "SWARM_PLAN.md"),
13354
13356
  path25.join(ctx.directory, ".swarm", "SWARM_PLAN.json"),
13355
13357
  path25.join(ctx.directory, ".swarm", "SWARM_PLAN.md"),
13356
13358
  path25.join(ctx.directory, "SWARM_PLAN.json"),
@@ -13630,7 +13632,7 @@ This project was already finalized in a previous /swarm close run. The plan has
13630
13632
  `- Removed ${cleanResult.configBackupsRemoved} stale config backup file(s)`
13631
13633
  ] : [],
13632
13634
  ...cleanResult.swarmPlanFilesRemoved > 0 ? [
13633
- `- Removed ${cleanResult.swarmPlanFilesRemoved} SWARM_PLAN checkpoint artifact(s)`
13635
+ `- Removed ${cleanResult.swarmPlanFilesRemoved} SWARM_PLAN checkpoint artifact(s) from .swarm/plan-export/ and legacy locations`
13634
13636
  ] : [],
13635
13637
  ...ctx.planExists && !ctx.planAlreadyDone ? ["- Set non-completed phases/tasks to closed status"] : [],
13636
13638
  ...ctx.curationSucceeded && ctx.allLessons.length > 0 ? [`- Committed ${ctx.allLessons.length} lesson(s) to knowledge store`] : [],
@@ -16791,7 +16793,7 @@ async function handleDoctorCommand(directory, args) {
16791
16793
  const result = runConfigDoctor(config, directory);
16792
16794
  let output;
16793
16795
  if (enableAutoFix && result.hasAutoFixableIssues) {
16794
- const { runConfigDoctorWithFixes } = await import("./config-doctor-ecmx9scq.js");
16796
+ const { runConfigDoctorWithFixes } = await import("./config-doctor-h1xrvq83.js");
16795
16797
  const fixResult = await runConfigDoctorWithFixes(directory, config, true);
16796
16798
  output = formatDoctorMarkdown(fixResult.result);
16797
16799
  } else {
@@ -17604,7 +17606,7 @@ async function handleEvidenceCommand(directory, args) {
17604
17606
  return formatTaskEvidenceMarkdown(evidenceData);
17605
17607
  }
17606
17608
  async function handleEvidenceSummaryCommand(directory) {
17607
- const { buildEvidenceSummary } = await import("./evidence-summary-service-mr9sns2d.js");
17609
+ const { buildEvidenceSummary } = await import("./evidence-summary-service-g4x5e3e3.js");
17608
17610
  const artifact = await buildEvidenceSummary(directory);
17609
17611
  if (!artifact) {
17610
17612
  return "No plan found. Run `/swarm plan` to check plan status.";
@@ -29819,7 +29821,7 @@ async function handleResetCommand(directory, args) {
29819
29821
  return [
29820
29822
  "## Swarm Reset",
29821
29823
  "",
29822
- "\u26A0\uFE0F This will delete all swarm state from .swarm/ (plan, context, checkpoints, SWARM_PLAN artifacts)",
29824
+ "\u26A0\uFE0F This will delete all swarm state from .swarm/ (plan, context, checkpoints, SWARM_PLAN artifacts including .swarm/plan-export/)",
29823
29825
  "",
29824
29826
  "**Tip**: Run `/swarm export` first to backup your state.",
29825
29827
  "",
@@ -29833,6 +29835,8 @@ async function handleResetCommand(directory, args) {
29833
29835
  "context.md",
29834
29836
  "SWARM_PLAN.md",
29835
29837
  "SWARM_PLAN.json",
29838
+ "plan-export/SWARM_PLAN.md",
29839
+ "plan-export/SWARM_PLAN.json",
29836
29840
  "checkpoints.json",
29837
29841
  "events.jsonl"
29838
29842
  ];
@@ -31853,7 +31857,7 @@ function buildDetailedHelp(commandName, entry) {
31853
31857
  async function handleHelpCommand(ctx) {
31854
31858
  const targetCommand = ctx.args.join(" ");
31855
31859
  if (!targetCommand) {
31856
- const { buildHelpText } = await import("./index-jv0bz96v.js");
31860
+ const { buildHelpText } = await import("./index-r0zbs7ny.js");
31857
31861
  return buildHelpText();
31858
31862
  }
31859
31863
  const tokens = targetCommand.split(/\s+/);
@@ -31862,7 +31866,7 @@ async function handleHelpCommand(ctx) {
31862
31866
  return _internals45.buildDetailedHelp(resolved.key, resolved.entry);
31863
31867
  }
31864
31868
  const similar = _internals45.findSimilarCommands(targetCommand);
31865
- const { buildHelpText: fullHelp } = await import("./index-jv0bz96v.js");
31869
+ const { buildHelpText: fullHelp } = await import("./index-r0zbs7ny.js");
31866
31870
  if (similar.length > 0) {
31867
31871
  return `Command '/swarm ${targetCommand}' not found.
31868
31872
 
@@ -31995,7 +31999,7 @@ var COMMAND_REGISTRY = {
31995
31999
  },
31996
32000
  "guardrail explain": {
31997
32001
  handler: async (ctx) => {
31998
- const { handleGuardrailExplain } = await import("./guardrail-explain-we8mhb6y.js");
32002
+ const { handleGuardrailExplain } = await import("./guardrail-explain-0hw3kyab.js");
31999
32003
  return handleGuardrailExplain(ctx.directory, ctx.args);
32000
32004
  },
32001
32005
  description: "Dry-run: show what the guardrails would do to a command or write target (executes nothing)",
@@ -32005,7 +32009,7 @@ var COMMAND_REGISTRY = {
32005
32009
  },
32006
32010
  "guardrail-log": {
32007
32011
  handler: async (ctx) => {
32008
- const { handleGuardrailLog } = await import("./guardrail-log-0q6pvbpx.js");
32012
+ const { handleGuardrailLog } = await import("./guardrail-log-9yyeccv5.js");
32009
32013
  return handleGuardrailLog(ctx.directory, ctx.args);
32010
32014
  },
32011
32015
  description: "Read the guardrail decision log (use --blocks-only for blocks)",
@@ -1,10 +1,10 @@
1
1
  // @bun
2
2
  import {
3
3
  handleGuardrailExplain
4
- } from "./index-q8qx8p47.js";
4
+ } from "./index-d3ds25vx.js";
5
5
  import {
6
6
  handleGuardrailLog
7
- } from "./index-tx5czwpd.js";
7
+ } from "./index-rdc6nvmw.js";
8
8
  import {
9
9
  COMMAND_REGISTRY,
10
10
  SWARM_COMMAND_TOOL_ALLOWLIST,
@@ -78,18 +78,18 @@ import {
78
78
  handleWriteRetroCommand,
79
79
  normalizeSwarmCommandInput,
80
80
  resolveCommand
81
- } from "./index-a59fjg9v.js";
82
- import"./index-dgjsa6hy.js";
81
+ } from "./index-q0t7gpf2.js";
82
+ import"./index-b223mczb.js";
83
83
  import"./index-2a6ppa65.js";
84
84
  import"./index-fjxjb66n.js";
85
85
  import"./index-hb10a2g8.js";
86
- import"./index-vqg905es.js";
86
+ import"./index-xx3sv77e.js";
87
87
  import {
88
88
  AGENT_TOOL_MAP,
89
89
  ORCHESTRATOR_NAME,
90
90
  stripKnownSwarmPrefix
91
- } from "./index-79dcqsg9.js";
92
- import"./index-y1z6yaq4.js";
91
+ } from "./index-tqbb2jx6.js";
92
+ import"./index-4c5jpmn9.js";
93
93
  import"./index-adz3nk9b.js";
94
94
  import"./index-v4fcn4tr.js";
95
95
  import"./index-mh1ej70w.js";
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  redactPath,
4
4
  redactShellCommand
5
- } from "./index-dgjsa6hy.js";
5
+ } from "./index-b223mczb.js";
6
6
 
7
7
  // src/services/guardrail-log-service.ts
8
8
  import * as fs from "fs/promises";
@@ -384,6 +384,33 @@ var TOOL_METADATA = {
384
384
  "researcher"
385
385
  ]
386
386
  },
387
+ ast_grep: {
388
+ 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.",
389
+ agents: [
390
+ "architect",
391
+ "sme",
392
+ "docs",
393
+ "docs_design",
394
+ "critic_hallucination_verifier",
395
+ "spec_writer",
396
+ "explorer",
397
+ "coder",
398
+ "test_engineer",
399
+ "researcher"
400
+ ]
401
+ },
402
+ actionlint_scan: {
403
+ description: "Run actionlint against GitHub Actions workflow YAML files with structured findings. Resolves actionlint lazily and does not modify files.",
404
+ agents: ["architect", "test_engineer"]
405
+ },
406
+ osv_scan: {
407
+ description: "Run OSV-Scanner against a workspace path and return structured dependency vulnerability findings. Resolves osv-scanner lazily and does not modify files.",
408
+ agents: ["architect", "test_engineer"]
409
+ },
410
+ gh_evidence: {
411
+ description: "Fetch bounded GitHub pull request or issue metadata through gh for review and CI evidence. Resolves gh lazily and is read-only.",
412
+ agents: ["architect", "researcher"]
413
+ },
387
414
  batch_symbols: {
388
415
  description: "Batched symbol extraction across multiple files. Returns per-file symbol summaries with isolated error handling.",
389
416
  agents: [
@@ -525,11 +552,11 @@ var TOOL_METADATA = {
525
552
  agents: ["architect"]
526
553
  },
527
554
  dispatch_lanes_async: {
528
- description: "launch read-only advisory lanes non-blockingly and return a batch id immediately so you can keep working; poll incrementally with collect_lane_results (wait omitted or false) while doing independent investigation, or join with wait: true when you need all results",
555
+ 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",
529
556
  agents: ["architect"]
530
557
  },
531
558
  collect_lane_results: {
532
- 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). Use non-blocking polls to check progress and process settled lanes incrementally while continuing independent work; use blocking join only when you need all lanes settled before proceeding. Does not advance workflow gates.",
559
+ 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.",
533
560
  agents: ["architect"]
534
561
  },
535
562
  summarize_work: {
@@ -3,7 +3,7 @@ import {
3
3
  ALL_AGENT_NAMES,
4
4
  PluginConfigSchema,
5
5
  stripKnownSwarmPrefix
6
- } from "./index-79dcqsg9.js";
6
+ } from "./index-tqbb2jx6.js";
7
7
  import {
8
8
  log
9
9
  } from "./index-zgwm4ryv.js";
package/dist/cli/index.js CHANGED
@@ -7,16 +7,16 @@ import {
7
7
  getPluginLockFilePaths,
8
8
  package_default,
9
9
  resolveCommand
10
- } from "./index-a59fjg9v.js";
11
- import"./index-dgjsa6hy.js";
10
+ } from "./index-q0t7gpf2.js";
11
+ import"./index-b223mczb.js";
12
12
  import"./index-2a6ppa65.js";
13
13
  import"./index-fjxjb66n.js";
14
14
  import"./index-hb10a2g8.js";
15
- import"./index-vqg905es.js";
15
+ import"./index-xx3sv77e.js";
16
16
  import {
17
17
  DEFAULT_AGENT_CONFIGS
18
- } from "./index-79dcqsg9.js";
19
- import"./index-y1z6yaq4.js";
18
+ } from "./index-tqbb2jx6.js";
19
+ import"./index-4c5jpmn9.js";
20
20
  import"./index-adz3nk9b.js";
21
21
  import"./index-v4fcn4tr.js";
22
22
  import"./index-mh1ej70w.js";
@@ -81,7 +81,7 @@ import {
81
81
  resolveGeneratedAgentRole,
82
82
  resolveGuardrailsConfig,
83
83
  stripKnownSwarmPrefix
84
- } from "./index-79dcqsg9.js";
84
+ } from "./index-tqbb2jx6.js";
85
85
  import"./index-p0arc26j.js";
86
86
  import"./index-293f68mj.js";
87
87
  import"./index-a76rekgs.js";