opencode-swarm 7.76.0 → 7.76.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.
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.76.0",
55
+ version: "7.76.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",
@@ -37416,6 +37416,14 @@ var init_branch = __esm(() => {
37416
37416
  };
37417
37417
  });
37418
37418
 
37419
+ // src/hooks/abort-utils.ts
37420
+ function isAbortError(err) {
37421
+ if (typeof err !== "object" || err === null)
37422
+ return false;
37423
+ const name = err.name;
37424
+ return name === "AbortError" || name === "TimeoutError";
37425
+ }
37426
+
37419
37427
  // src/hooks/curator-llm-factory.ts
37420
37428
  function resolveCuratorAgentName(mode, sessionId) {
37421
37429
  const suffixMap = {
@@ -37484,13 +37492,19 @@ function createCuratorLLMDelegate(directory, mode = "init", sessionId) {
37484
37492
  }
37485
37493
  };
37486
37494
  if (signal?.aborted) {
37487
- cleanup();
37488
37495
  throw new Error("CURATOR_LLM_TIMEOUT");
37489
37496
  }
37490
- signal?.addEventListener("abort", cleanup, { once: true });
37497
+ const sdkOpts = signal ? { signal } : {};
37491
37498
  try {
37492
37499
  const createResult = await client.session.create({
37493
- query: { directory }
37500
+ ...sessionId ? {
37501
+ body: {
37502
+ parentID: sessionId,
37503
+ title: `curator_${mode} background`
37504
+ }
37505
+ } : {},
37506
+ query: { directory },
37507
+ ...sdkOpts
37494
37508
  });
37495
37509
  if (!createResult.data) {
37496
37510
  throw new Error(`Failed to create curator session: ${JSON.stringify(createResult.error)}`);
@@ -37500,30 +37514,27 @@ function createCuratorLLMDelegate(directory, mode = "init", sessionId) {
37500
37514
  throw new Error("CURATOR_LLM_TIMEOUT");
37501
37515
  }
37502
37516
  const agentName = resolveCuratorAgentName(mode, sessionId);
37503
- let promptResult;
37504
- try {
37505
- promptResult = await client.session.prompt({
37506
- path: { id: ephemeralSessionId },
37507
- body: {
37508
- agent: agentName,
37509
- tools: { write: false, edit: false, patch: false },
37510
- parts: [{ type: "text", text: userInput }]
37511
- }
37512
- });
37513
- } catch (promptErr) {
37514
- if (signal?.aborted) {
37515
- throw new Error("CURATOR_LLM_TIMEOUT");
37516
- }
37517
- throw promptErr;
37518
- }
37517
+ const promptResult = await client.session.prompt({
37518
+ path: { id: ephemeralSessionId },
37519
+ body: {
37520
+ agent: agentName,
37521
+ tools: { write: false, edit: false, patch: false },
37522
+ parts: [{ type: "text", text: userInput }]
37523
+ },
37524
+ ...sdkOpts
37525
+ });
37519
37526
  if (!promptResult.data) {
37520
37527
  throw new Error(`Curator LLM prompt failed: ${JSON.stringify(promptResult.error)}`);
37521
37528
  }
37522
37529
  const textParts = promptResult.data.parts.filter((p) => p.type === "text");
37523
37530
  return textParts.map((p) => p.text).join(`
37524
37531
  `);
37532
+ } catch (err) {
37533
+ if (isAbortError(err)) {
37534
+ throw new Error("CURATOR_LLM_TIMEOUT");
37535
+ }
37536
+ throw err;
37525
37537
  } finally {
37526
- signal?.removeEventListener("abort", cleanup);
37527
37538
  cleanup();
37528
37539
  }
37529
37540
  };
@@ -42999,13 +43010,16 @@ function createSkillImproverLLMDelegate(directory, sessionId) {
42999
43010
  }
43000
43011
  };
43001
43012
  if (signal?.aborted) {
43002
- cleanup();
43003
43013
  throw new Error("SKILL_IMPROVER_LLM_TIMEOUT");
43004
43014
  }
