opencode-swarm 7.101.0 → 7.102.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -54,6 +54,7 @@ All other gates: failure → return to coder. No self-fixes. No workarounds.
54
54
  → REQUIRED: Print "sast-baseline: [WRITTEN — N fingerprints | MERGED — N fingerprints | SKIPPED — gate disabled | ERROR — details]"
55
55
  → Subsequent `pre_check_batch` calls with `phase: <N>` will automatically diff against this baseline — only NEW findings (not in baseline) drive the fail verdict.
56
56
  5b. the active swarm's coder agent - Implement (if designer scaffold produced, include it as INPUT).
57
+ 5b-bis. **CODER OUTPUT VERIFICATION**: After the coder reports completion, do NOT accept the self-report alone. Run `diff` (step 5c) and inspect at least one of the modified files yourself to confirm the change exists. The coder may report DONE without having produced any diff. A 30-second read of the changed file(s) catches this failure mode. This is NOT a separate explorer dispatch — the existing `diff` tool at step 5c is the verification mechanism; the key discipline is checking that `diff` returns actual changes before proceeding, rather than forwarding the coder's self-report to the next gate.
57
58
  5c. Run `diff` tool. If `hasContractChanges` → the active swarm's explorer agent integration analysis. If COMPATIBILITY SIGNALS=INCOMPATIBLE or MIGRATION_SURFACE=yes → coder retry. If COMPATIBILITY SIGNALS=COMPATIBLE and MIGRATION_SURFACE=no → proceed.
58
59
  → REQUIRED: Print "diff: [PASS | CONTRACT CHANGE — details]"
59
60
  5d. Run `syntax_check` tool. SYNTACTIC ERRORS → return to coder. NO ERRORS → proceed to placeholder_scan.
@@ -137,6 +137,7 @@ Get-Content "$env:TEMP\test_out.txt" | Select-Object -Last 50
137
137
  - `Select-String -Last N` — invalid parameter, use `Select-Object -Last N`
138
138
  - `2>&1 2>&1` — duplicate redirection, causes parse error; use `2>&1` once
139
139
  - `&&` — not supported in PowerShell 5.1; use `; if ($?) { cmd2 }` instead
140
+ - `bun test --exec bash` — fails on Windows hosts with ENOENT (bash is not available in standard PowerShell). Use `bun test` directly or a PowerShell-based loop instead.
140
141
  - After `bun install --frozen-lockfile --force`, non-elevated Windows shells can hit `EPERM` while reading refreshed `node_modules` entries. Treat that as a host permission/access issue: rerun the same focused Bun command with approved/elevated access before diagnosing it as a code or test failure.
141
142
 
142
143
  ---
@@ -736,6 +736,7 @@ The `--timeout 120000` flag sets per-test timeout to 120 seconds. Individual tes
736
736
  3. Verify no `process.cwd()` usage — use the `directory` parameter from `createSwarmTool` or hook constructor
737
737
  4. Verify no hardcoded paths (`/tmp/...`, `C:\...`) — use `os.tmpdir()` + `path.join()`
738
738
  5. Verify mocks are restored in `afterEach` if using `spyOn` or `mock.module`
739
+ 6. Run `bunx @biomejs/biome@2.3.14 check --write <touched-test-files>` to auto-format only the files you created or modified. Formatting issues are a common first-pass failure — scoping the command to touched files avoids accidental workspace-wide rewrites.
739
740
 
740
741
  ## Known Pre-existing Test Failures
741
742
 
@@ -1,8 +1,8 @@
1
1
  // @bun
2
2
  import {
3
3
  handleGuardrailExplain
4
- } from "./index-wc8g49dp.js";
5
- import"./index-rmh6nqbp.js";
4
+ } from "./index-72893pwd.js";
5
+ import"./index-3v3rq2tq.js";
6
6
  import"./index-pj3a5fbt.js";
7
7
  import"./index-ydgy7vg5.js";
