opencode-swarm 7.138.1 → 7.138.3

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 (43) hide show
  1. package/.opencode/skills/swarm-pr-review/SKILL.md +5 -1
  2. package/dist/background/candidate-contract.d.ts +31 -0
  3. package/dist/background/pending-delegations.d.ts +7 -0
  4. package/dist/background/pr-review-trigger-contract.d.ts +38 -1
  5. package/dist/cli/{config-doctor-m79sx8b2.js → config-doctor-2mwgdbsn.js} +2 -2
  6. package/dist/cli/{curation-policy-dkx4s5va.js → curation-policy-5dqexw5j.js} +2 -2
  7. package/dist/cli/{curator-jjf5x6bn.js → curator-jjtp9hn2.js} +13 -13
  8. package/dist/cli/{curator-llm-factory-sprc6pm3.js → curator-llm-factory-wkjme59b.js} +13 -13
  9. package/dist/cli/{guardrail-explain-zs3hq02c.js → guardrail-explain-xppwfnxr.js} +14 -14
  10. package/dist/cli/{guardrail-log-90dnv508.js → guardrail-log-swet7rch.js} +3 -3
  11. package/dist/cli/{hive-promoter-zkay2ffy.js → hive-promoter-xvq8jzbs.js} +13 -13
  12. package/dist/cli/{index-8xqnp3gw.js → index-1djv5684.js} +4 -4
  13. package/dist/cli/{index-vmff7b40.js → index-1v89yst3.js} +2 -2
  14. package/dist/cli/{index-e2eedz1b.js → index-31vfewmn.js} +1 -1
  15. package/dist/cli/{index-kqzzdxc1.js → index-93ky909v.js} +1 -1
  16. package/dist/cli/{index-mnw8g9bs.js → index-99af5gvd.js} +153 -56
  17. package/dist/cli/{index-e78pqbkj.js → index-ab57h0yq.js} +1 -1
  18. package/dist/cli/{index-navw2ezf.js → index-adde7nm2.js} +5 -5
  19. package/dist/cli/{index-vp3mwsd1.js → index-btx8j39p.js} +1 -1
  20. package/dist/cli/{index-5fdztrpt.js → index-gda7cwqz.js} +2 -2
  21. package/dist/cli/{index-mzqgtzxq.js → index-jhb8kjc5.js} +3 -3
  22. package/dist/cli/{index-06zw53mf.js → index-js7th5my.js} +1 -1
  23. package/dist/cli/{index-0s4gr6qh.js → index-q344kj84.js} +2 -1
  24. package/dist/cli/{index-aeyktf9q.js → index-rjratees.js} +1 -1
  25. package/dist/cli/{index-d4t92fa3.js → index-tc61fybd.js} +2 -2
  26. package/dist/cli/{index-9vvskh03.js → index-wqg74mwj.js} +1 -1
  27. package/dist/cli/{index-6f6nt0c9.js → index-xgmx9had.js} +15 -15
  28. package/dist/cli/{index-p7fn5byt.js → index-y6dvs5tt.js} +1 -1
  29. package/dist/cli/index.js +13 -13
  30. package/dist/cli/{knowledge-escalator-6y5x8vat.js → knowledge-escalator-7n384ys1.js} +3 -3
  31. package/dist/cli/{knowledge-events-bnr4weyn.js → knowledge-events-yaj0yjd6.js} +1 -1
  32. package/dist/cli/{knowledge-store-4mcmb2rj.js → knowledge-store-d99k0z2d.js} +1 -1
  33. package/dist/cli/{knowledge-validator-pf377mtx.js → knowledge-validator-e5fqy9h4.js} +4 -4
  34. package/dist/cli/{pending-delegations-ztb67amh.js → pending-delegations-7dbc0j2a.js} +1 -1
  35. package/dist/cli/{scan-cursor-we0561wc.js → scan-cursor-9y9msabt.js} +2 -2
  36. package/dist/cli/{schema-1xtxr4d9.js → schema-xg5f11md.js} +1 -1
  37. package/dist/cli/{skill-generator-kns0dae2.js → skill-generator-arvwfdfh.js} +5 -5
  38. package/dist/cli/{worktree-collision-ownership-rc6pe17g.js → worktree-collision-ownership-hjrt5hx2.js} +1 -1
  39. package/dist/hooks/pr-workflow-gate.d.ts +41 -1
  40. package/dist/index.js +24 -11
  41. package/dist/tools/dispatch-lanes.d.ts +7 -0
  42. package/dist/tools/write-pr-review-trigger-eval.d.ts +2 -2
  43. package/package.json +1 -1
@@ -16,13 +16,13 @@ import {
16
16
  } from "./index-rrxcfxrd.js";
17
17
  import {
18
18
  stableCanonicalStringify
19
- } from "./index-e2eedz1b.js";
19
+ } from "./index-31vfewmn.js";
20
20
  import {
21
21
  detectStraySwarmDirs,
22
22
  readDoctorArtifact,
23
23
  removeStraySwarmDir,
24
24
  runConfigDoctor
25
- } from "./index-vp3mwsd1.js";
25
+ } from "./index-btx8j39p.js";
26
26
  import {
27
27
  MAX_TRANSIENT_RETRIES,
28
28
  archiveEvidence,
@@ -114,15 +114,15 @@ import {
114
114
  retireSkill,
115
115
  selectCandidateEntries,
116
116
  syncBundledProjectSkillsIfMissingAsync
117
- } from "./index-mzqgtzxq.js";
117
+ } from "./index-jhb8kjc5.js";
118
118
  import {
119
119
  readRecentEscalations
120
- } from "./index-navw2ezf.js";
120
+ } from "./index-adde7nm2.js";
121
121
  import {
122
122
  alreadyCuratedThisGeneration,
123
123
  claimNextScanBatch,
124
124
  resolveCohortId
125
- } from "./index-aeyktf9q.js";
125
+ } from "./index-rjratees.js";
126
126
  import {
127
127
  CURATOR_INIT_PROMPT,
128
128
  CURATOR_PHASE_PROMPT,
@@ -175,11 +175,11 @@ import {
175
175
  validateActionableFields,
176
176
  validateLesson,
177
177
  validateSkillPath
178
- } from "./index-d4t92fa3.js";
178
+ } from "./index-tc61fybd.js";
179
179
  import {
180
180
  authorizeCuration,
181
181
  buildConfigFingerprintInput
182
- } from "./index-9vvskh03.js";
182
+ } from "./index-wqg74mwj.js";
183
183
  import {
184
184
  cohortConfigFingerprint
185
185
  } from "./index-rtry5xyf.js";
