opencode-swarm 7.152.1 → 7.153.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.
Files changed (121) hide show
  1. package/.opencode/skills/swarm-pr-review/SKILL.md +10 -10
  2. package/dist/background/pending-delegations.d.ts +7 -0
  3. package/dist/cli/{capability-probe-va4kk8vg.js → capability-probe-5wa7mcp6.js} +3 -2
  4. package/dist/cli/{config-doctor-bbqmye7a.js → config-doctor-ze21qs6b.js} +3 -3
  5. package/dist/cli/{core-fh4e6ex0.js → core-qdmhh1kx.js} +2 -2
  6. package/dist/cli/{curation-policy-nem98yc9.js → curation-policy-twa6agf8.js} +7 -7
  7. package/dist/cli/{curator-909s9dvs.js → curator-hxb3wsxr.js} +32 -33
  8. package/dist/cli/curator-llm-factory-s8atmc2n.js +64 -0
  9. package/dist/cli/{evidence-summary-service-kqw4y0yr.js → evidence-summary-service-wzzym9r7.js} +15 -15
  10. package/dist/cli/{gate-evidence-ycts62pj.js → gate-evidence-f71dn9vv.js} +8 -8
  11. package/dist/cli/guardrail-explain-5kzeem4m.js +65 -0
  12. package/dist/cli/{guardrail-log-e1tmdxxa.js → guardrail-log-38jnajpa.js} +6 -6
  13. package/dist/cli/{guardrail-reset-gdnaxxvb.js → guardrail-reset-wzvtmpn2.js} +32 -33
  14. package/dist/cli/{hive-promoter-d0xydg6r.js → hive-promoter-55qcqgfx.js} +32 -33
  15. package/dist/cli/{index-x6803sxh.js → index-0tyc8kdg.js} +2 -2
  16. package/dist/cli/{index-z8s2asdk.js → index-0tzv5zg2.js} +22 -150
  17. package/dist/cli/{index-3djxegsc.js → index-1akn19mp.js} +1 -1
  18. package/dist/cli/{index-q77e475x.js → index-1dtshrzg.js} +5 -5
  19. package/dist/cli/{index-73pmnsjg.js → index-1gzdnjg9.js} +2 -2
  20. package/dist/cli/{index-4tvvh7pn.js → index-23rneydq.js} +36 -35
  21. package/dist/cli/{index-z4bg1hv8.js → index-2mqmvxac.js} +9 -2
  22. package/dist/cli/index-3cegckkq.js +239 -0
  23. package/dist/cli/{index-pvrap7xg.js → index-3ttktt56.js} +1 -1
  24. package/dist/cli/{index-85gkedsf.js → index-4fwbbad3.js} +521 -15
  25. package/dist/cli/{index-qqrdmaxq.js → index-4g0g3dqz.js} +2 -2
  26. package/dist/cli/{index-44xdtqz8.js → index-4pjkdcgc.js} +1 -1
  27. package/dist/cli/{index-29vd7v3e.js → index-6vgb5fyb.js} +1 -1
  28. package/dist/cli/{index-sg2sx2q7.js → index-6ybjrqf7.js} +13095 -9360
  29. package/dist/cli/{index-txbd25bc.js → index-891g7hbf.js} +1 -1
  30. package/dist/cli/{index-02ajc6d1.js → index-8v9sj4aq.js} +2 -2
  31. package/dist/cli/{index-z9fyd0d6.js → index-9v8d3c0k.js} +450 -48
  32. package/dist/cli/{index-26vyr198.js → index-af0cqe6n.js} +16 -16
  33. package/dist/cli/{index-ryecg2st.js → index-ajkxx2k6.js} +3 -3
  34. package/dist/cli/{index-k3d919yf.js → index-gn26q90p.js} +85 -24
  35. package/dist/cli/{index-0tfgn5x0.js → index-k10qtq71.js} +9 -9
  36. package/dist/cli/{index-xyfdmrv7.js → index-mb7b1gye.js} +3 -3
  37. package/dist/cli/{index-0q2mjxp2.js → index-meg33yyv.js} +1 -1
  38. package/dist/cli/{index-cpg98bh1.js → index-myt57pht.js} +1 -1
  39. package/dist/cli/{index-2e1294d1.js → index-n5pxkera.js} +16 -10
  40. package/dist/cli/{index-n0vc5b5t.js → index-n823qsae.js} +16 -7
  41. package/dist/cli/{index-6zkm4p7p.js → index-pk1gbqmq.js} +1 -1
  42. package/dist/cli/{index-nd8tkb3g.js → index-smqsp8hs.js} +5 -5
  43. package/dist/cli/{index-7fh82sm1.js → index-td0jz8xe.js} +6 -6
  44. package/dist/cli/{index-dn6yt0xg.js → index-tdzbm974.js} +7 -7
  45. package/dist/cli/{index-rq6aetkv.js → index-v689bmr2.js} +4 -4
  46. package/dist/cli/{index-79g6edht.js → index-x3y6zhgj.js} +1 -1
  47. package/dist/cli/{index-aw492hpn.js → index-x8vw6ap1.js} +58 -41
  48. package/dist/cli/{index-96m8ckpq.js → index-xkjrg9k4.js} +4 -4
  49. package/dist/cli/{index-mken64yj.js → index-zppxpc3y.js} +2 -2
  50. package/dist/cli/index.js +32 -33
  51. package/dist/cli/{knowledge-escalator-4egcr928.js → knowledge-escalator-w05ztgvk.js} +13 -13
  52. package/dist/cli/{knowledge-events-kdyv4jzn.js → knowledge-events-pwm9jc0m.js} +11 -11
  53. package/dist/cli/{knowledge-link-h8cwj7af.js → knowledge-link-ge0rddxw.js} +6 -6
  54. package/dist/cli/{knowledge-store-dq3cvg53.js → knowledge-store-4xv65tj2.js} +7 -7
  55. package/dist/cli/{knowledge-validator-4bhtden9.js → knowledge-validator-0ttfsca7.js} +9 -9
  56. package/dist/cli/{model-preflight-7ea00h34.js → model-preflight-b95w8wxy.js} +1 -1
  57. package/dist/cli/{pending-delegations-a2nmssr1.js → pending-delegations-nk78wx7h.js} +4 -4
  58. package/dist/cli/{pr-subscriptions-7879nq5k.js → pr-subscriptions-dq1f61ye.js} +4 -4
  59. package/dist/cli/{runner-w81n9js3.js → runner-n50w1y4w.js} +7 -7
  60. package/dist/cli/{scan-cursor-2eezv81a.js → scan-cursor-b6n15w8d.js} +8 -8
  61. package/dist/cli/{schema-v4qcqhek.js → schema-jkbfwqr2.js} +2 -2
  62. package/dist/cli/{scope-persistence-y2r227r0.js → scope-persistence-5xt2m5ep.js} +10 -10
  63. package/dist/cli/{skill-generator-hhzxvb3h.js → skill-generator-3keadpf7.js} +15 -15
  64. package/dist/cli/{telemetry-52pw5xac.js → telemetry-hh1j99za.js} +1 -1
  65. package/dist/cli/{worktree-collision-ownership-p31zm5k0.js → worktree-collision-ownership-4drcjymy.js} +15 -10
  66. package/dist/cli/{worktree-isolation-ve338ez6.js → worktree-isolation-1ymaxn4h.js} +32 -33
  67. package/dist/commands/approve-write.d.ts +1 -0
  68. package/dist/commands/index.d.ts +1 -0
  69. package/dist/commands/lanes.d.ts +25 -0
  70. package/dist/commands/registry.d.ts +7 -0
  71. package/dist/config/schema.d.ts +39 -4
  72. package/dist/consensus/contracts.d.ts +14 -0
  73. package/dist/consensus/corpus.d.ts +16 -0
  74. package/dist/hooks/delegation-gate/worktree-isolation.d.ts +50 -3
  75. package/dist/hooks/delegation-gate/worktree-provisioning-owner.d.ts +40 -2
  76. package/dist/hooks/delegation-gate/worktree-recovery-authority.d.ts +201 -0
  77. package/dist/hooks/full-auto-permission.d.ts +7 -0
  78. package/dist/hooks/guardrails/index.d.ts +2 -1
  79. package/dist/hooks/guardrails/tool-before.d.ts +4 -0
  80. package/dist/hooks/init-orphan-recovery.d.ts +5 -1
  81. package/dist/hooks/pr-workflow-gate.d.ts +12 -0
  82. package/dist/hooks/scope-guard.d.ts +1 -3
  83. package/dist/hooks/trajectory-logger.d.ts +22 -6
  84. package/dist/hooks/trajectory-step-state.d.ts +43 -2
  85. package/dist/index.js +645 -622
  86. package/dist/learning/provenance.d.ts +9 -0
  87. package/dist/observability/catalog.d.ts +6 -4
  88. package/dist/prm/index.d.ts +3 -3
  89. package/dist/prm/replay.d.ts +29 -2
  90. package/dist/prm/trajectory-store.d.ts +210 -20
  91. package/dist/sandbox/capability-probe.d.ts +40 -1
  92. package/dist/sandbox/executor.d.ts +26 -1
  93. package/dist/sandbox/linux/bubblewrap-executor.d.ts +3 -1
  94. package/dist/sandbox/macos/sandbox-exec-executor.d.ts +3 -1
  95. package/dist/sandbox/skip-state.d.ts +24 -0
  96. package/dist/sandbox/win32/native-sandbox-executor.d.ts +5 -1
  97. package/dist/security/command-classifier.d.ts +22 -0
  98. package/dist/security/protected-input-integrity.d.ts +19 -0
  99. package/dist/security/protected-path-policy.d.ts +9 -0
  100. package/dist/security/write-authority.d.ts +46 -0
  101. package/dist/services/diagnose-service.d.ts +1 -1
  102. package/dist/services/skill-generator.d.ts +2 -0
  103. package/dist/services/skill-improver.d.ts +69 -0
  104. package/dist/telemetry.d.ts +21 -1
  105. package/dist/tools/dispatch-lanes.d.ts +47 -0
  106. package/dist/tools/repo-graph/query.d.ts +2 -1
  107. package/dist/tools/repo-graph/types.d.ts +64 -0
  108. package/dist/tools/repo-graph.d.ts +1 -1
  109. package/dist/tools/skill-improve.d.ts +7 -0
  110. package/dist/utils/atomic-write.d.ts +2 -0
  111. package/dist/utils/canonical-root.d.ts +31 -0
  112. package/dist/workflow/coder-settlement.d.ts +2 -0
  113. package/dist/worktree/index.d.ts +2 -2
  114. package/dist/worktree/merge.d.ts +47 -0
  115. package/package.json +2 -1
  116. package/dist/cli/curator-llm-factory-462rysph.js +0 -65
  117. package/dist/cli/guardrail-explain-7620hasq.js +0 -66
  118. package/dist/cli/index-3g0xk6tk.js +0 -219
  119. package/dist/cli/index-fxvgaeq4.js +0 -125
  120. package/dist/cli/worktree-provisioning-owner-cve95q4f.js +0 -22
  121. package/dist/cli/{curator-drift-2h1d2fnq.js → curator-drift-h57z6tm3.js} +1 -1
