mindweave 0.0.1 → 2.1.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.
- package/LICENSE +190 -0
- package/README.md +168 -14
- package/dist/alternator/chassis/cache.js +47 -0
- package/dist/alternator/chassis/cache.js.map +1 -0
- package/dist/alternator/chassis/domRefs.js +53 -0
- package/dist/alternator/chassis/domRefs.js.map +1 -0
- package/dist/alternator/chassis/extractWorker.js +65 -0
- package/dist/alternator/chassis/extractWorker.js.map +1 -0
- package/dist/alternator/chassis/graph.js +221 -0
- package/dist/alternator/chassis/graph.js.map +1 -0
- package/dist/alternator/chassis/index.js +463 -0
- package/dist/alternator/chassis/index.js.map +1 -0
- package/dist/alternator/chassis/isolation.js +336 -0
- package/dist/alternator/chassis/isolation.js.map +1 -0
- package/dist/alternator/chassis/langCases.js +69 -0
- package/dist/alternator/chassis/langCases.js.map +1 -0
- package/dist/alternator/chassis/lsp.js +469 -0
- package/dist/alternator/chassis/lsp.js.map +1 -0
- package/dist/alternator/chassis/markup.js +262 -0
- package/dist/alternator/chassis/markup.js.map +1 -0
- package/dist/alternator/chassis/provision.js +198 -0
- package/dist/alternator/chassis/provision.js.map +1 -0
- package/dist/alternator/chassis/rank.js +72 -0
- package/dist/alternator/chassis/rank.js.map +1 -0
- package/dist/alternator/chassis/servers.js +215 -0
- package/dist/alternator/chassis/servers.js.map +1 -0
- package/dist/alternator/chassis/treesitter.js +608 -0
- package/dist/alternator/chassis/treesitter.js.map +1 -0
- package/dist/alternator/chassis/types.js +24 -0
- package/dist/alternator/chassis/types.js.map +1 -0
- package/dist/alternator/lane.js +67 -0
- package/dist/alternator/lane.js.map +1 -0
- package/dist/cli/App.js +2574 -0
- package/dist/cli/App.js.map +1 -0
- package/dist/cli/altScreen.js +67 -0
- package/dist/cli/altScreen.js.map +1 -0
- package/dist/cli/approvalChannel.js +72 -0
- package/dist/cli/approvalChannel.js.map +1 -0
- package/dist/cli/attachments.js +188 -0
- package/dist/cli/attachments.js.map +1 -0
- package/dist/cli/bootstrap.js +279 -0
- package/dist/cli/bootstrap.js.map +1 -0
- package/dist/cli/chatAnchor.js +94 -0
- package/dist/cli/chatAnchor.js.map +1 -0
- package/dist/cli/commandArgs.js +79 -0
- package/dist/cli/commandArgs.js.map +1 -0
- package/dist/cli/commandRoute.js +78 -0
- package/dist/cli/commandRoute.js.map +1 -0
- package/dist/cli/compaction.js +69 -0
- package/dist/cli/compaction.js.map +1 -0
- package/dist/cli/components/ApprovalBox.js +100 -0
- package/dist/cli/components/ApprovalBox.js.map +1 -0
- package/dist/cli/components/BlockView.js +128 -0
- package/dist/cli/components/BlockView.js.map +1 -0
- package/dist/cli/components/FirstRunFrame.js +41 -0
- package/dist/cli/components/FirstRunFrame.js.map +1 -0
- package/dist/cli/components/KeyManager.js +197 -0
- package/dist/cli/components/KeyManager.js.map +1 -0
- package/dist/cli/components/KeySetup.js +125 -0
- package/dist/cli/components/KeySetup.js.map +1 -0
- package/dist/cli/components/MenuFrame.js +24 -0
- package/dist/cli/components/MenuFrame.js.map +1 -0
- package/dist/cli/components/Picker.js +82 -0
- package/dist/cli/components/Picker.js.map +1 -0
- package/dist/cli/components/PromptInput.js +509 -0
- package/dist/cli/components/PromptInput.js.map +1 -0
- package/dist/cli/components/SubagentView.js +86 -0
- package/dist/cli/components/SubagentView.js.map +1 -0
- package/dist/cli/components/ToolGroup.js +60 -0
- package/dist/cli/components/ToolGroup.js.map +1 -0
- package/dist/cli/components/ToolLine.js +123 -0
- package/dist/cli/components/ToolLine.js.map +1 -0
- package/dist/cli/components/TrustGate.js +37 -0
- package/dist/cli/components/TrustGate.js.map +1 -0
- package/dist/cli/costView.js +40 -0
- package/dist/cli/costView.js.map +1 -0
- package/dist/cli/frameRate.js +30 -0
- package/dist/cli/frameRate.js.map +1 -0
- package/dist/cli/framebuffer/paint.js +165 -0
- package/dist/cli/framebuffer/paint.js.map +1 -0
- package/dist/cli/framebuffer/parse.js +266 -0
- package/dist/cli/framebuffer/parse.js.map +1 -0
- package/dist/cli/framebuffer/screen.js +196 -0
- package/dist/cli/framebuffer/screen.js.map +1 -0
- package/dist/cli/framebuffer/writer.js +139 -0
- package/dist/cli/framebuffer/writer.js.map +1 -0
- package/dist/cli/groupReveal.js +51 -0
- package/dist/cli/groupReveal.js.map +1 -0
- package/dist/cli/help.js +55 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/inputView.js +105 -0
- package/dist/cli/inputView.js.map +1 -0
- package/dist/cli/keyManager.js +65 -0
- package/dist/cli/keyManager.js.map +1 -0
- package/dist/cli/keySetup.js +35 -0
- package/dist/cli/keySetup.js.map +1 -0
- package/dist/cli/keyStore.js +73 -0
- package/dist/cli/keyStore.js.map +1 -0
- package/dist/cli/markdown.js +460 -0
- package/dist/cli/markdown.js.map +1 -0
- package/dist/cli/messageQueue.js +96 -0
- package/dist/cli/messageQueue.js.map +1 -0
- package/dist/cli/modes.js +90 -0
- package/dist/cli/modes.js.map +1 -0
- package/dist/cli/mouse.js +78 -0
- package/dist/cli/mouse.js.map +1 -0
- package/dist/cli/pasteAssembler.js +44 -0
- package/dist/cli/pasteAssembler.js.map +1 -0
- package/dist/cli/pathComplete.js +39 -0
- package/dist/cli/pathComplete.js.map +1 -0
- package/dist/cli/perfLog.js +90 -0
- package/dist/cli/perfLog.js.map +1 -0
- package/dist/cli/reveal.js +32 -0
- package/dist/cli/reveal.js.map +1 -0
- package/dist/cli/revealPace.js +59 -0
- package/dist/cli/revealPace.js.map +1 -0
- package/dist/cli/sessionCarry.js +19 -0
- package/dist/cli/sessionCarry.js.map +1 -0
- package/dist/cli/smoothScroll.js +74 -0
- package/dist/cli/smoothScroll.js.map +1 -0
- package/dist/cli/startupArgs.js +96 -0
- package/dist/cli/startupArgs.js.map +1 -0
- package/dist/cli/terminalRestore.js +34 -0
- package/dist/cli/terminalRestore.js.map +1 -0
- package/dist/cli/toolDisplay.js +219 -0
- package/dist/cli/toolDisplay.js.map +1 -0
- package/dist/cli/toolItems.js +65 -0
- package/dist/cli/toolItems.js.map +1 -0
- package/dist/cli/transcript.js +351 -0
- package/dist/cli/transcript.js.map +1 -0
- package/dist/cli/trust.js +79 -0
- package/dist/cli/trust.js.map +1 -0
- package/dist/cli/version.js +39 -0
- package/dist/cli/version.js.map +1 -0
- package/dist/cli/viewport.js +179 -0
- package/dist/cli/viewport.js.map +1 -0
- package/dist/cli/virtualWindow.js +103 -0
- package/dist/cli/virtualWindow.js.map +1 -0
- package/dist/cli/workingVerb.js +37 -0
- package/dist/cli/workingVerb.js.map +1 -0
- package/dist/cli/wrap.js +145 -0
- package/dist/cli/wrap.js.map +1 -0
- package/dist/drivers/anthropic/cachePoints.js +77 -0
- package/dist/drivers/anthropic/cachePoints.js.map +1 -0
- package/dist/drivers/anthropic/client.js +432 -0
- package/dist/drivers/anthropic/client.js.map +1 -0
- package/dist/drivers/anthropic/index.js +10 -0
- package/dist/drivers/anthropic/index.js.map +1 -0
- package/dist/drivers/anthropic/manifest.js +221 -0
- package/dist/drivers/anthropic/manifest.js.map +1 -0
- package/dist/drivers/cerebras/client.js +69 -0
- package/dist/drivers/cerebras/client.js.map +1 -0
- package/dist/drivers/cerebras/index.js +5 -0
- package/dist/drivers/cerebras/index.js.map +1 -0
- package/dist/drivers/cerebras/manifest.js +140 -0
- package/dist/drivers/cerebras/manifest.js.map +1 -0
- package/dist/drivers/clientId.js +41 -0
- package/dist/drivers/clientId.js.map +1 -0
- package/dist/drivers/contextOverflow.js +77 -0
- package/dist/drivers/contextOverflow.js.map +1 -0
- package/dist/drivers/deepseek/client.js +168 -0
- package/dist/drivers/deepseek/client.js.map +1 -0
- package/dist/drivers/deepseek/index.js +16 -0
- package/dist/drivers/deepseek/index.js.map +1 -0
- package/dist/drivers/deepseek/inlineTools.js +46 -0
- package/dist/drivers/deepseek/inlineTools.js.map +1 -0
- package/dist/drivers/deepseek/manifest.js +166 -0
- package/dist/drivers/deepseek/manifest.js.map +1 -0
- package/dist/drivers/gemini/client.js +38 -0
- package/dist/drivers/gemini/client.js.map +1 -0
- package/dist/drivers/gemini/index.js +5 -0
- package/dist/drivers/gemini/index.js.map +1 -0
- package/dist/drivers/gemini/manifest.js +150 -0
- package/dist/drivers/gemini/manifest.js.map +1 -0
- package/dist/drivers/glm/client.js +90 -0
- package/dist/drivers/glm/client.js.map +1 -0
- package/dist/drivers/glm/index.js +9 -0
- package/dist/drivers/glm/index.js.map +1 -0
- package/dist/drivers/glm/manifest.js +183 -0
- package/dist/drivers/glm/manifest.js.map +1 -0
- package/dist/drivers/groq/client.js +80 -0
- package/dist/drivers/groq/client.js.map +1 -0
- package/dist/drivers/groq/index.js +5 -0
- package/dist/drivers/groq/index.js.map +1 -0
- package/dist/drivers/groq/manifest.js +160 -0
- package/dist/drivers/groq/manifest.js.map +1 -0
- package/dist/drivers/kimi/client.js +82 -0
- package/dist/drivers/kimi/client.js.map +1 -0
- package/dist/drivers/kimi/index.js +9 -0
- package/dist/drivers/kimi/index.js.map +1 -0
- package/dist/drivers/kimi/manifest.js +168 -0
- package/dist/drivers/kimi/manifest.js.map +1 -0
- package/dist/drivers/meta/client.js +30 -0
- package/dist/drivers/meta/client.js.map +1 -0
- package/dist/drivers/meta/index.js +5 -0
- package/dist/drivers/meta/index.js.map +1 -0
- package/dist/drivers/meta/manifest.js +101 -0
- package/dist/drivers/meta/manifest.js.map +1 -0
- package/dist/drivers/minimax/client.js +36 -0
- package/dist/drivers/minimax/client.js.map +1 -0
- package/dist/drivers/minimax/index.js +5 -0
- package/dist/drivers/minimax/index.js.map +1 -0
- package/dist/drivers/minimax/manifest.js +120 -0
- package/dist/drivers/minimax/manifest.js.map +1 -0
- package/dist/drivers/mistral/client.js +54 -0
- package/dist/drivers/mistral/client.js.map +1 -0
- package/dist/drivers/mistral/index.js +5 -0
- package/dist/drivers/mistral/index.js.map +1 -0
- package/dist/drivers/mistral/manifest.js +118 -0
- package/dist/drivers/mistral/manifest.js.map +1 -0
- package/dist/drivers/openai/client.js +290 -0
- package/dist/drivers/openai/client.js.map +1 -0
- package/dist/drivers/openai/index.js +9 -0
- package/dist/drivers/openai/index.js.map +1 -0
- package/dist/drivers/openai/manifest.js +133 -0
- package/dist/drivers/openai/manifest.js.map +1 -0
- package/dist/drivers/openaiCompat/wire.js +493 -0
- package/dist/drivers/openaiCompat/wire.js.map +1 -0
- package/dist/drivers/partialTurn.js +23 -0
- package/dist/drivers/partialTurn.js.map +1 -0
- package/dist/drivers/providerError.js +181 -0
- package/dist/drivers/providerError.js.map +1 -0
- package/dist/drivers/qwen/client.js +93 -0
- package/dist/drivers/qwen/client.js.map +1 -0
- package/dist/drivers/qwen/index.js +9 -0
- package/dist/drivers/qwen/index.js.map +1 -0
- package/dist/drivers/qwen/manifest.js +146 -0
- package/dist/drivers/qwen/manifest.js.map +1 -0
- package/dist/drivers/registry.js +177 -0
- package/dist/drivers/registry.js.map +1 -0
- package/dist/drivers/retryPolicy.js +129 -0
- package/dist/drivers/retryPolicy.js.map +1 -0
- package/dist/drivers/searchBlocks.js +61 -0
- package/dist/drivers/searchBlocks.js.map +1 -0
- package/dist/drivers/types.js +2 -0
- package/dist/drivers/types.js.map +1 -0
- package/dist/drivers/xai/client.js +63 -0
- package/dist/drivers/xai/client.js.map +1 -0
- package/dist/drivers/xai/index.js +5 -0
- package/dist/drivers/xai/index.js.map +1 -0
- package/dist/drivers/xai/manifest.js +137 -0
- package/dist/drivers/xai/manifest.js.map +1 -0
- package/dist/dynamo/_probe.tmp.js +20 -0
- package/dist/dynamo/_probe.tmp.js.map +1 -0
- package/dist/dynamo/cacheBreak.js +88 -0
- package/dist/dynamo/cacheBreak.js.map +1 -0
- package/dist/dynamo/contextWindow.js +243 -0
- package/dist/dynamo/contextWindow.js.map +1 -0
- package/dist/dynamo/engine.js +2011 -0
- package/dist/dynamo/engine.js.map +1 -0
- package/dist/dynamo/guard.js +132 -0
- package/dist/dynamo/guard.js.map +1 -0
- package/dist/dynamo/liveMeter.js +58 -0
- package/dist/dynamo/liveMeter.js.map +1 -0
- package/dist/dynamo/model.js +172 -0
- package/dist/dynamo/model.js.map +1 -0
- package/dist/dynamo/planArtifact.js +125 -0
- package/dist/dynamo/planArtifact.js.map +1 -0
- package/dist/dynamo/pricing.js +140 -0
- package/dist/dynamo/pricing.js.map +1 -0
- package/dist/dynamo/prompt.js +264 -0
- package/dist/dynamo/prompt.js.map +1 -0
- package/dist/dynamo/spend.js +45 -0
- package/dist/dynamo/spend.js.map +1 -0
- package/dist/dynamo/verify.js +483 -0
- package/dist/dynamo/verify.js.map +1 -0
- package/dist/governor/forbidden.js +181 -0
- package/dist/governor/forbidden.js.map +1 -0
- package/dist/governor/freshness.js +83 -0
- package/dist/governor/freshness.js.map +1 -0
- package/dist/governor/frontmatter.js +38 -0
- package/dist/governor/frontmatter.js.map +1 -0
- package/dist/governor/glob.js +75 -0
- package/dist/governor/glob.js.map +1 -0
- package/dist/governor/index.js +87 -0
- package/dist/governor/index.js.map +1 -0
- package/dist/governor/rules.js +80 -0
- package/dist/governor/rules.js.map +1 -0
- package/dist/governor/scope.js +91 -0
- package/dist/governor/scope.js.map +1 -0
- package/dist/governor/skills.js +176 -0
- package/dist/governor/skills.js.map +1 -0
- package/dist/governor/types.js +16 -0
- package/dist/governor/types.js.map +1 -0
- package/dist/governor/write.js +182 -0
- package/dist/governor/write.js.map +1 -0
- package/dist/index.js +89 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/catalog.js +232 -0
- package/dist/mcp/catalog.js.map +1 -0
- package/dist/mcp/config.js +116 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/configWrite.js +254 -0
- package/dist/mcp/configWrite.js.map +1 -0
- package/dist/mcp/connection.js +504 -0
- package/dist/mcp/connection.js.map +1 -0
- package/dist/mcp/deferred.js +104 -0
- package/dist/mcp/deferred.js.map +1 -0
- package/dist/mcp/discover.js +128 -0
- package/dist/mcp/discover.js.map +1 -0
- package/dist/mcp/manager.js +679 -0
- package/dist/mcp/manager.js.map +1 -0
- package/dist/mcp/paramHeaders.js +163 -0
- package/dist/mcp/paramHeaders.js.map +1 -0
- package/dist/mcp/prompts.js +136 -0
- package/dist/mcp/prompts.js.map +1 -0
- package/dist/mcp/protocol.js +171 -0
- package/dist/mcp/protocol.js.map +1 -0
- package/dist/mcp/resources.js +119 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/resultStore.js +180 -0
- package/dist/mcp/resultStore.js.map +1 -0
- package/dist/mcp/subscriptions.js +74 -0
- package/dist/mcp/subscriptions.js.map +1 -0
- package/dist/mcp/transport/headerValue.js +40 -0
- package/dist/mcp/transport/headerValue.js.map +1 -0
- package/dist/mcp/transport/http.js +321 -0
- package/dist/mcp/transport/http.js.map +1 -0
- package/dist/mcp/transport/stdio.js +234 -0
- package/dist/mcp/transport/stdio.js.map +1 -0
- package/dist/mcp/transport/types.js +27 -0
- package/dist/mcp/transport/types.js.map +1 -0
- package/dist/mcp/trust.js +98 -0
- package/dist/mcp/trust.js.map +1 -0
- package/dist/mcp/trustStore.js +55 -0
- package/dist/mcp/trustStore.js.map +1 -0
- package/dist/memory/autoMemory.js +340 -0
- package/dist/memory/autoMemory.js.map +1 -0
- package/dist/memory/compaction.js +513 -0
- package/dist/memory/compaction.js.map +1 -0
- package/dist/memory/images.js +173 -0
- package/dist/memory/images.js.map +1 -0
- package/dist/memory/presence.js +59 -0
- package/dist/memory/presence.js.map +1 -0
- package/dist/memory/projectNotes.js +247 -0
- package/dist/memory/projectNotes.js.map +1 -0
- package/dist/memory/restore.js +72 -0
- package/dist/memory/restore.js.map +1 -0
- package/dist/memory/session.js +472 -0
- package/dist/memory/session.js.map +1 -0
- package/dist/memory/sessionMemory.js +142 -0
- package/dist/memory/sessionMemory.js.map +1 -0
- package/dist/memory/sessionMemoryCompact.js +136 -0
- package/dist/memory/sessionMemoryCompact.js.map +1 -0
- package/dist/memory/store.js +217 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/memory/types.js +14 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/memory/workingSet.js +383 -0
- package/dist/memory/workingSet.js.map +1 -0
- package/dist/project/context.js +425 -0
- package/dist/project/context.js.map +1 -0
- package/dist/tools/approval.js +189 -0
- package/dist/tools/approval.js.map +1 -0
- package/dist/tools/askUser.js +103 -0
- package/dist/tools/askUser.js.map +1 -0
- package/dist/tools/atomicWrite.js +151 -0
- package/dist/tools/atomicWrite.js.map +1 -0
- package/dist/tools/backgroundShells.js +468 -0
- package/dist/tools/backgroundShells.js.map +1 -0
- package/dist/tools/captureSweep.js +77 -0
- package/dist/tools/captureSweep.js.map +1 -0
- package/dist/tools/chassisMux.js +92 -0
- package/dist/tools/chassisMux.js.map +1 -0
- package/dist/tools/checkpoints.js +328 -0
- package/dist/tools/checkpoints.js.map +1 -0
- package/dist/tools/codeIntel.js +267 -0
- package/dist/tools/codeIntel.js.map +1 -0
- package/dist/tools/deferredNative.js +121 -0
- package/dist/tools/deferredNative.js.map +1 -0
- package/dist/tools/detail.js +135 -0
- package/dist/tools/detail.js.map +1 -0
- package/dist/tools/diagnostics.js +174 -0
- package/dist/tools/diagnostics.js.map +1 -0
- package/dist/tools/edit.js +167 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/editCore.js +283 -0
- package/dist/tools/editCore.js.map +1 -0
- package/dist/tools/editFile.js +183 -0
- package/dist/tools/editFile.js.map +1 -0
- package/dist/tools/editRipple.js +126 -0
- package/dist/tools/editRipple.js.map +1 -0
- package/dist/tools/editTarget.js +131 -0
- package/dist/tools/editTarget.js.map +1 -0
- package/dist/tools/editWindow.js +49 -0
- package/dist/tools/editWindow.js.map +1 -0
- package/dist/tools/eol.js +56 -0
- package/dist/tools/eol.js.map +1 -0
- package/dist/tools/exitPlan.js +175 -0
- package/dist/tools/exitPlan.js.map +1 -0
- package/dist/tools/focus.js +42 -0
- package/dist/tools/focus.js.map +1 -0
- package/dist/tools/gitignore.js +148 -0
- package/dist/tools/gitignore.js.map +1 -0
- package/dist/tools/glob.js +134 -0
- package/dist/tools/glob.js.map +1 -0
- package/dist/tools/governorTools.js +258 -0
- package/dist/tools/governorTools.js.map +1 -0
- package/dist/tools/grep.js +450 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/guard.js +220 -0
- package/dist/tools/guard.js.map +1 -0
- package/dist/tools/killTree.js +215 -0
- package/dist/tools/killTree.js.map +1 -0
- package/dist/tools/listDir.js +143 -0
- package/dist/tools/listDir.js.map +1 -0
- package/dist/tools/mcpAdd.js +176 -0
- package/dist/tools/mcpAdd.js.map +1 -0
- package/dist/tools/mcpResources.js +116 -0
- package/dist/tools/mcpResources.js.map +1 -0
- package/dist/tools/mcpSearch.js +123 -0
- package/dist/tools/mcpSearch.js.map +1 -0
- package/dist/tools/multiEdit.js +168 -0
- package/dist/tools/multiEdit.js.map +1 -0
- package/dist/tools/paths.js +225 -0
- package/dist/tools/paths.js.map +1 -0
- package/dist/tools/posixShell.js +123 -0
- package/dist/tools/posixShell.js.map +1 -0
- package/dist/tools/readFile.js +371 -0
- package/dist/tools/readFile.js.map +1 -0
- package/dist/tools/readSymbol.js +145 -0
- package/dist/tools/readSymbol.js.map +1 -0
- package/dist/tools/registry.js +120 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/replaceSymbol.js +141 -0
- package/dist/tools/replaceSymbol.js.map +1 -0
- package/dist/tools/results.js +15 -0
- package/dist/tools/results.js.map +1 -0
- package/dist/tools/ripgrep.js +145 -0
- package/dist/tools/ripgrep.js.map +1 -0
- package/dist/tools/runCommand.js +633 -0
- package/dist/tools/runCommand.js.map +1 -0
- package/dist/tools/saveMemory.js +102 -0
- package/dist/tools/saveMemory.js.map +1 -0
- package/dist/tools/screenshot.js +200 -0
- package/dist/tools/screenshot.js.map +1 -0
- package/dist/tools/screenshotWin.js +227 -0
- package/dist/tools/screenshotWin.js.map +1 -0
- package/dist/tools/search.js +121 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/sessionTools.js +187 -0
- package/dist/tools/sessionTools.js.map +1 -0
- package/dist/tools/shellCheckpoint.js +123 -0
- package/dist/tools/shellCheckpoint.js.map +1 -0
- package/dist/tools/shellLint.js +102 -0
- package/dist/tools/shellLint.js.map +1 -0
- package/dist/tools/shellTools.js +203 -0
- package/dist/tools/shellTools.js.map +1 -0
- package/dist/tools/spanCore.js +78 -0
- package/dist/tools/spanCore.js.map +1 -0
- package/dist/tools/subagent.js +224 -0
- package/dist/tools/subagent.js.map +1 -0
- package/dist/tools/subagentReport.js +114 -0
- package/dist/tools/subagentReport.js.map +1 -0
- package/dist/tools/tempSweep.js +118 -0
- package/dist/tools/tempSweep.js.map +1 -0
- package/dist/tools/todo.js +117 -0
- package/dist/tools/todo.js.map +1 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/untrusted.js +46 -0
- package/dist/tools/untrusted.js.map +1 -0
- package/dist/tools/useSkill.js +62 -0
- package/dist/tools/useSkill.js.map +1 -0
- package/dist/tools/walk.js +152 -0
- package/dist/tools/walk.js.map +1 -0
- package/dist/tools/web.js +61 -0
- package/dist/tools/web.js.map +1 -0
- package/dist/tools/webFetch.js +444 -0
- package/dist/tools/webFetch.js.map +1 -0
- package/dist/tools/webSearch.js +130 -0
- package/dist/tools/webSearch.js.map +1 -0
- package/dist/tools/workspace.js +212 -0
- package/dist/tools/workspace.js.map +1 -0
- package/dist/tools/workspaceDiscover.js +216 -0
- package/dist/tools/workspaceDiscover.js.map +1 -0
- package/dist/tools/writeFile.js +162 -0
- package/dist/tools/writeFile.js.map +1 -0
- 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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"}
|