@wrongstack/tools 0.313.0 → 0.316.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 (182) hide show
  1. package/dist/_edit-match.d.ts +3 -2
  2. package/dist/_output-spool.d.ts +4 -3
  3. package/dist/_shell-pick.d.ts +2 -1
  4. package/dist/_spawn-stream.d.ts +2 -1
  5. package/dist/_syntax-check.d.ts +2 -1
  6. package/dist/audit.js +10 -4055
  7. package/dist/bash-kill-guard.d.ts +3 -6
  8. package/dist/bash.js +9 -2308
  9. package/dist/batch-tool-use.js +2 -187
  10. package/dist/browser/index.js +25 -1339
  11. package/dist/browser/network-guard-proxy.d.ts +2 -1
  12. package/dist/builtin.js +69 -33949
  13. package/dist/chunk-22B7GE5T.js +260 -0
  14. package/dist/chunk-2VSZC6QM.js +113 -0
  15. package/dist/chunk-3PVYQFRQ.js +472 -0
  16. package/dist/chunk-42BHI7TN.js +337 -0
  17. package/dist/chunk-4BHUSMNL.js +104 -0
  18. package/dist/chunk-4I4LWFOO.js +431 -0
  19. package/dist/chunk-4UESMQDP.js +122 -0
  20. package/dist/chunk-553IQUMO.js +478 -0
  21. package/dist/chunk-5H4GSJAI.js +223 -0
  22. package/dist/chunk-6RNIFLG4.js +305 -0
  23. package/dist/chunk-7EY5DCRO.js +434 -0
  24. package/dist/chunk-A6BRWIXN.js +317 -0
  25. package/dist/chunk-AHHDWNXC.js +200 -0
  26. package/dist/chunk-BSLVR56S.js +199 -0
  27. package/dist/chunk-BTSFTGIL.js +7 -0
  28. package/dist/chunk-D33S4RQG.js +222 -0
  29. package/dist/chunk-DA4KNE2H.js +4412 -0
  30. package/dist/chunk-DR7JOQTC.js +520 -0
  31. package/dist/chunk-EEOFQDT6.js +898 -0
  32. package/dist/chunk-EJWSCQ6D.js +137 -0
  33. package/dist/chunk-EMRGN4KM.js +170 -0
  34. package/dist/chunk-FQZOHLG3.js +89 -0
  35. package/dist/chunk-GOIZNNOA.js +221 -0
  36. package/dist/chunk-HFXSNKCV.js +196 -0
  37. package/dist/chunk-HYX2TZ7O.js +1272 -0
  38. package/dist/chunk-I64BS3VC.js +15 -0
  39. package/dist/chunk-IVWV2UM6.js +955 -0
  40. package/dist/chunk-IXMNTNW5.js +238 -0
  41. package/dist/chunk-IYK7XGDZ.js +892 -0
  42. package/dist/chunk-J5SKD6LN.js +235 -0
  43. package/dist/chunk-JNNVRHMV.js +2111 -0
  44. package/dist/chunk-JOHXDF3D.js +295 -0
  45. package/dist/chunk-JRJJX3L5.js +424 -0
  46. package/dist/chunk-K3WNSHUF.js +1371 -0
  47. package/dist/chunk-L25CVUVR.js +2830 -0
  48. package/dist/chunk-LIJQMYYX.js +59 -0
  49. package/dist/chunk-LWKUTMD5.js +197 -0
  50. package/dist/chunk-MQX2KXVW.js +54 -0
  51. package/dist/chunk-MZZN7VCD.js +359 -0
  52. package/dist/chunk-NBDZMMG2.js +169 -0
  53. package/dist/chunk-NKJW5GFO.js +366 -0
  54. package/dist/chunk-NKNOBUBU.js +522 -0
  55. package/dist/chunk-O4MBV4AX.js +134 -0
  56. package/dist/chunk-OUBDL3WH.js +3515 -0
  57. package/dist/chunk-PQKK5JH7.js +101 -0
  58. package/dist/chunk-PY2IOS7C.js +1000 -0
  59. package/dist/chunk-Q5JPPCZC.js +12 -0
  60. package/dist/chunk-QBV725YG.js +128 -0
  61. package/dist/chunk-QZQSPUBF.js +315 -0
  62. package/dist/chunk-RGISBZBD.js +231 -0
  63. package/dist/chunk-RJZQWEMS.js +84 -0
  64. package/dist/chunk-RXISBFR5.js +315 -0
  65. package/dist/chunk-S5CCLZL3.js +99 -0
  66. package/dist/chunk-SDLVH5RZ.js +178 -0
  67. package/dist/chunk-T2F4S7U4.js +1723 -0
  68. package/dist/chunk-TEBQ4VPZ.js +163 -0
  69. package/dist/chunk-U4D5S3VQ.js +21 -0
  70. package/dist/chunk-U4VAATKP.js +193 -0
  71. package/dist/chunk-UCYQTZ7F.js +113 -0
  72. package/dist/chunk-UKU2ZX4C.js +203 -0
  73. package/dist/chunk-UNSKG6DC.js +159 -0
  74. package/dist/chunk-V43EQ6VR.js +68 -0
  75. package/dist/chunk-VB3MJGCV.js +610 -0
  76. package/dist/chunk-VFKPWSOX.js +154 -0
  77. package/dist/chunk-VJNHFZ7J.js +190 -0
  78. package/dist/chunk-VXECAJJ7.js +1091 -0
  79. package/dist/chunk-WHIIIREL.js +223 -0
  80. package/dist/chunk-Z6DAKQ3U.js +1 -0
  81. package/dist/chunk-ZJQ4IGXK.js +474 -0
  82. package/dist/chunk-ZLTFLC25.js +385 -0
  83. package/dist/circuit-breaker.js +3 -191
  84. package/dist/codebase-index/ast-invariant-engine.d.ts +5 -4
  85. package/dist/codebase-index/binary-frame.d.ts +0 -2
  86. package/dist/codebase-index/bm25.d.ts +1 -1
  87. package/dist/codebase-index/circuit-breaker.d.ts +2 -1
  88. package/dist/codebase-index/codebase-ast-replace-tool.d.ts +3 -2
  89. package/dist/codebase-index/codebase-impact-analysis-tool.d.ts +4 -3
  90. package/dist/codebase-index/codebase-invariant-check-tool.d.ts +3 -2
  91. package/dist/codebase-index/codebase-repo-map-tool.d.ts +3 -2
  92. package/dist/codebase-index/codebase-skeleton-tool.d.ts +3 -2
  93. package/dist/codebase-index/codebase-targeted-test-tool.d.ts +3 -2
  94. package/dist/codebase-index/content-hash.d.ts +0 -2
  95. package/dist/codebase-index/import-extractor.d.ts +0 -13
  96. package/dist/codebase-index/index-service.d.ts +1 -1
  97. package/dist/codebase-index/index.js +84 -13688
  98. package/dist/codebase-index/languages.d.ts +2 -1
  99. package/dist/codebase-index/module-roots.d.ts +3 -2
  100. package/dist/codebase-index/parser-batch.d.ts +0 -5
  101. package/dist/codebase-index/parser-dispatch.d.ts +2 -1
  102. package/dist/codebase-index/parser-output.d.ts +4 -3
  103. package/dist/codebase-index/parser-worker-pool.d.ts +0 -2
  104. package/dist/codebase-index/parser-worker-script.d.ts +1 -16
  105. package/dist/codebase-index/parser-worker-script.js +8 -3995
  106. package/dist/codebase-index/project-server-client-state.d.ts +2 -2
  107. package/dist/codebase-index/project-server-endpoint.d.ts +0 -15
  108. package/dist/codebase-index/project-server.js +60 -8548
  109. package/dist/codebase-index/tree-sitter/visitor.d.ts +2 -1
  110. package/dist/codebase-index/tree-sitter-parser.d.ts +0 -2
  111. package/dist/codebase-index/ts-parser.d.ts +1 -1
  112. package/dist/codebase-index/vector-search.d.ts +2 -1
  113. package/dist/codebase-index/wal-maintenance.d.ts +3 -2
  114. package/dist/codebase-index/worker.js +20 -8416
  115. package/dist/codebase-index/writer-admin.d.ts +0 -1
  116. package/dist/codebase-index/writer-search.d.ts +0 -9
  117. package/dist/design.js +2 -299
  118. package/dist/diff.js +4 -256
  119. package/dist/document.js +4 -222
  120. package/dist/e2e.js +5 -476
  121. package/dist/edit.js +14 -10200
  122. package/dist/exec.js +16 -3131
  123. package/dist/fetch.js +8 -398
  124. package/dist/format.js +10 -3750
  125. package/dist/generic-parser-VUXDIAOZ.js +13 -0
  126. package/dist/git.js +4 -380
  127. package/dist/glob.js +6 -280
  128. package/dist/go-parser-JXYKJHRC.js +469 -0
  129. package/dist/grep.js +7 -604
  130. package/dist/index.js +318 -35387
  131. package/dist/install.js +10 -4091
  132. package/dist/json-parser-IBHZ4BZC.js +213 -0
  133. package/dist/json.js +4 -665
  134. package/dist/kanban-contract-actions.d.ts +1 -1
  135. package/dist/kanban-detail-actions.d.ts +2 -1
  136. package/dist/kanban-presence.d.ts +2 -1
  137. package/dist/kanban-serializer.d.ts +0 -8
  138. package/dist/kanban-split-task-handler.d.ts +2 -2
  139. package/dist/kanban-tool-types.d.ts +2 -1
  140. package/dist/kanban.js +3 -2096
  141. package/dist/languages/diagnostics.d.ts +2 -1
  142. package/dist/languages/index.js +23 -4664
  143. package/dist/languages/legacy-bridge.d.ts +3 -2
  144. package/dist/languages/types.d.ts +2 -1
  145. package/dist/legacy-bridge-7M6QLUQN.js +18 -0
  146. package/dist/lint.js +10 -3706
  147. package/dist/logs.js +4 -287
  148. package/dist/memory.js +6 -215
  149. package/dist/mode.js +3 -99
  150. package/dist/outdated.js +4 -5170
  151. package/dist/pack.js +65 -33897
  152. package/dist/parser-dispatch-QH4XPGG6.js +14 -0
  153. package/dist/patch.js +13 -9935
  154. package/dist/plan.js +5 -3286
  155. package/dist/process-registry.js +8 -651
  156. package/dist/ps-slash.js +12 -1439
  157. package/dist/pwsh.d.ts +0 -1
  158. package/dist/py-parser-IS4HKYMF.js +16 -0
  159. package/dist/read.js +13 -9816
  160. package/dist/replace.js +15 -10014
  161. package/dist/rs-parser-XHUUO2KZ.js +81 -0
  162. package/dist/scaffold.js +4 -253
  163. package/dist/search.js +5 -585
  164. package/dist/session-kanban-sync.d.ts +0 -6
  165. package/dist/session-kanban.js +30 -972
  166. package/dist/skill.js +2 -215
  167. package/dist/spawn-background.d.ts +1 -1
  168. package/dist/task.js +5 -3410
  169. package/dist/test.js +10 -3773
  170. package/dist/todo.js +4 -2891
  171. package/dist/tool-help.js +3 -123
  172. package/dist/tool-search.js +3 -79
  173. package/dist/tool-tier.js +68 -33984
  174. package/dist/tool-use.js +2 -93
  175. package/dist/tree-sitter-parser-AIERW3YI.js +15 -0
  176. package/dist/tree.js +4 -288
  177. package/dist/ts-parser-RCTYKSVI.js +232 -0
  178. package/dist/typecheck.js +10 -3753
  179. package/dist/win32.js +6 -60
  180. package/dist/write.js +14 -9882
  181. package/dist/yaml-parser-4SAXV3PL.js +157 -0
  182. package/package.json +5 -5
