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,493 @@
|
|
|
1
|
+
import { clientId } from "../clientId.js";
|
|
2
|
+
import { isAbortLike, isRetryable, nextDelayMs, retryAfterMs, RETRY_MAX_ATTEMPTS } from "../retryPolicy.js";
|
|
3
|
+
import { salvagePartialTurn } from "../partialTurn.js";
|
|
4
|
+
/**
|
|
5
|
+
* The error thrown when a provider returns a non-2xx response.
|
|
6
|
+
*
|
|
7
|
+
* `status` and `detail` ride on the object rather than being formatted into the
|
|
8
|
+
* message, because something upstream has to tell an account refusal (401/402/403/
|
|
9
|
+
* 429) apart from a malformed request, and re-parsing a human sentence to recover a
|
|
10
|
+
* number we already had is the kind of thing that quietly stops working. See
|
|
11
|
+
* `drivers/providerError.ts`. Both SDK-backed drivers expose `status` the same way,
|
|
12
|
+
* so one classifier serves every provider.
|
|
13
|
+
*/
|
|
14
|
+
export class ProviderHttpError extends Error {
|
|
15
|
+
status;
|
|
16
|
+
detail;
|
|
17
|
+
constructor(status, detail, label, statusText) {
|
|
18
|
+
super(`${label} API error ${status}: ${detail || statusText}`);
|
|
19
|
+
this.status = status;
|
|
20
|
+
this.detail = detail;
|
|
21
|
+
this.name = "ProviderHttpError";
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* The cache split as most OpenAI-compatible providers report it:
|
|
26
|
+
* `prompt_tokens_details.cached_tokens`, where `prompt_tokens` is the FULL prompt
|
|
27
|
+
* including the cached part — so the miss side is the remainder, not a second
|
|
28
|
+
* figure to add.
|
|
29
|
+
*
|
|
30
|
+
* Shared because this exact shape is what Qwen, GLM, xAI, Mistral, Groq and
|
|
31
|
+
* Cerebras all return, and six copies of six lines is six places for the same
|
|
32
|
+
* arithmetic to drift. A provider that reports something else supplies its own.
|
|
33
|
+
*
|
|
34
|
+
* Returning `undefined` when nothing is reported is load-bearing, not tidiness. The
|
|
35
|
+
* caller then counts the whole prompt as fresh, and on a multi-step turn that means
|
|
36
|
+
* every step's prompt is counted again — which is exactly the inflation the token
|
|
37
|
+
* meter exists to avoid. So a provider that DOES cache must be wired to this, or
|
|
38
|
+
* its turns silently report several times what they cost.
|
|
39
|
+
*/
|
|
40
|
+
export function standardCacheSplit(usage) {
|
|
41
|
+
const details = usage.prompt_tokens_details;
|
|
42
|
+
const hit = typeof details?.cached_tokens === "number" ? details.cached_tokens : 0;
|
|
43
|
+
if (hit === 0)
|
|
44
|
+
return undefined;
|
|
45
|
+
const prompt = typeof usage.prompt_tokens === "number" ? usage.prompt_tokens : 0;
|
|
46
|
+
return { hit, miss: Math.max(0, prompt - hit) };
|
|
47
|
+
}
|
|
48
|
+
/** Apply a provider's content repair, or pass the turn through untouched. */
|
|
49
|
+
function repair(provider, content, toolCalls) {
|
|
50
|
+
return provider.repairContent ? provider.repairContent(content, toolCalls) : { content, toolCalls };
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Render a ModelRequest to OpenAI-shape messages: the stable system prompt, the
|
|
54
|
+
* stable conversation, then the volatile context as a trailing block.
|
|
55
|
+
*
|
|
56
|
+
* Keeping `context` strictly LAST is what preserves the cacheable prefix — an
|
|
57
|
+
* OpenAI-compatible provider caches the longest identical prefix from token 0, so
|
|
58
|
+
* anything volatile must come after everything worth caching. This is the property
|
|
59
|
+
* the whole ModelRequest split exists to guarantee.
|
|
60
|
+
*/
|
|
61
|
+
/**
|
|
62
|
+
* Put a stored tool call back on the wire, including whatever opaque provider data came
|
|
63
|
+
* with it.
|
|
64
|
+
*
|
|
65
|
+
* `meta.extra_content` is spliced back as a sibling of `function`, which is the shape it
|
|
66
|
+
* arrived in. Gemini 3 attaches a `thought_signature` there and returns 400 on the next
|
|
67
|
+
* request if it is missing — "Function call is missing a thought_signature" — so an
|
|
68
|
+
* OpenAI-compatible client that drops unknown fields can make exactly one tool call per
|
|
69
|
+
* conversation and then breaks. Passing it through unread is the whole fix.
|
|
70
|
+
*/
|
|
71
|
+
function wireToolCall(c, provider) {
|
|
72
|
+
// Only back to the provider that produced it.
|
|
73
|
+
//
|
|
74
|
+
// The blob is opaque and provider-specific: Gemini's is a thought_signature, and
|
|
75
|
+
// sending it to DeepSeek or Qwen after a mid-session /provider switch hands one
|
|
76
|
+
// vendor's internal data to another under a key they never defined. Measured before
|
|
77
|
+
// this check existed — the signature went straight through.
|
|
78
|
+
//
|
|
79
|
+
// An UNTAGGED blob is replayed, because it can only have come from a session recorded
|
|
80
|
+
// before this tag existed and the alternative is worse: Gemini returns 400 on the next
|
|
81
|
+
// request when a call loses its signature, so dropping it would break exactly the
|
|
82
|
+
// resumed sessions that still carry one.
|
|
83
|
+
const from = c.meta?.provider;
|
|
84
|
+
const mine = from === undefined || from === provider;
|
|
85
|
+
const extra = mine ? c.meta?.extra_content : undefined;
|
|
86
|
+
return {
|
|
87
|
+
id: c.id,
|
|
88
|
+
type: c.type,
|
|
89
|
+
function: c.function,
|
|
90
|
+
...(extra ? { extra_content: extra } : {}),
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Serialize messages for the body, converting each tool call's opaque `meta` into the
|
|
95
|
+
* field name the provider actually expects.
|
|
96
|
+
*
|
|
97
|
+
* Separate from `renderMessages` on purpose: that function answers "what messages, in
|
|
98
|
+
* what order", which is the part worth asserting in tests, while this one is the last
|
|
99
|
+
* step before the bytes leave. Sending `meta` verbatim would put an unknown key on the
|
|
100
|
+
* wire under a name no provider knows.
|
|
101
|
+
*/
|
|
102
|
+
/**
|
|
103
|
+
* Render one message's content, as multimodal parts when it carries images.
|
|
104
|
+
*
|
|
105
|
+
* OpenAI's shape, which is what every provider on this transport speaks: `content`
|
|
106
|
+
* becomes an ARRAY of typed parts instead of a string, and an image is an
|
|
107
|
+
* `image_url` whose url is a `data:` URI. DeepSeek documents exactly this for its
|
|
108
|
+
* vision model, so nothing here is provider-specific.
|
|
109
|
+
*
|
|
110
|
+
* The text part comes FIRST and is always present, even when empty. A message that
|
|
111
|
+
* is only images reads as a bare attachment with no request attached to it, and the
|
|
112
|
+
* text is what carries the user's actual question.
|
|
113
|
+
*/
|
|
114
|
+
function toWireContent(m) {
|
|
115
|
+
if (!m.images || m.images.length === 0)
|
|
116
|
+
return m.content;
|
|
117
|
+
return [
|
|
118
|
+
{ type: "text", text: m.content },
|
|
119
|
+
...m.images.map((img) => ({
|
|
120
|
+
type: "image_url",
|
|
121
|
+
image_url: { url: `data:${img.mediaType};base64,${img.data}` },
|
|
122
|
+
})),
|
|
123
|
+
];
|
|
124
|
+
}
|
|
125
|
+
export function toWireMessages(messages, provider = "") {
|
|
126
|
+
return messages.map((m) => {
|
|
127
|
+
// `images` is OUR field, not a wire field. It was previously spread onto the
|
|
128
|
+
// request untouched, so a provider saw an unknown key and the picture itself
|
|
129
|
+
// never left the machine — the attachment was silently text-only.
|
|
130
|
+
const { tool_calls: calls, images: _ours, ...rest } = m;
|
|
131
|
+
const base = { ...rest, content: toWireContent(m) };
|
|
132
|
+
if (!calls || calls.length === 0)
|
|
133
|
+
return base;
|
|
134
|
+
return { ...base, tool_calls: calls.map((c) => wireToolCall(c, provider)) };
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
export function renderMessages(req) {
|
|
138
|
+
const messages = [{ role: "system", content: req.system }, ...req.messages];
|
|
139
|
+
if (req.context && req.context.trim()) {
|
|
140
|
+
// A trailing USER message is the most universally accepted shape here: a
|
|
141
|
+
// non-leading system message is not guaranteed to be honored. It is clearly
|
|
142
|
+
// framed as current context rather than as the human talking.
|
|
143
|
+
messages.push({ role: "user", content: `<current_context>\n${req.context}\n</current_context>` });
|
|
144
|
+
}
|
|
145
|
+
return messages;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Build the request body shared by the buffered and streaming paths.
|
|
149
|
+
*
|
|
150
|
+
* `maxTokens` is the output ceiling for THIS path, and is omitted from the body
|
|
151
|
+
* when the provider declares none — leaving its own default in force, which is the
|
|
152
|
+
* documented behaviour rather than an oversight.
|
|
153
|
+
*/
|
|
154
|
+
export function buildBody(provider, req, maxTokens) {
|
|
155
|
+
const tools = req.tools ?? [];
|
|
156
|
+
const body = {
|
|
157
|
+
model: req.model?.model ?? provider.defaultModel,
|
|
158
|
+
messages: toWireMessages(renderMessages(req), provider.label),
|
|
159
|
+
...provider.reasoningFields(req.model),
|
|
160
|
+
...(provider.sampling?.(req.model) ?? {}),
|
|
161
|
+
};
|
|
162
|
+
if (maxTokens !== undefined)
|
|
163
|
+
body.max_tokens = maxTokens;
|
|
164
|
+
if (tools.length > 0) {
|
|
165
|
+
body.tools = tools;
|
|
166
|
+
body.tool_choice = "auto";
|
|
167
|
+
}
|
|
168
|
+
return body;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Map an OpenAI-shaped `finish_reason` onto the shared stop reason.
|
|
172
|
+
*
|
|
173
|
+
* `stop` and `tool_calls` are both a normal finish; `length` means the answer was
|
|
174
|
+
* cut off mid-sentence, which the engine has to be able to tell apart from a real
|
|
175
|
+
* ending. A provider's own vocabulary gets first refusal via `extraStop`, so a
|
|
176
|
+
* non-standard value can never fall through to `"end"` and report an incomplete
|
|
177
|
+
* reply as a clean one.
|
|
178
|
+
*/
|
|
179
|
+
export function toStop(provider, reason) {
|
|
180
|
+
if (!reason)
|
|
181
|
+
return "end";
|
|
182
|
+
const extra = provider.extraStop?.(reason);
|
|
183
|
+
if (extra)
|
|
184
|
+
return extra;
|
|
185
|
+
switch (reason) {
|
|
186
|
+
case "length":
|
|
187
|
+
return "truncated";
|
|
188
|
+
case "content_filter":
|
|
189
|
+
return "refused";
|
|
190
|
+
default:
|
|
191
|
+
return "end";
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Read an SSE response into a finished turn, emitting each delta along the way.
|
|
196
|
+
*
|
|
197
|
+
* Every `data:` line is a chunk whose `choices[0].delta` carries some of `content`,
|
|
198
|
+
* a reasoning field, or `tool_calls`. Tool calls are FRAGMENTED — the first
|
|
199
|
+
* fragment for an index brings the id and name, later ones append `arguments` text
|
|
200
|
+
* — so they are accumulated by index and only assembled at the end.
|
|
201
|
+
*/
|
|
202
|
+
export async function consumeStream(provider, response, onEvent) {
|
|
203
|
+
let content = "";
|
|
204
|
+
// Tool calls under construction, keyed by streaming index. `started` guards the
|
|
205
|
+
// one-time tool_start emit, fired when the name first appears.
|
|
206
|
+
const tools = new Map();
|
|
207
|
+
let usage;
|
|
208
|
+
let finishReason;
|
|
209
|
+
try {
|
|
210
|
+
for await (const data of sseLines(response)) {
|
|
211
|
+
if (data === "[DONE]")
|
|
212
|
+
break;
|
|
213
|
+
let chunk;
|
|
214
|
+
try {
|
|
215
|
+
chunk = JSON.parse(data);
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
continue; // ignore keep-alive comments / malformed lines
|
|
219
|
+
}
|
|
220
|
+
if (chunk.usage)
|
|
221
|
+
usage = toUsage(provider, chunk.usage);
|
|
222
|
+
finishReason = chunk.choices?.[0]?.finish_reason ?? finishReason;
|
|
223
|
+
const delta = chunk.choices?.[0]?.delta;
|
|
224
|
+
if (!delta)
|
|
225
|
+
continue;
|
|
226
|
+
const reasoning = delta.reasoning_content ?? delta.reasoning;
|
|
227
|
+
if (typeof reasoning === "string" && reasoning) {
|
|
228
|
+
onEvent?.({ type: "reasoning", delta: reasoning });
|
|
229
|
+
}
|
|
230
|
+
if (typeof delta.content === "string" && delta.content) {
|
|
231
|
+
content += delta.content;
|
|
232
|
+
onEvent?.({ type: "text", delta: delta.content });
|
|
233
|
+
}
|
|
234
|
+
for (const tc of delta.tool_calls ?? []) {
|
|
235
|
+
const index = tc.index ?? 0;
|
|
236
|
+
let acc = tools.get(index);
|
|
237
|
+
if (!acc) {
|
|
238
|
+
acc = { id: "", name: "", args: "", started: false, extra: undefined };
|
|
239
|
+
tools.set(index, acc);
|
|
240
|
+
}
|
|
241
|
+
if (tc.id)
|
|
242
|
+
acc.id = tc.id;
|
|
243
|
+
// Carried, never interpreted. It arrives on whichever fragment the provider
|
|
244
|
+
// chooses, so the last non-empty one wins rather than the first.
|
|
245
|
+
if (tc.extra_content)
|
|
246
|
+
acc.extra = tc.extra_content;
|
|
247
|
+
// The name usually arrives whole in the first fragment, but append
|
|
248
|
+
// defensively in case a provider splits it.
|
|
249
|
+
if (tc.function?.name)
|
|
250
|
+
acc.name += tc.function.name;
|
|
251
|
+
if (!acc.started && acc.name) {
|
|
252
|
+
acc.started = true;
|
|
253
|
+
onEvent?.({ type: "tool_start", index, id: acc.id, name: acc.name });
|
|
254
|
+
}
|
|
255
|
+
const argFragment = tc.function?.arguments;
|
|
256
|
+
if (argFragment) {
|
|
257
|
+
acc.args += argFragment;
|
|
258
|
+
onEvent?.({ type: "tool_args", index, delta: argFragment });
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
catch (error) {
|
|
264
|
+
if (isAbortLike(error))
|
|
265
|
+
throw error;
|
|
266
|
+
return salvagePartialTurn(content, error);
|
|
267
|
+
}
|
|
268
|
+
const assembled = [...tools.entries()]
|
|
269
|
+
.sort((a, b) => a[0] - b[0])
|
|
270
|
+
.map(([, t]) => ({
|
|
271
|
+
id: t.id,
|
|
272
|
+
name: t.name,
|
|
273
|
+
arguments: t.args || "{}",
|
|
274
|
+
...(t.extra ? { meta: { extra_content: t.extra, provider: provider.label } } : {}),
|
|
275
|
+
}));
|
|
276
|
+
const repaired = repair(provider, content, assembled);
|
|
277
|
+
return { ...repaired, usage, stop: toStop(provider, finishReason) };
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Fold a usage object into the shared shape.
|
|
281
|
+
*
|
|
282
|
+
* The cache split is asked of the provider because the field names are
|
|
283
|
+
* unstandardised. When it reports none, the prompt counts as entirely fresh —
|
|
284
|
+
* an over-estimate, deliberately, since the alternative is inventing a discount
|
|
285
|
+
* the user did not receive.
|
|
286
|
+
*/
|
|
287
|
+
export function toUsage(provider, raw) {
|
|
288
|
+
const num = (key) => (typeof raw[key] === "number" ? raw[key] : 0);
|
|
289
|
+
const promptTokens = num("prompt_tokens");
|
|
290
|
+
const completionTokens = num("completion_tokens");
|
|
291
|
+
const split = provider.cacheSplit?.(raw);
|
|
292
|
+
return {
|
|
293
|
+
promptTokens,
|
|
294
|
+
completionTokens,
|
|
295
|
+
totalTokens: num("total_tokens") || promptTokens + completionTokens,
|
|
296
|
+
cacheHitTokens: split?.hit ?? 0,
|
|
297
|
+
cacheMissTokens: split?.miss ?? promptTokens,
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
/** Pull a finished (non-streamed) response into a turn. */
|
|
301
|
+
export function toTurn(provider, data) {
|
|
302
|
+
const parsed = data;
|
|
303
|
+
const message = parsed.choices?.[0]?.message;
|
|
304
|
+
const content = typeof message?.content === "string" ? message.content : "";
|
|
305
|
+
const toolCalls = (message?.tool_calls ?? []).map((tc) => ({
|
|
306
|
+
id: tc.id,
|
|
307
|
+
name: tc.function.name,
|
|
308
|
+
arguments: tc.function.arguments || "{}",
|
|
309
|
+
...(tc.extra_content ? { meta: { extra_content: tc.extra_content, provider: provider.label } } : {}),
|
|
310
|
+
}));
|
|
311
|
+
const repaired = repair(provider, content, toolCalls);
|
|
312
|
+
return {
|
|
313
|
+
...repaired,
|
|
314
|
+
stop: toStop(provider, parsed.choices?.[0]?.finish_reason),
|
|
315
|
+
// Buffered calls are core's internal ones and spend real tokens; without this
|
|
316
|
+
// they are invisible to the meter. Absent when the provider reports nothing,
|
|
317
|
+
// which is not the same as zero.
|
|
318
|
+
usage: parsed.usage ? toUsage(provider, parsed.usage) : undefined,
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Yield each SSE `data:` payload from a streamed response body.
|
|
323
|
+
*
|
|
324
|
+
* Frames are separated by a blank line and may carry more than one `data:` line.
|
|
325
|
+
* Decoding is incremental and a payload is only emitted once a FULL frame has
|
|
326
|
+
* arrived, so one split across network packets is never parsed half-formed.
|
|
327
|
+
*/
|
|
328
|
+
export async function* sseLines(response) {
|
|
329
|
+
const body = response.body;
|
|
330
|
+
if (!body)
|
|
331
|
+
return;
|
|
332
|
+
const decoder = new TextDecoder();
|
|
333
|
+
let buffer = "";
|
|
334
|
+
// `response.body` is a web ReadableStream; Node exposes it as async-iterable.
|
|
335
|
+
for await (const piece of body) {
|
|
336
|
+
buffer += decoder.decode(piece, { stream: true });
|
|
337
|
+
let sep;
|
|
338
|
+
while ((sep = firstFrameEnd(buffer)) !== -1) {
|
|
339
|
+
const frame = buffer.slice(0, sep).trim();
|
|
340
|
+
buffer = buffer.slice(sep).replace(/^(\r?\n)+/, "");
|
|
341
|
+
const payload = frameData(frame);
|
|
342
|
+
if (payload !== null)
|
|
343
|
+
yield payload;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
/** Index just past the first frame separator (blank line) in `buf`, or -1. */
|
|
348
|
+
function firstFrameEnd(buf) {
|
|
349
|
+
const lf = buf.indexOf("\n\n");
|
|
350
|
+
const crlf = buf.indexOf("\r\n\r\n");
|
|
351
|
+
if (lf === -1)
|
|
352
|
+
return crlf === -1 ? -1 : crlf + 4;
|
|
353
|
+
if (crlf === -1)
|
|
354
|
+
return lf + 2;
|
|
355
|
+
return Math.min(lf + 2, crlf + 4);
|
|
356
|
+
}
|
|
357
|
+
/** Join the `data:` lines of one SSE frame into its payload, or null if none. */
|
|
358
|
+
function frameData(frame) {
|
|
359
|
+
const parts = [];
|
|
360
|
+
for (const line of frame.split(/\r?\n/)) {
|
|
361
|
+
if (line.startsWith("data:"))
|
|
362
|
+
parts.push(line.slice(5).trimStart());
|
|
363
|
+
}
|
|
364
|
+
return parts.length > 0 ? parts.join("\n") : null;
|
|
365
|
+
}
|
|
366
|
+
/** The provider's API key, or a clear setup error if it isn't configured yet. */
|
|
367
|
+
export function requireApiKey(provider) {
|
|
368
|
+
const apiKey = process.env[provider.apiKeyEnv];
|
|
369
|
+
if (!apiKey) {
|
|
370
|
+
throw new Error(`No ${provider.apiKeyEnv} found. Add your key to the global config so Mindweave works ` +
|
|
371
|
+
"in every project:\n" +
|
|
372
|
+
` ~/.mindweave/.env → ${provider.apiKeyEnv}=your-key-here\n` +
|
|
373
|
+
"(A per-project .env or an exported shell variable also works.)");
|
|
374
|
+
}
|
|
375
|
+
return apiKey;
|
|
376
|
+
}
|
|
377
|
+
/** Wait, unless the user cancels first — in which case stop immediately rather than
|
|
378
|
+
* serving out a backoff nobody is waiting for any more. */
|
|
379
|
+
function sleep(ms, signal) {
|
|
380
|
+
if (ms <= 0)
|
|
381
|
+
return Promise.resolve();
|
|
382
|
+
return new Promise((resolve, reject) => {
|
|
383
|
+
const timer = setTimeout(() => {
|
|
384
|
+
signal?.removeEventListener("abort", onAbort);
|
|
385
|
+
resolve();
|
|
386
|
+
}, ms);
|
|
387
|
+
const onAbort = () => {
|
|
388
|
+
clearTimeout(timer);
|
|
389
|
+
reject(Object.assign(new Error("aborted"), { name: "AbortError" }));
|
|
390
|
+
};
|
|
391
|
+
if (signal?.aborted)
|
|
392
|
+
return onAbort();
|
|
393
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* One request to the provider, retried through the blips.
|
|
398
|
+
*
|
|
399
|
+
* The response is returned UNREAD: the caller decides whether to parse it as JSON or
|
|
400
|
+
* stream it. That is what keeps this safe to retry — every decision here is made from
|
|
401
|
+
* the status line, before a byte of the body is consumed and before anything reaches
|
|
402
|
+
* the screen, so a second attempt is a second attempt rather than a duplicate.
|
|
403
|
+
*/
|
|
404
|
+
async function send(provider, body, signal) {
|
|
405
|
+
const started = Date.now();
|
|
406
|
+
let lastError;
|
|
407
|
+
for (let attempt = 1; attempt <= RETRY_MAX_ATTEMPTS; attempt++) {
|
|
408
|
+
let response;
|
|
409
|
+
try {
|
|
410
|
+
response = await fetch(`${provider.baseUrl}/chat/completions`, {
|
|
411
|
+
method: "POST",
|
|
412
|
+
headers: { "Content-Type": "application/json", Authorization: `Bearer ${requireApiKey(provider)}`, "User-Agent": clientId() },
|
|
413
|
+
body: JSON.stringify(body),
|
|
414
|
+
signal,
|
|
415
|
+
});
|
|
416
|
+
if (response.ok)
|
|
417
|
+
return response;
|
|
418
|
+
const detail = await response.text().catch(() => "");
|
|
419
|
+
lastError = new ProviderHttpError(response.status, detail, provider.label, response.statusText);
|
|
420
|
+
}
|
|
421
|
+
catch (error) {
|
|
422
|
+
// A cancel is not a fault and must never be slept on or tried again.
|
|
423
|
+
if (isAbortLike(error))
|
|
424
|
+
throw error;
|
|
425
|
+
lastError = error;
|
|
426
|
+
}
|
|
427
|
+
const status = response ? response.status : null;
|
|
428
|
+
if (!isRetryable(lastError, status))
|
|
429
|
+
throw lastError;
|
|
430
|
+
if (attempt === RETRY_MAX_ATTEMPTS)
|
|
431
|
+
break;
|
|
432
|
+
const delay = nextDelayMs(attempt, Date.now() - started, retryAfterMs(response?.headers.get("retry-after")));
|
|
433
|
+
// Null means the wait would outlast the budget. Surfacing the provider's own
|
|
434
|
+
// sentence, which usually names the cooldown, beats sleeping through it silently.
|
|
435
|
+
if (delay === null)
|
|
436
|
+
break;
|
|
437
|
+
await sleep(delay, signal);
|
|
438
|
+
}
|
|
439
|
+
throw lastError;
|
|
440
|
+
}
|
|
441
|
+
/** POST to chat/completions, returning the parsed JSON body. */
|
|
442
|
+
async function post(provider, body, signal) {
|
|
443
|
+
return (await send(provider, body, signal)).json();
|
|
444
|
+
}
|
|
445
|
+
/** POST a streaming request, returning the raw response for SSE reading. */
|
|
446
|
+
async function postStream(provider, body, signal) {
|
|
447
|
+
return send(provider, body, signal);
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* List the models this provider currently serves.
|
|
451
|
+
*
|
|
452
|
+
* The OpenAI-compatible `/models` endpoint, which is what makes a DISCOVERED
|
|
453
|
+
* provider possible: a fast-inference host rotates its catalogue often enough that
|
|
454
|
+
* a list compiled into the driver is wrong within weeks, and the endpoint is the
|
|
455
|
+
* only thing that is never wrong.
|
|
456
|
+
*
|
|
457
|
+
* Deliberately THROWS rather than returning an empty list on failure. The registry
|
|
458
|
+
* treats the two differently and must be able to: an empty list means "serving
|
|
459
|
+
* nothing right now", while a throw means "could not ask", and only the first
|
|
460
|
+
* should replace what the picker is showing.
|
|
461
|
+
*/
|
|
462
|
+
export async function listModels(provider) {
|
|
463
|
+
const response = await fetch(`${provider.baseUrl}/models`, {
|
|
464
|
+
headers: { Authorization: `Bearer ${requireApiKey(provider)}`, "User-Agent": clientId() },
|
|
465
|
+
});
|
|
466
|
+
if (!response.ok) {
|
|
467
|
+
const detail = await response.text().catch(() => "");
|
|
468
|
+
throw new ProviderHttpError(response.status, detail, provider.label, response.statusText);
|
|
469
|
+
}
|
|
470
|
+
const body = (await response.json());
|
|
471
|
+
return (body.data ?? []).filter((m) => typeof m.id === "string" && m.id.length > 0);
|
|
472
|
+
}
|
|
473
|
+
/** Ask the model for one turn. */
|
|
474
|
+
export async function compatToolTurn(provider, req, signal) {
|
|
475
|
+
const body = { ...buildBody(provider, req, provider.bufferedMaxTokens), stream: false };
|
|
476
|
+
return toTurn(provider, await post(provider, body, signal));
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* Ask the model for one turn, STREAMING.
|
|
480
|
+
*
|
|
481
|
+
* `stream_options.include_usage` asks for a final chunk carrying the token counts.
|
|
482
|
+
* Providers that don't honour it simply never send one, and usage stays undefined —
|
|
483
|
+
* which the caller already treats as "not reported" rather than as zero.
|
|
484
|
+
*/
|
|
485
|
+
export async function compatStreamTurn(provider, req, onEvent, signal) {
|
|
486
|
+
const body = {
|
|
487
|
+
...buildBody(provider, req, provider.streamMaxTokens),
|
|
488
|
+
stream: true,
|
|
489
|
+
stream_options: { include_usage: true },
|
|
490
|
+
};
|
|
491
|
+
return consumeStream(provider, await postStream(provider, body, signal), onEvent);
|
|
492
|
+
}
|
|
493
|
+
//# sourceMappingURL=wire.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wire.js","sourceRoot":"","sources":["../../../src/drivers/openaiCompat/wire.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Return what arrived as an INCOMPLETE turn, or rethrow when there is nothing to keep.
|
|
3
|
+
*
|
|
4
|
+
* `overloaded` rather than `truncated`: its wording is "the provider's infrastructure
|
|
5
|
+
* cut the request off before it finished", which is what happened. `truncated` would
|
|
6
|
+
* claim the model hit its own output ceiling, which it did not, and would send the user
|
|
7
|
+
* looking for a limit to raise.
|
|
8
|
+
*
|
|
9
|
+
* Tool calls are DROPPED, and that is the load-bearing half. A call whose arguments
|
|
10
|
+
* stopped mid-JSON is not a call the model made; handing one on would execute something
|
|
11
|
+
* nobody asked for. Text survives being cut short, a tool call does not. The engine's
|
|
12
|
+
* early-stop branch ignores tool calls anyway, so this keeps the two in agreement
|
|
13
|
+
* rather than relying on that.
|
|
14
|
+
*
|
|
15
|
+
* With nothing to salvage the original error is rethrown. An empty successful turn would
|
|
16
|
+
* read as a model that chose to say nothing, which is a worse lie than an error.
|
|
17
|
+
*/
|
|
18
|
+
export function salvagePartialTurn(content, error) {
|
|
19
|
+
if (!content.trim())
|
|
20
|
+
throw error;
|
|
21
|
+
return { content, toolCalls: [], stop: "overloaded" };
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=partialTurn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"partialTurn.js","sourceRoot":"","sources":["../../src/drivers/partialTurn.ts"],"names":[],"mappings":"AAqBA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAe,EAAE,KAAc;IAChE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;QAAE,MAAM,KAAK,CAAC;IACjC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;AACxD,CAAC"}
|