@vibgrate/cli 2026.817.1 → 2026.817.2

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 (131) hide show
  1. package/DOCS.md +61 -0
  2. package/README.md +1 -0
  3. package/dist/agent-UQC7QN77.js +27 -0
  4. package/dist/{agent-CUYQKC6S.js.map → agent-UQC7QN77.js.map} +1 -1
  5. package/dist/{approvals-IPMUDEDV.js → approvals-ASPJQUZK.js} +6 -5
  6. package/dist/{approvals-IPMUDEDV.js.map → approvals-ASPJQUZK.js.map} +1 -1
  7. package/dist/baseline-FIV6PR2M.js +9 -0
  8. package/dist/{baseline-NZFGLMER.js.map → baseline-FIV6PR2M.js.map} +1 -1
  9. package/dist/{chunk-4W5SYK2M.js → chunk-2FEB5KJS.js} +3 -3
  10. package/dist/{chunk-4W5SYK2M.js.map → chunk-2FEB5KJS.js.map} +1 -1
  11. package/dist/{chunk-MIYXVY57.js → chunk-3FMRFECC.js} +4 -4
  12. package/dist/{chunk-MIYXVY57.js.map → chunk-3FMRFECC.js.map} +1 -1
  13. package/dist/{chunk-NQUWC2IA.js → chunk-3H3SVJUY.js} +4 -4
  14. package/dist/{chunk-NQUWC2IA.js.map → chunk-3H3SVJUY.js.map} +1 -1
  15. package/dist/{chunk-UBEVY5UT.js → chunk-3NJUOIZQ.js} +5 -5
  16. package/dist/{chunk-UBEVY5UT.js.map → chunk-3NJUOIZQ.js.map} +1 -1
  17. package/dist/{chunk-3GZSDY35.js → chunk-5OL2TSHK.js} +4 -4
  18. package/dist/{chunk-3GZSDY35.js.map → chunk-5OL2TSHK.js.map} +1 -1
  19. package/dist/{chunk-2BURPMYA.js → chunk-6K3XK7C5.js} +69 -976
  20. package/dist/chunk-6K3XK7C5.js.map +1 -0
  21. package/dist/{chunk-2GSMCOIC.js → chunk-AXZZ5CCG.js} +4 -4
  22. package/dist/{chunk-2GSMCOIC.js.map → chunk-AXZZ5CCG.js.map} +1 -1
  23. package/dist/{chunk-NHB53JTV.js → chunk-C3LMWZKF.js} +3 -3
  24. package/dist/{chunk-NHB53JTV.js.map → chunk-C3LMWZKF.js.map} +1 -1
  25. package/dist/{chunk-FD2HPGX2.js → chunk-DVW3SVCW.js} +9 -8
  26. package/dist/chunk-DVW3SVCW.js.map +1 -0
  27. package/dist/{chunk-RJCRWQNS.js → chunk-E2FAQREZ.js} +164 -221
  28. package/dist/chunk-E2FAQREZ.js.map +1 -0
  29. package/dist/{chunk-45AKSS4A.js → chunk-EXV4QSAD.js} +4 -4
  30. package/dist/{chunk-45AKSS4A.js.map → chunk-EXV4QSAD.js.map} +1 -1
  31. package/dist/{chunk-OWSXI3PJ.js → chunk-GOGMS3ST.js} +5 -5
  32. package/dist/{chunk-OWSXI3PJ.js.map → chunk-GOGMS3ST.js.map} +1 -1
  33. package/dist/{chunk-YL4OIUA5.js → chunk-K6DXETMC.js} +11 -11
  34. package/dist/{chunk-YL4OIUA5.js.map → chunk-K6DXETMC.js.map} +1 -1
  35. package/dist/{chunk-NKRWKCME.js → chunk-KJT2R6WW.js} +4 -4
  36. package/dist/{chunk-NKRWKCME.js.map → chunk-KJT2R6WW.js.map} +1 -1
  37. package/dist/{chunk-FMS6G67U.js → chunk-KNGAZDGF.js} +5 -5
  38. package/dist/{chunk-FMS6G67U.js.map → chunk-KNGAZDGF.js.map} +1 -1
  39. package/dist/{chunk-JHLCKMKF.js → chunk-LHKQGVRF.js} +9 -8
  40. package/dist/chunk-LHKQGVRF.js.map +1 -0
  41. package/dist/{chunk-A7EKFLAN.js → chunk-M7IO3DXH.js} +9 -8
  42. package/dist/chunk-M7IO3DXH.js.map +1 -0
  43. package/dist/{chunk-QPXVTQ7O.js → chunk-MVPRPSXU.js} +7 -4
  44. package/dist/chunk-MVPRPSXU.js.map +1 -0
  45. package/dist/{chunk-DT4KIVRI.js → chunk-NG4KIJW6.js} +34 -2
  46. package/dist/chunk-NG4KIJW6.js.map +1 -0
  47. package/dist/{chunk-K267DHCF.js → chunk-O2DL2Q55.js} +6 -6
  48. package/dist/{chunk-K267DHCF.js.map → chunk-O2DL2Q55.js.map} +1 -1
  49. package/dist/chunk-O3LABX6I.js +43 -0
  50. package/dist/chunk-O3LABX6I.js.map +1 -0
  51. package/dist/chunk-PRG2ULPK.js +6 -0
  52. package/dist/{chunk-PV76EO4G.js.map → chunk-PRG2ULPK.js.map} +1 -1
  53. package/dist/{chunk-ZSECAGSU.js → chunk-Q3M6K3HY.js} +3 -3
  54. package/dist/{chunk-ZSECAGSU.js.map → chunk-Q3M6K3HY.js.map} +1 -1
  55. package/dist/{chunk-2TJ5EY4I.js → chunk-Q4G2BWE3.js} +4 -4
  56. package/dist/{chunk-2TJ5EY4I.js.map → chunk-Q4G2BWE3.js.map} +1 -1
  57. package/dist/chunk-T7RSQ5WD.js +227 -0
  58. package/dist/chunk-T7RSQ5WD.js.map +1 -0
  59. package/dist/{chunk-RQAKBRAV.js → chunk-TVDMNIUT.js} +3 -3
  60. package/dist/{chunk-RQAKBRAV.js.map → chunk-TVDMNIUT.js.map} +1 -1
  61. package/dist/{chunk-ANYL7SUI.js → chunk-WAKP7SK7.js} +4584 -976
  62. package/dist/chunk-WAKP7SK7.js.map +1 -0
  63. package/dist/{chunk-ENFSSUNK.js → chunk-WVMOGIPC.js} +5 -43
  64. package/dist/chunk-WVMOGIPC.js.map +1 -0
  65. package/dist/{chunk-6NOGNOE4.js → chunk-XLXJC7H3.js} +141 -13
  66. package/dist/chunk-XLXJC7H3.js.map +1 -0
  67. package/dist/cli.js +1476 -575
  68. package/dist/cli.js.map +1 -1
  69. package/dist/{daemon-J2HX4GY3.js → daemon-FPTRHO5N.js} +11 -10
  70. package/dist/{daemon-J2HX4GY3.js.map → daemon-FPTRHO5N.js.map} +1 -1
  71. package/dist/embed-worker-main.js +5 -4
  72. package/dist/embed-worker-main.js.map +1 -1
  73. package/dist/ensure-map-342G2IV3.js +33 -0
  74. package/dist/{ensure-map-5C6KG66X.js.map → ensure-map-342G2IV3.js.map} +1 -1
  75. package/dist/{fs-NTQUFCXV.js → fs-TLPOWC2D.js} +3 -3
  76. package/dist/fs-TLPOWC2D.js.map +1 -0
  77. package/dist/graph-backend-RNWQBT3P.js +15 -0
  78. package/dist/{graph-backend-HH5IIQ55.js.map → graph-backend-RNWQBT3P.js.map} +1 -1
  79. package/dist/index.d.ts +22 -3
  80. package/dist/index.js +18 -17
  81. package/dist/index.js.map +1 -1
  82. package/dist/{interactive-FXPAZAUJ.js → interactive-SR7TMF6M.js} +28 -27
  83. package/dist/interactive-SR7TMF6M.js.map +1 -0
  84. package/dist/load-AYFECIQB.js +11 -0
  85. package/dist/{load-OR2XVGAV.js.map → load-AYFECIQB.js.map} +1 -1
  86. package/dist/parse-worker.d.ts +1 -1
  87. package/dist/parse-worker.js +5 -2
  88. package/dist/parse-worker.js.map +1 -1
  89. package/dist/{run-outcome-M4546HLJ.js → run-outcome-YQQJG3LW.js} +7 -6
  90. package/dist/run-outcome-YQQJG3LW.js.map +1 -0
  91. package/dist/runtime-session-CNJ4DAV5.js +22 -0
  92. package/dist/{runtime-session-6KKMFS6Q.js.map → runtime-session-CNJ4DAV5.js.map} +1 -1
  93. package/dist/session-H34HUV2Y.js +17 -0
  94. package/dist/{session-HCFJUSKN.js.map → session-H34HUV2Y.js.map} +1 -1
  95. package/dist/{stream-json-4DL65D6U.js → stream-json-55YDNAFX.js} +15 -14
  96. package/dist/stream-json-55YDNAFX.js.map +1 -0
  97. package/dist/{types-8SYlXhzm.d.ts → types-DHqH0XIE.d.ts} +11 -0
  98. package/dist/version-WSE3QOPK.js +4 -0
  99. package/dist/{version-UPIC3F4P.js.map → version-WSE3QOPK.js.map} +1 -1
  100. package/dist/{vg-mcp-bridge-FZGX6DYO.js → vg-mcp-bridge-2CNLHNEL.js} +13 -12
  101. package/dist/vg-mcp-bridge-2CNLHNEL.js.map +1 -0
  102. package/dist/{vgd-QR26FAZD.js → vgd-URUZQORN.js} +10 -9
  103. package/dist/vgd-URUZQORN.js.map +1 -0
  104. package/package.json +7 -7
  105. package/dist/agent-CUYQKC6S.js +0 -26
  106. package/dist/baseline-NZFGLMER.js +0 -9
  107. package/dist/chunk-2BURPMYA.js.map +0 -1
  108. package/dist/chunk-6NOGNOE4.js.map +0 -1
  109. package/dist/chunk-A7EKFLAN.js.map +0 -1
  110. package/dist/chunk-ANYL7SUI.js.map +0 -1
  111. package/dist/chunk-DT4KIVRI.js.map +0 -1
  112. package/dist/chunk-ENFSSUNK.js.map +0 -1
  113. package/dist/chunk-FD2HPGX2.js.map +0 -1
  114. package/dist/chunk-JHLCKMKF.js.map +0 -1
  115. package/dist/chunk-PV76EO4G.js +0 -6
  116. package/dist/chunk-QPXVTQ7O.js.map +0 -1
  117. package/dist/chunk-RJCRWQNS.js.map +0 -1
  118. package/dist/chunk-RXP66R2E.js +0 -39
  119. package/dist/chunk-RXP66R2E.js.map +0 -1
  120. package/dist/ensure-map-5C6KG66X.js +0 -32
  121. package/dist/fs-NTQUFCXV.js.map +0 -1
  122. package/dist/graph-backend-HH5IIQ55.js +0 -14
  123. package/dist/interactive-FXPAZAUJ.js.map +0 -1
  124. package/dist/load-OR2XVGAV.js +0 -10
  125. package/dist/run-outcome-M4546HLJ.js.map +0 -1
  126. package/dist/runtime-session-6KKMFS6Q.js +0 -21
  127. package/dist/session-HCFJUSKN.js +0 -16
  128. package/dist/stream-json-4DL65D6U.js.map +0 -1
  129. package/dist/version-UPIC3F4P.js +0 -4
  130. package/dist/vg-mcp-bridge-FZGX6DYO.js.map +0 -1
  131. package/dist/vgd-QR26FAZD.js.map +0 -1