@@ -1,12 +1,12 @@
1
1
  // @bun
2
+ import {
3
+ loadDatabaseCtor
4
+ } from "./index-134d35c1.js";
2
5
  import {
3
6
  EvaluationRunV1Schema,
4
7
  GateAuditResultV1Schema,
5
8
  getProtectedEvaluationRunIds
6
- } from "./index-73pmnsjg.js";
7
- import {
8
- loadDatabaseCtor
9
- } from "./index-134d35c1.js";
9
+ } from "./index-1gzdnjg9.js";
10
10
  import {
11
11
  readEffectiveSpecSync
12
12
  } from "./index-9ss2m4rs.js";
@@ -23,7 +23,7 @@ import {
23
23
  readTaskEvidence,
24
24
  readTaskEvidenceRaw,
25
25
  sanitizeTaskId
26
- } from "./index-z9fyd0d6.js";
26
+ } from "./index-9v8d3c0k.js";
27
27
  import {
28
28
  LedgerStaleWriterError,
29
29
  appendLedgerEvent,
@@ -43,15 +43,15 @@ import {
43
43
  replayFromLedgerWithStatus,
44
44
  takeSnapshotEvent,
45
45
  takeSnapshotWithRetry
46
- } from "./index-xyfdmrv7.js";
46
+ } from "./index-mb7b1gye.js";
47
47
  import {
48
48
  appendCoreEventSync
49
- } from "./index-6zkm4p7p.js";
49
+ } from "./index-pk1gbqmq.js";
50
50
  import {
51
51
  init_executor,
52
52
  isUntrustedEnvKey,
53
53
  isValidEnvKey
54
- } from "./index-85gkedsf.js";
54
+ } from "./index-4fwbbad3.js";
55
55
  import {
56
56
  EVIDENCE_MAX_JSON_BYTES,
57
57
  EvidenceBundleSchema,
@@ -68,7 +68,7 @@ import {
68
68
  } from "./index-r3mvsbtq.js";
69
69
  import {
70
70
  PlanSchema
71
- } from "./index-3djxegsc.js";
71
+ } from "./index-1akn19mp.js";
72
72
  import {
73
73
  GIT_BINARY_ENV_VAR,
74
74
  describeGitResolution,
@@ -79,18 +79,18 @@ import {
79
79
  assertProjectRoot,
80
80
  tryAcquireLock,
81
81
  withEvidenceLock
82
- } from "./index-txbd25bc.js";
82
+ } from "./index-891g7hbf.js";
83
+ import {
84
+ invalidateCachedArtifact,
85
+ readCachedParsedFile
86
+ } from "./index-ed5ykebp.js";
83
87
  import {
84
88
  emit
85
- } from "./index-aw492hpn.js";
89
+ } from "./index-x8vw6ap1.js";
86
90
  import {
87
91
  ZodError,
88
92
  init_zod
89
93
  } from "./index-bpmtbmy9.js";
