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,509 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* PromptInput — the chat input box, pinned to the bottom of the screen.
|
|
4
|
+
*
|
|
5
|
+
* Owns its buffer + cursor via useInput (Ink does the word-wrapping; the box
|
|
6
|
+
* grows downward). Beyond plain editing it provides the "real tool" niceties:
|
|
7
|
+
*
|
|
8
|
+
* - Input history: ↑/↓ walk previously sent messages (a draft is preserved).
|
|
9
|
+
* - Slash autocomplete: typing `/…` opens a menu of matching commands/skills;
|
|
10
|
+
* ↑/↓ select, Tab completes, Enter runs the highlighted one.
|
|
11
|
+
* - Multiline: Shift+Enter inserts a newline (where the terminal reports it);
|
|
12
|
+
* Enter sends.
|
|
13
|
+
*
|
|
14
|
+
* Pinned to the bottom of the alt-screen frame (see App) while the chat scrolls
|
|
15
|
+
* above it. Editing keys: ←/→, Ctrl+A/E (home/end), Ctrl+U (kill line),
|
|
16
|
+
* Backspace, and paste (inserted at the cursor).
|
|
17
|
+
*/
|
|
18
|
+
import { useEffect, useReducer, useRef, useState } from "react";
|
|
19
|
+
import { Box, Text, useInput } from "ink";
|
|
20
|
+
import { inputView } from "../inputView.js";
|
|
21
|
+
import { feedPasteChunk, initPasteState } from "../pasteAssembler.js";
|
|
22
|
+
import { stripMouse } from "../mouse.js";
|
|
23
|
+
// A paste collapses to a `[Pasted text …]` chip (the full content is restored when
|
|
24
|
+
// the message is sent) once it's big enough to flood the box — either many lines OR
|
|
25
|
+
// a long chunk that happens to be few lines (e.g. a couple of wrapped paragraphs).
|
|
26
|
+
// A single terminal paste always arrives as one `input` chunk, so a chunk this large
|
|
27
|
+
// is unambiguously a paste, never typed keys.
|
|
28
|
+
const PASTE_MIN_LINES = 6;
|
|
29
|
+
const PASTE_MIN_CHARS = 400;
|
|
30
|
+
// Bracketed paste: we ask the terminal (via `\x1b[?2004h`) to wrap every paste in
|
|
31
|
+
// `\x1b[200~ … \x1b[201~` markers, so we know exactly where a paste starts and ends
|
|
32
|
+
// instead of guessing. The chunk-reassembly state machine lives in pasteAssembler.ts
|
|
33
|
+
// (pure + unit-tested); here we just drive it and handle the timing fallback.
|
|
34
|
+
const BRACKET_PASTE_ON = "\x1b[?2004h";
|
|
35
|
+
const BRACKET_PASTE_OFF = "\x1b[?2004l";
|
|
36
|
+
// Safety net if the closing marker is lost or split across a chunk boundary: flush a
|
|
37
|
+
// marker-started paste after this much silence. Chunks of one paste arrive microseconds
|
|
38
|
+
// apart, so this never fires mid-paste.
|
|
39
|
+
const PASTE_END_TIMEOUT_MS = 250;
|
|
40
|
+
// Fallback for terminals that DON'T support bracketed paste (no markers ever arrive):
|
|
41
|
+
// coalesce chunks by timing. An input event this large, or one with a newline, or a
|
|
42
|
+
// continuation of one already buffering, is a paste chunk — never a typed key.
|
|
43
|
+
const PASTE_COALESCE_MS = 30;
|
|
44
|
+
const PASTE_CHUNK_MIN = 40;
|
|
45
|
+
const INITIAL = { value: "", cursor: 0, histIdx: null, selected: 0, draft: "" };
|
|
46
|
+
function reduce(s, a) {
|
|
47
|
+
switch (a.t) {
|
|
48
|
+
case "insert":
|
|
49
|
+
// Typing leaves history-browsing and resets the suggestion highlight.
|
|
50
|
+
return {
|
|
51
|
+
...s,
|
|
52
|
+
value: s.value.slice(0, s.cursor) + a.text + s.value.slice(s.cursor),
|
|
53
|
+
cursor: s.cursor + a.text.length,
|
|
54
|
+
histIdx: null,
|
|
55
|
+
selected: 0,
|
|
56
|
+
};
|
|
57
|
+
case "backspace":
|
|
58
|
+
if (s.cursor === 0)
|
|
59
|
+
return s;
|
|
60
|
+
return {
|
|
61
|
+
...s,
|
|
62
|
+
value: s.value.slice(0, s.cursor - 1) + s.value.slice(s.cursor),
|
|
63
|
+
cursor: s.cursor - 1,
|
|
64
|
+
selected: 0,
|
|
65
|
+
};
|
|
66
|
+
case "left":
|
|
67
|
+
return { ...s, cursor: Math.max(0, s.cursor - 1) };
|
|
68
|
+
case "right":
|
|
69
|
+
return { ...s, cursor: Math.min(s.value.length, s.cursor + 1) };
|
|
70
|
+
case "home":
|
|
71
|
+
return { ...s, cursor: 0 };
|
|
72
|
+
case "end":
|
|
73
|
+
return { ...s, cursor: s.value.length };
|
|
74
|
+
case "killLine":
|
|
75
|
+
return { ...s, value: s.value.slice(s.cursor), cursor: 0 };
|
|
76
|
+
case "newline":
|
|
77
|
+
return {
|
|
78
|
+
...s,
|
|
79
|
+
value: s.value.slice(0, s.cursor) + "\n" + s.value.slice(s.cursor),
|
|
80
|
+
cursor: s.cursor + 1,
|
|
81
|
+
};
|
|
82
|
+
case "splice": {
|
|
83
|
+
const value = s.value.slice(0, a.start) + a.text + s.value.slice(a.end);
|
|
84
|
+
return { ...s, value, cursor: a.start + a.text.length, selected: 0 };
|
|
85
|
+
}
|
|
86
|
+
case "selUp":
|
|
87
|
+
return { ...s, selected: Math.max(0, s.selected - 1) };
|
|
88
|
+
case "selDown":
|
|
89
|
+
return { ...s, selected: Math.min(a.max, s.selected + 1) };
|
|
90
|
+
case "histReplace":
|
|
91
|
+
return {
|
|
92
|
+
...s,
|
|
93
|
+
value: a.value,
|
|
94
|
+
cursor: a.value.length,
|
|
95
|
+
histIdx: a.histIdx,
|
|
96
|
+
draft: a.draft ?? s.draft,
|
|
97
|
+
};
|
|
98
|
+
case "restore":
|
|
99
|
+
// Unlike histReplace this keeps NO history position and no draft: the text
|
|
100
|
+
// came from the queue, not from history, so ↑ afterwards should walk history
|
|
101
|
+
// from the newest again rather than resuming a walk the user never started.
|
|
102
|
+
return { ...s, value: a.value, cursor: Math.min(a.value.length, a.cursor), histIdx: null, selected: 0 };
|
|
103
|
+
case "reset":
|
|
104
|
+
return INITIAL;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/** A literal newline, kept out of the key handler so the source has no escapes there. */
|
|
108
|
+
const NEWLINE = String.fromCharCode(10);
|
|
109
|
+
const DEFAULT_MAX_SUGGESTIONS = 6;
|
|
110
|
+
/** Rows the text area may grow to before it scrolls instead. Enough for a real
|
|
111
|
+
* paragraph; small enough that the chat above it is never squeezed away. */
|
|
112
|
+
const DEFAULT_MAX_INPUT_ROWS = 8;
|
|
113
|
+
export function PromptInput({ onSubmit, disabled = false, placeholder = "", width, history = [], completions = [], pathComplete, onLargePaste, maxMenuRows = DEFAULT_MAX_SUGGESTIONS, onMenuChange, onQueuePop, maxInputRows = DEFAULT_MAX_INPUT_ROWS, overlay, opening = false, }) {
|
|
114
|
+
const [state, dispatch] = useReducer(reduce, INITIAL);
|
|
115
|
+
const { value, cursor, histIdx, selected, draft } = state;
|
|
116
|
+
// The two autocomplete sources. Command menu: a single `/token` (no space) at the
|
|
117
|
+
// start. Path menu: a `@token` ending at the cursor, resolved against the
|
|
118
|
+
// filesystem (async, in the effect below). Command takes priority.
|
|
119
|
+
const commandMode = value.startsWith("/") && !value.includes(" ");
|
|
120
|
+
const at = !commandMode && pathComplete ? atTokenAt(value, cursor) : null;
|
|
121
|
+
const [pathItems, setPathItems] = useState([]);
|
|
122
|
+
useEffect(() => {
|
|
123
|
+
if (!at || !pathComplete) {
|
|
124
|
+
setPathItems([]);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
let cancelled = false;
|
|
128
|
+
pathComplete(at.text.slice(1)).then((items) => {
|
|
129
|
+
if (!cancelled)
|
|
130
|
+
setPathItems(items);
|
|
131
|
+
});
|
|
132
|
+
return () => {
|
|
133
|
+
cancelled = true;
|
|
134
|
+
};
|
|
135
|
+
}, [at?.text, pathComplete]);
|
|
136
|
+
const menu = computeMenu();
|
|
137
|
+
const menuOpen = menu !== null;
|
|
138
|
+
const sel = Math.min(selected, Math.max(0, (menu?.items.length ?? 1) - 1));
|
|
139
|
+
// Tell the App the footer's height just changed.
|
|
140
|
+
//
|
|
141
|
+
// Opening the menu is state local to THIS component, so React re-renders only
|
|
142
|
+
// this subtree — App does not re-render, so App's own footer measurement never
|
|
143
|
+
// re-runs and it keeps sizing the chat against a menu-closed footer. The menu
|
|
144
|
+
// then overflows the frame and is clipped away entirely; sitting idle at the
|
|
145
|
+
// prompt, nothing else re-renders App, so it never corrects itself. The row
|
|
146
|
+
// count (not just open/closed) is the trigger, because filtering as you type
|
|
147
|
+
// changes the height too.
|
|
148
|
+
const menuRowCount = menu ? Math.min(menu.items.length, maxMenuRows) : 0;
|
|
149
|
+
useEffect(() => {
|
|
150
|
+
onMenuChange?.();
|
|
151
|
+
}, [menuRowCount, onMenuChange]);
|
|
152
|
+
function computeMenu() {
|
|
153
|
+
if (commandMode) {
|
|
154
|
+
const items = completions.filter((c) => c.name.toLowerCase().startsWith(value.toLowerCase()));
|
|
155
|
+
return items.length > 0 ? { mode: "command", items, start: 0 } : null;
|
|
156
|
+
}
|
|
157
|
+
if (at && pathItems.length > 0) {
|
|
158
|
+
return { mode: "path", items: pathItems.map((p) => ({ name: "@" + p, description: "" })), start: at.start };
|
|
159
|
+
}
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
// Apply the highlighted path completion: splice it over the `@token` (keep the
|
|
163
|
+
// menu open after a directory so you can keep drilling in).
|
|
164
|
+
function completePath() {
|
|
165
|
+
if (!menu || menu.mode !== "path")
|
|
166
|
+
return;
|
|
167
|
+
const chosen = menu.items[sel].name;
|
|
168
|
+
const text = chosen.endsWith("/") ? chosen : chosen + " ";
|
|
169
|
+
dispatch({ t: "splice", start: menu.start, end: cursor, text });
|
|
170
|
+
}
|
|
171
|
+
function submit(text) {
|
|
172
|
+
const trimmed = text.trim();
|
|
173
|
+
if (trimmed.length === 0)
|
|
174
|
+
return;
|
|
175
|
+
dispatch({ t: "reset" });
|
|
176
|
+
onSubmit(trimmed);
|
|
177
|
+
}
|
|
178
|
+
// Paste reassembly: a paste arrives as several `input` chunks. `paste` holds the
|
|
179
|
+
// cross-chunk state (see pasteAssembler.ts); the timer flushes the fallback path and
|
|
180
|
+
// guards against a lost end marker.
|
|
181
|
+
const paste = useRef(initPasteState());
|
|
182
|
+
const pasteTimer = useRef(null);
|
|
183
|
+
// Insert an assembled paste — as a `[Pasted text …]` chip when it's big enough to
|
|
184
|
+
// flood the box, otherwise inline.
|
|
185
|
+
function emitPaste(text) {
|
|
186
|
+
if (!text)
|
|
187
|
+
return;
|
|
188
|
+
const big = text.split("\n").length >= PASTE_MIN_LINES || text.length >= PASTE_MIN_CHARS;
|
|
189
|
+
dispatch({ t: "insert", text: onLargePaste && big ? onLargePaste(text) : text });
|
|
190
|
+
}
|
|
191
|
+
function flushPaste() {
|
|
192
|
+
pasteTimer.current = null;
|
|
193
|
+
// A split end-marker can leave a stray trailing ESC; drop it.
|
|
194
|
+
const buf = paste.current.buf.replace(/\x1b$/, "");
|
|
195
|
+
paste.current = initPasteState();
|
|
196
|
+
emitPaste(buf);
|
|
197
|
+
}
|
|
198
|
+
// Turn bracketed paste on so the terminal delimits pastes for us; restore it on exit.
|
|
199
|
+
useEffect(() => {
|
|
200
|
+
process.stdout.write(BRACKET_PASTE_ON);
|
|
201
|
+
return () => {
|
|
202
|
+
if (pasteTimer.current)
|
|
203
|
+
clearTimeout(pasteTimer.current);
|
|
204
|
+
process.stdout.write(BRACKET_PASTE_OFF);
|
|
205
|
+
};
|
|
206
|
+
}, []);
|
|
207
|
+
useInput((raw, key) => {
|
|
208
|
+
// Mouse reports arrive as ordinary stdin bytes once wheel reporting is on
|
|
209
|
+
// (see mouse.ts). Ink's key parser does not recognise them and hands them
|
|
210
|
+
// straight through as if typed, so scrolling filled the prompt with
|
|
211
|
+
// `[<64;25;26M`. Stripped FIRST — ahead of the paste assembler, which would
|
|
212
|
+
// otherwise buffer a fast flick and commit it as a pasted block.
|
|
213
|
+
const input = stripMouse(raw);
|
|
214
|
+
// A chunk that was nothing but mouse reports is not a keystroke. Guarded on
|
|
215
|
+
// `raw` being non-empty so genuine keys that carry no text (arrows, Enter)
|
|
216
|
+
// still reach the handlers below.
|
|
217
|
+
if (input === "" && raw !== "")
|
|
218
|
+
return;
|
|
219
|
+
// Bracketed paste (authoritative): from the `\x1b[200~` start marker to the
|
|
220
|
+
// `\x1b[201~` end marker, every chunk is literal pasted content — never Enter,
|
|
221
|
+
// arrows, or other keys — so we handle it here, before anything else, accumulating
|
|
222
|
+
// across chunks. The paste flushes as ONE unit (one chip) at the end marker; the
|
|
223
|
+
// timer only guards against a lost/split end marker.
|
|
224
|
+
const step = feedPasteChunk(paste.current, input);
|
|
225
|
+
if (step.kind !== "passthrough") {
|
|
226
|
+
if (pasteTimer.current)
|
|
227
|
+
clearTimeout(pasteTimer.current);
|
|
228
|
+
if (step.kind === "flush") {
|
|
229
|
+
pasteTimer.current = null;
|
|
230
|
+
paste.current = initPasteState();
|
|
231
|
+
emitPaste(step.text);
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
paste.current = step.state;
|
|
235
|
+
pasteTimer.current = setTimeout(flushPaste, PASTE_END_TIMEOUT_MS);
|
|
236
|
+
}
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
// Enter: Shift+Enter inserts a newline (terminals that report it); plain
|
|
240
|
+
// Enter sends — the highlighted suggestion when the menu is open, else the
|
|
241
|
+
// buffer.
|
|
242
|
+
if (key.return) {
|
|
243
|
+
if (key.shift || key.meta) {
|
|
244
|
+
dispatch({ t: "newline" });
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
// In the path menu, Enter completes the path (you press Enter again to send);
|
|
248
|
+
// in the command menu it runs the highlighted command; otherwise it sends.
|
|
249
|
+
if (menu?.mode === "path") {
|
|
250
|
+
completePath();
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
submit(menu ? menu.items[sel].name : value);
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
// Tab completes the highlighted suggestion (a command, or a path mention).
|
|
257
|
+
// Shift-Tab is reserved for cycling the interaction mode (handled in App), so
|
|
258
|
+
// it must never complete here.
|
|
259
|
+
if (key.tab && !key.shift && menu) {
|
|
260
|
+
if (menu.mode === "path")
|
|
261
|
+
completePath();
|
|
262
|
+
else
|
|
263
|
+
dispatch({ t: "histReplace", value: menu.items[sel].name + " ", histIdx: null });
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
// ↑/↓: navigate the menu when open, otherwise walk input history.
|
|
267
|
+
if (key.upArrow) {
|
|
268
|
+
if (menuOpen)
|
|
269
|
+
dispatch({ t: "selUp" });
|
|
270
|
+
else if (!popQueue())
|
|
271
|
+
historyPrev();
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
if (key.downArrow) {
|
|
275
|
+
if (menuOpen)
|
|
276
|
+
dispatch({ t: "selDown", max: menu.items.length - 1 });
|
|
277
|
+
else
|
|
278
|
+
historyNext();
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
if (key.backspace || key.delete) {
|
|
282
|
+
dispatch({ t: "backspace" });
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
if (key.leftArrow) {
|
|
286
|
+
dispatch({ t: "left" });
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
if (key.rightArrow) {
|
|
290
|
+
dispatch({ t: "right" });
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
if (key.ctrl && input === "a") {
|
|
294
|
+
dispatch({ t: "home" });
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
if (key.ctrl && input === "e") {
|
|
298
|
+
dispatch({ t: "end" });
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
if (key.ctrl && input === "u") {
|
|
302
|
+
dispatch({ t: "killLine" });
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
// Esc takes back whatever is queued, if anything is. When nothing is, it falls
|
|
306
|
+
// through untouched and stays what it has always been — the App's interrupt.
|
|
307
|
+
// Both handlers are live at once while Mindweave is working, and that is the
|
|
308
|
+
// behaviour we want there: Esc stops the turn, and popQueue() declines because
|
|
309
|
+
// App refuses to pop mid-turn (see its onQueuePop).
|
|
310
|
+
if (key.escape) {
|
|
311
|
+
popQueue();
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
// Ignore control chords / keys we don't handle here.
|
|
315
|
+
if (key.ctrl || key.meta || key.tab) {
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
// Printable text. On terminals WITHOUT bracketed paste (no markers ever arrive),
|
|
319
|
+
// we fall back to timing: a large chunk, a chunk with a newline, or a continuation
|
|
320
|
+
// of one already buffering is a paste — accumulate and flush once idle so the whole
|
|
321
|
+
// paste is one decision (one chip). A lone keypress inserts immediately.
|
|
322
|
+
if (input) {
|
|
323
|
+
const isPasteChunk = paste.current.buf.length > 0 || input.length >= PASTE_CHUNK_MIN || input.includes("\n");
|
|
324
|
+
if (isPasteChunk) {
|
|
325
|
+
paste.current.buf += input;
|
|
326
|
+
if (pasteTimer.current)
|
|
327
|
+
clearTimeout(pasteTimer.current);
|
|
328
|
+
pasteTimer.current = setTimeout(flushPaste, PASTE_COALESCE_MS);
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
dispatch({ t: "insert", text: input });
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
/** Take the queue back into the box. False when there was nothing to take. */
|
|
335
|
+
function popQueue() {
|
|
336
|
+
if (!onQueuePop)
|
|
337
|
+
return false;
|
|
338
|
+
// Only from the FIRST line. In a multi-line draft ↑ means "move up a line",
|
|
339
|
+
// and stealing that would make the queue impossible to leave alone.
|
|
340
|
+
if (key.upArrow && value.slice(0, cursor).includes(NEWLINE))
|
|
341
|
+
return false;
|
|
342
|
+
const popped = onQueuePop(value, cursor, key.upArrow ? "up" : "escape");
|
|
343
|
+
if (!popped)
|
|
344
|
+
return false;
|
|
345
|
+
dispatch({ t: "restore", value: popped.text, cursor: popped.cursor });
|
|
346
|
+
return true;
|
|
347
|
+
}
|
|
348
|
+
function historyPrev() {
|
|
349
|
+
if (history.length === 0)
|
|
350
|
+
return;
|
|
351
|
+
if (histIdx === null) {
|
|
352
|
+
const i = history.length - 1;
|
|
353
|
+
dispatch({ t: "histReplace", value: history[i], histIdx: i, draft: value });
|
|
354
|
+
}
|
|
355
|
+
else if (histIdx > 0) {
|
|
356
|
+
dispatch({ t: "histReplace", value: history[histIdx - 1], histIdx: histIdx - 1 });
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
function historyNext() {
|
|
360
|
+
if (histIdx === null)
|
|
361
|
+
return;
|
|
362
|
+
const i = histIdx + 1;
|
|
363
|
+
if (i >= history.length) {
|
|
364
|
+
dispatch({ t: "histReplace", value: draft, histIdx: null });
|
|
365
|
+
}
|
|
366
|
+
else {
|
|
367
|
+
dispatch({ t: "histReplace", value: history[i], histIdx: i });
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}, { isActive: !disabled && !overlay });
|
|
371
|
+
const fieldWidth = Math.max(10, width - 6);
|
|
372
|
+
// The menu box's baseline height: a border (2) around a header (1), `maxMenuRows` item
|
|
373
|
+
// rows, and the hint (1). Used as a MINIMUM so the command list and every picker (which
|
|
374
|
+
// pad to `maxMenuRows`) land at exactly this height and never resize as you filter or
|
|
375
|
+
// switch, while a richer surface in the same box (the key manager, an approval) may grow
|
|
376
|
+
// past it rather than being clipped.
|
|
377
|
+
const menuBoxRows = maxMenuRows + 4;
|
|
378
|
+
return (_jsxs(Box, { flexDirection: "column", width: width, flexShrink: 0, children: [_jsx(Box, { flexDirection: "column", width: width, flexShrink: 0, borderStyle: "single", borderColor: "gray", paddingX: 1, children: _jsx(Field, { value: value, cursor: cursor, active: !disabled && !overlay, placeholder: overlay ? "" : placeholder, width: fieldWidth, maxRows: maxInputRows }) }), overlay || menu || opening ? (_jsx(Box, { flexDirection: "column", width: width, height: menuBoxRows, flexShrink: 0, borderStyle: "single", borderColor: "gray", paddingX: 1, marginTop: 1, overflow: "hidden", children: overlay ? (overlay) : menu ? (_jsx(SuggestionMenu, { matches: menu.items, selected: sel, width: width, mode: menu.mode, maxRows: maxMenuRows })) : (
|
|
379
|
+
// `opening`: a command that opens a surface here was submitted, and the surface
|
|
380
|
+
// is a moment away. The frame is held open with an empty body so the transition
|
|
381
|
+
// from the command list to what it opens is a change of CONTENT inside one box
|
|
382
|
+
// that never leaves the screen.
|
|
383
|
+
_jsx(Box, { flexDirection: "column", height: menuBoxRows - 2 })) })) : null] }));
|
|
384
|
+
}
|
|
385
|
+
/** The `@token` ending at the cursor (back to the nearest whitespace), or null.
|
|
386
|
+
* Used to drive the file-path picker while typing a `@mention`. */
|
|
387
|
+
// No real @mention (a path) is anywhere near this long. Without a cap, a run of
|
|
388
|
+
// the same non-whitespace character (fast typing, a held key) has no whitespace
|
|
389
|
+
// to stop the scan at, so it walks back to index 0 on EVERY keystroke — O(cursor)
|
|
390
|
+
// work repeated once per character typed, which is what made fast typing laggy
|
|
391
|
+
// even well under the length where Field's own render-windowing kicks in.
|
|
392
|
+
const MAX_TOKEN_SCAN = 300;
|
|
393
|
+
function atTokenAt(value, cursor) {
|
|
394
|
+
const floor = Math.max(0, cursor - MAX_TOKEN_SCAN);
|
|
395
|
+
let i = cursor;
|
|
396
|
+
while (i > floor && !/\s/.test(value[i - 1]))
|
|
397
|
+
i--;
|
|
398
|
+
if (i === floor && floor > 0 && !/\s/.test(value[floor - 1] ?? " "))
|
|
399
|
+
return null; // ran into the cap, not a real boundary
|
|
400
|
+
const text = value.slice(i, cursor);
|
|
401
|
+
return text.startsWith("@") ? { text, start: i } : null;
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* The dropdown of matching commands/skills shown below the input. It SCROLLS: a
|
|
405
|
+
* sliding window keeps the highlighted row in view as ↑/↓ move past the visible
|
|
406
|
+
* count, so a long list (every command) is fully reachable, not capped at the first
|
|
407
|
+
* few. The window is always the same number of rows, and no "N more" markers are
|
|
408
|
+
* shown, so the box stays one fixed height from the first item to the last: a marker
|
|
409
|
+
* that appeared only at the ends made the box taller mid-list and shifted the whole
|
|
410
|
+
* transcript above it by a row when the selection crossed into or out of an end.
|
|
411
|
+
*
|
|
412
|
+
* Bordered like the input box itself, not a bare list floating under it — same
|
|
413
|
+
* treatment, same reason: it's the other place the user is choosing something,
|
|
414
|
+
* not just reading a log.
|
|
415
|
+
*/
|
|
416
|
+
function SuggestionMenu({ matches, selected, width, mode, maxRows, }) {
|
|
417
|
+
// Window the list so `selected` is always visible (same scheme as Picker).
|
|
418
|
+
const start = Math.min(Math.max(0, selected - (maxRows - 1)), Math.max(0, matches.length - maxRows));
|
|
419
|
+
const shown = matches.slice(start, start + maxRows);
|
|
420
|
+
const nameWidth = Math.min(18, Math.max(...shown.map((m) => m.name.length), 1));
|
|
421
|
+
const title = mode === "command" ? "Commands" : "Files";
|
|
422
|
+
// The prefix ("› " / " ") + the padded name, so the description column knows
|
|
423
|
+
// exactly what's left. Without this Box the description had no width of its
|
|
424
|
+
// own to truncate against — Yoga let a long one push past the row and wrap,
|
|
425
|
+
// splitting a command's NAME onto its own line, one row later than where it
|
|
426
|
+
// belonged. Confirmed with a bare Ink render before this fix went in.
|
|
427
|
+
//
|
|
428
|
+
// Widths subtract the enclosing box's chrome — border (2) + paddingX (2) = 4 — plus
|
|
429
|
+
// the 2-col prefix, so a truncated description ends INSIDE the border. Without the
|
|
430
|
+
// full subtraction a long line filled the row past the content area and wrapped,
|
|
431
|
+
// leaving a blank continuation row between items.
|
|
432
|
+
const rowWidth = width - 4;
|
|
433
|
+
const descWidth = Math.max(4, rowWidth - 2 - nameWidth);
|
|
434
|
+
// The parenthetical is the only place that says you can keep TYPING to narrow the
|
|
435
|
+
// list. Without it the arrows look like the only way through, and a long catalog
|
|
436
|
+
// reads as something to scroll rather than something to filter.
|
|
437
|
+
const header = (_jsxs(Box, { flexShrink: 0, children: [_jsx(Text, { bold: true, children: title }), _jsx(Text, { dimColor: true, children: " (type to filter, or use ↑/↓)" })] }));
|
|
438
|
+
const hint = mode === "command" ? "Tab completes · Esc dismisses" : "↑/↓ to select · Enter/Tab to complete · Esc dismisses";
|
|
439
|
+
// Blank rows padding the list up to `maxRows`, so the box is the SAME height whether it
|
|
440
|
+
// shows two matches or twelve. Fixed dimensions: the menu box never resizes as you
|
|
441
|
+
// filter down or switch to a shorter list — the surplus is empty space, not a smaller box.
|
|
442
|
+
const pad = Math.max(0, maxRows - shown.length);
|
|
443
|
+
// Content only — the surrounding box is the menu box in PromptInput. flexShrink:0 on
|
|
444
|
+
// every row is what makes App.tsx's maxRows cap reliable: without it Yoga compresses an
|
|
445
|
+
// overfull menu instead of respecting the cap computed so it wouldn't need to (confirmed
|
|
446
|
+
// with a bare Ink render, same as the chat viewport's rows — see App.tsx).
|
|
447
|
+
return (_jsxs(_Fragment, { children: [header, shown.map((m, i) => {
|
|
448
|
+
const active = start + i === selected;
|
|
449
|
+
return (_jsxs(Box, { width: rowWidth, flexShrink: 0, children: [_jsxs(Text, { color: active ? "cyan" : undefined, bold: active, children: [active ? "› " : " ", m.name.padEnd(nameWidth)] }), _jsx(Box, { width: descWidth, children: _jsx(Text, { dimColor: true, wrap: "truncate-end", children: " " + m.description }) })] }, m.name));
|
|
450
|
+
}), Array.from({ length: pad }).map((_, i) => (_jsx(Box, { flexShrink: 0, children: _jsx(Text, { children: " " }) }, `pad${i}`))), _jsx(Box, { flexShrink: 0, children: _jsx(Text, { dimColor: true, children: hint }) })] }));
|
|
451
|
+
}
|
|
452
|
+
/** The text area: the buffer word-wrapped, with a block cursor, or a placeholder. */
|
|
453
|
+
/**
|
|
454
|
+
* The text area: the buffer wrapped into rows with a block cursor, capped in height.
|
|
455
|
+
*
|
|
456
|
+
* Row-by-row rather than one `<Text wrap="wrap">`, because the box has to know how tall
|
|
457
|
+
* it is. Left to wrap itself it grew without limit, and since it shares a fixed frame
|
|
458
|
+
* with the chat and the tip line, the rows it took came off the bottom of the screen —
|
|
459
|
+
* the tip vanished and the box looked cut in half. The wrapping and the cursor maths
|
|
460
|
+
* live in inputView.ts, where they are unit-tested.
|
|
461
|
+
*/
|
|
462
|
+
/**
|
|
463
|
+
* How long each half of the blink lasts.
|
|
464
|
+
*
|
|
465
|
+
* 530ms is the rate terminals and editors have converged on. It is slow enough to read
|
|
466
|
+
* as a pulse rather than a flicker, and fast enough that the caret is never missing long
|
|
467
|
+
* enough to look lost.
|
|
468
|
+
*/
|
|
469
|
+
const BLINK_MS = 530;
|
|
470
|
+
/**
|
|
471
|
+
* The text caret: a thin bar that blinks, rather than a solid block that sits still.
|
|
472
|
+
*
|
|
473
|
+
* The block was drawn by inverting the cell, which is the cheapest possible caret and
|
|
474
|
+
* reads as a frozen artefact — a filled square parked in the box whether the tool is
|
|
475
|
+
* waiting for you, thinking, or doing nothing at all. A bar that blinks is the one piece
|
|
476
|
+
* of motion that says an input is LIVE, and it is what makes a terminal prompt feel like
|
|
477
|
+
* talking to something rather than typing into a field.
|
|
478
|
+
*
|
|
479
|
+
* The blink state lives HERE, not in Field or PromptInput. It ticks twice a second
|
|
480
|
+
* forever, and anywhere higher up that would re-render the input's whole subtree — the
|
|
481
|
+
* wrapped rows, the suggestion menu — twice a second for one cell.
|
|
482
|
+
*
|
|
483
|
+
* `under` is the character the caret sits on. A terminal grid has no room between cells,
|
|
484
|
+
* so the caret has to occupy one: it shows the bar on the on-beat and gives the cell back
|
|
485
|
+
* on the off-beat, which keeps a character under mid-line editing readable. At the end of
|
|
486
|
+
* the text, where the caret spends nearly all its time, there is nothing under it and it
|
|
487
|
+
* is simply a blinking bar.
|
|
488
|
+
*
|
|
489
|
+
* `resetKey` restarts the cycle on the on-beat whenever it changes. Without it, typing
|
|
490
|
+
* during an off-beat leaves the caret invisible at the exact moment the user is looking
|
|
491
|
+
* for it, which reads as dropped input.
|
|
492
|
+
*/
|
|
493
|
+
function Caret({ under, resetKey }) {
|
|
494
|
+
const [on, setOn] = useState(true);
|
|
495
|
+
useEffect(() => {
|
|
496
|
+
setOn(true);
|
|
497
|
+
const id = setInterval(() => setOn((v) => !v), BLINK_MS);
|
|
498
|
+
return () => clearInterval(id);
|
|
499
|
+
}, [resetKey]);
|
|
500
|
+
return on ? _jsx(Text, { color: "cyan", children: "│" }) : _jsx(Text, { children: under || " " });
|
|
501
|
+
}
|
|
502
|
+
function Field({ value, cursor, active, placeholder, width, maxRows, }) {
|
|
503
|
+
if (value.length === 0) {
|
|
504
|
+
return (_jsxs(Box, { flexShrink: 0, children: [_jsx(Text, { bold: true, color: "cyan", children: "> " }), _jsx(Box, { width: width, overflow: "hidden", children: _jsxs(Text, { wrap: "truncate-end", children: [active ? _jsx(Caret, { under: "", resetKey: "placeholder" }) : null, placeholder ? _jsx(Text, { dimColor: true, children: placeholder }) : null] }) })] }));
|
|
505
|
+
}
|
|
506
|
+
const view = inputView(value, cursor, width, maxRows);
|
|
507
|
+
return (_jsxs(Box, { flexDirection: "column", flexShrink: 0, children: [view.hiddenAbove > 0 ? (_jsx(Box, { flexShrink: 0, children: _jsx(Text, { dimColor: true, children: ` ↑ ${view.hiddenAbove} more line${view.hiddenAbove === 1 ? "" : "s"}` }) })) : null, view.rows.map((row, i) => (_jsxs(Box, { flexShrink: 0, children: [_jsx(Text, { bold: true, color: "cyan", children: i === 0 && view.hiddenAbove === 0 ? "> " : " " }), _jsx(Box, { width: width, overflow: "hidden", children: _jsx(Text, { wrap: "truncate-end", children: active && i === view.cursorRow ? (_jsxs(_Fragment, { children: [row.text.slice(0, view.cursorCol), _jsx(Caret, { under: row.text.slice(view.cursorCol, view.cursorCol + 1), resetKey: `${cursor}:${value.length}` }), row.text.slice(view.cursorCol + 1)] })) : (row.text) }) })] }, i))), view.hiddenBelow > 0 ? (_jsx(Box, { flexShrink: 0, children: _jsx(Text, { dimColor: true, children: ` ↓ ${view.hiddenBelow} more line${view.hiddenBelow === 1 ? "" : "s"}` }) })) : null] }));
|
|
508
|
+
}
|
|
509
|
+
//# sourceMappingURL=PromptInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PromptInput.js","sourceRoot":"","sources":["../../../src/cli/components/PromptInput.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* SubagentView — delegated work, as a distinct NESTED block.
|
|
4
|
+
*
|
|
5
|
+
* ONE worker keeps its full rail, because there is room to watch it:
|
|
6
|
+
*
|
|
7
|
+
* ◆ Subagent · read-only find every authFetch call site
|
|
8
|
+
* │ Searching authFetch
|
|
9
|
+
* │ Read login.ts
|
|
10
|
+
* ⎿ 3 steps · read-only ← collapses here once it reports back
|
|
11
|
+
*
|
|
12
|
+
* SEVERAL at once become a topology instead, because read-only workers fan out in
|
|
13
|
+
* parallel and their rails, side by side, are a stripe nobody can follow:
|
|
14
|
+
*
|
|
15
|
+
* ◆ Subagents · 2 delegated
|
|
16
|
+
* ├── #1 · read-only find every authFetch call site
|
|
17
|
+
* │ ⎿ 3 steps · read-only
|
|
18
|
+
* └── #2 draft unit tests for runCommand.ts
|
|
19
|
+
* ⎿ working · 4 steps
|
|
20
|
+
*
|
|
21
|
+
* The trade is deliberate: with one worker you can afford to watch each call; with
|
|
22
|
+
* several you need the SHAPE of the delegation — who is doing what, and how far along
|
|
23
|
+
* — and the individual calls become noise. What is shown is only what a worker
|
|
24
|
+
* actually reports (its task, whether it may write, its progress). The reference
|
|
25
|
+
* design also labels each with a model and an "isolated 8k window"; a sub-agent
|
|
26
|
+
* carries neither, so inventing them would be decoration that reads as fact.
|
|
27
|
+
*
|
|
28
|
+
* A violet ◆ marker sets the whole family apart from the blue tool rows — these are
|
|
29
|
+
* separate minds working inside the transcript, not more tools. A child's prose is
|
|
30
|
+
* never shown; only its final distilled report crosses back, as the spawn's result.
|
|
31
|
+
*/
|
|
32
|
+
import { Box, Text } from "ink";
|
|
33
|
+
import { KIND_COLOR, ERROR_COLOR } from "../toolDisplay.js";
|
|
34
|
+
import { collapseAdjacent } from "../toolItems.js";
|
|
35
|
+
const DIAMOND = "◆";
|
|
36
|
+
const BRANCH = "⎿";
|
|
37
|
+
const RAIL = "│";
|
|
38
|
+
const TEE = "├──";
|
|
39
|
+
const ELBOW = "└──";
|
|
40
|
+
// The rail/branch occupy 3 columns; item text hangs beside them, aligned under the
|
|
41
|
+
// header content and never spilling left into the marker gutter.
|
|
42
|
+
const RAIL_INDENT = 3;
|
|
43
|
+
const AGENT_COLOR = KIND_COLOR.agent;
|
|
44
|
+
export function SubagentView({ agents, done, columns, tightTop, }) {
|
|
45
|
+
if (agents.length === 0)
|
|
46
|
+
return null;
|
|
47
|
+
const anyError = agents.some((a) => a.status === "error");
|
|
48
|
+
const dotColor = anyError ? ERROR_COLOR : AGENT_COLOR;
|
|
49
|
+
return (_jsxs(Box, { marginTop: tightTop ? 0 : 1, flexDirection: "column", children: [_jsxs(Box, { flexDirection: "row", children: [_jsx(Box, { minWidth: 2, children: _jsx(Text, { color: dotColor, dimColor: !done, children: DIAMOND }) }), agents.length === 1 ? (_jsx(SoloHeader, { agent: agents[0], columns: columns, color: dotColor })) : (_jsxs(_Fragment, { children: [_jsx(Text, { bold: true, color: dotColor, children: "Subagents" }), _jsx(Text, { dimColor: true, children: ` · ${agents.length} delegated` })] }))] }), agents.length === 1 ? (_jsx(SoloBody, { agent: agents[0], columns: columns, done: done })) : (_jsx(Topology, { agents: agents, columns: columns }))] }));
|
|
50
|
+
}
|
|
51
|
+
/** One worker's header: its identity and the task it was given. */
|
|
52
|
+
function SoloHeader({ agent, columns, color }) {
|
|
53
|
+
const taskLabel = clip(agent.task, Math.max(16, columns - 22));
|
|
54
|
+
return (_jsxs(_Fragment, { children: [_jsx(Text, { bold: true, color: color, children: "Subagent" }), agent.readOnly ? _jsx(Text, { dimColor: true, children: " \u00B7 read-only" }) : null, taskLabel ? _jsxs(Text, { dimColor: true, children: [" ", taskLabel] }) : null] }));
|
|
55
|
+
}
|
|
56
|
+
/** One worker's live rail: every call it makes, then its closing line. */
|
|
57
|
+
function SoloBody({ agent, columns, done }) {
|
|
58
|
+
const content = Math.max(8, columns - RAIL_INDENT - 1);
|
|
59
|
+
const errored = agent.status === "error";
|
|
60
|
+
return (_jsxs(Box, { flexDirection: "column", children: [collapseAdjacent(agent.items).map((row) => (_jsxs(Box, { flexDirection: "row", width: columns, children: [_jsx(Text, { color: AGENT_COLOR, dimColor: true, children: ` ${RAIL} ` }), _jsx(Box, { width: content, children: _jsxs(Text, { color: row.anyError ? "red" : undefined, dimColor: !row.anyError, wrap: "truncate-end", children: [row.label, row.count > 1 ? ` ×${row.count}` : ""] }) })] }, row.item.toolId))), done && agent.summary ? (_jsxs(Box, { flexDirection: "row", width: columns, children: [_jsx(Text, { dimColor: true, children: ` ${BRANCH} ` }), _jsx(Box, { width: content, children: _jsx(Text, { color: errored ? "red" : undefined, dimColor: !errored, wrap: "truncate-end", children: agent.summary }) })] })) : null] }));
|
|
61
|
+
}
|
|
62
|
+
/** Several workers as a tree: one branch each, task on the branch, progress under it. */
|
|
63
|
+
function Topology({ agents, columns }) {
|
|
64
|
+
return (_jsx(Box, { flexDirection: "column", children: agents.map((agent, i) => {
|
|
65
|
+
const last = i === agents.length - 1;
|
|
66
|
+
const errored = agent.status === "error";
|
|
67
|
+
// A worker still going is described by what it has DONE so far, since its
|
|
68
|
+
// closing summary does not exist yet — otherwise a running branch says nothing
|
|
69
|
+
// and reads as stalled.
|
|
70
|
+
const steps = agent.items.length;
|
|
71
|
+
const progress = agent.summary
|
|
72
|
+
? agent.summary
|
|
73
|
+
: `working${steps > 0 ? ` · ${steps} step${steps === 1 ? "" : "s"}` : ""}`;
|
|
74
|
+
const label = `#${i + 1}${agent.readOnly ? " · read-only" : ""}`;
|
|
75
|
+
const taskWidth = Math.max(8, columns - 8 - label.length);
|
|
76
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { flexDirection: "row", width: columns, children: [_jsx(Text, { color: AGENT_COLOR, dimColor: true, children: ` ${last ? ELBOW : TEE} ` }), _jsx(Text, { bold: true, color: errored ? ERROR_COLOR : AGENT_COLOR, children: label }), _jsx(Box, { width: taskWidth, children: _jsxs(Text, { dimColor: true, wrap: "truncate-end", children: [" ", clip(agent.task, taskWidth)] }) })] }), _jsxs(Box, { flexDirection: "row", width: columns, children: [_jsx(Text, { color: AGENT_COLOR, dimColor: true, children: ` ${last ? " " : RAIL} ${BRANCH} ` }), _jsx(Box, { width: Math.max(8, columns - 12), children: _jsx(Text, { color: errored ? "red" : undefined, dimColor: !errored, wrap: "truncate-end", children: progress }) })] })] }, agent.agentId));
|
|
77
|
+
}) }));
|
|
78
|
+
}
|
|
79
|
+
/** Flatten and clip a task to one short line for a header. */
|
|
80
|
+
function clip(s, max) {
|
|
81
|
+
const flat = s.replace(/\s+/g, " ").trim();
|
|
82
|
+
if (max <= 1)
|
|
83
|
+
return "";
|
|
84
|
+
return flat.length <= max ? flat : flat.slice(0, max - 1) + "…";
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=SubagentView.js.map
|