@@ -0,0 +1,227 @@
1
+ // src/core-open/utils/redact.ts
2
+ var SECRET_PATTERNS = [
3
+ // Vendor token prefixes (GitHub, GitLab, Slack, OpenAI/Stripe-style, npm, AWS).
4
+ /\b(?:gh[opusr]_|github_pat_)[A-Za-z0-9_]{8,}\b/g,
5
+ /\bglpat-[A-Za-z0-9_-]{8,}\b/g,
6
+ /\bxox[baprs]-[A-Za-z0-9-]{8,}\b/g,
7
+ /\bsk-[A-Za-z0-9_-]{8,}\b/gi,
8
+ /\b[sr]k_(?:live|test)_[A-Za-z0-9]{8,}\b/g,
9
+ /\bnpm_[A-Za-z0-9]{16,}\b/g,
10
+ /\b(?:AKIA|ASIA)[0-9A-Z]{12,}\b/g,
11
+ // JWTs.
12
+ /\beyJ[\w-]{8,}\.[\w-]{8,}\.[\w-]+\b/g,
13
+ // Authorization material.
14
+ /\b(?:Bearer|Basic|VibgrateDSN)\s+[A-Za-z0-9+/._:=-]{8,}/g,
15
+ /\b(?:authorization|api[_-]?key|apikey|access[_-]?token|client[_-]?secret|password|passwd|secret)\s*[:=]\s*['"]?[^'"\s]{6,}/gi,
16
+ // PEM blocks.
17
+ /-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?(?:-----END [A-Z ]*PRIVATE KEY-----|$)/g,
18
+ // Long base64/hex blobs (AWS secret keys and friends).
19
+ /\b[A-Za-z0-9+/]{40,}={0,2}\b/g
20
+ ];
21
+ var REDACTED = "[REDACTED]";
22
+ function redactSecrets(text) {
23
+ let out = text;
24
+ for (const re of SECRET_PATTERNS) out = out.replace(re, REDACTED);
25
+ return out;
26
+ }
27
+ var CREDENTIAL_QUERY_KEYS = /^(?:access[_-]?token|private[_-]?token|api[_-]?key|apikey|token|secret|password|passwd|auth|authorization|x-token|sig|signature|key)$/i;
28
+ function redactUrlCredentials(url) {
29
+ const noUser = url.replace(/\/\/[^@/]+@/, "//");
30
+ const q2 = noUser.indexOf("?");
31
+ if (q2 === -1) return noUser;
32
+ const base = noUser.slice(0, q2);
33
+ const kept = noUser.slice(q2 + 1).split("&").filter((pair) => !CREDENTIAL_QUERY_KEYS.test(pair.split("=")[0] ?? ""));
34
+ return kept.length ? `${base}?${kept.join("&")}` : base;
35
+ }
36
+
37
+ // src/core-open/scanners/architecture/packs/ast-role-catalog.ts
38
+ function q(languages, query, needle, role, layer, confidence, signal) {
39
+ return { languages, query, needle, role, layer, confidence, signal };
40
+ }
41
+ var JAVA = ["java"];
42
+ var CS = ["cs"];
43
+ var PY = ["py"];
44
+ var GO = ["go"];
45
+ var TS = ["ts", "tsx", "js"];
46
+ var JAVA_ANN = (name, role, layer, signal) => q(
47
+ JAVA,
48
+ [
49
+ `(marker_annotation name: (identifier) @hit (#eq? @hit "${name}"))`,
50
+ `(annotation name: (identifier) @hit (#eq? @hit "${name}"))`,
51
+ `(marker_annotation name: (scoped_identifier name: (identifier) @hit (#eq? @hit "${name}")))`
52
+ ].join("\n"),
53
+ `@${name}`,
54
+ role,
55
+ layer,
56
+ 0.9,
57
+ signal
58
+ );
59
+ var JAVA_AST_ROLES = Object.freeze([
60
+ JAVA_ANN("RestController", "controller", "routing", "java @RestController"),
61
+ JAVA_ANN("Controller", "controller", "routing", "java @Controller"),
62
+ JAVA_ANN("Service", "service", "services", "java @Service"),
63
+ JAVA_ANN("Repository", "repository", "data-access", "java @Repository"),
64
+ JAVA_ANN("Entity", "entity", "domain", "java @Entity")
65
+ ]);
66
+ var SPRING_AST_ROLES = JAVA_AST_ROLES;
67
+ var DOTNET_AST_ROLES = Object.freeze([
68
+ q(
69
+ CS,
70
+ [
71
+ `(attribute name: (identifier) @hit (#eq? @hit "ApiController"))`,
72
+ `(attribute name: (qualified_name (identifier) @hit (#eq? @hit "ApiController")))`
73
+ ].join("\n"),
74
+ "[ApiController]",
75
+ "controller",
76
+ "routing",
77
+ 0.9,
78
+ "dotnet [ApiController]"
79
+ ),
80
+ q(
81
+ CS,
82
+ [
83
+ `(base_list (identifier) @hit (#eq? @hit "DbContext"))`,
84
+ `(base_list (generic_name (identifier) @hit (#eq? @hit "DbContext")))`
85
+ ].join("\n"),
86
+ "DbContext",
87
+ "repository",
88
+ "data-access",
89
+ 0.86,
90
+ "dotnet : DbContext"
91
+ ),
92
+ q(
93
+ CS,
94
+ [
95
+ `(base_list (identifier) @hit (#eq? @hit "IRequestHandler"))`,
96
+ `(base_list (generic_name (identifier) @hit (#eq? @hit "IRequestHandler")))`
97
+ ].join("\n"),
98
+ "IRequestHandler",
99
+ "handler",
100
+ "services",
101
+ 0.86,
102
+ "dotnet IRequestHandler"
103
+ )
104
+ ]);
105
+ var FASTAPI_AST_ROLES = Object.freeze([
106
+ q(
107
+ PY,
108
+ '(call function: (identifier) @hit (#eq? @hit "APIRouter"))',
109
+ "APIRouter(",
110
+ "router",
111
+ "routing",
112
+ 0.88,
113
+ "fastapi APIRouter()"
114
+ )
115
+ ]);
116
+ var DJANGO_AST_ROLES = Object.freeze([
117
+ q(
118
+ PY,
119
+ '(assignment left: (identifier) @hit (#eq? @hit "urlpatterns"))',
120
+ "urlpatterns",
121
+ "router",
122
+ "routing",
123
+ 0.9,
124
+ "django urlpatterns"
125
+ ),
126
+ q(
127
+ PY,
128
+ [
129
+ '(class_definition superclasses: (argument_list (attribute object: (identifier) @obj attribute: (identifier) @hit (#eq? @obj "models") (#eq? @hit "Model"))))',
130
+ '(class_definition superclasses: (argument_list (identifier) @hit (#eq? @hit "Model")))'
131
+ ].join("\n"),
132
+ "models.Model",
133
+ "entity",
134
+ "domain",
135
+ 0.88,
136
+ "django models.Model"
137
+ )
138
+ ]);
139
+ var GO_AST_ROLES = Object.freeze([
140
+ q(
141
+ GO,
142
+ '(method_declaration name: (field_identifier) @hit (#eq? @hit "ServeHTTP"))',
143
+ "ServeHTTP",
144
+ "handler",
145
+ "routing",
146
+ 0.9,
147
+ "go ServeHTTP"
148
+ ),
149
+ q(
150
+ GO,
151
+ '(call_expression function: (selector_expression field: (field_identifier) @hit (#eq? @hit "NewRouter")))',
152
+ "chi.NewRouter",
153
+ "router",
154
+ "routing",
155
+ 0.86,
156
+ "go chi.NewRouter"
157
+ ),
158
+ q(
159
+ GO,
160
+ '(call_expression function: (selector_expression operand: (identifier) @hit (#eq? @hit "gin")))',
161
+ "gin.",
162
+ "router",
163
+ "routing",
164
+ 0.86,
165
+ "go gin"
166
+ )
167
+ ]);
168
+ var NESTJS_AST_ROLES = Object.freeze([
169
+ q(
170
+ TS,
171
+ [
172
+ '(decorator (identifier) @hit (#eq? @hit "Controller"))',
173
+ '(decorator (call_expression function: (identifier) @hit (#eq? @hit "Controller")))'
174
+ ].join("\n"),
175
+ "@Controller(",
176
+ "controller",
177
+ "routing",
178
+ 0.9,
179
+ "nestjs @Controller("
180
+ ),
181
+ q(
182
+ TS,
183
+ [
184
+ '(decorator (identifier) @hit (#eq? @hit "Injectable"))',
185
+ '(decorator (call_expression function: (identifier) @hit (#eq? @hit "Injectable")))'
186
+ ].join("\n"),
187
+ "@Injectable(",
188
+ "service",
189
+ "services",
190
+ 0.88,
191
+ "nestjs @Injectable("
192
+ )
193
+ ]);
194
+ function escapeRegExp(value) {
195
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
196
+ }
197
+ function sourceHasRoleNeedle(source, needle) {
198
+ if (!needle) return false;
199
+ if (needle.startsWith("@") || needle.startsWith("[")) {
200
+ return source.includes(needle);
201
+ }
202
+ if (needle.endsWith("(") || needle.endsWith(".")) {
203
+ return source.includes(needle);
204
+ }
205
+ const escaped = escapeRegExp(needle);
206
+ return new RegExp(`(^|[^A-Za-z0-9_])${escaped}([^A-Za-z0-9_]|$)`).test(source);
207
+ }
208
+ function catalogForLanguage(lang) {
209
+ return AST_ROLE_CATALOG.filter((q2) => q2.languages.includes(lang));
210
+ }
211
+ function withPack(packId, roles) {
212
+ return roles.map((role) => ({ ...role, packId }));
213
+ }
214
+ var AST_ROLE_CATALOG = Object.freeze([
215
+ ...withPack("language/java", JAVA_AST_ROLES),
216
+ ...withPack("framework/spring", SPRING_AST_ROLES),
217
+ ...withPack("language/cs", DOTNET_AST_ROLES),
218
+ ...withPack("framework/aspnet", DOTNET_AST_ROLES),
219
+ ...withPack("framework/fastapi", FASTAPI_AST_ROLES),
220
+ ...withPack("framework/django", DJANGO_AST_ROLES),
221
+ ...withPack("language/go", GO_AST_ROLES),
222
+ ...withPack("framework/nestjs", NESTJS_AST_ROLES)
223
+ ]);
224
+
225
+ export { DJANGO_AST_ROLES, DOTNET_AST_ROLES, FASTAPI_AST_ROLES, GO_AST_ROLES, JAVA_AST_ROLES, NESTJS_AST_ROLES, SPRING_AST_ROLES, catalogForLanguage, redactSecrets, redactUrlCredentials, sourceHasRoleNeedle };
226
+ //# sourceMappingURL=chunk-T7RSQ5WD.js.map
227
+ //# sourceMappingURL=chunk-T7RSQ5WD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core-open/utils/redact.ts","../src/core-open/scanners/architecture/packs/ast-role-catalog.ts"],"names":["q"],"mappings":"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","file":"chunk-T7RSQ5WD.js","sourcesContent":["// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\n/**\n * Shared credential redaction (GUARDRAILS §1.1): applied at INGEST, before\n * anything is stored or uploaded. One detector, reused by the VCS capture, the\n * graph builder (signatures/docs), and the push envelope — so every surface\n * scrubs the same shapes and a new token prefix is added in exactly one place.\n */\n\nconst SECRET_PATTERNS: RegExp[] = [\n // Vendor token prefixes (GitHub, GitLab, Slack, OpenAI/Stripe-style, npm, AWS).\n /\\b(?:gh[opusr]_|github_pat_)[A-Za-z0-9_]{8,}\\b/g,\n /\\bglpat-[A-Za-z0-9_-]{8,}\\b/g,\n /\\bxox[baprs]-[A-Za-z0-9-]{8,}\\b/g,\n /\\bsk-[A-Za-z0-9_-]{8,}\\b/gi,\n /\\b[sr]k_(?:live|test)_[A-Za-z0-9]{8,}\\b/g,\n /\\bnpm_[A-Za-z0-9]{16,}\\b/g,\n /\\b(?:AKIA|ASIA)[0-9A-Z]{12,}\\b/g,\n // JWTs.\n /\\beyJ[\\w-]{8,}\\.[\\w-]{8,}\\.[\\w-]+\\b/g,\n // Authorization material.\n /\\b(?:Bearer|Basic|VibgrateDSN)\\s+[A-Za-z0-9+/._:=-]{8,}/g,\n /\\b(?:authorization|api[_-]?key|apikey|access[_-]?token|client[_-]?secret|password|passwd|secret)\\s*[:=]\\s*['\"]?[^'\"\\s]{6,}/gi,\n // PEM blocks.\n /-----BEGIN [A-Z ]*PRIVATE KEY-----[\\s\\S]*?(?:-----END [A-Z ]*PRIVATE KEY-----|$)/g,\n // Long base64/hex blobs (AWS secret keys and friends).\n /\\b[A-Za-z0-9+/]{40,}={0,2}\\b/g,\n];\n\nexport const REDACTED = '[REDACTED]';\n\n/** Replace every credential-shaped substring with [REDACTED]. Deterministic. */\nexport function redactSecrets(text: string): string {\n let out = text;\n for (const re of SECRET_PATTERNS) out = out.replace(re, REDACTED);\n return out;\n}\n\n/** True when the text contains at least one credential-shaped substring. */\nexport function containsSecret(text: string): boolean {\n return SECRET_PATTERNS.some((re) => {\n re.lastIndex = 0;\n const hit = re.test(text);\n re.lastIndex = 0;\n return hit;\n });\n}\n\nconst CREDENTIAL_QUERY_KEYS =\n /^(?:access[_-]?token|private[_-]?token|api[_-]?key|apikey|token|secret|password|passwd|auth|authorization|x-token|sig|signature|key)$/i;\n\n/**\n * Strip credentials from a URL: userinfo (`//user:token@host`) AND\n * credential-bearing query parameters (`?access_token=…`, `?private_token=…`).\n * Non-URL strings pass through with just the userinfo strip applied.\n */\nexport function redactUrlCredentials(url: string): string {\n const noUser = url.replace(/\\/\\/[^@/]+@/, '//');\n const q = noUser.indexOf('?');\n if (q === -1) return noUser;\n const base = noUser.slice(0, q);\n const kept = noUser\n .slice(q + 1)\n .split('&')\n .filter((pair) => !CREDENTIAL_QUERY_KEYS.test(pair.split('=')[0] ?? ''));\n return kept.length ? `${base}?${kept.join('&')}` : base;\n}\n","// VENDORED from @vibgrate/core-open (packages/vibgrate-core-open) by\n// scripts/vendor-core-open.mjs. Do not edit here — change the source package\n// and re-run the vendor script. Apache-2.0.\nimport type { AstRoleQuery } from '../types.js';\n\n/**\n * Pack-scoped tree-sitter role queries. Data only — no parser runtime.\n *\n * `languages` uses graph/parse ids (`java`, `cs`, `py`, `go`, `ts`, `tsx`, `js`)\n * so the public-CLI extract can filter without remapping.\n */\n\nfunction q(\n languages: readonly string[],\n query: string,\n needle: string,\n role: AstRoleQuery['role'],\n layer: AstRoleQuery['layer'],\n confidence: number,\n signal: string,\n): AstRoleQuery {\n return { languages, query, needle, role, layer, confidence, signal };\n}\n\nconst JAVA = ['java'] as const;\nconst CS = ['cs'] as const;\nconst PY = ['py'] as const;\nconst GO = ['go'] as const;\nconst TS = ['ts', 'tsx', 'js'] as const;\n\nconst JAVA_ANN = (name: string, role: AstRoleQuery['role'], layer: AstRoleQuery['layer'], signal: string): AstRoleQuery =>\n q(\n JAVA,\n [\n `(marker_annotation name: (identifier) @hit (#eq? @hit \"${name}\"))`,\n `(annotation name: (identifier) @hit (#eq? @hit \"${name}\"))`,\n `(marker_annotation name: (scoped_identifier name: (identifier) @hit (#eq? @hit \"${name}\")))`,\n ].join('\\n'),\n `@${name}`,\n role,\n layer,\n 0.9,\n signal,\n );\n\nexport const JAVA_AST_ROLES: readonly AstRoleQuery[] = Object.freeze([\n JAVA_ANN('RestController', 'controller', 'routing', 'java @RestController'),\n JAVA_ANN('Controller', 'controller', 'routing', 'java @Controller'),\n JAVA_ANN('Service', 'service', 'services', 'java @Service'),\n JAVA_ANN('Repository', 'repository', 'data-access', 'java @Repository'),\n JAVA_ANN('Entity', 'entity', 'domain', 'java @Entity'),\n]);\n\nexport const SPRING_AST_ROLES: readonly AstRoleQuery[] = JAVA_AST_ROLES;\n\nexport const DOTNET_AST_ROLES: readonly AstRoleQuery[] = Object.freeze([\n q(\n CS,\n [\n `(attribute name: (identifier) @hit (#eq? @hit \"ApiController\"))`,\n `(attribute name: (qualified_name (identifier) @hit (#eq? @hit \"ApiController\")))`,\n ].join('\\n'),\n '[ApiController]',\n 'controller',\n 'routing',\n 0.9,\n 'dotnet [ApiController]',\n ),\n q(\n CS,\n [\n `(base_list (identifier) @hit (#eq? @hit \"DbContext\"))`,\n `(base_list (generic_name (identifier) @hit (#eq? @hit \"DbContext\")))`,\n ].join('\\n'),\n 'DbContext',\n 'repository',\n 'data-access',\n 0.86,\n 'dotnet : DbContext',\n ),\n q(\n CS,\n [\n `(base_list (identifier) @hit (#eq? @hit \"IRequestHandler\"))`,\n `(base_list (generic_name (identifier) @hit (#eq? @hit \"IRequestHandler\")))`,\n ].join('\\n'),\n 'IRequestHandler',\n 'handler',\n 'services',\n 0.86,\n 'dotnet IRequestHandler',\n ),\n]);\n\nexport const FASTAPI_AST_ROLES: readonly AstRoleQuery[] = Object.freeze([\n q(\n PY,\n '(call function: (identifier) @hit (#eq? @hit \"APIRouter\"))',\n 'APIRouter(',\n 'router',\n 'routing',\n 0.88,\n 'fastapi APIRouter()',\n ),\n]);\n\nexport const DJANGO_AST_ROLES: readonly AstRoleQuery[] = Object.freeze([\n q(\n PY,\n '(assignment left: (identifier) @hit (#eq? @hit \"urlpatterns\"))',\n 'urlpatterns',\n 'router',\n 'routing',\n 0.9,\n 'django urlpatterns',\n ),\n q(\n PY,\n [\n '(class_definition superclasses: (argument_list (attribute object: (identifier) @obj attribute: (identifier) @hit (#eq? @obj \"models\") (#eq? @hit \"Model\"))))',\n '(class_definition superclasses: (argument_list (identifier) @hit (#eq? @hit \"Model\")))',\n ].join('\\n'),\n 'models.Model',\n 'entity',\n 'domain',\n 0.88,\n 'django models.Model',\n ),\n]);\n\nexport const GO_AST_ROLES: readonly AstRoleQuery[] = Object.freeze([\n q(\n GO,\n '(method_declaration name: (field_identifier) @hit (#eq? @hit \"ServeHTTP\"))',\n 'ServeHTTP',\n 'handler',\n 'routing',\n 0.9,\n 'go ServeHTTP',\n ),\n q(\n GO,\n '(call_expression function: (selector_expression field: (field_identifier) @hit (#eq? @hit \"NewRouter\")))',\n 'chi.NewRouter',\n 'router',\n 'routing',\n 0.86,\n 'go chi.NewRouter',\n ),\n q(\n GO,\n '(call_expression function: (selector_expression operand: (identifier) @hit (#eq? @hit \"gin\")))',\n 'gin.',\n 'router',\n 'routing',\n 0.86,\n 'go gin',\n ),\n]);\n\nexport const NESTJS_AST_ROLES: readonly AstRoleQuery[] = Object.freeze([\n q(\n TS,\n [\n '(decorator (identifier) @hit (#eq? @hit \"Controller\"))',\n '(decorator (call_expression function: (identifier) @hit (#eq? @hit \"Controller\")))',\n ].join('\\n'),\n '@Controller(',\n 'controller',\n 'routing',\n 0.9,\n 'nestjs @Controller(',\n ),\n q(\n TS,\n [\n '(decorator (identifier) @hit (#eq? @hit \"Injectable\"))',\n '(decorator (call_expression function: (identifier) @hit (#eq? @hit \"Injectable\")))',\n ].join('\\n'),\n '@Injectable(',\n 'service',\n 'services',\n 0.88,\n 'nestjs @Injectable(',\n ),\n]);\n\nexport interface AstRoleCatalogEntry extends AstRoleQuery {\n packId: string;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/** True when `needle` occurs as a structural token in `source`. */\nexport function sourceHasRoleNeedle(source: string, needle: string): boolean {\n if (!needle) return false;\n if (needle.startsWith('@') || needle.startsWith('[')) {\n return source.includes(needle);\n }\n if (needle.endsWith('(') || needle.endsWith('.')) {\n return source.includes(needle);\n }\n const escaped = escapeRegExp(needle);\n return new RegExp(`(^|[^A-Za-z0-9_])${escaped}([^A-Za-z0-9_]|$)`).test(source);\n}\n\nexport function catalogForLanguage(lang: string): readonly AstRoleCatalogEntry[] {\n return AST_ROLE_CATALOG.filter((q) => q.languages.includes(lang));\n}\n\nfunction withPack(packId: string, roles: readonly AstRoleQuery[]): AstRoleCatalogEntry[] {\n return roles.map((role) => ({ ...role, packId }));\n}\n\n/** Flat catalog used by the public-CLI extract (and the tree-sitter-free matcher). */\nexport const AST_ROLE_CATALOG: readonly AstRoleCatalogEntry[] = Object.freeze([\n ...withPack('language/java', JAVA_AST_ROLES),\n ...withPack('framework/spring', SPRING_AST_ROLES),\n ...withPack('language/cs', DOTNET_AST_ROLES),\n ...withPack('framework/aspnet', DOTNET_AST_ROLES),\n ...withPack('framework/fastapi', FASTAPI_AST_ROLES),\n ...withPack('framework/django', DJANGO_AST_ROLES),\n ...withPack('language/go', GO_AST_ROLES),\n ...withPack('framework/nestjs', NESTJS_AST_ROLES),\n]);\n"]}
@@ -1,6 +1,6 @@
1
1
  import { vgdRequest } from './chunk-RBIRXQR6.js';
2
2
  import { resolveOne } from './chunk-J7LKEB2R.js';
3
- import { impactOf, queryGraph } from './chunk-2TJ5EY4I.js';
3
+ import { impactOf, queryGraph } from './chunk-Q4G2BWE3.js';
4
4
 
5
5
  // src/code/graph-backend.ts
6
6
  function localGraphBackend(graph) {
@@ -132,5 +132,5 @@ function resolveSymbolId(graph, symbol) {
132
132
  }
133
133
 
134
134
  export { localGraphBackend, resolveGraphBackend, vgdGraphBackend };
135
- //# sourceMappingURL=chunk-RQAKBRAV.js.map
136
- //# sourceMappingURL=chunk-RQAKBRAV.js.map
135
+ //# sourceMappingURL=chunk-TVDMNIUT.js.map
136
+ //# sourceMappingURL=chunk-TVDMNIUT.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/code/graph-backend.ts"],"names":[],"mappings":";;;;;AA2DO,SAAS,kBAAkB,KAAA,EAA8B;AAC9D,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,OAAA;AAAA,IACR,MAAM,MAAA,CAAO,KAAA,EAAO,IAAA,EAAM;AACxB,MAAA,MAAM,GAAA,GAAM,UAAA,CAAW,KAAA,EAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,IAAS,EAAA,EAAI,CAAA;AAC/E,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,OAAA;AAAA,QACR,OAAA,EAAS,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UAC/B,EAAA,EAAI,EAAE,IAAA,CAAK,EAAA;AAAA,UACX,aAAA,EAAe,EAAE,IAAA,CAAK,aAAA;AAAA,UACtB,IAAA,EAAM,EAAE,IAAA,CAAK,IAAA;AAAA,UACb,IAAA,EAAM,EAAE,IAAA,CAAK,IAAA;AAAA,UACb,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,IAAA,EAAM,KAAA,IAAS,CAAA;AAAA,UAC5B,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,KAAK,CAAA,CAAE,GAAA;AAAA,UACP,SAAA,EAAW,CAAA,CAAE,IAAA,CAAK,SAAA,IAAa;AAAA,SACjC,CAAE;AAAA,OACJ;AAAA,IACF,CAAA;AAAA,IACA,MAAM,MAAA,CAAO,MAAA,EAAQ,IAAA,EAAM;AACzB,MAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,KAAA,EAAO,MAAM,CAAA;AAC1C,MAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,MAAA,MAAM,GAAA,GAAM,SAAS,KAAA,EAAO,IAAA,EAAM,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,IAAS,CAAA,EAAG,CAAA;AAC7D,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,OAAA;AAAA,QACR,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,OAAO,GAAA,CAAI,KAAA;AAAA,QACX,QAAA,EAAU,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UACjC,IAAI,CAAA,CAAE,EAAA;AAAA,UACN,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,YAAY,CAAA,CAAE;AAAA,SAChB,CAAE,CAAA;AAAA,QACF,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,YAAY,GAAA,CAAI;AAAA,OAClB;AAAA,IACF;AAAA,GACF;AACF;AAeO,SAAS,gBAAgB,OAAA,EAA+C;AAC7E,EAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,OAAA,CAAQ,QAAQ,CAAA;AAChD,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,KAAY,CAAC,KAAK,IAAA,KAAS,UAAA,CAAW,KAAK,IAAI,CAAA,CAAA;AACvE,EAAA,MAAM,UAAA,GAA+B,EAAE,UAAA,EAAY,OAAA,CAAQ,UAAA,EAAW;AAEtE,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,KAAA;AAAA,IACR,MAAM,MAAA,CAAO,KAAA,EAAO,IAAA,EAAM;AACxB,MAAA,IAAI;AACF,QAAA,MAAM,MAAO,MAAM,OAAA;AAAA,UACjB;AAAA,YACE,EAAA,EAAI,aAAA;AAAA,YACJ,cAAc,OAAA,CAAQ,YAAA;AAAA,YACtB,KAAA;AAAA,YACA,KAAA,EAAO,MAAM,KAAA,IAAS,EAAA;AAAA,YACtB,QAAQ,OAAA,CAAQ;AAAA,WAClB;AAAA,UACA;AAAA,SACF;AAYA,QAAA,IAAI,KAAK,EAAA,IAAM,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AACzC,UAAA,OAAO;AAAA,YACL,MAAA,EAAQ,KAAA;AAAA,YACR,OAAA,EAAS,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,cAC/B,IAAI,CAAA,CAAE,EAAA;AAAA,cACN,eAAe,CAAA,CAAE,aAAA;AAAA,cACjB,MAAM,CAAA,CAAE,IAAA;AAAA,cACR,MAAM,CAAA,CAAE,IAAA;AAAA,cACR,MAAM,CAAA,CAAE,IAAA;AAAA,cACR,OAAO,CAAA,CAAE,KAAA;AAAA,cACT,KAAK,CAAA,CAAE,GAAA;AAAA,cACP,SAAA,EAAW;AAAA,aACb,CAAE;AAAA,WACJ;AAAA,QACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,OAAO,KAAA,CAAM,MAAA,CAAO,KAAA,EAAO,IAAI,CAAA;AAAA,IACjC,CAAA;AAAA,IACA,MAAM,MAAA,CAAO,MAAA,EAAQ,IAAA,EAAM;AACzB,MAAA,IAAI;AACF,QAAA,MAAM,MAAO,MAAM,OAAA;AAAA,UACjB;AAAA,YACE,EAAA,EAAI,WAAA;AAAA,YACJ,cAAc,OAAA,CAAQ,YAAA;AAAA,YACtB,MAAA;AAAA,YACA,KAAA,EAAO,MAAM,KAAA,IAAS,CAAA;AAAA,YACtB,QAAQ,OAAA,CAAQ;AAAA,WAClB;AAAA,UACA;AAAA,SACF;AAQA,QAAA,IAAI,GAAA,EAAK,MAAM,GAAA,CAAI,IAAA,IAAQ,MAAM,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,EAAG;AACtD,UAAA,OAAO;AAAA,YACL,MAAA,EAAQ,KAAA;AAAA,YACR,MAAM,GAAA,CAAI,IAAA;AAAA,YACV,KAAA,EAAO,GAAA,CAAI,KAAA,IAAS,IAAA,EAAM,KAAA,IAAS,CAAA;AAAA,YACnC,UAAU,GAAA,CAAI,QAAA;AAAA,YACd,MAAA,EAAQ,IAAI,MAAA,IAAU,CAAA;AAAA,YACtB,UAAA,EAAY,IAAI,UAAA,IAAc;AAAA,WAChC;AAAA,QACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,OAAO,KAAA,CAAM,MAAA,CAAO,MAAA,EAAQ,IAAI,CAAA;AAAA,IAClC;AAAA,GACF;AACF;AAKO,SAAS,oBAAoB,KAAA,EAKnB;AACf,EAAA,IAAI,KAAA,CAAM,YAAA,IAAgB,KAAA,CAAM,UAAA,EAAY;AAC1C,IAAA,OAAO,eAAA,CAAgB;AAAA,MACrB,cAAc,KAAA,CAAM,YAAA;AAAA,MACpB,MAAA,EAAQ,MAAM,MAAA,IAAU,MAAA;AAAA,MACxB,YAAY,KAAA,CAAM,UAAA;AAAA,MAClB,UAAU,KAAA,CAAM;AAAA,KACjB,CAAA;AAAA,EACH;AACA,EAAA,OAAO,iBAAA,CAAkB,MAAM,KAAK,CAAA;AACtC;AAEA,SAAS,eAAA,CAAgB,OAAgB,MAAA,EAA+B;AACtE,EAAA,IAAI,KAAA,CAAM,MAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,MAAM,CAAA,EAAG,OAAO,MAAA;AACrD,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,KAAA,EAAO,MAAM,CAAA;AACpC,EAAA,IAAI,GAAA,CAAI,IAAA,EAAM,EAAA,EAAI,OAAO,IAAI,IAAA,CAAK,EAAA;AAClC,EAAA,IAAI,GAAA,CAAI,UAAA,CAAW,MAAA,KAAW,CAAA,IAAK,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA,EAAG,EAAA,EAAI,OAAO,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA,CAAE,EAAA;AACnF,EAAA,MAAM,CAAA,GAAI,OAAO,WAAA,EAAY;AAC7B,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,aAAA,EAAe,WAAA,OAAkB,CAAA,IAAK,CAAA,CAAE,IAAA,EAAM,WAAA,OAAkB,CAAC,CAAA;AACxG,EAAA,OAAO,MAAM,EAAA,IAAM,IAAA;AACrB","file":"chunk-RQAKBRAV.js","sourcesContent":["/**\n * Graph query backend for the agent tool layer (Fusion Runtime).\n *\n * Tools prefer a warm ActiveGraph in vgd when a daemon session is attached;\n * otherwise they fall back to the in-process {@link VgGraph}. Failures never\n * surface to the model as transport errors — they degrade to local query.\n */\n\nimport { queryGraph } from '../engine/query.js';\nimport { impactOf } from '../engine/impact.js';\nimport { resolveOne } from '../engine/lookup.js';\nimport { vgdRequest, type VgdClientOptions } from '../runtime/vgd/client.js';\nimport type { VgdRequest } from '../runtime/vgd/protocol.js';\nimport type { VgGraph } from '../schema.js';\n\nexport type GraphBackendSource = 'local' | 'vgd';\n\nexport interface GraphSearchHit {\n id: string;\n qualifiedName: string;\n kind: string;\n file: string;\n line: number;\n score: number;\n why: string;\n signature?: string | null;\n}\n\nexport interface GraphImpactHit {\n id: string;\n name: string;\n kind: string;\n file: string;\n line: number;\n depth: number;\n confidence: number;\n}\n\nexport interface GraphImpactResult {\n root: { id: string; name: string };\n depth: number;\n affected: GraphImpactHit[];\n direct: number;\n transitive: number;\n source: GraphBackendSource;\n}\n\nexport interface GraphSearchResult {\n matches: GraphSearchHit[];\n source: GraphBackendSource;\n}\n\nexport interface GraphBackend {\n readonly source: GraphBackendSource;\n search(query: string, opts?: { limit?: number }): Promise<GraphSearchResult>;\n impact(symbol: string, opts?: { depth?: number }): Promise<GraphImpactResult | null>;\n}\n\n/** Pure in-process backend over a loaded graph. */\nexport function localGraphBackend(graph: VgGraph): GraphBackend {\n return {\n source: 'local',\n async search(query, opts) {\n const res = queryGraph(graph, query, { budget: 1500, limit: opts?.limit ?? 10 });\n return {\n source: 'local',\n matches: res.matches.map((m) => ({\n id: m.node.id,\n qualifiedName: m.node.qualifiedName,\n kind: m.node.kind,\n file: m.node.file,\n line: m.node.span?.start ?? 0,\n score: m.score,\n why: m.why,\n signature: m.node.signature ?? null,\n })),\n };\n },\n async impact(symbol, opts) {\n const node = resolveSymbolId(graph, symbol);\n if (!node) return null;\n const imp = impactOf(graph, node, { depth: opts?.depth ?? 4 });\n return {\n source: 'local',\n root: imp.root,\n depth: imp.depth,\n affected: imp.affected.map((a) => ({\n id: a.id,\n name: a.name,\n kind: a.kind,\n file: a.file,\n line: a.line,\n depth: a.depth,\n confidence: a.confidence,\n })),\n direct: imp.direct,\n transitive: imp.transitive,\n };\n },\n };\n}\n\nexport interface VgdGraphBackendOptions {\n repositoryId: string;\n gitRef?: string;\n socketPath?: string;\n /** Always required for fall back when vgd has no slot or is down. */\n fallback: VgGraph;\n request?: (req: VgdRequest, opts?: VgdClientOptions) => Promise<unknown>;\n}\n\n/**\n * Prefer vgd query/impact; on any failure or empty daemon state, use local.\n * The returned `source` reflects which path answered.\n */\nexport function vgdGraphBackend(options: VgdGraphBackendOptions): GraphBackend {\n const local = localGraphBackend(options.fallback);\n const request = options.request ?? ((req, opts) => vgdRequest(req, opts));\n const clientOpts: VgdClientOptions = { socketPath: options.socketPath };\n\n return {\n source: 'vgd',\n async search(query, opts) {\n try {\n const res = (await request(\n {\n op: 'query-graph',\n repositoryId: options.repositoryId,\n query,\n limit: opts?.limit ?? 10,\n gitRef: options.gitRef,\n },\n clientOpts,\n )) as {\n ok?: boolean;\n matches?: Array<{\n id: string;\n qualifiedName: string;\n kind: string;\n file: string;\n line: number;\n score: number;\n why: string;\n }>;\n };\n if (res?.ok && Array.isArray(res.matches)) {\n return {\n source: 'vgd',\n matches: res.matches.map((m) => ({\n id: m.id,\n qualifiedName: m.qualifiedName,\n kind: m.kind,\n file: m.file,\n line: m.line,\n score: m.score,\n why: m.why,\n signature: null,\n })),\n };\n }\n } catch {\n /* fall through */\n }\n return local.search(query, opts);\n },\n async impact(symbol, opts) {\n try {\n const res = (await request(\n {\n op: 'impact-of',\n repositoryId: options.repositoryId,\n symbol,\n depth: opts?.depth ?? 4,\n gitRef: options.gitRef,\n },\n clientOpts,\n )) as {\n ok?: boolean;\n root?: { id: string; name: string };\n depth?: number;\n affected?: GraphImpactHit[];\n direct?: number;\n transitive?: number;\n };\n if (res?.ok && res.root && Array.isArray(res.affected)) {\n return {\n source: 'vgd',\n root: res.root,\n depth: res.depth ?? opts?.depth ?? 4,\n affected: res.affected,\n direct: res.direct ?? 0,\n transitive: res.transitive ?? 0,\n };\n }\n } catch {\n /* fall through */\n }\n return local.impact(symbol, opts);\n },\n };\n}\n\n/**\n * Pick a backend: vgd when repositoryId + socket are known, else local.\n */\nexport function resolveGraphBackend(input: {\n graph: VgGraph;\n repositoryId?: string | null;\n gitRef?: string | null;\n socketPath?: string | null;\n}): GraphBackend {\n if (input.repositoryId && input.socketPath) {\n return vgdGraphBackend({\n repositoryId: input.repositoryId,\n gitRef: input.gitRef ?? undefined,\n socketPath: input.socketPath,\n fallback: input.graph,\n });\n }\n return localGraphBackend(input.graph);\n}\n\nfunction resolveSymbolId(graph: VgGraph, symbol: string): string | null {\n if (graph.nodes.some((n) => n.id === symbol)) return symbol;\n const hit = resolveOne(graph, symbol);\n if (hit.node?.id) return hit.node.id;\n if (hit.candidates.length === 1 && hit.candidates[0]?.id) return hit.candidates[0].id;\n const q = symbol.toLowerCase();\n const byQn = graph.nodes.find((n) => n.qualifiedName?.toLowerCase() === q || n.name?.toLowerCase() === q);\n return byQn?.id ?? null;\n}\n"]}
1
+ {"version":3,"sources":["../src/code/graph-backend.ts"],"names":[],"mappings":"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","file":"chunk-TVDMNIUT.js","sourcesContent":["/**\n * Graph query backend for the agent tool layer (Fusion Runtime).\n *\n * Tools prefer a warm ActiveGraph in vgd when a daemon session is attached;\n * otherwise they fall back to the in-process {@link VgGraph}. Failures never\n * surface to the model as transport errors — they degrade to local query.\n */\n\nimport { queryGraph } from '../engine/query.js';\nimport { impactOf } from '../engine/impact.js';\nimport { resolveOne } from '../engine/lookup.js';\nimport { vgdRequest, type VgdClientOptions } from '../runtime/vgd/client.js';\nimport type { VgdRequest } from '../runtime/vgd/protocol.js';\nimport type { VgGraph } from '../schema.js';\n\nexport type GraphBackendSource = 'local' | 'vgd';\n\nexport interface GraphSearchHit {\n id: string;\n qualifiedName: string;\n kind: string;\n file: string;\n line: number;\n score: number;\n why: string;\n signature?: string | null;\n}\n\nexport interface GraphImpactHit {\n id: string;\n name: string;\n kind: string;\n file: string;\n line: number;\n depth: number;\n confidence: number;\n}\n\nexport interface GraphImpactResult {\n root: { id: string; name: string };\n depth: number;\n affected: GraphImpactHit[];\n direct: number;\n transitive: number;\n source: GraphBackendSource;\n}\n\nexport interface GraphSearchResult {\n matches: GraphSearchHit[];\n source: GraphBackendSource;\n}\n\nexport interface GraphBackend {\n readonly source: GraphBackendSource;\n search(query: string, opts?: { limit?: number }): Promise<GraphSearchResult>;\n impact(symbol: string, opts?: { depth?: number }): Promise<GraphImpactResult | null>;\n}\n\n/** Pure in-process backend over a loaded graph. */\nexport function localGraphBackend(graph: VgGraph): GraphBackend {\n return {\n source: 'local',\n async search(query, opts) {\n const res = queryGraph(graph, query, { budget: 1500, limit: opts?.limit ?? 10 });\n return {\n source: 'local',\n matches: res.matches.map((m) => ({\n id: m.node.id,\n qualifiedName: m.node.qualifiedName,\n kind: m.node.kind,\n file: m.node.file,\n line: m.node.span?.start ?? 0,\n score: m.score,\n why: m.why,\n signature: m.node.signature ?? null,\n })),\n };\n },\n async impact(symbol, opts) {\n const node = resolveSymbolId(graph, symbol);\n if (!node) return null;\n const imp = impactOf(graph, node, { depth: opts?.depth ?? 4 });\n return {\n source: 'local',\n root: imp.root,\n depth: imp.depth,\n affected: imp.affected.map((a) => ({\n id: a.id,\n name: a.name,\n kind: a.kind,\n file: a.file,\n line: a.line,\n depth: a.depth,\n confidence: a.confidence,\n })),\n direct: imp.direct,\n transitive: imp.transitive,\n };\n },\n };\n}\n\nexport interface VgdGraphBackendOptions {\n repositoryId: string;\n gitRef?: string;\n socketPath?: string;\n /** Always required for fall back when vgd has no slot or is down. */\n fallback: VgGraph;\n request?: (req: VgdRequest, opts?: VgdClientOptions) => Promise<unknown>;\n}\n\n/**\n * Prefer vgd query/impact; on any failure or empty daemon state, use local.\n * The returned `source` reflects which path answered.\n */\nexport function vgdGraphBackend(options: VgdGraphBackendOptions): GraphBackend {\n const local = localGraphBackend(options.fallback);\n const request = options.request ?? ((req, opts) => vgdRequest(req, opts));\n const clientOpts: VgdClientOptions = { socketPath: options.socketPath };\n\n return {\n source: 'vgd',\n async search(query, opts) {\n try {\n const res = (await request(\n {\n op: 'query-graph',\n repositoryId: options.repositoryId,\n query,\n limit: opts?.limit ?? 10,\n gitRef: options.gitRef,\n },\n clientOpts,\n )) as {\n ok?: boolean;\n matches?: Array<{\n id: string;\n qualifiedName: string;\n kind: string;\n file: string;\n line: number;\n score: number;\n why: string;\n }>;\n };\n if (res?.ok && Array.isArray(res.matches)) {\n return {\n source: 'vgd',\n matches: res.matches.map((m) => ({\n id: m.id,\n qualifiedName: m.qualifiedName,\n kind: m.kind,\n file: m.file,\n line: m.line,\n score: m.score,\n why: m.why,\n signature: null,\n })),\n };\n }\n } catch {\n /* fall through */\n }\n return local.search(query, opts);\n },\n async impact(symbol, opts) {\n try {\n const res = (await request(\n {\n op: 'impact-of',\n repositoryId: options.repositoryId,\n symbol,\n depth: opts?.depth ?? 4,\n gitRef: options.gitRef,\n },\n clientOpts,\n )) as {\n ok?: boolean;\n root?: { id: string; name: string };\n depth?: number;\n affected?: GraphImpactHit[];\n direct?: number;\n transitive?: number;\n };\n if (res?.ok && res.root && Array.isArray(res.affected)) {\n return {\n source: 'vgd',\n root: res.root,\n depth: res.depth ?? opts?.depth ?? 4,\n affected: res.affected,\n direct: res.direct ?? 0,\n transitive: res.transitive ?? 0,\n };\n }\n } catch {\n /* fall through */\n }\n return local.impact(symbol, opts);\n },\n };\n}\n\n/**\n * Pick a backend: vgd when repositoryId + socket are known, else local.\n */\nexport function resolveGraphBackend(input: {\n graph: VgGraph;\n repositoryId?: string | null;\n gitRef?: string | null;\n socketPath?: string | null;\n}): GraphBackend {\n if (input.repositoryId && input.socketPath) {\n return vgdGraphBackend({\n repositoryId: input.repositoryId,\n gitRef: input.gitRef ?? undefined,\n socketPath: input.socketPath,\n fallback: input.graph,\n });\n }\n return localGraphBackend(input.graph);\n}\n\nfunction resolveSymbolId(graph: VgGraph, symbol: string): string | null {\n if (graph.nodes.some((n) => n.id === symbol)) return symbol;\n const hit = resolveOne(graph, symbol);\n if (hit.node?.id) return hit.node.id;\n if (hit.candidates.length === 1 && hit.candidates[0]?.id) return hit.candidates[0].id;\n const q = symbol.toLowerCase();\n const byQn = graph.nodes.find((n) => n.qualifiedName?.toLowerCase() === q || n.name?.toLowerCase() === q);\n return byQn?.id ?? null;\n}\n"]}