opencode-swarm 7.99.5 → 7.99.7

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.
@@ -6,10 +6,10 @@ import {
6
6
  loadPlanJsonOnly,
7
7
  mergeDurableGateEntriesFromEvidence,
8
8
  readDurableGateEvidence
9
- } from "./index-9twtnjkv.js";
9
+ } from "./index-y3x3gvy6.js";
10
10
  import"./index-r8f89sm9.js";
11
11
  import"./index-9b7qp18e.js";
12
- import"./index-94qwbx11.js";
12
+ import"./index-7ztmmqpt.js";
13
13
  import"./index-jtqkh8jf.js";
14
14
  import"./index-5e4e2hvv.js";
15
15
  import"./index-p0arc26j.js";
@@ -1,21 +1,21 @@
1
1
  // @bun
2
2
  import {
3
3
  handleGuardrailExplain
4
- } from "./index-tn5exv94.js";
5
- import"./index-gjyrjr08.js";
4
+ } from "./index-zyhd4mnn.js";
5
+ import"./index-wpnam1jh.js";
6
6
  import"./index-xsswhy6k.js";
7
7
  import"./index-ydgy7vg5.js";
8
8
  import"./index-vwyjkzgs.js";
9
9
  import"./index-f7nma02k.js";
10
10
  import"./index-0d3pmjf9.js";
11
11
  import"./index-7hnwnw5g.js";
12
- import"./index-9twtnjkv.js";
12
+ import"./index-y3x3gvy6.js";
13
13
  import"./index-adz3nk9b.js";
14
14
  import"./index-v4fcn4tr.js";
15
15
  import"./index-r8f89sm9.js";
16
16
  import"./index-9b7qp18e.js";
17
- import"./index-s3esnz7m.js";
18
- import"./index-94qwbx11.js";
17
+ import"./index-e9n3xsk0.js";
18
+ import"./index-7ztmmqpt.js";
19
19
  import"./index-jtqkh8jf.js";
20
20
  import"./index-5e4e2hvv.js";
21
21
  import"./index-p0arc26j.js";
@@ -22,6 +22,9 @@ var _internals = {
22
22
  readSwarmFileAsync,
23
23
  readCachedTextFile
24
24
  };
25
+ function isFailClosedHandler(value) {
26
+ return typeof value === "function" && Object.hasOwn(value, "__failClosed") && value.__failClosed === true;
27
+ }
25
28
  function safeHook(fn) {
26
29
  return async (input, output) => {
27
30
  try {
@@ -43,6 +46,9 @@ function composeHandlers(...fns) {
43
46
  }
44
47
  return async (input, output) => {
45
48
  for (const fn of fns) {
49
+ if (isFailClosedHandler(fn)) {
50
+ throw new Error("composeHandlers cannot wrap fail-closed handlers; use composeBlockingHandlers or await them directly");
51
+ }
46
52
  const safeFn = _internals.safeHook(fn);
47
53
  await safeFn(input, output);
48
54
  }
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  import {
3
3
  validateSwarmPath
4
- } from "./index-94qwbx11.js";
4
+ } from "./index-7ztmmqpt.js";
5
5
  import {
6
6
  log
7
7
  } from "./index-zgwm4ryv.js";
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  import {
3
3
  handleGuardrailExplain
4
- } from "./index-tn5exv94.js";
4
+ } from "./index-zyhd4mnn.js";
5
5
  import {
6
6
  handleGuardrailLog
7
7
  } from "./index-h9ptj4b1.js";
@@ -79,7 +79,7 @@ import {
79
79
  handleWriteRetroCommand,
80
80
  normalizeSwarmCommandInput,
81
81
  resolveCommand
82
- } from "./index-gjyrjr08.js";
82
+ } from "./index-wpnam1jh.js";
83
83
  import"./index-xsswhy6k.js";
84
84
  import"./index-ydgy7vg5.js";
85
85
  import"./index-vwyjkzgs.js";
@@ -90,13 +90,13 @@ import {
90
90
  ORCHESTRATOR_NAME,
91
91
  stripKnownSwarmPrefix
92
92
  } from "./index-7hnwnw5g.js";
93
- import"./index-9twtnjkv.js";
93
+ import"./index-y3x3gvy6.js";
94
94
  import"./index-adz3nk9b.js";
95
95
  import"./index-v4fcn4tr.js";
96
96
  import"./index-r8f89sm9.js";
97
97
  import"./index-9b7qp18e.js";
98
- import"./index-s3esnz7m.js";
99
- import"./index-94qwbx11.js";
98
+ import"./index-e9n3xsk0.js";
99
+ import"./index-7ztmmqpt.js";
100
100
  import"./index-jtqkh8jf.js";
101
101
  import"./index-5e4e2hvv.js";
102
102
  import"./index-p0arc26j.js";
@@ -114,7 +114,7 @@ import {
114
114
  transientBackoff,
115
115
  validateProjectRoot,
116
116
  writeProjectedSpecSync
117
- } from "./index-9twtnjkv.js";
117
+ } from "./index-y3x3gvy6.js";
118
118
  import {
119
119
  _internals as _internals2,
120
120
  _internals1 as _internals3,
@@ -138,12 +138,12 @@ import {
138
138
  listActive,
139
139
  subscribe,
140
140
  unsubscribe
141
- } from "./index-s3esnz7m.js";
141
+ } from "./index-e9n3xsk0.js";
142
142
  import {
143
143
  readSwarmFileAsync,
144
144
  safeHook,
145
145
  validateSwarmPath
146
- } from "./index-94qwbx11.js";
146
+ } from "./index-7ztmmqpt.js";
147
147
  import {
148
148
  deepMerge
149
149
  } from "./index-p0arc26j.js";
