@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,385 @@
1
+ import {
2
+ parseGeneric
3
+ } from "./chunk-A6BRWIXN.js";
4
+ import {
5
+ parseParserOutput,
6
+ withSpawnGate
7
+ } from "./chunk-UCYQTZ7F.js";
8
+ import {
9
+ resolveWin32Command
10
+ } from "./chunk-V43EQ6VR.js";
11
+
12
+ // src/codebase-index/py-parser.ts
13
+ import { spawn } from "node:child_process";
14
+ import * as fs from "node:fs/promises";
15
+ import * as os from "node:os";
16
+ import * as path from "node:path";
17
+ async function parseSymbols(opts) {
18
+ const { file, content, lang } = opts;
19
+ try {
20
+ const native = await withSpawnGate(() => syncPyParse(file, content, lang));
21
+ if (native !== null) return native;
22
+ } catch {
23
+ }
24
+ return parseGeneric({ file, content, lang: lang === "py" ? "py" : lang });
25
+ }
26
+ var PY_PARSE_SCRIPT = `import ast, json, sys, os
27
+
28
+ def get_name(node):
29
+ if isinstance(node, ast.Name):
30
+ return node.id
31
+ elif isinstance(node, ast.Attribute):
32
+ return get_name(node.value) + "." + node.attr
33
+ elif isinstance(node, ast.Subscript):
34
+ return get_name(node.value)
35
+ elif isinstance(node, ast.Call):
36
+ return get_name(node.func)
37
+ elif isinstance(node, ast.Constant):
38
+ return str(node.value)
39
+ return ""
40
+
41
+ def get_decorators(node):
42
+ decs = []
43
+ for dec in node.decorator_list:
44
+ decs.append(get_name(dec))
45
+ return decs
46
+
47
+ def get_bases(node):
48
+ bases = []
49
+ for base in node.bases:
50
+ bases.append(get_name(base))
51
+ return bases
52
+
53
+ def get_args(args):
54
+ parts = []
55
+ for arg in args.args:
56
+ parts.append(arg.arg)
57
+ return ", ".join(parts)
58
+
59
+ def get_returns(node):
60
+ if node.returns is None:
61
+ return ""
62
+ return get_name(node.returns)
63
+
64
+ class Sym:
65
+ def __init__(self, name, kind, line, col, signature, scope):
66
+ self.name = name
67
+ self.kind = kind
68
+ self.line = line
69
+ self.col = col
70
+ self.signature = signature
71
+ self.scope = scope
72
+ def to_dict(self):
73
+ return {
74
+ "name": self.name,
75
+ "kind": self.kind,
76
+ "line": self.line,
77
+ "col": self.col,
78
+ "signature": self.signature,
79
+ "scope": self.scope,
80
+ }
81
+
82
+ def is_private(name):
83
+ return name.startswith("__") and not name.endswith("__")
84
+
85
+ def leaf_name(node):
86
+ # Declared name of the callee: \`join\` of \`os.path.join\`. Matches how the
87
+ # TypeScript and Go extractors record call refs, so resolution behaves the
88
+ # same across languages.
89
+ if isinstance(node, ast.Attribute):
90
+ return node.attr
91
+ if isinstance(node, ast.Name):
92
+ return node.id
93
+ return get_name(node).split(".")[-1]
94
+
95
+ syms = []
96
+ refs = []
97
+ errors = []
98
+
99
+ try:
100
+ source = sys.stdin.read()
101
+ tree = ast.parse(source, filename=sys.argv[1])
102
+ except Exception as e:
103
+ errors.append(str(e))
104
+ print(json.dumps({"symbols": [], "refs": []}))
105
+ sys.exit(0)
106
+
107
+ # Module-level scope
108
+ module_scope = os.path.basename(sys.argv[1])[:-3] # strip .py
109
+
110
+ class ModuleVisitor(ast.NodeVisitor):
111
+ def __init__(self):
112
+ self.scope_stack = [module_scope]
113
+
114
+ def visit_ClassDef(self, node):
115
+ bases = get_bases(node)
116
+ decs = get_decorators(node)
117
+ sig = "class " + node.name
118
+ if bases:
119
+ sig += "(" + ", ".join(bases) + ")"
120
+ sig += ": ..."
121
+ syms.append(Sym(
122
+ name=node.name,
123
+ kind="class",
124
+ line=node.lineno,
125
+ col=node.col_offset,
126
+ signature=sig,
127
+ scope=".".join(self.scope_stack) + "." + node.name,
128
+ ))
129
+ self.scope_stack.append(node.name)
130
+ self.generic_visit(node)
131
+ self.scope_stack.pop()
132
+
133
+ def visit_FunctionDef(self, node):
134
+ decs = get_decorators(node)
135
+ args = get_args(node.args)
136
+ returns = get_returns(node)
137
+ is_async = isinstance(node, ast.AsyncFunctionDef)
138
+
139
+ kind = "function"
140
+ prefix = "def "
141
+ if decs:
142
+ for d in decs:
143
+ if d.endswith(".staticmethod"):
144
+ kind = "staticmethod"
145
+ elif d.endswith(".classmethod"):
146
+ kind = "classmethod"
147
+ elif d == "property":
148
+ kind = "property"
149
+
150
+ if is_async:
151
+ kind = "async_" + kind
152
+
153
+ sig = f"{prefix}{node.name}({args})"
154
+ if returns:
155
+ sig += f" -> {returns}"
156
+ scope = ".".join(self.scope_stack) + "." + node.name
157
+
158
+ syms.append(Sym(
159
+ name=node.name,
160
+ kind=kind,
161
+ line=node.lineno,
162
+ col=node.col_offset,
163
+ signature=sig,
164
+ scope=scope,
165
+ ))
166
+ # Don't descend into function bodies to avoid local symbols
167
+ # self.generic_visit(node)
168
+
169
+ def visit_AsyncFunctionDef(self, node):
170
+ # Treat as function
171
+ self.visit_FunctionDef(node)
172
+
173
+ def visit_Assign(self, node):
174
+ for target in node.targets:
175
+ if isinstance(target, ast.Name):
176
+ name = target.id
177
+ if is_private(name):
178
+ continue
179
+ # Infer constness from UPPER_CASE naming
180
+ kind = "const" if name.isupper() else "var"
181
+ col = target.col_offset if hasattr(target, 'col_offset') else 0
182
+ syms.append(Sym(
183
+ name=name,
184
+ kind=kind,
185
+ line=node.lineno,
186
+ col=col,
187
+ signature=f"{name} = ...",
188
+ scope=".".join(self.scope_stack),
189
+ ))
190
+
191
+ def visit_AnnAssign(self, node):
192
+ if isinstance(node.target, ast.Name):
193
+ name = node.target.id
194
+ if is_private(name):
195
+ return
196
+ kind = "const" if name.isupper() else "var"
197
+ col = node.target.col_offset if hasattr(node.target, 'col_offset') else 0
198
+ sig = f"{name}: {get_name(node.annotation)}"
199
+ if node.value:
200
+ sig += " = ..."
201
+ syms.append(Sym(
202
+ name=name,
203
+ kind=kind,
204
+ line=node.lineno,
205
+ col=col,
206
+ signature=sig,
207
+ scope=".".join(self.scope_stack),
208
+ ))
209
+
210
+ def visit_Import(self, node):
211
+ for alias in node.names:
212
+ name = alias.asname or alias.name
213
+ syms.append(Sym(
214
+ name=name,
215
+ kind="import",
216
+ line=node.lineno,
217
+ col=node.col_offset,
218
+ signature=f"import {alias.name}",
219
+ scope=".".join(self.scope_stack),
220
+ ))
221
+
222
+ def visit_ImportFrom(self, node):
223
+ module = node.module or ""
224
+ for alias in node.names:
225
+ name = alias.asname or alias.name
226
+ syms.append(Sym(
227
+ name=name,
228
+ kind="import",
229
+ line=node.lineno,
230
+ col=node.col_offset,
231
+ signature=f"from {module} import {alias.name}",
232
+ scope=".".join(self.scope_stack),
233
+ ))
234
+
235
+ visitor = ModuleVisitor()
236
+ visitor.visit(tree)
237
+
238
+ # Refs need a separate full walk: ModuleVisitor deliberately does not descend
239
+ # into function bodies (it would index locals as symbols), but that is exactly
240
+ # where the calls are.
241
+ for node in ast.walk(tree):
242
+ if isinstance(node, ast.Call):
243
+ name = leaf_name(node.func)
244
+ if name:
245
+ refs.append({"toName": name, "callType": "call", "line": node.lineno})
246
+ elif isinstance(node, ast.Import):
247
+ for alias in node.names:
248
+ refs.append({
249
+ "toName": alias.name.split(".")[-1],
250
+ "callType": "import",
251
+ "line": node.lineno,
252
+ "module": alias.name,
253
+ })
254
+ elif isinstance(node, ast.ImportFrom):
255
+ # PEP 328: node.level is the number of leading dots. Preserving them is
256
+ # what lets the resolver walk up from the importing file's package \u2014
257
+ # dropping them made \`from .foo import X\` indistinguishable from an
258
+ # absolute \`foo\`.
259
+ module = ("." * (node.level or 0)) + (node.module or "")
260
+ for alias in node.names:
261
+ refs.append({
262
+ "toName": alias.name,
263
+ "callType": "import",
264
+ "line": node.lineno,
265
+ "module": module,
266
+ })
267
+ elif isinstance(node, ast.ClassDef):
268
+ for base in node.bases:
269
+ name = leaf_name(base)
270
+ if name:
271
+ refs.append({"toName": name, "callType": "inherit", "line": node.lineno})
272
+
273
+ print(json.dumps({"symbols": [s.to_dict() for s in syms], "refs": refs}))
274
+ `;
275
+ async function resolvePython() {
276
+ const candidates = process.platform === "win32" ? ["python3", "python", "py"] : ["python3", "python"];
277
+ for (const name of candidates) {
278
+ const resolved = resolveWin32Command(name);
279
+ if (!await commandIsAvailable(resolved)) continue;
280
+ return resolved;
281
+ }
282
+ return null;
283
+ }
284
+ function commandIsAvailable(command) {
285
+ return new Promise((resolve) => {
286
+ let settled = false;
287
+ const proc = spawn(command, ["--version"], {
288
+ stdio: "ignore",
289
+ windowsHide: true
290
+ });
291
+ const finish = (available) => {
292
+ if (settled) return;
293
+ settled = true;
294
+ clearTimeout(timer);
295
+ resolve(available);
296
+ };
297
+ const timer = setTimeout(() => {
298
+ proc.kill("SIGKILL");
299
+ finish(false);
300
+ }, 5e3);
301
+ timer.unref?.();
302
+ proc.once("error", () => finish(false));
303
+ proc.once("close", (code) => finish(code === 0));
304
+ });
305
+ }
306
+ function spawnPyParser(pyBinary, scriptPath, filePath, content) {
307
+ return new Promise((resolve, reject) => {
308
+ let settled = false;
309
+ const proc = spawn(pyBinary, [scriptPath, filePath], {
310
+ stdio: ["pipe", "pipe", "pipe"],
311
+ windowsHide: true
312
+ });
313
+ proc.on("error", (err) => {
314
+ if (settled) return;
315
+ settled = true;
316
+ reject(err);
317
+ });
318
+ proc.stdin?.write(content);
319
+ proc.stdin?.end();
320
+ let stdout = "";
321
+ proc.stdout?.on("data", (chunk) => {
322
+ stdout += chunk.toString();
323
+ });
324
+ proc.stderr?.resume();
325
+ const timer = setTimeout(() => {
326
+ if (settled) return;
327
+ settled = true;
328
+ proc.kill("SIGKILL");
329
+ reject(new Error("timeout"));
330
+ }, 15e3);
331
+ timer.unref?.();
332
+ proc.on("close", (code) => {
333
+ if (settled) return;
334
+ settled = true;
335
+ clearTimeout(timer);
336
+ resolve({ code, stdout });
337
+ });
338
+ });
339
+ }
340
+ var _cachedScriptPath = null;
341
+ var cachedPyBinary;
342
+ function resolvePythonBinary() {
343
+ cachedPyBinary ??= resolvePython();
344
+ return cachedPyBinary;
345
+ }
346
+ async function syncPyParse(filePath, content, lang) {
347
+ try {
348
+ if (!_cachedScriptPath) {
349
+ const tmpDir = path.join(os.tmpdir(), "ws-py-parse");
350
+ await fs.mkdir(tmpDir, { recursive: true });
351
+ _cachedScriptPath = path.join(tmpDir, "parse.py");
352
+ await fs.writeFile(_cachedScriptPath, PY_PARSE_SCRIPT, "utf8");
353
+ }
354
+ cachedPyBinary ??= resolvePython();
355
+ const pyBinary = await cachedPyBinary;
356
+ if (!pyBinary) return null;
357
+ const { code, stdout } = await spawnPyParser(pyBinary, _cachedScriptPath, filePath, content);
358
+ if (code !== 0 || !stdout.trim()) {
359
+ return { file: filePath, lang, symbols: [], mtimeMs: Date.now() };
360
+ }
361
+ const { symbols: raw, refs } = parseParserOutput(stdout, lang);
362
+ const symbols = raw.map((s) => ({
363
+ id: 0,
364
+ lang,
365
+ kind: s.kind,
366
+ name: s.name,
367
+ file: filePath,
368
+ line: s.line,
369
+ col: s.col,
370
+ signature: s.signature ?? "",
371
+ docComment: "",
372
+ scope: s.scope ?? "",
373
+ text: `${s.name} ${s.signature ?? ""}`.trim()
374
+ }));
375
+ return { file: filePath, lang, symbols, refs, mtimeMs: Date.now() };
376
+ } catch {
377
+ return null;
378
+ }
379
+ }
380
+
381
+ export {
382
+ parseSymbols,
383
+ resolvePythonBinary
384
+ };
385
+ //# sourceMappingURL=chunk-ZLTFLC25.js.map
@@ -1,194 +1,6 @@
1
- // src/circuit-breaker.ts
2
- var DEFAULT_MAX_CONSECUTIVE_FAILURES = 5;
3
- var DEFAULT_SLOW_CALL_THRESHOLD_MS = 18e4;
4
- var DEFAULT_MAX_SLOW_CALLS = 3;
5
- var DEFAULT_WINDOW_MS = 6e4;
6
- var DEFAULT_MAX_CALLS_PER_WINDOW = 30;
7
- var DEFAULT_COOLDOWN_MS = 3e4;
8
- var CircuitBreaker = class {
9
- maxConsecutiveFailures;
10
- slowCallThresholdMs;
11
- maxSlowCalls;
12
- windowMs;
13
- maxCallsPerWindow;
14
- cooldownMs;
15
- state = "closed";
16
- consecutiveFailures = 0;
17
- window = [];
18
- lastFailureAt = null;
19
- lastSlowAt = null;
20
- /** Timestamp when the breaker was opened (for cooldown calculation). */
21
- openedAt = null;
22
- /**
23
- * Master enable flag. When false the breaker is bypassed: `beforeCall`
24
- * always returns true and `afterCall` records nothing. The class itself
25
- * defaults to enabled (so the standalone unit tests exercise tripping); the
26
- * ProcessRegistry flips this off until the user opts in via `/settings`.
27
- */
28
- enabled = true;
29
- /**
30
- * Fired (best-effort) when the breaker transitions into the `open` state.
31
- * The registry uses this to arm its auto kill/reset countdown.
32
- */
33
- onTrip;
34
- /**
35
- * Fired (best-effort) when the breaker returns to `closed` after having been
36
- * open/half-open. The registry uses this to cancel a pending kill/reset.
37
- */
38
- onReset;
39
- constructor(config = {}) {
40
- this.maxConsecutiveFailures = config.maxConsecutiveFailures ?? DEFAULT_MAX_CONSECUTIVE_FAILURES;
41
- this.slowCallThresholdMs = config.slowCallThresholdMs ?? DEFAULT_SLOW_CALL_THRESHOLD_MS;
42
- this.maxSlowCalls = config.maxSlowCalls ?? DEFAULT_MAX_SLOW_CALLS;
43
- this.windowMs = config.windowMs ?? DEFAULT_WINDOW_MS;
44
- this.maxCallsPerWindow = config.maxCallsPerWindow ?? DEFAULT_MAX_CALLS_PER_WINDOW;
45
- this.cooldownMs = config.cooldownMs ?? DEFAULT_COOLDOWN_MS;
46
- }
47
- /** Toggle the master enable. Disabling resets to a clean `closed` state. */
48
- setEnabled(enabled) {
49
- if (this.enabled === enabled) return;
50
- this.enabled = enabled;
51
- if (!enabled) this._reset();
52
- }
53
- get isEnabled() {
54
- return this.enabled;
55
- }
56
- /**
57
- * Returns true if the circuit allows a new call to proceed.
58
- * When false, callers should abort the tool call and return a
59
- * circuit-breaker error instead of spawning a process.
60
- */
61
- get canProceed() {
62
- if (!this.enabled) return true;
63
- this._checkStateTransition();
64
- return this.state !== "open";
65
- }
66
- /**
67
- * Snapshot of the current breaker state for observability (`/kill`).
68
- */
69
- snapshot() {
70
- this._checkStateTransition();
71
- const now = Date.now();
72
- let cooldownRemaining = null;
73
- if (this.openedAt !== null && this.state === "open") {
74
- const elapsed = now - this.openedAt;
75
- cooldownRemaining = Math.max(0, this.cooldownMs - elapsed);
76
- }
77
- return {
78
- state: this.state,
79
- consecutiveFailures: this.consecutiveFailures,
80
- slowCallsInWindow: this.window.filter((c) => c.slow).length,
81
- callsInWindow: this.window.length,
82
- windowMs: this.windowMs,
83
- cooldownRemainingMs: cooldownRemaining,
84
- lastFailureAt: this.lastFailureAt,
85
- lastSlowAt: this.lastSlowAt
86
- };
87
- }
88
- /**
89
- * Call this BEFORE spawning a bash/exec process.
90
- * Returns true if the call is allowed; false if the breaker is open.
91
- * When false, callers MUST NOT spawn a process.
92
- *
93
- * @param bypass - If true, skip the circuit breaker check entirely.
94
- * Use for background/fire-and-forget processes that should
95
- * not affect breaker state.
96
- */
97
- beforeCall(bypass = false) {
98
- if (bypass || !this.enabled) return true;
99
- this._checkStateTransition();
100
- if (this.state === "open") return false;
101
- return true;
102
- }
103
- /**
104
- * Call this AFTER a bash/exec process finishes (success or failure).
105
- * `durationMs` is the wall-clock time the process ran.
106
- * `failed` is true when the process returned a non-zero exit code or
107
- * threw an exception before spawning.
108
- *
109
- * @param bypass - If true, do not update breaker state.
110
- * Use for background/fire-and-forget processes.
111
- */
112
- afterCall(durationMs, failed, bypass = false) {
113
- if (bypass || !this.enabled) return;
114
- const now = Date.now();
115
- if (this.state === "half-open") {
116
- if (failed) {
117
- this._trip();
118
- return;
119
- }
120
- this._reset();
121
- return;
122
- }
123
- this._pruneWindow(now);
124
- const slow = durationMs >= this.slowCallThresholdMs;
125
- this.window.push({ at: now, failed, slow });
126
- if (failed) {
127
- this.consecutiveFailures++;
128
- this.lastFailureAt = now;
129
- if (this.consecutiveFailures >= this.maxConsecutiveFailures) {
130
- this._trip();
131
- }
132
- return;
133
- }
134
- this.consecutiveFailures = 0;
135
- if (slow) {
136
- this.lastSlowAt = now;
137
- const slowCount = this.window.filter((c) => c.slow).length;
138
- if (slowCount >= this.maxSlowCalls) {
139
- this._trip();
140
- }
141
- }
142
- const callCount = this.window.length;
143
- if (callCount >= this.maxCallsPerWindow) {
144
- this._trip();
145
- }
146
- }
147
- /** Force the breaker open. Used by /kill force and Ctrl+C. */
148
- forceOpen() {
149
- this._trip();
150
- }
151
- /** Force a reset to closed. Used by tests and /kill reset. */
152
- forceReset() {
153
- this._reset();
154
- }
155
- _trip() {
156
- if (this.state === "open") return;
157
- this.state = "open";
158
- this.openedAt = Date.now();
159
- this.window = [];
160
- try {
161
- this.onTrip?.();
162
- } catch {
163
- }
164
- }
165
- _reset() {
166
- const wasRecovering = this.state !== "closed";
167
- this.state = "closed";
168
- this.consecutiveFailures = 0;
169
- this.window = [];
170
- this.openedAt = null;
171
- if (wasRecovering) {
172
- try {
173
- this.onReset?.();
174
- } catch {
175
- }
176
- }
177
- }
178
- /** Transition from open → half-open when cooldown elapses. */
179
- _checkStateTransition() {
180
- if (this.state !== "open" || this.openedAt === null) return;
181
- const elapsed = Date.now() - this.openedAt;
182
- if (elapsed >= this.cooldownMs) {
183
- this.state = "half-open";
184
- this.openedAt = null;
185
- }
186
- }
187
- _pruneWindow(now) {
188
- const cutoff = now - this.windowMs;
189
- this.window = this.window.filter((c) => c.at >= cutoff);
190
- }
191
- };
1
+ import {
2
+ CircuitBreaker
3
+ } from "./chunk-HFXSNKCV.js";
192
4
  export {
193
5
  CircuitBreaker
194
6
  };