43005
- signal?.addEventListener("abort", cleanup, { once: true });
43015
+ const sdkOpts = signal ? { signal } : {};
43006
43016
  try {
43007
43017
  const createResult = await client.session.create({
43008
- query: { directory }
43018
+ ...sessionId ? {
43019
+ body: { parentID: sessionId, title: "skill_improver background" }
43020
+ } : {},
43021
+ query: { directory },
43022
+ ...sdkOpts
43009
43023
  });
43010
43024
  if (!createResult.data) {
43011
43025
  throw new Error(`Failed to create skill_improver session: ${JSON.stringify(createResult.error)}`);
@@ -43014,34 +43028,31 @@ function createSkillImproverLLMDelegate(directory, sessionId) {
43014
43028
  if (signal?.aborted)
43015
43029
  throw new Error("SKILL_IMPROVER_LLM_TIMEOUT");
43016
43030
  const agentName = resolveSkillImproverAgentName(sessionId);
43017
- let promptResult;
43018
- try {
43019
- const prelude = systemPrompt ? `${systemPrompt}
43031
+ const prelude = systemPrompt ? `${systemPrompt}
43020
43032
 
43021
43033
  ---
43022
43034
 
43023
43035
  ${userInput}` : userInput;
43024
- promptResult = await client.session.prompt({
43025
- path: { id: ephemeralSessionId },
43026
- body: {
43027
- agent: agentName,
43028
- tools: { write: false, edit: false, patch: false },
43029
- parts: [{ type: "text", text: prelude }]
43030
- }
43031
- });
43032
- } catch (err) {
43033
- if (signal?.aborted)
43034
- throw new Error("SKILL_IMPROVER_LLM_TIMEOUT");
43035
- throw err;
43036
- }
43036
+ const promptResult = await client.session.prompt({
43037
+ path: { id: ephemeralSessionId },
43038
+ body: {
43039
+ agent: agentName,
43040
+ tools: { write: false, edit: false, patch: false },
43041
+ parts: [{ type: "text", text: prelude }]
43042
+ },
43043
+ ...sdkOpts
43044
+ });
43037
43045
  if (!promptResult.data) {
43038
43046
  throw new Error(`skill_improver LLM prompt failed: ${JSON.stringify(promptResult.error)}`);
43039
43047
  }
43040
43048
  const textParts = promptResult.data.parts.filter((p) => p.type === "text");
43041
43049
  return textParts.map((p) => p.text).join(`
43042
43050
  `);
43051
+ } catch (err) {
43052
+ if (isAbortError(err))
43053
+ throw new Error("SKILL_IMPROVER_LLM_TIMEOUT");
43054
+ throw err;
43043
43055
  } finally {
43044
- signal?.removeEventListener("abort", cleanup);
43045
43056
  cleanup();
43046
43057
  }
43047
43058
  };
@@ -43573,7 +43584,7 @@ ${inv.staleActiveSkills.slice(0, 10).map((s) => `- ${s.slug} | ${s.reasons.join(
43573
43584
  `) || "(none)"}
43574
43585
  `;
43575
43586
  }
43576
- function isAbortError(err) {
43587
+ function isAbortError2(err) {
43577
43588
  return err instanceof Error && (err.name === "AbortError" || err.message === "skill_improver_aborted");
43578
43589
  }
43579
43590
  function throwIfAborted(signal) {
@@ -43721,7 +43732,7 @@ async function runSkillImprover(req) {
43721
43732
  inventory = await gatherInventory(req.directory);
43722
43733
  throwIfAborted(req.signal);
43723
43734
  } catch (err) {
43724
- if (isAbortError(err)) {
43735
+ if (isAbortError2(err)) {
43725
43736
  return await abortResult();
43726
43737
  }
43727
43738
  await releaseQuota(req.directory, {
@@ -43753,7 +43764,7 @@ async function runSkillImprover(req) {
43753
43764
  }
43754
43765
  source = "llm";
43755
43766
  } catch (err) {
43756
- if (isAbortError(err)) {
43767
+ if (isAbortError2(err)) {
43757
43768
  return await abortResult();
43758
43769
  }
43759
43770
  return {
@@ -43770,7 +43781,7 @@ async function runSkillImprover(req) {
43770
43781
  try {
43771
43782
  throwIfAborted(req.signal);
43772
43783
  } catch (err) {
43773
- if (isAbortError(err)) {
43784
+ if (isAbortError2(err)) {
43774
43785
  return await abortResult();
43775
43786
  }
43776
43787
  throw err;
@@ -43783,7 +43794,7 @@ async function runSkillImprover(req) {
43783
43794
  try {
43784
43795
  throwIfAborted(req.signal);
43785
43796
  } catch (err) {
43786
- if (isAbortError(err)) {
43797
+ if (isAbortError2(err)) {
43787
43798
  return await abortResult();
43788
43799
  }
43789
43800
  throw err;
@@ -43804,7 +43815,7 @@ async function runSkillImprover(req) {
43804
43815
  try {
43805
43816
  throwIfAborted(req.signal);
43806
43817
  } catch (err) {
43807
- if (isAbortError(err)) {
43818
+ if (isAbortError2(err)) {
43808
43819
  return await abortResult();
43809
43820
  }
43810
43821
  throw err;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * True only for genuine cancellation errors (a native `AbortError` /
3
+ * `TimeoutError` raised when a forwarded `AbortSignal` fires). Used to map
4
+ * cancellation — and only cancellation — onto timeout sentinels, so a real
5
+ * failure that merely coincides with an aborted signal still surfaces as
6
+ * itself rather than being misclassified as a timeout.
7
+ */
8
+ export declare function isAbortError(err: unknown): boolean;
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.76.0",
72
+ version: "7.76.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",
@@ -58788,6 +58788,14 @@ var init_branch = __esm(() => {
58788
58788
  };
58789
58789
  });
58790
58790
 
58791
+ // src/hooks/abort-utils.ts
58792
+ function isAbortError(err2) {
58793
+ if (typeof err2 !== "object" || err2 === null)
58794
+ return false;
58795
+ const name2 = err2.name;
58796
+ return name2 === "AbortError" || name2 === "TimeoutError";
58797
+ }
58798
+
58791
58799
  // src/hooks/curator-llm-factory.ts
58792
58800
  function resolveCuratorAgentName(mode, sessionId) {
58793
58801
  const suffixMap = {
@@ -58856,13 +58864,19 @@ function createCuratorLLMDelegate(directory, mode = "init", sessionId) {
58856
58864
  }
58857
58865
  };
58858
58866
  if (signal?.aborted) {
58859
- cleanup();
58860
58867
  throw new Error("CURATOR_LLM_TIMEOUT");
58861
58868
  }
58862
- signal?.addEventListener("abort", cleanup, { once: true });
58869
+ const sdkOpts = signal ? { signal } : {};
58863
58870
  try {
58864
58871
  const createResult = await client.session.create({
58865
- query: { directory }
58872
+ ...sessionId ? {
58873
+ body: {
58874
+ parentID: sessionId,
58875
+ title: `curator_${mode} background`
58876
+ }
58877
+ } : {},
58878
+ query: { directory },
58879
+ ...sdkOpts
58866
58880
  });
58867
58881
  if (!createResult.data) {
58868
58882
  throw new Error(`Failed to create curator session: ${JSON.stringify(createResult.error)}`);
@@ -58872,30 +58886,27 @@ function createCuratorLLMDelegate(directory, mode = "init", sessionId) {
58872
58886
  throw new Error("CURATOR_LLM_TIMEOUT");
58873
58887
  }
58874
58888
  const agentName = resolveCuratorAgentName(mode, sessionId);
58875
- let promptResult;
58876
- try {
58877
- promptResult = await client.session.prompt({
58878
- path: { id: ephemeralSessionId },
58879
- body: {
58880
- agent: agentName,
58881
- tools: { write: false, edit: false, patch: false },
58882
- parts: [{ type: "text", text: userInput }]
58883
- }
58884
- });
58885
- } catch (promptErr) {
58886
- if (signal?.aborted) {
58887
- throw new Error("CURATOR_LLM_TIMEOUT");
58888
- }
58889
- throw promptErr;
58890
- }
58889
+ const promptResult = await client.session.prompt({
58890
+ path: { id: ephemeralSessionId },
58891
+ body: {
58892
+ agent: agentName,
58893
+ tools: { write: false, edit: false, patch: false },
58894
+ parts: [{ type: "text", text: userInput }]
58895
+ },
58896
+ ...sdkOpts
58897
+ });
58891
58898
  if (!promptResult.data) {
58892
58899
  throw new Error(`Curator LLM prompt failed: ${JSON.stringify(promptResult.error)}`);
58893
58900
  }
58894
58901
  const textParts = promptResult.data.parts.filter((p) => p.type === "text");
58895
58902
  return textParts.map((p) => p.text).join(`
58896
58903
  `);
58904
+ } catch (err2) {
58905
+ if (isAbortError(err2)) {
58906
+ throw new Error("CURATOR_LLM_TIMEOUT");
58907
+ }
58908
+ throw err2;
58897
58909
  } finally {
58898
- signal?.removeEventListener("abort", cleanup);
58899
58910
  cleanup();
58900
58911
  }
58901
58912
  };
@@ -66665,13 +66676,16 @@ function createSkillImproverLLMDelegate(directory, sessionId) {
66665
66676
  }
66666
66677
  };
66667
66678
  if (signal?.aborted) {
66668
- cleanup();
66669
66679
  throw new Error("SKILL_IMPROVER_LLM_TIMEOUT");
66670
66680
  }
66671
- signal?.addEventListener("abort", cleanup, { once: true });
66681
+ const sdkOpts = signal ? { signal } : {};
66672
66682
  try {
66673
66683
  const createResult = await client.session.create({
66674
- query: { directory }
66684
+ ...sessionId ? {
66685
+ body: { parentID: sessionId, title: "skill_improver background" }
66686
+ } : {},
66687
+ query: { directory },
66688
+ ...sdkOpts
66675
66689
  });
66676
66690
  if (!createResult.data) {
66677
66691
  throw new Error(`Failed to create skill_improver session: ${JSON.stringify(createResult.error)}`);
@@ -66680,34 +66694,31 @@ function createSkillImproverLLMDelegate(directory, sessionId) {
66680
66694
  if (signal?.aborted)
66681
66695
  throw new Error("SKILL_IMPROVER_LLM_TIMEOUT");
66682
66696
  const agentName = resolveSkillImproverAgentName(sessionId);
66683
- let promptResult;
66684
- try {
66685
- const prelude = systemPrompt ? `${systemPrompt}
66697
+ const prelude = systemPrompt ? `${systemPrompt}
66686
66698
 
66687
66699
  ---
66688
66700
 
66689
66701
  ${userInput}` : userInput;
66690
- promptResult = await client.session.prompt({
66691
- path: { id: ephemeralSessionId },
66692
- body: {
66693
- agent: agentName,
66694
- tools: { write: false, edit: false, patch: false },
66695
- parts: [{ type: "text", text: prelude }]
66696
- }
66697
- });
66698
- } catch (err2) {
66699
- if (signal?.aborted)
66700
- throw new Error("SKILL_IMPROVER_LLM_TIMEOUT");
66701
- throw err2;
66702
- }
66702
+ const promptResult = await client.session.prompt({
66703
+ path: { id: ephemeralSessionId },
66704
+ body: {
66705
+ agent: agentName,
66706
+ tools: { write: false, edit: false, patch: false },
66707
+ parts: [{ type: "text", text: prelude }]
66708
+ },
66709
+ ...sdkOpts
66710
+ });
66703
66711
  if (!promptResult.data) {
66704
66712
  throw new Error(`skill_improver LLM prompt failed: ${JSON.stringify(promptResult.error)}`);
66705
66713
  }
66706
66714
  const textParts = promptResult.data.parts.filter((p) => p.type === "text");
66707
66715
  return textParts.map((p) => p.text).join(`
66708
66716
  `);
66717
+ } catch (err2) {
66718
+ if (isAbortError(err2))
66719
+ throw new Error("SKILL_IMPROVER_LLM_TIMEOUT");
66720
+ throw err2;
66709
66721
  } finally {
66710
- signal?.removeEventListener("abort", cleanup);
66711
66722
  cleanup();
66712
66723
  }
66713
66724
  };
@@ -67239,7 +67250,7 @@ ${inv.staleActiveSkills.slice(0, 10).map((s) => `- ${s.slug} | ${s.reasons.join(
67239
67250
  `) || "(none)"}
67240
67251
  `;
67241
67252
  }
67242
- function isAbortError(err2) {
67253
+ function isAbortError2(err2) {
67243
67254
  return err2 instanceof Error && (err2.name === "AbortError" || err2.message === "skill_improver_aborted");
67244
67255
  }
67245
67256
  function throwIfAborted(signal) {
@@ -67387,7 +67398,7 @@ async function runSkillImprover(req) {
67387
67398
  inventory = await gatherInventory(req.directory);
67388
67399
  throwIfAborted(req.signal);
67389
67400
  } catch (err2) {
67390
- if (isAbortError(err2)) {
67401
+ if (isAbortError2(err2)) {
67391
67402
  return await abortResult();
67392
67403
  }
67393
67404
  await releaseQuota(req.directory, {
@@ -67419,7 +67430,7 @@ async function runSkillImprover(req) {
67419
67430
  }
67420
67431
  source = "llm";
67421
67432
  } catch (err2) {
67422
- if (isAbortError(err2)) {
67433
+ if (isAbortError2(err2)) {
67423
67434
  return await abortResult();
67424
67435
  }
67425
67436
  return {
@@ -67436,7 +67447,7 @@ async function runSkillImprover(req) {
67436
67447
  try {
67437
67448
  throwIfAborted(req.signal);
67438
67449
  } catch (err2) {
67439
- if (isAbortError(err2)) {
67450
+ if (isAbortError2(err2)) {
67440
67451
  return await abortResult();
67441
67452
  }
67442
67453
  throw err2;
@@ -67449,7 +67460,7 @@ async function runSkillImprover(req) {
67449
67460
  try {
67450
67461
  throwIfAborted(req.signal);
67451
67462
  } catch (err2) {
67452
- if (isAbortError(err2)) {
67463
+ if (isAbortError2(err2)) {
67453
67464
  return await abortResult();
67454
67465
  }
67455
67466
  throw err2;
@@ -67470,7 +67481,7 @@ async function runSkillImprover(req) {
67470
67481
  try {
67471
67482
  throwIfAborted(req.signal);
67472
67483
  } catch (err2) {
67473
- if (isAbortError(err2)) {
67484
+ if (isAbortError2(err2)) {
67474
67485
  return await abortResult();
67475
67486
  }
67476
67487
  throw err2;
@@ -93921,7 +93932,8 @@ ${customAppendPrompt}` : AUTONOMOUS_OVERSIGHT_PROMPT;
93921
93932
  write: false,
93922
93933
  edit: false,
93923
93934
  patch: false
93924
- }
93935
+ },
93936
+ thinking: { type: "disabled" }
93925
93937
  }
93926
93938
  };
93927
93939
  }
@@ -94523,7 +94535,8 @@ ${customAppendPrompt}` : roleConfig.prompt;
94523
94535
  write: false,
94524
94536
  edit: false,
94525
94537
  patch: false
94526
- }
94538
+ },
94539
+ thinking: { type: "disabled" }
94527
94540
  }
94528
94541
  };
94529
94542
  }
@@ -104589,6 +104602,12 @@ async function dispatchFullAutoOversight(input) {
104589
104602
  let dispatchError;
104590
104603
  try {
104591
104604
  const createResult = await client.session.create({
104605
+ ...input.sessionID ? {
104606
+ body: {
104607
+ parentID: input.sessionID,
104608
+ title: "full_auto_oversight background"
104609
+ }
104610
+ } : {},
104592
104611
  query: { directory: input.directory }
104593
104612
  });
104594
104613
  if (!createResult.data) {
@@ -106523,6 +106542,9 @@ async function dispatchCriticAndWriteEvent(directory, architectOutput, criticCon
106523
106542
  let criticResponse = "";
106524
106543
  try {
106525
106544
  const createResult = await client.session.create({
106545
+ ...sessionID ? {
106546
+ body: { parentID: sessionID, title: "full_auto_critic background" }
106547
+ } : {},
106526
106548
  query: { directory }
106527
106549
  });
106528
106550
  if (!createResult.data) {
@@ -113093,12 +113115,18 @@ async function writeReviewerEvidence(directory, phase, verdict, reason) {
113093
113115
  }
113094
113116
  return evidencePath;
113095
113117
  }
113096
- async function defaultDispatchReviewerAgent(directory, reviewPackage, agentName, timeoutMs) {
113118
+ async function defaultDispatchReviewerAgent(directory, reviewPackage, agentName, timeoutMs, parentSessionId) {
113097
113119
  const client = swarmState.opencodeClient;
113098
113120
  if (!client) {
113099
113121
  throw new Error("OpencodeClient not available");
113100
113122
  }
113101
113123
  const sessionResult = await client.session.create({
113124
+ ...parentSessionId ? {
113125
+ body: {
113126
+ parentID: parentSessionId,
113127
+ title: "lean_turbo_reviewer background"
113128
+ }
113129
+ } : {},
113102
113130
  query: { directory }
113103
113131
  });
113104
113132
  if (!sessionResult.data?.id) {
@@ -113190,7 +113218,7 @@ async function dispatchPhaseReviewer(directory, phase, sessionID, config3) {
113190
113218
  const pkg = await _internals70.compileReviewPackage(directory, phase, sessionID, mergedConfig.requireDiffSummary);
113191
113219
  let responseText;
113192
113220
  try {
113193
- responseText = await _internals70.dispatchReviewerAgent(directory, pkg, agentName, mergedConfig.timeoutMs);
113221
+ responseText = await _internals70.dispatchReviewerAgent(directory, pkg, agentName, mergedConfig.timeoutMs, sessionID);
113194
113222
  } catch (error93) {
113195
113223
  const evidencePath2 = await _internals70.writeReviewerEvidence(directory, phase, "REJECTED", error93 instanceof Error ? error93.message : String(error93));
113196
113224
  return {
@@ -125692,6 +125720,12 @@ async function generateMutants(files, ctx) {
125692
125720
  };
125693
125721
  try {
125694
125722
  const createResult = await client.session.create({
125723
+ ...ctx?.sessionID ? {
125724
+ body: {
125725
+ parentID: ctx.sessionID,
125726
+ title: "mutation_generator background"
125727
+ }
125728
+ } : {},
125695
125729
  query: { directory }
125696
125730
  });
125697
125731
  if (!createResult.data) {
@@ -128687,6 +128721,12 @@ class LeanTurboRunner {
128687
128721
  try {
128688
128722
  const effectiveDirectory = worktreeDirectory ?? this._directory;
128689
128723
  const createResult = await session.create({
128724
+ ...this._sessionID ? {
128725
+ body: {
128726
+ parentID: this._sessionID,
128727
+ title: `lean_turbo_lane_${lane.laneId} background`
128728
+ }
128729
+ } : {},
128690
128730
  query: { directory: effectiveDirectory }
128691
128731
  });
128692
128732
  if (!createResult.data) {
@@ -108,7 +108,7 @@ export declare const _internals: {
108
108
  compileCriticPackage: typeof compileCriticPackage;
109
109
  parseCriticVerdict: typeof parseCriticVerdict;
110
110
  writeCriticEvidence: typeof writeCriticEvidence;
111
- dispatchCriticAgent: (directory: string, pkg: CriticPackage, agentName: string, timeoutMs: number) => Promise<string>;
111
+ dispatchCriticAgent: (directory: string, pkg: CriticPackage, agentName: string, timeoutMs: number, parentSessionId?: string) => Promise<string>;
112
112
  resolveDefaultCriticAgent: typeof resolveDefaultCriticAgent;
113
113
  readReviewerEvidence: typeof readReviewerEvidence;
114
114
  listLaneEvidence: typeof listLaneEvidence;
@@ -97,7 +97,7 @@ export declare const _internals: {
97
97
  compileReviewPackage: typeof compileReviewPackage;
98
98
  parseReviewerVerdict: typeof parseReviewerVerdict;
99
99
  writeReviewerEvidence: typeof writeReviewerEvidence;
100
- dispatchReviewerAgent: (directory: string, pkg: ReviewPackage, agentName: string, timeoutMs: number) => Promise<string>;
100
+ dispatchReviewerAgent: (directory: string, pkg: ReviewPackage, agentName: string, timeoutMs: number, parentSessionId?: string) => Promise<string>;
101
101
  resolveDefaultReviewerAgent: typeof resolveDefaultReviewerAgent;
102
102
  listLaneEvidence: typeof listLaneEvidence;
103
103
  readPhaseEvidence: typeof readPhaseEvidence;
@@ -34,6 +34,10 @@ import { assertCleanWorkingTree, provisionWorktree, removeWorktree } from './wor
34
34
  */
35
35
  interface SessionClient {
36
36
  create(options: {
37
+ body?: {
38
+ parentID?: string;
39
+ title?: string;
40
+ };
37
41
  query: {
38
42
  directory: string;
39
43
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-swarm",
3
- "version": "7.76.0",
3
+ "version": "7.76.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",