mindweave 0.0.1 → 2.1.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 (481) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +171 -14
  3. package/dist/alternator/chassis/cache.js +47 -0
  4. package/dist/alternator/chassis/cache.js.map +1 -0
  5. package/dist/alternator/chassis/domRefs.js +53 -0
  6. package/dist/alternator/chassis/domRefs.js.map +1 -0
  7. package/dist/alternator/chassis/extractWorker.js +65 -0
  8. package/dist/alternator/chassis/extractWorker.js.map +1 -0
  9. package/dist/alternator/chassis/graph.js +221 -0
  10. package/dist/alternator/chassis/graph.js.map +1 -0
  11. package/dist/alternator/chassis/index.js +463 -0
  12. package/dist/alternator/chassis/index.js.map +1 -0
  13. package/dist/alternator/chassis/isolation.js +336 -0
  14. package/dist/alternator/chassis/isolation.js.map +1 -0
  15. package/dist/alternator/chassis/langCases.js +69 -0
  16. package/dist/alternator/chassis/langCases.js.map +1 -0
  17. package/dist/alternator/chassis/lsp.js +469 -0
  18. package/dist/alternator/chassis/lsp.js.map +1 -0
  19. package/dist/alternator/chassis/markup.js +262 -0
  20. package/dist/alternator/chassis/markup.js.map +1 -0
  21. package/dist/alternator/chassis/provision.js +198 -0
  22. package/dist/alternator/chassis/provision.js.map +1 -0
  23. package/dist/alternator/chassis/rank.js +72 -0
  24. package/dist/alternator/chassis/rank.js.map +1 -0
  25. package/dist/alternator/chassis/servers.js +215 -0
  26. package/dist/alternator/chassis/servers.js.map +1 -0
  27. package/dist/alternator/chassis/treesitter.js +608 -0
  28. package/dist/alternator/chassis/treesitter.js.map +1 -0
  29. package/dist/alternator/chassis/types.js +24 -0
  30. package/dist/alternator/chassis/types.js.map +1 -0
  31. package/dist/alternator/lane.js +67 -0
  32. package/dist/alternator/lane.js.map +1 -0
  33. package/dist/cli/App.js +2586 -0
  34. package/dist/cli/App.js.map +1 -0
  35. package/dist/cli/altScreen.js +67 -0
  36. package/dist/cli/altScreen.js.map +1 -0
  37. package/dist/cli/approvalChannel.js +72 -0
  38. package/dist/cli/approvalChannel.js.map +1 -0
  39. package/dist/cli/attachments.js +188 -0
  40. package/dist/cli/attachments.js.map +1 -0
  41. package/dist/cli/bootstrap.js +279 -0
  42. package/dist/cli/bootstrap.js.map +1 -0
  43. package/dist/cli/chatAnchor.js +94 -0
  44. package/dist/cli/chatAnchor.js.map +1 -0
  45. package/dist/cli/commandArgs.js +79 -0
  46. package/dist/cli/commandArgs.js.map +1 -0
  47. package/dist/cli/commandRoute.js +78 -0
  48. package/dist/cli/commandRoute.js.map +1 -0
  49. package/dist/cli/compaction.js +69 -0
  50. package/dist/cli/compaction.js.map +1 -0
  51. package/dist/cli/components/ApprovalBox.js +100 -0
  52. package/dist/cli/components/ApprovalBox.js.map +1 -0
  53. package/dist/cli/components/BlockView.js +128 -0
  54. package/dist/cli/components/BlockView.js.map +1 -0
  55. package/dist/cli/components/FirstRunFrame.js +41 -0
  56. package/dist/cli/components/FirstRunFrame.js.map +1 -0
  57. package/dist/cli/components/KeyManager.js +197 -0
  58. package/dist/cli/components/KeyManager.js.map +1 -0
  59. package/dist/cli/components/KeySetup.js +125 -0
  60. package/dist/cli/components/KeySetup.js.map +1 -0
  61. package/dist/cli/components/MenuFrame.js +24 -0
  62. package/dist/cli/components/MenuFrame.js.map +1 -0
  63. package/dist/cli/components/Picker.js +82 -0
  64. package/dist/cli/components/Picker.js.map +1 -0
  65. package/dist/cli/components/PromptInput.js +509 -0
  66. package/dist/cli/components/PromptInput.js.map +1 -0
  67. package/dist/cli/components/SubagentView.js +86 -0
  68. package/dist/cli/components/SubagentView.js.map +1 -0
  69. package/dist/cli/components/ToolGroup.js +60 -0
  70. package/dist/cli/components/ToolGroup.js.map +1 -0
  71. package/dist/cli/components/ToolLine.js +123 -0
  72. package/dist/cli/components/ToolLine.js.map +1 -0
  73. package/dist/cli/components/TrustGate.js +37 -0
  74. package/dist/cli/components/TrustGate.js.map +1 -0
  75. package/dist/cli/costView.js +40 -0
  76. package/dist/cli/costView.js.map +1 -0
  77. package/dist/cli/frameRate.js +30 -0
  78. package/dist/cli/frameRate.js.map +1 -0
  79. package/dist/cli/framebuffer/paint.js +165 -0
  80. package/dist/cli/framebuffer/paint.js.map +1 -0
  81. package/dist/cli/framebuffer/parse.js +266 -0
  82. package/dist/cli/framebuffer/parse.js.map +1 -0
  83. package/dist/cli/framebuffer/screen.js +196 -0
  84. package/dist/cli/framebuffer/screen.js.map +1 -0
  85. package/dist/cli/framebuffer/writer.js +139 -0
  86. package/dist/cli/framebuffer/writer.js.map +1 -0
  87. package/dist/cli/groupReveal.js +51 -0
  88. package/dist/cli/groupReveal.js.map +1 -0
  89. package/dist/cli/help.js +55 -0
  90. package/dist/cli/help.js.map +1 -0
  91. package/dist/cli/inputView.js +105 -0
  92. package/dist/cli/inputView.js.map +1 -0
  93. package/dist/cli/keyManager.js +65 -0
  94. package/dist/cli/keyManager.js.map +1 -0
  95. package/dist/cli/keySetup.js +35 -0
  96. package/dist/cli/keySetup.js.map +1 -0
  97. package/dist/cli/keyStore.js +73 -0
  98. package/dist/cli/keyStore.js.map +1 -0
  99. package/dist/cli/markdown.js +460 -0
  100. package/dist/cli/markdown.js.map +1 -0
  101. package/dist/cli/messageQueue.js +96 -0
  102. package/dist/cli/messageQueue.js.map +1 -0
  103. package/dist/cli/modes.js +90 -0
  104. package/dist/cli/modes.js.map +1 -0
  105. package/dist/cli/mouse.js +78 -0
  106. package/dist/cli/mouse.js.map +1 -0
  107. package/dist/cli/pasteAssembler.js +44 -0
  108. package/dist/cli/pasteAssembler.js.map +1 -0
  109. package/dist/cli/pathComplete.js +39 -0
  110. package/dist/cli/pathComplete.js.map +1 -0
  111. package/dist/cli/perfLog.js +90 -0
  112. package/dist/cli/perfLog.js.map +1 -0
  113. package/dist/cli/reveal.js +32 -0
  114. package/dist/cli/reveal.js.map +1 -0
  115. package/dist/cli/revealPace.js +59 -0
  116. package/dist/cli/revealPace.js.map +1 -0
  117. package/dist/cli/sessionCarry.js +19 -0
  118. package/dist/cli/sessionCarry.js.map +1 -0
  119. package/dist/cli/smoothScroll.js +74 -0
  120. package/dist/cli/smoothScroll.js.map +1 -0
  121. package/dist/cli/startupArgs.js +96 -0
  122. package/dist/cli/startupArgs.js.map +1 -0
  123. package/dist/cli/terminalRestore.js +34 -0
  124. package/dist/cli/terminalRestore.js.map +1 -0
  125. package/dist/cli/toolDisplay.js +219 -0
  126. package/dist/cli/toolDisplay.js.map +1 -0
  127. package/dist/cli/toolItems.js +65 -0
  128. package/dist/cli/toolItems.js.map +1 -0
  129. package/dist/cli/transcript.js +351 -0
  130. package/dist/cli/transcript.js.map +1 -0
  131. package/dist/cli/trust.js +79 -0
  132. package/dist/cli/trust.js.map +1 -0
  133. package/dist/cli/updateCheck.js +107 -0
  134. package/dist/cli/updateCheck.js.map +1 -0
  135. package/dist/cli/version.js +39 -0
  136. package/dist/cli/version.js.map +1 -0
  137. package/dist/cli/viewport.js +179 -0
  138. package/dist/cli/viewport.js.map +1 -0
  139. package/dist/cli/virtualWindow.js +103 -0
  140. package/dist/cli/virtualWindow.js.map +1 -0
  141. package/dist/cli/workingVerb.js +37 -0
  142. package/dist/cli/workingVerb.js.map +1 -0
  143. package/dist/cli/wrap.js +145 -0
  144. package/dist/cli/wrap.js.map +1 -0
  145. package/dist/drivers/anthropic/cachePoints.js +77 -0
  146. package/dist/drivers/anthropic/cachePoints.js.map +1 -0
  147. package/dist/drivers/anthropic/client.js +432 -0
  148. package/dist/drivers/anthropic/client.js.map +1 -0
  149. package/dist/drivers/anthropic/index.js +10 -0
  150. package/dist/drivers/anthropic/index.js.map +1 -0
  151. package/dist/drivers/anthropic/manifest.js +221 -0
  152. package/dist/drivers/anthropic/manifest.js.map +1 -0
  153. package/dist/drivers/cerebras/client.js +69 -0
  154. package/dist/drivers/cerebras/client.js.map +1 -0
  155. package/dist/drivers/cerebras/index.js +5 -0
  156. package/dist/drivers/cerebras/index.js.map +1 -0
  157. package/dist/drivers/cerebras/manifest.js +140 -0
  158. package/dist/drivers/cerebras/manifest.js.map +1 -0
  159. package/dist/drivers/clientId.js +41 -0
  160. package/dist/drivers/clientId.js.map +1 -0
  161. package/dist/drivers/contextOverflow.js +77 -0
  162. package/dist/drivers/contextOverflow.js.map +1 -0
  163. package/dist/drivers/deepseek/client.js +168 -0
  164. package/dist/drivers/deepseek/client.js.map +1 -0
  165. package/dist/drivers/deepseek/index.js +16 -0
  166. package/dist/drivers/deepseek/index.js.map +1 -0
  167. package/dist/drivers/deepseek/inlineTools.js +46 -0
  168. package/dist/drivers/deepseek/inlineTools.js.map +1 -0
  169. package/dist/drivers/deepseek/manifest.js +166 -0
  170. package/dist/drivers/deepseek/manifest.js.map +1 -0
  171. package/dist/drivers/gemini/client.js +38 -0
  172. package/dist/drivers/gemini/client.js.map +1 -0
  173. package/dist/drivers/gemini/index.js +5 -0
  174. package/dist/drivers/gemini/index.js.map +1 -0
  175. package/dist/drivers/gemini/manifest.js +150 -0
  176. package/dist/drivers/gemini/manifest.js.map +1 -0
  177. package/dist/drivers/glm/client.js +90 -0
  178. package/dist/drivers/glm/client.js.map +1 -0
  179. package/dist/drivers/glm/index.js +9 -0
  180. package/dist/drivers/glm/index.js.map +1 -0
  181. package/dist/drivers/glm/manifest.js +183 -0
  182. package/dist/drivers/glm/manifest.js.map +1 -0
  183. package/dist/drivers/groq/client.js +80 -0
  184. package/dist/drivers/groq/client.js.map +1 -0
  185. package/dist/drivers/groq/index.js +5 -0
  186. package/dist/drivers/groq/index.js.map +1 -0
  187. package/dist/drivers/groq/manifest.js +160 -0
  188. package/dist/drivers/groq/manifest.js.map +1 -0
  189. package/dist/drivers/kimi/client.js +82 -0
  190. package/dist/drivers/kimi/client.js.map +1 -0
  191. package/dist/drivers/kimi/index.js +9 -0
  192. package/dist/drivers/kimi/index.js.map +1 -0
  193. package/dist/drivers/kimi/manifest.js +168 -0
  194. package/dist/drivers/kimi/manifest.js.map +1 -0
  195. package/dist/drivers/meta/client.js +30 -0
  196. package/dist/drivers/meta/client.js.map +1 -0
  197. package/dist/drivers/meta/index.js +5 -0
  198. package/dist/drivers/meta/index.js.map +1 -0
  199. package/dist/drivers/meta/manifest.js +101 -0
  200. package/dist/drivers/meta/manifest.js.map +1 -0
  201. package/dist/drivers/minimax/client.js +36 -0
  202. package/dist/drivers/minimax/client.js.map +1 -0
  203. package/dist/drivers/minimax/index.js +5 -0
  204. package/dist/drivers/minimax/index.js.map +1 -0
  205. package/dist/drivers/minimax/manifest.js +120 -0
  206. package/dist/drivers/minimax/manifest.js.map +1 -0
  207. package/dist/drivers/mistral/client.js +54 -0
  208. package/dist/drivers/mistral/client.js.map +1 -0
  209. package/dist/drivers/mistral/index.js +5 -0
  210. package/dist/drivers/mistral/index.js.map +1 -0
  211. package/dist/drivers/mistral/manifest.js +118 -0
  212. package/dist/drivers/mistral/manifest.js.map +1 -0
  213. package/dist/drivers/openai/client.js +290 -0
  214. package/dist/drivers/openai/client.js.map +1 -0
  215. package/dist/drivers/openai/index.js +9 -0
  216. package/dist/drivers/openai/index.js.map +1 -0
  217. package/dist/drivers/openai/manifest.js +133 -0
  218. package/dist/drivers/openai/manifest.js.map +1 -0
  219. package/dist/drivers/openaiCompat/wire.js +493 -0
  220. package/dist/drivers/openaiCompat/wire.js.map +1 -0
  221. package/dist/drivers/partialTurn.js +23 -0
  222. package/dist/drivers/partialTurn.js.map +1 -0
  223. package/dist/drivers/providerError.js +181 -0
  224. package/dist/drivers/providerError.js.map +1 -0
  225. package/dist/drivers/qwen/client.js +93 -0
  226. package/dist/drivers/qwen/client.js.map +1 -0
  227. package/dist/drivers/qwen/index.js +9 -0
  228. package/dist/drivers/qwen/index.js.map +1 -0
  229. package/dist/drivers/qwen/manifest.js +146 -0
  230. package/dist/drivers/qwen/manifest.js.map +1 -0
  231. package/dist/drivers/registry.js +177 -0
  232. package/dist/drivers/registry.js.map +1 -0
  233. package/dist/drivers/retryPolicy.js +129 -0
  234. package/dist/drivers/retryPolicy.js.map +1 -0
  235. package/dist/drivers/searchBlocks.js +61 -0
  236. package/dist/drivers/searchBlocks.js.map +1 -0
  237. package/dist/drivers/types.js +2 -0
  238. package/dist/drivers/types.js.map +1 -0
  239. package/dist/drivers/xai/client.js +63 -0
  240. package/dist/drivers/xai/client.js.map +1 -0
  241. package/dist/drivers/xai/index.js +5 -0
  242. package/dist/drivers/xai/index.js.map +1 -0
  243. package/dist/drivers/xai/manifest.js +137 -0
  244. package/dist/drivers/xai/manifest.js.map +1 -0
  245. package/dist/dynamo/_probe.tmp.js +20 -0
  246. package/dist/dynamo/_probe.tmp.js.map +1 -0
  247. package/dist/dynamo/cacheBreak.js +88 -0
  248. package/dist/dynamo/cacheBreak.js.map +1 -0
  249. package/dist/dynamo/contextWindow.js +243 -0
  250. package/dist/dynamo/contextWindow.js.map +1 -0
  251. package/dist/dynamo/engine.js +2011 -0
  252. package/dist/dynamo/engine.js.map +1 -0
  253. package/dist/dynamo/guard.js +132 -0
  254. package/dist/dynamo/guard.js.map +1 -0
  255. package/dist/dynamo/liveMeter.js +58 -0
  256. package/dist/dynamo/liveMeter.js.map +1 -0
  257. package/dist/dynamo/model.js +172 -0
  258. package/dist/dynamo/model.js.map +1 -0
  259. package/dist/dynamo/planArtifact.js +125 -0
  260. package/dist/dynamo/planArtifact.js.map +1 -0
  261. package/dist/dynamo/pricing.js +140 -0
  262. package/dist/dynamo/pricing.js.map +1 -0
  263. package/dist/dynamo/prompt.js +264 -0
  264. package/dist/dynamo/prompt.js.map +1 -0
  265. package/dist/dynamo/spend.js +45 -0
  266. package/dist/dynamo/spend.js.map +1 -0
  267. package/dist/dynamo/verify.js +483 -0
  268. package/dist/dynamo/verify.js.map +1 -0
  269. package/dist/governor/forbidden.js +181 -0
  270. package/dist/governor/forbidden.js.map +1 -0
  271. package/dist/governor/freshness.js +83 -0
  272. package/dist/governor/freshness.js.map +1 -0
  273. package/dist/governor/frontmatter.js +38 -0
  274. package/dist/governor/frontmatter.js.map +1 -0
  275. package/dist/governor/glob.js +75 -0
  276. package/dist/governor/glob.js.map +1 -0
  277. package/dist/governor/index.js +87 -0
  278. package/dist/governor/index.js.map +1 -0
  279. package/dist/governor/rules.js +80 -0
  280. package/dist/governor/rules.js.map +1 -0
  281. package/dist/governor/scope.js +91 -0
  282. package/dist/governor/scope.js.map +1 -0
  283. package/dist/governor/skills.js +176 -0
  284. package/dist/governor/skills.js.map +1 -0
  285. package/dist/governor/types.js +16 -0
  286. package/dist/governor/types.js.map +1 -0
  287. package/dist/governor/write.js +182 -0
  288. package/dist/governor/write.js.map +1 -0
  289. package/dist/index.js +89 -0
  290. package/dist/index.js.map +1 -0
  291. package/dist/mcp/catalog.js +232 -0
  292. package/dist/mcp/catalog.js.map +1 -0
  293. package/dist/mcp/config.js +116 -0
  294. package/dist/mcp/config.js.map +1 -0
  295. package/dist/mcp/configWrite.js +254 -0
  296. package/dist/mcp/configWrite.js.map +1 -0
  297. package/dist/mcp/connection.js +504 -0
  298. package/dist/mcp/connection.js.map +1 -0
  299. package/dist/mcp/deferred.js +104 -0
  300. package/dist/mcp/deferred.js.map +1 -0
  301. package/dist/mcp/discover.js +128 -0
  302. package/dist/mcp/discover.js.map +1 -0
  303. package/dist/mcp/manager.js +679 -0
  304. package/dist/mcp/manager.js.map +1 -0
  305. package/dist/mcp/paramHeaders.js +163 -0
  306. package/dist/mcp/paramHeaders.js.map +1 -0
  307. package/dist/mcp/prompts.js +136 -0
  308. package/dist/mcp/prompts.js.map +1 -0
  309. package/dist/mcp/protocol.js +171 -0
  310. package/dist/mcp/protocol.js.map +1 -0
  311. package/dist/mcp/resources.js +119 -0
  312. package/dist/mcp/resources.js.map +1 -0
  313. package/dist/mcp/resultStore.js +180 -0
  314. package/dist/mcp/resultStore.js.map +1 -0
  315. package/dist/mcp/subscriptions.js +74 -0
  316. package/dist/mcp/subscriptions.js.map +1 -0
  317. package/dist/mcp/transport/headerValue.js +40 -0
  318. package/dist/mcp/transport/headerValue.js.map +1 -0
  319. package/dist/mcp/transport/http.js +321 -0
  320. package/dist/mcp/transport/http.js.map +1 -0
  321. package/dist/mcp/transport/stdio.js +234 -0
  322. package/dist/mcp/transport/stdio.js.map +1 -0
  323. package/dist/mcp/transport/types.js +27 -0
  324. package/dist/mcp/transport/types.js.map +1 -0
  325. package/dist/mcp/trust.js +98 -0
  326. package/dist/mcp/trust.js.map +1 -0
  327. package/dist/mcp/trustStore.js +55 -0
  328. package/dist/mcp/trustStore.js.map +1 -0
  329. package/dist/memory/autoMemory.js +340 -0
  330. package/dist/memory/autoMemory.js.map +1 -0
  331. package/dist/memory/compaction.js +513 -0
  332. package/dist/memory/compaction.js.map +1 -0
  333. package/dist/memory/images.js +173 -0
  334. package/dist/memory/images.js.map +1 -0
  335. package/dist/memory/presence.js +59 -0
  336. package/dist/memory/presence.js.map +1 -0
  337. package/dist/memory/projectNotes.js +247 -0
  338. package/dist/memory/projectNotes.js.map +1 -0
  339. package/dist/memory/restore.js +72 -0
  340. package/dist/memory/restore.js.map +1 -0
  341. package/dist/memory/session.js +472 -0
  342. package/dist/memory/session.js.map +1 -0
  343. package/dist/memory/sessionMemory.js +142 -0
  344. package/dist/memory/sessionMemory.js.map +1 -0
  345. package/dist/memory/sessionMemoryCompact.js +136 -0
  346. package/dist/memory/sessionMemoryCompact.js.map +1 -0
  347. package/dist/memory/store.js +217 -0
  348. package/dist/memory/store.js.map +1 -0
  349. package/dist/memory/types.js +14 -0
  350. package/dist/memory/types.js.map +1 -0
  351. package/dist/memory/workingSet.js +383 -0
  352. package/dist/memory/workingSet.js.map +1 -0
  353. package/dist/project/context.js +425 -0
  354. package/dist/project/context.js.map +1 -0
  355. package/dist/tools/approval.js +189 -0
  356. package/dist/tools/approval.js.map +1 -0
  357. package/dist/tools/askUser.js +103 -0
  358. package/dist/tools/askUser.js.map +1 -0
  359. package/dist/tools/atomicWrite.js +151 -0
  360. package/dist/tools/atomicWrite.js.map +1 -0
  361. package/dist/tools/backgroundShells.js +468 -0
  362. package/dist/tools/backgroundShells.js.map +1 -0
  363. package/dist/tools/captureSweep.js +77 -0
  364. package/dist/tools/captureSweep.js.map +1 -0
  365. package/dist/tools/chassisMux.js +92 -0
  366. package/dist/tools/chassisMux.js.map +1 -0
  367. package/dist/tools/checkpoints.js +328 -0
  368. package/dist/tools/checkpoints.js.map +1 -0
  369. package/dist/tools/codeIntel.js +267 -0
  370. package/dist/tools/codeIntel.js.map +1 -0
  371. package/dist/tools/deferredNative.js +121 -0
  372. package/dist/tools/deferredNative.js.map +1 -0
  373. package/dist/tools/detail.js +135 -0
  374. package/dist/tools/detail.js.map +1 -0
  375. package/dist/tools/diagnostics.js +174 -0
  376. package/dist/tools/diagnostics.js.map +1 -0
  377. package/dist/tools/edit.js +167 -0
  378. package/dist/tools/edit.js.map +1 -0
  379. package/dist/tools/editCore.js +283 -0
  380. package/dist/tools/editCore.js.map +1 -0
  381. package/dist/tools/editFile.js +183 -0
  382. package/dist/tools/editFile.js.map +1 -0
  383. package/dist/tools/editRipple.js +126 -0
  384. package/dist/tools/editRipple.js.map +1 -0
  385. package/dist/tools/editTarget.js +131 -0
  386. package/dist/tools/editTarget.js.map +1 -0
  387. package/dist/tools/editWindow.js +49 -0
  388. package/dist/tools/editWindow.js.map +1 -0
  389. package/dist/tools/eol.js +56 -0
  390. package/dist/tools/eol.js.map +1 -0
  391. package/dist/tools/exitPlan.js +175 -0
  392. package/dist/tools/exitPlan.js.map +1 -0
  393. package/dist/tools/focus.js +42 -0
  394. package/dist/tools/focus.js.map +1 -0
  395. package/dist/tools/gitignore.js +148 -0
  396. package/dist/tools/gitignore.js.map +1 -0
  397. package/dist/tools/glob.js +134 -0
  398. package/dist/tools/glob.js.map +1 -0
  399. package/dist/tools/governorTools.js +258 -0
  400. package/dist/tools/governorTools.js.map +1 -0
  401. package/dist/tools/grep.js +450 -0
  402. package/dist/tools/grep.js.map +1 -0
  403. package/dist/tools/guard.js +220 -0
  404. package/dist/tools/guard.js.map +1 -0
  405. package/dist/tools/killTree.js +215 -0
  406. package/dist/tools/killTree.js.map +1 -0
  407. package/dist/tools/listDir.js +143 -0
  408. package/dist/tools/listDir.js.map +1 -0
  409. package/dist/tools/mcpAdd.js +176 -0
  410. package/dist/tools/mcpAdd.js.map +1 -0
  411. package/dist/tools/mcpResources.js +116 -0
  412. package/dist/tools/mcpResources.js.map +1 -0
  413. package/dist/tools/mcpSearch.js +123 -0
  414. package/dist/tools/mcpSearch.js.map +1 -0
  415. package/dist/tools/multiEdit.js +168 -0
  416. package/dist/tools/multiEdit.js.map +1 -0
  417. package/dist/tools/paths.js +225 -0
  418. package/dist/tools/paths.js.map +1 -0
  419. package/dist/tools/posixShell.js +123 -0
  420. package/dist/tools/posixShell.js.map +1 -0
  421. package/dist/tools/readFile.js +371 -0
  422. package/dist/tools/readFile.js.map +1 -0
  423. package/dist/tools/readSymbol.js +145 -0
  424. package/dist/tools/readSymbol.js.map +1 -0
  425. package/dist/tools/registry.js +120 -0
  426. package/dist/tools/registry.js.map +1 -0
  427. package/dist/tools/replaceSymbol.js +141 -0
  428. package/dist/tools/replaceSymbol.js.map +1 -0
  429. package/dist/tools/results.js +15 -0
  430. package/dist/tools/results.js.map +1 -0
  431. package/dist/tools/ripgrep.js +145 -0
  432. package/dist/tools/ripgrep.js.map +1 -0
  433. package/dist/tools/runCommand.js +633 -0
  434. package/dist/tools/runCommand.js.map +1 -0
  435. package/dist/tools/saveMemory.js +102 -0
  436. package/dist/tools/saveMemory.js.map +1 -0
  437. package/dist/tools/screenshot.js +200 -0
  438. package/dist/tools/screenshot.js.map +1 -0
  439. package/dist/tools/screenshotWin.js +227 -0
  440. package/dist/tools/screenshotWin.js.map +1 -0
  441. package/dist/tools/search.js +121 -0
  442. package/dist/tools/search.js.map +1 -0
  443. package/dist/tools/sessionTools.js +187 -0
  444. package/dist/tools/sessionTools.js.map +1 -0
  445. package/dist/tools/shellCheckpoint.js +123 -0
  446. package/dist/tools/shellCheckpoint.js.map +1 -0
  447. package/dist/tools/shellLint.js +102 -0
  448. package/dist/tools/shellLint.js.map +1 -0
  449. package/dist/tools/shellTools.js +203 -0
  450. package/dist/tools/shellTools.js.map +1 -0
  451. package/dist/tools/spanCore.js +78 -0
  452. package/dist/tools/spanCore.js.map +1 -0
  453. package/dist/tools/subagent.js +224 -0
  454. package/dist/tools/subagent.js.map +1 -0
  455. package/dist/tools/subagentReport.js +114 -0
  456. package/dist/tools/subagentReport.js.map +1 -0
  457. package/dist/tools/tempSweep.js +118 -0
  458. package/dist/tools/tempSweep.js.map +1 -0
  459. package/dist/tools/todo.js +117 -0
  460. package/dist/tools/todo.js.map +1 -0
  461. package/dist/tools/types.js +2 -0
  462. package/dist/tools/types.js.map +1 -0
  463. package/dist/tools/untrusted.js +46 -0
  464. package/dist/tools/untrusted.js.map +1 -0
  465. package/dist/tools/useSkill.js +62 -0
  466. package/dist/tools/useSkill.js.map +1 -0
  467. package/dist/tools/walk.js +152 -0
  468. package/dist/tools/walk.js.map +1 -0
  469. package/dist/tools/web.js +61 -0
  470. package/dist/tools/web.js.map +1 -0
  471. package/dist/tools/webFetch.js +444 -0
  472. package/dist/tools/webFetch.js.map +1 -0
  473. package/dist/tools/webSearch.js +130 -0
  474. package/dist/tools/webSearch.js.map +1 -0
  475. package/dist/tools/workspace.js +212 -0
  476. package/dist/tools/workspace.js.map +1 -0
  477. package/dist/tools/workspaceDiscover.js +216 -0
  478. package/dist/tools/workspaceDiscover.js.map +1 -0
  479. package/dist/tools/writeFile.js +162 -0
  480. package/dist/tools/writeFile.js.map +1 -0
  481. package/package.json +74 -28