@@ -35,26 +35,26 @@ export interface InvariantEvaluationResult {
35
35
  durationMs: number;
36
36
  };
37
37
  }
38
- export interface ParameterContract {
38
+ interface ParameterContract {
39
39
  name: string;
40
40
  isOptional: boolean;
41
41
  hasDefault: boolean;
42
42
  isRest: boolean;
43
43
  type?: string | undefined;
44
44
  }
45
- export interface FunctionContract {
45
+ interface FunctionContract {
46
46
  name: string;
47
47
  isExported: boolean;
48
48
  params: ParameterContract[];
49
49
  returnType?: string | undefined;
50
50
  }
51
- export interface InterfacePropertyContract {
51
+ interface InterfacePropertyContract {
52
52
  name: string;
53
53
  isOptional: boolean;
54
54
  hasDefault?: boolean | undefined;
55
55
  type?: string | undefined;
56
56
  }
57
- export interface InterfaceContract {
57
+ interface InterfaceContract {
58
58
  name: string;
59
59
  isExported: boolean;
60
60
  properties: InterfacePropertyContract[];
@@ -99,4 +99,5 @@ export declare class PolyglotInvariantEngine {
99
99
  }
100
100
  /** Singleton instance ready for use across WrongStack */
101
101
  export declare const polyglotInvariantEngine: PolyglotInvariantEngine;
102
+ export {};
102
103
  //# sourceMappingURL=ast-invariant-engine.d.ts.map
@@ -25,8 +25,6 @@
25
25
  * of a different version (the buildId changes when the compiled artifact
26
26
  * changes), so there is no protocol ambiguity in practice.
27
27
  */
28
- /** Magic byte that prefixes every binary frame. 'W' for WrongStack. */
29
- export declare const BINARY_FRAME_MAGIC = 87;
30
28
  /**
31
29
  * Hard cap on one binary frame's declared payload length for the CLIENT
32
30
  * reader (project-server-client.ts). A malformed or hostile peer could
@@ -17,7 +17,7 @@ interface Bm25Doc {
17
17
  * conventionally split words in snake_case identifiers).
18
18
  */
19
19
  export declare function tokenise(text: string): string[];
20
- export interface IndexableDoc {
20
+ interface IndexableDoc {
21
21
  id: number;
22
22
  text: string;
23
23
  }
@@ -52,7 +52,7 @@ export declare class IndexTimeoutError extends Error {
52
52
  export declare class LockError extends Error {
53
53
  readonly name = "LockError";
54
54
  }
55
- export interface CircuitBreakerOptions {
55
+ interface CircuitBreakerOptions {
56
56
  /** Consecutive failures before the circuit opens. Default: 3. */
57
57
  failureThreshold?: number | undefined;
58
58
  /** How long an open circuit rejects requests before allowing a probe. Default: 60s. */
@@ -91,4 +91,5 @@ export declare class IndexCircuitBreaker {
91
91
  export declare const indexCircuitBreaker: IndexCircuitBreaker;
92
92
  /** Reset the shared breaker — used by `/codebase-reindex` and tests. */
93
93
  export declare function resetIndexCircuitBreaker(): void;
94
+ export {};
94
95
  //# sourceMappingURL=circuit-breaker.d.ts.map
@@ -10,9 +10,9 @@
10
10
  */
11
11
  import type { Tool } from '@wrongstack/core/types';
12
12
  import { type MutateSymbolOptions } from './ast-symbol-mutator.js';
13
- export interface CodebaseAstReplaceInput extends MutateSymbolOptions {
13
+ interface CodebaseAstReplaceInput extends MutateSymbolOptions {
14
14
  }
15
- export interface CodebaseAstReplaceOutput {
15
+ interface CodebaseAstReplaceOutput {
16
16
  status: 'ok' | 'error';
17
17
  file: string;
18
18
  symbol: string;
@@ -28,4 +28,5 @@ export interface CodebaseAstReplaceOutput {
28
28
  error?: string | undefined;
29
29
  }
30
30
  export declare const codebaseAstReplaceTool: Tool<CodebaseAstReplaceInput, CodebaseAstReplaceOutput>;
31
+ export {};
31
32
  //# sourceMappingURL=codebase-ast-replace-tool.d.ts.map
@@ -8,7 +8,7 @@
8
8
  * })
9
9
  */
10
10
  import type { Tool } from '@wrongstack/core/types';
11
- export interface ImpactAnalysisInput {
11
+ interface ImpactAnalysisInput {
12
12
  /** The symbol name (function, method, class, interface, type) to analyze. */
13
13
  symbol: string;
14
14
  /** Optional file path to disambiguate when multiple symbols share a name. */
@@ -16,7 +16,7 @@ export interface ImpactAnalysisInput {
16
16
  /** Whether to traverse transitive callers (callers of callers). Defaults to true. */
17
17
  transitive?: boolean | undefined;
18
18
  }
19
- export interface ImpactCallSite {
19
+ interface ImpactCallSite {
20
20
  file: string;
21
21
  line: number;
22
22
  callerName: string;
@@ -24,7 +24,7 @@ export interface ImpactCallSite {
24
24
  callType: string;
25
25
  isTest: boolean;
26
26
  }
27
- export interface ImpactAnalysisOutput {
27
+ interface ImpactAnalysisOutput {
28
28
  status: 'ok' | 'error';
29
29
  symbol: string;
30
30
  riskLevel: 'low' | 'medium' | 'high';
@@ -39,4 +39,5 @@ export interface ImpactAnalysisOutput {
39
39
  error?: string | undefined;
40
40
  }
41
41
  export declare const codebaseImpactAnalysisTool: Tool<ImpactAnalysisInput, ImpactAnalysisOutput>;
42
+ export {};
42
43
  //# sourceMappingURL=codebase-impact-analysis-tool.d.ts.map