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,130 @@
|
|
|
1
|
+
import { activeDriver } from "../drivers/registry.js";
|
|
2
|
+
import { frameExternal } from "./untrusted.js";
|
|
3
|
+
import { outputDetail } from "./detail.js";
|
|
4
|
+
import { fail, failQuietly } from "./results.js";
|
|
5
|
+
/** Sources listed per answer. Enough to judge the answer, short enough to read. */
|
|
6
|
+
const MAX_SOURCES = 8;
|
|
7
|
+
const webSearchTool = {
|
|
8
|
+
name: "web_search",
|
|
9
|
+
readOnly: true,
|
|
10
|
+
description: "Search the web and get an answer with its sources. Use it for anything that " +
|
|
11
|
+
"changed after your training data — current library APIs, recent releases, " +
|
|
12
|
+
"version-specific behaviour, whether a package still exists. " +
|
|
13
|
+
"Give a `query` the way you would type it into a search engine. " +
|
|
14
|
+
"You get an answer grounded in the pages found, plus their URLs; follow a URL " +
|
|
15
|
+
"with web_fetch when you need the full page. " +
|
|
16
|
+
"Not every model can search — if this one can't, the tool says so and you " +
|
|
17
|
+
"should ask the user for a URL instead of retrying.",
|
|
18
|
+
parameters: {
|
|
19
|
+
type: "object",
|
|
20
|
+
additionalProperties: false,
|
|
21
|
+
required: ["query"],
|
|
22
|
+
properties: {
|
|
23
|
+
query: {
|
|
24
|
+
type: "string",
|
|
25
|
+
description: "What to search for, phrased as a search query.",
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
async execute(args, ctx) {
|
|
30
|
+
const query = typeof args.query === "string" ? args.query.trim() : "";
|
|
31
|
+
if (!query)
|
|
32
|
+
return failQuietly("`query` is required.");
|
|
33
|
+
const driver = activeDriver();
|
|
34
|
+
if (!driver.webSearch) {
|
|
35
|
+
// A fact about the running model, stated once. Deliberately NOT an error:
|
|
36
|
+
// nothing went wrong and retrying will not help.
|
|
37
|
+
return {
|
|
38
|
+
output: `${driver.label} models cannot search the web, so this tool is unavailable ` +
|
|
39
|
+
`on the current model. Ask the user for a URL and read it with web_fetch, ` +
|
|
40
|
+
`or suggest switching models with /model.`,
|
|
41
|
+
summary: "web search unavailable on this model",
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
// Timed here rather than inside the driver: the wait is the same wait whichever
|
|
46
|
+
// provider serves it, and measuring it at the one call site keeps every driver
|
|
47
|
+
// free of display bookkeeping.
|
|
48
|
+
const startedAt = Date.now();
|
|
49
|
+
const result = await driver.webSearch(query, { signal: ctx.abortSignal });
|
|
50
|
+
const elapsedMs = Date.now() - startedAt;
|
|
51
|
+
if (!result.answer && result.sources.length === 0) {
|
|
52
|
+
return {
|
|
53
|
+
output: `No results for "${query}". Try different wording, or a narrower query.`,
|
|
54
|
+
summary: `searched "${query}" (nothing found)`,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
output: formatSearch(query, result),
|
|
59
|
+
summary: `searched "${query}" (${result.sources.length} source${result.sources.length === 1 ? "" : "s"})`,
|
|
60
|
+
detail: formatSearchDetail(result, driver.label, elapsedMs),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
65
|
+
return fail(`Search failed: ${message}`);
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Render a result for the model. Pure, so the shape is testable without a
|
|
71
|
+
* provider: answer first because that is what was asked for, sources after so a
|
|
72
|
+
* claim can be checked or followed with web_fetch.
|
|
73
|
+
*/
|
|
74
|
+
export function formatSearch(query, result) {
|
|
75
|
+
const lines = [];
|
|
76
|
+
if (result.answer)
|
|
77
|
+
lines.push(result.answer);
|
|
78
|
+
if (result.sources.length > 0) {
|
|
79
|
+
const shown = result.sources.slice(0, MAX_SOURCES);
|
|
80
|
+
lines.push("", "Sources:");
|
|
81
|
+
for (const [i, source] of shown.entries()) {
|
|
82
|
+
lines.push(`${i + 1}. ${source.title} — ${source.url}`);
|
|
83
|
+
}
|
|
84
|
+
const hidden = result.sources.length - shown.length;
|
|
85
|
+
if (hidden > 0)
|
|
86
|
+
lines.push(`(+${hidden} more)`);
|
|
87
|
+
}
|
|
88
|
+
if (result.partial) {
|
|
89
|
+
lines.push("", "(The search stopped early, so this may be incomplete.)");
|
|
90
|
+
}
|
|
91
|
+
// Framed as external content. This is the least trustworthy input the agent has:
|
|
92
|
+
// the model picked the query and the open web picked what came back, including the
|
|
93
|
+
// titles, which are attacker-chosen text sitting right next to a real answer.
|
|
94
|
+
return frameExternal({ tag: "web_search", attrs: { query }, what: "a web search" }, lines.join("\n"));
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* The UI-only detail block: a numbered source list, never sent to the model
|
|
98
|
+
* (that's `formatSearch`'s job, with its own framing/injection defense) — this
|
|
99
|
+
* is purely what the transcript row shows under the search. Empty when there
|
|
100
|
+
* are no sources, so a bare-answer result shows just its summary line.
|
|
101
|
+
*/
|
|
102
|
+
export function formatSearchDetail(result, engine, elapsedMs) {
|
|
103
|
+
if (result.sources.length === 0)
|
|
104
|
+
return "";
|
|
105
|
+
const shown = result.sources.slice(0, MAX_SOURCES);
|
|
106
|
+
const lines = [];
|
|
107
|
+
// Which service answered and how long it took. Both are omitted rather than guessed
|
|
108
|
+
// when unknown — a search row is one of the few places where the cost of the call is
|
|
109
|
+
// not otherwise visible, and an invented number would be worse than no number.
|
|
110
|
+
if (engine)
|
|
111
|
+
lines.push(`Engine: ${engine}`);
|
|
112
|
+
if (elapsedMs !== undefined)
|
|
113
|
+
lines.push(`Query time: ${formatElapsed(elapsedMs)}`);
|
|
114
|
+
lines.push(`Found ${result.sources.length} source${result.sources.length === 1 ? "" : "s"}`);
|
|
115
|
+
for (const [i, source] of shown.entries())
|
|
116
|
+
lines.push(`${i + 1}. ${source.title}`);
|
|
117
|
+
const hidden = result.sources.length - shown.length;
|
|
118
|
+
if (hidden > 0)
|
|
119
|
+
lines.push(`(+${hidden} more)`);
|
|
120
|
+
return outputDetail(lines.join("\n"));
|
|
121
|
+
}
|
|
122
|
+
/** A wait, at the precision it is worth reading: `310ms`, `1.4s`. */
|
|
123
|
+
export function formatElapsed(ms) {
|
|
124
|
+
return ms < 1000 ? `${Math.round(ms)}ms` : `${(ms / 1000).toFixed(1)}s`;
|
|
125
|
+
}
|
|
126
|
+
/** The search half of the merged `web` tool. Logic unchanged. */
|
|
127
|
+
export const searchWeb = webSearchTool.execute;
|
|
128
|
+
/** Kept for tests that assert on the search description/flags directly. */
|
|
129
|
+
export const webSearch = webSearchTool;
|
|
130
|
+
//# sourceMappingURL=webSearch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webSearch.js","sourceRoot":"","sources":["../../src/tools/webSearch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* workspace.ts — add another folder to the session (multi-root).
|
|
3
|
+
*
|
|
4
|
+
* One session usually has a single root, but real work spans repos: a backend and
|
|
5
|
+
* a frontend, an app and a shared library. `add_directory` lets the model honor
|
|
6
|
+
* "also work in ../api" by widening the workspace. Once added, every file tool sees
|
|
7
|
+
* it: reads, searches (`search` spans all roots, whether it is matching contents,
|
|
8
|
+
* paths, or listing), and edits, with paths
|
|
9
|
+
* labeled per root so the two never collide. The `/include` command does the same
|
|
10
|
+
* thing by hand.
|
|
11
|
+
*
|
|
12
|
+
* Each root gets its OWN code map, started in the background by `addRoot` and torn
|
|
13
|
+
* down by `removeRoot` (`chassisByRoot`). This comment used to say the chassis stayed
|
|
14
|
+
* on the primary root and added roots fell back to grep — that stopped being true when
|
|
15
|
+
* per-root chassis landed, and it described the tool as weaker than it is.
|
|
16
|
+
*/
|
|
17
|
+
import { promises as fs } from "node:fs";
|
|
18
|
+
import { basename, isAbsolute, resolve } from "node:path";
|
|
19
|
+
import { canonicalRoot, rootLabel, rootsOf } from "./paths.js";
|
|
20
|
+
import { discoverRelatedRoots } from "./workspaceDiscover.js";
|
|
21
|
+
import { startChassis, stopChassis } from "../alternator/lane.js";
|
|
22
|
+
import { fail } from "./results.js";
|
|
23
|
+
/**
|
|
24
|
+
* One tool, two levels of specificity: a `path` adds that folder, no `path` discovers.
|
|
25
|
+
*
|
|
26
|
+
* These were `add_directory` and `link_workspace`. Same intent (widen the workspace),
|
|
27
|
+
* same approval flow, same label mechanics afterwards; the only difference was whether
|
|
28
|
+
* the caller already knew which folder it wanted. That is an argument, not a tool.
|
|
29
|
+
*/
|
|
30
|
+
export const workspaceTool = {
|
|
31
|
+
name: "workspace",
|
|
32
|
+
deferred: true,
|
|
33
|
+
readOnly: false,
|
|
34
|
+
// What was missing is what happens AFTER: paths in a second root are label-prefixed,
|
|
35
|
+
// and a model that does not know that reads the new folder's files as if they sat
|
|
36
|
+
// under the primary root. The proactive branch also has a real refusal now (no
|
|
37
|
+
// channel to ask through), which the model has to be able to act on.
|
|
38
|
+
description: "Widen this session's workspace so you can read, search and edit across more than " +
|
|
39
|
+
"one folder: a separate backend, a frontend, a shared library.\n" +
|
|
40
|
+
"With a `path` it adds THAT folder. Use it when the user asks to include a " +
|
|
41
|
+
"directory, or when you NOTICE the task reaching into a folder that is not in the " +
|
|
42
|
+
"workspace yet — in that case set `proactive: true`, which asks the user first.\n" +
|
|
43
|
+
"With NO `path` it DISCOVERS the rest of the project — monorepo members, sibling " +
|
|
44
|
+
"repos, a backend beside a frontend — and offers the whole set. Use it when the task " +
|
|
45
|
+
"clearly spans the project. It finds folders by their project files, not by " +
|
|
46
|
+
"guessing, so it can legitimately find nothing.\n" +
|
|
47
|
+
"Either way a refusal (or no way to ask) is an ANSWER, not an error to retry: carry " +
|
|
48
|
+
"on within the folders you have and say what you found. Added folders get a LABEL " +
|
|
49
|
+
"and their files are addressed as `label/…` in every tool — that is how two roots " +
|
|
50
|
+
"holding `src/index.ts` stay distinct. The result names each label; use it from then " +
|
|
51
|
+
"on. Adding a folder already in the workspace is harmless and simply says so.",
|
|
52
|
+
parameters: {
|
|
53
|
+
type: "object",
|
|
54
|
+
additionalProperties: false,
|
|
55
|
+
properties: {
|
|
56
|
+
path: {
|
|
57
|
+
type: "string",
|
|
58
|
+
description: "The folder to add (absolute, or relative to the working directory). Omit to discover related folders instead.",
|
|
59
|
+
},
|
|
60
|
+
proactive: {
|
|
61
|
+
type: "boolean",
|
|
62
|
+
description: "Adding a known path only: set true when YOU spotted the need (not an explicit user " +
|
|
63
|
+
"request); the user is asked to confirm first. Discovery always asks regardless.",
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
async execute(args, ctx) {
|
|
68
|
+
// The dispatch: naming a folder adds it, otherwise go and find the rest.
|
|
69
|
+
const named = typeof args.path === "string" ? args.path.trim() : "";
|
|
70
|
+
return named ? addOne(args, ctx, named) : discoverAll(ctx);
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
async function addOne(args, ctx, raw) {
|
|
74
|
+
const abs = isAbsolute(raw) ? resolve(raw) : resolve(ctx.cwd, raw);
|
|
75
|
+
// Proactive adds (the model noticed) ask first; explicit requests just add.
|
|
76
|
+
if (args.proactive === true) {
|
|
77
|
+
if (!(await isDir(abs)))
|
|
78
|
+
return fail(`directory not found: ${abs}`);
|
|
79
|
+
// With no way to ask, a proactive add must NOT happen. The old guard folded the
|
|
80
|
+
// missing channel into the condition, so exactly the case that needed consent
|
|
81
|
+
// silently proceeded without it — and that is the case a sub-agent is in.
|
|
82
|
+
if (!ctx.requestApproval) {
|
|
83
|
+
return {
|
|
84
|
+
output: `Did not add '${basename(abs)}' to the workspace: widening it needs the user's ` +
|
|
85
|
+
`agreement and there is no way to ask from here. Work within the current roots, ` +
|
|
86
|
+
`and if you genuinely need that folder, say so in your result.`,
|
|
87
|
+
summary: "cannot ask to widen workspace",
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
const choice = await ctx.requestApproval(`This work also reaches into '${basename(abs)}' (${abs}), which isn't in the workspace. Include it?`, ["Yes, include it", "No, stay in the current folder"]);
|
|
91
|
+
if (!choice.startsWith("Yes")) {
|
|
92
|
+
return { output: `Left '${basename(abs)}' out of the workspace at the user's request.`, summary: "kept workspace as-is" };
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const result = await addRoot(ctx, abs);
|
|
96
|
+
if (result.error)
|
|
97
|
+
return fail(result.error);
|
|
98
|
+
if (result.already) {
|
|
99
|
+
return { output: `'${abs}' is already in the workspace.`, summary: `'${result.label}' already added` };
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
output: `Added '${abs}' to the workspace as '${result.label}'. You can now read/search/edit it; refer to its files as '${result.label}/…'.`,
|
|
103
|
+
summary: `added root '${result.label}'`,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
// "The user is asked to confirm" was unconditionally true in the old text and
|
|
107
|
+
// conditionally true in the code. It is now unconditional in both.
|
|
108
|
+
async function discoverAll(ctx) {
|
|
109
|
+
const roots = rootsOf(ctx);
|
|
110
|
+
const related = await discoverRelatedRoots(roots[0], roots);
|
|
111
|
+
if (related.length === 0) {
|
|
112
|
+
return { output: "No related project folders found to add (no monorepo config or sibling projects).", summary: "nothing to link" };
|
|
113
|
+
}
|
|
114
|
+
// Ask first (a bulk add) — list what was found. With no way to ask, do NOT proceed:
|
|
115
|
+
// this is the widest change either tool can make, and the old `if (requestApproval)`
|
|
116
|
+
// meant the absence of consent was treated as consent. A sub-agent is exactly that
|
|
117
|
+
// case, so this could silently pull in every sibling repo on the machine.
|
|
118
|
+
if (!ctx.requestApproval) {
|
|
119
|
+
return {
|
|
120
|
+
output: `Found ${related.length} related folder${related.length === 1 ? "" : "s"}, but adding ` +
|
|
121
|
+
`${related.length === 1 ? "it" : "them"} needs the user's agreement and there is no way ` +
|
|
122
|
+
`to ask from here. Name them in your result and let the user decide: ` +
|
|
123
|
+
`${related.map((r) => basename(r.path)).join(", ")}.`,
|
|
124
|
+
summary: "cannot ask to link workspace",
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
const list = related.map((r) => `• ${basename(r.path)} (${r.reason})`).join("\n");
|
|
128
|
+
const choice = await ctx.requestApproval(`Found related folders to include in the workspace:\n${list}\nInclude them?`, ["Yes, include them", "No"]);
|
|
129
|
+
if (!choice.startsWith("Yes")) {
|
|
130
|
+
return { output: "Left the workspace as-is at the user's request.", summary: "link declined" };
|
|
131
|
+
}
|
|
132
|
+
const added = [];
|
|
133
|
+
const failed = [];
|
|
134
|
+
for (const r of related) {
|
|
135
|
+
const res = await addRoot(ctx, resolve(r.path));
|
|
136
|
+
if (res.error)
|
|
137
|
+
failed.push(basename(r.path));
|
|
138
|
+
else if (res.label && !res.already)
|
|
139
|
+
added.push(res.label);
|
|
140
|
+
}
|
|
141
|
+
// A folder that was discovered but could not be added has to be named. Reporting
|
|
142
|
+
// only the successes let a partial link read as a complete one.
|
|
143
|
+
const note = failed.length > 0 ? ` Could not add ${failed.join(", ")}.` : "";
|
|
144
|
+
if (added.length === 0) {
|
|
145
|
+
return {
|
|
146
|
+
output: `No new folders were linked.${note || " Those folders were already in the workspace."}`,
|
|
147
|
+
summary: failed.length > 0 ? `linked nothing, ${failed.length} failed` : "nothing new linked",
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
output: `Linked ${added.length} folder${added.length === 1 ? "" : "s"} into the workspace: ` +
|
|
152
|
+
`${added.join(", ")}. You can now read/search/edit across all of them (paths are 'label/…').${note}`,
|
|
153
|
+
summary: `linked ${added.join(", ")}${failed.length > 0 ? ` (${failed.length} failed)` : ""}`,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
async function isDir(path) {
|
|
157
|
+
try {
|
|
158
|
+
return (await fs.stat(path)).isDirectory();
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Add `abs` as a root on the tool context (shared, so it takes effect immediately).
|
|
166
|
+
* Validates it's an existing directory. Returns the assigned label, or a reason.
|
|
167
|
+
*/
|
|
168
|
+
export async function addRoot(ctx, requested) {
|
|
169
|
+
// Canonicalise, exactly as the PRIMARY root does on the way in. This was the one
|
|
170
|
+
// entry point that skipped it, and `paths.ts` states the invariant plainly: every
|
|
171
|
+
// root goes through this once so the session speaks one form of every path.
|
|
172
|
+
// Without it the dedup below is a raw string compare, so the SAME directory could
|
|
173
|
+
// be added repeatedly under different spellings — measured: `RealApi`, `realapi`
|
|
174
|
+
// and a junction pointing at it all became separate roots with separate labels, so
|
|
175
|
+
// every search walked that tree three times and reported each hit three ways.
|
|
176
|
+
const abs = await canonicalRoot(requested);
|
|
177
|
+
try {
|
|
178
|
+
const stat = await fs.stat(abs);
|
|
179
|
+
if (!stat.isDirectory())
|
|
180
|
+
return { error: `'${abs}' is not a directory.` };
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
return { error: `directory not found: ${requested}` };
|
|
184
|
+
}
|
|
185
|
+
const roots = ctx.roots && ctx.roots.length > 0 ? ctx.roots : [ctx.cwd];
|
|
186
|
+
if (roots.includes(abs))
|
|
187
|
+
return { already: true, label: rootLabel(roots, abs) };
|
|
188
|
+
ctx.roots = [...roots, abs];
|
|
189
|
+
// Warm a code map for the new root in the background (collision-safe via labels).
|
|
190
|
+
if (!ctx.chassisByRoot) {
|
|
191
|
+
ctx.chassisByRoot = new Map(ctx.chassis ? [[ctx.cwd, ctx.chassis]] : []);
|
|
192
|
+
}
|
|
193
|
+
ctx.chassisByRoot.set(abs, startChassis(abs));
|
|
194
|
+
return { label: rootLabel(ctx.roots, abs) };
|
|
195
|
+
}
|
|
196
|
+
/** Remove a root by absolute path or by its label. The primary root can't be removed. */
|
|
197
|
+
export function removeRoot(ctx, pathOrLabel) {
|
|
198
|
+
const roots = rootsOf(ctx);
|
|
199
|
+
if (roots.length <= 1)
|
|
200
|
+
return { error: "nothing to remove — there's only the primary root." };
|
|
201
|
+
const match = roots.find((r, i) => i > 0 && (r === pathOrLabel || resolve(r) === resolve(pathOrLabel) || rootLabel(roots, r) === pathOrLabel));
|
|
202
|
+
if (!match)
|
|
203
|
+
return { error: `no added root matches '${pathOrLabel}'.` };
|
|
204
|
+
const label = rootLabel(roots, match);
|
|
205
|
+
ctx.roots = roots.filter((r) => r !== match);
|
|
206
|
+
// Tear down that root's code map (best-effort, in the background).
|
|
207
|
+
const ch = ctx.chassisByRoot?.get(match);
|
|
208
|
+
ctx.chassisByRoot?.delete(match);
|
|
209
|
+
void stopChassis(ch);
|
|
210
|
+
return { removed: label };
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/tools/workspace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* workspaceDiscover.ts — find the rest of the project to pull into the workspace.
|
|
3
|
+
*
|
|
4
|
+
* "This is only part of the work" — given the primary root, discover the related
|
|
5
|
+
* folders so the model can work across the whole thing. Two sources, in order:
|
|
6
|
+
* 1. Monorepo declarations — package.json `workspaces`, pnpm-workspace.yaml,
|
|
7
|
+
* lerna.json, go.work, Cargo `[workspace] members`. Precise: the project
|
|
8
|
+
* itself says what its parts are.
|
|
9
|
+
* 2. Sibling projects — if no monorepo config, the sibling folders next to the
|
|
10
|
+
* root that look like code projects (have package.json / .git / go.mod / …).
|
|
11
|
+
*
|
|
12
|
+
* Pure discovery: it only reads and returns candidates; adding them is the caller's
|
|
13
|
+
* job (so /link and the model tool can apply their own confirmation policy).
|
|
14
|
+
*/
|
|
15
|
+
import { promises as fs } from "node:fs";
|
|
16
|
+
import { dirname, join, resolve } from "node:path";
|
|
17
|
+
/** Markers that say "this folder is a project worth including." */
|
|
18
|
+
const PROJECT_MARKERS = [
|
|
19
|
+
"package.json",
|
|
20
|
+
".git",
|
|
21
|
+
"go.mod",
|
|
22
|
+
"Cargo.toml",
|
|
23
|
+
"pyproject.toml",
|
|
24
|
+
"requirements.txt",
|
|
25
|
+
"pom.xml",
|
|
26
|
+
"build.gradle",
|
|
27
|
+
"tsconfig.json",
|
|
28
|
+
];
|
|
29
|
+
/**
|
|
30
|
+
* Discover folders related to `root` that aren't already in `existing`. Monorepo
|
|
31
|
+
* members win; siblings are the fallback when there's no workspace config.
|
|
32
|
+
*/
|
|
33
|
+
export async function discoverRelatedRoots(root, existing) {
|
|
34
|
+
const found = new Map(); // abs path → reason
|
|
35
|
+
// 1a. package.json workspaces (array, or { packages: [...] }).
|
|
36
|
+
const pkg = await readJson(join(root, "package.json"));
|
|
37
|
+
const wsPatterns = [];
|
|
38
|
+
const ws = pkg?.workspaces;
|
|
39
|
+
if (Array.isArray(ws))
|
|
40
|
+
wsPatterns.push(...ws.filter((x) => typeof x === "string"));
|
|
41
|
+
else if (ws && typeof ws === "object" && Array.isArray(ws.packages)) {
|
|
42
|
+
wsPatterns.push(...(ws.packages.filter((x) => typeof x === "string")));
|
|
43
|
+
}
|
|
44
|
+
// 1b. pnpm + lerna patterns.
|
|
45
|
+
const pnpm = await readText(join(root, "pnpm-workspace.yaml"));
|
|
46
|
+
if (pnpm)
|
|
47
|
+
wsPatterns.push(...parseYamlPackages(pnpm));
|
|
48
|
+
const lerna = await readJson(join(root, "lerna.json"));
|
|
49
|
+
if (Array.isArray(lerna?.packages)) {
|
|
50
|
+
wsPatterns.push(...(lerna.packages.filter((x) => typeof x === "string")));
|
|
51
|
+
}
|
|
52
|
+
for (const pattern of wsPatterns) {
|
|
53
|
+
for (const dir of await expandPattern(root, pattern))
|
|
54
|
+
found.set(dir, "workspace member");
|
|
55
|
+
}
|
|
56
|
+
// 1c. go.work modules.
|
|
57
|
+
const gowork = await readText(join(root, "go.work"));
|
|
58
|
+
if (gowork) {
|
|
59
|
+
for (const use of parseGoWork(gowork)) {
|
|
60
|
+
const abs = resolve(root, use);
|
|
61
|
+
if (await isDir(abs))
|
|
62
|
+
found.set(abs, "go.work module");
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// 1d. Cargo workspace members.
|
|
66
|
+
const cargo = await readText(join(root, "Cargo.toml"));
|
|
67
|
+
if (cargo) {
|
|
68
|
+
for (const member of parseCargoMembers(cargo)) {
|
|
69
|
+
for (const dir of await expandPattern(root, member))
|
|
70
|
+
found.set(dir, "cargo member");
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// 2. Siblings — only when nothing was declared.
|
|
74
|
+
if (found.size === 0) {
|
|
75
|
+
for (const sib of await siblingProjects(root))
|
|
76
|
+
found.set(sib, "sibling project");
|
|
77
|
+
}
|
|
78
|
+
const skip = new Set(existing.map((r) => resolve(r)));
|
|
79
|
+
skip.add(resolve(root));
|
|
80
|
+
return [...found]
|
|
81
|
+
.filter(([abs]) => !skip.has(resolve(abs)))
|
|
82
|
+
.map(([path, reason]) => ({ path, reason }));
|
|
83
|
+
}
|
|
84
|
+
// ── glob expansion ───────────────────────────────────────────────────────────
|
|
85
|
+
/** Expand one workspace pattern (`packages/*`, `apps/web`, …) to absolute dirs. */
|
|
86
|
+
async function expandPattern(root, pattern) {
|
|
87
|
+
const norm = pattern.replace(/\\/g, "/").replace(/\/+$/, "");
|
|
88
|
+
const star = norm.indexOf("*");
|
|
89
|
+
if (star === -1) {
|
|
90
|
+
const abs = resolve(root, norm);
|
|
91
|
+
return (await isDir(abs)) ? [abs] : [];
|
|
92
|
+
}
|
|
93
|
+
// One glob level: the dirs directly under the part before the `*`.
|
|
94
|
+
const base = norm.slice(0, star).replace(/\/+$/, "");
|
|
95
|
+
const baseAbs = resolve(root, base);
|
|
96
|
+
let entries;
|
|
97
|
+
try {
|
|
98
|
+
entries = await fs.readdir(baseAbs, { withFileTypes: true });
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return [];
|
|
102
|
+
}
|
|
103
|
+
return entries
|
|
104
|
+
.filter((e) => e.isDirectory() && !e.name.startsWith(".") && e.name !== "node_modules")
|
|
105
|
+
.map((e) => join(baseAbs, e.name));
|
|
106
|
+
}
|
|
107
|
+
// ── siblings ─────────────────────────────────────────────────────────────────
|
|
108
|
+
async function siblingProjects(root) {
|
|
109
|
+
const parent = dirname(root);
|
|
110
|
+
if (parent === root)
|
|
111
|
+
return [];
|
|
112
|
+
let entries;
|
|
113
|
+
try {
|
|
114
|
+
entries = await fs.readdir(parent, { withFileTypes: true });
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return [];
|
|
118
|
+
}
|
|
119
|
+
const out = [];
|
|
120
|
+
for (const e of entries) {
|
|
121
|
+
if (!e.isDirectory() || e.name.startsWith(".") || e.name === "node_modules")
|
|
122
|
+
continue;
|
|
123
|
+
const abs = join(parent, e.name);
|
|
124
|
+
if (resolve(abs) === resolve(root))
|
|
125
|
+
continue;
|
|
126
|
+
if (await looksLikeProject(abs))
|
|
127
|
+
out.push(abs);
|
|
128
|
+
}
|
|
129
|
+
return out;
|
|
130
|
+
}
|
|
131
|
+
async function looksLikeProject(dir) {
|
|
132
|
+
for (const marker of PROJECT_MARKERS) {
|
|
133
|
+
if (await exists(join(dir, marker)))
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
// ── tiny parsers ─────────────────────────────────────────────────────────────
|
|
139
|
+
/** The `packages:` list from pnpm-workspace.yaml (no YAML dependency). */
|
|
140
|
+
function parseYamlPackages(text) {
|
|
141
|
+
const out = [];
|
|
142
|
+
let inPackages = false;
|
|
143
|
+
for (const line of text.split("\n")) {
|
|
144
|
+
if (/^\s*packages:/.test(line)) {
|
|
145
|
+
inPackages = true;
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
if (!inPackages)
|
|
149
|
+
continue;
|
|
150
|
+
const m = line.match(/^\s*-\s*['"]?([^'"#]+?)['"]?\s*$/);
|
|
151
|
+
if (m)
|
|
152
|
+
out.push(m[1].trim());
|
|
153
|
+
else if (/^\S/.test(line))
|
|
154
|
+
break; // dedented to a new top-level key
|
|
155
|
+
}
|
|
156
|
+
return out;
|
|
157
|
+
}
|
|
158
|
+
/** `use` directives from go.work (single lines and the `use ( … )` block). */
|
|
159
|
+
function parseGoWork(text) {
|
|
160
|
+
const out = new Set();
|
|
161
|
+
const block = text.match(/use\s*\(([^)]*)\)/s);
|
|
162
|
+
if (block)
|
|
163
|
+
for (const l of block[1].split("\n")) {
|
|
164
|
+
const t = l.trim();
|
|
165
|
+
if (t && !t.startsWith("//"))
|
|
166
|
+
out.add(t);
|
|
167
|
+
}
|
|
168
|
+
for (const m of text.matchAll(/^\s*use\s+(\S+)\s*$/gm))
|
|
169
|
+
out.add(m[1]);
|
|
170
|
+
return [...out];
|
|
171
|
+
}
|
|
172
|
+
/** `members = [ … ]` from a Cargo `[workspace]`. */
|
|
173
|
+
function parseCargoMembers(text) {
|
|
174
|
+
const m = text.match(/members\s*=\s*\[([^\]]*)\]/s);
|
|
175
|
+
if (!m)
|
|
176
|
+
return [];
|
|
177
|
+
return [...m[1].matchAll(/['"]([^'"]+)['"]/g)].map((x) => x[1]);
|
|
178
|
+
}
|
|
179
|
+
// ── fs helpers ───────────────────────────────────────────────────────────────
|
|
180
|
+
async function readText(path) {
|
|
181
|
+
try {
|
|
182
|
+
return await fs.readFile(path, "utf8");
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
async function readJson(path) {
|
|
189
|
+
const text = await readText(path);
|
|
190
|
+
if (!text)
|
|
191
|
+
return null;
|
|
192
|
+
try {
|
|
193
|
+
return JSON.parse(text);
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
async function isDir(path) {
|
|
200
|
+
try {
|
|
201
|
+
return (await fs.stat(path)).isDirectory();
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
async function exists(path) {
|
|
208
|
+
try {
|
|
209
|
+
await fs.stat(path);
|
|
210
|
+
return true;
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=workspaceDiscover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaceDiscover.js","sourceRoot":"","sources":["../../src/tools/workspaceDiscover.ts"],"names":[],"mappings":"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"}
|