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,100 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* ApprovalBox — the bordered prompt for a decision the agent cannot make alone.
|
|
4
|
+
*
|
|
5
|
+
* ┌──────────────────────────────────────────────┐
|
|
6
|
+
* │ Start on this? │
|
|
7
|
+
* │ │
|
|
8
|
+
* │ › [1] Approve — Lightning (just do it) │
|
|
9
|
+
* │ [2] Approve — Sentinel (ask each action) │
|
|
10
|
+
* │ [3] Reject │
|
|
11
|
+
* │ │
|
|
12
|
+
* │ ↑/↓ or 1-3 · Enter to choose · Esc to cancel │
|
|
13
|
+
* └──────────────────────────────────────────────┘
|
|
14
|
+
*
|
|
15
|
+
* Separate from `Picker` on purpose. A picker is a LIST you scroll — sessions, models,
|
|
16
|
+
* shells — and it is fine for it to look like one. This is a QUESTION with two to four
|
|
17
|
+
* answers, it arrives unbidden in the middle of the user's work, and the answer commits
|
|
18
|
+
* them to something (running a command, starting a plan). It gets a border so it reads
|
|
19
|
+
* as a stop rather than as more output, and blank lines above and below the choices so
|
|
20
|
+
* the thing being agreed to does not blur into the thing agreeing to it.
|
|
21
|
+
*
|
|
22
|
+
* Number keys are accepted as well as arrows, because this prompt is a decision the
|
|
23
|
+
* user wants over with, not a list to browse. They are numbers rather than per-answer
|
|
24
|
+
* letters ([y]/[a]/[n]) so the accelerator can never disagree with the wording — the
|
|
25
|
+
* answers are supplied by the caller and change from prompt to prompt.
|
|
26
|
+
*
|
|
27
|
+
* HEIGHT IS BOUNDED, and that is not cosmetic. This draws in the footer, and anything
|
|
28
|
+
* there that grows past the terminal's height makes Ink abandon its erase-and-redraw:
|
|
29
|
+
* the screen tears, the input box is pushed off, and the app looks frozen with no way
|
|
30
|
+
* to answer. That is a bug this project has already shipped once — see clipRows.
|
|
31
|
+
*/
|
|
32
|
+
import { useState } from "react";
|
|
33
|
+
import { Box, Text, useInput } from "ink";
|
|
34
|
+
import { clipRows } from "../wrap.js";
|
|
35
|
+
/** Rows the question may occupy before it is cut (wrapping included). */
|
|
36
|
+
const MAX_QUESTION_ROWS = 4;
|
|
37
|
+
/** Answers shown. More than this and the caller is asking the wrong question. */
|
|
38
|
+
const MAX_CHOICES = 6;
|
|
39
|
+
export function ApprovalBox({ question, options, onSelect, onCancel, width, active = true, freeText, onSubmitText, maxRows = MAX_QUESTION_ROWS + MAX_CHOICES, }) {
|
|
40
|
+
const shown = options.slice(0, MAX_CHOICES);
|
|
41
|
+
// The typed row sits at the end of the same list, so `sel === shown.length` means it.
|
|
42
|
+
const rows = freeText ? shown.length + 1 : shown.length;
|
|
43
|
+
const [sel, setSel] = useState(0);
|
|
44
|
+
const [typed, setTyped] = useState("");
|
|
45
|
+
const onText = freeText !== undefined && sel === shown.length;
|
|
46
|
+
useInput((input, key) => {
|
|
47
|
+
// Arrows always move, even while typing: it is the only way back out of the
|
|
48
|
+
// field, and a text answer nobody can escape from would be a trap.
|
|
49
|
+
if (key.upArrow)
|
|
50
|
+
setSel((s) => (s - 1 + rows) % rows);
|
|
51
|
+
else if (key.downArrow)
|
|
52
|
+
setSel((s) => (s + 1) % rows);
|
|
53
|
+
else if (key.escape)
|
|
54
|
+
onCancel();
|
|
55
|
+
else if (onText) {
|
|
56
|
+
// Text mode. Enter submits what was typed; an empty field is not an answer,
|
|
57
|
+
// so it does nothing rather than sending "".
|
|
58
|
+
if (key.return) {
|
|
59
|
+
const text = typed.trim();
|
|
60
|
+
if (text)
|
|
61
|
+
onSubmitText?.(text);
|
|
62
|
+
}
|
|
63
|
+
else if (key.backspace || key.delete)
|
|
64
|
+
setTyped((t) => t.slice(0, -1));
|
|
65
|
+
// Ink reports paste and ordinary keys the same way. Control bytes are dropped
|
|
66
|
+
// so a stray escape sequence cannot end up inside the answer.
|
|
67
|
+
else if (input)
|
|
68
|
+
setTyped((t) => t + input.replace(/[\u0000-\u001f]/g, ""));
|
|
69
|
+
}
|
|
70
|
+
else if (key.return)
|
|
71
|
+
onSelect(sel);
|
|
72
|
+
else {
|
|
73
|
+
// A number picks AND commits in one keystroke. Selecting without confirming
|
|
74
|
+
// would make the fast path silently need a second key.
|
|
75
|
+
const n = Number.parseInt(input, 10);
|
|
76
|
+
if (Number.isInteger(n) && n >= 1 && n <= shown.length)
|
|
77
|
+
onSelect(n - 1);
|
|
78
|
+
}
|
|
79
|
+
}, { isActive: active && rows > 0 });
|
|
80
|
+
// Inside the border: two frame columns and one padding column each side.
|
|
81
|
+
const inner = Math.max(12, width - 4);
|
|
82
|
+
// The box holds maxRows+2 content rows; the answers (and freeText row), one blank above
|
|
83
|
+
// and below, and the hint take `rows + 3`, so the question gets whatever is left — always
|
|
84
|
+
// at least one line, never more than its own cap. The answers are never hidden.
|
|
85
|
+
const qMax = Math.max(1, Math.min(MAX_QUESTION_ROWS, maxRows - 1 - rows));
|
|
86
|
+
const questionRows = clipRows(question, inner, qMax);
|
|
87
|
+
// Content only — the border is the ONE shared menu box in PromptInput (the same box the
|
|
88
|
+
// `/` command menu, the pickers and the key manager use), so an approval reads as the
|
|
89
|
+
// same surface. It still reads as a stop because that box is bordered and the input above
|
|
90
|
+
// goes inert while it is open. flexShrink:0 on every row for the same reason the command
|
|
91
|
+
// palette has it: without it Yoga compresses an overfull box instead of leaving it at its
|
|
92
|
+
// real height, and the height is what the footer measurement depends on.
|
|
93
|
+
return (_jsxs(_Fragment, { children: [questionRows.map((line, i) => (_jsx(Box, { flexShrink: 0, children: _jsx(Text, { bold: true, wrap: "truncate-end", children: line }) }, `q${i}`))), _jsx(Box, { flexShrink: 0, children: _jsx(Text, { children: " " }) }), shown.map((label, i) => {
|
|
94
|
+
const on = i === sel;
|
|
95
|
+
return (_jsxs(Box, { width: inner, flexShrink: 0, children: [_jsxs(Text, { color: on ? "cyan" : undefined, bold: on, children: [on ? " › " : " ", `[${i + 1}] `] }), _jsx(Box, { width: Math.max(4, inner - 7), children: _jsx(Text, { color: on ? "cyan" : undefined, bold: on, wrap: "truncate-end", children: label }) })] }, i));
|
|
96
|
+
}), freeText ? (_jsxs(Box, { width: inner, flexShrink: 0, children: [_jsxs(Text, { color: onText ? "cyan" : undefined, bold: onText, children: [onText ? " › " : " ", `[${shown.length + 1}] `] }), _jsx(Box, { width: Math.max(4, inner - 7), children: _jsx(Text, { color: onText ? "cyan" : undefined, bold: onText, wrap: "truncate-end", children: onText ? `${freeText.label}: ${typed}█` : freeText.label }) })] })) : null, _jsx(Box, { flexShrink: 0, children: _jsx(Text, { children: " " }) }), _jsx(Box, { flexShrink: 0, children: _jsx(Text, { dimColor: true, wrap: "truncate-end", children: onText
|
|
97
|
+
? `type your answer · Enter to send · ↑/↓ to go back · Esc to cancel`
|
|
98
|
+
: `↑/↓ or 1-${shown.length} · Enter to choose · Esc to cancel` }) })] }));
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=ApprovalBox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApprovalBox.js","sourceRoot":"","sources":["../../../src/cli/components/ApprovalBox.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,yEAAyE;AACzE,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAC5B,iFAAiF;AACjF,MAAM,WAAW,GAAG,CAAC,CAAC;AAgCtB,MAAM,UAAU,WAAW,CAAC,EAC1B,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,MAAM,GAAG,IAAI,EACb,QAAQ,EACR,YAAY,EACZ,OAAO,GAAG,iBAAiB,GAAG,WAAW,GACxB;IACjB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IAC5C,sFAAsF;IACtF,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;IACxD,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,QAAQ,KAAK,SAAS,IAAI,GAAG,KAAK,KAAK,CAAC,MAAM,CAAC;IAE9D,QAAQ,CACN,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACb,4EAA4E;QAC5E,mEAAmE;QACnE,IAAI,GAAG,CAAC,OAAO;YAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;aACjD,IAAI,GAAG,CAAC,SAAS;YAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;aACjD,IAAI,GAAG,CAAC,MAAM;YAAE,QAAQ,EAAE,CAAC;aAC3B,IAAI,MAAM,EAAE,CAAC;YAChB,4EAA4E;YAC5E,6CAA6C;YAC7C,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBACf,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC1B,IAAI,IAAI;oBAAE,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC;YACjC,CAAC;iBAAM,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM;gBAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACxE,8EAA8E;YAC9E,8DAA8D;iBACzD,IAAI,KAAK;gBAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7E,CAAC;aAAM,IAAI,GAAG,CAAC,MAAM;YAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;aAChC,CAAC;YACJ,4EAA4E;YAC5E,uDAAuD;YACvD,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACrC,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM;gBAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC,EACD,EAAE,QAAQ,EAAE,MAAM,IAAI,IAAI,GAAG,CAAC,EAAE,CACjC,CAAC;IAEF,yEAAyE;IACzE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IACtC,wFAAwF;IACxF,0FAA0F;IAC1F,gFAAgF;IAChF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAC1E,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAErD,wFAAwF;IACxF,sFAAsF;IACtF,0FAA0F;IAC1F,yFAAyF;IACzF,0FAA0F;IAC1F,yEAAyE;IACzE,OAAO,CACL,8BACG,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAC7B,KAAC,GAAG,IAAe,UAAU,EAAE,CAAC,YAC9B,KAAC,IAAI,IAAC,IAAI,QAAC,IAAI,EAAC,cAAc,YAAE,IAAI,GAAQ,IADpC,IAAI,CAAC,EAAE,CAEX,CACP,CAAC,EAEF,KAAC,GAAG,IAAC,UAAU,EAAE,CAAC,YAAE,KAAC,IAAI,oBAAS,GAAM,EAEvC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;gBACtB,MAAM,EAAE,GAAG,CAAC,KAAK,GAAG,CAAC;gBACrB,OAAO,CACL,MAAC,GAAG,IAAS,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,aACtC,MAAC,IAAI,IAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,aAC3C,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAClB,IAAI,CAAC,GAAG,CAAC,IAAI,IACT,EACP,KAAC,GAAG,IAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,YAChC,KAAC,IAAI,IAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAC,cAAc,YAChE,KAAK,GACD,GACH,KATE,CAAC,CAUL,CACP,CAAC;YACJ,CAAC,CAAC,EAED,QAAQ,CAAC,CAAC,CAAC,CACV,MAAC,GAAG,IAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,aAC9B,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,aACnD,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EACtB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,IACpB,EACP,KAAC,GAAG,IAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,YAChC,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAC,cAAc,YAIxE,MAAM,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,GACpD,GACH,IACF,CACP,CAAC,CAAC,CAAC,IAAI,EAER,KAAC,GAAG,IAAC,UAAU,EAAE,CAAC,YAAE,KAAC,IAAI,oBAAS,GAAM,EAExC,KAAC,GAAG,IAAC,UAAU,EAAE,CAAC,YAChB,KAAC,IAAI,IAAC,QAAQ,QAAC,IAAI,EAAC,cAAc,YAC/B,MAAM;wBACL,CAAC,CAAC,mEAAmE;wBACrE,CAAC,CAAC,YAAY,KAAK,CAAC,MAAM,oCAAoC,GAC3D,GACH,IACL,CACJ,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* BlockView — render one transcript block, the same whether committed (in
|
|
4
|
+
* <Static> scrollback) or live in the tail. Gutter-aligned: the
|
|
5
|
+
* first row of every block is a single marker in a 2-col gutter, the content
|
|
6
|
+
* breathing beside it and wrapped lines hanging under the content.
|
|
7
|
+
*
|
|
8
|
+
* Multi-line text is wrapped BY US (wrap.ts), not left to Ink's own
|
|
9
|
+
* `wrap="wrap"` — that has a real, reproduced bug where some continuation
|
|
10
|
+
* lines come out indented by a stray leading space and others on the exact
|
|
11
|
+
* same text don't (see wrap.ts's header comment for the proof). Wrapping
|
|
12
|
+
* ourselves and rendering one <Text> per finished line leaves nothing for
|
|
13
|
+
* Ink's wrapper to be inconsistent about.
|
|
14
|
+
*/
|
|
15
|
+
import { memo } from "react";
|
|
16
|
+
import { Box, Text } from "ink";
|
|
17
|
+
import { renderMarkdown } from "../markdown.js";
|
|
18
|
+
import { wrapAnsi } from "../wrap.js";
|
|
19
|
+
import { KIND_COLOR } from "../toolDisplay.js";
|
|
20
|
+
import { compactionLines } from "../compaction.js";
|
|
21
|
+
import { ToolLine } from "./ToolLine.js";
|
|
22
|
+
import { ToolGroup } from "./ToolGroup.js";
|
|
23
|
+
import { SubagentView } from "./SubagentView.js";
|
|
24
|
+
/**
|
|
25
|
+
* Text pre-wrapped to `width`, one <Text> row per line — see the file header.
|
|
26
|
+
*
|
|
27
|
+
* A blank line is rendered as a single space, not as "". Ink's `measureText`
|
|
28
|
+
* (`ink/build/measure-text.js`) returns `height: 0` for an empty string, so an empty
|
|
29
|
+
* <Text> occupies no row at all and every blank line in the markdown disappears —
|
|
30
|
+
* which is what turned structured answers into one undifferentiated wall. The
|
|
31
|
+
* separators were being produced correctly by renderMarkdown and thrown away here.
|
|
32
|
+
* Probed: rows ["A","","B"] render as ["A","B"] with "", as ["A","","B"] with " ".
|
|
33
|
+
*/
|
|
34
|
+
function WrappedText({ text, width, color }) {
|
|
35
|
+
return (_jsx(Box, { width: width, flexDirection: "column", children: wrapAnsi(text, width).map((line, i) => (_jsx(Text, { color: color, wrap: "truncate-end", children: line === "" ? " " : line }, i))) }));
|
|
36
|
+
}
|
|
37
|
+
function BlockViewInner({ block, columns, tightTop }) {
|
|
38
|
+
const textWidth = Math.max(8, columns - 4);
|
|
39
|
+
switch (block.kind) {
|
|
40
|
+
case "user":
|
|
41
|
+
return (_jsxs(Box, { marginTop: 1, flexDirection: "row", children: [_jsx(Box, { minWidth: 2, children: _jsx(Text, { color: "cyan", children: ">" }) }), _jsx(WrappedText, { text: block.text, width: textWidth, color: "cyan" })] }));
|
|
42
|
+
case "assistant": {
|
|
43
|
+
if (!block.text)
|
|
44
|
+
return null;
|
|
45
|
+
// Prose runs to the same width as everything else on screen.
|
|
46
|
+
//
|
|
47
|
+
// It used to be capped at 88 columns on a typographic argument: past roughly
|
|
48
|
+
// that, the eye starts losing its place on the return sweep. The argument is
|
|
49
|
+
// real for a page of body text and wrong for this. A terminal is a pane the
|
|
50
|
+
// reader sized deliberately, and the answer sat in a narrow column with a third
|
|
51
|
+
// of the window empty beside it, which reads as broken rather than considered.
|
|
52
|
+
// Widening the window should give you more room, not more margin.
|
|
53
|
+
const proseWidth = textWidth;
|
|
54
|
+
return (_jsxs(Box, { marginTop: 1, flexDirection: "row", children: [_jsx(Box, { minWidth: 2, children: _jsx(Text, { children: "●" }) }), _jsx(WrappedText, { text: renderMarkdown(block.text, proseWidth), width: proseWidth })] }));
|
|
55
|
+
}
|
|
56
|
+
case "tool":
|
|
57
|
+
return (_jsx(ToolLine, { name: block.name, arg: block.arg, status: block.status, action: block.action, summary: block.summary, detail: block.detail, detailKind: block.detailKind, meta: block.meta, columns: columns, live: block.live, tightTop: tightTop }));
|
|
58
|
+
case "tools":
|
|
59
|
+
return _jsx(ToolGroup, { items: block.items, live: block.live, columns: columns, tightTop: tightTop });
|
|
60
|
+
case "subagent":
|
|
61
|
+
return (_jsx(SubagentView, { agents: block.agents, done: block.done, columns: columns, tightTop: tightTop }));
|
|
62
|
+
case "error":
|
|
63
|
+
return (_jsxs(Box, { marginTop: 1, flexDirection: "row", children: [_jsx(Box, { minWidth: 2, children: _jsx(Text, { color: "red", children: "●" }) }), _jsx(WrappedText, { text: block.text, width: textWidth, color: "red" })] }));
|
|
64
|
+
case "completion":
|
|
65
|
+
return (_jsxs(Box, { marginTop: 1, flexDirection: "row", children: [_jsx(Box, { minWidth: 2, children: _jsx(Text, { dimColor: true, children: "✻" }) }), _jsx(Text, { dimColor: true, children: block.text })] }));
|
|
66
|
+
case "note": {
|
|
67
|
+
const noteLines = wrapAnsi(block.text, Math.max(4, columns - 2));
|
|
68
|
+
return (_jsx(Box, { width: columns, flexDirection: "column", children: noteLines.map((line, i) => (_jsxs(Text, { dimColor: true, children: [i === 0 ? "· " : " ", line] }, i))) }));
|
|
69
|
+
}
|
|
70
|
+
case "notice": {
|
|
71
|
+
// A gate, not a remark. Amber marker and a rail, so "you are about to run this"
|
|
72
|
+
// cannot be mistaken for the assistant's own ● prose and skimmed past. Lines are
|
|
73
|
+
// rendered verbatim — no markdown — because they are literal commands and paths
|
|
74
|
+
// where a stray backtick or underscore must not be reinterpreted.
|
|
75
|
+
const railWidth = Math.max(8, columns - 4);
|
|
76
|
+
return (_jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsxs(Box, { flexDirection: "row", children: [_jsx(Box, { minWidth: 2, children: _jsx(Text, { color: KIND_COLOR.governor, children: "●" }) }), _jsx(Text, { bold: true, children: block.title })] }), block.body.split("\n").flatMap((line, i) => wrapAnsi(line, railWidth).map((row, j) => (_jsxs(Box, { flexDirection: "row", width: columns, children: [_jsx(Text, { color: KIND_COLOR.governor, dimColor: true, children: " │ " }), _jsx(Box, { width: railWidth, children: _jsx(Text, { wrap: "truncate-end", children: row }) })] }, `${i}-${j}`))))] }));
|
|
77
|
+
}
|
|
78
|
+
case "compaction": {
|
|
79
|
+
// The bars are pre-composed as plain rows (compaction.ts) so the layout is
|
|
80
|
+
// testable without a terminal. Each row is printed verbatim and truncated, never
|
|
81
|
+
// wrapped: half a progress bar on the next line reads as two broken bars.
|
|
82
|
+
const rows = compactionLines(block.report, columns - 2);
|
|
83
|
+
return (_jsx(Box, { marginTop: 1, marginBottom: 1, flexDirection: "column", width: columns, children: rows.map((line, i) => (_jsxs(Text, { dimColor: i !== 1, wrap: "truncate-end", children: [" ", line] }, i))) }));
|
|
84
|
+
}
|
|
85
|
+
case "context":
|
|
86
|
+
// Context trimming (compaction) — set off from ordinary activity with its own
|
|
87
|
+
// faint marker and italics, so it reads as housekeeping, not something Mindweave did.
|
|
88
|
+
return (_jsx(Box, { marginTop: 1, marginBottom: 1, width: columns, children: _jsxs(Text, { dimColor: true, italic: true, wrap: "truncate-end", children: ["⋯ ", block.text] }) }));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* MEMOIZED, and this is the single most load-bearing line in the UI's performance.
|
|
93
|
+
*
|
|
94
|
+
* Ink re-renders the WHOLE component tree on every React state change — there is no
|
|
95
|
+
* partial update, and after the commit it erases the drawn lines and rewrites them.
|
|
96
|
+
* Every keystroke is a state change (the prompt's reducer), and so is every wheel
|
|
97
|
+
* tick (`scrollUp`). Without this wrapper each of those re-ran `renderMarkdown` and
|
|
98
|
+
* `wrapAnsi` from scratch for EVERY block on screen, then handed Yoga a fresh tree to
|
|
99
|
+
* lay out.
|
|
100
|
+
*
|
|
101
|
+
* Measured, on a realistic assistant reply, before this landed:
|
|
102
|
+
*
|
|
103
|
+
* | blocks | text work per keystroke |
|
|
104
|
+
* |--------|-------------------------|
|
|
105
|
+
* | 30 | 17.9 ms |
|
|
106
|
+
* | 80 | 47.7 ms |
|
|
107
|
+
* | 150 | 89.4 ms |
|
|
108
|
+
*
|
|
109
|
+
* — and that is BEFORE layout and redraw, against Ink's 32ms frame throttle. It is
|
|
110
|
+
* why typing got slower the longer the conversation ran, why scrolling stuttered, and
|
|
111
|
+
* why a tool block "popped" instead of appearing cleanly: it was landing inside a
|
|
112
|
+
* frame that took ~90ms to draw.
|
|
113
|
+
*
|
|
114
|
+
* The reason a plain shallow compare is CORRECT here, rather than a lucky shortcut:
|
|
115
|
+
* the transcript reducer never rebuilds a block that did not change. `commit` concats,
|
|
116
|
+
* `patch` maps and returns `b` untouched unless the id matches, and `endTurn`'s `clear`
|
|
117
|
+
* returns `b` itself for everything except a live tool row. So block identity is stable
|
|
118
|
+
* across renders by construction, and the one moment a committed row is allowed to
|
|
119
|
+
* change (`live` flipping at turn end) DOES produce a new object and so DOES re-render.
|
|
120
|
+
* `columns` and `tightTop` are primitives. Nothing here is a fresh object or closure
|
|
121
|
+
* per render, which is the usual reason `memo` silently does nothing.
|
|
122
|
+
*
|
|
123
|
+
* If a future block type is given a prop that is built inline at the call site (an
|
|
124
|
+
* array, an object, a callback), this optimization is dead and the lag returns with no
|
|
125
|
+
* test failing. Keep the props primitive-or-stable.
|
|
126
|
+
*/
|
|
127
|
+
export const BlockView = memo(BlockViewInner);
|
|
128
|
+
//# sourceMappingURL=BlockView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BlockView.js","sourceRoot":"","sources":["../../../src/cli/components/BlockView.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* FirstRunFrame.tsx — the shell the two first-run screens sit in.
|
|
4
|
+
*
|
|
5
|
+
* They are the only screens that own the whole terminal, because there is no
|
|
6
|
+
* conversation behind them yet. Left as plain columns they pinned themselves to the top
|
|
7
|
+
* of an otherwise empty window, which reads like output that has scrolled rather than a
|
|
8
|
+
* thing asking for an answer.
|
|
9
|
+
*
|
|
10
|
+
* So the content is CENTRED vertically, and given a title block that says what this is,
|
|
11
|
+
* which version it is, and — on the very first launch — a few things worth knowing. That
|
|
12
|
+
* last part is not decoration: someone who has just installed a terminal agent has no
|
|
13
|
+
* idea what to type, and the moment they are asked for a key is the only moment they are
|
|
14
|
+
* definitely reading.
|
|
15
|
+
*
|
|
16
|
+
* Everything is bounded. A short terminal falls back to top-aligned rather than clipping
|
|
17
|
+
* the middle of a screen the user has to interact with.
|
|
18
|
+
*/
|
|
19
|
+
import { Box, Text } from "ink";
|
|
20
|
+
/** Below this many rows, centring costs more than it gives. */
|
|
21
|
+
const MIN_ROWS_TO_CENTRE = 24;
|
|
22
|
+
export function FirstRunFrame({ rows, version, subtitle, tips, children }) {
|
|
23
|
+
const centred = rows >= MIN_ROWS_TO_CENTRE;
|
|
24
|
+
const justify = centred ? "center" : "flex-start";
|
|
25
|
+
return (_jsxs(Box, { flexDirection: "column", height: rows, justifyContent: justify, paddingX: 2, children: [_jsxs(Box, { flexShrink: 0, children: [_jsx(Text, { bold: true, color: "yellow", children: "Mindweave 1" }), _jsx(Text, { dimColor: true, children: version })] }), subtitle ? (_jsx(Box, { flexShrink: 0, marginTop: 1, children: _jsx(Text, { children: subtitle }) })) : null, _jsx(Box, { flexShrink: 0, marginTop: 1, flexDirection: "column", children: children }), tips && tips.length > 0 ? (_jsx(Box, { flexShrink: 0, marginTop: 1, flexDirection: "column", children: tips.map((t) => (_jsx(Text, { dimColor: true, wrap: "truncate-end", children: ` ${t}` }, t))) })) : null] }));
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* What a brand-new user is told while they are pasting a key.
|
|
29
|
+
*
|
|
30
|
+
* Four lines, because this is the one moment they are certainly reading and the one
|
|
31
|
+
* thing they cannot do yet is ask. Each is something you would otherwise have to go
|
|
32
|
+
* looking for: how to see everything, how to stop, where the modes are, and that nothing
|
|
33
|
+
* leaves the machine.
|
|
34
|
+
*/
|
|
35
|
+
export const FIRST_RUN_TIPS = [
|
|
36
|
+
"/help lists every command · @file adds a file to the conversation",
|
|
37
|
+
"shift+tab switches mode: auto-accept, plan, or ask before each action",
|
|
38
|
+
"Esc stops whatever is running · /undo rolls back file changes",
|
|
39
|
+
"Your keys and your code stay on this machine.",
|
|
40
|
+
];
|
|
41
|
+
//# sourceMappingURL=FirstRunFrame.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FirstRunFrame.js","sourceRoot":"","sources":["../../../src/cli/components/FirstRunFrame.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAiB,MAAM,KAAK,CAAC;AAG/C,+DAA+D;AAC/D,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAc9B,MAAM,UAAU,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAsB;IAC3F,MAAM,OAAO,GAAG,IAAI,IAAI,kBAAkB,CAAC;IAC3C,MAAM,OAAO,GAA+B,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC;IAC9E,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,aAC5E,MAAC,GAAG,IAAC,UAAU,EAAE,CAAC,aAChB,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,QAAQ,4BAAmB,EAC5C,KAAC,IAAI,IAAC,QAAQ,kBAAE,OAAO,GAAQ,IAC3B,EACL,QAAQ,CAAC,CAAC,CAAC,CACV,KAAC,GAAG,IAAC,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,YAC9B,KAAC,IAAI,cAAE,QAAQ,GAAQ,GACnB,CACP,CAAC,CAAC,CAAC,IAAI,EACR,KAAC,GAAG,IAAC,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ,YACrD,QAAQ,GACL,EACL,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACzB,KAAC,GAAG,IAAC,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ,YACrD,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACf,KAAC,IAAI,IAAS,QAAQ,QAAC,IAAI,EAAC,cAAc,YAAE,KAAK,CAAC,EAAE,IAAzC,CAAC,CAAgD,CAC7D,CAAC,GACE,CACP,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,mEAAmE;IACnE,uEAAuE;IACvE,+DAA+D;IAC/D,+CAA+C;CAChD,CAAC"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* KeyManager.tsx — what /key shows.
|
|
4
|
+
*
|
|
5
|
+
* A FOOTER OVERLAY, not a screen: it sits where the prompt sits, the conversation stays
|
|
6
|
+
* visible above it, and it is only as tall as it needs to be. Taking the whole terminal
|
|
7
|
+
* to change a setting is the wrong weight and leaves nothing to come back to.
|
|
8
|
+
*
|
|
9
|
+
* Three levels, drilling in. PROVIDERS, then that provider's KEYS with an "add another"
|
|
10
|
+
* that never runs out, then what can be done to one key. The first version was a flat
|
|
11
|
+
* list of every key across every provider, which buried the thing people came to do.
|
|
12
|
+
*
|
|
13
|
+
* Esc always goes back one level, INCLUDING while typing a key — a field that can only
|
|
14
|
+
* be left by submitting nothing is a trap.
|
|
15
|
+
*/
|
|
16
|
+
import { Box, Text, useInput } from "ink";
|
|
17
|
+
import TextInput from "ink-text-input";
|
|
18
|
+
import { useState } from "react";
|
|
19
|
+
import { stripMouse } from "../mouse.js";
|
|
20
|
+
import { ACTION_ACTIVATE, ACTION_BACK, ACTION_EDIT, ACTION_REMOVE, ACTION_SHOW, actionsFor, countLabel, } from "../keyManager.js";
|
|
21
|
+
/** Rows visible at once. The footer is height-bounded; this is not a screen. */
|
|
22
|
+
const WINDOW = 7;
|
|
23
|
+
export function KeyManager({ providers, keysOf, nextSlot, reveal, width, onActivate, onSave, onRemove, onClose, active = true, startProvider = null, maxRows = WINDOW, }) {
|
|
24
|
+
// Rows for the list: the box holds maxRows+2 content rows; the title and the hint (which
|
|
25
|
+
// carries a blank top margin, so two rows) take three, leaving maxRows - 1 for the list
|
|
26
|
+
// (never fewer than 2). It scrolls when there are more; the box never grows.
|
|
27
|
+
const win = Math.max(2, Math.min(WINDOW, maxRows - 1));
|
|
28
|
+
const [mode, setMode] = useState(() => {
|
|
29
|
+
// Same drill-in the provider list does on Enter: an empty provider goes straight to
|
|
30
|
+
// the field, one with keys goes to its key list.
|
|
31
|
+
if (startProvider) {
|
|
32
|
+
const slot = nextSlot(startProvider);
|
|
33
|
+
if (startProvider.count === 0 && slot !== null)
|
|
34
|
+
return { kind: "enter", provider: startProvider, slot, replacing: false };
|
|
35
|
+
return { kind: "keys", provider: startProvider };
|
|
36
|
+
}
|
|
37
|
+
return { kind: "providers" };
|
|
38
|
+
});
|
|
39
|
+
const [sel, setSel] = useState(0);
|
|
40
|
+
const [value, setValue] = useState("");
|
|
41
|
+
const [shown, setShown] = useState(null);
|
|
42
|
+
const keys = mode.kind === "keys" || mode.kind === "actions" ? keysOf(mode.provider) : [];
|
|
43
|
+
const actions = mode.kind === "actions" ? actionsFor(mode.row, keys.length) : [];
|
|
44
|
+
// "Add a new key" is one more row after the keys, and it is there however many there
|
|
45
|
+
// already are — that is what makes adding a second, or a fifth, obvious.
|
|
46
|
+
const canAdd = mode.kind === "keys" ? nextSlot(mode.provider) !== null : false;
|
|
47
|
+
const count = mode.kind === "providers"
|
|
48
|
+
? providers.length
|
|
49
|
+
: mode.kind === "keys"
|
|
50
|
+
? keys.length + (canAdd ? 1 : 0)
|
|
51
|
+
: mode.kind === "actions"
|
|
52
|
+
? actions.length
|
|
53
|
+
: 0;
|
|
54
|
+
function back() {
|
|
55
|
+
setShown(null);
|
|
56
|
+
setValue("");
|
|
57
|
+
setSel(0);
|
|
58
|
+
if (mode.kind === "providers")
|
|
59
|
+
onClose();
|
|
60
|
+
else if (mode.kind === "keys")
|
|
61
|
+
setMode({ kind: "providers" });
|
|
62
|
+
else
|
|
63
|
+
setMode({ kind: "keys", provider: mode.provider });
|
|
64
|
+
}
|
|
65
|
+
useInput((input, key) => {
|
|
66
|
+
if (key.escape)
|
|
67
|
+
return back();
|
|
68
|
+
// Backspace and Delete step back exactly as Escape does. Deleting what you just chose
|
|
69
|
+
// is the instinctive way out, and while a list is showing there is nothing else those
|
|
70
|
+
// keys could mean; in the entry field they belong to the key being typed, and while a
|
|
71
|
+
// list is empty stepping back is the only thing left to do.
|
|
72
|
+
if ((key.backspace || key.delete) && mode.kind !== "enter")
|
|
73
|
+
return back();
|
|
74
|
+
if (mode.kind === "enter" || count === 0)
|
|
75
|
+
return;
|
|
76
|
+
if (key.upArrow)
|
|
77
|
+
setSel((s) => (s - 1 + count) % count);
|
|
78
|
+
else if (key.downArrow)
|
|
79
|
+
setSel((s) => (s + 1) % count);
|
|
80
|
+
else if (key.return)
|
|
81
|
+
commit(sel);
|
|
82
|
+
else {
|
|
83
|
+
// One keypress commits, so only single digits ever arrive here.
|
|
84
|
+
const n = Number.parseInt(input, 10);
|
|
85
|
+
if (Number.isInteger(n) && n >= 1 && n <= Math.min(9, count))
|
|
86
|
+
commit(n - 1);
|
|
87
|
+
}
|
|
88
|
+
}, { isActive: active });
|
|
89
|
+
function commit(index) {
|
|
90
|
+
setShown(null);
|
|
91
|
+
if (mode.kind === "providers") {
|
|
92
|
+
const provider = providers[index];
|
|
93
|
+
if (!provider)
|
|
94
|
+
return;
|
|
95
|
+
setSel(0);
|
|
96
|
+
// A provider with no keys goes straight to the field: there is no list to show, and
|
|
97
|
+
// one more press to reach the only thing you could have wanted is a press wasted.
|
|
98
|
+
const slot = nextSlot(provider);
|
|
99
|
+
if (provider.count === 0 && slot !== null)
|
|
100
|
+
return setMode({ kind: "enter", provider, slot, replacing: false });
|
|
101
|
+
return setMode({ kind: "keys", provider });
|
|
102
|
+
}
|
|
103
|
+
if (mode.kind === "keys") {
|
|
104
|
+
if (index === keys.length) {
|
|
105
|
+
const slot = nextSlot(mode.provider);
|
|
106
|
+
if (slot === null)
|
|
107
|
+
return;
|
|
108
|
+
setValue("");
|
|
109
|
+
return setMode({ kind: "enter", provider: mode.provider, slot, replacing: false });
|
|
110
|
+
}
|
|
111
|
+
const row = keys[index];
|
|
112
|
+
if (!row)
|
|
113
|
+
return;
|
|
114
|
+
setSel(0);
|
|
115
|
+
return setMode({ kind: "actions", provider: mode.provider, row });
|
|
116
|
+
}
|
|
117
|
+
if (mode.kind === "actions") {
|
|
118
|
+
const chosen = actions[index] ?? ACTION_BACK;
|
|
119
|
+
if (chosen === ACTION_SHOW)
|
|
120
|
+
return setShown(reveal(mode.row));
|
|
121
|
+
if (chosen === ACTION_EDIT) {
|
|
122
|
+
setValue("");
|
|
123
|
+
return setMode({ kind: "enter", provider: mode.provider, slot: mode.row.slot, replacing: true });
|
|
124
|
+
}
|
|
125
|
+
setSel(0);
|
|
126
|
+
if (chosen === ACTION_ACTIVATE)
|
|
127
|
+
onActivate(mode.row);
|
|
128
|
+
else if (chosen.startsWith(ACTION_REMOVE))
|
|
129
|
+
onRemove(mode.row);
|
|
130
|
+
return setMode({ kind: "keys", provider: mode.provider });
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (mode.kind === "enter") {
|
|
134
|
+
return (_jsx(Panel, { title: `${mode.replacing ? "Edit the" : "Add a"} ${mode.provider.label} key${mode.replacing ? ` (key ${mode.slot})` : ""}`, rows: 1, maxRows: maxRows, width: width, hint: "Enter to save \u00B7 Esc to go back", children: _jsxs(Box, { flexShrink: 0, children: [_jsx(Text, { bold: true, color: "cyan", children: " key " }), _jsx(TextInput, { value: value,
|
|
135
|
+
// Mouse reports arrive at a focused field as TYPED TEXT once wheel reporting
|
|
136
|
+
// is on, so scrolling while pasting fills the field with escape sequences and
|
|
137
|
+
// the key fails later in a way that looks like the key itself is wrong.
|
|
138
|
+
onChange: (v) => setValue(stripMouse(v)), onSubmit: (v) => {
|
|
139
|
+
const key = v.trim();
|
|
140
|
+
if (key)
|
|
141
|
+
onSave(mode.provider, mode.slot, key);
|
|
142
|
+
setValue("");
|
|
143
|
+
setSel(0);
|
|
144
|
+
setMode({ kind: "keys", provider: mode.provider });
|
|
145
|
+
}, placeholder: "paste, then press Enter", mask: "*" })] }) }));
|
|
146
|
+
}
|
|
147
|
+
if (mode.kind === "actions") {
|
|
148
|
+
return (_jsxs(Panel, { title: `${mode.provider.label} · key ${mode.row.slot} ${mode.row.hint}${mode.row.active ? " ● active" : ""}`, rows: actions.length + (shown ? 2 : 0), maxRows: maxRows, width: width, hint: shown ? "hidden again when you leave · Esc or ⌫ back" : "↑/↓ · Enter to choose · Esc or ⌫ back", children: [actions.map((a, i) => (_jsx(Row, { on: i === sel, n: i + 1, left: a, width: width }, a))), shown ? (_jsx(Box, { flexShrink: 0, marginTop: 1, children: _jsx(Text, { color: "yellow", wrap: "truncate-end", children: ` ${shown}` }) })) : null] }));
|
|
149
|
+
}
|
|
150
|
+
if (mode.kind === "keys") {
|
|
151
|
+
const start = windowStart(sel, count, win);
|
|
152
|
+
const addRow = canAdd && start + win > keys.length;
|
|
153
|
+
return (_jsxs(Panel, { title: `${mode.provider.label} · ${countLabel(keys.length)}`, counter: position(sel, count, win), rows: Math.min(win, keys.length - start) + (addRow ? 1 : 0), maxRows: maxRows, width: width, hint: "\u2191/\u2193 \u00B7 Enter to choose \u00B7 Esc or \u232B back", children: [keys.slice(start, start + win).map((r, i) => (_jsx(Row, { on: start + i === sel, n: start + i + 1, left: `key ${r.slot}`, mid: r.hint, right: r.active ? "● active" : "", rightColor: r.active ? "green" : undefined, width: width }, r.slot))), addRow ? _jsx(Row, { on: sel === keys.length, n: keys.length + 1, left: "Add a new key", width: width }) : null] }));
|
|
154
|
+
}
|
|
155
|
+
const start = windowStart(sel, providers.length, win);
|
|
156
|
+
return (_jsx(Panel, { title: "Keys", counter: position(sel, providers.length, win), rows: Math.min(win, providers.length - start), maxRows: maxRows, width: width, hint: "\u2191/\u2193 \u00B7 Enter to choose \u00B7 Esc or \u232B close", children: providers.slice(start, start + win).map((p, i) => (_jsx(Row, { on: start + i === sel, n: start + i + 1, left: p.label, right: countLabel(p.count), rightColor: p.count > 0 ? "green" : undefined, width: width }, p.id))) }));
|
|
157
|
+
}
|
|
158
|
+
/** " 3 of 9" when the list is longer than its window, so nothing is silently off the
|
|
159
|
+
* bottom. On the title row, where the pickers put it, and empty when everything fits. */
|
|
160
|
+
function position(sel, total, size) {
|
|
161
|
+
return total > size ? ` ${sel + 1} of ${total}` : "";
|
|
162
|
+
}
|
|
163
|
+
/** Scroll the window so the selection stays inside it. */
|
|
164
|
+
export function windowStart(sel, rowCount, size = WINDOW) {
|
|
165
|
+
if (rowCount <= size)
|
|
166
|
+
return 0;
|
|
167
|
+
const half = Math.floor(size / 2);
|
|
168
|
+
return Math.max(0, Math.min(sel - half, rowCount - size));
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* The header + body of the manager, CONTENT ONLY. The bordered box around it is the ONE
|
|
172
|
+
* shared menu box in PromptInput (same box the `/` command menu and every picker use), so
|
|
173
|
+
* `/key` reads as the same surface — the box never changes, only what is inside it. Every
|
|
174
|
+
* row is `flexShrink={0}` so Yoga leaves the box at its real height (the footer measurement
|
|
175
|
+
* depends on it) instead of compressing an overfull one.
|
|
176
|
+
*/
|
|
177
|
+
function Panel({ title, counter = "", rows, maxRows, hint, width, children, }) {
|
|
178
|
+
// Fill the box out to its fixed height so the hint is pinned to the BOTTOM at every
|
|
179
|
+
// level. Without the fill a short list left the hint floating in the middle of a box
|
|
180
|
+
// whose size never changes, and each level put it somewhere else — the one line that
|
|
181
|
+
// should be in the same place every time. Title(1) + hint(2, its top margin included)
|
|
182
|
+
// is the three rows the body does not get, which is the command list's shape and every
|
|
183
|
+
// picker's: title, then rows, then the hint on the bottom line.
|
|
184
|
+
const pad = Math.max(0, maxRows - 1 - rows);
|
|
185
|
+
const inner = Math.max(12, width - 4);
|
|
186
|
+
return (_jsxs(_Fragment, { children: [_jsxs(Box, { flexShrink: 0, width: inner, children: [_jsx(Text, { bold: true, wrap: "truncate-end", children: title }), counter ? _jsx(Text, { dimColor: true, children: counter }) : null] }), children, Array.from({ length: pad }).map((_, i) => (_jsx(Box, { flexShrink: 0, children: _jsx(Text, { children: " " }) }, `pad${i}`))), _jsx(Box, { flexShrink: 0, marginTop: 1, children: _jsx(Text, { dimColor: true, wrap: "truncate-end", children: hint }) })] }));
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* One row. `mid` is a second COLUMN rather than more text in `left`, because a hint
|
|
190
|
+
* appended to a label moves with the length of the label and the markers then land in
|
|
191
|
+
* different places, so the list stops reading as a table.
|
|
192
|
+
*/
|
|
193
|
+
function Row({ on, n, left, mid, right, rightColor, width, }) {
|
|
194
|
+
const inner = Math.max(12, width - 4);
|
|
195
|
+
return (_jsxs(Box, { flexShrink: 0, width: inner, children: [_jsxs(Text, { color: on ? "cyan" : undefined, bold: on, children: [on ? " › " : " ", `${n} `] }), _jsx(Box, { width: mid === undefined ? 24 : 10, children: _jsx(Text, { color: on ? "cyan" : undefined, bold: on, wrap: "truncate-end", children: left }) }), mid === undefined ? null : (_jsx(Box, { width: 9, children: _jsx(Text, { dimColor: true, wrap: "truncate-end", children: mid }) })), right ? _jsx(Text, { color: rightColor, dimColor: !rightColor, children: right }) : null] }));
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=KeyManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KeyManager.js","sourceRoot":"","sources":["../../../src/cli/components/KeyManager.tsx"],"names":[],"mappings":"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"}
|