90
- import {
91
- invalidateCachedArtifact,
92
- readCachedParsedFile
93
- } from "./index-ed5ykebp.js";
94
94
  import {
95
95
  criticalWarn,
96
96
  error,
@@ -4345,4 +4345,4 @@ function mergeDurableGateEntriesFromEvidence(taskId, entries, evidence) {
4345
4345
  return merged;
4346
4346
  }
4347
4347
 
4348
- export { projectDbExists, getProjectDb, closeProjectDb, normalizePath, buildTaskCompletionDescriptor, ensureTaskCheckpointReceipt, updateTaskCheckpointReceipt, MAX_TRANSIENT_RETRIES, isTransientSpawnError, transientBackoff, getGitRepositoryStatus, isGitRepo, getDefaultBaseBranch, detectDefaultRemoteBranch, resetToRemoteBranch, resetToMainAfterMerge, containsPathTraversal, containsControlChars, validateSymlinkBoundary, isStateUnreadable, loadEpicSessionState, isEpicModeActive, enableEpicMode, disableEpicMode, pathsConflict, isGlobalFile, isProtectedPath, readTaskScopes, loadPlanJsonOnly, loadPlan, savePlan, closePlanTerminalState, updateTaskStatus, derivePlanMarkdown, isValidEvidenceType, isSecretscanEvidence, sanitizeTaskId2 as sanitizeTaskId, validateProjectRoot, saveEvidence, loadEvidence, listEvidenceTaskIds, checkRequirementCoverage, archiveEvidence, readDurableGateEvidence, getDurableGateEvidenceStatus, getDurableGateEvidenceStatusForTask, mergeDurableGateEntriesFromEvidence };
4348
+ export { projectDbExists, getProjectDb, closeProjectDb, normalizePath, buildTaskCompletionDescriptor, ensureTaskCheckpointReceipt, updateTaskCheckpointReceipt, MAX_TRANSIENT_RETRIES, isTransientSpawnError, transientBackoff, getGitRepositoryStatus, isGitRepo, getDefaultBaseBranch, detectDefaultRemoteBranch, resetToRemoteBranch, resetToMainAfterMerge, containsPathTraversal, containsControlChars, validateSymlinkBoundary, validateTargetWithinRoot, isStateUnreadable, loadEpicSessionState, isEpicModeActive, enableEpicMode, disableEpicMode, pathsConflict, isGlobalFile, isProtectedPath, readTaskScopes, loadPlanJsonOnly, loadPlan, savePlan, closePlanTerminalState, updateTaskStatus, derivePlanMarkdown, isValidEvidenceType, isSecretscanEvidence, sanitizeTaskId2 as sanitizeTaskId, validateProjectRoot, saveEvidence, loadEvidence, listEvidenceTaskIds, checkRequirementCoverage, archiveEvidence, readDurableGateEvidence, getDurableGateEvidenceStatus, getDurableGateEvidenceStatusForTask, mergeDurableGateEntriesFromEvidence };
@@ -2,14 +2,14 @@
2
2
  import {
3
3
  init_loader,
4
4
  loadPluginConfigWithMeta
5
- } from "./index-3djxegsc.js";
5
+ } from "./index-1akn19mp.js";
6
6
  import {
7
7
  init_schema
8
- } from "./index-n0vc5b5t.js";
8
+ } from "./index-n823qsae.js";
9
9
  import {
10
10
  DEFAULT_WORKTREE_ISOLATION_CONFIG,
11
11
  init_constants
12
- } from "./index-cpg98bh1.js";
12
+ } from "./index-myt57pht.js";
13
13
 
