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,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* groupReveal.ts — the pure decision for HOW to reveal a NEW discovery group
|
|
3
|
+
* (a burst of file reads folding into one "● Read N files" row).
|
|
4
|
+
*
|
|
5
|
+
* Revealing a group's opening call the instant it happens meant it showed up
|
|
6
|
+
* bare — "Reading 2 files…" with nothing under it — then visibly grew into its
|
|
7
|
+
* finished shape once the reads resolved. The reference design never shows
|
|
8
|
+
* that transient state at all: every block in it is already resolved.
|
|
9
|
+
*
|
|
10
|
+
* So a NEW group is held — not dispatched — until it's SETTLED: the model has
|
|
11
|
+
* moved on to something else, detected by a later, non-group action already
|
|
12
|
+
* queued behind its opening call. At that point the whole burst reveals at
|
|
13
|
+
* once, fully resolved — header and complete list together, never a
|
|
14
|
+
* transition. There is deliberately no time-based fallback that shows partial
|
|
15
|
+
* progress after a grace period: between two SEQUENTIAL reads in a real turn
|
|
16
|
+
* there's a full model round-trip (seconds, not the single-digit milliseconds
|
|
17
|
+
* a local file read takes), so any short grace elapses almost every time and
|
|
18
|
+
* the group ends up shown live-updating anyway — exactly the bug this file
|
|
19
|
+
* exists to avoid. The hold can't get stuck forever either way: every turn
|
|
20
|
+
* ends with a `finishReply` action that goes through the same queue, which
|
|
21
|
+
* counts as "not a group member" and settles any group still open.
|
|
22
|
+
*/
|
|
23
|
+
/** Whether an action is part of an in-progress group's burst — a further
|
|
24
|
+
* grouped call opening, or any tool's end resolving. */
|
|
25
|
+
export function isGroupMember(a) {
|
|
26
|
+
return (a.type === "toolStart" && a.group === true) || a.type === "toolEnd";
|
|
27
|
+
}
|
|
28
|
+
/** Has the model already moved past this group? True once something that
|
|
29
|
+
* ISN'T part of the burst has queued up behind its opening call. */
|
|
30
|
+
export function groupSettled(queueAfterFront) {
|
|
31
|
+
return queueAfterFront.some((a) => !isGroupMember(a));
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Whether a STANDALONE tool call may be shown yet: only once its own result is
|
|
35
|
+
* queued behind it, so the row arrives already carrying its diff/output instead
|
|
36
|
+
* of appearing as a bare `Update(home.html)` that grows a body a beat later.
|
|
37
|
+
*
|
|
38
|
+
* Same principle as the group hold above, and the same absence of a timer. The
|
|
39
|
+
* caller releases the hold when the stream ends (no further event can arrive) or
|
|
40
|
+
* when the user flushes with Esc.
|
|
41
|
+
*/
|
|
42
|
+
export function resultQueued(toolId, queue) {
|
|
43
|
+
return queue.some((a) => a.type === "toolEnd" && a.toolId === toolId);
|
|
44
|
+
}
|
|
45
|
+
/** Decide how to reveal a new group's opening call: settled (or flushing
|
|
46
|
+
* outright, Esc) → "flush" the whole burst at once; otherwise "hold" — there
|
|
47
|
+
* is no partial/progress state, see the file header for why. */
|
|
48
|
+
export function planGroupReveal(settled, flushing) {
|
|
49
|
+
return settled || flushing ? "flush" : "hold";
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=groupReveal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"groupReveal.js","sourceRoot":"","sources":["../../src/cli/groupReveal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH;yDACyD;AACzD,MAAM,UAAU,aAAa,CAAC,CAAoC;IAChE,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC;AAC9E,CAAC;AAED;qEACqE;AACrE,MAAM,UAAU,YAAY,CAAC,eAA6D;IACxF,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,KAAmD;IAC9F,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;AACxE,CAAC;AAID;;iEAEiE;AACjE,MAAM,UAAU,eAAe,CAAC,OAAgB,EAAE,QAAiB;IACjE,OAAO,OAAO,IAAI,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;AAChD,CAAC"}
|
package/dist/cli/help.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* help.ts — what `/help` prints.
|
|
3
|
+
*
|
|
4
|
+
* Rendered from the SAME command list the input's autocomplete offers, plus the
|
|
5
|
+
* project skills and MCP prompts that are live in this session. A second
|
|
6
|
+
* hand-maintained list of commands would be a literal standing in for something
|
|
7
|
+
* that already has a source of truth, and it would go stale the first time a
|
|
8
|
+
* command was added — see BOUNDARY.md.
|
|
9
|
+
*
|
|
10
|
+
* Pure: takes the lists, returns the text. The caller does the gathering.
|
|
11
|
+
*/
|
|
12
|
+
/** Right-pad a command name so the descriptions line up in a column. */
|
|
13
|
+
function column(commands) {
|
|
14
|
+
return commands.reduce((w, c) => Math.max(w, c.name.length), 0);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Render the help text. Sections with no commands are omitted entirely, so a
|
|
18
|
+
* project with no skills and no MCP servers sees a clean list rather than empty
|
|
19
|
+
* headings.
|
|
20
|
+
*/
|
|
21
|
+
export function formatHelp(sections) {
|
|
22
|
+
const live = sections.filter((s) => s.commands.length > 0);
|
|
23
|
+
// One column width across ALL sections, so the descriptions form a single
|
|
24
|
+
// aligned edge rather than restarting per heading.
|
|
25
|
+
const width = column(live.flatMap((s) => [...s.commands]));
|
|
26
|
+
const blocks = live.map((s) => {
|
|
27
|
+
const rows = s.commands.map((c) => ` ${c.name.padEnd(width)} ${c.description}`);
|
|
28
|
+
return `${s.title}\n${rows.join("\n")}`;
|
|
29
|
+
});
|
|
30
|
+
return [
|
|
31
|
+
...blocks,
|
|
32
|
+
// The two things a new user needs that have no other discovery path: there is
|
|
33
|
+
// no autocomplete entry for either, and nothing else mentions them.
|
|
34
|
+
"Also\n" +
|
|
35
|
+
" @path attach a file to your message (Tab completes the path)\n" +
|
|
36
|
+
" Esc stop what's running\n" +
|
|
37
|
+
// The input stays live while a turn runs and the placeholder says so, so
|
|
38
|
+
// QUEUEING is discoverable. Getting back OUT of the queue is not: nothing on
|
|
39
|
+
// screen mentions it until something is already queued, and by then a user who
|
|
40
|
+
// has changed their mind is looking for a way to undo, not to read a hint.
|
|
41
|
+
" ↑ take back a message you queued while it was working",
|
|
42
|
+
// Sub-agents are the one part of the machinery that visibly does something on
|
|
43
|
+
// screen without explaining itself: a rail of tool calls appears under a worker
|
|
44
|
+
// that is not the agent you were talking to. What it costs you and what it hands
|
|
45
|
+
// back is worth stating ONCE, here, rather than on every delegation.
|
|
46
|
+
"About sub-agents\n" +
|
|
47
|
+
" Mindweave can hand a wide, self-contained job to a sub-agent — a sweeping\n" +
|
|
48
|
+
" search, an inventory, a bounded refactor — and work from what it reports back.\n" +
|
|
49
|
+
" Their raw tool loops and output never enter the main conversation, so a large\n" +
|
|
50
|
+
" search costs you a summary instead of a hundred results. They return finished\n" +
|
|
51
|
+
" work (a patch, an answer), compact their own context independently, and cannot\n" +
|
|
52
|
+
" change files unless the job they were given is a job that changes files.",
|
|
53
|
+
].join("\n\n");
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=help.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAaH,wEAAwE;AACxE,SAAS,MAAM,CAAC,QAAgC;IAC9C,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAClE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgC;IACzD,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3D,0EAA0E;IAC1E,mDAAmD;IACnD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE3D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC5B,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAClF,OAAO,GAAG,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,GAAG,MAAM;QACT,8EAA8E;QAC9E,oEAAoE;QACpE,QAAQ;YACN,8EAA8E;YAC9E,2CAA2C;YAC3C,yEAAyE;YACzE,6EAA6E;YAC7E,+EAA+E;YAC/E,2EAA2E;YAC3E,yEAAyE;QAC3E,8EAA8E;QAC9E,gFAAgF;QAChF,iFAAiF;QACjF,qEAAqE;QACrE,oBAAoB;YAClB,+EAA+E;YAC/E,oFAAoF;YACpF,mFAAmF;YACnF,mFAAmF;YACnF,oFAAoF;YACpF,4EAA4E;KAC/E,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* inputView.ts — what the prompt box actually shows: the buffer wrapped into rows,
|
|
3
|
+
* windowed to a height the frame can afford, with the cursor's exact position.
|
|
4
|
+
*
|
|
5
|
+
* Pure, and separate from the component, because the two things that go wrong here are
|
|
6
|
+
* both arithmetic. A buffer that wraps to more rows than the frame can spare pushes the
|
|
7
|
+
* tip line off the bottom of the screen (measured — that is the glitch this fixes), and
|
|
8
|
+
* a cursor mapped onto the wrong row is worse than no cursor at all. Neither is
|
|
9
|
+
* observable from a typecheck, and both are trivial to assert on a plain string array.
|
|
10
|
+
*
|
|
11
|
+
* The wrap records where each row STARTED in the original buffer, which is what makes
|
|
12
|
+
* the cursor exact. Wrapping and then trying to guess the offset back is where an
|
|
13
|
+
* off-by-one lives: a word break silently drops the space it broke on, so the rendered
|
|
14
|
+
* text is shorter than the source it came from.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Greedy word-wrap that remembers offsets (pure).
|
|
18
|
+
*
|
|
19
|
+
* Explicit newlines always break. A word longer than the width is split rather than
|
|
20
|
+
* allowed to overflow — an unbroken 300-character URL must not push the box wider than
|
|
21
|
+
* the terminal.
|
|
22
|
+
*/
|
|
23
|
+
export function wrapWithOffsets(text, width) {
|
|
24
|
+
const w = Math.max(1, width);
|
|
25
|
+
const rows = [];
|
|
26
|
+
let lineStart = 0;
|
|
27
|
+
for (const line of splitKeepingOffsets(text)) {
|
|
28
|
+
if (line.text.length === 0) {
|
|
29
|
+
rows.push({ text: "", start: line.start });
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
let i = 0;
|
|
33
|
+
while (i < line.text.length) {
|
|
34
|
+
if (line.text.length - i <= w) {
|
|
35
|
+
rows.push({ text: line.text.slice(i), start: line.start + i });
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
// Break on the last space that fits; if there is none, the word is longer than
|
|
39
|
+
// the row and gets split at the edge.
|
|
40
|
+
const slice = line.text.slice(i, i + w + 1);
|
|
41
|
+
const lastSpace = slice.lastIndexOf(" ");
|
|
42
|
+
const take = lastSpace > 0 ? lastSpace : w;
|
|
43
|
+
rows.push({ text: line.text.slice(i, i + take), start: line.start + i });
|
|
44
|
+
// Skip the single space we broke on; any others belong to the next row.
|
|
45
|
+
i += take + (lastSpace > 0 ? 1 : 0);
|
|
46
|
+
}
|
|
47
|
+
lineStart = line.start + line.text.length + 1;
|
|
48
|
+
}
|
|
49
|
+
void lineStart;
|
|
50
|
+
return rows.length > 0 ? rows : [{ text: "", start: 0 }];
|
|
51
|
+
}
|
|
52
|
+
/** Split on newlines, keeping each line's offset in the original string. */
|
|
53
|
+
function splitKeepingOffsets(text) {
|
|
54
|
+
const out = [];
|
|
55
|
+
let start = 0;
|
|
56
|
+
for (;;) {
|
|
57
|
+
const nl = text.indexOf("\n", start);
|
|
58
|
+
if (nl === -1) {
|
|
59
|
+
out.push({ text: text.slice(start), start });
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
out.push({ text: text.slice(start, nl), start });
|
|
63
|
+
start = nl + 1;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* The rows to draw and where the cursor sits among them.
|
|
68
|
+
*
|
|
69
|
+
* `maxRows` is a hard ceiling on the box's height. Beyond it the view scrolls with the
|
|
70
|
+
* cursor rather than growing, because the prompt shares a fixed frame with the chat and
|
|
71
|
+
* the tip line: a box allowed to grow without limit takes those rows from the bottom of
|
|
72
|
+
* the screen, which is exactly what it looks like when the tip disappears.
|
|
73
|
+
*/
|
|
74
|
+
export function inputView(value, cursor, width, maxRows) {
|
|
75
|
+
const all = wrapWithOffsets(value, width);
|
|
76
|
+
const clampedCursor = Math.max(0, Math.min(cursor, value.length));
|
|
77
|
+
// The LAST row whose start is at or before the cursor. Searching for the first row
|
|
78
|
+
// that contains it would put a cursor sitting exactly on a break at the end of the
|
|
79
|
+
// previous row instead of the start of the next, which is where the caret belongs
|
|
80
|
+
// after typing the character that caused the break.
|
|
81
|
+
let row = 0;
|
|
82
|
+
for (let i = 0; i < all.length; i++) {
|
|
83
|
+
if (all[i].start <= clampedCursor)
|
|
84
|
+
row = i;
|
|
85
|
+
else
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
const cursorCol = Math.max(0, Math.min(clampedCursor - all[row].start, all[row].text.length));
|
|
89
|
+
const cap = Math.max(1, maxRows);
|
|
90
|
+
if (all.length <= cap) {
|
|
91
|
+
return { rows: all, cursorRow: row, cursorCol, hiddenAbove: 0, hiddenBelow: 0 };
|
|
92
|
+
}
|
|
93
|
+
// Keep the cursor in view, preferring to show as much as possible BEFORE it — when
|
|
94
|
+
// typing you care about what you have just written, not the tail you are pushing down.
|
|
95
|
+
let first = Math.min(Math.max(0, row - (cap - 1)), all.length - cap);
|
|
96
|
+
first = Math.max(0, first);
|
|
97
|
+
return {
|
|
98
|
+
rows: all.slice(first, first + cap),
|
|
99
|
+
cursorRow: row - first,
|
|
100
|
+
cursorCol,
|
|
101
|
+
hiddenAbove: first,
|
|
102
|
+
hiddenBelow: all.length - (first + cap),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=inputView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inputView.js","sourceRoot":"","sources":["../../src/cli/inputView.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* keyManager.ts — the rows /key shows, as plain data.
|
|
3
|
+
*
|
|
4
|
+
* Three levels, because a provider is not one key. PROVIDERS first, then that provider's
|
|
5
|
+
* KEYS with an "add another" that never runs out, then what can be done to one key. A
|
|
6
|
+
* flat list of every key across every provider was the first attempt and it buried the
|
|
7
|
+
* thing people actually came to do: manage the keys of one provider.
|
|
8
|
+
*
|
|
9
|
+
* Derived here rather than in the view so "how many keys does this provider have",
|
|
10
|
+
* "which one is being sent" and "what can be done to it" are answerable without
|
|
11
|
+
* rendering anything.
|
|
12
|
+
*/
|
|
13
|
+
import { allProviders } from "../drivers/registry.js";
|
|
14
|
+
import { activeSlot, keyHint, keysFor, nextFreeSlot } from "./keyStore.js";
|
|
15
|
+
/** Every provider, with how many keys it holds. */
|
|
16
|
+
export function providerRows(env = process.env) {
|
|
17
|
+
return allProviders().map((p) => ({
|
|
18
|
+
id: p.id,
|
|
19
|
+
label: p.label,
|
|
20
|
+
apiKeyEnv: p.apiKeyEnv,
|
|
21
|
+
count: keysFor(p.apiKeyEnv, env).length,
|
|
22
|
+
}));
|
|
23
|
+
}
|
|
24
|
+
/** One provider's keys, in slot order. */
|
|
25
|
+
export function keyRowsFor(provider, env = process.env) {
|
|
26
|
+
const live = activeSlot(provider.apiKeyEnv, env);
|
|
27
|
+
return keysFor(provider.apiKeyEnv, env).map((k) => ({
|
|
28
|
+
label: provider.label,
|
|
29
|
+
apiKeyEnv: provider.apiKeyEnv,
|
|
30
|
+
slot: k.slot,
|
|
31
|
+
hint: keyHint(k.value),
|
|
32
|
+
active: k.slot === live,
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
/** Where the next key for this provider would go, or null when it is full. */
|
|
36
|
+
export function nextSlotFor(provider, env = process.env) {
|
|
37
|
+
return nextFreeSlot(provider.apiKeyEnv, env);
|
|
38
|
+
}
|
|
39
|
+
/** How a provider's key count reads on the provider list. */
|
|
40
|
+
export function countLabel(count) {
|
|
41
|
+
return count === 0 ? "no key yet" : `${count} key${count === 1 ? "" : "s"}`;
|
|
42
|
+
}
|
|
43
|
+
export const ACTION_SHOW = "Show the key";
|
|
44
|
+
export const ACTION_ACTIVATE = "Make this the active key";
|
|
45
|
+
export const ACTION_EDIT = "Edit it";
|
|
46
|
+
export const ACTION_REMOVE = "Remove it";
|
|
47
|
+
export const ACTION_BACK = "Back";
|
|
48
|
+
/**
|
|
49
|
+
* What can be done to one key.
|
|
50
|
+
*
|
|
51
|
+
* "Make this the active key" is left out when it already is — an action that does
|
|
52
|
+
* nothing is worse than an absent one, because the user tries it and learns nothing.
|
|
53
|
+
* Removing a provider's only key IS allowed: it is how a wrong key gets corrected, and
|
|
54
|
+
* the row says what it will cost rather than refusing.
|
|
55
|
+
*/
|
|
56
|
+
export function actionsFor(row, keysForProvider) {
|
|
57
|
+
return [
|
|
58
|
+
ACTION_SHOW,
|
|
59
|
+
...(row.active ? [] : [ACTION_ACTIVATE]),
|
|
60
|
+
ACTION_EDIT,
|
|
61
|
+
keysForProvider === 1 ? `${ACTION_REMOVE} (the only key)` : ACTION_REMOVE,
|
|
62
|
+
ACTION_BACK,
|
|
63
|
+
];
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=keyManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyManager.js","sourceRoot":"","sources":["../../src/cli/keyManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAoB3E,mDAAmD;AACnD,MAAM,UAAU,YAAY,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC/D,OAAO,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChC,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,MAAM;KACxC,CAAC,CAAC,CAAC;AACN,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,UAAU,CAAC,QAAqB,EAAE,MAAyB,OAAO,CAAC,GAAG;IACpF,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACjD,OAAO,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClD,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;QACtB,MAAM,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI;KACxB,CAAC,CAAC,CAAC;AACN,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,WAAW,CAAC,QAAqB,EAAE,MAAyB,OAAO,CAAC,GAAG;IACrF,OAAO,YAAY,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;AAC/C,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,KAAK,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAC9E,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC;AAC1C,MAAM,CAAC,MAAM,eAAe,GAAG,0BAA0B,CAAC;AAC1D,MAAM,CAAC,MAAM,WAAW,GAAG,SAAS,CAAC;AACrC,MAAM,CAAC,MAAM,aAAa,GAAG,WAAW,CAAC;AACzC,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC;AAElC;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,eAAuB;IAC7D,OAAO;QACL,WAAW;QACX,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;QACxC,WAAW;QACX,eAAe,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,aAAa,iBAAiB,CAAC,CAAC,CAAC,aAAa;QACzE,WAAW;KACZ,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* keySetup.ts — what the first-run setup screen offers, as plain data.
|
|
3
|
+
*
|
|
4
|
+
* The old screen asked for ONE provider's key, the default one, and had no way past it.
|
|
5
|
+
* Mindweave speaks to thirteen, and which one a new user already has an account with is
|
|
6
|
+
* not something we can guess — so the screen shows the same list `/provider` does and
|
|
7
|
+
* lets them fill in as many as they like before going in.
|
|
8
|
+
*
|
|
9
|
+
* The rows are derived here rather than in the view, so "is Continue available", "which
|
|
10
|
+
* ones are already set up" and "what order are they in" can be checked without rendering
|
|
11
|
+
* anything.
|
|
12
|
+
*/
|
|
13
|
+
import { allProviders } from "../drivers/registry.js";
|
|
14
|
+
export function setupView(hasKey) {
|
|
15
|
+
const rows = allProviders().map((p) => ({
|
|
16
|
+
id: p.id,
|
|
17
|
+
label: p.label,
|
|
18
|
+
envVar: p.apiKeyEnv,
|
|
19
|
+
keysUrl: p.keysUrl,
|
|
20
|
+
ready: hasKey(p.apiKeyEnv),
|
|
21
|
+
}));
|
|
22
|
+
const readyCount = rows.filter((r) => r.ready).length;
|
|
23
|
+
return { rows, readyCount, canContinue: readyCount > 0 };
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Which row to land on when the screen opens.
|
|
27
|
+
*
|
|
28
|
+
* The first provider WITHOUT a key, so adding a second or third key does not start by
|
|
29
|
+
* re-offering one already done. Falls back to the top when everything is set up.
|
|
30
|
+
*/
|
|
31
|
+
export function initialRow(view) {
|
|
32
|
+
const next = view.rows.findIndex((r) => !r.ready);
|
|
33
|
+
return next === -1 ? 0 : next;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=keySetup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keySetup.js","sourceRoot":"","sources":["../../src/cli/keySetup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AA0BtD,MAAM,UAAU,SAAS,CAAC,MAAmC;IAC3D,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtC,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,MAAM,EAAE,CAAC,CAAC,SAAS;QACnB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;KAC3B,CAAC,CAAC,CAAC;IACJ,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IACtD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,GAAG,CAAC,EAAE,CAAC;AAC3D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,IAAe;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAClD,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* keyStore.ts — more than one key per provider.
|
|
3
|
+
*
|
|
4
|
+
* A provider is not one credential. People hold a work key and a personal one, a free
|
|
5
|
+
* key that rate-limits and a paid one that does not, a key with credit and one that ran
|
|
6
|
+
* out. Mindweave held exactly one per provider, so the answer to "this key stopped
|
|
7
|
+
* answering" was to go and edit a file.
|
|
8
|
+
*
|
|
9
|
+
* TWO ROLES, TWO VARIABLES, and they must not be the same one. Keys are STORED as
|
|
10
|
+
* `DEEPSEEK_API_KEY_1`, `_2`, `_3`; the bare `DEEPSEEK_API_KEY` is the one currently
|
|
11
|
+
* LIVE, which is what every driver reads. Every driver therefore stays unchanged, and
|
|
12
|
+
* the file stays something a person can open and edit.
|
|
13
|
+
*
|
|
14
|
+
* The first attempt used the bare name as both slot 1 and the live key, which reads
|
|
15
|
+
* neatly and destroys data: switching to key 3 overwrote the variable that WAS key 1, so
|
|
16
|
+
* key 1 was gone and removing another key duplicated key 3 into its place. Found by
|
|
17
|
+
* exercising add → use → remove and reading the file back, not by reading the code.
|
|
18
|
+
*
|
|
19
|
+
* A bare variable with no numbered ones is still honoured as slot 1 — that is how an
|
|
20
|
+
* existing config, or a key exported in the shell, keeps working — and it is normalised
|
|
21
|
+
* into `_1` the first time anything is written.
|
|
22
|
+
*/
|
|
23
|
+
/** How many keys one provider may hold. Past this the list stops being a list. */
|
|
24
|
+
export const MAX_SLOTS = 9;
|
|
25
|
+
/** The variable a slot is STORED under. Never the bare name — that one is the live key. */
|
|
26
|
+
export function slotVar(apiKeyEnv, slot) {
|
|
27
|
+
return `${apiKeyEnv}_${slot}`;
|
|
28
|
+
}
|
|
29
|
+
/** Every key stored for a provider, in slot order, skipping empty slots. */
|
|
30
|
+
export function keysFor(apiKeyEnv, env = process.env) {
|
|
31
|
+
const out = [];
|
|
32
|
+
for (let slot = 1; slot <= MAX_SLOTS; slot++) {
|
|
33
|
+
const envVar = slotVar(apiKeyEnv, slot);
|
|
34
|
+
const value = env[envVar]?.trim();
|
|
35
|
+
if (value)
|
|
36
|
+
out.push({ slot, envVar, value });
|
|
37
|
+
}
|
|
38
|
+
// An existing config, or a shell export, has only the bare variable. It counts as the
|
|
39
|
+
// one stored key so nothing a user already had disappears from the list.
|
|
40
|
+
if (out.length === 0) {
|
|
41
|
+
const legacy = env[apiKeyEnv]?.trim();
|
|
42
|
+
if (legacy)
|
|
43
|
+
return [{ slot: 1, envVar: slotVar(apiKeyEnv, 1), value: legacy }];
|
|
44
|
+
}
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
47
|
+
/** The next free slot, or null when the provider is full. */
|
|
48
|
+
export function nextFreeSlot(apiKeyEnv, env = process.env) {
|
|
49
|
+
for (let slot = 1; slot <= MAX_SLOTS; slot++) {
|
|
50
|
+
if (!env[slotVar(apiKeyEnv, slot)]?.trim())
|
|
51
|
+
return slot;
|
|
52
|
+
}
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* A key's last four characters, for telling two of them apart on screen.
|
|
57
|
+
*
|
|
58
|
+
* Never the whole key, and never the FIRST characters: a provider prefix like `sk-ant-`
|
|
59
|
+
* is identical across a user's keys, so it would distinguish nothing while still putting
|
|
60
|
+
* part of a credential on a screen someone might be sharing.
|
|
61
|
+
*/
|
|
62
|
+
export function keyHint(value) {
|
|
63
|
+
const tail = value.trim().slice(-4);
|
|
64
|
+
return tail ? `…${tail}` : "";
|
|
65
|
+
}
|
|
66
|
+
/** Which stored key the drivers are actually sending, or null when none is live. */
|
|
67
|
+
export function activeSlot(apiKeyEnv, env = process.env) {
|
|
68
|
+
const live = env[apiKeyEnv]?.trim();
|
|
69
|
+
if (!live)
|
|
70
|
+
return null;
|
|
71
|
+
return keysFor(apiKeyEnv, env).find((k) => k.value === live)?.slot ?? null;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=keyStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyStore.js","sourceRoot":"","sources":["../../src/cli/keyStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,kFAAkF;AAClF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC;AAE3B,2FAA2F;AAC3F,MAAM,UAAU,OAAO,CAAC,SAAiB,EAAE,IAAY;IACrD,OAAO,GAAG,SAAS,IAAI,IAAI,EAAE,CAAC;AAChC,CAAC;AAQD,4EAA4E;AAC5E,MAAM,UAAU,OAAO,CAAC,SAAiB,EAAE,MAAyB,OAAO,CAAC,GAAG;IAC7E,MAAM,GAAG,GAAgB,EAAE,CAAC;IAC5B,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC;QAClC,IAAI,KAAK;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,sFAAsF;IACtF,yEAAyE;IACzE,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;QACtC,IAAI,MAAM;YAAE,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,YAAY,CAAC,SAAiB,EAAE,MAAyB,OAAO,CAAC,GAAG;IAClF,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC;QAC7C,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE;YAAE,OAAO,IAAI,CAAC;IAC1D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAChC,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,UAAU,CAAC,SAAiB,EAAE,MAAyB,OAAO,CAAC,GAAG;IAChF,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;IACpC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC;AAC7E,CAAC"}
|