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,121 @@
|
|
|
1
|
+
import { screenshot } from "./screenshot.js";
|
|
2
|
+
import { saveMemoryTool } from "./saveMemory.js";
|
|
3
|
+
import { governor, createSkill } from "./governorTools.js";
|
|
4
|
+
import { sessionsTool } from "./sessionTools.js";
|
|
5
|
+
import { mcpResourceTool } from "./mcpResources.js";
|
|
6
|
+
import { workspaceTool } from "./workspace.js";
|
|
7
|
+
import { todoWrite } from "./todo.js";
|
|
8
|
+
import { askUserTool } from "./askUser.js";
|
|
9
|
+
import { outlineTool, definitionTool, referencesTool } from "./codeIntel.js";
|
|
10
|
+
import { web } from "./web.js";
|
|
11
|
+
import { replaceSymbolBody } from "./replaceSymbol.js";
|
|
12
|
+
import { spawnSubagent } from "./subagent.js";
|
|
13
|
+
import { addMcpServer } from "./mcpAdd.js";
|
|
14
|
+
/** The pool, in the order it is named to the model. */
|
|
15
|
+
export const DEFERRED_TOOLS = [
|
|
16
|
+
todoWrite,
|
|
17
|
+
askUserTool,
|
|
18
|
+
outlineTool,
|
|
19
|
+
definitionTool,
|
|
20
|
+
referencesTool,
|
|
21
|
+
spawnSubagent,
|
|
22
|
+
web,
|
|
23
|
+
replaceSymbolBody,
|
|
24
|
+
governor,
|
|
25
|
+
createSkill,
|
|
26
|
+
saveMemoryTool,
|
|
27
|
+
sessionsTool,
|
|
28
|
+
workspaceTool,
|
|
29
|
+
mcpResourceTool,
|
|
30
|
+
addMcpServer,
|
|
31
|
+
screenshot,
|
|
32
|
+
];
|
|
33
|
+
/**
|
|
34
|
+
* The one line about the pool that goes in the system prompt.
|
|
35
|
+
*
|
|
36
|
+
* It exists so the model knows these capabilities are REACHABLE rather than absent.
|
|
37
|
+
* Without it a deferred tool is indistinguishable from a missing feature, and the model
|
|
38
|
+
* routes around something it actually has — which costs far more than the schemas ever
|
|
39
|
+
* did. Names only, no descriptions: enough to prompt a search, cheap enough that the
|
|
40
|
+
* trade is obviously worth it.
|
|
41
|
+
*/
|
|
42
|
+
export function deferredToolsIndex() {
|
|
43
|
+
if (DEFERRED_TOOLS.length === 0)
|
|
44
|
+
return "";
|
|
45
|
+
return (`Some of your own tools are not listed above. Their names: ` +
|
|
46
|
+
`${DEFERRED_TOOLS.map((t) => t.name).join(", ")}. ` +
|
|
47
|
+
`Only the name is known until you fetch one — find_tools returns the full schema, and ` +
|
|
48
|
+
`from that moment the tool is callable exactly like the ones listed above. ` +
|
|
49
|
+
`When a task needs one, search for it rather than concluding you cannot do it.`);
|
|
50
|
+
}
|
|
51
|
+
/** Keep a hit only if it scores at least this share of the best hit. */
|
|
52
|
+
const RELEVANCE_FLOOR = 0.5;
|
|
53
|
+
/** Most tools one search hands over. Each one costs its full schema. */
|
|
54
|
+
const MAX_NATIVE_RESULTS = 5;
|
|
55
|
+
/**
|
|
56
|
+
* Render one deferred tool the way the advertised list renders it: name, description and
|
|
57
|
+
* the full JSON parameter schema.
|
|
58
|
+
*
|
|
59
|
+
* This is what makes deferral cache-safe. The schema is delivered in the SEARCH RESULT,
|
|
60
|
+
* which is an ordinary message appended to the conversation, rather than by adding the
|
|
61
|
+
* tool to the advertised `tools` array. An appended message leaves every earlier byte
|
|
62
|
+
* untouched, so the provider's cached prefix survives and the schema itself is cached
|
|
63
|
+
* from the next call onward. Mutating the array instead re-writes the prefix — tools,
|
|
64
|
+
* system and messages — at full price, which cost several times what the deferral saved.
|
|
65
|
+
*
|
|
66
|
+
* The model can call the tool from this alone: dispatch resolves against the registry,
|
|
67
|
+
* not against what was advertised, so a name and a schema is everything it needs.
|
|
68
|
+
*/
|
|
69
|
+
export function renderToolSchema(tool) {
|
|
70
|
+
return `<function>${JSON.stringify({
|
|
71
|
+
name: tool.name,
|
|
72
|
+
description: tool.description,
|
|
73
|
+
parameters: tool.parameters,
|
|
74
|
+
})}</function>`;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Rank the pool against a search query (pure).
|
|
78
|
+
*
|
|
79
|
+
* Deliberately the same blunt keyword approach as the MCP ranker: the model queries
|
|
80
|
+
* with a capability word ("memory", "skill", "screenshot") or a tool name, not a
|
|
81
|
+
* sentence, so precision matters less than never returning nothing for a fair query.
|
|
82
|
+
*/
|
|
83
|
+
export function matchDeferred(query) {
|
|
84
|
+
const terms = query.toLowerCase().trim().split(/[^a-z0-9]+/).filter(Boolean);
|
|
85
|
+
if (terms.length === 0)
|
|
86
|
+
return [];
|
|
87
|
+
const scored = DEFERRED_TOOLS.map((tool) => {
|
|
88
|
+
const name = tool.name.toLowerCase();
|
|
89
|
+
const description = tool.description.toLowerCase();
|
|
90
|
+
let score = 0;
|
|
91
|
+
for (const term of terms) {
|
|
92
|
+
if (name === term)
|
|
93
|
+
score += 20; // the model named the tool outright
|
|
94
|
+
else if (name.includes(term))
|
|
95
|
+
score += 10;
|
|
96
|
+
// A description hit is weak on its own: descriptions are long and mention a lot.
|
|
97
|
+
if (description.includes(term))
|
|
98
|
+
score += 2;
|
|
99
|
+
}
|
|
100
|
+
return { tool, score };
|
|
101
|
+
})
|
|
102
|
+
.filter((s) => s.score > 0)
|
|
103
|
+
// Ties break on name so identical searches return identical results.
|
|
104
|
+
.sort((a, b) => b.score - a.score || a.tool.name.localeCompare(b.tool.name));
|
|
105
|
+
// Cut the weak tail, RELATIVE to the best hit rather than at a fixed score.
|
|
106
|
+
//
|
|
107
|
+
// Every match is answered with the tool's full schema now, so a loose match is not a
|
|
108
|
+
// harmless extra line — it is a few hundred tokens the model did not ask for. Searching
|
|
109
|
+
// "session" used to return six tools, because the word appears in four other tools'
|
|
110
|
+
// descriptions in passing ("for the rest of this session") and a description mention
|
|
111
|
+
// scored enough to qualify.
|
|
112
|
+
//
|
|
113
|
+
// Relative, because the right floor depends on what was found. When something matched
|
|
114
|
+
// by NAME, a passing mention elsewhere is noise and should go. When the best anyone
|
|
115
|
+
// managed was a description hit, that same score is the real answer and must be kept —
|
|
116
|
+
// a fixed threshold would have to choose one of those cases and be wrong in the other.
|
|
117
|
+
const best = scored[0]?.score ?? 0;
|
|
118
|
+
const floor = Math.max(1, best * RELEVANCE_FLOOR);
|
|
119
|
+
return scored.filter((s) => s.score >= floor).slice(0, MAX_NATIVE_RESULTS).map((s) => s.tool);
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=deferredNative.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deferredNative.js","sourceRoot":"","sources":["../../src/tools/deferredNative.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* detail.ts — display-only rich detail for mutating tools.
|
|
3
|
+
*
|
|
4
|
+
* Builds the multi-line block the UI shows under a tool row: a +/- diff for an
|
|
5
|
+
* edit, a preview of a freshly written file, or a command's output. This is
|
|
6
|
+
* `ToolResult.detail` — it never reaches the model (the model gets the terse
|
|
7
|
+
* `output`), it only makes the terminal show what actually happened —
|
|
8
|
+
* a diff or a command's stdout. Lines are prefixed so the
|
|
9
|
+
* renderer can colour them: `+ ` added (green), `- ` removed (red), bare = plain.
|
|
10
|
+
*/
|
|
11
|
+
/** Cap a list of display lines, noting how many were hidden. */
|
|
12
|
+
export function capLines(lines, max) {
|
|
13
|
+
if (lines.length <= max)
|
|
14
|
+
return lines.join("\n");
|
|
15
|
+
const hidden = lines.length - max;
|
|
16
|
+
return [...lines.slice(0, max), ` … (${hidden} more line${hidden === 1 ? "" : "s"})`].join("\n");
|
|
17
|
+
}
|
|
18
|
+
// ── Scope helpers (pure) — the "what/where/how much" a change touched, so the row
|
|
19
|
+
// isn't just a diff with no sense of range or magnitude. Kept pure + tested.
|
|
20
|
+
/** Lines a replacement string spans (an empty string spans none). */
|
|
21
|
+
export function lineCount(s) {
|
|
22
|
+
return s === "" ? 0 : s.split("\n").length;
|
|
23
|
+
}
|
|
24
|
+
/** A line-range label: "L120" for one line, "L120-138" for a span. */
|
|
25
|
+
export function rangeLabel(startLine, endLine) {
|
|
26
|
+
return endLine > startLine ? `L${startLine}-${endLine}` : `L${startLine}`;
|
|
27
|
+
}
|
|
28
|
+
/** The change magnitude, "−6 +12" — a real minus sign (U+2212), never the diff's
|
|
29
|
+
* hyphen, so it can't be mistaken for a removed line. */
|
|
30
|
+
export function magnitude(removed, added) {
|
|
31
|
+
return `−${removed} +${added}`;
|
|
32
|
+
}
|
|
33
|
+
/** Prepend a dim scope header above a diff/preview (its own line, no +/- prefix so
|
|
34
|
+
* the renderer leaves it uncolored). Empty `body` → just the header. */
|
|
35
|
+
export function withScope(scope, body) {
|
|
36
|
+
return body ? `${scope}\n${body}` : scope;
|
|
37
|
+
}
|
|
38
|
+
/** A +/- diff for an edit: the replaced lines removed, the new lines added. */
|
|
39
|
+
export function editDetail(oldStr, newStr) {
|
|
40
|
+
const lines = [
|
|
41
|
+
...stripTrailingNewline(oldStr).split("\n").map((l) => `- ${l}`),
|
|
42
|
+
...stripTrailingNewline(newStr).split("\n").map((l) => `+ ${l}`),
|
|
43
|
+
];
|
|
44
|
+
return capLines(lines, 30);
|
|
45
|
+
}
|
|
46
|
+
/** A stacked +/- diff for a sequence of edits (the edit tool), one block per edit. */
|
|
47
|
+
export function multiEditDetail(edits) {
|
|
48
|
+
const lines = [];
|
|
49
|
+
for (const e of edits) {
|
|
50
|
+
lines.push(...stripTrailingNewline(e.oldString).split("\n").map((l) => `- ${l}`));
|
|
51
|
+
lines.push(...stripTrailingNewline(e.newString).split("\n").map((l) => `+ ${l}`));
|
|
52
|
+
}
|
|
53
|
+
return capLines(lines, 30);
|
|
54
|
+
}
|
|
55
|
+
/** A preview of a newly created file — all additions. */
|
|
56
|
+
export function writeDetail(content) {
|
|
57
|
+
if (content === "")
|
|
58
|
+
return "";
|
|
59
|
+
return capLines(stripTrailingNewline(content).split("\n").map((l) => `+ ${l}`), 20);
|
|
60
|
+
}
|
|
61
|
+
const ESC = String.fromCharCode(27);
|
|
62
|
+
// SGR colour codes, plus the cursor/erase sequences a progress-printing command emits.
|
|
63
|
+
const ANSI_RE = new RegExp(`${ESC}\\[[0-9;?]*[a-zA-Z]|${ESC}\\][^${ESC}\\u0007]*(?:\\u0007|${ESC}\\\\)`, "g");
|
|
64
|
+
/**
|
|
65
|
+
* Strip ANSI escapes from captured text.
|
|
66
|
+
*
|
|
67
|
+
* A command's output is captured from a pipe, and plenty of programs colour their
|
|
68
|
+
* output anyway. Those bytes are meaningless in a display block that applies its own
|
|
69
|
+
* colour, and they corrupt width measurement — an escape sequence counts as visible
|
|
70
|
+
* characters when wrapping, so a coloured line wraps early and the block goes ragged.
|
|
71
|
+
*/
|
|
72
|
+
export function stripAnsi(s) {
|
|
73
|
+
return s.replace(ANSI_RE, "");
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Blank-line noise from a command's own formatting, collapsed.
|
|
77
|
+
*
|
|
78
|
+
* PowerShell's table output leads with a blank line, separates directory groups with
|
|
79
|
+
* two, and trails one. Reproduced verbatim in a display block those blanks are most of
|
|
80
|
+
* the block's height and carry nothing. Runs collapse to a single blank (which still
|
|
81
|
+
* separates the groups) and the leading/trailing ones go.
|
|
82
|
+
*/
|
|
83
|
+
export function collapseBlanks(lines) {
|
|
84
|
+
const out = [];
|
|
85
|
+
for (const line of lines) {
|
|
86
|
+
if (line.trim() === "" && (out.length === 0 || out[out.length - 1].trim() === ""))
|
|
87
|
+
continue;
|
|
88
|
+
out.push(line);
|
|
89
|
+
}
|
|
90
|
+
while (out.length > 0 && out[out.length - 1].trim() === "")
|
|
91
|
+
out.pop();
|
|
92
|
+
return out;
|
|
93
|
+
}
|
|
94
|
+
/** A command's output for inline display (plain lines, no diff prefixes). */
|
|
95
|
+
export function outputDetail(body) {
|
|
96
|
+
if (!body)
|
|
97
|
+
return "";
|
|
98
|
+
return capLines(collapseBlanks(stripAnsi(body).split("\n")), 18);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* A command's output with its outcome as the last line (pure).
|
|
102
|
+
*
|
|
103
|
+
* ✓ Exit code 0
|
|
104
|
+
* ✖ Exit code 1
|
|
105
|
+
* ✖ Timed out after 30s — killed
|
|
106
|
+
* ✖ Terminated by SIGTERM
|
|
107
|
+
*
|
|
108
|
+
* Shown for a SUCCESS too, not only a failure. A row that says nothing when a command
|
|
109
|
+
* passed and something when it failed makes the absence of a line the signal, and an
|
|
110
|
+
* absence is easy to read past — especially under a wall of build output. The reference
|
|
111
|
+
* design puts the exit code on every command for the same reason.
|
|
112
|
+
*
|
|
113
|
+
* `exitCode` is null when a process was ended by a signal and never reported one; that
|
|
114
|
+
* case is named by the signal instead, because reporting it as "exit 0" made a killed
|
|
115
|
+
* command read as a command that worked.
|
|
116
|
+
*/
|
|
117
|
+
export function withOutcome(body, timedOut, exitCode, signal, timeoutMs, pid) {
|
|
118
|
+
const line = timedOut
|
|
119
|
+
? `✖ Timed out after ${Math.round(timeoutMs / 1000)}s — killed`
|
|
120
|
+
: signal
|
|
121
|
+
? `✖ Terminated by ${signal}`
|
|
122
|
+
: exitCode === null
|
|
123
|
+
? "✖ Ended without an exit code"
|
|
124
|
+
: `${exitCode === 0 ? "✓" : "✖"} Exit code ${exitCode}`;
|
|
125
|
+
// Which process was killed, and by what. Only when something WAS killed: on an
|
|
126
|
+
// ordinary exit the pid is trivia, but after a timeout it is the thing the user needs
|
|
127
|
+
// in order to check whether it actually died or is still holding a port.
|
|
128
|
+
const killed = timedOut || signal !== null;
|
|
129
|
+
const detail = killed && pid !== undefined ? `\n Signal: ${signal ?? "SIGTERM"} sent to process (PID ${pid})` : "";
|
|
130
|
+
return (body ? `${body}\n${line}` : line) + detail;
|
|
131
|
+
}
|
|
132
|
+
function stripTrailingNewline(s) {
|
|
133
|
+
return s.endsWith("\n") ? s.slice(0, -1) : s;
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=detail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detail.js","sourceRoot":"","sources":["../../src/tools/detail.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* diagnostics.ts — surface compiler/linter errors from the language servers.
|
|
3
|
+
*
|
|
4
|
+
* Mindweave already runs language servers (for def/ref); this reads their *diagnostics*
|
|
5
|
+
* — the type errors, syntax errors, and warnings they publish — so the model can
|
|
6
|
+
* check what it just wrote and fix it, instead of editing blind. Rather than running
|
|
7
|
+
* diagnostics automatically after every edit, here it's an explicit tool the model calls
|
|
8
|
+
* after changing code, plus prompt guidance to do so.
|
|
9
|
+
*
|
|
10
|
+
* Read-only: it only reads what the servers report. Degrade-safe: no server for the
|
|
11
|
+
* language (or none reported) → a clean "no diagnostics" result.
|
|
12
|
+
*/
|
|
13
|
+
import { promises as fs } from "node:fs";
|
|
14
|
+
import { chassisForPath } from "./chassisMux.js";
|
|
15
|
+
import { relativize, resolvePath } from "./paths.js";
|
|
16
|
+
import { selectActiveFiles } from "../memory/workingSet.js";
|
|
17
|
+
/** When no path is given, check this many of the most-recently-touched files.
|
|
18
|
+
* Exported so the number quoted in the description is pinned to the real value. */
|
|
19
|
+
export const MAX_WORKING_SET = 3;
|
|
20
|
+
const MAX_SHOWN = 50;
|
|
21
|
+
/** Full caret context is built for at most this many diagnostics (errors first) —
|
|
22
|
+
* reading source lines and drawing a caret for all 50 shown would bury the ones
|
|
23
|
+
* that matter under a wall of low-value warnings. */
|
|
24
|
+
const MAX_CARETS = 5;
|
|
25
|
+
export const diagnosticsTool = {
|
|
26
|
+
name: "diagnostics",
|
|
27
|
+
readOnly: true,
|
|
28
|
+
// Written against the failure this tool is supposed to PREVENT: the model edits,
|
|
29
|
+
// asks for diagnostics, is told "no diagnostics", and moves on with broken code.
|
|
30
|
+
// Three things made that possible and none of them were in the text — the check is
|
|
31
|
+
// per-file so a broken CALLER is never seen, a clean answer is not proof (no server,
|
|
32
|
+
// a slow server, and an unreadable path all render identically), and the no-path
|
|
33
|
+
// form only reaches a few files.
|
|
34
|
+
description: "Report compiler and linter diagnostics (type errors, syntax errors, warnings) for " +
|
|
35
|
+
"a file, from its language server. It re-syncs the file from disk first, so it " +
|
|
36
|
+
"reflects what you actually just wrote, not a stale copy. Call it after editing " +
|
|
37
|
+
"code, and fix what it reports before moving on.\n" +
|
|
38
|
+
"SCOPE: it checks the FILES YOU NAME and nothing else. Diagnostics are per-file, " +
|
|
39
|
+
`so if you omit path it checks only the ${MAX_WORKING_SET} files you touched most ` +
|
|
40
|
+
"recently. A change that breaks code elsewhere — you renamed a symbol, changed a " +
|
|
41
|
+
"signature, altered an exported type — will NOT show up here, because the broken " +
|
|
42
|
+
"file is the CALLER. After that kind of edit, find the callers with `references` " +
|
|
43
|
+
"and check those paths too.\n" +
|
|
44
|
+
"A clean result is weaker evidence than it looks: you also get \"no diagnostics\" " +
|
|
45
|
+
"when no language server handles that file type, when the server is too slow to " +
|
|
46
|
+
"answer, and when the path does not exist or cannot be read. So it confirms " +
|
|
47
|
+
"problems, it does not prove their absence. Treat a clean answer on code you " +
|
|
48
|
+
"expected to be broken as a reason to check the path and verify another way " +
|
|
49
|
+
"(build it, run the tests) rather than as a passing grade.",
|
|
50
|
+
parameters: {
|
|
51
|
+
type: "object",
|
|
52
|
+
additionalProperties: false,
|
|
53
|
+
properties: {
|
|
54
|
+
path: {
|
|
55
|
+
type: "string",
|
|
56
|
+
description: "File to check. Omit to check the most recently read/edited files.",
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
async execute(args, ctx) {
|
|
61
|
+
const targets = pickTargets(ctx, typeof args.path === "string" ? args.path.trim() : "");
|
|
62
|
+
if (targets.length === 0) {
|
|
63
|
+
return { output: "No file to check — edit or read a file first, or pass a `path`.", summary: "no target" };
|
|
64
|
+
}
|
|
65
|
+
const results = await Promise.all(targets.map(async (abs) => {
|
|
66
|
+
const chassis = chassisForPath(ctx, abs);
|
|
67
|
+
const diags = chassis ? await chassis.diagnostics(abs) : [];
|
|
68
|
+
return { abs, diags };
|
|
69
|
+
}));
|
|
70
|
+
const all = [];
|
|
71
|
+
for (const r of results)
|
|
72
|
+
all.push(...r.diags);
|
|
73
|
+
if (all.length === 0) {
|
|
74
|
+
const label = targets.map((t) => relativize(ctx, t)).join(", ");
|
|
75
|
+
// Silent when it finds nothing. A model runs this in a burst right after editing,
|
|
76
|
+
// and a row per file saying "no diagnostics" is a wall of rows reporting the
|
|
77
|
+
// absence of news. The model still gets the answer; the user gets the screen back.
|
|
78
|
+
return { output: `No diagnostics for ${label}.`, summary: "no diagnostics", quiet: true };
|
|
79
|
+
}
|
|
80
|
+
const output = formatDiagnostics(all.map((d) => ({ ...d, file: relativize(ctx, d.file) })));
|
|
81
|
+
const errors = all.filter((d) => d.severity === "error").length;
|
|
82
|
+
const warnings = all.filter((d) => d.severity === "warning").length;
|
|
83
|
+
return {
|
|
84
|
+
output,
|
|
85
|
+
summary: `${errors} error${errors === 1 ? "" : "s"}, ${warnings} warning${warnings === 1 ? "" : "s"}`,
|
|
86
|
+
detail: await buildCaretDetail(all, ctx),
|
|
87
|
+
// Named for what it IS. "Check(app.ts)" reads as a routine step that happened to
|
|
88
|
+
// return something; the caret block under it is a compiler error, and the header
|
|
89
|
+
// should say so before the user has read a single line of it.
|
|
90
|
+
displayName: errors > 0 ? "Build Error" : "Check",
|
|
91
|
+
};
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* The UI-only compiler-caret block — never sent to the model (`formatDiagnostics`'s
|
|
96
|
+
* flat text is what the model sees). Reads each diagnostic's own source line fresh
|
|
97
|
+
* from disk (never sent, so a fetch failure just drops that one caret rather than
|
|
98
|
+
* failing the tool) and draws a `~~~~~~~~` under the exact failing token when the
|
|
99
|
+
* server gave us an end column (see CodeDiagnostic.endColumn).
|
|
100
|
+
*/
|
|
101
|
+
async function buildCaretDetail(all, ctx) {
|
|
102
|
+
const rank = { error: 0, warning: 1, info: 2, hint: 3 };
|
|
103
|
+
const sorted = [...all].sort((a, b) => rank[a.severity] - rank[b.severity]);
|
|
104
|
+
const shown = sorted.slice(0, MAX_CARETS);
|
|
105
|
+
const blocks = await Promise.all(shown.map((d) => caretBlock(d, ctx)));
|
|
106
|
+
const parts = blocks.filter((b) => b !== null);
|
|
107
|
+
const hidden = sorted.length - shown.length;
|
|
108
|
+
if (hidden > 0)
|
|
109
|
+
parts.push(`(+${hidden} more — see the full list above)`);
|
|
110
|
+
return parts.join("\n\n");
|
|
111
|
+
}
|
|
112
|
+
/** One diagnostic's caret block, or null if its source line couldn't be read. */
|
|
113
|
+
async function caretBlock(d, ctx) {
|
|
114
|
+
const lines = await readLines(d.file);
|
|
115
|
+
if (!lines)
|
|
116
|
+
return null;
|
|
117
|
+
const line = lines[d.line - 1];
|
|
118
|
+
if (line == null)
|
|
119
|
+
return null;
|
|
120
|
+
const rel = relativize(ctx, d.file);
|
|
121
|
+
const lineLabel = `${d.line}: `;
|
|
122
|
+
const out = [`${rel}:${d.line}:${d.column}`];
|
|
123
|
+
const prev = lines[d.line - 2];
|
|
124
|
+
if (prev != null)
|
|
125
|
+
out.push(`│ ${String(d.line - 1).padStart(lineLabel.length - 2)}: ${prev}`);
|
|
126
|
+
out.push(`│ ${lineLabel}${line}`);
|
|
127
|
+
out.push(caretLine(d, lineLabel.length));
|
|
128
|
+
const codeLabel = d.source ? `${d.source}: ` : "";
|
|
129
|
+
out.push(`⎿ ${codeLabel}${d.message}`); // same branch glyph ToolLine/SubagentView use, not the mockup's literal "└─"
|
|
130
|
+
return out.join("\n");
|
|
131
|
+
}
|
|
132
|
+
/** The `~~~~~~~~` (or `^` when no end column is known) aligned under the failing
|
|
133
|
+
* token, indented to match the `│ N: ` gutter the source line itself sits under. */
|
|
134
|
+
function caretLine(d, gutterWidth) {
|
|
135
|
+
const indent = " ".repeat(2 + gutterWidth + Math.max(0, d.column - 1));
|
|
136
|
+
const width = d.endColumn != null ? Math.max(1, d.endColumn - d.column) : 1;
|
|
137
|
+
return indent + (d.endColumn != null ? "~".repeat(width) : "^");
|
|
138
|
+
}
|
|
139
|
+
/** The file's lines, or null if it can't be read — a caret is a nice-to-have, not
|
|
140
|
+
* worth failing the whole diagnostics call over. */
|
|
141
|
+
async function readLines(absPath) {
|
|
142
|
+
try {
|
|
143
|
+
return (await fs.readFile(absPath, "utf8")).split("\n");
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* The absolute paths to check: the given path, else the most recently touched files.
|
|
151
|
+
*
|
|
152
|
+
* This used to read `reads.keys()` in Map order, which is INSERTION order — and
|
|
153
|
+
* `reads.set()` on a key that already exists does not move it. So a file read early
|
|
154
|
+
* and edited last kept its original position and fell outside the window, and the tool
|
|
155
|
+
* answered "No diagnostics" for files it had never looked at while the file just
|
|
156
|
+
* edited was broken. `touchedAt` is the recency stamp that survives a re-touch, and
|
|
157
|
+
* `selectActiveFiles` is the same ordering the working set already uses.
|
|
158
|
+
*/
|
|
159
|
+
function pickTargets(ctx, rawPath) {
|
|
160
|
+
if (rawPath)
|
|
161
|
+
return [resolvePath(ctx, rawPath)];
|
|
162
|
+
return selectActiveFiles(ctx.reads, MAX_WORKING_SET).map((f) => f.path);
|
|
163
|
+
}
|
|
164
|
+
/** Render diagnostics as `file:line:col severity: message`, errors first. Pure. */
|
|
165
|
+
export function formatDiagnostics(diags) {
|
|
166
|
+
const rank = { error: 0, warning: 1, info: 2, hint: 3 };
|
|
167
|
+
const sorted = [...diags].sort((a, b) => rank[a.severity] - rank[b.severity] || a.file.localeCompare(b.file) || a.line - b.line);
|
|
168
|
+
const shown = sorted.slice(0, MAX_SHOWN);
|
|
169
|
+
const lines = shown.map((d) => `${d.file}:${d.line}:${d.column} ${d.severity}: ${d.message}${d.source ? ` (${d.source})` : ""}`);
|
|
170
|
+
if (sorted.length > shown.length)
|
|
171
|
+
lines.push(`… (${sorted.length - shown.length} more)`);
|
|
172
|
+
return lines.join("\n");
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/tools/diagnostics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { recordWrite, relativize } from "./paths.js";
|
|
2
|
+
import { applyEol } from "./eol.js";
|
|
3
|
+
import { multiEditDetail, lineCount, magnitude, rangeLabel, withScope } from "./detail.js";
|
|
4
|
+
import { applyEditSequence } from "./editCore.js";
|
|
5
|
+
import { numberedWindow, charToLine } from "./editWindow.js";
|
|
6
|
+
import { prepareEditTarget, unreadError, fail, failQuietly, errText } from "./editTarget.js";
|
|
7
|
+
import { writeFileAtomic } from "./atomicWrite.js";
|
|
8
|
+
export const edit = {
|
|
9
|
+
name: "edit",
|
|
10
|
+
readOnly: false,
|
|
11
|
+
// Two things this description has to do at once: make the single-edit case feel as
|
|
12
|
+
// light as it is (one entry, no ceremony), and make batching the OBVIOUS move for a
|
|
13
|
+
// file needing several changes, since one call beats three round trips. The matcher's
|
|
14
|
+
// leniency is stated because a model told it needs exact bytes re-reads whole files
|
|
15
|
+
// to get them; what the matcher does NOT forgive is stated just as plainly, because a
|
|
16
|
+
// matcher that sounds infinitely lenient invites the sloppy input that makes a
|
|
17
|
+
// wrong-place edit possible. See editCore.ts.
|
|
18
|
+
description: "Change an existing file by replacing strings in it. This is the DEFAULT way to modify " +
|
|
19
|
+
"a file — prefer it over rewriting one with write_file. Read the file first. " +
|
|
20
|
+
"Pass `edits`: one entry for a single change, or several entries to change one file in " +
|
|
21
|
+
"several places in a single call (an import at the top, a call site in the middle, a " +
|
|
22
|
+
"helper further down). Batching is strongly preferred over repeated calls to this tool " +
|
|
23
|
+
"on the same file. Edits apply in order and each sees the result of the previous ones, " +
|
|
24
|
+
"so you can add a symbol and then edit around it. " +
|
|
25
|
+
"Each `old_string` must identify exactly ONE place, and is matched on content rather " +
|
|
26
|
+
"than formatting: if an exact match is not found, each line is compared with leading " +
|
|
27
|
+
"and trailing whitespace ignored, and line endings are normalized on both sides. So you " +
|
|
28
|
+
"do not need to reproduce a file's exact indentation, and a CRLF file is not a problem. " +
|
|
29
|
+
"What is never forgiven is a skipped, reordered, or extra line. " +
|
|
30
|
+
"If an `old_string` matches SEVERAL places the file is left untouched and you get the " +
|
|
31
|
+
"candidate locations back with surrounding context: pick one and include enough nearby " +
|
|
32
|
+
"lines to make it unique, or set `replace_all` to change every occurrence. " +
|
|
33
|
+
"ONE FILE PER CALL — make a separate call for each file you need to change. " +
|
|
34
|
+
"All-or-nothing: if any edit doesn't match, the file is left completely untouched.",
|
|
35
|
+
parameters: {
|
|
36
|
+
type: "object",
|
|
37
|
+
additionalProperties: false,
|
|
38
|
+
required: ["path", "edits"],
|
|
39
|
+
properties: {
|
|
40
|
+
path: {
|
|
41
|
+
type: "string",
|
|
42
|
+
description: "The one file every edit in this call applies to, absolute or relative to the working directory.",
|
|
43
|
+
},
|
|
44
|
+
edits: {
|
|
45
|
+
type: "array",
|
|
46
|
+
minItems: 1,
|
|
47
|
+
description: "The replacements to apply to that file, in order. A single change is an array of one.",
|
|
48
|
+
items: {
|
|
49
|
+
type: "object",
|
|
50
|
+
additionalProperties: false,
|
|
51
|
+
required: ["old_string", "new_string"],
|
|
52
|
+
properties: {
|
|
53
|
+
old_string: {
|
|
54
|
+
type: "string",
|
|
55
|
+
description: "The text to replace. Include enough surrounding lines to make it unique.",
|
|
56
|
+
},
|
|
57
|
+
new_string: {
|
|
58
|
+
type: "string",
|
|
59
|
+
description: "The replacement text. Use an empty string to delete old_string.",
|
|
60
|
+
},
|
|
61
|
+
replace_all: {
|
|
62
|
+
type: "boolean",
|
|
63
|
+
description: "Replace every occurrence instead of requiring a unique match. Use it when the same change applies " +
|
|
64
|
+
"to all of them — e.g. deleting a duplicated helper that appears twice in this file. Default false.",
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
async execute(args, ctx) {
|
|
72
|
+
const rawPath = typeof args.path === "string" ? args.path.trim() : "";
|
|
73
|
+
if (!rawPath)
|
|
74
|
+
return failQuietly("`path` is required — it names the one file this call edits.");
|
|
75
|
+
if (!Array.isArray(args.edits) || args.edits.length === 0) {
|
|
76
|
+
return failQuietly("`edits` is required and must be a non-empty array of {old_string, new_string} edits.");
|
|
77
|
+
}
|
|
78
|
+
// Validate and normalize each edit up front, so a bad shape is reported before we
|
|
79
|
+
// touch the file.
|
|
80
|
+
const ops = [];
|
|
81
|
+
for (let i = 0; i < args.edits.length; i++) {
|
|
82
|
+
const e = args.edits[i];
|
|
83
|
+
if (!e || typeof e !== "object")
|
|
84
|
+
return failQuietly(`edit #${i + 1} is not an object.`);
|
|
85
|
+
// A per-edit path is refused rather than ignored. Silently dropping it would apply
|
|
86
|
+
// the edit to the WRONG file — the top-level one — which is the worst outcome
|
|
87
|
+
// available here, so say what to do instead.
|
|
88
|
+
if (typeof e.path === "string" && e.path.trim() && e.path.trim() !== rawPath) {
|
|
89
|
+
return failQuietly(`edit #${i + 1} names a different file (${e.path.trim()}). One edit call changes one file: ` +
|
|
90
|
+
`make a separate call for each file you need to change.`);
|
|
91
|
+
}
|
|
92
|
+
if (typeof e.old_string !== "string" || e.old_string === "") {
|
|
93
|
+
return failQuietly(`edit #${i + 1}: \`old_string\` is required and must not be empty.`);
|
|
94
|
+
}
|
|
95
|
+
if (typeof e.new_string !== "string") {
|
|
96
|
+
return failQuietly(`edit #${i + 1}: \`new_string\` is required (use an empty string to delete).`);
|
|
97
|
+
}
|
|
98
|
+
if (e.old_string === e.new_string) {
|
|
99
|
+
return failQuietly(`edit #${i + 1}: \`old_string\` and \`new_string\` are identical — nothing to change.`);
|
|
100
|
+
}
|
|
101
|
+
ops.push({ oldString: e.old_string, newString: e.new_string, replaceAll: e.replace_all === true });
|
|
102
|
+
}
|
|
103
|
+
const target = await prepareEditTarget(ctx, rawPath, "editing");
|
|
104
|
+
if (!target.ok)
|
|
105
|
+
return target.error;
|
|
106
|
+
const { filePath, content, eol } = target;
|
|
107
|
+
// Apply the whole sequence to an in-memory copy. Atomic: a failure names the
|
|
108
|
+
// offending edit and writes nothing. A one-entry sequence is exactly a single
|
|
109
|
+
// replacement, so the single-edit case shares this path rather than forking it.
|
|
110
|
+
const seq = applyEditSequence(content, ops);
|
|
111
|
+
// A file that was never read has to EARN the edit by matching exactly. It just
|
|
112
|
+
// failed to, so this is the case the read-before-edit gate exists for — and the
|
|
113
|
+
// read now happens because it is genuinely needed, not on the off chance.
|
|
114
|
+
if (!seq.ok && target.unread)
|
|
115
|
+
return unreadError(rawPath);
|
|
116
|
+
if (!seq.ok) {
|
|
117
|
+
// The reason may already end in a sentence (the ambiguity report does), so don't
|
|
118
|
+
// staple a second full stop onto it.
|
|
119
|
+
const reason = /[.!?]$/.test(seq.reason) ? seq.reason : `${seq.reason}.`;
|
|
120
|
+
// Quiet: the model has the reason and the candidate locations and fixes its own
|
|
121
|
+
// aim. Nothing reached disk, so there is nothing for the user to act on.
|
|
122
|
+
const which = ops.length === 1 ? "the edit" : `edit #${seq.index + 1}`;
|
|
123
|
+
return failQuietly(`${which} could not be applied to ${rawPath}: ${reason} No changes were written.`);
|
|
124
|
+
}
|
|
125
|
+
const updated = applyEol(seq.updated, eol);
|
|
126
|
+
// Snapshot the pre-edit bytes for /undo before touching disk.
|
|
127
|
+
ctx.checkpoints?.backup(filePath, content, updated);
|
|
128
|
+
try {
|
|
129
|
+
await writeFileAtomic(filePath, updated);
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
return fail(`could not write ${rawPath}: ${errText(error)}`);
|
|
133
|
+
}
|
|
134
|
+
const startLine = charToLine(seq.updated, seq.spanStart) + 1;
|
|
135
|
+
const endLine = charToLine(seq.updated, seq.spanEnd) + 1;
|
|
136
|
+
// Record the edited region as this file's focus, so a large file localizes to it
|
|
137
|
+
// in the working set instead of being carried whole.
|
|
138
|
+
await recordWrite(ctx, filePath, { start: startLine, end: endLine });
|
|
139
|
+
const shown = relativize(ctx, filePath);
|
|
140
|
+
const nEdits = ops.length;
|
|
141
|
+
// One numbered window spanning from the first change to the last, so the model can
|
|
142
|
+
// keep working from the result without re-reading the file.
|
|
143
|
+
const window = numberedWindow(seq.updated, seq.spanStart, seq.spanEnd);
|
|
144
|
+
let removed = 0;
|
|
145
|
+
let added = 0;
|
|
146
|
+
for (const op of ops) {
|
|
147
|
+
removed += lineCount(op.oldString);
|
|
148
|
+
added += lineCount(op.newString);
|
|
149
|
+
}
|
|
150
|
+
// Scope reads as the change actually was: "L120-124 · −2 +5" for one edit, and
|
|
151
|
+
// "3 edits · L120-420 · −18 +40" when several were batched. Leading with an edit
|
|
152
|
+
// count on a single edit would be noise.
|
|
153
|
+
const magnitudes = `${rangeLabel(startLine, endLine)} · ${magnitude(removed, added)}`;
|
|
154
|
+
const scope = nEdits === 1 ? magnitudes : `${nEdits} edits · ${magnitudes}`;
|
|
155
|
+
const headline = nEdits === 1
|
|
156
|
+
? `Edited ${shown}.`
|
|
157
|
+
: `Edited ${shown}: ${nEdits} edits, ${seq.total} replacement${seq.total === 1 ? "" : "s"} total.`;
|
|
158
|
+
return {
|
|
159
|
+
output: `${headline}\n` +
|
|
160
|
+
`Changed region — line-numbered so you can make further edits without re-reading:\n${window}`,
|
|
161
|
+
summary: `edited ${shown} · ${scope}`,
|
|
162
|
+
detail: withScope(scope, multiEditDetail(ops)),
|
|
163
|
+
detailKind: "diff",
|
|
164
|
+
};
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
//# sourceMappingURL=edit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"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"}
|