@@ -909,7 +909,7 @@ var init_executor = __esm(() => {
909
909
  // package.json
910
910
  var package_default = {
911
911
  name: "opencode-swarm",
912
- version: "7.99.5",
912
+ version: "7.99.7",
913
913
  description: "Architect-centric agentic swarm plugin for OpenCode - hub-and-spoke orchestration with SME consultation, code generation, and QA review",
914
914
  main: "dist/index.js",
915
915
  types: "dist/index.d.ts",
@@ -1562,6 +1562,9 @@ async function syncBundledProjectSkillsIfMissingAsync(projectDirectory, packageR
1562
1562
  }
1563
1563
  }
1564
1564
 
1565
+ // src/commands/registry.ts
1566
+ init_logger();
1567
+
1565
1568
  // src/state.ts
1566
1569
  import * as fs6 from "fs/promises";
1567
1570
  import * as path11 from "path";
@@ -6031,7 +6034,7 @@ function hasActiveEpicMode(sessionID) {
6031
6034
  async function rehydratePrSubscriptions(sessionID, directory) {
6032
6035
  const map = new Map;
6033
6036
  try {
6034
- const { listActive: listActive2 } = await import("./pr-subscriptions-d57tq0c0.js");
6037
+ const { listActive: listActive2 } = await import("./pr-subscriptions-zfxjtyzw.js");
6035
6038
  const records = await listActive2(directory);
6036
6039
  for (const record of records) {
6037
6040
  if (record.sessionID !== sessionID)
@@ -15886,6 +15889,7 @@ import { existsSync as existsSync16, mkdirSync as mkdirSync9, readFileSync as re
15886
15889
  import { homedir as homedir4 } from "os";
15887
15890
  import { join as join27 } from "path";
15888
15891
  var CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000;
15892
+ var SEMVER_REGEX = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[A-Za-z-][0-9A-Za-z-]*)(?:\.(?:0|[1-9]\d*|\d*[A-Za-z-][0-9A-Za-z-]*))*))?(?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?$/;
15889
15893
  var MAX_RESPONSE_BYTES = 256 * 1024;
15890
15894
  function cacheDir() {
15891
15895
  const xdg = process.env.XDG_CACHE_HOME;
@@ -15910,26 +15914,39 @@ function readVersionCache() {
15910
15914
  return null;
15911
15915
  }
15912
15916
  }
15917
+ function parseVersion(version) {
15918
+ const trimmed = version.trim();
15919
+ const match = SEMVER_REGEX.exec(trimmed);
15920
+ if (!match)
15921
+ return null;
15922
+ return {
15923
+ major: Number.parseInt(match[1], 10),
15924
+ minor: Number.parseInt(match[2], 10),
15925
+ patch: Number.parseInt(match[3], 10),
15926
+ prerelease: match[4] ?? null
15927
+ };
15928
+ }
15913
15929
  function compareVersions(a, b) {
15914
- const [aBase, aPre] = a.split("-", 2);
15915
- const [bBase, bPre] = b.split("-", 2);
15916
- const aParts = aBase.split(".").map((n) => Number.parseInt(n, 10) || 0);
15917
- const bParts = bBase.split(".").map((n) => Number.parseInt(n, 10) || 0);
15918
- const len = Math.max(aParts.length, bParts.length);
15919
- for (let i = 0;i < len; i++) {
15920
- const av = aParts[i] ?? 0;
15921
- const bv = bParts[i] ?? 0;
15922
- if (av > bv)
15923
- return 1;
15924
- if (av < bv)
15925
- return -1;
15930
+ const aParsed = parseVersion(a);
15931
+ const bParsed = parseVersion(b);
15932
+ if (!aParsed || !bParsed)
15933
+ return 0;
15934
+ if (aParsed.major !== bParsed.major) {
15935
+ return aParsed.major > bParsed.major ? 1 : -1;
15926
15936
  }
15927
- if (aPre && !bPre)
15937
+ if (aParsed.minor !== bParsed.minor) {
15938
+ return aParsed.minor > bParsed.minor ? 1 : -1;
15939
+ }
15940
+ if (aParsed.patch !== bParsed.patch) {
15941
+ return aParsed.patch > bParsed.patch ? 1 : -1;
15942
+ }
15943
+ if (aParsed.prerelease && !bParsed.prerelease)
15928
15944
  return -1;
15929
- if (!aPre && bPre)
15945
+ if (!aParsed.prerelease && bParsed.prerelease)
15930
15946
  return 1;
15931
- if (aPre && bPre)
15932
- return aPre < bPre ? -1 : aPre > bPre ? 1 : 0;
15947
+ if (aParsed.prerelease && bParsed.prerelease) {
15948
+ return aParsed.prerelease < bParsed.prerelease ? -1 : aParsed.prerelease > bParsed.prerelease ? 1 : 0;
15949
+ }
15933
15950
  return 0;
15934
15951
  }
15935
15952
 
@@ -17950,7 +17967,7 @@ async function handleEvidenceCommand(directory, args) {
17950
17967
  return formatTaskEvidenceMarkdown(evidenceData);
17951
17968
  }
17952
17969
  async function handleEvidenceSummaryCommand(directory) {
17953
- const { buildEvidenceSummary } = await import("./evidence-summary-service-5ww1npaa.js");
17970
+ const { buildEvidenceSummary } = await import("./evidence-summary-service-ch74hb16.js");
17954
17971
  const artifact = await buildEvidenceSummary(directory);
17955
17972
  if (!artifact) {
17956
17973
  return "No plan found. Run `/swarm plan` to check plan status.";
@@ -32275,6 +32292,13 @@ function findSimilarCommands(query) {
32275
32292
  scored.sort((a, b) => a.score - b.score);
32276
32293
  return scored.slice(0, 3).map((s) => s.cmd);
32277
32294
  }
32295
+ function emitValidationWarnings(prefix, warnings) {
32296
+ if (warnings.length === 0)
32297
+ return;
32298
+ warn(`${prefix}:
32299
+ ${warnings.join(`
32300
+ `)}`);
32301
+ }
32278
32302
  function buildDetailedHelp(commandName, entry) {
32279
32303
  const lines = [];
32280
32304
  lines.push(`## /swarm ${commandName}`, "");
@@ -32296,7 +32320,7 @@ function buildDetailedHelp(commandName, entry) {
32296
32320
  async function handleHelpCommand(ctx) {
32297
32321
  const targetCommand = ctx.args.join(" ");
32298
32322
  if (!targetCommand) {
32299
- const { buildHelpText } = await import("./index-s0nsx5v6.js");
32323
+ const { buildHelpText } = await import("./index-sz3kw59p.js");
32300
32324
  return buildHelpText();
32301
32325
  }
32302
32326
  const tokens = targetCommand.split(/\s+/);
@@ -32305,7 +32329,7 @@ async function handleHelpCommand(ctx) {
32305
32329
  return _internals46.buildDetailedHelp(resolved.key, resolved.entry);
32306
32330
  }
32307
32331
  const similar = _internals46.findSimilarCommands(targetCommand);
32308
- const { buildHelpText: fullHelp } = await import("./index-s0nsx5v6.js");
32332
+ const { buildHelpText: fullHelp } = await import("./index-sz3kw59p.js");
32309
32333
  if (similar.length > 0) {
32310
32334
  return `Command '/swarm ${targetCommand}' not found.
32311
32335
 
@@ -32438,7 +32462,7 @@ var COMMAND_REGISTRY = {
32438
32462
  },
32439
32463
  "guardrail explain": {
32440
32464
  handler: async (ctx) => {
32441
- const { handleGuardrailExplain } = await import("./guardrail-explain-2q5q86jv.js");
32465
+ const { handleGuardrailExplain } = await import("./guardrail-explain-dkh5f7nf.js");
32442
32466
  return handleGuardrailExplain(ctx.directory, ctx.args);
32443
32467
  },
32444
32468
  description: "Dry-run: show what the guardrails would do to a command or write target (executes nothing)",
@@ -33251,6 +33275,7 @@ var _internals46 = {
33251
33275
  handleHelpCommand,
33252
33276
  validateAliases,
33253
33277
  validateToolPolicy,
33278
+ emitValidationWarnings,
33254
33279
  resolveCommand,
33255
33280
  levenshteinDistance,
33256
33281
  findSimilarCommands,
@@ -33262,20 +33287,12 @@ if (!validation.valid) {
33262
33287
  ${validation.errors.join(`
33263
33288
  `)}`);
33264
33289
  }
33265
- if (validation.warnings.length > 0) {
33266
- console.warn(`COMMAND_REGISTRY alias warnings:
33267
- ${validation.warnings.join(`
33268
- `)}`);
33269
- }
33290
+ _internals46.emitValidationWarnings("COMMAND_REGISTRY alias warnings", validation.warnings);
33270
33291
  try {
33271
33292
  const toolPolicyValidation = _internals46.validateToolPolicy();
33272
- if (toolPolicyValidation.warnings.length > 0) {
33273
- console.warn(`COMMAND_REGISTRY toolPolicy warnings:
33274
- ${toolPolicyValidation.warnings.join(`
33275
- `)}`);
33276
- }
33293
+ _internals46.emitValidationWarnings("COMMAND_REGISTRY toolPolicy warnings", toolPolicyValidation.warnings);
33277
33294
  } catch (e) {
33278
- console.warn(`COMMAND_REGISTRY toolPolicy validation failed (non-fatal): ${e.message}`);
33295
+ warn(`COMMAND_REGISTRY toolPolicy validation failed (non-fatal): ${e.message}`);
33279
33296
  }
33280
33297
  function resolveCommand(tokens) {
33281
33298
  if (tokens.length === 0)
@@ -8,7 +8,7 @@ import {
8
8
  import {
9
9
  readSwarmFileAsync,
10
10
  validateSwarmPath
11
- } from "./index-94qwbx11.js";
11
+ } from "./index-7ztmmqpt.js";
12
12
  import {
13
13
  readCachedParsedFile
14
14
  } from "./index-jtqkh8jf.js";
@@ -12,7 +12,7 @@ import {
12
12
  detectPosixWrites,
13
13
  detectWindowsWrites,
14
14
  resolveWriteTargets
15
- } from "./index-gjyrjr08.js";
15
+ } from "./index-wpnam1jh.js";
16
16
  import {
17
17
  checkFileAuthority,
18
18
  classifyFile,
package/dist/cli/index.js CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  getPluginLockFilePaths,
8
8
  package_default,
9
9
  resolveCommand
10
- } from "./index-gjyrjr08.js";
10
+ } from "./index-wpnam1jh.js";
11
11
  import"./index-xsswhy6k.js";
12
12
  import"./index-ydgy7vg5.js";
13
13
  import"./index-vwyjkzgs.js";
@@ -16,13 +16,13 @@ import"./index-0d3pmjf9.js";
16
16
  import {
17
17
  DEFAULT_AGENT_CONFIGS
18
18
  } from "./index-7hnwnw5g.js";
19
- import"./index-9twtnjkv.js";
19
+ import"./index-y3x3gvy6.js";
20
20
  import"./index-adz3nk9b.js";
21
21
  import"./index-v4fcn4tr.js";
22
22
  import"./index-r8f89sm9.js";
23
23
  import"./index-9b7qp18e.js";
24
- import"./index-s3esnz7m.js";
25
- import"./index-94qwbx11.js";
24
+ import"./index-e9n3xsk0.js";
25
+ import"./index-7ztmmqpt.js";
26
26
  import"./index-jtqkh8jf.js";
27
27
  import"./index-5e4e2hvv.js";
28
28
  import"./index-p0arc26j.js";
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  import {
3
3
  validateSwarmPath
4
- } from "./index-94qwbx11.js";
4
+ } from "./index-7ztmmqpt.js";
5
5
  import"./index-jtqkh8jf.js";
6
6
  import"./index-5e4e2hvv.js";
7
7
  import"./index-p0arc26j.js";
@@ -9,8 +9,8 @@ import {
9
9
  sweepStale,
10
10
  unsubscribe,
11
11
  updateSnapshot
12
- } from "./index-s3esnz7m.js";
13
- import"./index-94qwbx11.js";
12
+ } from "./index-e9n3xsk0.js";
13
+ import"./index-7ztmmqpt.js";
14
14
  import"./index-jtqkh8jf.js";
15
15
  import"./index-5e4e2hvv.js";
16
16
  import"./index-p0arc26j.js";
@@ -1,6 +1,7 @@
1
1
  import type { AgentDefinition } from '../agents/index.js';
2
2
  declare function levenshteinDistance(a: string, b: string): number;
3
3
  declare function findSimilarCommands(query: string): string[];
4
+ declare function emitValidationWarnings(prefix: string, warnings: readonly string[]): void;
4
5
  declare function buildDetailedHelp(commandName: string, entry: CommandEntry): string;
5
6
  export declare function handleHelpCommand(ctx: CommandContext): Promise<string>;
6
7
  export type CommandContext = {
@@ -924,6 +925,7 @@ export declare const _internals: {
924
925
  handleHelpCommand: typeof handleHelpCommand;
925
926
  validateAliases: typeof validateAliases;
926
927
  validateToolPolicy: typeof validateToolPolicy;
928
+ emitValidationWarnings: typeof emitValidationWarnings;
927
929
  resolveCommand: typeof resolveCommand;
928
930
  levenshteinDistance: typeof levenshteinDistance;
929
931
  findSimilarCommands: typeof findSimilarCommands;
@@ -21,7 +21,11 @@ export declare const _internals: {
21
21
  readSwarmFileAsync: typeof readSwarmFileAsync;
22
22
  readCachedTextFile: typeof readCachedTextFile;
23
23
  };
24
- export declare function safeHook<I, O>(fn: (input: I, output: O) => Promise<void>): (input: I, output: O) => Promise<void>;
24
+ type HookHandler<I, O> = (input: I, output: O) => Promise<void>;
25
+ export declare function markFailClosed<I, O>(fn: HookHandler<I, O>): HookHandler<I, O> & {
26
+ __failClosed?: true;
27
+ };
28
+ export declare function safeHook<I, O>(fn: HookHandler<I, O>): HookHandler<I, O>;
25
29
  /**
26
30
  * `composeHandlers` runs handlers sequentially, wrapping EACH handler in
27
31
  * `safeHook` so any thrown error is downgraded to a warning. Use this for
@@ -37,7 +41,7 @@ export declare function safeHook<I, O>(fn: (input: I, output: O) => Promise<void
37
41
  *
38
42
  * Reference: AGENTS.md invariant 11 + Full-Auto v2 fail-closed contract.
39
43
  */
40
- export declare function composeHandlers<I, O>(...fns: Array<(input: I, output: O) => Promise<void>>): (input: I, output: O) => Promise<void>;
44
+ export declare function composeHandlers<I, O>(...fns: Array<HookHandler<I, O>>): HookHandler<I, O>;
41
45
  /**
42
46
  * `composeBlockingHandlers` runs handlers sequentially WITHOUT `safeHook`,
43
47
  * so any thrown error propagates to the caller and stops the chain.
@@ -62,7 +66,7 @@ export declare function composeHandlers<I, O>(...fns: Array<(input: I, output: O
62
66
  * place — silently swallowing a Full-Auto denial would be a runtime
63
67
  * fail-open and is a critical regression.
64
68
  */
65
- export declare function composeBlockingHandlers<I, O>(...fns: Array<(input: I, output: O) => Promise<void>>): (input: I, output: O) => Promise<void>;
69
+ export declare function composeBlockingHandlers<I, O>(...fns: Array<HookHandler<I, O>>): HookHandler<I, O>;
66
70
  /**
67
71
  * Validates that a filename is safe to use within the .swarm directory
68
72
  *
@@ -74,3 +78,4 @@ export declare function composeBlockingHandlers<I, O>(...fns: Array<(input: I, o
74
78
  export declare function validateSwarmPath(directory: string, filename: string): string;
75
79
  export declare function readSwarmFileAsync(directory: string, filename: string, cache?: Map<string, Promise<string | null>>): Promise<string | null>;
76
80
  export declare function estimateTokens(text: string): number;
81
+ export {};