8
8
  import"./index-vwyjkzgs.js";
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  import {
3
3
  handleGuardrailExplain
4
- } from "./index-wc8g49dp.js";
4
+ } from "./index-72893pwd.js";
5
5
  import {
6
6
  handleGuardrailLog
7
7
  } from "./index-5bstvpct.js";
@@ -79,7 +79,7 @@ import {
79
79
  handleWriteRetroCommand,
80
80
  normalizeSwarmCommandInput,
81
81
  resolveCommand
82
- } from "./index-rmh6nqbp.js";
82
+ } from "./index-3v3rq2tq.js";
83
83
  import"./index-pj3a5fbt.js";
84
84
  import"./index-ydgy7vg5.js";
85
85
  import"./index-vwyjkzgs.js";
@@ -912,7 +912,7 @@ var init_executor = __esm(() => {
912
912
  // package.json
913
913
  var package_default = {
914
914
  name: "opencode-swarm",
915
- version: "7.101.0",
915
+ version: "7.102.0",
916
916
  description: "Architect-centric agentic swarm plugin for OpenCode - hub-and-spoke orchestration with SME consultation, code generation, and QA review",
917
917
  main: "dist/index.js",
918
918
  types: "dist/index.d.ts",
@@ -33362,7 +33362,7 @@ function buildDetailedHelp(commandName, entry) {
33362
33362
  async function handleHelpCommand(ctx) {
33363
33363
  const targetCommand = ctx.args.join(" ");
33364
33364
  if (!targetCommand) {
33365
- const { buildHelpText } = await import("./index-mz3j0me8.js");
33365
+ const { buildHelpText } = await import("./index-2r26qngd.js");
33366
33366
  return buildHelpText();
33367
33367
  }
33368
33368
  const tokens = targetCommand.split(/\s+/);
@@ -33371,7 +33371,7 @@ async function handleHelpCommand(ctx) {
33371
33371
  return _internals47.buildDetailedHelp(resolved.key, resolved.entry);
33372
33372
  }
33373
33373
  const similar = _internals47.findSimilarCommands(targetCommand);
33374
- const { buildHelpText: fullHelp } = await import("./index-mz3j0me8.js");
33374
+ const { buildHelpText: fullHelp } = await import("./index-2r26qngd.js");
33375
33375
  if (similar.length > 0) {
33376
33376
  return `Command '/swarm ${targetCommand}' not found.
33377
33377
 
@@ -33504,7 +33504,7 @@ var COMMAND_REGISTRY = {
33504
33504
  },
33505
33505
  "guardrail explain": {
33506
33506
  handler: async (ctx) => {
33507
- const { handleGuardrailExplain } = await import("./guardrail-explain-ma84cj3s.js");
33507
+ const { handleGuardrailExplain } = await import("./guardrail-explain-ea9ja7x8.js");
33508
33508
  return handleGuardrailExplain(ctx.directory, ctx.args);
33509
33509
  },
33510
33510
  description: "Dry-run: show what the guardrails would do to a command or write target (executes nothing)",
@@ -12,7 +12,7 @@ import {
12
12
  detectPosixWrites,
13
13
  detectWindowsWrites,
14
14
  resolveWriteTargets
15
- } from "./index-rmh6nqbp.js";
15
+ } from "./index-3v3rq2tq.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-rmh6nqbp.js";
10
+ } from "./index-3v3rq2tq.js";
11
11
  import"./index-pj3a5fbt.js";
12
12
  import"./index-ydgy7vg5.js";
13
13
  import"./index-vwyjkzgs.js";
package/dist/index.js CHANGED
@@ -69,7 +69,7 @@ var package_default;
69
69
  var init_package = __esm(() => {
70
70
  package_default = {
71
71
  name: "opencode-swarm",
72
- version: "7.101.0",
72
+ version: "7.102.0",
73
73
  description: "Architect-centric agentic swarm plugin for OpenCode - hub-and-spoke orchestration with SME consultation, code generation, and QA review",
74
74
  main: "dist/index.js",
75
75
  types: "dist/index.d.ts",
@@ -115819,6 +115819,308 @@ import * as fsPromises5 from "node:fs/promises";
115819
115819
  import * as os20 from "node:os";
115820
115820
  import * as path137 from "node:path";
115821
115821
 
115822
+ // src/lang/symbol-visibility.ts
115823
+ var PUBLIC_INFO = {
115824
+ exported: true,
115825
+ visibility: "public",
115826
+ exportedReason: "top_level_public",
115827
+ apiSurfaceKind: "public"
115828
+ };
115829
+ var PRIVATE_INFO = {
115830
+ exported: false,
115831
+ visibility: "private",
115832
+ exportedReason: "unknown",
115833
+ apiSurfaceKind: "private"
115834
+ };
115835
+ function collectCommonJsExports(source) {
115836
+ const sanitized = maskCommentsAndStrings(source);
115837
+ const exportsByLocal = new Map;
115838
+ const add2 = (localName, exportedName, sourceIndex) => {
115839
+ if (!isIdentifier(localName) || !isIdentifier(exportedName))
115840
+ return;
115841
+ const existing = exportsByLocal.get(localName);
115842
+ if (existing && existing.sourceIndex <= sourceIndex)
115843
+ return;
115844
+ exportsByLocal.set(localName, {
115845
+ localName,
115846
+ exportedName,
115847
+ exportedReason: "explicit_export",
115848
+ sourceIndex
115849
+ });
115850
+ };
115851
+ for (const match of sanitized.matchAll(/\bmodule\s*\.\s*exports\s*=\s*([A-Za-z_$][\w$]*)\b/g)) {
115852
+ add2(match[1], match[1], match.index ?? 0);
115853
+ }
115854
+ for (const match of sanitized.matchAll(/\bmodule\s*\.\s*exports\s*=\s*\{([^}]*)\}/g)) {
115855
+ const body = match[1];
115856
+ const baseIndex = match.index ?? 0;
115857
+ for (const part of body.split(",")) {
115858
+ const entry = part.trim();
115859
+ if (!entry)
115860
+ continue;
115861
+ const alias = entry.match(/^([A-Za-z_$][\w$]*)\s*:\s*([A-Za-z_$][\w$]*)$/);
115862
+ if (alias) {
115863
+ add2(alias[2], alias[1], baseIndex + match[0].indexOf(part));
115864
+ continue;
115865
+ }
115866
+ const shorthand = entry.match(/^([A-Za-z_$][\w$]*)$/);
115867
+ if (shorthand) {
115868
+ add2(shorthand[1], shorthand[1], baseIndex + match[0].indexOf(part));
115869
+ }
115870
+ }
115871
+ }
115872
+ for (const match of sanitized.matchAll(/\b(?:module\s*\.\s*exports|exports)\s*\.\s*([A-Za-z_$][\w$]*)\s*=\s*([A-Za-z_$][\w$]*)\b/g)) {
115873
+ add2(match[2], match[1], match.index ?? 0);
115874
+ }
115875
+ return exportsByLocal;
115876
+ }
115877
+ function collectPythonAllNames(source) {
115878
+ const match = source.match(/__all__\s*=\s*([[({])([\s\S]*?)[\])}]/);
115879
+ if (!match)
115880
+ return null;
115881
+ const body = match[2].trim();
115882
+ if (!body)
115883
+ return new Set;
115884
+ const names = new Set;
115885
+ for (const part of body.split(",")) {
115886
+ const trimmed = part.trim();
115887
+ if (!trimmed)
115888
+ continue;
115889
+ const stringMatch = trimmed.match(/^['"]([^'"]+)['"]$/);
115890
+ if (!stringMatch)
115891
+ return null;
115892
+ names.add(stringMatch[1]);
115893
+ }
115894
+ return names;
115895
+ }
115896
+ function getSymbolVisibilityInfo(ctx) {
115897
+ if (hasPrivateContainer(ctx.defNode))
115898
+ return { ...PRIVATE_INFO };
115899
+ if (ctx.explicitExported || ctx.commonJsExport) {
115900
+ return {
115901
+ exported: true,
115902
+ visibility: "public",
115903
+ exportedReason: "explicit_export",
115904
+ apiSurfaceKind: "export"
115905
+ };
115906
+ }
115907
+ const ownVisibility = visibilityFromText(ctx.grammarId, ctx.defNode.text);
115908
+ if (ctx.kind === "method") {
115909
+ return {
115910
+ exported: false,
115911
+ visibility: ownVisibility,
115912
+ exportedReason: ownVisibility === "unknown" ? "unknown" : "modifier",
115913
+ apiSurfaceKind: ownVisibility === "private" ? "private" : "public"
115914
+ };
115915
+ }
115916
+ if (!ctx.isTopLevel && isMemberLikeNode(ctx.defNode)) {
115917
+ return {
115918
+ exported: false,
115919
+ visibility: ownVisibility === "unknown" ? "public" : ownVisibility,
115920
+ exportedReason: ownVisibility === "unknown" ? "module_public" : "modifier",
115921
+ apiSurfaceKind: ownVisibility === "private" ? "private" : "public"
115922
+ };
115923
+ }
115924
+ if (!ctx.isTopLevel)
115925
+ return { ...PRIVATE_INFO };
115926
+ switch (ctx.grammarId) {
115927
+ case "typescript":
115928
+ case "javascript":
115929
+ case "tsx":
115930
+ return { ...PRIVATE_INFO };
115931
+ case "python":
115932
+ return pythonVisibility(ctx);
115933
+ case "rust":
115934
+ return rustVisibility(ctx);
115935
+ case "go":
115936
+ return isUppercasePublic(ctx.localName) ? {
115937
+ ...PUBLIC_INFO,
115938
+ exportedReason: "naming_convention"
115939
+ } : { ...PRIVATE_INFO };
115940
+ case "java":
115941
+ case "kotlin":
115942
+ case "csharp":
115943
+ case "swift":
115944
+ case "php":
115945
+ return modifierLanguageVisibility(ctx);
115946
+ case "cpp":
115947
+ return cppVisibility(ctx);
115948
+ case "dart":
115949
+ return ctx.localName.startsWith("_") ? { ...PRIVATE_INFO } : { ...PUBLIC_INFO, exportedReason: "naming_convention" };
115950
+ case "ruby":
115951
+ return ctx.localName.startsWith("_") ? { ...PRIVATE_INFO } : { ...PUBLIC_INFO, exportedReason: "module_public" };
115952
+ default:
115953
+ return {
115954
+ exported: false,
115955
+ visibility: "unknown",
115956
+ exportedReason: "unknown",
115957
+ apiSurfaceKind: "unknown"
115958
+ };
115959
+ }
115960
+ }
115961
+ function pythonVisibility(ctx) {
115962
+ if (ctx.pythonAllNames) {
115963
+ return ctx.pythonAllNames.has(ctx.localName) ? {
115964
+ exported: true,
115965
+ visibility: "public",
115966
+ exportedReason: "module_public",
115967
+ apiSurfaceKind: "public"
115968
+ } : { ...PRIVATE_INFO };
115969
+ }
115970
+ return ctx.localName.startsWith("_") ? { ...PRIVATE_INFO } : { ...PUBLIC_INFO, exportedReason: "naming_convention" };
115971
+ }
115972
+ function rustVisibility(ctx) {
115973
+ const text = ctx.defNode.text.trimStart();
115974
+ if (!/^pub\b|^pub\s*\(/.test(text))
115975
+ return { ...PRIVATE_INFO };
115976
+ const internal = /^pub\s*\(\s*(crate|super|in\b)/.test(text);
115977
+ return {
115978
+ exported: true,
115979
+ visibility: internal ? "internal" : "public",
115980
+ exportedReason: "modifier",
115981
+ apiSurfaceKind: "public"
115982
+ };
115983
+ }
115984
+ function modifierLanguageVisibility(ctx) {
115985
+ if (ctx.grammarId === "php" && ctx.localName.startsWith("_")) {
115986
+ return { ...PRIVATE_INFO };
115987
+ }
115988
+ const visibility = visibilityFromText(ctx.grammarId, ctx.defNode.text);
115989
+ if (visibility === "private")
115990
+ return { ...PRIVATE_INFO };
115991
+ if (visibility === "unknown") {
115992
+ const defaultVisibility = ctx.grammarId === "java" ? "package" : defaultModuleVisibility(ctx.grammarId);
115993
+ return {
115994
+ exported: true,
115995
+ visibility: defaultVisibility,
115996
+ exportedReason: "module_public",
115997
+ apiSurfaceKind: "public"
115998
+ };
115999
+ }
116000
+ return {
116001
+ exported: true,
116002
+ visibility,
116003
+ exportedReason: "modifier",
116004
+ apiSurfaceKind: "public"
116005
+ };
116006
+ }
116007
+ function cppVisibility(ctx) {
116008
+ const text = ctx.defNode.text.trimStart();
116009
+ if (/^static\b/.test(text) || ctx.localName.startsWith("_")) {
116010
+ return { ...PRIVATE_INFO };
116011
+ }
116012
+ return {
116013
+ exported: true,
116014
+ visibility: "public",
116015
+ exportedReason: "namespace_public",
116016
+ apiSurfaceKind: "public"
116017
+ };
116018
+ }
116019
+ function visibilityFromText(grammarId, text) {
116020
+ const normalized = declarationPrefix(text).trimStart();
116021
+ if (/\b(private|fileprivate)\b/.test(normalized))
116022
+ return "private";
116023
+ if (/\bprotected\b/.test(normalized))
116024
+ return "protected";
116025
+ if (/\binternal\b/.test(normalized))
116026
+ return "internal";
116027
+ if (/\b(public|open)\b/.test(normalized))
116028
+ return "public";
116029
+ if (grammarId === "rust" && /^pub\s*\(\s*(crate|super|in\b)/.test(normalized)) {
116030
+ return "internal";
116031
+ }
116032
+ if (grammarId === "rust" && /^pub\b|^pub\s*\(/.test(normalized)) {
116033
+ return "public";
116034
+ }
116035
+ return "unknown";
116036
+ }
116037
+ function declarationPrefix(text) {
116038
+ const bodyStart = text.search(/[{\n]/);
116039
+ return bodyStart === -1 ? text : text.slice(0, bodyStart);
116040
+ }
116041
+ function defaultModuleVisibility(grammarId) {
116042
+ switch (grammarId) {
116043
+ case "kotlin":
116044
+ case "swift":
116045
+ case "csharp":
116046
+ return "internal";
116047
+ case "php":
116048
+ return "public";
116049
+ default:
116050
+ return "public";
116051
+ }
116052
+ }
116053
+ function hasPrivateContainer(node) {
116054
+ let current = node.parent;
116055
+ while (current) {
116056
+ if (isContainerNode(current) && visibilityFromText("", current.text) === "private") {
116057
+ return true;
116058
+ }
116059
+ current = current.parent;
116060
+ }
116061
+ return false;
116062
+ }
116063
+ function isContainerNode(node) {
116064
+ return /(?:class|struct|interface|object|protocol|namespace|module)/.test(node.type);
116065
+ }
116066
+ function isMemberLikeNode(node) {
116067
+ return /(?:method|function)_declaration|function_definition/.test(node.type);
116068
+ }
116069
+ function isUppercasePublic(name) {
116070
+ return /^[A-Z]/.test(name);
116071
+ }
116072
+ function isIdentifier(value) {
116073
+ return /^[A-Za-z_$][\w$]*$/.test(value);
116074
+ }
116075
+ function maskCommentsAndStrings(source) {
116076
+ const chars = [...source];
116077
+ let i = 0;
116078
+ while (i < chars.length) {
116079
+ const ch = chars[i];
116080
+ const next = chars[i + 1];
116081
+ if (ch === "/" && next === "/") {
116082
+ chars[i++] = " ";
116083
+ chars[i++] = " ";
116084
+ while (i < chars.length && chars[i] !== `
116085
+ `)
116086
+ chars[i++] = " ";
116087
+ continue;
116088
+ }
116089
+ if (ch === "/" && next === "*") {
116090
+ chars[i++] = " ";
116091
+ chars[i++] = " ";
116092
+ while (i < chars.length) {
116093
+ const end = chars[i] === "*" && chars[i + 1] === "/";
116094
+ chars[i++] = " ";
116095
+ if (end) {
116096
+ chars[i++] = " ";
116097
+ break;
116098
+ }
116099
+ }
116100
+ continue;
116101
+ }
116102
+ if (ch === '"' || ch === "'" || ch === "`") {
116103
+ const quote = ch;
116104
+ chars[i++] = " ";
116105
+ while (i < chars.length) {
116106
+ if (chars[i] === "\\") {
116107
+ chars[i++] = " ";
116108
+ if (i < chars.length)
116109
+ chars[i++] = " ";
116110
+ continue;
116111
+ }
116112
+ const done = chars[i] === quote;
116113
+ chars[i++] = " ";
116114
+ if (done)
116115
+ break;
116116
+ }
116117
+ continue;
116118
+ }
116119
+ i++;
116120
+ }
116121
+ return chars.join("");
116122
+ }
116123
+
115822
116124
  // src/lang/symbol-graph.ts
115823
116125
  var _QueryCtor = null;
115824
116126
  var AST_TIMEOUT_MS = 500;
@@ -116198,6 +116500,8 @@ function buildFacts(tree, qs, grammarId) {
116198
116500
  if (cap)
116199
116501
  exportNodes.push(asTs(cap.node));
116200
116502
  }
116503
+ const commonJsExports = isEsMGrammar(grammarId) ? collectCommonJsExports(root.text) : new Map;
116504
+ const pythonAllNames = grammarId === "python" ? collectPythonAllNames(root.text) : null;
116201
116505
  const defs = [];
116202
116506
  const defNodes = [];
116203
116507
  const defNameKeys = new Set;
@@ -116208,10 +116512,11 @@ function buildFacts(tree, qs, grammarId) {
116208
116512
  continue;
116209
116513
  const kindKey = defCap.name.replace(/\.def$/, "");
116210
116514
  const kind = CAPTURE_KIND[kindKey] ?? "function";
116211
- let defNode = asTs(defCap.node);
116212
- const exported = exportNodes.some((en) => isNodeInside(en, defNode));
116515
+ const originalDefNode = asTs(defCap.node);
116516
+ let defNode = originalDefNode;
116517
+ const explicitExported = exportNodes.some((en) => isNodeInside(en, defNode));
116213
116518
  let isDefaultExport = false;
116214
- if (exported && isEsMGrammar(grammarId)) {
116519
+ if (explicitExported && isEsMGrammar(grammarId)) {
116215
116520
  isDefaultExport = exportNodes.some((en) => isNodeInside(en, defNode) && isDefaultExportStatement(en));
116216
116521
  }
116217
116522
  if (grammarId === "dart" && defNode.type === "function_signature") {
@@ -116230,11 +116535,24 @@ function buildFacts(tree, qs, grammarId) {
116230
116535
  for (const nc of nameCaps) {
116231
116536
  const nameNode = asTs(nc.node);
116232
116537
  const localName = nameNode.text;
116233
- const exportedName = isDefaultExport ? "default" : localName;
116538
+ const commonJsExport = commonJsExports.get(localName);
116539
+ const visibilityInfo = getSymbolVisibilityInfo({
116540
+ grammarId,
116541
+ localName,
116542
+ kind,
116543
+ defNode: originalDefNode,
116544
+ rootNode: root,
116545
+ isTopLevel: isTopLevelDef(originalDefNode, root),
116546
+ explicitExported,
116547
+ commonJsExport,
116548
+ pythonAllNames
116549
+ });
116550
+ const exportedName = isDefaultExport ? "default" : commonJsExport?.exportedName ?? localName;
116234
116551
  defs.push({
116235
116552
  name: exportedName,
116236
116553
  kind,
116237
- exported,
116554
+ exported: visibilityInfo.exported,
116555
+ visibilityInfo,
116238
116556
  startLine: defNode.startPosition.row + 1,
116239
116557
  endLine: defNode.endPosition.row + 1
116240
116558
  });
@@ -1,8 +1,10 @@
1
+ import { type SymbolVisibilityInfo } from './symbol-visibility';
1
2
  export interface FileSymbolFacts {
2
3
  defs: Array<{
3
4
  name: string;
4
5
  kind: 'function' | 'class' | 'const' | 'type' | 'interface' | 'enum' | 'method';
5
6
  exported: boolean;
7
+ visibilityInfo?: SymbolVisibilityInfo;
6
8
  startLine: number;
7
9
  endLine: number;
8
10
  }>;
@@ -0,0 +1,38 @@
1
+ export declare const SYMBOL_VISIBILITY_VALUES: readonly ["public", "internal", "protected", "private", "package", "unknown"];
2
+ export type SymbolVisibility = (typeof SYMBOL_VISIBILITY_VALUES)[number];
3
+ export declare const SYMBOL_EXPORTED_REASON_VALUES: readonly ["explicit_export", "top_level_public", "naming_convention", "modifier", "header_declaration", "namespace_public", "module_public", "unknown"];
4
+ export type SymbolExportedReason = (typeof SYMBOL_EXPORTED_REASON_VALUES)[number];
5
+ export declare const SYMBOL_API_SURFACE_KIND_VALUES: readonly ["export", "public", "entrypoint", "test", "private", "unknown"];
6
+ export type SymbolApiSurfaceKind = (typeof SYMBOL_API_SURFACE_KIND_VALUES)[number];
7
+ export interface SymbolVisibilityInfo {
8
+ exported: boolean;
9
+ visibility: SymbolVisibility;
10
+ exportedReason: SymbolExportedReason;
11
+ apiSurfaceKind: SymbolApiSurfaceKind;
12
+ }
13
+ export interface SymbolVisibilityNode {
14
+ type: string;
15
+ text: string;
16
+ parent: SymbolVisibilityNode | null;
17
+ children: Array<SymbolVisibilityNode | null>;
18
+ }
19
+ export interface CommonJsExportInfo {
20
+ localName: string;
21
+ exportedName: string;
22
+ exportedReason: 'explicit_export';
23
+ sourceIndex: number;
24
+ }
25
+ export interface SymbolVisibilityContext {
26
+ grammarId: string;
27
+ localName: string;
28
+ kind: 'function' | 'class' | 'const' | 'type' | 'interface' | 'enum' | 'method';
29
+ defNode: SymbolVisibilityNode;
30
+ rootNode: SymbolVisibilityNode;
31
+ isTopLevel: boolean;
32
+ explicitExported: boolean;
33
+ commonJsExport?: CommonJsExportInfo;
34
+ pythonAllNames?: Set<string> | null;
35
+ }
36
+ export declare function collectCommonJsExports(source: string): Map<string, CommonJsExportInfo>;
37
+ export declare function collectPythonAllNames(source: string): Set<string> | null;
38
+ export declare function getSymbolVisibilityInfo(ctx: SymbolVisibilityContext): SymbolVisibilityInfo;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-swarm",
3
- "version": "7.101.0",
3
+ "version": "7.102.0",
4
4
  "description": "Architect-centric agentic swarm plugin for OpenCode - hub-and-spoke orchestration with SME consultation, code generation, and QA review",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",