@@ -0,0 +1,336 @@
1
+ /**
2
+ * isolation.ts — run oversized tree-sitter grammars where they cannot kill us.
3
+ *
4
+ * The OCaml grammar's parser tables are large enough that compiling its WASM can
5
+ * fail V8's internal zone allocation — `Fatal process out of memory: Zone` — and
6
+ * that failure is not an exception: it takes the whole process down. The suite
7
+ * previously CONTAINED this with heap headroom (--max-old-space-size) and test
8
+ * sequencing, which protects the test runner and does nothing for a user whose
9
+ * repository simply contains .ml files. objc's grammar is half again bigger, so
10
+ * the same fuse is lit under a language nobody has tripped yet.
11
+ *
12
+ * The cure is isolation, not headroom: grammars past a size threshold are loaded and
13
+ * parsed inside a separate CHILD PROCESS. When one dies, the extraction call resolves
14
+ * to null, which is already the contract every caller handles (tree-sitter is the
15
+ * fallback tier; null means "defer to grep/read"). A crash that used to be fatal
16
+ * becomes a degraded answer.
17
+ *
18
+ * ── WHY A PROCESS, NOT A WORKER THREAD ──────────────────────────────────────────
19
+ *
20
+ * This was a worker_thread with `resourceLimits`, on the reasoning that V8 terminates
21
+ * a worker which exceeds them and leaves the host untouched. That reasoning is right
22
+ * for the wrong failure. MEASURED, in the compiled build, with no teardown requested:
23
+ * parsing two lines of OCaml returned a CORRECT result and then killed the host with
24
+ * exit code 3.
25
+ *
26
+ * The distinction that matters is which allocator runs out:
27
+ * - a JS HEAP overrun is thread-local; V8 kills the worker cleanly
28
+ * (`ERR_WORKER_OUT_OF_MEMORY`) and the host carries on. This is what the old
29
+ * "reproduction" test exercised by shrinking the heap to 8 MB, which is why the
30
+ * containment looked like it worked.
31
+ * - a ZONE overrun — the arena V8 uses while compiling — calls
32
+ * `FatalProcessOutOfMemory`, which ABORTS THE PROCESS. It is not thread-local and
33
+ * `resourceLimits` do not govern it, because a Zone is neither the heap nor the
34
+ * code range.
35
+ *
36
+ * The OCaml grammar hits the second one. A thread shares the process with its host, so
37
+ * no thread-level mechanism can contain a process-level abort; a separate process is
38
+ * the only boundary V8's fatal handler cannot cross. Verified by construction: the
39
+ * child aborting is now an ordinary non-zero exit that this module observes.
40
+ *
41
+ * Mechanics worth knowing:
42
+ * - The child imports treesitter.ts itself and calls the SAME entry points; an env
43
+ * flag stops it recursing into isolation. No extraction logic is duplicated.
44
+ * - One child serves all heavy grammars, spawned on first need, respawned after a
45
+ * crash a bounded number of times. A grammar in flight when the child dies is
46
+ * POISONED: further requests for it return null immediately rather than
47
+ * re-crashing a fresh child on the same input forever.
48
+ * - Requests carry a deadline. A wedged child (stuck, not crashed) is killed and
49
+ * treated exactly like a crash. The host never waits on it unboundedly.
50
+ * - The child's stdio is discarded. When it dies it prints a V8 crash dump, and that
51
+ * is our normal degraded path — not something to spray across the user's terminal.
52
+ *
53
+ * Everything configurable reads the environment at spawn/call time, so tests can shrink
54
+ * the limits to reproduce the original crash condition and prove the host survives it.
55
+ */
56
+ import { fork } from "node:child_process";
57
+ import { fileURLToPath } from "node:url";
58
+ /** Set in the child by the host at spawn. It is what stops the entry points the child
59
+ * calls from routing straight back out into isolation. */
60
+ export const IN_WORKER = process.env.MINDWEAVE_TS_IN_WORKER === "1";
61
+ /** Child heap ceiling. Generous for one grammar + one file; small enough that a
62
+ * pathological compile dies over there instead of paging the machine. Secondary to
63
+ * the process boundary itself, which is what actually contains a Zone abort. */
64
+ function workerHeapMb() {
65
+ return envInt("MINDWEAVE_TS_WORKER_HEAP_MB", 768);
66
+ }
67
+ /**
68
+ * Retire the worker once its RSS passes this, and start a fresh one on the next call.
69
+ *
70
+ * This is the containment that matters in practice, and it exists because of a
71
+ * measurement, not a theory: `parse()` followed by `tree.delete()` retains memory that
72
+ * never comes back. On a 54 KB JSX-heavy file that is ~57-70 MB PER PARSE, and it is
73
+ * WASM linear memory, which by specification can grow and never shrink. Indexing 120
74
+ * ordinary source files (960 KB in total) peaked at 1.9 GB.
75
+ *
76
+ * There is no version of this we can fix upstream today: the current runtime is pinned
77
+ * to `web-tree-sitter` 0.20.x to match `tree-sitter-wasms`' grammar ABI, and the newest
78
+ * runtime refuses those grammars outright (verified by loading one into it).
79
+ *
80
+ * So memory is bounded the one way that does not depend on understanding the leak: the
81
+ * child is watched and replaced. RSS is read in the CHILD and reported with every reply
82
+ * — the host cannot see a child's memory, and a proxy like "bytes parsed" does not
83
+ * track it (a clean 1.4 MB file costs 107 MB; a 54 KB JSX one costs more).
84
+ *
85
+ * The cost of a retirement is re-forking and recompiling the grammar wasm on the next
86
+ * call, so this wants to be high enough not to thrash and low enough to stay far from
87
+ * any commit limit.
88
+ */
89
+ function workerRssMb() {
90
+ return envInt("MINDWEAVE_TS_WORKER_RSS_MB", 800);
91
+ }
92
+ /** Per-request deadline. Parsing one file is fast; anything past this is wedged. */
93
+ function requestTimeoutMs() {
94
+ return envInt("MINDWEAVE_TS_WORKER_TIMEOUT_MS", 15_000);
95
+ }
96
+ /** How many times a dead worker is replaced before extraction goes dark for the
97
+ * session. Two respawns tolerates a transient; a third death is a pattern. Reads the
98
+ * environment like every other limit here, so a test can shrink it far enough to
99
+ * actually reach exhaustion instead of asserting around it. */
100
+ function maxRespawns() {
101
+ return envInt("MINDWEAVE_TS_MAX_RESPAWNS", 2);
102
+ }
103
+ /** With nothing in flight, the worker shuts itself down after this quiet period
104
+ * and respawns on demand. Two reasons: it returns the grammar's sizeable WASM
105
+ * heap when a burst of .ml work ends, and it guarantees the worker can never
106
+ * hold the host process open at exit — `unref()` is not sufficient under every
107
+ * loader (the tsx bootstrap holds a ref the parent cannot shed).
108
+ *
109
+ * 30 seconds, not 3: a respawn re-pays worker startup AND recompiling the
110
+ * grammar wasm, so a short window turns interleaved heavy/light work (the test
111
+ * suite is exactly this shape) into respawn thrash. Half a minute keeps bursts
112
+ * warm; a session that touches .ml once still gets its memory back promptly. */
113
+ function idleShutdownMs() {
114
+ return envInt("MINDWEAVE_TS_WORKER_IDLE_MS", 30_000);
115
+ }
116
+ let idleTimer = null;
117
+ function armIdleShutdown() {
118
+ if (idleTimer)
119
+ clearTimeout(idleTimer);
120
+ idleTimer = setTimeout(() => {
121
+ idleTimer = null;
122
+ if (worker && pending.size === 0)
123
+ retire(worker);
124
+ }, idleShutdownMs());
125
+ idleTimer.unref?.();
126
+ }
127
+ function envInt(name, fallback) {
128
+ const v = Number(process.env[name]);
129
+ return Number.isFinite(v) && v > 0 ? Math.floor(v) : fallback;
130
+ }
131
+ let worker = null;
132
+ let nextId = 1;
133
+ const pending = new Map();
134
+ const poisoned = new Set();
135
+ let respawns = 0;
136
+ /** The worker that has crossed its memory budget, retired as soon as it goes idle.
137
+ * Held as the CHILD, not a boolean, so a flag raised against one worker can never
138
+ * retire its replacement. */
139
+ let overBudget = null;
140
+ /** Replies served by the CURRENT worker. A worker that has done real work and then
141
+ * dies is a fresh incident, not a continuing crash loop — see `respawns`. */
142
+ let served = 0;
143
+ /** Replies after which the current worker counts as healthy and the crash history
144
+ * clears. Low, because the failure this guards against (a fatal input crashing every
145
+ * replacement) reproduces on the FIRST request every time. */
146
+ const HEALTHY_REPLIES = 5;
147
+ /** Visible for tests: how many workers this process has started, lost, and replaced
148
+ * deliberately. `retirements` is the planned kind and must never count as a crash. */
149
+ export const isolationStats = { spawns: 0, crashes: 0, retirements: 0 };
150
+ /** Shut a worker down deliberately: strip its listeners FIRST so the exit it is about
151
+ * to emit is not read as a crash (no respawn charged, no grammar poisoned). Shared by
152
+ * the idle timer and the memory budget, which differ only in what prompts them. */
153
+ function retire(w) {
154
+ if (worker === w)
155
+ worker = null;
156
+ if (overBudget === w)
157
+ overBudget = null;
158
+ served = 0;
159
+ w.removeAllListeners();
160
+ w.kill();
161
+ }
162
+ /**
163
+ * Which file the child runs, and how.
164
+ *
165
+ * `fork` inherits the parent's `execArgv` by default, and that one fact removes the
166
+ * whole bootstrap this needed as a thread. Under tsx (tests, dev from source) the
167
+ * parent already carries tsx's loader flags, so the child gets them too and resolves
168
+ * the `.ts` entry and every transitive `.js`→`.ts` import exactly as the parent does.
169
+ * Under the compiled build there are no extra flags and the child runs the `.js`
170
+ * directly. No `eval` shim, no loader registration, no divergence between the two.
171
+ */
172
+ function workerEntry() {
173
+ const here = import.meta.url;
174
+ const file = here.endsWith(".ts") ? "./extractWorker.ts" : "./extractWorker.js";
175
+ return {
176
+ entry: fileURLToPath(new URL(file, here)),
177
+ // Bound the child's heap as a secondary guard. It is NOT what contains the Zone
178
+ // abort — the process boundary is — but it stops a pathological compile from
179
+ // eating the machine before it dies.
180
+ execArgv: [...process.execArgv, `--max-old-space-size=${workerHeapMb()}`],
181
+ env: { ...process.env, MINDWEAVE_TS_IN_WORKER: "1" },
182
+ };
183
+ }
184
+ function ensureWorker() {
185
+ if (worker)
186
+ return worker;
187
+ if (respawns > maxRespawns())
188
+ return null;
189
+ const { entry, execArgv, env } = workerEntry();
190
+ isolationStats.spawns++;
191
+ served = 0;
192
+ const w = fork(entry, [], {
193
+ execArgv,
194
+ env,
195
+ // Discard the child's output. A dying grammar prints a V8 crash dump, and that is
196
+ // this module's ordinary degraded path — the user should see a missing outline,
197
+ // not a stack trace they cannot act on. `ipc` is what `fork` talks over.
198
+ stdio: ["ignore", "ignore", "ignore", "ipc"],
199
+ });
200
+ w.unref(); // never keep the host process alive for us
201
+ w.channel?.unref(); // nor the IPC channel, which refs the loop independently
202
+ w.on("message", (msg) => {
203
+ const p = pending.get(msg.id);
204
+ if (!p)
205
+ return;
206
+ pending.delete(msg.id);
207
+ clearTimeout(p.timer);
208
+ p.resolve(msg.result ?? null);
209
+ // A worker that has answered a few times is working, whatever it does later. Without
210
+ // this, three unrelated crashes spread across a long session would exhaust the
211
+ // respawn budget and silently switch code intelligence off for good — which matters
212
+ // far more now that EVERY grammar depends on this worker, not just the exotic ones.
213
+ if (++served >= HEALTHY_REPLIES)
214
+ respawns = 0;
215
+ // The child measures itself; see workerRssMb for why this is read over there and
216
+ // why it is memory rather than a proxy for it.
217
+ if (typeof msg.rss === "number" && msg.rss > workerRssMb() * 1024 * 1024)
218
+ overBudget = w;
219
+ if (pending.size !== 0)
220
+ return;
221
+ // Retire only once nothing is in flight, so a request never dies for a reason that
222
+ // has nothing to do with it.
223
+ if (overBudget === w) {
224
+ isolationStats.retirements++;
225
+ if (idleTimer) {
226
+ clearTimeout(idleTimer);
227
+ idleTimer = null;
228
+ }
229
+ retire(w);
230
+ return;
231
+ }
232
+ armIdleShutdown();
233
+ });
234
+ const dead = () => {
235
+ if (worker === w)
236
+ worker = null;
237
+ if (overBudget === w)
238
+ overBudget = null;
239
+ served = 0;
240
+ isolationStats.crashes++;
241
+ respawns++;
242
+ // Whatever was in flight ON THIS CHILD is the likely culprit — poison it so the
243
+ // next spawn is not fed the same fatal input, and resolve those waiters with the
244
+ // null that "fallback tier unavailable" has always meant. Requests already running
245
+ // on a replacement child are untouched.
246
+ for (const [id, p] of pending) {
247
+ if (p.child !== w)
248
+ continue;
249
+ poisoned.add(p.grammarFile);
250
+ clearTimeout(p.timer);
251
+ p.resolve(null);
252
+ pending.delete(id);
253
+ }
254
+ };
255
+ w.on("error", dead);
256
+ w.on("exit", (code, signal) => {
257
+ // A Zone abort arrives here as an ordinary non-zero exit (or a signal), which is
258
+ // the entire point of the process boundary: the thing that used to kill us is now
259
+ // an event we handle.
260
+ if (code !== 0 || signal)
261
+ dead();
262
+ else if (worker === w)
263
+ worker = null;
264
+ });
265
+ worker = w;
266
+ return w;
267
+ }
268
+ /** Run one op in the isolation worker. Null on poison, crash, timeout, or when
269
+ * respawns are exhausted — never a throw, never a host crash. */
270
+ async function callWorker(grammarFile, op, payload) {
271
+ if (poisoned.has(grammarFile))
272
+ return null;
273
+ const w = ensureWorker();
274
+ if (!w)
275
+ return null;
276
+ const id = nextId++;
277
+ return new Promise((resolve) => {
278
+ const timer = setTimeout(() => {
279
+ // Wedged, not crashed: kill it and let the exit handler do the rest — including
280
+ // resolving THIS promise via the pending sweep.
281
+ w.kill("SIGKILL");
282
+ }, requestTimeoutMs());
283
+ if (idleTimer) {
284
+ clearTimeout(idleTimer);
285
+ idleTimer = null;
286
+ }
287
+ pending.set(id, { resolve: resolve, grammarFile, timer, child: w });
288
+ w.send({ id, op, ...payload });
289
+ });
290
+ }
291
+ /** Extraction for a heavy grammar, isolated. Same contract as treeSitterExtract. */
292
+ export function isolatedExtract(grammarFile, absPath, code) {
293
+ return callWorker(grammarFile, "extract", { absPath, code });
294
+ }
295
+ /**
296
+ * HTML/CSS extraction, isolated. Same contract as extractMarkup.
297
+ *
298
+ * The markup tier walks the parse tree directly rather than running a tag query, and a
299
+ * live tree cannot cross a process boundary — so the whole extraction runs in the
300
+ * child and only the finished defs/refs come back. Until now this tier had no guard of
301
+ * any kind, not even the grammar-size one, while parsing exactly the sort of large
302
+ * nested files that cost the most.
303
+ *
304
+ * Poison is keyed on the HTML grammar for both, since a stylesheet embedded in a page
305
+ * is parsed by the same worker and a crash cannot be attributed to one of the two.
306
+ */
307
+ export function isolatedMarkup(absPath, code) {
308
+ return callWorker("tree-sitter-html.wasm", "markup", { absPath, code });
309
+ }
310
+ /** Span lookup for a heavy grammar, isolated. Same contract as treeSitterSpan. */
311
+ export function isolatedSpan(grammarFile, absPath, code, name, nearLine) {
312
+ return callWorker(grammarFile, "span", { absPath, code, name, nearLine });
313
+ }
314
+ /** Test hook: forget crash history and poison so a fresh scenario starts clean. */
315
+ export function resetIsolationForTests() {
316
+ if (idleTimer) {
317
+ clearTimeout(idleTimer);
318
+ idleTimer = null;
319
+ }
320
+ if (worker) {
321
+ worker.removeAllListeners();
322
+ worker.kill("SIGKILL");
323
+ }
324
+ worker = null;
325
+ overBudget = null;
326
+ served = 0;
327
+ respawns = 0;
328
+ poisoned.clear();
329
+ for (const [, p] of pending)
330
+ clearTimeout(p.timer);
331
+ pending.clear();
332
+ isolationStats.spawns = 0;
333
+ isolationStats.crashes = 0;
334
+ isolationStats.retirements = 0;
335
+ }
336
+ //# sourceMappingURL=isolation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isolation.js","sourceRoot":"","sources":["../../../src/alternator/chassis/isolation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * langCases.ts — shared checker and case list for the broad-language tests.
3
+ *
4
+ * Loading every grammar wasm in one process exhausts V8's heap, and Node's test
5
+ * runner isolates each test FILE in its own process — so the language cases are
6
+ * split across several test files, each exercising `checkLang` on one PART.
7
+ * Keeping the assertion here means every part verifies identically.
8
+ *
9
+ * The parts are balanced by GRAMMAR BYTES, not by case count, because grammars
10
+ * differ in size by more than a hundredfold (lua 43KB, ocaml 5MB) and an even count
11
+ * of cases says nothing about the real cost. `PART_BUDGET_BYTES` keeps that from
12
+ * drifting: `langBudget.test.ts` weighs the real wasm files and fails when a part
13
+ * exceeds it, so adding a heavy grammar forces a deliberate re-split.
14
+ *
15
+ * WHAT THIS SPLIT DOES NOT FIX, since the wrong story was believed for a while:
16
+ * the suite's intermittent `Fatal process out of memory: Zone` crash is NOT caused
17
+ * by the balance between parts. It is the `ocaml` grammar, which is the largest and
18
+ * tips V8 over when the machine is already under memory pressure. Measured: the
19
+ * crash still happened with file concurrency forced to 1, and it FOLLOWED ocaml
20
+ * from one part to another when the cases were moved. The actual fix is the heap
21
+ * headroom (`--max-old-space-size`) and the sequential `test:lang` phase in
22
+ * package.json. Balancing the parts is still worth keeping, but do not reach for it
23
+ * when that crash comes back.
24
+ */
25
+ import assert from "node:assert/strict";
26
+ import { treeSitterExtract, isSupported } from "./treesitter.js";
27
+ /** Assert a language's headline symbol extracts, against its real grammar. */
28
+ export async function checkLang(c) {
29
+ assert.ok(isSupported(c.file), `${c.file} should be a supported language`);
30
+ const ex = await treeSitterExtract(c.file, c.code);
31
+ assert.ok(ex, `extraction returned null for ${c.file}`);
32
+ const hit = ex.defs.find((d) => d.name === c.expect.name);
33
+ assert.ok(hit, `expected def '${c.expect.name}' in ${c.file}, got: ${ex.defs.map((d) => d.name).join(", ") || "(none)"}`);
34
+ assert.equal(hit.kind, c.expect.kind);
35
+ }
36
+ /**
37
+ * Ceiling on the grammar bytes any one part may load. Set above the current
38
+ * heaviest part (~6.1MB) with room for an ordinary grammar. A part that exceeds
39
+ * this should be re-split rather than the budget raised.
40
+ */
41
+ export const PART_BUDGET_BYTES = 7_000_000;
42
+ // The four parts, packed heaviest-grammar-first so no part carries two of the big
43
+ // ones. Approximate wasm size is noted per case, since that is the property being
44
+ // balanced and it is otherwise invisible when editing this list.
45
+ export const PART1 = [
46
+ { file: "a.ml", code: "let hello x = do_thing x", expect: { name: "hello", kind: "function" } }, // ocaml ~5.0MB
47
+ { file: "a.c", code: "int hello() { return do_thing(); }", expect: { name: "hello", kind: "function" } }, // ~0.8MB
48
+ { file: "a.go", code: "package main\nfunc Hello() int { return doThing() }", expect: { name: "Hello", kind: "function" } }, // ~0.2MB
49
+ ];
50
+ export const PART2 = [
51
+ { file: "a.cpp", code: "class Foo { public: void bar(); };", expect: { name: "Foo", kind: "class" } }, // ~4.7MB
52
+ { file: "a.php", code: "<?php\nfunction hello() { return doThing(); }", expect: { name: "hello", kind: "function" } }, // ~0.8MB
53
+ { file: "a.java", code: "class Foo { void bar() { baz(); } }", expect: { name: "Foo", kind: "class" } }, // ~0.4MB
54
+ { file: "a.lua", code: "function hello()\n return doThing()\nend", expect: { name: "hello", kind: "function" } }, // ~0.04MB
55
+ ];
56
+ export const PART3 = [
57
+ { file: "a.kt", code: "class Foo { fun bar() { baz() } }", expect: { name: "Foo", kind: "class" } }, // kotlin ~4.1MB
58
+ { file: "a.sh", code: "hello() {\n do_thing\n}", expect: { name: "hello", kind: "function" } }, // bash ~1.4MB
59
+ { file: "a.scala", code: "class Foo { def bar() = baz() }", expect: { name: "Foo", kind: "class" } }, // ~0.2MB
60
+ ];
61
+ export const PART4 = [
62
+ { file: "a.cs", code: "class Foo { void Bar() { Baz(); } }", expect: { name: "Foo", kind: "class" } }, // c_sharp ~4.0MB
63
+ { file: "a.rs", code: "struct Foo {}\nfn hello() -> i32 { do_thing() }", expect: { name: "Foo", kind: "struct" } }, // ~0.8MB
64
+ { file: "a.zig", code: "fn hello() i32 { return doThing(); }", expect: { name: "hello", kind: "function" } }, // ~0.7MB
65
+ { file: "a.sol", code: "contract Foo {\n function bar() public {}\n}", expect: { name: "Foo", kind: "class" } }, // ~0.4MB
66
+ ];
67
+ /** Every part, for the budget guard. Order matches the file numbering. */
68
+ export const PARTS = [PART1, PART2, PART3, PART4];
69
+ //# sourceMappingURL=langCases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"langCases.js","sourceRoot":"","sources":["../../../src/alternator/chassis/langCases.ts"],"names":[],"mappings":"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"}