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 @@
|
|
|
1
|
+
{"version":3,"file":"walk.js","sourceRoot":"","sources":["../../src/tools/walk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { searchWeb } from "./webSearch.js";
|
|
2
|
+
import { fetchWeb } from "./webFetch.js";
|
|
3
|
+
import { DISTILL_OVER_CHARS } from "./webFetch.js";
|
|
4
|
+
import { failQuietly } from "./results.js";
|
|
5
|
+
export const web = {
|
|
6
|
+
name: "web",
|
|
7
|
+
/** Deferred: many coding sessions never touch the network at all. Cache-safe now that
|
|
8
|
+
* discovery is append-only — find_tools returns the schema in its result and the
|
|
9
|
+
* advertised list never moves. */
|
|
10
|
+
deferred: true,
|
|
11
|
+
readOnly: true,
|
|
12
|
+
description: "Reach the internet. Pass `query` to SEARCH, or `url` to READ a specific page.\n" +
|
|
13
|
+
"SEARCH: give a `query` the way you would type it into a search engine. Use it for " +
|
|
14
|
+
"anything that changed after your training data — current library APIs, recent " +
|
|
15
|
+
"releases, version-specific behaviour, whether a package still exists. You get an " +
|
|
16
|
+
"answer grounded in the pages found, plus their URLs. Not every model can search; " +
|
|
17
|
+
"if this one cannot, the tool says so and you should ask the user for a URL rather " +
|
|
18
|
+
"than retrying.\n" +
|
|
19
|
+
"READ: give a `url` and optionally a `prompt` describing what to extract. Use it for " +
|
|
20
|
+
"docs, articles, changelogs, or any public URL — including following a URL search " +
|
|
21
|
+
"just gave you. " +
|
|
22
|
+
`A page longer than ${DISTILL_OVER_CHARS.toLocaleString("en-US")} characters is ` +
|
|
23
|
+
"condensed against your `prompt` so you get the answer rather than the page; below " +
|
|
24
|
+
"that you simply get the whole thing and the prompt is not needed. " +
|
|
25
|
+
"A bare host is fine (\"example.com\" becomes https://example.com), http is upgraded " +
|
|
26
|
+
"to https, and private or localhost addresses are refused. " +
|
|
27
|
+
"For GitHub, prefer the gh CLI via run_command when you can.",
|
|
28
|
+
parameters: {
|
|
29
|
+
type: "object",
|
|
30
|
+
additionalProperties: false,
|
|
31
|
+
properties: {
|
|
32
|
+
query: {
|
|
33
|
+
type: "string",
|
|
34
|
+
description: "What to search for, phrased as a search query. Use this OR `url`, not both.",
|
|
35
|
+
},
|
|
36
|
+
url: {
|
|
37
|
+
type: "string",
|
|
38
|
+
description: "A page to read. A bare host works. Use this OR `query`, not both.",
|
|
39
|
+
},
|
|
40
|
+
prompt: {
|
|
41
|
+
type: "string",
|
|
42
|
+
description: "Reading only: what to extract from the page (used to focus a large page).",
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
async execute(args, ctx) {
|
|
47
|
+
const url = typeof args.url === "string" ? args.url.trim() : "";
|
|
48
|
+
const query = typeof args.query === "string" ? args.query.trim() : "";
|
|
49
|
+
// Both is refused rather than silently picking one: it means the model was unsure
|
|
50
|
+
// what it wanted, and quietly answering half the request is the worse outcome.
|
|
51
|
+
if (url && query) {
|
|
52
|
+
return failQuietly("pass either `query` to search or `url` to read a page, not both.");
|
|
53
|
+
}
|
|
54
|
+
if (url)
|
|
55
|
+
return fetchWeb(args, ctx);
|
|
56
|
+
if (query)
|
|
57
|
+
return searchWeb(args, ctx);
|
|
58
|
+
return failQuietly("`query` (to search) or `url` (to read a page) is required.");
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=web.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/tools/web.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,CAAC,MAAM,GAAG,GAAS;IACvB,IAAI,EAAE,KAAK;IACX;;uCAEmC;IACnC,QAAQ,EAAE,IAAI;IACd,QAAQ,EAAE,IAAI;IACd,WAAW,EACT,iFAAiF;QACjF,oFAAoF;QACpF,gFAAgF;QAChF,mFAAmF;QACnF,mFAAmF;QACnF,oFAAoF;QACpF,kBAAkB;QAClB,sFAAsF;QACtF,mFAAmF;QACnF,iBAAiB;QACjB,sBAAsB,kBAAkB,CAAC,cAAc,CAAC,OAAO,CAAC,iBAAiB;QACjF,oFAAoF;QACpF,oEAAoE;QACpE,sFAAsF;QACtF,4DAA4D;QAC5D,6DAA6D;IAC/D,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,oBAAoB,EAAE,KAAK;QAC3B,UAAU,EAAE;YACV,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,6EAA6E;aAC3F;YACD,GAAG,EAAE;gBACH,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,mEAAmE;aACjF;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,2EAA2E;aACzF;SACF;KACF;IAED,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG;QACrB,MAAM,GAAG,GAAG,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,kFAAkF;QAClF,+EAA+E;QAC/E,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;YACjB,OAAO,WAAW,CAAC,kEAAkE,CAAC,CAAC;QACzF,CAAC;QACD,IAAI,GAAG;YAAE,OAAO,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACpC,IAAI,KAAK;YAAE,OAAO,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACvC,OAAO,WAAW,CAAC,4DAA4D,CAAC,CAAC;IACnF,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* webFetch.ts — read a web page.
|
|
3
|
+
*
|
|
4
|
+
* A coding agent constantly needs something off the web: a docs page, a changelog,
|
|
5
|
+
* an RFC, an error explained. Without this the user has to paste it in. The shape
|
|
6
|
+
* is simple: input is a `url` plus an optional `prompt` describing what to pull out.
|
|
7
|
+
*
|
|
8
|
+
* Pipeline: fetch (https-upgraded, timed out, size-capped) → strip to readable
|
|
9
|
+
* markdown (HTML via turndown; text/json/markdown pass through) → if the page is
|
|
10
|
+
* large and the model gave a `prompt`, DISTILL it with one cheap model call so the
|
|
11
|
+
* answer lands in context instead of a giant page; otherwise return the cleaned
|
|
12
|
+
* content (capped). Read-only — touches no files.
|
|
13
|
+
*
|
|
14
|
+
* Model-work boundary: the optional distillation is a model call inside a tool.
|
|
15
|
+
* Its prompt is deliberately thin — "answer this from the page" — no analysis
|
|
16
|
+
* rules baked in; the engineering judgment stays with the model. Degrade-safe: no
|
|
17
|
+
* API key, or any failure, falls back to returning the cleaned/truncated content.
|
|
18
|
+
*
|
|
19
|
+
* Safety: only http/https, and a basic SSRF guard refuses localhost / private-network
|
|
20
|
+
* hosts so the tool can't be pointed at internal services.
|
|
21
|
+
*/
|
|
22
|
+
import TurndownService from "turndown";
|
|
23
|
+
import { activeDriver } from "../drivers/registry.js";
|
|
24
|
+
import { frameExternal } from "./untrusted.js";
|
|
25
|
+
import { outputDetail } from "./detail.js";
|
|
26
|
+
import { estimateTokens } from "../memory/compaction.js";
|
|
27
|
+
import { fail, failQuietly } from "./results.js";
|
|
28
|
+
const FETCH_TIMEOUT_MS = 20_000;
|
|
29
|
+
const DOWNLOAD_CAP_BYTES = 3_000_000; // stop reading a response past ~3MB
|
|
30
|
+
const CONTENT_CAP_CHARS = 12_000; // how much cleaned content we return / distill from
|
|
31
|
+
export const DISTILL_OVER_CHARS = 12_000; // above this, summarize via a model call (if a prompt is given)
|
|
32
|
+
/** Redirect hops followed before giving up. Enough for shorteners and canonical
|
|
33
|
+
* redirects, short enough that a redirect loop cannot spin. */
|
|
34
|
+
const MAX_REDIRECTS = 5;
|
|
35
|
+
const turndown = new TurndownService({ headingStyle: "atx", codeBlockStyle: "fenced" });
|
|
36
|
+
turndown.remove(["script", "style", "noscript", "iframe"]);
|
|
37
|
+
const webFetchTool = {
|
|
38
|
+
name: "web_fetch",
|
|
39
|
+
readOnly: true,
|
|
40
|
+
// This description was already accurate, so only two things were added, both of
|
|
41
|
+
// which prevent a wasted call: a bare host works (no need to hand-build the scheme),
|
|
42
|
+
// and on a page small enough to return whole the `prompt` simply is not used, which
|
|
43
|
+
// otherwise reads as the prompt having been ignored or failed.
|
|
44
|
+
description: "Fetch a web page and return its content as readable markdown. Give a `url` and " +
|
|
45
|
+
"optionally a `prompt` describing what to extract. Use it to read docs, articles, " +
|
|
46
|
+
"changelogs, or any public URL. " +
|
|
47
|
+
`A page longer than ${DISTILL_OVER_CHARS.toLocaleString("en-US")} characters is ` +
|
|
48
|
+
"condensed against your `prompt` so you get the answer rather than the page; below " +
|
|
49
|
+
"that you simply get the whole thing, and the prompt is not needed. " +
|
|
50
|
+
"A bare host is fine (\"example.com\" becomes https://example.com), http is upgraded " +
|
|
51
|
+
"to https, and private or localhost addresses are refused. " +
|
|
52
|
+
"For GitHub, prefer the gh CLI via run_command when you can.",
|
|
53
|
+
parameters: {
|
|
54
|
+
type: "object",
|
|
55
|
+
additionalProperties: false,
|
|
56
|
+
required: ["url"],
|
|
57
|
+
properties: {
|
|
58
|
+
url: { type: "string", description: "The URL to fetch (a fully-formed http(s) URL)." },
|
|
59
|
+
prompt: {
|
|
60
|
+
type: "string",
|
|
61
|
+
description: "Optional: what to extract from the page (used to focus a large page).",
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
async execute(args, ctx) {
|
|
66
|
+
const rawUrl = typeof args.url === "string" ? args.url.trim() : "";
|
|
67
|
+
const prompt = typeof args.prompt === "string" ? args.prompt.trim() : "";
|
|
68
|
+
if (!rawUrl)
|
|
69
|
+
return failQuietly("`url` is required.");
|
|
70
|
+
const url = normalizeUrl(rawUrl);
|
|
71
|
+
if (typeof url === "string")
|
|
72
|
+
return failQuietly(url); // a validation message
|
|
73
|
+
const blocked = ssrfReason(url);
|
|
74
|
+
if (blocked)
|
|
75
|
+
return fail(blocked);
|
|
76
|
+
const fetched = await fetchUrl(url);
|
|
77
|
+
if (typeof fetched === "string")
|
|
78
|
+
return fail(fetched);
|
|
79
|
+
const { finalUrl, status, contentType, body } = fetched;
|
|
80
|
+
if (!isTextual(contentType)) {
|
|
81
|
+
return {
|
|
82
|
+
output: `Fetched ${finalUrl} (HTTP ${status}, ${contentType || "unknown type"}). ` +
|
|
83
|
+
`This is binary/non-text content, which web_fetch can't read. ` +
|
|
84
|
+
`If you need it, download it with run_command.`,
|
|
85
|
+
summary: `fetched ${hostOf(url)} (non-text)`,
|
|
86
|
+
detail: fetchDetail(finalUrl, status, [`Content-Type: ${contentType || "unknown"} — not text, not read`]),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
let content = contentType.includes("html") ? htmlToMarkdown(body) : body.trim();
|
|
90
|
+
const redirected = hostOf(finalUrl) !== hostOf(url) ? `\n(note: redirected to ${finalUrl})` : "";
|
|
91
|
+
// Large page + a prompt → distill to the answer. Otherwise return content,
|
|
92
|
+
// capped. Distillation is best-effort; failure falls back to truncation.
|
|
93
|
+
if (content.length > DISTILL_OVER_CHARS && prompt) {
|
|
94
|
+
const distilled = await distill(content.slice(0, CONTENT_CAP_CHARS * 3), prompt, ctx);
|
|
95
|
+
if (distilled) {
|
|
96
|
+
// Framed too. Distillation is a summary OF untrusted text, so an instruction
|
|
97
|
+
// planted in the page can survive into it — passing it through unmarked would
|
|
98
|
+
// launder the page's words into something that reads as ours.
|
|
99
|
+
return {
|
|
100
|
+
output: frameExternal({ tag: "web_page", attrs: { url: finalUrl }, what: "an external web page" }, `(focused on: ${prompt})${redirected}\n\n${distilled}`),
|
|
101
|
+
summary: `fetched ${hostOf(url)} (summarized)`,
|
|
102
|
+
detail: fetchDetail(finalUrl, status, [
|
|
103
|
+
`Condensed against: "${prompt}"`,
|
|
104
|
+
...(redirected ? [`Redirected from ${hostOf(url)}`] : []),
|
|
105
|
+
]),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
let out = content;
|
|
110
|
+
let truncated = false;
|
|
111
|
+
if (out.length > CONTENT_CAP_CHARS) {
|
|
112
|
+
out = out.slice(0, CONTENT_CAP_CHARS);
|
|
113
|
+
truncated = true;
|
|
114
|
+
}
|
|
115
|
+
const footer = truncated
|
|
116
|
+
? `\n\n… (content truncated at ${CONTENT_CAP_CHARS} chars; fetch a more specific URL or pass a prompt to focus it)`
|
|
117
|
+
: "";
|
|
118
|
+
return {
|
|
119
|
+
output: frameExternal({ tag: "web_page", attrs: { url: finalUrl, status: String(status) }, what: "an external web page" }, `${redirected}${redirected ? "\n\n" : ""}${out}${footer}`),
|
|
120
|
+
summary: `fetched ${hostOf(url)} (${out.length} chars${truncated ? ", truncated" : ""})`,
|
|
121
|
+
detail: fetchDetail(finalUrl, status, [
|
|
122
|
+
`Extracted ${estimateTokens(out).toLocaleString("en-US")} tokens${truncated ? ", truncated" : ""}`,
|
|
123
|
+
...(pageTitle(body) ? [`Title: ${pageTitle(body)}`] : []),
|
|
124
|
+
...(redirected ? [`Redirected from ${hostOf(url)}`] : []),
|
|
125
|
+
], byteSize(body)),
|
|
126
|
+
};
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
/** The UI-only detail block under a Fetch row — never sent to the model
|
|
130
|
+
* (`frameExternal`'s `output` is what the model sees). `bytes` is what came off the
|
|
131
|
+
* wire, which is the number that says whether the page was worth the round trip. */
|
|
132
|
+
export function fetchDetail(finalUrl, status, extra, bytes) {
|
|
133
|
+
const lead = bytes === undefined ? `Received ${finalUrl}` : `Received ${formatBytes(bytes)} from ${finalUrl}`;
|
|
134
|
+
return outputDetail([`${lead} (HTTP ${status})`, ...extra].join("\n"));
|
|
135
|
+
}
|
|
136
|
+
/** Bytes as a person reads them: `412 B`, `24.8 KB`, `1.3 MB`. */
|
|
137
|
+
export function formatBytes(n) {
|
|
138
|
+
if (n < 1024)
|
|
139
|
+
return `${n} B`;
|
|
140
|
+
if (n < 1024 * 1024)
|
|
141
|
+
return `${(n / 1024).toFixed(1)} KB`;
|
|
142
|
+
return `${(n / (1024 * 1024)).toFixed(1)} MB`;
|
|
143
|
+
}
|
|
144
|
+
/** The transferred size — byte length, not character count, since a page of non-ASCII
|
|
145
|
+
* text is meaningfully larger on the wire than its `.length` suggests. */
|
|
146
|
+
function byteSize(body) {
|
|
147
|
+
return Buffer.byteLength(body, "utf8");
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* A page's `<title>`, when it has one worth showing.
|
|
151
|
+
*
|
|
152
|
+
* What the page calls itself is the fastest way to tell "I fetched the right doc" from
|
|
153
|
+
* "I fetched a login wall", and it is the one fact a URL alone cannot give.
|
|
154
|
+
*/
|
|
155
|
+
export function pageTitle(body) {
|
|
156
|
+
const m = /<title[^>]*>([\s\S]*?)<\/title>/i.exec(body);
|
|
157
|
+
if (!m)
|
|
158
|
+
return "";
|
|
159
|
+
const text = m[1].replace(/\s+/g, " ").trim();
|
|
160
|
+
return text.length > 80 ? text.slice(0, 79) + "…" : text;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Fetch with timeout + size cap, checking EVERY hop. Body, or an error string.
|
|
164
|
+
*
|
|
165
|
+
* Redirects are followed by hand rather than by `fetch`. Letting the client follow
|
|
166
|
+
* them means the SSRF guard only ever sees the URL the model supplied, and a public
|
|
167
|
+
* URL that answers `302 -> http://127.0.0.1:8080` (or the cloud metadata address) is
|
|
168
|
+
* then fetched with no check at all. That is a live bug class rather than a
|
|
169
|
+
* hypothetical: the same shape was fixed in pyload, crewai-tools, WeasyPrint and
|
|
170
|
+
* open-webui through 2026. The guidance is to refuse redirects or revalidate each
|
|
171
|
+
* hop; revalidating keeps ordinary shortened and canonicalising links working, which
|
|
172
|
+
* a coding agent hits constantly.
|
|
173
|
+
*/
|
|
174
|
+
async function fetchUrl(startUrl) {
|
|
175
|
+
const controller = new AbortController();
|
|
176
|
+
const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
|
|
177
|
+
let url = startUrl;
|
|
178
|
+
try {
|
|
179
|
+
for (let hop = 0;; hop++) {
|
|
180
|
+
const res = await fetch(url, {
|
|
181
|
+
// Manual, so a redirect target is a value we inspect rather than a request
|
|
182
|
+
// the client has already made on our behalf.
|
|
183
|
+
redirect: "manual",
|
|
184
|
+
signal: controller.signal,
|
|
185
|
+
headers: { "User-Agent": "Mindweave/0.1 (+terminal coding agent)", Accept: "text/html,text/*,application/json;q=0.9,*/*;q=0.8" },
|
|
186
|
+
});
|
|
187
|
+
const location = res.status >= 300 && res.status < 400 ? res.headers.get("location") : null;
|
|
188
|
+
if (!location) {
|
|
189
|
+
const contentType = (res.headers.get("content-type") ?? "").toLowerCase();
|
|
190
|
+
const body = await readCapped(res);
|
|
191
|
+
return { finalUrl: url.toString(), status: res.status, contentType, body };
|
|
192
|
+
}
|
|
193
|
+
// Discard the redirect's own body; only the destination matters from here.
|
|
194
|
+
await res.body?.cancel().catch(() => { });
|
|
195
|
+
const step = redirectStep(location, url, hop);
|
|
196
|
+
if ("error" in step)
|
|
197
|
+
return step.error;
|
|
198
|
+
url = step.url;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
203
|
+
return `Timed out fetching ${startUrl.toString()} after ${FETCH_TIMEOUT_MS / 1000}s.`;
|
|
204
|
+
}
|
|
205
|
+
return `Could not fetch ${startUrl.toString()}: ${error instanceof Error ? error.message : String(error)}`;
|
|
206
|
+
}
|
|
207
|
+
finally {
|
|
208
|
+
clearTimeout(timer);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Decide whether one redirect hop may be followed (pure).
|
|
213
|
+
*
|
|
214
|
+
* Everything that makes a redirect dangerous is decided here, with no I/O, so the
|
|
215
|
+
* rule is unit-testable rather than only reachable through a live server — which
|
|
216
|
+
* matters because the interesting cases redirect INTO private addresses, and a test
|
|
217
|
+
* that has to bind one is a test nobody writes.
|
|
218
|
+
*/
|
|
219
|
+
export function redirectStep(location, from, hop) {
|
|
220
|
+
if (hop >= MAX_REDIRECTS) {
|
|
221
|
+
return { error: `Gave up after ${MAX_REDIRECTS} redirects, most recently at ${from.toString()}.` };
|
|
222
|
+
}
|
|
223
|
+
// Relative Location headers are legal and common.
|
|
224
|
+
let next;
|
|
225
|
+
try {
|
|
226
|
+
next = new URL(location, from);
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
return { error: `Got an unreadable redirect target ("${location}") from ${from.toString()}.` };
|
|
230
|
+
}
|
|
231
|
+
// A redirect must not become a way to reach a scheme the tool would have refused
|
|
232
|
+
// outright — `file:`, `gopher:` and friends are a standard SSRF escalation.
|
|
233
|
+
if (next.protocol === "http:")
|
|
234
|
+
next.protocol = "https:";
|
|
235
|
+
if (next.protocol !== "https:") {
|
|
236
|
+
return { error: `Refusing to follow a redirect to a "${next.protocol}" URL (${next.toString()}).` };
|
|
237
|
+
}
|
|
238
|
+
const blocked = ssrfReason(next);
|
|
239
|
+
if (blocked)
|
|
240
|
+
return { error: `Refusing to follow a redirect from ${from.hostname}: ${blocked}` };
|
|
241
|
+
return { url: next };
|
|
242
|
+
}
|
|
243
|
+
/** Read a response body, stopping once past the byte cap. */
|
|
244
|
+
async function readCapped(res) {
|
|
245
|
+
if (!res.body)
|
|
246
|
+
return await res.text();
|
|
247
|
+
const reader = res.body.getReader();
|
|
248
|
+
const chunks = [];
|
|
249
|
+
let total = 0;
|
|
250
|
+
for (;;) {
|
|
251
|
+
const { done, value } = await reader.read();
|
|
252
|
+
if (done)
|
|
253
|
+
break;
|
|
254
|
+
if (value) {
|
|
255
|
+
chunks.push(value);
|
|
256
|
+
total += value.length;
|
|
257
|
+
if (total >= DOWNLOAD_CAP_BYTES) {
|
|
258
|
+
await reader.cancel().catch(() => { });
|
|
259
|
+
break;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return Buffer.concat(chunks).toString("utf8");
|
|
264
|
+
}
|
|
265
|
+
// ── transform ───────────────────────────────────────────────────────────────
|
|
266
|
+
function htmlToMarkdown(html) {
|
|
267
|
+
try {
|
|
268
|
+
return turndown.turndown(html).replace(/\n{3,}/g, "\n\n").trim();
|
|
269
|
+
}
|
|
270
|
+
catch {
|
|
271
|
+
// Fall back to a crude tag-strip if turndown chokes on malformed markup.
|
|
272
|
+
return html.replace(/<[^>]+>/g, " ").replace(/\s+/g, " ").trim();
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
/** One cheap model call to answer `prompt` from the page. null on any failure. */
|
|
276
|
+
async function distill(content, prompt, ctx) {
|
|
277
|
+
try {
|
|
278
|
+
const turn = await activeDriver().toolTurn({
|
|
279
|
+
system: "You extract information from a web page to answer the user's request. " +
|
|
280
|
+
"Answer only from the content provided; be concise and include relevant " +
|
|
281
|
+
"code or quotes. If the answer isn't present, say so.",
|
|
282
|
+
messages: [{ role: "user", content: `Web page content:\n---\n${content}\n---\n\nRequest: ${prompt}` }],
|
|
283
|
+
});
|
|
284
|
+
// A distillation is a real model call on the user's key, made on the agent's
|
|
285
|
+
// initiative rather than the user's. Reporting it keeps the meter from being
|
|
286
|
+
// short by exactly the work nobody could see.
|
|
287
|
+
if (turn.usage)
|
|
288
|
+
ctx?.reportUsage?.(turn.usage);
|
|
289
|
+
return turn.content.trim() || null;
|
|
290
|
+
}
|
|
291
|
+
catch {
|
|
292
|
+
return null;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
// ── url + safety ──────────────────────────────────────────────────────────────
|
|
296
|
+
/** Validate, default-to-https, and upgrade http→https. Returns a URL or an error string. */
|
|
297
|
+
export function normalizeUrl(raw) {
|
|
298
|
+
let text = raw;
|
|
299
|
+
if (!/^[a-z]+:\/\//i.test(text))
|
|
300
|
+
text = "https://" + text; // bare host → https
|
|
301
|
+
let url;
|
|
302
|
+
try {
|
|
303
|
+
url = new URL(text);
|
|
304
|
+
}
|
|
305
|
+
catch {
|
|
306
|
+
return `Invalid URL: "${raw}".`;
|
|
307
|
+
}
|
|
308
|
+
if (url.protocol === "http:")
|
|
309
|
+
url.protocol = "https:";
|
|
310
|
+
if (url.protocol !== "https:")
|
|
311
|
+
return `Unsupported URL scheme "${url.protocol}" — only http/https.`;
|
|
312
|
+
return url;
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* SSRF guard: refuse localhost, private, and link-local hosts.
|
|
316
|
+
*
|
|
317
|
+
* Pure, and deliberately so — every hop of a redirect chain is put through it, and a
|
|
318
|
+
* check that needed I/O could not be run that often.
|
|
319
|
+
*
|
|
320
|
+
* Three things this covers beyond the obvious dotted-quad:
|
|
321
|
+
*
|
|
322
|
+
* - **IPv6.** Blocking only `::1` left unique-local (`fc00::/7`) and link-local
|
|
323
|
+
* (`fe80::/10`) wide open, which is most of what an internal IPv6 network uses.
|
|
324
|
+
* - **Alternate IPv4 encodings.** `http://2130706433/` is `127.0.0.1` written as a
|
|
325
|
+
* single decimal, and `0x7f.1` is the same host again. A string match on
|
|
326
|
+
* "127." sees neither, and every SSRF filter-bypass list opens with this.
|
|
327
|
+
* - **169.254.0.0/16**, which is where cloud instance metadata lives. It was
|
|
328
|
+
* already covered, and it is the reason the rest matters.
|
|
329
|
+
*
|
|
330
|
+
* What it does NOT do: resolve DNS. A name that resolves to a private address still
|
|
331
|
+
* passes, and defending against that (or against rebinding between check and connect)
|
|
332
|
+
* means pinning the connection to a checked IP, which Node's fetch does not expose.
|
|
333
|
+
* Stated rather than papered over.
|
|
334
|
+
*/
|
|
335
|
+
export function ssrfReason(url) {
|
|
336
|
+
const host = url.hostname.toLowerCase();
|
|
337
|
+
if (host === "localhost" || host.endsWith(".localhost") || host.endsWith(".local")) {
|
|
338
|
+
return `Refusing to fetch a local address (${host}).`;
|
|
339
|
+
}
|
|
340
|
+
// IPv6 literals arrive from `URL` still wrapped in brackets.
|
|
341
|
+
if (host.startsWith("[") && host.endsWith("]")) {
|
|
342
|
+
const v6 = host.slice(1, -1);
|
|
343
|
+
if (v6 === "::1" || v6 === "::")
|
|
344
|
+
return `Refusing to fetch a loopback address (${host}).`;
|
|
345
|
+
// fc00::/7 (unique-local) and fe80::/10 (link-local).
|
|
346
|
+
if (/^f[cd][0-9a-f]{0,2}:/i.test(v6) || /^fe[89ab][0-9a-f]?:/i.test(v6)) {
|
|
347
|
+
return `Refusing to fetch a private/link-local address (${host}).`;
|
|
348
|
+
}
|
|
349
|
+
// IPv4 wearing an IPv6 hat. Both spellings have to be handled, because `URL`
|
|
350
|
+
// rewrites the readable one: `[::ffff:127.0.0.1]` is normalised to
|
|
351
|
+
// `[::ffff:7f00:1]` before this ever sees it, so matching only dotted form
|
|
352
|
+
// would catch nothing at all.
|
|
353
|
+
const mappedDotted = /^::ffff:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/i.exec(v6);
|
|
354
|
+
if (mappedDotted && isPrivateV4(mappedDotted[1])) {
|
|
355
|
+
return `Refusing to fetch a private/loopback address (${host}).`;
|
|
356
|
+
}
|
|
357
|
+
const mappedHex = /^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/i.exec(v6);
|
|
358
|
+
if (mappedHex) {
|
|
359
|
+
const n = (parseInt(mappedHex[1], 16) << 16) | parseInt(mappedHex[2], 16);
|
|
360
|
+
const dotted = [(n >>> 24) & 255, (n >>> 16) & 255, (n >>> 8) & 255, n & 255].join(".");
|
|
361
|
+
if (isPrivateV4(dotted))
|
|
362
|
+
return `Refusing to fetch a private/loopback address (${host}).`;
|
|
363
|
+
}
|
|
364
|
+
return null;
|
|
365
|
+
}
|
|
366
|
+
if (host === "::1" || host === "::")
|
|
367
|
+
return `Refusing to fetch a loopback address (${host}).`;
|
|
368
|
+
const v4 = asIPv4(host);
|
|
369
|
+
if (v4 && isPrivateV4(v4))
|
|
370
|
+
return `Refusing to fetch a private/loopback address (${host}).`;
|
|
371
|
+
return null;
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Normalise anything that is really an IPv4 address into dotted-quad, or null (pure).
|
|
375
|
+
*
|
|
376
|
+
* Covers dotted decimal, a bare 32-bit integer (`2130706433`), and hex/octal parts
|
|
377
|
+
* (`0x7f.0.0.1`, `0177.0.0.1`) — the standard filter-bypass encodings. Anything that
|
|
378
|
+
* is not unambiguously an address returns null and is treated as a hostname.
|
|
379
|
+
*/
|
|
380
|
+
export function asIPv4(host) {
|
|
381
|
+
if (/^\d+$/.test(host)) {
|
|
382
|
+
const n = Number(host);
|
|
383
|
+
if (!Number.isSafeInteger(n) || n < 0 || n > 0xffffffff)
|
|
384
|
+
return null;
|
|
385
|
+
return [(n >>> 24) & 255, (n >>> 16) & 255, (n >>> 8) & 255, n & 255].join(".");
|
|
386
|
+
}
|
|
387
|
+
const parts = host.split(".");
|
|
388
|
+
if (parts.length !== 4)
|
|
389
|
+
return null;
|
|
390
|
+
const nums = [];
|
|
391
|
+
for (const p of parts) {
|
|
392
|
+
if (p === "")
|
|
393
|
+
return null;
|
|
394
|
+
let n;
|
|
395
|
+
if (/^0x[0-9a-f]+$/i.test(p))
|
|
396
|
+
n = parseInt(p, 16);
|
|
397
|
+
else if (/^0[0-7]+$/.test(p))
|
|
398
|
+
n = parseInt(p, 8);
|
|
399
|
+
else if (/^\d+$/.test(p))
|
|
400
|
+
n = Number(p);
|
|
401
|
+
else
|
|
402
|
+
return null;
|
|
403
|
+
if (!Number.isInteger(n) || n < 0 || n > 255)
|
|
404
|
+
return null;
|
|
405
|
+
nums.push(n);
|
|
406
|
+
}
|
|
407
|
+
return nums.join(".");
|
|
408
|
+
}
|
|
409
|
+
/** Is a dotted-quad in a loopback, private, or link-local range? (pure) */
|
|
410
|
+
function isPrivateV4(dotted) {
|
|
411
|
+
const p = dotted.split(".").map(Number);
|
|
412
|
+
const [a, b] = [p[0], p[1]];
|
|
413
|
+
return (a === 0 ||
|
|
414
|
+
a === 10 ||
|
|
415
|
+
a === 127 ||
|
|
416
|
+
(a === 169 && b === 254) || // link-local, and cloud instance metadata
|
|
417
|
+
(a === 172 && b >= 16 && b <= 31) ||
|
|
418
|
+
(a === 192 && b === 168) ||
|
|
419
|
+
(a === 100 && b >= 64 && b <= 127) || // carrier-grade NAT
|
|
420
|
+
a >= 224 // multicast and reserved
|
|
421
|
+
);
|
|
422
|
+
}
|
|
423
|
+
function isTextual(contentType) {
|
|
424
|
+
if (!contentType)
|
|
425
|
+
return true; // unknown — assume text and let cleanup handle it
|
|
426
|
+
return (contentType.includes("text/") ||
|
|
427
|
+
contentType.includes("html") ||
|
|
428
|
+
contentType.includes("json") ||
|
|
429
|
+
contentType.includes("xml") ||
|
|
430
|
+
contentType.includes("markdown"));
|
|
431
|
+
}
|
|
432
|
+
function hostOf(u) {
|
|
433
|
+
try {
|
|
434
|
+
return new URL(u.toString()).hostname;
|
|
435
|
+
}
|
|
436
|
+
catch {
|
|
437
|
+
return String(u);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
/** The fetch half of the merged `web` tool. Logic unchanged. */
|
|
441
|
+
export const fetchWeb = webFetchTool.execute;
|
|
442
|
+
/** Kept for tests that assert on the fetch description/flags directly. */
|
|
443
|
+
export const webFetch = webFetchTool;
|
|
444
|
+
//# sourceMappingURL=webFetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webFetch.js","sourceRoot":"","sources":["../../src/tools/webFetch.ts"],"names":[],"mappings":"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"}
|