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,425 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* context.ts — the project orientation snapshot.
|
|
3
|
+
*
|
|
4
|
+
* Without this, Mindweave starts BLIND: the system prompt tells it nothing about the
|
|
5
|
+
* project it's sitting in — not the working directory, the OS, whether it's a git
|
|
6
|
+
* repo, what kind of project it is, or its shape. It would burn a list→read→read
|
|
7
|
+
* just to answer "what is this?". The fix is to gather a small, budgeted snapshot
|
|
8
|
+
* ONCE at session start:
|
|
9
|
+
*
|
|
10
|
+
* - an <environment> block (cwd, is-git-repo, platform, OS, date) plus a git-status
|
|
11
|
+
* snapshot (branch, `status --short`, recent commits), so the first turn is oriented.
|
|
12
|
+
* - a budgeted project snapshot (name, a capped file tree, key manifests) so the
|
|
13
|
+
* FIRST answer is already informed.
|
|
14
|
+
*
|
|
15
|
+
* This module gathers both ONCE at session start — a
|
|
16
|
+
* snapshot in time, not a live view (it does not update as the conversation runs;
|
|
17
|
+
* the model uses tools for anything current or deeper). It is fully
|
|
18
|
+
* deterministic: no model calls, no tokens to build. The heavy structural map is
|
|
19
|
+
* the chassis (alternator); this is the shallow, always-on orientation layer that
|
|
20
|
+
* sits above it.
|
|
21
|
+
*
|
|
22
|
+
* Pure facts, no instructions: deciding what to DO with the project is the model's
|
|
23
|
+
* job. We only hand it the lay of the land.
|
|
24
|
+
*/
|
|
25
|
+
import { spawn } from "node:child_process";
|
|
26
|
+
import { promises as fs } from "node:fs";
|
|
27
|
+
import { release } from "node:os";
|
|
28
|
+
import { join, basename } from "node:path";
|
|
29
|
+
import { DEFAULT_IGNORES } from "../tools/walk.js";
|
|
30
|
+
import { commandShellLabel } from "../tools/runCommand.js";
|
|
31
|
+
// ── budgets (tunable, model-agnostic) ────────────────────────────────────────
|
|
32
|
+
const TREE_MAX_DEPTH = envInt("MINDWEAVE_CONTEXT_TREE_DEPTH", 3);
|
|
33
|
+
const TREE_MAX_LINES = envInt("MINDWEAVE_CONTEXT_TREE_LINES", 120);
|
|
34
|
+
const TREE_MAX_FILES = envInt("MINDWEAVE_CONTEXT_TREE_FILES", 60);
|
|
35
|
+
const GIT_STATUS_MAX_CHARS = 2_000;
|
|
36
|
+
const GIT_LOG_COUNT = 5;
|
|
37
|
+
const README_MAX_CHARS = 800;
|
|
38
|
+
const GIT_TIMEOUT_MS = 2_500;
|
|
39
|
+
// Docs & notes: the curated, high-signal list of planning/notes docs (roadmaps,
|
|
40
|
+
// feature plans, design notes). Surfaced so the model always KNOWS these exist and
|
|
41
|
+
// what they are, without having to "remember" them across sessions or dig them out of
|
|
42
|
+
// the raw file tree.
|
|
43
|
+
const DOCS_MAX_COUNT = 15;
|
|
44
|
+
const DOC_DESC_MAX_CHARS = 100;
|
|
45
|
+
const DOC_READ_BYTES = 1_024;
|
|
46
|
+
// ── collection ───────────────────────────────────────────────────────────────
|
|
47
|
+
/**
|
|
48
|
+
* Gather the snapshot for `cwd`. Best-effort throughout: any piece that fails or
|
|
49
|
+
* is absent is simply omitted, so this never throws and never blocks startup for
|
|
50
|
+
* long (git is time-boxed).
|
|
51
|
+
*/
|
|
52
|
+
export async function collectProjectContext(cwd) {
|
|
53
|
+
const [git, signals, tree, readme, docs] = await Promise.all([
|
|
54
|
+
collectGit(cwd),
|
|
55
|
+
collectSignals(cwd),
|
|
56
|
+
collectTree(cwd),
|
|
57
|
+
collectReadme(cwd),
|
|
58
|
+
collectDocs(cwd),
|
|
59
|
+
]);
|
|
60
|
+
return { environment: collectEnvironment(cwd), git, signals, tree, readme, docs };
|
|
61
|
+
}
|
|
62
|
+
function collectEnvironment(cwd) {
|
|
63
|
+
return {
|
|
64
|
+
cwd,
|
|
65
|
+
platform: process.platform,
|
|
66
|
+
osVersion: release(),
|
|
67
|
+
shell: commandShellLabel(),
|
|
68
|
+
runtime: `Node ${process.version}`,
|
|
69
|
+
date: localDate(),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
async function collectGit(cwd) {
|
|
73
|
+
const inside = (await runGit(["rev-parse", "--is-inside-work-tree"], cwd))?.trim();
|
|
74
|
+
if (inside !== "true")
|
|
75
|
+
return null;
|
|
76
|
+
const [branchRaw, statusRaw, logRaw] = await Promise.all([
|
|
77
|
+
runGit(["rev-parse", "--abbrev-ref", "HEAD"], cwd),
|
|
78
|
+
runGit(["--no-optional-locks", "status", "--short"], cwd),
|
|
79
|
+
runGit(["--no-optional-locks", "log", "--oneline", "-n", String(GIT_LOG_COUNT)], cwd),
|
|
80
|
+
]);
|
|
81
|
+
const branch = branchRaw?.trim() || "(detached)";
|
|
82
|
+
let status = (statusRaw ?? "").trim();
|
|
83
|
+
if (status.length > GIT_STATUS_MAX_CHARS) {
|
|
84
|
+
status = status.slice(0, GIT_STATUS_MAX_CHARS) + "\n… (truncated; run `git status` for the rest)";
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
branch,
|
|
88
|
+
status: status || "(clean)",
|
|
89
|
+
recentCommits: (logRaw ?? "").trim(),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/** Manifest → the labels and metadata it implies. */
|
|
93
|
+
async function collectSignals(cwd) {
|
|
94
|
+
const kinds = new Set();
|
|
95
|
+
const manifests = [];
|
|
96
|
+
const scripts = [];
|
|
97
|
+
let name;
|
|
98
|
+
const has = async (f) => {
|
|
99
|
+
try {
|
|
100
|
+
await fs.access(join(cwd, f));
|
|
101
|
+
manifests.push(f);
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
if (await has("package.json")) {
|
|
109
|
+
const pkg = await readJson(join(cwd, "package.json"));
|
|
110
|
+
if (pkg) {
|
|
111
|
+
if (typeof pkg.name === "string")
|
|
112
|
+
name = pkg.name;
|
|
113
|
+
if (pkg.scripts && typeof pkg.scripts === "object") {
|
|
114
|
+
scripts.push(...Object.keys(pkg.scripts));
|
|
115
|
+
}
|
|
116
|
+
const ts = !!(pkg.devDependencies?.typescript || pkg.dependencies?.typescript);
|
|
117
|
+
kinds.add(ts ? "Node/TypeScript" : "Node/JavaScript");
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
kinds.add("Node");
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// tsconfig confirms TypeScript, but don't double up if package.json already said so.
|
|
124
|
+
if ((await has("tsconfig.json")) && !kinds.has("Node/TypeScript"))
|
|
125
|
+
kinds.add("TypeScript");
|
|
126
|
+
if (await has("pyproject.toml")) {
|
|
127
|
+
kinds.add("Python");
|
|
128
|
+
name ??= await tomlName(join(cwd, "pyproject.toml"));
|
|
129
|
+
}
|
|
130
|
+
if (await has("requirements.txt"))
|
|
131
|
+
kinds.add("Python");
|
|
132
|
+
if (await has("Cargo.toml")) {
|
|
133
|
+
kinds.add("Rust");
|
|
134
|
+
name ??= await tomlName(join(cwd, "Cargo.toml"));
|
|
135
|
+
}
|
|
136
|
+
if (await has("go.mod"))
|
|
137
|
+
kinds.add("Go");
|
|
138
|
+
if (await has("pom.xml"))
|
|
139
|
+
kinds.add("Java/Maven");
|
|
140
|
+
if (await has("build.gradle") || (await has("build.gradle.kts")))
|
|
141
|
+
kinds.add("Java/Gradle");
|
|
142
|
+
if (await has("Gemfile"))
|
|
143
|
+
kinds.add("Ruby");
|
|
144
|
+
if (await has("composer.json"))
|
|
145
|
+
kinds.add("PHP");
|
|
146
|
+
if (await has("CMakeLists.txt"))
|
|
147
|
+
kinds.add("C/C++");
|
|
148
|
+
return { name, kinds: [...kinds], scripts, manifests };
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* A budgeted, sorted, pre-order directory tree. Depth, total
|
|
152
|
+
* lines, and file count are all capped so a huge repo degrades to a partial tree
|
|
153
|
+
* instead of exploding the prompt. Skips DEFAULT_IGNORES and dotfiles/dirs.
|
|
154
|
+
*/
|
|
155
|
+
async function collectTree(cwd) {
|
|
156
|
+
const lines = [];
|
|
157
|
+
let fileCount = 0;
|
|
158
|
+
let truncated = false;
|
|
159
|
+
const recurse = async (absDir, depth) => {
|
|
160
|
+
if (truncated || depth > TREE_MAX_DEPTH)
|
|
161
|
+
return;
|
|
162
|
+
let entries;
|
|
163
|
+
try {
|
|
164
|
+
entries = await fs.readdir(absDir, { withFileTypes: true });
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const dirs = entries
|
|
170
|
+
.filter((e) => e.isDirectory() && !DEFAULT_IGNORES.has(e.name) && !e.name.startsWith("."))
|
|
171
|
+
.map((e) => e.name)
|
|
172
|
+
.sort();
|
|
173
|
+
const files = entries
|
|
174
|
+
.filter((e) => e.isFile() && !e.name.startsWith("."))
|
|
175
|
+
.map((e) => e.name)
|
|
176
|
+
.sort();
|
|
177
|
+
for (const f of files) {
|
|
178
|
+
if (lines.length >= TREE_MAX_LINES || fileCount >= TREE_MAX_FILES) {
|
|
179
|
+
truncated = true;
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
lines.push(" ".repeat(depth) + f);
|
|
183
|
+
fileCount += 1;
|
|
184
|
+
}
|
|
185
|
+
for (const d of dirs) {
|
|
186
|
+
if (lines.length >= TREE_MAX_LINES) {
|
|
187
|
+
truncated = true;
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
lines.push(" ".repeat(depth) + d + "/");
|
|
191
|
+
await recurse(join(absDir, d), depth + 1);
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
await recurse(cwd, 0);
|
|
195
|
+
return { lines, fileCount, truncated };
|
|
196
|
+
}
|
|
197
|
+
/** The opening of a README, if there is one — orients on intent the tree can't. */
|
|
198
|
+
async function collectReadme(cwd) {
|
|
199
|
+
for (const name of ["README.md", "README.rst", "README.txt", "README"]) {
|
|
200
|
+
try {
|
|
201
|
+
const raw = (await fs.readFile(join(cwd, name), "utf8")).trim();
|
|
202
|
+
if (!raw)
|
|
203
|
+
continue;
|
|
204
|
+
return raw.length > README_MAX_CHARS ? raw.slice(0, README_MAX_CHARS) + "\n… (truncated)" : raw;
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
/* try the next candidate */
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Find the project's planning/notes docs — feature plans, roadmaps, design notes,
|
|
214
|
+
* TODOs — anywhere within the walked tree, and read a one-line descriptor for each.
|
|
215
|
+
* This is the curated counterpart to the raw file tree: instead of one filename among
|
|
216
|
+
* dozens, the model gets "notez/feature-ideas.md — Feature ideas" and knows to reach
|
|
217
|
+
* for it. Deterministic and one-time, so nothing has to be "remembered" across
|
|
218
|
+
* sessions. Best-effort: unreadable files are skipped, never thrown.
|
|
219
|
+
*/
|
|
220
|
+
async function collectDocs(cwd) {
|
|
221
|
+
const found = [];
|
|
222
|
+
const recurse = async (absDir, rel, depth) => {
|
|
223
|
+
if (depth > TREE_MAX_DEPTH || found.length >= DOCS_MAX_COUNT * 4)
|
|
224
|
+
return;
|
|
225
|
+
let entries;
|
|
226
|
+
try {
|
|
227
|
+
entries = await fs.readdir(absDir, { withFileTypes: true });
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
for (const e of entries) {
|
|
233
|
+
if (e.name.startsWith("."))
|
|
234
|
+
continue;
|
|
235
|
+
if (e.isFile() && isNotableDoc(e.name)) {
|
|
236
|
+
found.push({ path: rel ? `${rel}/${e.name}` : e.name, depth });
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
for (const e of entries) {
|
|
240
|
+
if (e.isDirectory() && !DEFAULT_IGNORES.has(e.name) && !e.name.startsWith(".")) {
|
|
241
|
+
await recurse(join(absDir, e.name), rel ? `${rel}/${e.name}` : e.name, depth + 1);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
await recurse(cwd, "", 0);
|
|
246
|
+
// Shallowest first (root docs matter most), then alphabetical; then cap.
|
|
247
|
+
found.sort((a, b) => a.depth - b.depth || a.path.localeCompare(b.path));
|
|
248
|
+
const top = found.slice(0, DOCS_MAX_COUNT);
|
|
249
|
+
const docs = await Promise.all(top.map(async ({ path }) => ({ path, desc: await docDescriptor(join(cwd, path)) })));
|
|
250
|
+
return docs;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Whether a filename is a planning/notes doc worth surfacing. Markdown files qualify,
|
|
254
|
+
* as do a handful of conventional names (TODO, ROADMAP, …) whatever their extension.
|
|
255
|
+
* README (shown separately), MINDWEAVE.md (the memory file itself), and legal boilerplate
|
|
256
|
+
* are deliberately excluded.
|
|
257
|
+
*/
|
|
258
|
+
function isNotableDoc(name) {
|
|
259
|
+
const lower = name.toLowerCase();
|
|
260
|
+
if (lower.startsWith("readme") || lower === "mindweave.md")
|
|
261
|
+
return false;
|
|
262
|
+
if (/^(license|licence|copying|code_of_conduct|contributing|authors|notice)\b/.test(lower))
|
|
263
|
+
return false;
|
|
264
|
+
const dot = lower.lastIndexOf(".");
|
|
265
|
+
const ext = dot > 0 ? lower.slice(dot) : "";
|
|
266
|
+
const base = dot > 0 ? lower.slice(0, dot) : lower;
|
|
267
|
+
if (ext === ".md" || ext === ".mdx" || ext === ".markdown")
|
|
268
|
+
return true;
|
|
269
|
+
return ["todo", "roadmap", "changelog", "notes", "tasks", "plan", "plans", "ideas", "design"].includes(base);
|
|
270
|
+
}
|
|
271
|
+
/** A short descriptor for a doc: its first Markdown heading, else its first non-empty
|
|
272
|
+
* line (YAML frontmatter skipped). "" when the file is empty or unreadable. */
|
|
273
|
+
async function docDescriptor(absPath) {
|
|
274
|
+
let raw;
|
|
275
|
+
try {
|
|
276
|
+
const fh = await fs.open(absPath, "r");
|
|
277
|
+
try {
|
|
278
|
+
const buf = Buffer.alloc(DOC_READ_BYTES);
|
|
279
|
+
const { bytesRead } = await fh.read(buf, 0, DOC_READ_BYTES, 0);
|
|
280
|
+
raw = buf.toString("utf8", 0, bytesRead);
|
|
281
|
+
}
|
|
282
|
+
finally {
|
|
283
|
+
await fh.close();
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
catch {
|
|
287
|
+
return "";
|
|
288
|
+
}
|
|
289
|
+
const lines = raw.split(/\r?\n/);
|
|
290
|
+
let i = 0;
|
|
291
|
+
// Skip a leading YAML frontmatter block (--- … ---).
|
|
292
|
+
if (lines[0]?.trim() === "---") {
|
|
293
|
+
i = 1;
|
|
294
|
+
while (i < lines.length && lines[i]?.trim() !== "---")
|
|
295
|
+
i += 1;
|
|
296
|
+
i += 1;
|
|
297
|
+
}
|
|
298
|
+
for (; i < lines.length; i += 1) {
|
|
299
|
+
const line = (lines[i] ?? "").trim();
|
|
300
|
+
if (!line)
|
|
301
|
+
continue;
|
|
302
|
+
const text = line.replace(/^#+\s*/, "").trim(); // strip Markdown heading marks
|
|
303
|
+
if (!text)
|
|
304
|
+
continue;
|
|
305
|
+
return text.length > DOC_DESC_MAX_CHARS ? text.slice(0, DOC_DESC_MAX_CHARS) + "…" : text;
|
|
306
|
+
}
|
|
307
|
+
return "";
|
|
308
|
+
}
|
|
309
|
+
// ── rendering ────────────────────────────────────────────────────────────────
|
|
310
|
+
/**
|
|
311
|
+
* Render the snapshot into the text injected into the system prompt, or "" if
|
|
312
|
+
* there is genuinely nothing to say. Two tagged blocks: <environment> (the env block)
|
|
313
|
+
* and <project_overview> (signals + tree + README + git status).
|
|
314
|
+
*/
|
|
315
|
+
export function renderProjectContext(pc) {
|
|
316
|
+
const env = pc.environment;
|
|
317
|
+
const out = [];
|
|
318
|
+
out.push("<environment>\n" +
|
|
319
|
+
`Working directory: ${env.cwd}\n` +
|
|
320
|
+
`Git repo: ${pc.git ? `yes (branch ${pc.git.branch})` : "no"}\n` +
|
|
321
|
+
`Platform: ${env.platform}\n` +
|
|
322
|
+
`OS version: ${env.osVersion}\n` +
|
|
323
|
+
`Shell: ${env.shell}\n` +
|
|
324
|
+
`Runtime: ${env.runtime}\n` +
|
|
325
|
+
`Today's date: ${env.date}\n` +
|
|
326
|
+
"</environment>");
|
|
327
|
+
const overview = [];
|
|
328
|
+
const s = pc.signals;
|
|
329
|
+
const head = [s.name, s.kinds.length ? s.kinds.join(", ") : null].filter(Boolean).join(" — ");
|
|
330
|
+
overview.push(`Project: ${head || basename(env.cwd) || env.cwd}`);
|
|
331
|
+
if (s.scripts.length)
|
|
332
|
+
overview.push(`Scripts: ${s.scripts.join(", ")}`);
|
|
333
|
+
if (pc.docs.length) {
|
|
334
|
+
overview.push("Docs & notes (planning/roadmap/design docs in this project — read one when it's relevant):\n" +
|
|
335
|
+
pc.docs.map((d) => `- ${d.path}${d.desc ? ` — ${d.desc}` : ""}`).join("\n"));
|
|
336
|
+
}
|
|
337
|
+
if (pc.tree.lines.length) {
|
|
338
|
+
const note = pc.tree.truncated ? " (partial — ask tools for more)" : "";
|
|
339
|
+
overview.push(`Structure${note} — snapshot, ignores ${[...DEFAULT_IGNORES].slice(0, 3).join("/")}/…:\n` +
|
|
340
|
+
pc.tree.lines.join("\n"));
|
|
341
|
+
}
|
|
342
|
+
if (pc.readme)
|
|
343
|
+
overview.push(`README (excerpt):\n${pc.readme}`);
|
|
344
|
+
if (pc.git) {
|
|
345
|
+
const git = [`Git status (snapshot at session start) — branch ${pc.git.branch}`];
|
|
346
|
+
if (pc.git.recentCommits)
|
|
347
|
+
git.push(`Recent commits:\n${pc.git.recentCommits}`);
|
|
348
|
+
git.push(`Changes:\n${pc.git.status}`);
|
|
349
|
+
overview.push(git.join("\n"));
|
|
350
|
+
}
|
|
351
|
+
out.push("<project_overview>\n" + overview.join("\n\n") + "\n</project_overview>");
|
|
352
|
+
return out.join("\n\n");
|
|
353
|
+
}
|
|
354
|
+
/** Convenience: collect + render in one call. "" when there's nothing useful. */
|
|
355
|
+
export async function projectContextText(cwd) {
|
|
356
|
+
return renderProjectContext(await collectProjectContext(cwd));
|
|
357
|
+
}
|
|
358
|
+
// ── helpers ──────────────────────────────────────────────────────────────────
|
|
359
|
+
/** Run a git command, time-boxed; resolves to stdout on success, null otherwise. */
|
|
360
|
+
function runGit(args, cwd, timeoutMs = GIT_TIMEOUT_MS) {
|
|
361
|
+
return new Promise((resolve) => {
|
|
362
|
+
let child;
|
|
363
|
+
try {
|
|
364
|
+
child = spawn("git", args, { cwd, windowsHide: true });
|
|
365
|
+
}
|
|
366
|
+
catch {
|
|
367
|
+
resolve(null);
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
let out = "";
|
|
371
|
+
let done = false;
|
|
372
|
+
const finish = (v) => {
|
|
373
|
+
if (done)
|
|
374
|
+
return;
|
|
375
|
+
done = true;
|
|
376
|
+
clearTimeout(timer);
|
|
377
|
+
resolve(v);
|
|
378
|
+
};
|
|
379
|
+
const timer = setTimeout(() => {
|
|
380
|
+
try {
|
|
381
|
+
child.kill();
|
|
382
|
+
}
|
|
383
|
+
catch {
|
|
384
|
+
/* already gone */
|
|
385
|
+
}
|
|
386
|
+
finish(null);
|
|
387
|
+
}, timeoutMs);
|
|
388
|
+
child.stdout?.on("data", (c) => {
|
|
389
|
+
if (out.length < 64_000)
|
|
390
|
+
out += c.toString("utf8");
|
|
391
|
+
});
|
|
392
|
+
child.on("error", () => finish(null));
|
|
393
|
+
child.on("close", (code) => finish(code === 0 ? out : null));
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
async function readJson(path) {
|
|
397
|
+
try {
|
|
398
|
+
return JSON.parse(await fs.readFile(path, "utf8"));
|
|
399
|
+
}
|
|
400
|
+
catch {
|
|
401
|
+
return null;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
/** Pull `name = "..."` from a TOML manifest's [package]/[project] table, cheaply. */
|
|
405
|
+
async function tomlName(path) {
|
|
406
|
+
try {
|
|
407
|
+
const text = await fs.readFile(path, "utf8");
|
|
408
|
+
const m = text.match(/^\s*name\s*=\s*["']([^"']+)["']/m);
|
|
409
|
+
return m?.[1];
|
|
410
|
+
}
|
|
411
|
+
catch {
|
|
412
|
+
return undefined;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
/** Local YYYY-MM-DD (the user's calendar day, not UTC). */
|
|
416
|
+
function localDate() {
|
|
417
|
+
const d = new Date();
|
|
418
|
+
const p = (n) => String(n).padStart(2, "0");
|
|
419
|
+
return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}`;
|
|
420
|
+
}
|
|
421
|
+
function envInt(name, fallback) {
|
|
422
|
+
const v = Number(process.env[name]);
|
|
423
|
+
return Number.isFinite(v) && v > 0 ? Math.floor(v) : fallback;
|
|
424
|
+
}
|
|
425
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/project/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { dirname, relative, isAbsolute } from "node:path";
|
|
2
|
+
import { fail } from "./results.js";
|
|
3
|
+
const ALLOW = "Yes, allow it this time";
|
|
4
|
+
const DENY = "No, keep it protected";
|
|
5
|
+
const DEFER = "Let me tell you what to do";
|
|
6
|
+
/**
|
|
7
|
+
* What the approval channel resolves with when the user dismisses the question
|
|
8
|
+
* instead of answering it (Esc).
|
|
9
|
+
*
|
|
10
|
+
* Dismissing used to resolve with the SECOND option, which is right for a
|
|
11
|
+
* Yes/No/Defer prompt and wrong for anything else. `ask_user` supplies arbitrary
|
|
12
|
+
* options, so escaping "Postgres or SQLite?" told the model the user had chosen
|
|
13
|
+
* SQLite — a preference they never expressed, reported to the model as fact.
|
|
14
|
+
*
|
|
15
|
+
* Every other caller tests for its own affirmative and treats anything else as a
|
|
16
|
+
* refusal, so this value declines safely everywhere without them knowing about it.
|
|
17
|
+
* Only a caller that must tell "declined" apart from "chose the second option"
|
|
18
|
+
* needs to compare against it.
|
|
19
|
+
*/
|
|
20
|
+
export const APPROVAL_DISMISSED = "\u0000dismissed";
|
|
21
|
+
/**
|
|
22
|
+
* Marks an answer the user TYPED rather than picked, so a caller can tell them apart.
|
|
23
|
+
*
|
|
24
|
+
* Leading space, like APPROVAL_DISMISSED: an option label never starts with one, so a
|
|
25
|
+
* typed answer can never be mistaken for a choice and vice versa.
|
|
26
|
+
*/
|
|
27
|
+
export const APPROVAL_TEXT = " text:";
|
|
28
|
+
/** The typed answer, or null when this was an ordinary choice. */
|
|
29
|
+
export function readFreeText(answer) {
|
|
30
|
+
return answer.startsWith(APPROVAL_TEXT) ? answer.slice(APPROVAL_TEXT.length) : null;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Offer to lift a forbidden path. Returns `null` to proceed (the user allowed it),
|
|
34
|
+
* or a ToolResult the caller should return (refused or deferred). `refusal` is the
|
|
35
|
+
* message used when there's no channel to ask through.
|
|
36
|
+
*/
|
|
37
|
+
export async function requestForbiddenLift(ctx, pattern, action, refusal, noun = "protected path") {
|
|
38
|
+
if (!ctx.requestApproval) {
|
|
39
|
+
return {
|
|
40
|
+
output: `Error: ${refusal}`,
|
|
41
|
+
isError: true,
|
|
42
|
+
summary: `Forbidden ${noun}: ${pattern} → access denied`,
|
|
43
|
+
displayKind: "governor",
|
|
44
|
+
displayName: "Governor",
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const choice = await ctx.requestApproval(`This is blocked by a ${noun} rule ('${pattern}'). Allow ${action} anyway?`, [ALLOW, DENY, DEFER]);
|
|
48
|
+
if (choice === ALLOW) {
|
|
49
|
+
liftForbidden(ctx, pattern);
|
|
50
|
+
return null; // proceed
|
|
51
|
+
}
|
|
52
|
+
if (choice === DEFER) {
|
|
53
|
+
return {
|
|
54
|
+
output: `Stopped: '${pattern}' is protected. The user will tell you how to proceed — wait for their direction instead of touching it.`,
|
|
55
|
+
isError: true,
|
|
56
|
+
summary: `Rule fired: ${pattern} → ${action} → DEFERRED`,
|
|
57
|
+
displayKind: "governor",
|
|
58
|
+
displayName: "Governor",
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
output: `Refused: '${pattern}' is protected and the user declined to lift it. Find another way that doesn't touch it.`,
|
|
63
|
+
isError: true,
|
|
64
|
+
summary: `Rule fired: ${pattern} → ${action} → BLOCKED`,
|
|
65
|
+
displayKind: "governor",
|
|
66
|
+
displayName: "Governor",
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
const AGENT_ALLOW = "Yes, you can use it";
|
|
70
|
+
const AGENT_DENY = "No, leave it alone";
|
|
71
|
+
/**
|
|
72
|
+
* Ask before touching another coding agent's data (its saved sessions, memory,
|
|
73
|
+
* rules or skills).
|
|
74
|
+
*
|
|
75
|
+
* The default is NOT to look. Finding another tool's history in a project is like
|
|
76
|
+
* finding someone else's notebook on a shared desk: the right move is to say it's
|
|
77
|
+
* there, not to read it and start quoting it back as your own recollection. So the
|
|
78
|
+
* model surfaces it and the user decides.
|
|
79
|
+
*
|
|
80
|
+
* Returns `null` to proceed (the user allowed it), or a ToolResult the caller
|
|
81
|
+
* should return. A yes is remembered for the rest of the session, per tool, so the
|
|
82
|
+
* user is asked once rather than per file.
|
|
83
|
+
*/
|
|
84
|
+
export async function requestAgentDataAccess(ctx, tool, action) {
|
|
85
|
+
if (ctx.agentDataAllowed?.has(tool))
|
|
86
|
+
return null; // already allowed this session
|
|
87
|
+
const refusal = `that belongs to ${tool}, a different coding tool that has worked in this project. ` +
|
|
88
|
+
`Its sessions, memory and rules are not yours. Tell the user it's there and let them decide.`;
|
|
89
|
+
if (!ctx.requestApproval) {
|
|
90
|
+
return { output: `Error: ${refusal}`, isError: true, summary: `skipped ${tool}'s data` };
|
|
91
|
+
}
|
|
92
|
+
const choice = await ctx.requestApproval(`${action} belongs to ${tool}, another coding tool that has worked here.\n` +
|
|
93
|
+
`Its saved sessions, memory and rules are separate from mine. Use it anyway?`, [AGENT_ALLOW, AGENT_DENY, DEFER]);
|
|
94
|
+
if (choice === AGENT_ALLOW) {
|
|
95
|
+
if (!ctx.agentDataAllowed)
|
|
96
|
+
ctx.agentDataAllowed = new Set();
|
|
97
|
+
ctx.agentDataAllowed.add(tool);
|
|
98
|
+
return null; // proceed
|
|
99
|
+
}
|
|
100
|
+
if (choice === DEFER) {
|
|
101
|
+
return {
|
|
102
|
+
output: `Stopped: that is ${tool}'s data. The user will say how to proceed — wait for their ` +
|
|
103
|
+
`direction rather than reading it.`,
|
|
104
|
+
isError: true,
|
|
105
|
+
summary: `awaiting direction on ${tool}'s data`,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
output: `Refused: ${refusal} Continue without it, and do not present anything from it as your ` +
|
|
110
|
+
`own history with the user.`,
|
|
111
|
+
isError: true,
|
|
112
|
+
summary: `left ${tool}'s data alone`,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/** Drop a pattern from the live (session-only) deny-list. A new object forces the
|
|
116
|
+
* matcher to recompile; the on-disk rule is left intact. */
|
|
117
|
+
function liftForbidden(ctx, pattern) {
|
|
118
|
+
const g = ctx.governance;
|
|
119
|
+
if (!g)
|
|
120
|
+
return;
|
|
121
|
+
// Remembered because the lift exists ONLY in memory and governance is re-read from
|
|
122
|
+
// disk when the files change. Without this, a hand-edit to any rule file anywhere in
|
|
123
|
+
// the project would quietly resurrect a pattern the user had explicitly allowed, and
|
|
124
|
+
// the next write to that path would be blocked by a decision they had already made.
|
|
125
|
+
g.lifted = [...(g.lifted ?? []), pattern];
|
|
126
|
+
// Filter BOTH lists: a lift may be for a forbidden path or a forbidden command,
|
|
127
|
+
// and a pattern won't collide across the two, so dropping it from each is safe.
|
|
128
|
+
g.forbidden = {
|
|
129
|
+
...g.forbidden,
|
|
130
|
+
patterns: g.forbidden.patterns.filter((p) => p !== pattern),
|
|
131
|
+
commands: (g.forbidden.commands ?? []).filter((c) => c !== pattern),
|
|
132
|
+
};
|
|
133
|
+
g.notices = [...(g.notices ?? []), `Approval lifted: '${pattern}' → session scope → ALLOWED`];
|
|
134
|
+
}
|
|
135
|
+
/** The answers offered when a write lands outside the workspace. */
|
|
136
|
+
const OUTSIDE_OPTIONS = [
|
|
137
|
+
"Yes, write it",
|
|
138
|
+
"Yes, and allow this folder for the session",
|
|
139
|
+
"No, keep to the workspace",
|
|
140
|
+
];
|
|
141
|
+
/**
|
|
142
|
+
* Ask before writing somewhere the workspace does not cover.
|
|
143
|
+
*
|
|
144
|
+
* Lightning means "do not ask me about the work", and everything inside the folders the
|
|
145
|
+
* user opened IS the work. A path outside all of them is a different claim: nothing the
|
|
146
|
+
* user chose says the agent may write there, and an absolute path is easy for a model to
|
|
147
|
+
* produce from a stale assumption about where it is.
|
|
148
|
+
*
|
|
149
|
+
* The line is drawn where it is because an auto-accept mode allows a write only when the
|
|
150
|
+
* path is inside an allowed working directory, and anything outside falls through to a
|
|
151
|
+
* prompt. The second option scopes the grant to that FOLDER for the session, as theirs
|
|
152
|
+
* does, so a run that legitimately writes next door asks once rather than every file.
|
|
153
|
+
*
|
|
154
|
+
* Returns a refusal to hand back, or null to proceed. Fails CLOSED: with no way to ask,
|
|
155
|
+
* the write does not happen. Reads are untouched — this is about changing things.
|
|
156
|
+
*/
|
|
157
|
+
export async function requestOutsideWorkspaceWrite(ctx, filePath, action) {
|
|
158
|
+
if (insideWorkspace(ctx, filePath))
|
|
159
|
+
return null;
|
|
160
|
+
const dir = dirname(filePath);
|
|
161
|
+
if (ctx.allowedOutsideDirs?.has(dir))
|
|
162
|
+
return null;
|
|
163
|
+
if (!ctx.requestApproval) {
|
|
164
|
+
return fail(`Refusing to ${action}: it is outside the workspace (${ctx.roots?.join(", ") ?? ctx.cwd}) ` +
|
|
165
|
+
`and there is no way to ask the user from here. Work inside the project, or ask them ` +
|
|
166
|
+
`to add that folder with /include.`);
|
|
167
|
+
}
|
|
168
|
+
const choice = await ctx.requestApproval("Write outside the workspace?", [...OUTSIDE_OPTIONS], `Action: ${action}
|
|
169
|
+
File: ${filePath}
|
|
170
|
+
Workspace: ${(ctx.roots ?? [ctx.cwd]).join(", ")}`, "Permission Request");
|
|
171
|
+
if (choice === OUTSIDE_OPTIONS[1]) {
|
|
172
|
+
ctx.allowedOutsideDirs = new Set([...(ctx.allowedOutsideDirs ?? []), dir]);
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
if (choice === OUTSIDE_OPTIONS[0])
|
|
176
|
+
return null;
|
|
177
|
+
return fail(`Stopped: the user declined a write outside the workspace (${filePath}). Keep to the ` +
|
|
178
|
+
`project folders, and say what you were trying to do if you need somewhere else.`);
|
|
179
|
+
}
|
|
180
|
+
/** Is this path inside one of the folders the user opened? */
|
|
181
|
+
export function insideWorkspace(ctx, filePath) {
|
|
182
|
+
const roots = ctx.roots && ctx.roots.length > 0 ? ctx.roots : [ctx.cwd];
|
|
183
|
+
return roots.some((root) => {
|
|
184
|
+
const rel = relative(root, filePath);
|
|
185
|
+
// "" is the root itself; a `..` prefix means the path climbed out of it.
|
|
186
|
+
return rel === "" || (!rel.startsWith("..") && !isAbsolute(rel));
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=approval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval.js","sourceRoot":"","sources":["../../src/tools/approval.ts"],"names":[],"mappings":"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"}
|