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.
- package/LICENSE +190 -0
- package/README.md +171 -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 +2586 -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/updateCheck.js +107 -0
- package/dist/cli/updateCheck.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,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* markup.ts — the HTML/CSS extraction tier: cross-language wiring on Mindweave's
|
|
3
|
+
* name-keyed graph.
|
|
4
|
+
*
|
|
5
|
+
* Mindweave's code tier (treesitter.ts) only understands TS/JS/Python, so a landing
|
|
6
|
+
* page (a big HTML file with embedded <style>/<script>) was invisible to the graph
|
|
7
|
+
* — the model had to read the whole file and brute-force string edits. This tier
|
|
8
|
+
* makes those files first-class:
|
|
9
|
+
*
|
|
10
|
+
* - CSS selectors (`.hero`, `#nav`) become DEFINITIONS (name = the class/id).
|
|
11
|
+
* - HTML `class="hero"` become REFERENCES; `id="nav"` become DEFINITIONS (the
|
|
12
|
+
* element lives here) — so `#nav` from CSS and the element share the name.
|
|
13
|
+
* - Embedded <style> is parsed as CSS and <script> scanned for DOM refs, because
|
|
14
|
+
* a page keeps all three languages in one file.
|
|
15
|
+
*
|
|
16
|
+
* Because Mindweave's graph is keyed by NAME, feeding these defs/refs in wires the CSS
|
|
17
|
+
* rule ↔ the HTML elements ↔ the JS that touches them for free: `definition("hero")`
|
|
18
|
+
* finds the rule + element, `references("hero")` finds every use. `outline(page.html)`
|
|
19
|
+
* becomes the page's structure (sections + selectors) with line numbers — the model
|
|
20
|
+
* navigates to the exact part instead of reading 1700 lines.
|
|
21
|
+
*/
|
|
22
|
+
import { extname } from "node:path";
|
|
23
|
+
import { pickNearest } from "../../tools/spanCore.js";
|
|
24
|
+
import { parseTree } from "./treesitter.js";
|
|
25
|
+
import { extractDomRefs } from "./domRefs.js";
|
|
26
|
+
import { IN_WORKER, isolatedMarkup } from "./isolation.js";
|
|
27
|
+
const HTML_EXTS = new Set([".html", ".htm"]);
|
|
28
|
+
const CSS_EXTS = new Set([".css", ".scss", ".sass", ".less"]);
|
|
29
|
+
const HTML_GRAMMAR = "tree-sitter-html.wasm";
|
|
30
|
+
const CSS_GRAMMAR = "tree-sitter-css.wasm";
|
|
31
|
+
/** Whether this tier handles a file (HTML or a stylesheet). */
|
|
32
|
+
export function isMarkupSupported(absPath) {
|
|
33
|
+
const e = extname(absPath).toLowerCase();
|
|
34
|
+
return HTML_EXTS.has(e) || CSS_EXTS.has(e);
|
|
35
|
+
}
|
|
36
|
+
function isHtml(absPath) {
|
|
37
|
+
return HTML_EXTS.has(extname(absPath).toLowerCase());
|
|
38
|
+
}
|
|
39
|
+
/** Extract defs/refs/imports from an HTML or CSS file. Null on failure (the caller
|
|
40
|
+
* degrades to grep/read), matching treeSitterExtract's contract. */
|
|
41
|
+
export async function extractMarkup(absPath, code) {
|
|
42
|
+
// Isolated like the code tier, and for the same measured reason. This tier had no
|
|
43
|
+
// guard at all before — not even the grammar-size one — while parsing the big nested
|
|
44
|
+
// pages that cost the most. Inside the worker this check is false and the real work
|
|
45
|
+
// below runs, which is what the child is for.
|
|
46
|
+
if (!IN_WORKER)
|
|
47
|
+
return isolatedMarkup(absPath, code);
|
|
48
|
+
try {
|
|
49
|
+
if (isHtml(absPath))
|
|
50
|
+
return await extractHtml(code);
|
|
51
|
+
return { ...(await extractCssDefs(code, 0)), imports: [] };
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// ── CSS ────────────────────────────────────────────────────────────────────────
|
|
58
|
+
/**
|
|
59
|
+
* Every class/id selector in a stylesheet: DEFINED once, at the first rule that names
|
|
60
|
+
* it, and REFERENCED at every rule after that.
|
|
61
|
+
*
|
|
62
|
+
* Robust by design: instead of leaning on CSS grammar sub-node names, we take each
|
|
63
|
+
* rule's whole selector text and pull `.class` / `#id` tokens from it — so
|
|
64
|
+
* `.hero-stats .value { }` records BOTH `hero-stats` and `value` at that rule.
|
|
65
|
+
* `lineOffset` shifts lines when the CSS is an embedded <style> block.
|
|
66
|
+
*
|
|
67
|
+
* WHY DEDUPED. A class is written once per rule that touches it, and a real stylesheet
|
|
68
|
+
* touches the same class from many rules: measured on a 2,045-line sheet, 439 symbols
|
|
69
|
+
* for 128 distinct names — 3.4x — with `.sepia` stored sixty-six separate times. That
|
|
70
|
+
* one file was then 83% of the whole project's symbol graph, which is what the ranking
|
|
71
|
+
* ranks over and what an outline lists. Nothing is lost by deduping: "every rule that
|
|
72
|
+
* styles this class" is a REFERENCES question, and it is now answered as one.
|
|
73
|
+
*/
|
|
74
|
+
async function extractCssDefs(code, lineOffset, seen = new Set()) {
|
|
75
|
+
const tree = await parseTree(CSS_GRAMMAR, code);
|
|
76
|
+
if (!tree)
|
|
77
|
+
return { defs: [], refs: [] };
|
|
78
|
+
const defs = [];
|
|
79
|
+
const refs = [];
|
|
80
|
+
try {
|
|
81
|
+
for (const rule of tree.rootNode.descendantsOfType("rule_set")) {
|
|
82
|
+
const selectors = rule.namedChildren.find((c) => c.type === "selectors") ?? rule.namedChild(0);
|
|
83
|
+
const selText = selectors ? selectors.text : "";
|
|
84
|
+
const line = rule.startPosition.row + 1 + lineOffset;
|
|
85
|
+
const endLine = rule.endPosition.row + 1 + lineOffset;
|
|
86
|
+
const sig = oneLine(selText);
|
|
87
|
+
const here = new Set();
|
|
88
|
+
for (const m of selText.matchAll(/([.#])([A-Za-z_][\w-]*)/g)) {
|
|
89
|
+
const name = m[2];
|
|
90
|
+
const kind = m[1] === "#" ? "id" : "class";
|
|
91
|
+
const key = `${kind}:${name}`;
|
|
92
|
+
if (here.has(key))
|
|
93
|
+
continue; // a class repeated in one selector counts once
|
|
94
|
+
here.add(key);
|
|
95
|
+
if (seen.has(key)) {
|
|
96
|
+
refs.push({ name, line });
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
seen.add(key);
|
|
100
|
+
defs.push({ name, kind, line, endLine, signature: sig });
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
finally {
|
|
105
|
+
tree.delete();
|
|
106
|
+
}
|
|
107
|
+
return { defs, refs };
|
|
108
|
+
}
|
|
109
|
+
// ── HTML ─────────────────────────────────────────────────────────────────────
|
|
110
|
+
async function extractHtml(code) {
|
|
111
|
+
const tree = await parseTree(HTML_GRAMMAR, code);
|
|
112
|
+
if (!tree)
|
|
113
|
+
return { defs: [], refs: [], imports: [] };
|
|
114
|
+
const defs = [];
|
|
115
|
+
const refs = [];
|
|
116
|
+
const imports = [];
|
|
117
|
+
try {
|
|
118
|
+
const root = tree.rootNode;
|
|
119
|
+
// Attributes: class="…" → refs, id="…" → defs, href/src → local imports.
|
|
120
|
+
for (const attr of root.descendantsOfType("attribute")) {
|
|
121
|
+
const nameNode = attr.namedChildren.find((c) => c.type === "attribute_name");
|
|
122
|
+
const valNode = attr.namedChildren.find((c) => c.type === "quoted_attribute_value" || c.type === "attribute_value");
|
|
123
|
+
if (!nameNode || !valNode)
|
|
124
|
+
continue;
|
|
125
|
+
const attrName = nameNode.text.toLowerCase();
|
|
126
|
+
const value = stripQuotes(valNode.text);
|
|
127
|
+
const line = attr.startPosition.row + 1;
|
|
128
|
+
if (attrName === "class") {
|
|
129
|
+
for (const cls of value.split(/\s+/).filter(Boolean))
|
|
130
|
+
refs.push({ name: cls, line });
|
|
131
|
+
}
|
|
132
|
+
else if (attrName === "id") {
|
|
133
|
+
const id = value.trim();
|
|
134
|
+
if (id)
|
|
135
|
+
defs.push({ name: id, kind: "id", line, signature: `#${id}` });
|
|
136
|
+
}
|
|
137
|
+
else if (attrName === "href" || attrName === "src") {
|
|
138
|
+
if (isLocalRef(value))
|
|
139
|
+
imports.push({ spec: value, line });
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Embedded <style> → CSS defs; <script> → DOM refs. raw_text carries the inner
|
|
143
|
+
// source; its start row shifts the reported lines to the enclosing file.
|
|
144
|
+
const cssSeen = new Set();
|
|
145
|
+
for (const style of root.descendantsOfType("style_element")) {
|
|
146
|
+
const raw = style.namedChildren.find((c) => c.type === "raw_text");
|
|
147
|
+
if (raw) {
|
|
148
|
+
// One `seen` across every <style> block in the page, so a class defined in the
|
|
149
|
+
// first block is a reference in the second rather than a second definition.
|
|
150
|
+
const css = await extractCssDefs(raw.text, raw.startPosition.row, cssSeen);
|
|
151
|
+
defs.push(...css.defs);
|
|
152
|
+
refs.push(...css.refs);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
for (const script of root.descendantsOfType("script_element")) {
|
|
156
|
+
const raw = script.namedChildren.find((c) => c.type === "raw_text");
|
|
157
|
+
if (raw)
|
|
158
|
+
refs.push(...extractDomRefs(raw.text, raw.startPosition.row));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
finally {
|
|
162
|
+
tree.delete();
|
|
163
|
+
}
|
|
164
|
+
return { defs, refs, imports };
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* The line span of a named CSS rule or HTML element, so read_symbol /
|
|
168
|
+
* replace_symbol_body can target a selector's whole block by name. For CSS: the
|
|
169
|
+
* rule_set whose selector mentions `.name`/`#name`. For HTML: the element carrying
|
|
170
|
+
* `id="name"`. `nearLine` disambiguates when the name appears more than once.
|
|
171
|
+
* Null when it can't be located (the caller degrades to a ranged read).
|
|
172
|
+
*/
|
|
173
|
+
export async function markupSpan(absPath, code, name, nearLine) {
|
|
174
|
+
try {
|
|
175
|
+
if (isHtml(absPath))
|
|
176
|
+
return await htmlSpan(code, name, nearLine);
|
|
177
|
+
return await cssSpan(code, name, nearLine, 0);
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
async function cssSpan(code, name, nearLine, lineOffset) {
|
|
184
|
+
const tree = await parseTree(CSS_GRAMMAR, code);
|
|
185
|
+
if (!tree)
|
|
186
|
+
return null;
|
|
187
|
+
try {
|
|
188
|
+
const spans = [];
|
|
189
|
+
const token = new RegExp(`[.#]${escapeRegExp(name)}(?![\\w-])`);
|
|
190
|
+
for (const rule of tree.rootNode.descendantsOfType("rule_set")) {
|
|
191
|
+
const selectors = rule.namedChildren.find((c) => c.type === "selectors") ?? rule.namedChild(0);
|
|
192
|
+
if (selectors && token.test(selectors.text)) {
|
|
193
|
+
spans.push({ start: rule.startPosition.row + 1 + lineOffset, end: rule.endPosition.row + 1 + lineOffset });
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return pickNearest(spans, nearLine);
|
|
197
|
+
}
|
|
198
|
+
finally {
|
|
199
|
+
tree.delete();
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
async function htmlSpan(code, name, nearLine) {
|
|
203
|
+
const tree = await parseTree(HTML_GRAMMAR, code);
|
|
204
|
+
if (!tree)
|
|
205
|
+
return null;
|
|
206
|
+
try {
|
|
207
|
+
const spans = [];
|
|
208
|
+
// Also search embedded <style> blocks, so a selector defined in a page resolves.
|
|
209
|
+
for (const style of tree.rootNode.descendantsOfType("style_element")) {
|
|
210
|
+
const raw = style.namedChildren.find((c) => c.type === "raw_text");
|
|
211
|
+
if (raw) {
|
|
212
|
+
const inner = await cssSpan(raw.text, name, nearLine, raw.startPosition.row);
|
|
213
|
+
if (inner)
|
|
214
|
+
spans.push(inner);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// Elements carrying id="name".
|
|
218
|
+
for (const attr of tree.rootNode.descendantsOfType("attribute")) {
|
|
219
|
+
const nameNode = attr.namedChildren.find((c) => c.type === "attribute_name");
|
|
220
|
+
const valNode = attr.namedChildren.find((c) => c.type === "quoted_attribute_value" || c.type === "attribute_value");
|
|
221
|
+
if (!nameNode || !valNode)
|
|
222
|
+
continue;
|
|
223
|
+
if (nameNode.text.toLowerCase() !== "id" || stripQuotes(valNode.text).trim() !== name)
|
|
224
|
+
continue;
|
|
225
|
+
const el = enclosingElement(attr);
|
|
226
|
+
spans.push({ start: el.startPosition.row + 1, end: el.endPosition.row + 1 });
|
|
227
|
+
}
|
|
228
|
+
return pickNearest(spans, nearLine);
|
|
229
|
+
}
|
|
230
|
+
finally {
|
|
231
|
+
tree.delete();
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// ── helpers ──────────────────────────────────────────────────────────────────
|
|
235
|
+
/** Climb from an attribute to its enclosing element (for an id's element span). */
|
|
236
|
+
function enclosingElement(node) {
|
|
237
|
+
let n = node;
|
|
238
|
+
while (n.parent && n.type !== "element")
|
|
239
|
+
n = n.parent;
|
|
240
|
+
return n.type === "element" ? n : node;
|
|
241
|
+
}
|
|
242
|
+
function isLocalRef(value) {
|
|
243
|
+
const v = value.trim();
|
|
244
|
+
if (!v || v.startsWith("#"))
|
|
245
|
+
return false; // in-page anchor, not a file
|
|
246
|
+
if (/^[a-z][a-z0-9+.-]*:/i.test(v))
|
|
247
|
+
return false; // http:, mailto:, data:, etc.
|
|
248
|
+
if (v.startsWith("//"))
|
|
249
|
+
return false; // protocol-relative
|
|
250
|
+
return true;
|
|
251
|
+
}
|
|
252
|
+
function stripQuotes(s) {
|
|
253
|
+
return s.replace(/^["']|["']$/g, "");
|
|
254
|
+
}
|
|
255
|
+
function oneLine(s) {
|
|
256
|
+
const flat = s.replace(/\s+/g, " ").trim();
|
|
257
|
+
return flat.length > 120 ? flat.slice(0, 119) + "…" : flat;
|
|
258
|
+
}
|
|
259
|
+
function escapeRegExp(s) {
|
|
260
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=markup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markup.js","sourceRoot":"","sources":["../../../src/alternator/chassis/markup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* provision.ts — auto-install language servers, Mason-style.
|
|
3
|
+
*
|
|
4
|
+
* When a project uses a language whose server isn't bundled or on PATH, Mindweave
|
|
5
|
+
* fetches it itself into `~/.mindweave/servers/<key>/` and caches it, so precision
|
|
6
|
+
* "just appears" without the user installing anything. Sources mirror how servers
|
|
7
|
+
* are actually distributed:
|
|
8
|
+
*
|
|
9
|
+
* - npm — `npm install` into the cache (this is the clean, broad source).
|
|
10
|
+
* - github — download the OS/arch release asset and extract it (binaries like
|
|
11
|
+
* rust-analyzer / clangd). [implemented in the next phase]
|
|
12
|
+
*
|
|
13
|
+
* Safety: only the curated, version-pinned registry in servers.ts is ever
|
|
14
|
+
* installed — never an arbitrary package. Best-effort: a failed/blocked install
|
|
15
|
+
* just leaves that language on the tree-sitter tier. Disable with
|
|
16
|
+
* MINDWEAVE_NO_AUTO_INSTALL. In-flight installs are deduped so a language is fetched
|
|
17
|
+
* once per session.
|
|
18
|
+
*/
|
|
19
|
+
import { killTree, spawnManaged } from "../../tools/killTree.js";
|
|
20
|
+
import { existsSync, promises as fs } from "node:fs";
|
|
21
|
+
import { homedir } from "node:os";
|
|
22
|
+
import { join } from "node:path";
|
|
23
|
+
import zlib from "node:zlib";
|
|
24
|
+
import AdmZip from "adm-zip";
|
|
25
|
+
const IS_WIN = process.platform === "win32";
|
|
26
|
+
export function autoInstallEnabled() {
|
|
27
|
+
return !process.env.MINDWEAVE_NO_AUTO_INSTALL;
|
|
28
|
+
}
|
|
29
|
+
export function platformKey() {
|
|
30
|
+
return `${process.platform}-${process.arch}`;
|
|
31
|
+
}
|
|
32
|
+
function installDir(key) {
|
|
33
|
+
return join(homedir(), ".mindweave", "servers", key);
|
|
34
|
+
}
|
|
35
|
+
/** The launch command for an already-installed server, or null if not installed. */
|
|
36
|
+
export function resolveInstalled(key, spec) {
|
|
37
|
+
const dir = installDir(key);
|
|
38
|
+
if (spec.source === "npm") {
|
|
39
|
+
const bin = join(dir, "node_modules", ".bin", spec.binName + (IS_WIN ? ".cmd" : ""));
|
|
40
|
+
return existsSync(bin) ? bin : null;
|
|
41
|
+
}
|
|
42
|
+
const target = spec.targets[platformKey()];
|
|
43
|
+
if (!target)
|
|
44
|
+
return null;
|
|
45
|
+
const bin = join(dir, target.bin.replaceAll("{version}", spec.version));
|
|
46
|
+
return existsSync(bin) ? bin : null;
|
|
47
|
+
}
|
|
48
|
+
const inflight = new Map();
|
|
49
|
+
/**
|
|
50
|
+
* Return the install command path, installing the server first if needed.
|
|
51
|
+
* Deduped per key; best-effort (returns null on any failure or when disabled).
|
|
52
|
+
*/
|
|
53
|
+
export function ensureInstalled(key, spec, log) {
|
|
54
|
+
const already = resolveInstalled(key, spec);
|
|
55
|
+
if (already)
|
|
56
|
+
return Promise.resolve(already);
|
|
57
|
+
if (!autoInstallEnabled())
|
|
58
|
+
return Promise.resolve(null);
|
|
59
|
+
let p = inflight.get(key);
|
|
60
|
+
if (!p) {
|
|
61
|
+
p = doInstall(key, spec, log).catch(() => null);
|
|
62
|
+
inflight.set(key, p);
|
|
63
|
+
}
|
|
64
|
+
return p;
|
|
65
|
+
}
|
|
66
|
+
async function doInstall(key, spec, log) {
|
|
67
|
+
log?.(`installing ${key} (${spec.source})…`);
|
|
68
|
+
await fs.mkdir(installDir(key), { recursive: true });
|
|
69
|
+
const ok = spec.source === "npm" ? await installNpm(key, spec) : await installGithub(key, spec);
|
|
70
|
+
if (!ok) {
|
|
71
|
+
log?.(`could not install ${key} — using tree-sitter for now`);
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
const resolved = resolveInstalled(key, spec);
|
|
75
|
+
log?.(resolved ? `installed ${key}` : `installed ${key} but couldn't find its binary`);
|
|
76
|
+
return resolved;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Ceilings for provisioning. Every wait here is on something external — a registry,
|
|
80
|
+
* a release download, an extract — and provisioning is BEST EFFORT: failing just
|
|
81
|
+
* leaves that language on the tree-sitter tier, which is a working state.
|
|
82
|
+
*
|
|
83
|
+
* Before these existed, none of the three waits below was bounded: the spawns had
|
|
84
|
+
* no timeout and were never killed, and `fetch` had no signal. A stalled install
|
|
85
|
+
* therefore hung forever AND left its process tree behind, and because installs are
|
|
86
|
+
* deduped through `inflight`, the never-resolving promise was handed to every later
|
|
87
|
+
* caller for the rest of the session. That is the shape of "fresh project dirs,
|
|
88
|
+
* processes piling up, runs hanging past ten minutes": a fresh dir is exactly when
|
|
89
|
+
* provisioning runs, and a warm one skips it entirely.
|
|
90
|
+
*/
|
|
91
|
+
const NPM_INSTALL_TIMEOUT_MS = 180_000; // a real install of a language server
|
|
92
|
+
const DOWNLOAD_TIMEOUT_MS = 120_000; // release asset, tens of MB
|
|
93
|
+
const EXTRACT_TIMEOUT_MS = 60_000;
|
|
94
|
+
/**
|
|
95
|
+
* Run a child to completion, but never wait forever: on timeout the whole process
|
|
96
|
+
* tree is killed and the step reports failure. Tree-killing matters because the
|
|
97
|
+
* things spawned here (npm, tar) start children of their own, and killing only the
|
|
98
|
+
* shell leaves those holding on.
|
|
99
|
+
*/
|
|
100
|
+
export function runBounded(command, args, options, timeoutMs) {
|
|
101
|
+
return new Promise((resolve) => {
|
|
102
|
+
const child = spawnManaged(command, args, options);
|
|
103
|
+
let settled = false;
|
|
104
|
+
const finish = (ok) => {
|
|
105
|
+
if (settled)
|
|
106
|
+
return;
|
|
107
|
+
settled = true;
|
|
108
|
+
clearTimeout(timer);
|
|
109
|
+
resolve(ok);
|
|
110
|
+
};
|
|
111
|
+
const timer = setTimeout(() => {
|
|
112
|
+
killTree(child.pid);
|
|
113
|
+
finish(false);
|
|
114
|
+
}, timeoutMs);
|
|
115
|
+
if (typeof timer.unref === "function")
|
|
116
|
+
timer.unref();
|
|
117
|
+
child.on("error", () => finish(false));
|
|
118
|
+
child.on("close", (code) => finish(code === 0));
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
// ── npm source ──────────────────────────────────────────────────────────────
|
|
122
|
+
async function installNpm(key, spec) {
|
|
123
|
+
const dir = installDir(key);
|
|
124
|
+
// Root npm at this dir with a private package.json — otherwise npm walks up
|
|
125
|
+
// looking for one and can try to write node_modules at the drive root (EPERM).
|
|
126
|
+
await fs.writeFile(join(dir, "package.json"), JSON.stringify({ name: `mindweave-server-${key}`, version: "0.0.0", private: true }));
|
|
127
|
+
// Pass the whole command as one string for the shell (npm is a .cmd shim on
|
|
128
|
+
// Windows). Args are from the curated registry, not user input.
|
|
129
|
+
const cmd = `npm install ${spec.package}@${spec.version} --no-save --no-audit --no-fund --loglevel=error`;
|
|
130
|
+
return runBounded(cmd, [], { cwd: dir, shell: true, stdio: "ignore" }, NPM_INSTALL_TIMEOUT_MS);
|
|
131
|
+
}
|
|
132
|
+
// ── github source ────────────────────────────────────────────────────────────
|
|
133
|
+
async function installGithub(key, spec) {
|
|
134
|
+
const target = spec.targets[platformKey()];
|
|
135
|
+
if (!target)
|
|
136
|
+
return false; // this OS/arch isn't published — degrade to tree-sitter
|
|
137
|
+
const dir = installDir(key);
|
|
138
|
+
const asset = target.asset.replaceAll("{version}", spec.version);
|
|
139
|
+
const url = `https://github.com/${spec.repo}/releases/download/${spec.version}/${asset}`;
|
|
140
|
+
const archive = join(dir, asset);
|
|
141
|
+
if (!(await download(url, archive)))
|
|
142
|
+
return false;
|
|
143
|
+
try {
|
|
144
|
+
if (asset.endsWith(".zip")) {
|
|
145
|
+
new AdmZip(archive).extractAllTo(dir, true);
|
|
146
|
+
}
|
|
147
|
+
else if (asset.endsWith(".tar.gz") || asset.endsWith(".tgz") || asset.endsWith(".tar.xz")) {
|
|
148
|
+
if (!(await runTar(archive, dir)))
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
else if (asset.endsWith(".gz")) {
|
|
152
|
+
// Single-file gzip → the decompressed bytes ARE the binary.
|
|
153
|
+
const out = zlib.gunzipSync(await fs.readFile(archive));
|
|
154
|
+
await fs.mkdir(join(dir, target.bin, ".."), { recursive: true });
|
|
155
|
+
await fs.writeFile(join(dir, target.bin.replaceAll("{version}", spec.version)), out);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
return false; // unknown archive format
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
finally {
|
|
165
|
+
await fs.rm(archive, { force: true }).catch(() => { });
|
|
166
|
+
}
|
|
167
|
+
const bin = join(dir, target.bin.replaceAll("{version}", spec.version));
|
|
168
|
+
if (!IS_WIN && existsSync(bin)) {
|
|
169
|
+
try {
|
|
170
|
+
await fs.chmod(bin, 0o755);
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
/* not fatal */
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return existsSync(bin);
|
|
177
|
+
}
|
|
178
|
+
/** Download `url` to `dest` (follows GitHub's redirect to the CDN). */
|
|
179
|
+
async function download(url, dest) {
|
|
180
|
+
// AbortSignal.timeout covers the whole exchange, body included — a stalled
|
|
181
|
+
// download mid-body is the realistic failure, not a stalled connect.
|
|
182
|
+
try {
|
|
183
|
+
const res = await fetch(url, { redirect: "follow", signal: AbortSignal.timeout(DOWNLOAD_TIMEOUT_MS) });
|
|
184
|
+
if (!res.ok)
|
|
185
|
+
return false;
|
|
186
|
+
await fs.writeFile(dest, Buffer.from(await res.arrayBuffer()));
|
|
187
|
+
return true;
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/** Extract a tarball with the system `tar` (handles .tar.gz / .tar.xz on every
|
|
194
|
+
* platform; Windows 10+ ships bsdtar). */
|
|
195
|
+
function runTar(archive, dir) {
|
|
196
|
+
return runBounded("tar", ["-xf", archive, "-C", dir], { stdio: "ignore" }, EXTRACT_TIMEOUT_MS);
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=provision.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provision.js","sourceRoot":"","sources":["../../../src/alternator/chassis/provision.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
const DAMPING = 0.85;
|
|
2
|
+
const ITERATIONS = 30;
|
|
3
|
+
const FOCUS_BOOST = 25; // restart weight for symbols in the focus files
|
|
4
|
+
// Guard against pathological repos: skip ranking past this many symbols (the
|
|
5
|
+
// caller falls back to a cheaper heuristic). Tunable later.
|
|
6
|
+
const MAX_NODES = 50_000;
|
|
7
|
+
export function rankSymbols(graph, focusFiles, limit) {
|
|
8
|
+
const nodes = graph.allSymbols();
|
|
9
|
+
const n = nodes.length;
|
|
10
|
+
if (n === 0 || n > MAX_NODES)
|
|
11
|
+
return [];
|
|
12
|
+
const index = new Map();
|
|
13
|
+
nodes.forEach((node, i) => index.set(node.id, i));
|
|
14
|
+
// Build out-adjacency: referrer-symbol → referenced-symbol.
|
|
15
|
+
const out = Array.from({ length: n }, () => []);
|
|
16
|
+
const byName = graph.byNameMap();
|
|
17
|
+
for (const [name, refs] of graph.allRefs()) {
|
|
18
|
+
const targets = (byName.get(name) ?? [])
|
|
19
|
+
.map((id) => index.get(id))
|
|
20
|
+
.filter((i) => i !== undefined);
|
|
21
|
+
if (targets.length === 0)
|
|
22
|
+
continue;
|
|
23
|
+
for (const ref of refs) {
|
|
24
|
+
for (const referrer of graph.symbolsInFile(ref.file)) {
|
|
25
|
+
const ri = index.get(referrer.id);
|
|
26
|
+
if (ri === undefined)
|
|
27
|
+
continue;
|
|
28
|
+
for (const t of targets)
|
|
29
|
+
if (t !== ri)
|
|
30
|
+
out[ri].push(t);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// Personalization vector: boost symbols defined in the focus files.
|
|
35
|
+
const focus = new Set(focusFiles);
|
|
36
|
+
const pers = new Float64Array(n);
|
|
37
|
+
let persSum = 0;
|
|
38
|
+
for (let i = 0; i < n; i++) {
|
|
39
|
+
const w = focus.has(nodes[i].file) ? FOCUS_BOOST : 1;
|
|
40
|
+
pers[i] = w;
|
|
41
|
+
persSum += w;
|
|
42
|
+
}
|
|
43
|
+
for (let i = 0; i < n; i++)
|
|
44
|
+
pers[i] /= persSum;
|
|
45
|
+
// Power iteration.
|
|
46
|
+
let rank = new Float64Array(n).fill(1 / n);
|
|
47
|
+
for (let iter = 0; iter < ITERATIONS; iter++) {
|
|
48
|
+
const next = new Float64Array(n);
|
|
49
|
+
for (let i = 0; i < n; i++)
|
|
50
|
+
next[i] = (1 - DAMPING) * pers[i];
|
|
51
|
+
let dangling = 0;
|
|
52
|
+
for (let i = 0; i < n; i++) {
|
|
53
|
+
const edges = out[i];
|
|
54
|
+
if (edges.length === 0) {
|
|
55
|
+
dangling += rank[i];
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
const share = (DAMPING * rank[i]) / edges.length;
|
|
59
|
+
for (const t of edges)
|
|
60
|
+
next[t] += share;
|
|
61
|
+
}
|
|
62
|
+
// Dangling mass redistributed along the personalization vector.
|
|
63
|
+
for (let i = 0; i < n; i++)
|
|
64
|
+
next[i] += DAMPING * dangling * pers[i];
|
|
65
|
+
rank = next;
|
|
66
|
+
}
|
|
67
|
+
return nodes
|
|
68
|
+
.map((symbol, i) => ({ symbol, score: rank[i] }))
|
|
69
|
+
.sort((a, b) => b.score - a.score)
|
|
70
|
+
.slice(0, limit);
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=rank.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rank.js","sourceRoot":"","sources":["../../../src/alternator/chassis/rank.ts"],"names":[],"mappings":"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"}
|