14
14
  // src/config/index.ts
15
15
  init_constants();
@@ -11,13 +11,13 @@ import {
11
11
  import {
12
12
  init_schema,
13
13
  stripKnownSwarmPrefix
14
- } from "./index-n0vc5b5t.js";
14
+ } from "./index-n823qsae.js";
15
15
  import {
16
16
  init_constants
17
- } from "./index-cpg98bh1.js";
17
+ } from "./index-myt57pht.js";
18
18
  import {
19
19
  telemetry
20
- } from "./index-aw492hpn.js";
20
+ } from "./index-x8vw6ap1.js";
21
21
  import {
22
22
  init_logger,
23
23
  warn
@@ -1768,7 +1768,7 @@ function classifyFile(filePath) {
1768
1768
  // src/hooks/guardrails/file-authority.ts
1769
1769
  import * as fsSync from "fs";
1770
1770
  var import_picomatch = __toESM(require_picomatch2(), 1);
1771
- import * as path from "path";
1771
+ import * as path2 from "path";
1772
1772
 
1773
1773
  // node_modules/quick-lru/index.js
1774
1774
  class QuickLRU extends Map {
@@ -2045,6 +2045,64 @@ class QuickLRU extends Map {
2045
2045
  // src/hooks/guardrails/file-authority.ts
2046
2046
  init_schema();
2047
2047
 
2048
+ // src/security/protected-path-policy.ts
2049
+ import * as path from "path";
2050
+ var DEFAULT_SEGMENTS = new Set([
2051
+ ".git",
2052
+ ".swarm",
2053
+ ".env",
2054
+ "package.json",
2055
+ "package-lock.json",
2056
+ "bun.lock",
2057
+ "CHANGELOG.md",
2058
+ ".release-please-manifest.json",
2059
+ "release-please-config.json",
2060
+ "CODEOWNERS"
2061
+ ]);
2062
+ var DEFAULT_PREFIXES = [
2063
+ ".github/workflows",
2064
+ ".github/CODEOWNERS",
2065
+ "src/sandbox",
2066
+ "src/hooks/guardrails",
2067
+ "src/security",
2068
+ "src/evaluation",
2069
+ "docs/releases",
2070
+ "tests/fixtures/evaluation"
2071
+ ];
2072
+ function normalizeProtectedPath(value) {
2073
+ return value.replace(/\\/g, "/").replace(/^\.\//, "").replace(/\/+$/, "");
2074
+ }
2075
+ function equalsOrDescendant(candidate, protectedPath) {
2076
+ const left = process.platform === "win32" ? candidate.toLowerCase() : candidate;
2077
+ const right = process.platform === "win32" ? protectedPath.toLowerCase() : protectedPath;
2078
+ return left === right || left.startsWith(`${right}/`);
2079
+ }
2080
+ function isPolicyProtectedPath(filePath, options = {}) {
2081
+ if (!filePath)
2082
+ return false;
2083
+ const normalized = normalizeProtectedPath(filePath);
2084
+ const segments = normalized.split("/").filter(Boolean);
2085
+ if (options.includeDefaults !== false) {
2086
+ if (segments.some((segment) => DEFAULT_SEGMENTS.has(process.platform === "win32" ? segment.toLowerCase() : segment)))
2087
+ return true;
2088
+ if (DEFAULT_PREFIXES.some((prefix) => equalsOrDescendant(normalized, prefix)))
2089
+ return true;
2090
+ }
2091
+ return (options.additional ?? []).some((entry) => {
2092
+ const protectedPath = normalizeProtectedPath(entry);
2093
+ if (!protectedPath)
2094
+ return false;
2095
+ if (equalsOrDescendant(normalized, protectedPath))
2096
+ return true;
2097
+ if (protectedPath.includes("/"))
2098
+ return false;
2099
+ return segments.some((segment) => (process.platform === "win32" ? segment.toLowerCase() : segment) === (process.platform === "win32" ? protectedPath.toLowerCase() : protectedPath));
2100
+ });
2101
+ }
2102
+ function protectedRoots(projectRoot, additional = []) {
2103
+ return [...DEFAULT_PREFIXES, ...DEFAULT_SEGMENTS, ...additional].map((entry) => path.resolve(projectRoot, entry));
2104
+ }
2105
+
2048
2106
  // src/utils/arg-hash.ts
2049
2107
  var HASH_INPUT_CAP_BYTES = 64 * 1024;
2050
2108
 
@@ -2079,12 +2137,12 @@ function normalizePathWithCache(filePath, cwd) {
2079
2137
  return cached;
2080
2138
  }
2081
2139
  try {
2082
- const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(cwd, filePath);
2140
+ const absolutePath = path2.isAbsolute(filePath) ? filePath : path2.resolve(cwd, filePath);
2083
2141
  const normalized = fsSync.realpathSync(absolutePath);
2084
2142
  pathNormalizationCache.set(cacheKey, normalized);
2085
2143
  return normalized;
2086
2144
  } catch {
2087
- const fallback = path.isAbsolute(filePath) ? filePath : path.resolve(cwd, filePath);
2145
+ const fallback = path2.isAbsolute(filePath) ? filePath : path2.resolve(cwd, filePath);
2088
2146
  pathNormalizationCache.set(cacheKey, fallback);
2089
2147
  return fallback;
2090
2148
  }
@@ -2232,7 +2290,7 @@ var DEFAULT_AGENT_AUTHORITY_RULES = {
2232
2290
  }
2233
2291
  };
2234
2292
  function matchesAuthorityDenyPrefix(candidate, prefix, cwd, flavor = getPathFlavor()) {
2235
- const pathImpl = flavor === "win32" ? path.win32 : path.posix;
2293
+ const pathImpl = flavor === "win32" ? path2.win32 : path2.posix;
2236
2294
  const normalizeInput = (value) => flavor === "win32" ? value.replace(/\//g, "\\") : value;
2237
2295
  const normalizedPrefixInput = normalizeInput(prefix);
2238
2296
  const requiresComponentBoundary = normalizedPrefixInput.endsWith(pathImpl.sep);
@@ -2277,8 +2335,8 @@ function buildEffectiveRules(authorityConfig) {
2277
2335
  }
2278
2336
  return merged;
2279
2337
  }
2280
- function isOnDifferentFilesystemRoot(targetAbsolute, cwdAbsolute, pathLib = path) {
2281
- const flavor = pathLib === path.win32 || pathLib.parse("C:\\probe").root !== "" ? "win32" : "posix";
2338
+ function isOnDifferentFilesystemRoot(targetAbsolute, cwdAbsolute, pathLib = path2) {
2339
+ const flavor = pathLib === path2.win32 || pathLib.parse("C:\\probe").root !== "" ? "win32" : "posix";
2282
2340
  return isOnDifferentPathRoot(targetAbsolute, cwdAbsolute, flavor);
2283
2341
  }
2284
2342
  var BUILT_IN_VERIFIER_CONFIG_GLOBS = [
@@ -2349,11 +2407,11 @@ function checkFileAuthorityWithRules(agentName, filePath, cwd, effectiveRules, o
2349
2407
  let resolvedTarget;
2350
2408
  try {
2351
2409
  const normalizedWithSymlinks = normalizePathWithCache(filePath, dir);
2352
- resolvedTarget = path.resolve(dir, normalizedWithSymlinks);
2353
- normalizedPath = path.relative(dir, resolvedTarget).replace(/\\/g, "/");
2410
+ resolvedTarget = path2.resolve(dir, normalizedWithSymlinks);
2411
+ normalizedPath = path2.relative(dir, resolvedTarget).replace(/\\/g, "/");
2354
2412
  } catch {
2355
- resolvedTarget = path.resolve(dir, filePath);
2356
- normalizedPath = path.relative(dir, resolvedTarget).replace(/\\/g, "/");
2413
+ resolvedTarget = path2.resolve(dir, filePath);
2414
+ normalizedPath = path2.relative(dir, resolvedTarget).replace(/\\/g, "/");
2357
2415
  }
2358
2416
  if (isOnDifferentFilesystemRoot(resolvedTarget, dir)) {
2359
2417
  return denyAuthority(agentName, normalizedPath, {
@@ -2381,7 +2439,7 @@ function checkFileAuthorityWithRules(agentName, filePath, cwd, effectiveRules, o
2381
2439
  });
2382
2440
  }
2383
2441
  const flavor = getPathFlavor();
2384
- const matchesPathPrefix = (candidate, prefix) => isPathIdentityWithin(path.resolve(dir, candidate), path.resolve(dir, prefix), flavor);
2442
+ const matchesPathPrefix = (candidate, prefix) => isPathIdentityWithin(path2.resolve(dir, candidate), path2.resolve(dir, prefix), flavor);
2385
2443
  const matchesGlob = (glob) => getGlobMatcher(glob)(normalizedPath);
2386
2444
  for (const prefix of options.universalDenyPrefixes ?? []) {
2387
2445
  if (matchesAuthorityDenyPrefix(normalizedPath, prefix, dir, flavor)) {
@@ -2394,12 +2452,15 @@ function checkFileAuthorityWithRules(agentName, filePath, cwd, effectiveRules, o
2394
2452
  }
2395
2453
  }
2396
2454
  const isCoderAgent = normalizedAgent === "coder" || strippedAgent === "coder";
2397
- if (isCoderAgent && matchesPathPrefix(normalizedPath, ".swarm")) {
2455
+ if (isCoderAgent && isPolicyProtectedPath(normalizedPath, {
2456
+ includeDefaults: false,
2457
+ additional: [".git", ".swarm"]
2458
+ })) {
2398
2459
  return denyAuthority(agentName, normalizedPath, {
2399
2460
  code: "AUTHORITY_PROTECTED_PATH",
2400
2461
  layer: "protected-path",
2401
- rule: "coder-swarm-state-protection",
2402
- detail: "coder writes to .swarm are always protected"
2462
+ rule: "coder-control-state-protection",
2463
+ detail: "coder writes to repository control state (.git/.swarm) are always protected"
2403
2464
  });
2404
2465
  }
2405
2466
  const isSwarmRole = Object.hasOwn(AUTHORITY_ROLE_CAPABILITIES, strippedAgent);
@@ -2608,7 +2669,7 @@ function redactShellCommand(cmd) {
2608
2669
 
2609
2670
  // src/hooks/guardrails/shell-audit-store.ts
2610
2671
  import * as fs from "fs";
2611
- import * as path2 from "path";
2672
+ import * as path3 from "path";
2612
2673
  import { StringDecoder } from "string_decoder";
2613
2674
  init_logger();
2614
2675
  var SHELL_AUDIT_LIMITS = {
@@ -2718,10 +2779,10 @@ var _internals = {
2718
2779
  emitHealth: emitShellAuditHealth
2719
2780
  };
2720
2781
  function shellAuditFilePath(directory) {
2721
- return path2.join(directory, ".swarm", "session", "shell-audit.jsonl");
2782
+ return path3.join(directory, ".swarm", "session", "shell-audit.jsonl");
2722
2783
  }
2723
2784
  function lockFilePath(directory) {
2724
- return path2.join(directory, ".swarm", "session", "shell-audit.lock");
2785
+ return path3.join(directory, ".swarm", "session", "shell-audit.lock");
2725
2786
  }
2726
2787
  function tmpPathFor(finalPath) {
2727
2788
  return `${finalPath}.${process.pid}.tmp`;
@@ -2864,7 +2925,7 @@ function renameSyncWithRetry(fromPath, toPath) {
2864
2925
  function tryLockOnce(directory) {
2865
2926
  const lockPath = lockFilePath(directory);
2866
2927
  try {
2867
- _internals.mkdirSync(path2.dirname(lockPath), { recursive: true });
2928
+ _internals.mkdirSync(path3.dirname(lockPath), { recursive: true });
2868
2929
  const fd = _internals.openSync(lockPath, "wx");
2869
2930
  _internals.closeSync(fd);
2870
2931
  return true;
@@ -3264,7 +3325,7 @@ function emitHealth(directory, payload) {
3264
3325
  // src/hooks/guardrails/audit-log.ts
3265
3326
  init_logger();
3266
3327
  import { createHash } from "crypto";
3267
- import * as path3 from "path";
3328
+ import * as path4 from "path";
3268
3329
  var SHELL_AUDIT_FIELD_CLASSES = Object.freeze({
3269
3330
  ts: "timestamp",
3270
3331
  sessionID: "identifier",
@@ -3298,7 +3359,7 @@ function redactPath(filePath) {
3298
3359
  if (rawMacHomeMatch) {
3299
3360
  return `~${rawMacHomeMatch[2]}`;
3300
3361
  }
3301
- const normalized = path3.normalize(filePath);
3362
+ const normalized = path4.normalize(filePath);
3302
3363
  const windowsHomeMatch = normalized.match(/^([A-Za-z]:\\[Uu][Ss][Ee][Rr][Ss]\\[^\\]+)(\\.*)$/i);
3303
3364
  if (windowsHomeMatch) {
3304
3365
  return `~\\${windowsHomeMatch[2]}`;
@@ -3360,4 +3421,4 @@ function redactDecisionLineForArchive(line) {
3360
3421
  return changed ? JSON.stringify(record) : line;
3361
3422
  }
3362
3423
 
3363
- export { classifyFile, stableCanonicalStringify, checkFileAuthority, normalizeToolNameLowerCase, isInDeclaredScope, redactShellCommand, readShellAuditTail, getShellAuditFoldedSummary, finalizeShellAuditForClose, redactPath, redactDecisionLineForArchive };
3424
+ export { isPolicyProtectedPath, protectedRoots, classifyFile, stableCanonicalStringify, checkFileAuthority, normalizeToolNameLowerCase, isInDeclaredScope, redactShellCommand, readShellAuditTail, getShellAuditFoldedSummary, finalizeShellAuditForClose, redactPath, redactDecisionLineForArchive };
@@ -6,20 +6,20 @@ import {
6
6
  } from "./index-ae75rja9.js";
7
7
  import {
8
8
  resolveKnowledgeStoreDir
9
- } from "./index-79g6edht.js";
9
+ } from "./index-x3y6zhgj.js";
10
10
  import {
11
11
  atomicWriteFile
12
- } from "./index-mken64yj.js";
12
+ } from "./index-zppxpc3y.js";
13
13
  import {
14
14
  init_knowledge_types,
15
15
  isActiveStatus
16
16
  } from "./index-bk5tah7q.js";
17
- import {
18
- require_proper_lockfile
19
- } from "./index-7g4c7s5r.js";
20
17
  import {
21
18
  readCachedParsedFile
22
19
  } from "./index-ed5ykebp.js";
20
+ import {
21
+ require_proper_lockfile
22
+ } from "./index-7g4c7s5r.js";
23
23
  import {
24
24
  init_logger,
25
25
  log
@@ -713,7 +713,7 @@ async function applyConfidenceFloorAction(directory, touched, options) {
713
713
  const {
714
714
  readAuthoritativeKnowledgeCounterRollups,
715
715
  effectiveRetrievalOutcomes
716
- } = await import("./knowledge-events-kdyv4jzn.js");
716
+ } = await import("./knowledge-events-pwm9jc0m.js");
717
717
  const rollups = await readAuthoritativeKnowledgeCounterRollups(directory);
718
718
  const flagIds = new Set;
719
719
  for (const e of atFloor) {
@@ -780,11 +780,11 @@ async function applyConfidenceFloorAction(directory, touched, options) {
780
780
  });
781
781
  }
782
782
  if (action === "quarantine" && toQuarantine.length > 0) {
783
- const { quarantineEntry } = await import("./knowledge-validator-4bhtden9.js");
784
- const { KnowledgeConfigSchema } = await import("./schema-v4qcqhek.js");
783
+ const { quarantineEntry } = await import("./knowledge-validator-0ttfsca7.js");
784
+ const { KnowledgeConfigSchema } = await import("./schema-jkbfwqr2.js");
785
785
  let config;
786
786
  try {
787
- const { loadPluginConfigWithMeta } = await import("./index-96m8ckpq.js");
787
+ const { loadPluginConfigWithMeta } = await import("./index-xkjrg9k4.js");
788
788
  const { config: loadedConfig } = loadPluginConfigWithMeta(directory);
789
789
  config = KnowledgeConfigSchema.parse(loadedConfig.knowledge ?? {});
790
790
  } catch {
@@ -4,14 +4,14 @@ import {
4
4
  PlanSchema,
5
5
  TaskStatusSchema,
6
6
  init_loader
7
- } from "./index-3djxegsc.js";
7
+ } from "./index-1akn19mp.js";
8
8
  import {
9
9
  assertProjectRoot,
10
10
  withEvidenceLock
11
- } from "./index-txbd25bc.js";
11
+ } from "./index-891g7hbf.js";
12
12
  import {
13
13
  emit
14
- } from "./index-aw492hpn.js";
14
+ } from "./index-x8vw6ap1.js";
15
15
  import {
16
16
  criticalWarn,
17
17
  init_logger,
@@ -4,7 +4,7 @@ import {
4
4
  } from "./index-4cgee5vh.js";
5
5
  import {
6
6
  withEvidenceLock
7
- } from "./index-txbd25bc.js";
7
+ } from "./index-891g7hbf.js";
8
8
  import {
9
9
  exports_external,
10
10
  init_zod
@@ -795,7 +795,7 @@ var init_tool_metadata = __esm(() => {
795
795
  agents: ["architect"]
796
796
  },
797
797
  collect_lane_results: {
798
- 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. Inline output for a settled lane is delivered only once: later polls of the same lane set output_omitted_repeat: true and omit output, but still include output_ref for recovery via retrieve_lane_output.",
798
+ description: "collect or poll results for a dispatch_lanes_async batch; a pure OBSERVER that never cancels or terminalizes child work unless you explicitly pass cancel_pending. Supports both non-blocking polling (wait omitted or false) and blocking join (wait: true). The wait budget bounds the observer call only \u2014 its expiry never kills a lane and is not evidence a lane died, so do not abort the workflow because a collection expired; poll again, cancel explicitly, or rely on the presumed-stale backstop. Any unsettled lane is reported in pending_lanes (batch_id, lane_id, stored status, output_ref when present) regardless of include_pending; busy/retry lanes are not timed out just because they run for a long time. Does not advance workflow gates. Inline output for a settled lane is delivered only once: later polls of the same lane set output_omitted_repeat: true and omit output, but still include output_ref for recovery via retrieve_lane_output.",
799
799
  agents: ["architect"]
800
800
  },
801
801
  summarize_work: {
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  ALLOWED_SKILL_PATH_PREFIXES,
4
4
  validateSkillPath
5
- } from "./index-rq6aetkv.js";
5
+ } from "./index-v689bmr2.js";
6
6
  import {
7
7
  withTimeoutSignal
8
8
  } from "./index-q7sjgr1y.js";
@@ -12,11 +12,11 @@ import {
12
12
  resolveHiveKnowledgePath,
13
13
  resolveSwarmKnowledgePath,
14
14
  transactKnowledge
15
- } from "./index-0tfgn5x0.js";
15
+ } from "./index-k10qtq71.js";
16
16
  import {
17
17
  effectiveRetrievalOutcomes,
18
18
  readAuthoritativeKnowledgeCounterRollups
19
- } from "./index-dn6yt0xg.js";
19
+ } from "./index-tdzbm974.js";
20
20
  import {
21
21
  advisoryWarn,
22
22
  init_warning_buffer
@@ -28,7 +28,7 @@ import {
28
28
  import {
29
29
  atomicWriteFileAnyRoot,
30
30
  atomicWriteSwarmFile
31
- } from "./index-7fh82sm1.js";
31
+ } from "./index-td0jz8xe.js";
32
32
  import {
33
33
  init_logger,
34
34
  log,
@@ -1083,6 +1083,7 @@ async function atomicWrite2(p, content) {
1083
1083
  await atomicWriteFileAnyRoot(p, content);
1084
1084
  }
1085
1085
  async function generateSkills(req) {
1086
+ const preview = req.preview === true;
1086
1087
  const minConfidence = req.minConfidence ?? DEFAULT_SKILL_MIN_CONFIDENCE;
1087
1088
  const minConfirmations = req.minConfirmations ?? DEFAULT_SKILL_MIN_CONFIRMATIONS;
1088
1089
  const candidates = await selectCandidateEntries(req.directory, {
@@ -1158,7 +1159,9 @@ async function generateSkills(req) {
1158
1159
  }
1159
1160
  }
1160
1161
  let content = renderSkillMarkdown(cluster, req.mode);
1161
- await writeEvalStub(req.directory, cluster.slug, generateEvalStub(cluster));
1162
+ if (!preview) {
1163
+ await writeEvalStub(req.directory, cluster.slug, generateEvalStub(cluster));
1164
+ }
1162
1165
  if (await isRejectedSkillContent(req.directory, cluster.slug, content)) {
1163
1166
  result.skipped.push({
1164
1167
  slug: cluster.slug,
@@ -1167,7 +1170,7 @@ async function generateSkills(req) {
1167
1170
  continue;
1168
1171
  }
1169
1172
  let evaluation;
1170
- if (req.evaluate) {
1173
+ if (req.evaluate && !preview) {
1171
1174
  let incumbentContent;
1172
1175
  const existingActivePath = activePath(req.directory, cluster.slug);
1173
1176
  if (existsSync2(existingActivePath)) {
@@ -1201,18 +1204,20 @@ async function generateSkills(req) {
1201
1204
  }
1202
1205
  }
1203
1206
  let missingSourceIds = [];
1204
- if (req.mode === "active") {
1207
+ if (!preview && req.mode === "active") {
1205
1208
  const idsToStamp = req.sourceKnowledgeIds?.length ? req.sourceKnowledgeIds : cluster.entries.map((e) => e.id);
1206
1209
  const { missing } = await stampSourceEntries(req.directory, cluster.slug, idsToStamp);
1207
1210
  missingSourceIds = missing;
1208
1211
  if (missingSourceIds.length > 0) {
1209
1212
  content = injectMissingIdsIntoFrontmatter(content, missingSourceIds);
1210
1213
  }
1211
- } else if (req.mode === "draft") {
1214
+ } else if (!preview && req.mode === "draft") {
1212
1215
  const idsToStamp = req.sourceKnowledgeIds?.length ? req.sourceKnowledgeIds : cluster.entries.map((e) => e.id);
1213
1216
  await stampSourceEntries(req.directory, cluster.slug, idsToStamp, "draft");
1214
1217
  }
1215
- await atomicWrite2(targetPath, content);
1218
+ if (!preview) {
1219
+ await atomicWrite2(targetPath, content);
1220
+ }
1216
1221
  result.written.push({
1217
1222
  slug: cluster.slug,
1218
1223
  path: targetPath,
@@ -1220,7 +1225,8 @@ async function generateSkills(req) {
1220
1225
  sourceKnowledgeIds: cluster.entries.map((e) => e.id),
1221
1226
  missingSourceKnowledgeIds: missingSourceIds,
1222
1227
  preserved,
1223
- evaluation
1228
+ evaluation,
1229
+ ...preview ? { content } : {}
1224
1230
  });
1225
1231
  }
1226
1232
  return result;
@@ -3,7 +3,7 @@ import {
3
3
  ALL_AGENT_NAMES,
4
4
  SUMMARIZER_EXEMPT_TOOL_NAMES,
5
5
  init_constants
6
- } from "./index-cpg98bh1.js";
6
+ } from "./index-myt57pht.js";
7
7
  import {
8
8
  OUTCOME_BLOCK_THRESHOLD,
9
9
  init_knowledge_types
@@ -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.152.1",
24
+ version: "7.153.1",
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",
@@ -132,6 +132,7 @@ var init_package = __esm(() => {
132
132
  "check:retention": "bun run scripts/check-retention-registry.ts",
133
133
  "check:core-events": "bun run scripts/check-core-events-usage.ts",
134
134
  "check:shell-audit": "bun run scripts/check-shell-audit-usage.ts",
135
+ "check:trajectory-store": "bun run scripts/check-trajectory-store-usage.ts",
135
136
  "check:test-file-cap": "bun run scripts/check-test-file-cap.ts",
136
137
  "check:pending-fragment": "bun run scripts/check-pending-fragment.ts",
137
138
  "check:gate-portability": "bun run scripts/check-gate-portability.ts",
@@ -784,11 +785,19 @@ var init_schema = __esm(() => {
784
785
  execution_stall_warn_calls: exports_external.number().int().min(1).default(30),
785
786
  execution_stall_stop_calls: exports_external.number().int().min(1).default(60),
786
787
  execution_stall_episode_minutes: exports_external.number().int().min(1).default(30),
787
- sandbox_macos_enabled: exports_external.boolean().optional()
788
+ sandbox_macos_enabled: exports_external.boolean().optional(),
789
+ sandbox: exports_external.object({
790
+ mode: exports_external.enum(["advisory", "required"]).default("advisory"),
791
+ require_filesystem: exports_external.boolean().default(false),
792
+ require_network: exports_external.boolean().default(false),
793
+ require_process: exports_external.boolean().default(false),
794
+ network_mode: exports_external.enum(["off", "on"]).default("off"),
795
+ network_allowlist: exports_external.array(exports_external.string().min(1)).max(128).default([]),
796
+ writable_roots: exports_external.array(exports_external.string().min(1)).max(128).default([])
797
+ }).optional()
788
798
  });
789
799
  WatchdogConfigSchema = exports_external.object({
790
800
  scope_guard: exports_external.boolean().default(true),
791
- skip_in_turbo: exports_external.boolean().default(false),
792
801
  delegation_ledger: exports_external.boolean().default(true)
793
802
  });
794
803
  SelfReviewConfigSchema = exports_external.object({
@@ -1341,7 +1350,7 @@ var init_schema = __esm(() => {
1341
1350
  stuck_on_test: 3,
1342
1351
  context_thrash: 10
1343
1352
  })),
1344
- max_trajectory_lines: exports_external.number().min(10).default(1000),
1353
+ max_trajectory_lines: exports_external.number().min(10).max(1e4).default(1000),
1345
1354
  escalation_enabled: exports_external.boolean().default(true),
1346
1355
  detection_timeout_ms: exports_external.number().min(10).default(100)
1347
1356
  });
@@ -1601,14 +1610,14 @@ var init_schema = __esm(() => {
1601
1610
  enabled: false
1602
1611
  };
1603
1612
  DEFAULT_PR_REVIEW_RESILIENCE_CONFIG = {
1604
- enabled: true,
1613
+ enabled: false,
1605
1614
  canary_probe_ms: 300000,
1606
1615
  status_probe_timeout_ms: 2000,
1607
1616
  correlated_failure_threshold: 2,
1608
1617
  max_retry_attempts_after_initial: 2
1609
1618
  };
1610
1619
  PrReviewResilienceConfigSchema = exports_external.object({
1611
- enabled: exports_external.boolean().default(true),
1620
+ enabled: exports_external.boolean().default(false),
1612
1621
  canary_probe_ms: exports_external.number().int().min(1).max(3600000).default(300000),
1613
1622
  status_probe_timeout_ms: exports_external.number().int().min(1).max(60000).default(2000),
1614
1623
  correlated_failure_threshold: exports_external.number().int().min(2).max(8).default(2),
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  import {
3
3
  telemetry
4
- } from "./index-aw492hpn.js";
4
+ } from "./index-x8vw6ap1.js";
5
5
  import {
6
6
  init_logger,
7
7
  warn
@@ -6,12 +6,12 @@ import {
6
6
  resolveSwarmKnowledgePath,
7
7
  transactKnowledge,
8
8
  wordBigrams
9
- } from "./index-0tfgn5x0.js";
9
+ } from "./index-k10qtq71.js";
10
10
  import {
11
11
  queryHistoricalOutcomes,
12
12
  readKnowledgeEvents,
13
13
  recordKnowledgeEvent
14
- } from "./index-dn6yt0xg.js";
14
+ } from "./index-tdzbm974.js";
15
15
  import {
16
16
  init_knowledge_types,
17
17
  isActiveStatus
@@ -224,11 +224,11 @@ async function maybeQuarantineOnContradiction(directory, entryId, threshold, win
224
224
  alreadyInactive: true
225
225
  };
226
226
  }
227
- const { quarantineEntry } = await import("./knowledge-validator-4bhtden9.js");
227
+ const { quarantineEntry } = await import("./knowledge-validator-0ttfsca7.js");
228
228
  let policyConfig;
229
229
  try {
230
- const { KnowledgeConfigSchema } = await import("./schema-v4qcqhek.js");
231
- const { loadPluginConfigWithMeta } = await import("./index-96m8ckpq.js");
230
+ const { KnowledgeConfigSchema } = await import("./schema-jkbfwqr2.js");
231
+ const { loadPluginConfigWithMeta } = await import("./index-xkjrg9k4.js");
232
232
  const { config: loadedConfig } = loadPluginConfigWithMeta(directory);
233
233
  policyConfig = KnowledgeConfigSchema.parse(loadedConfig.knowledge ?? {});
234
234
  } catch {