@@ -212,7 +212,7 @@ import {
212
212
  transactFile,
213
213
  transactKnowledge,
214
214
  wordBigrams
215
- } from "./index-8xqnp3gw.js";
215
+ } from "./index-1djv5684.js";
216
216
  import {
217
217
  MAX_EVENT_LOG_ENTRIES,
218
218
  _internals,
@@ -222,7 +222,7 @@ import {
222
222
  recordHiveKnowledgeEvent,
223
223
  recordKnowledgeEvent,
224
224
  resolveKnowledgeEventsPath
225
- } from "./index-kqzzdxc1.js";
225
+ } from "./index-93ky909v.js";
226
226
  import {
227
227
  resolveHiveDataDir,
228
228
  resolveHiveEventsPath,
@@ -247,7 +247,7 @@ import {
247
247
  init_loader,
248
248
  loadPluginConfig,
249
249
  loadPluginConfigWithMeta
250
- } from "./index-p7fn5byt.js";
250
+ } from "./index-y6dvs5tt.js";
251
251
  import {
252
252
  RetrospectiveEvidenceSchema
253
253
  } from "./index-gprxjmm7.js";
@@ -263,7 +263,7 @@ import {
263
263
  package_default,
264
264
  resolveAutoReviewConfig,
265
265
  stripKnownSwarmPrefix
266
- } from "./index-e78pqbkj.js";
266
+ } from "./index-ab57h0yq.js";
267
267
  import {
268
268
  KNOWLEDGE_SCHEMA_VERSION,
269
269
  OUTCOME_BLOCK_THRESHOLD,
@@ -320,7 +320,7 @@ import {
320
320
  import {
321
321
  findByBatchId,
322
322
  readDelegations
323
- } from "./index-0s4gr6qh.js";
323
+ } from "./index-q344kj84.js";
324
324
  import {
325
325
  readSwarmFileAsync,
326
326
  safeHook,
@@ -477,6 +477,52 @@ function removeCandidateCodeFences(text) {
477
477
  return lines.join(`
478
478
  `);
479
479
  }
480
+ function declaredCanonicalFamilies(source) {
481
+ const families = [];
482
+ for (const line of source.split(/\r?\n/)) {
483
+ const family = candidateHeaderFamily(splitPipeFields(line).map((field) => field.trim()));
484
+ if (family && !families.includes(family))
485
+ families.push(family);
486
+ }
487
+ return families;
488
+ }
489
+ function normalizeCandidateArtifact(rawText, fallbackFamily) {
490
+ const text = removeCandidateCodeFences(rawText);
491
+ const header = selectCandidateHeader(text.split(/\r?\n/));
492
+ if (header?.markerBearing && header.family !== null) {
493
+ return { text, synthesizedHeader: false };
494
+ }
495
+ if (declaredCanonicalFamilies(text).length > 0) {
496
+ return { text, synthesizedHeader: false };
497
+ }
498
+ if (declaredCanonicalFamilies(rawText).some((family) => family !== fallbackFamily)) {
499
+ return { text, synthesizedHeader: false };
500
+ }
501
+ const lines = text.split(/\r?\n/);
502
+ const hasSalvageableRow = lines.some((line) => {
503
+ if (analyzeCandidateLine(line, fallbackFamily)?.valid === true)
504
+ return true;
505
+ const fields = splitPipeFields(line).map((field) => field.trim());
506
+ if (fields[0] !== CLEAN_MARKER)
507
+ return false;
508
+ return analyzeCleanFields(fields, fallbackFamily).valid;
509
+ });
510
+ if (!hasSalvageableRow)
511
+ return { text, synthesizedHeader: false };
512
+ const firstSalvageableIndex = lines.findIndex((line) => {
513
+ const marker = splitPipeFields(line)[0]?.trim();
514
+ return marker === CANDIDATE_MARKER || marker === CLEAN_MARKER;
515
+ });
516
+ return {
517
+ text: [
518
+ ...lines.slice(0, firstSalvageableIndex),
519
+ CANDIDATE_HEADERS[fallbackFamily],
520
+ ...lines.slice(firstSalvageableIndex)
521
+ ].join(`
522
+ `),
523
+ synthesizedHeader: true
524
+ };
525
+ }
480
526
  function analyzeCandidateLaneContext(context) {
481
527
  const issues = [];
482
528
  const baseBound = Boolean(context.expected_lane || context.expected_lanes);
@@ -687,6 +733,12 @@ function analyzeCleanFields(fields, family, expectedLane) {
687
733
  evidence
688
734
  };
689
735
  }
736
+ function analyzeCandidateLine(line, family) {
737
+ const fields = splitPipeFields(line).map((field) => field.trim());
738
+ if (fields[0] !== "[CANDIDATE]")
739
+ return null;
740
+ return analyzeCandidateFields(fields.slice(1), family);
741
+ }
690
742
 
691
743
  // src/background/candidate-parser.ts
692
744
  init_zod();
@@ -1276,7 +1328,7 @@ ${trimmed}`;
1276
1328
  if (cleanAttestation) {
1277
1329
  formatFamiliesDetected.add(cleanAttestation.row_format_family);
1278
1330
  }
1279
- const acceptedCandidates = cleanErrorCode ? [] : candidates;
1331
+ const acceptedCandidates = candidates;
1280
1332
  const parseErrors = parseErrorDetails.length;
1281
1333
  const envelope = buildInvocationEnvelope(input, flags, Array.from(formatFamiliesDetected), acceptedCandidates.length, parseErrors, malformedRows, cleanAttestation ? 1 : 0);
1282
1334
  const diagnostics = {
@@ -1488,6 +1540,20 @@ var PrReviewPersistedInputRowSchema = exports_external.discriminatedUnion("resul
1488
1540
  evidence: TriggerEvidenceSchema
1489
1541
  }).strict()
1490
1542
  ]);
1543
+ var PrReviewWriterInputRowSchema = exports_external.discriminatedUnion("result", [
1544
+ exports_external.object({
1545
+ trigger_id: TriggerIdSchema,
1546
+ result: exports_external.literal("MATCHED"),
1547
+ evidence: TriggerEvidenceSchema.optional(),
1548
+ source_batch_id: exports_external.string().trim().min(1),
1549
+ source_lane_id: exports_external.string().trim().min(1)
1550
+ }).strict(),
1551
+ exports_external.object({
1552
+ trigger_id: TriggerIdSchema,
1553
+ result: exports_external.literal("NOT_TRIGGERED"),
1554
+ evidence: TriggerEvidenceSchema.optional()
1555
+ }).strict()
1556
+ ]);
1491
1557
  function rawTriggerIds(input) {
1492
1558
  if (!Array.isArray(input))
1493
1559
  return null;
@@ -2811,6 +2877,9 @@ var _test_exports = {
2811
2877
  minimumConsolidatedLaneCover,
2812
2878
  analyzePrReviewBatchRecordIntegrity,
2813
2879
  MAX_COVER_UNIVERSE_BITS,
2880
+ extractCandidateIds,
2881
+ parseCanonicalCandidateRows,
2882
+ resolvePrReviewRowFamily,
2814
2883
  workflowGateStateRelativePath,
2815
2884
  workflowGateStateLockRelativePath,
2816
2885
  workflowCheckoutMutationLockRelativePath,
@@ -3138,13 +3207,13 @@ function derivePrReviewCandidateInventory(directory, state, ctx) {
3138
3207
  const recordOwnedLanes = record.ownedWorkflowLanes?.length ? record.ownedWorkflowLanes : record.workflowLane ? [record.workflowLane] : undefined;
3139
3208
  if (!artifact || !workflowArtifactHasContractMarker(directory, state, record, source.mode, record.workflowLane ?? source.workflowLane ?? source.laneId, undefined, ctx.revisionDigest, recordOwnedLanes))
3140
3209
  continue;
3141
- if (source.workflowLane && (!recordOwnedLanes?.includes(source.workflowLane) || !prReviewDiscoveryArtifactCoversLane(artifact.text, source.workflowLane, recordOwnedLanes)))
3210
+ if (source.workflowLane && (!recordOwnedLanes?.includes(source.workflowLane) || !prReviewDiscoveryArtifactCoversLane(artifact.text, source.workflowLane, recordOwnedLanes, source.mode)))
3142
3211
  continue;
3143
3212
  resolvedArtifact = true;
3144
3213
  const laneKey = `${source.batchId}\x00${source.laneId}`;
3145
3214
  if (!extractedLaneKeys.has(laneKey)) {
3146
3215
  extractedLaneKeys.add(laneKey);
3147
- candidateIds.push(...extractCandidateIds(artifact.text, source.mode === "swarm-pr-review:micro" ? "micro_lane" : "base_explorer", source.creditedLanes));
3216
+ candidateIds.push(...extractCandidateIds(artifact.text, resolvePrReviewRowFamily(source.workflowLane, source.mode), source.creditedLanes));
3148
3217
  }
3149
3218
  }
3150
3219
  if (source.mode === "swarm-pr-review:micro" && !resolvedArtifact) {
@@ -3164,11 +3233,19 @@ function appendBoundedCandidateIssue(issues, message) {
3164
3233
  issues.push("additional malformed candidate diagnostics omitted");
3165
3234
  }
3166
3235
  }
3236
+ function resolvePrReviewRowFamily(workflowLane, mode) {
3237
+ if (mode === "swarm-pr-review:base")
3238
+ return "base_explorer";
3239
+ if (mode === "swarm-pr-review:micro" || mode === "swarm-pr-review:council") {
3240
+ return "micro_lane";
3241
+ }
3242
+ return workflowLane !== undefined && PR_REVIEW_BASE_DIMENSION_IDS.includes(workflowLane) ? "base_explorer" : "micro_lane";
3243
+ }
3167
3244
  function parseCanonicalCandidateRows(text, fallbackFamily) {
3168
3245
  const rows = [];
3169
3246
  const issues = [];
3170
3247
  let headerFamily = null;
3171
- for (const [index, line] of removeCandidateCodeFences(text).split(/\r?\n/).entries()) {
3248
+ for (const [index, line] of normalizeCandidateArtifact(text, fallbackFamily).text.split(/\r?\n/).entries()) {
3172
3249
  const fields = splitPipeFields(line).map((field) => field.trim());
3173
3250
  const detectedHeaderFamily = candidateHeaderFamily(fields);
3174
3251
  if (detectedHeaderFamily) {
@@ -3699,7 +3776,7 @@ function workflowArtifactHasContractMarker(directory, state, record, expectedMod
3699
3776
  const coveredLanes = ownedWorkflowLanes?.length ? ownedWorkflowLanes : [expectedWorkflowLane];
3700
3777
  const coverageAnalyses = coveredLanes.map((coveredLane) => ({
3701
3778
  coveredLane,
3702
- analysis: analyzePrReviewDiscoveryArtifact(artifact.text, coveredLane, coveredLanes)
3779
+ analysis: analyzePrReviewDiscoveryArtifact(artifact.text, coveredLane, coveredLanes, expectedMode)
3703
3780
  }));
3704
3781
  if (coverageAnalyses.some(({ analysis }) => !analysis.covered)) {
3705
3782
  for (const { coveredLane, analysis } of coverageAnalyses) {
@@ -3715,7 +3792,7 @@ function workflowArtifactHasContractMarker(directory, state, record, expectedMod
3715
3792
  if (coveredLanes.length > 1) {
3716
3793
  const seenEvidence = new Map;
3717
3794
  for (const coveredLane of coveredLanes) {
3718
- const evidence2 = extractLaneCoverageEvidenceText(artifact.text, coveredLane, coveredLanes);
3795
+ const evidence2 = extractLaneCoverageEvidenceText(artifact.text, coveredLane, coveredLanes, expectedMode);
3719
3796
  if (evidence2 === null)
3720
3797
  continue;
3721
3798
  const priorLane = seenEvidence.get(evidence2);
@@ -3726,10 +3803,12 @@ function workflowArtifactHasContractMarker(directory, state, record, expectedMod
3726
3803
  }
3727
3804
  return true;
3728
3805
  }
3729
- function analyzePrReviewDiscoveryArtifact(text, expectedWorkflowLane, ownedWorkflowLanes = [expectedWorkflowLane]) {
3730
- const fallbackFamily = PR_REVIEW_BASE_DIMENSION_IDS.includes(expectedWorkflowLane) ? "base_explorer" : "micro_lane";
3806
+ function analyzePrReviewDiscoveryArtifact(text, expectedWorkflowLane, ownedWorkflowLanes = [expectedWorkflowLane], mode) {
3807
+ const fallbackFamily = resolvePrReviewRowFamily(expectedWorkflowLane, mode);
3731
3808
  const issues = [];
3732
- const canonicalText = removeCandidateCodeFences(text);
3809
+ const normalized = normalizeCandidateArtifact(text, fallbackFamily);
3810
+ const canonicalText = normalized.text;
3811
+ const salvaged = normalized.synthesizedHeader;
3733
3812
  const header = selectCandidateHeader(canonicalText.split(/\r?\n/));
3734
3813
  if (header === null || !header.markerBearing || header.family !== fallbackFamily) {
3735
3814
  appendBoundedCandidateIssue(issues, `field header: expected one exact canonical ${fallbackFamily} [CANDIDATE] header before discovery rows`);
@@ -3737,6 +3816,7 @@ function analyzePrReviewDiscoveryArtifact(text, expectedWorkflowLane, ownedWorkf
3737
3816
  covered: false,
3738
3817
  evidence: null,
3739
3818
  issues,
3819
+ salvaged,
3740
3820
  failurePredicate: "discovery.header"
3741
3821
  };
3742
3822
  }
@@ -3771,11 +3851,15 @@ function analyzePrReviewDiscoveryArtifact(text, expectedWorkflowLane, ownedWorkf
3771
3851
  for (const detail of parsed.diagnostics.parse_error_details) {
3772
3852
  appendBoundedCandidateIssue(issues, `row ${detail.row_index + 1} field ${detail.field}: ${detail.message}`);
3773
3853
  }
3774
- if (parsed.error || parsed.diagnostics.parse_error_details.length > 0) {
3854
+ const hasParseFailure = Boolean(parsed.error) || parsed.diagnostics.parse_error_details.length > 0;
3855
+ const extractedCandidateIds = parseCanonicalCandidateRows(canonicalText, fallbackFamily).rows.map((row) => row.candidateId);
3856
+ const hasDuplicateCandidateId = new Set(extractedCandidateIds).size !== extractedCandidateIds.length;
3857
+ if (hasDuplicateCandidateId) {
3775
3858
  return {
3776
3859
  covered: false,
3777
3860
  evidence: null,
3778
3861
  issues,
3862
+ salvaged,
3779
3863
  failurePredicate: "discovery.row"
3780
3864
  };
3781
3865
  }
@@ -3792,7 +3876,8 @@ function analyzePrReviewDiscoveryArtifact(text, expectedWorkflowLane, ownedWorkf
3792
3876
  matchingCandidate.impact_context ?? matchingCandidate.invariant_violated,
3793
3877
  matchingCandidate.confidence
3794
3878
  ].join("\x00"),
3795
- issues
3879
+ issues,
3880
+ salvaged
3796
3881
  };
3797
3882
  }
3798
3883
  const clean = parsed.clean_attestation;
@@ -3800,14 +3885,16 @@ function analyzePrReviewDiscoveryArtifact(text, expectedWorkflowLane, ownedWorkf
3800
3885
  return {
3801
3886
  covered: true,
3802
3887
  evidence: `${clean.coverage_scope}\x00${clean.evidence}`,
3803
- issues
3888
+ issues,
3889
+ salvaged
3804
3890
  };
3805
3891
  }
3806
3892
  return {
3807
3893
  covered: false,
3808
3894
  evidence: null,
3809
3895
  issues,
3810
- failurePredicate: "discovery.coverage"
3896
+ salvaged,
3897
+ failurePredicate: hasParseFailure ? "discovery.row" : "discovery.coverage"
3811
3898
  };
3812
3899
  }
3813
3900
  function validatePrReviewDiscoveryLaneCompletion(input) {
@@ -3845,8 +3932,18 @@ function validatePrReviewDiscoveryLaneCompletion(input) {
3845
3932
  const artifact = input.artifact;
3846
3933
  const analyses = ownedWorkflowLanes.map((workflowLane) => ({
3847
3934
  workflowLane,
3848
- analysis: analyzePrReviewDiscoveryArtifact(artifact.text, workflowLane, ownedWorkflowLanes)
3935
+ analysis: analyzePrReviewDiscoveryArtifact(artifact.text, workflowLane, ownedWorkflowLanes, input.expected.mode)
3849
3936
  }));
3937
+ const salvagedLanes = [];
3938
+ for (const { workflowLane, analysis } of analyses) {
3939
+ if (!analysis.covered)
3940
+ continue;
3941
+ if (!analysis.salvaged && analysis.issues.length === 0)
3942
+ continue;
3943
+ salvagedLanes.push(workflowLane);
3944
+ const reason = analysis.salvaged ? `canonical ${resolvePrReviewRowFamily(workflowLane, input.expected.mode)} header was absent and was synthesized from valid marker rows` : "one or more rows were dropped as malformed or out-of-ownership";
3945
+ warn(`[pr-workflow-gate] discovery artifact salvaged: batch=${input.record.batchId ?? "(missing)"} lane=${input.record.laneId ?? "(missing)"} workflow_lane=${workflowLane} \u2014 ${reason}; retained coverage from the valid rows. Dropped-row diagnostics: ${analysis.issues.join("; ") || "(none)"}`);
3946
+ }
3850
3947
  const failedCoverage = analyses.find(({ analysis }) => !analysis.covered);
3851
3948
  if (failedCoverage) {
3852
3949
  return failedLaneValidation(failedCoverage.analysis.failurePredicate ?? "discovery.coverage", `one valid ${input.expected.mode === "swarm-pr-review:base" ? "base_explorer" : "micro_lane"} [CANDIDATE] row or [CLEAN] attestation for ${failedCoverage.workflowLane}`, failedCoverage.analysis.issues.join("; ") || "no matching lane row");
@@ -3863,13 +3960,13 @@ function validatePrReviewDiscoveryLaneCompletion(input) {
3863
3960
  seenEvidence.set(analysis.evidence, workflowLane);
3864
3961
  }
3865
3962
  }
3866
- return { ok: true };
3963
+ return salvagedLanes.length > 0 ? { ok: true, salvaged: salvagedLanes } : { ok: true };
3867
3964
  }
3868
- function prReviewDiscoveryArtifactCoversLane(text, expectedWorkflowLane, ownedWorkflowLanes = [expectedWorkflowLane]) {
3869
- return analyzePrReviewDiscoveryArtifact(text, expectedWorkflowLane, ownedWorkflowLanes).covered;
3965
+ function prReviewDiscoveryArtifactCoversLane(text, expectedWorkflowLane, ownedWorkflowLanes = [expectedWorkflowLane], mode) {
3966
+ return analyzePrReviewDiscoveryArtifact(text, expectedWorkflowLane, ownedWorkflowLanes, mode).covered;
3870
3967
  }
3871
- function extractLaneCoverageEvidenceText(text, expectedWorkflowLane, ownedWorkflowLanes = [expectedWorkflowLane]) {
3872
- return analyzePrReviewDiscoveryArtifact(text, expectedWorkflowLane, ownedWorkflowLanes).evidence;
3968
+ function extractLaneCoverageEvidenceText(text, expectedWorkflowLane, ownedWorkflowLanes = [expectedWorkflowLane], mode) {
3969
+ return analyzePrReviewDiscoveryArtifact(text, expectedWorkflowLane, ownedWorkflowLanes, mode).evidence;
3873
3970
  }
3874
3971
  var REVIEWER_CLASSIFICATIONS = new Set([
3875
3972
  "CONFIRMED",
@@ -18784,7 +18881,7 @@ function planMerges(active, threshold, maxComparisons, maxMerges) {
18784
18881
  };
18785
18882
  }
18786
18883
  async function sweepActiveNearDuplicates(directory, options = {}) {
18787
- const { loadPluginConfigWithMeta: loadPluginConfigWithMeta2 } = await import("./index-vmff7b40.js");
18884
+ const { loadPluginConfigWithMeta: loadPluginConfigWithMeta2 } = await import("./index-1v89yst3.js");
18788
18885
  const { config } = loadPluginConfigWithMeta2(directory);
18789
18886
  const sweepConfig = config.learning?.dedup_sweep;
18790
18887
  if (sweepConfig?.enabled === false)
@@ -20377,7 +20474,7 @@ async function runCuratorPhase(directory, phase, agentsDispatched, config, knowl
20377
20474
  }
20378
20475
  if (config.skill_generation_enabled === true && skillCandidates.length > 0) {
20379
20476
  try {
20380
- const skillModule = await import("./skill-generator-kns0dae2.js");
20477
+ const skillModule = await import("./skill-generator-arvwfdfh.js");
20381
20478
  for (const cand of skillCandidates) {
20382
20479
  if (cand.confidence < (config.min_skill_confidence ?? DEFAULT_SKILL_MIN_CONFIDENCE)) {
20383
20480
  continue;
@@ -20837,7 +20934,7 @@ async function applyCuratorKnowledgeUpdates(directory, recommendations, knowledg
20837
20934
  } catch {}
20838
20935
  }
20839
20936
  if (contradictedEntries.length > 0 && knowledgeConfig.contradiction_threshold_action === "quarantine") {
20840
- const { maybeQuarantineOnContradiction } = await import("./knowledge-escalator-6y5x8vat.js");
20937
+ const { maybeQuarantineOnContradiction } = await import("./knowledge-escalator-7n384ys1.js");
20841
20938
  for (const { id } of contradictedEntries) {
20842
20939
  try {
20843
20940
  await maybeQuarantineOnContradiction(directory, id, knowledgeConfig.contradiction_quarantine_threshold, knowledgeConfig.contradiction_quarantine_window_days);
@@ -21656,7 +21753,7 @@ async function runCuratorPostMortem(directory, options = {}) {
21656
21753
  warnings.push("Failed to collect knowledge summary.");
21657
21754
  }
21658
21755
  try {
21659
- const { getScanStatus } = await import("./scan-cursor-we0561wc.js");
21756
+ const { getScanStatus } = await import("./scan-cursor-9y9msabt.js");
21660
21757
  const scanStatus = await getScanStatus(directory);
21661
21758
  if (scanStatus.remaining_estimate > 0) {
21662
21759
  warnings.push(`Fair scan: reviewed ${knowledgeSummary.length} entries this sweep (generation ${scanStatus.generation}); ${scanStatus.remaining_estimate} more eligible entries will be visited in future curation sweeps.`);
@@ -21828,9 +21925,9 @@ var _internals24 = {
21828
21925
  verifyPostMortemKnowledgeActions,
21829
21926
  repairPostMortemActions,
21830
21927
  loadDefaultKnowledgeConfig: async (directory) => {
21831
- const { KnowledgeConfigSchema: KnowledgeConfigSchema2 } = await import("./schema-1xtxr4d9.js");
21928
+ const { KnowledgeConfigSchema: KnowledgeConfigSchema2 } = await import("./schema-xg5f11md.js");
21832
21929
  try {
21833
- const { loadPluginConfigWithMeta: loadPluginConfigWithMeta2 } = await import("./index-vmff7b40.js");
21930
+ const { loadPluginConfigWithMeta: loadPluginConfigWithMeta2 } = await import("./index-1v89yst3.js");
21834
21931
  const loaded = loadPluginConfigWithMeta2(directory);
21835
21932
  return KnowledgeConfigSchema2.parse(loaded.config.knowledge ?? {});
21836
21933
  } catch {
@@ -21838,11 +21935,11 @@ var _internals24 = {
21838
21935
  }
21839
21936
  },
21840
21937
  applyCuratorKnowledgeUpdates: async (directory, recommendations, knowledgeConfig, generation) => {
21841
- const { applyCuratorKnowledgeUpdates: applyCuratorKnowledgeUpdates2 } = await import("./curator-jjf5x6bn.js");
21938
+ const { applyCuratorKnowledgeUpdates: applyCuratorKnowledgeUpdates2 } = await import("./curator-jjtp9hn2.js");
21842
21939
  return applyCuratorKnowledgeUpdates2(directory, recommendations, knowledgeConfig, generation);
21843
21940
  },
21844
21941
  checkHivePromotions: async (entries, knowledgeConfig, directory) => {
21845
- const { checkHivePromotions } = await import("./hive-promoter-zkay2ffy.js");
21942
+ const { checkHivePromotions } = await import("./hive-promoter-xvq8jzbs.js");
21846
21943
  return checkHivePromotions(entries, knowledgeConfig, directory);
21847
21944
  },
21848
21945
  applyProposalTriage: async (directory, triage) => {
@@ -21851,7 +21948,7 @@ var _internals24 = {
21851
21948
  activateProposal,
21852
21949
  listSkills: listSkills2,
21853
21950
  sanitizeSlug
21854
- } = await import("./skill-generator-kns0dae2.js");
21951
+ } = await import("./skill-generator-arvwfdfh.js");
21855
21952
  const result = {
21856
21953
  approved: [],
21857
21954
  rejected: [],
@@ -24478,9 +24575,9 @@ function hashContent(content) {
24478
24575
  return createHash9("sha1").update(content).digest("hex");
24479
24576
  }
24480
24577
  async function loadConfigForPolicyCurator(directory) {
24481
- const { KnowledgeConfigSchema: KnowledgeConfigSchema2 } = await import("./schema-1xtxr4d9.js");
24578
+ const { KnowledgeConfigSchema: KnowledgeConfigSchema2 } = await import("./schema-xg5f11md.js");
24482
24579
  try {
24483
- const { loadPluginConfigWithMeta: loadPluginConfigWithMeta2 } = await import("./index-vmff7b40.js");
24580
+ const { loadPluginConfigWithMeta: loadPluginConfigWithMeta2 } = await import("./index-1v89yst3.js");
24484
24581
  const { config: loadedConfig } = loadPluginConfigWithMeta2(directory);
24485
24582
  return KnowledgeConfigSchema2.parse(loadedConfig.knowledge ?? {});
24486
24583
  } catch {
@@ -28440,7 +28537,7 @@ async function runFinalizeStage(ctx) {
28440
28537
  }
28441
28538
  }
28442
28539
  try {
28443
- const { CuratorConfigSchema: CCS } = await import("./schema-1xtxr4d9.js");
28540
+ const { CuratorConfigSchema: CCS } = await import("./schema-xg5f11md.js");
28444
28541
  const { config: pmLoadedConfig } = _internals36.loadPluginConfigWithMeta(ctx.directory);
28445
28542
  const curatorCfg = CCS.parse(pmLoadedConfig.curator ?? {});
28446
28543
  if (curatorCfg.enabled && curatorCfg.postmortem_enabled) {
@@ -30711,9 +30808,9 @@ var _internals41 = {
30711
30808
  loadPluginConfigWithMeta,
30712
30809
  loadCuratorDeps: async () => {
30713
30810
  const [{ CuratorConfigSchema }, curator, { createCuratorLLMDelegate: createCuratorLLMDelegate2 }] = await Promise.all([
30714
- import("./schema-1xtxr4d9.js"),
30715
- import("./curator-jjf5x6bn.js"),
30716
- import("./curator-llm-factory-sprc6pm3.js")
30811
+ import("./schema-xg5f11md.js"),
30812
+ import("./curator-jjtp9hn2.js"),
30813
+ import("./curator-llm-factory-wkjme59b.js")
30717
30814
  ]);
30718
30815
  return { CuratorConfigSchema, curator, createCuratorLLMDelegate: createCuratorLLMDelegate2 };
30719
30816
  }
@@ -31618,7 +31715,7 @@ async function computeCurationDiagnostics(directory, entries) {
31618
31715
  let scanCompleted = false;
31619
31716
  let scanRemaining = 0;
31620
31717
  try {
31621
- const { getScanStatus } = await import("./scan-cursor-we0561wc.js");
31718
+ const { getScanStatus } = await import("./scan-cursor-9y9msabt.js");
31622
31719
  const status = await getScanStatus(directory);
31623
31720
  scanGeneration = status.generation;
31624
31721
  scanCompleted = status.completed;
@@ -31628,17 +31725,17 @@ async function computeCurationDiagnostics(directory, entries) {
31628
31725
  try {
31629
31726
  const { isLinked: isLinked2 } = await import("./knowledge-link-xc6yhxmz.js");
31630
31727
  if (isLinked2(directory)) {
31631
- const { KnowledgeConfigSchema: KnowledgeConfigSchema2 } = await import("./schema-1xtxr4d9.js");
31728
+ const { KnowledgeConfigSchema: KnowledgeConfigSchema2 } = await import("./schema-xg5f11md.js");
31632
31729
  let config;
31633
31730
  try {
31634
- const { loadPluginConfigWithMeta: loadPluginConfigWithMeta2 } = await import("./index-vmff7b40.js");
31731
+ const { loadPluginConfigWithMeta: loadPluginConfigWithMeta2 } = await import("./index-1v89yst3.js");
31635
31732
  const loaded = loadPluginConfigWithMeta2(directory);
31636
31733
  config = KnowledgeConfigSchema2.parse(loaded.config.knowledge ?? {});
31637
31734
  } catch {
31638
31735
  config = KnowledgeConfigSchema2.parse({});
31639
31736
  }
31640
31737
  const { cohortConfigFingerprint: cohortConfigFingerprint2 } = await import("./config-fingerprint-v22xh5a2.js");
31641
- const { buildConfigFingerprintInput: buildConfigFingerprintInput2, readCohortConfigFingerprint } = await import("./curation-policy-dkx4s5va.js");
31738
+ const { buildConfigFingerprintInput: buildConfigFingerprintInput2, readCohortConfigFingerprint } = await import("./curation-policy-5dqexw5j.js");
31642
31739
  const currentFp = cohortConfigFingerprint2(buildConfigFingerprintInput2(config));
31643
31740
  const cohortFp = await readCohortConfigFingerprint(directory);
31644
31741
  configMatch = cohortFp === null ? null : currentFp === cohortFp;
@@ -32849,7 +32946,7 @@ async function handleDoctorCommand(directory, args) {
32849
32946
  const result = runConfigDoctor(config, directory);
32850
32947
  let output;
32851
32948
  if (enableAutoFix && result.hasAutoFixableIssues) {
32852
- const { runConfigDoctorWithFixes } = await import("./config-doctor-m79sx8b2.js");
32949
+ const { runConfigDoctorWithFixes } = await import("./config-doctor-2mwgdbsn.js");
32853
32950
  const fixResult = await runConfigDoctorWithFixes(directory, config, true, {
32854
32951
  applyLossy: true
32855
32952
  });
@@ -55992,7 +56089,7 @@ function buildDetailedHelp(commandName, entry) {
55992
56089
  async function handleHelpCommand(ctx) {
55993
56090
  const targetCommand = ctx.args.join(" ");
55994
56091
  if (!targetCommand) {
55995
- const { buildHelpText } = await import("./index-6f6nt0c9.js");
56092
+ const { buildHelpText } = await import("./index-xgmx9had.js");
55996
56093
  return buildHelpText();
55997
56094
  }
55998
56095
  const tokens = targetCommand.split(/\s+/);
@@ -56001,7 +56098,7 @@ async function handleHelpCommand(ctx) {
56001
56098
  return _internals14.buildDetailedHelp(resolved.key, resolved.entry);
56002
56099
  }
56003
56100
  const similar = _internals14.findSimilarCommands(targetCommand);
56004
- const { buildHelpText: fullHelp } = await import("./index-6f6nt0c9.js");
56101
+ const { buildHelpText: fullHelp } = await import("./index-xgmx9had.js");
56005
56102
  if (similar.length > 0) {
56006
56103
  return `Command '/swarm ${targetCommand}' not found.
56007
56104
 
@@ -56178,7 +56275,7 @@ var COMMAND_REGISTRY = {
56178
56275
  },
56179
56276
  "guardrail explain": {
56180
56277
  handler: async (ctx) => {
56181
- const { handleGuardrailExplain } = await import("./guardrail-explain-zs3hq02c.js");
56278
+ const { handleGuardrailExplain } = await import("./guardrail-explain-xppwfnxr.js");
56182
56279
  return handleGuardrailExplain(ctx.directory, ctx.args);
56183
56280
  },
56184
56281
  description: "Dry-run: show what the guardrails would do to a command or write target (executes nothing)",
@@ -56188,7 +56285,7 @@ var COMMAND_REGISTRY = {
56188
56285
  },
56189
56286
  "guardrail-explain": {
56190
56287
  handler: async (ctx) => {
56191
- const { handleGuardrailExplain } = await import("./guardrail-explain-zs3hq02c.js");
56288
+ const { handleGuardrailExplain } = await import("./guardrail-explain-xppwfnxr.js");
56192
56289
  return handleGuardrailExplain(ctx.directory, ctx.args);
56193
56290
  },
56194
56291
  description: "Dry-run: show what the guardrails would do to a command or write target (executes nothing)",
@@ -56198,7 +56295,7 @@ var COMMAND_REGISTRY = {
56198
56295
  },
56199
56296
  "guardrail-log": {
56200
56297
  handler: async (ctx) => {
56201
- const { handleGuardrailLog } = await import("./guardrail-log-90dnv508.js");
56298
+ const { handleGuardrailLog } = await import("./guardrail-log-swet7rch.js");
56202
56299
  return handleGuardrailLog(ctx.directory, ctx.args);
56203
56300
  },
56204
56301
  description: "Read the guardrail decision log (use --blocks-only for blocks)",
@@ -21,7 +21,7 @@ var package_default;
21
21
  var init_package = __esm(() => {
22
22
  package_default = {
23
23
  name: "opencode-swarm",
24
- version: "7.138.1",
24
+ version: "7.138.3",
25
25
  description: "Architect-centric agentic swarm plugin for OpenCode - hub-and-spoke orchestration with SME consultation, code generation, and QA review",
26
26
  main: "dist/index.js",
27
27
  types: "dist/index.d.ts",
@@ -6,13 +6,13 @@ import {
6
6
  resolveSwarmKnowledgePath,
7
7
  transactKnowledge,
8
8
  wordBigrams
9
- } from "./index-8xqnp3gw.js";
9
+ } from "./index-1djv5684.js";
10
10
  import {
11
11
  countEntryContradictionsInWindow,
12
12
  countEntryViolationsInWindow,
13
13
  readKnowledgeEvents,
14
14
  recordKnowledgeEvent
15
- } from "./index-kqzzdxc1.js";
15
+ } from "./index-93ky909v.js";
16
16
  import {
17
17
  init_knowledge_types,
18
18
  isActiveStatus
@@ -190,11 +190,11 @@ async function maybeQuarantineOnContradiction(directory, entryId, threshold, win
190
190
  alreadyInactive: true
191
191
  };
192
192
  }
193
- const { quarantineEntry } = await import("./knowledge-validator-pf377mtx.js");
193
+ const { quarantineEntry } = await import("./knowledge-validator-e5fqy9h4.js");
194
194
  let policyConfig;
195
195
  try {
196
- const { KnowledgeConfigSchema } = await import("./schema-1xtxr4d9.js");
197
- const { loadPluginConfigWithMeta } = await import("./index-vmff7b40.js");
196
+ const { KnowledgeConfigSchema } = await import("./schema-xg5f11md.js");
197
+ const { loadPluginConfigWithMeta } = await import("./index-1v89yst3.js");
198
198
  const { config: loadedConfig } = loadPluginConfigWithMeta(directory);
199
199
  policyConfig = KnowledgeConfigSchema.parse(loadedConfig.knowledge ?? {});
200
200
  } catch {
@@ -6,7 +6,7 @@ import {
6
6
  PluginConfigSchema,
7
7
  init_schema,
8
8
  stripKnownSwarmPrefix
9
- } from "./index-e78pqbkj.js";
9
+ } from "./index-ab57h0yq.js";
10
10
  import {
11
11
  ALL_AGENT_NAMES,
12
12
  init_constants
@@ -12,14 +12,14 @@ import {
12
12
  detectPosixWrites,
13
13
  detectWindowsWrites,
14
14
  resolveWriteTargets
15
- } from "./index-mnw8g9bs.js";
15
+ } from "./index-99af5gvd.js";
16
16
  import {
17
17
  checkFileAuthority,
18
18
  classifyFile,
19
19
  isInDeclaredScope,
20
20
  redactPath,
21
21
  redactShellCommand
22
- } from "./index-e2eedz1b.js";
22
+ } from "./index-31vfewmn.js";
23
23
 
24
24
  // src/services/guardrail-explain-service.ts
25
25
  import path from "path";
@@ -2,18 +2,18 @@
2
2
  import {
3
3
  ALLOWED_SKILL_PATH_PREFIXES,
4
4
  validateSkillPath
5
- } from "./index-d4t92fa3.js";
5
+ } from "./index-tc61fybd.js";
6
6
  import {
7
7
  computeOutcomeSignal,
8
8
  readKnowledge,
9
9
  resolveHiveKnowledgePath,
10
10
  resolveSwarmKnowledgePath,
11
11
  transactKnowledge
12
- } from "./index-8xqnp3gw.js";
12
+ } from "./index-1djv5684.js";
13
13
  import {
14
14
  effectiveRetrievalOutcomes,
15
15
  readKnowledgeCounterRollups
16
- } from "./index-kqzzdxc1.js";
16
+ } from "./index-93ky909v.js";
17
17
  import {
18
18
  init_knowledge_types,
19
19
  isActiveStatus
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  redactPath,
4
4
  redactShellCommand
5
- } from "./index-e2eedz1b.js";
5
+ } from "./index-31vfewmn.js";
6
6
 
7
7
  // src/services/guardrail-log-service.ts
8
8
  import * as fs from "fs/promises";
@@ -52,7 +52,8 @@ var ResultSchema = exports_external.object({
52
52
  outputDegraded: exports_external.boolean().optional(),
53
53
  outputArtifactError: exports_external.string().optional(),
54
54
  transcriptIncomplete: exports_external.boolean().optional(),
55
- messageCount: exports_external.number().optional()
55
+ messageCount: exports_external.number().optional(),
56
+ salvagedWorkflowLanes: exports_external.array(exports_external.string()).optional()
56
57
  }).strict();
57
58
  var WorkspaceSchema = exports_external.object({
58
59
  directory: exports_external.string(),
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  readKnowledge,
4
4
  transactKnowledge
5
- } from "./index-8xqnp3gw.js";
5
+ } from "./index-1djv5684.js";
6
6
  import {
7
7
  resolveKnowledgeStoreDir
8
8
  } from "./index-en4fb04r.js";