@@ -0,0 +1,469 @@
1
+ import {
2
+ parseParserOutput,
3
+ withSpawnGate
4
+ } from "./chunk-UCYQTZ7F.js";
5
+ import {
6
+ detectLang
7
+ } from "./chunk-TEBQ4VPZ.js";
8
+ import {
9
+ resolveWin32Command
10
+ } from "./chunk-V43EQ6VR.js";
11
+
12
+ // src/codebase-index/go-parser.ts
13
+ import { spawn } from "node:child_process";
14
+ import * as os from "node:os";
15
+ import * as path from "node:path";
16
+ import * as fs from "node:fs/promises";
17
+ async function parseSymbols(opts) {
18
+ const { file, content, lang } = opts;
19
+ try {
20
+ const parsed = await withSpawnGate(() => syncGoParse(file, content, lang));
21
+ if (parsed.symbols.length > 0) {
22
+ return parsed;
23
+ }
24
+ const fallback = fallbackParse(file, content, lang);
25
+ return parsed.refs?.length ? { ...fallback, refs: parsed.refs } : fallback;
26
+ } catch {
27
+ return fallbackParse(file, content, lang);
28
+ }
29
+ }
30
+ function fallbackParse(filePath, content, lang) {
31
+ if (!/^\s*package\s+[A-Za-z_]\w*/m.test(content) || hasUnbalancedDelimiters(content)) {
32
+ return { file: filePath, lang, symbols: [], mtimeMs: Date.now() };
33
+ }
34
+ const symbols = [];
35
+ const packageName = content.match(/^\s*package\s+([A-Za-z_]\w*)/m)?.[1] ?? "";
36
+ const lines = content.split(/\r?\n/);
37
+ for (const [idx, line] of lines.entries()) {
38
+ const trimmed = line.trimStart();
39
+ const col = line.length - trimmed.length + 1;
40
+ const fn = /^func\s+(?:\([^)]*\)\s*)?([A-Za-z_]\w*)\s*\(/.exec(trimmed);
41
+ if (fn?.[1]) {
42
+ addFallbackSymbol(symbols, {
43
+ filePath,
44
+ lang,
45
+ kind: trimmed.startsWith("func (") ? "method" : "function",
46
+ name: fn[1],
47
+ line: idx + 1,
48
+ col,
49
+ signature: trimmed,
50
+ scope: packageName ? `${packageName}.${fn[1]}` : fn[1]
51
+ });
52
+ continue;
53
+ }
54
+ const typeDecl = /^type\s+([A-Za-z_]\w*)\b/.exec(trimmed);
55
+ if (typeDecl?.[1]) {
56
+ addFallbackSymbol(symbols, {
57
+ filePath,
58
+ lang,
59
+ kind: "type",
60
+ name: typeDecl[1],
61
+ line: idx + 1,
62
+ col,
63
+ signature: trimmed,
64
+ scope: packageName
65
+ });
66
+ continue;
67
+ }
68
+ const valueDecl = /^(const|var)\s+([A-Za-z_]\w*)\b/.exec(trimmed);
69
+ if (valueDecl?.[1] && valueDecl[2]) {
70
+ addFallbackSymbol(symbols, {
71
+ filePath,
72
+ lang,
73
+ kind: valueDecl[1],
74
+ name: valueDecl[2],
75
+ line: idx + 1,
76
+ col,
77
+ signature: trimmed,
78
+ scope: packageName
79
+ });
80
+ }
81
+ }
82
+ return { file: filePath, lang, symbols, mtimeMs: Date.now() };
83
+ }
84
+ function addFallbackSymbol(symbols, opts) {
85
+ symbols.push({
86
+ id: 0,
87
+ lang: opts.lang,
88
+ kind: opts.kind,
89
+ name: opts.name,
90
+ file: opts.filePath,
91
+ line: opts.line,
92
+ col: opts.col,
93
+ signature: opts.signature,
94
+ docComment: "",
95
+ scope: opts.scope,
96
+ text: `${opts.name} ${opts.signature}`.trim()
97
+ });
98
+ }
99
+ function hasUnbalancedDelimiters(content) {
100
+ const pairs = { "(": ")", "[": "]", "{": "}" };
101
+ const closers = new Set(Object.values(pairs));
102
+ const stack = [];
103
+ for (const ch of content) {
104
+ if (pairs[ch]) {
105
+ stack.push(pairs[ch]);
106
+ } else if (closers.has(ch) && stack.pop() !== ch) {
107
+ return true;
108
+ }
109
+ }
110
+ return stack.length > 0;
111
+ }
112
+ var GO_PARSE_SCRIPT = `
113
+ package main
114
+
115
+ import (
116
+ "encoding/json"
117
+ "fmt"
118
+ "go/ast"
119
+ "go/parser"
120
+ "go/token"
121
+ "io"
122
+ "os"
123
+ "strconv"
124
+ "strings"
125
+ )
126
+
127
+ type Sym struct {
128
+ Name string \`json:"name"\`
129
+ Kind string \`json:"kind"\`
130
+ Line int \`json:"line"\`
131
+ Col int \`json:"col"\`
132
+ Signature string \`json:"signature"\`
133
+ Scope string \`json:"scope"\`
134
+ }
135
+
136
+ // Ref is a cross-reference emitted alongside the symbols, so one \`go run\`
137
+ // yields both. Module is the import path for CallType "import", else empty.
138
+ type Ref struct {
139
+ ToName string \`json:"toName"\`
140
+ CallType string \`json:"callType"\`
141
+ Line int \`json:"line"\`
142
+ Module string \`json:"module"\`
143
+ }
144
+
145
+ type Result struct {
146
+ Symbols []Sym \`json:"symbols"\`
147
+ Refs []Ref \`json:"refs"\`
148
+ }
149
+
150
+ func emptyResult() string {
151
+ return "{\\"symbols\\":[],\\"refs\\":[]}"
152
+ }
153
+
154
+ func main() {
155
+ src, err := io.ReadAll(os.Stdin)
156
+ if err != nil {
157
+ fmt.Print(emptyResult())
158
+ return
159
+ }
160
+ fset := token.NewFileSet()
161
+ node, err := parser.ParseFile(fset, "src.go", src, 0)
162
+ if err != nil {
163
+ fmt.Print(emptyResult())
164
+ return
165
+ }
166
+
167
+ var syms []Sym
168
+
169
+ // Package-level scope
170
+ pkgScope := node.Name.Name
171
+
172
+ // Collect all top-level declarations
173
+ for _, decl := range node.Decls {
174
+ switch d := decl.(type) {
175
+ case *ast.FuncDecl:
176
+ name := d.Name.Name
177
+ kind := "function"
178
+ scope := pkgScope
179
+ if d.Recv != nil && len(d.Recv.List) > 0 {
180
+ scope = pkgScope + "." + recvTypeName(d.Recv.List[0].Type) + "." + name
181
+ kind = "method"
182
+ } else {
183
+ scope = pkgScope + "." + name
184
+ }
185
+ pos := fset.Position(d.Pos())
186
+ sig := formatFuncSig(d)
187
+ syms = append(syms, Sym{Name: name, Kind: kind, Line: pos.Line, Col: pos.Column, Signature: sig, Scope: scope})
188
+
189
+ case *ast.GenDecl:
190
+ for _, spec := range d.Specs {
191
+ switch s := spec.(type) {
192
+ case *ast.TypeSpec:
193
+ name := s.Name.Name
194
+ pos := fset.Position(s.Pos())
195
+ sig := "type " + name
196
+ if s.TypeParams != nil {
197
+ sig += formatTypeParams(s.TypeParams)
198
+ }
199
+ if st, ok := s.Type.(*ast.StructType); ok {
200
+ sig += " = struct { " + formatFields(st.Fields.List) + " }"
201
+ } else if it, ok := s.Type.(*ast.InterfaceType); ok {
202
+ sig += " = interface { " + formatMethods(it.Methods.List) + " }"
203
+ } else {
204
+ sig += " = " + formatType(s.Type)
205
+ }
206
+ syms = append(syms, Sym{Name: name, Kind: "type", Line: pos.Line, Col: pos.Column, Signature: sig, Scope: pkgScope})
207
+
208
+ case *ast.ValueSpec:
209
+ for _, n := range s.Names {
210
+ name := n.Name
211
+ pos := fset.Position(n.Pos())
212
+ kind := "var"
213
+ if d.Tok == token.CONST {
214
+ kind = "const"
215
+ }
216
+ sig := kind + " " + name
217
+ if s.Type != nil {
218
+ sig += " " + formatType(s.Type)
219
+ }
220
+ syms = append(syms, Sym{Name: name, Kind: kind, Line: pos.Line, Col: pos.Column, Signature: sig, Scope: pkgScope})
221
+ }
222
+ }
223
+ }
224
+ }
225
+ }
226
+
227
+ refs := []Ref{}
228
+ ast.Inspect(node, func(n ast.Node) bool {
229
+ switch expr := n.(type) {
230
+ case *ast.CallExpr:
231
+ line := fset.Position(expr.Pos()).Line
232
+ switch fun := expr.Fun.(type) {
233
+ case *ast.Ident:
234
+ refs = append(refs, Ref{ToName: fun.Name, CallType: "call", Line: line})
235
+ case *ast.SelectorExpr:
236
+ // Record the selected name (\`Join\` of \`filepath.Join\`): it is the
237
+ // declared symbol name, so it resolves the same way the TypeScript
238
+ // and Python extractors' call refs do.
239
+ refs = append(refs, Ref{ToName: fun.Sel.Name, CallType: "call", Line: line})
240
+ }
241
+ case *ast.ImportSpec:
242
+ if expr.Path != nil {
243
+ if importPath, uerr := strconv.Unquote(expr.Path.Value); uerr == nil {
244
+ line := fset.Position(expr.Pos()).Line
245
+ // A Go import names a package, not a symbol; the package's
246
+ // last path segment is the name it is referenced by.
247
+ name := importPath
248
+ if idx := strings.LastIndex(importPath, "/"); idx >= 0 {
249
+ name = importPath[idx+1:]
250
+ }
251
+ refs = append(refs, Ref{ToName: name, CallType: "import", Line: line, Module: importPath})
252
+ }
253
+ }
254
+ }
255
+ return true
256
+ })
257
+
258
+ if syms == nil {
259
+ syms = []Sym{}
260
+ }
261
+ data, err := json.Marshal(Result{Symbols: syms, Refs: refs})
262
+ if err != nil {
263
+ fmt.Print(emptyResult())
264
+ return
265
+ }
266
+ fmt.Print(string(data))
267
+ }
268
+
269
+ func recvTypeName(t ast.Expr) string {
270
+ switch v := t.(type) {
271
+ case *ast.Ident:
272
+ return v.Name
273
+ case *ast.StarExpr:
274
+ return recvTypeName(v.X)
275
+ default:
276
+ return "?"
277
+ }
278
+ }
279
+
280
+ func formatFuncSig(d *ast.FuncDecl) string {
281
+ scope := ""
282
+ if d.Recv != nil && len(d.Recv.List) > 0 {
283
+ scope = "(" + formatFieldList(d.Recv.List) + ") "
284
+ }
285
+ scope += formatFuncType(d.Type)
286
+ return "func " + scope
287
+ }
288
+
289
+ func formatFuncType(f *ast.FuncType) string {
290
+ params := formatFieldList(f.Params.List)
291
+ results := ""
292
+ if f.Results != nil {
293
+ results = " -> " + formatFieldList(f.Results.List)
294
+ }
295
+ return params + results
296
+ }
297
+
298
+ func formatFieldList(fields []*ast.Field) string {
299
+ if len(fields) == 0 {
300
+ return "()"
301
+ }
302
+ names := make([]string, 0, len(fields))
303
+ for _, f := range fields {
304
+ name := ""
305
+ if len(f.Names) > 0 {
306
+ name = f.Names[0].Name
307
+ }
308
+ t := formatType(f.Type)
309
+ if name != "" {
310
+ names = append(names, name+" "+t)
311
+ } else {
312
+ names = append(names, t)
313
+ }
314
+ }
315
+ return "(" + strings.Join(names, ", ") + ")"
316
+ }
317
+
318
+ func formatFields(fields []*ast.Field) string {
319
+ lines := make([]string, 0)
320
+ for _, f := range fields {
321
+ name := ""
322
+ if len(f.Names) > 0 {
323
+ name = f.Names[0].Name
324
+ }
325
+ t := formatType(f.Type)
326
+ if name != "" {
327
+ lines = append(lines, name+" "+t)
328
+ } else {
329
+ lines = append(lines, t)
330
+ }
331
+ }
332
+ return strings.Join(lines, "; ")
333
+ }
334
+
335
+ func formatMethods(fields []*ast.Field) string {
336
+ return formatFields(fields)
337
+ }
338
+
339
+ func formatTypeParams(tp *ast.FieldList) string {
340
+ if tp == nil || len(tp.List) == 0 {
341
+ return ""
342
+ }
343
+ params := make([]string, len(tp.List))
344
+ for i, p := range tp.List {
345
+ if len(p.Names) > 0 {
346
+ params[i] = p.Names[0].Name
347
+ } else {
348
+ params[i] = "T"
349
+ }
350
+ }
351
+ return "[" + strings.Join(params, ", ") + "]"
352
+ }
353
+
354
+ func formatType(t ast.Expr) string {
355
+ if t == nil {
356
+ return "?"
357
+ }
358
+ switch v := t.(type) {
359
+ case *ast.Ident:
360
+ return v.Name
361
+ case *ast.SelectorExpr:
362
+ return formatType(v.X) + "." + v.Sel.Name
363
+ case *ast.StarExpr:
364
+ return "*" + formatType(v.X)
365
+ case *ast.ArrayType:
366
+ if v.Len == nil {
367
+ return "[]" + formatType(v.Elt)
368
+ }
369
+ return "[...]" + formatType(v.Elt)
370
+ case *ast.MapType:
371
+ return "map[" + formatType(v.Key) + "]" + formatType(v.Value)
372
+ case *ast.InterfaceType:
373
+ return "interface{}"
374
+ case *ast.StructType:
375
+ return "struct{}"
376
+ case *ast.FuncType:
377
+ return formatFuncType(v)
378
+ case *ast.ChanType:
379
+ return "chan " + formatType(v.Value)
380
+ case *ast.BasicLit:
381
+ return v.Value
382
+ case *ast.IndexExpr:
383
+ // Generic instantiation with one type arg, e.g. Logger[int].
384
+ return formatType(v.X) + "[" + formatType(v.Index) + "]"
385
+ case *ast.IndexListExpr:
386
+ // Generic instantiation with multiple type args, e.g. Map[K, V].
387
+ args := make([]string, len(v.Indices))
388
+ for i, idx := range v.Indices {
389
+ args[i] = formatType(idx)
390
+ }
391
+ return formatType(v.X) + "[" + strings.Join(args, ", ") + "]"
392
+ default:
393
+ return "?"
394
+ }
395
+ }
396
+ `;
397
+ var _cachedGoScriptPath = null;
398
+ async function syncGoParse(filePath, content, lang) {
399
+ try {
400
+ let scriptPath = _cachedGoScriptPath;
401
+ if (!scriptPath) {
402
+ const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "ws-go-parse-"));
403
+ scriptPath = path.join(tmpDir, "parse.go");
404
+ await fs.writeFile(scriptPath, GO_PARSE_SCRIPT, "utf8");
405
+ _cachedGoScriptPath = scriptPath;
406
+ }
407
+ const goBinary = resolveWin32Command("go");
408
+ const goResult = await new Promise(
409
+ (resolve, reject) => {
410
+ let settled = false;
411
+ const proc = spawn(goBinary, ["run", scriptPath], {
412
+ stdio: ["pipe", "pipe", "pipe"],
413
+ windowsHide: true
414
+ });
415
+ proc.on("error", (err) => {
416
+ if (settled) return;
417
+ settled = true;
418
+ reject(err);
419
+ });
420
+ let stdout2 = "";
421
+ proc.stdout?.on("data", (chunk) => {
422
+ stdout2 += chunk.toString();
423
+ });
424
+ proc.stderr?.resume();
425
+ proc.stdin?.write(content);
426
+ proc.stdin?.end();
427
+ const timer = setTimeout(() => {
428
+ if (settled) return;
429
+ settled = true;
430
+ proc.kill("SIGKILL");
431
+ reject(new Error("timeout"));
432
+ }, 15e3);
433
+ timer.unref?.();
434
+ proc.on("close", (code2) => {
435
+ if (settled) return;
436
+ settled = true;
437
+ clearTimeout(timer);
438
+ resolve({ code: code2, stdout: stdout2 });
439
+ });
440
+ }
441
+ );
442
+ const { code, stdout } = goResult;
443
+ if (code !== 0 || !stdout.trim()) {
444
+ return { file: filePath, lang, symbols: [], mtimeMs: Date.now() };
445
+ }
446
+ const { symbols: rawSymbols, refs } = parseParserOutput(stdout, lang);
447
+ const symbols = rawSymbols.map((s) => ({
448
+ id: 0,
449
+ lang,
450
+ kind: s.kind,
451
+ name: s.name,
452
+ file: filePath,
453
+ line: s.line,
454
+ col: s.col,
455
+ signature: s.signature ?? "",
456
+ docComment: "",
457
+ scope: s.scope ?? "",
458
+ text: `${s.name} ${s.signature ?? ""}`.trim()
459
+ }));
460
+ return { file: filePath, lang, symbols, refs, mtimeMs: Date.now() };
461
+ } catch {
462
+ return { file: filePath, lang, symbols: [], mtimeMs: Date.now() };
463
+ }
464
+ }
465
+ export {
466
+ detectLang,
467
+ parseSymbols
468
+ };
469
+ //# sourceMappingURL=go-parser-JXYKJHRC.js.map