whale-code 6.5.5 → 6.5.6
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/README.md +39 -31
- package/bin/{swagmanager-mcp.js → whale-code.js} +17 -2
- package/dist/cli/app.js +148 -72
- package/dist/cli/app.js.map +1 -0
- package/dist/cli/chat/AgentSelector.js +105 -10
- package/dist/cli/chat/AgentSelector.js.map +1 -0
- package/dist/cli/chat/ChatApp.d.ts +31 -0
- package/dist/cli/chat/ChatApp.js +539 -286
- package/dist/cli/chat/ChatApp.js.map +1 -0
- package/dist/cli/chat/ChatInput.js +1088 -770
- package/dist/cli/chat/ChatInput.js.map +1 -0
- package/dist/cli/chat/MarkdownText.js +39 -14
- package/dist/cli/chat/MarkdownText.js.map +1 -0
- package/dist/cli/chat/MemoryManager.js +181 -46
- package/dist/cli/chat/MemoryManager.js.map +1 -0
- package/dist/cli/chat/MessageList.d.ts +2 -3
- package/dist/cli/chat/MessageList.js +186 -45
- package/dist/cli/chat/MessageList.js.map +1 -0
- package/dist/cli/chat/ModelSelector.js +282 -63
- package/dist/cli/chat/ModelSelector.js.map +1 -0
- package/dist/cli/chat/NodeManager.js +165 -75
- package/dist/cli/chat/NodeManager.js.map +1 -0
- package/dist/cli/chat/NodeSelector.js +171 -30
- package/dist/cli/chat/NodeSelector.js.map +1 -0
- package/dist/cli/chat/PlanApproval.js +281 -57
- package/dist/cli/chat/PlanApproval.js.map +1 -0
- package/dist/cli/chat/RewindViewer.js +559 -144
- package/dist/cli/chat/RewindViewer.js.map +1 -0
- package/dist/cli/chat/SessionManager.js +137 -30
- package/dist/cli/chat/SessionManager.js.map +1 -0
- package/dist/cli/chat/SlashMenu.js +293 -164
- package/dist/cli/chat/SlashMenu.js.map +1 -0
- package/dist/cli/chat/StatusBar.js +172 -9
- package/dist/cli/chat/StatusBar.js.map +1 -0
- package/dist/cli/chat/StoreSelector.js +147 -18
- package/dist/cli/chat/StoreSelector.js.map +1 -0
- package/dist/cli/chat/StreamingText.d.ts +1 -5
- package/dist/cli/chat/StreamingText.js +22 -7
- package/dist/cli/chat/StreamingText.js.map +1 -0
- package/dist/cli/chat/SubagentPanel.d.ts +1 -2
- package/dist/cli/chat/SubagentPanel.js +612 -72
- package/dist/cli/chat/SubagentPanel.js.map +1 -0
- package/dist/cli/chat/TeamPanel.d.ts +1 -0
- package/dist/cli/chat/TeamPanel.js +230 -30
- package/dist/cli/chat/TeamPanel.js.map +1 -0
- package/dist/cli/chat/ThemeSelector.js +84 -24
- package/dist/cli/chat/ThemeSelector.js.map +1 -0
- package/dist/cli/chat/ToolIndicator.js +1476 -371
- package/dist/cli/chat/ToolIndicator.js.map +1 -0
- package/dist/cli/chat/hooks/useAgentLoop.d.ts +1 -0
- package/dist/cli/chat/hooks/useAgentLoop.js +481 -367
- package/dist/cli/chat/hooks/useAgentLoop.js.map +1 -0
- package/dist/cli/chat/hooks/useSlashCommands.d.ts +3 -14
- package/dist/cli/chat/hooks/useSlashCommands.js +744 -572
- package/dist/cli/chat/hooks/useSlashCommands.js.map +1 -0
- package/dist/cli/commands/config-cmd.js +56 -57
- package/dist/cli/commands/config-cmd.js.map +1 -0
- package/dist/cli/commands/db.js +184 -169
- package/dist/cli/commands/db.js.map +1 -0
- package/dist/cli/commands/doctor.js +212 -122
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/init.js +211 -244
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/mcp.js +127 -122
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/login/LoginApp.js +355 -141
- package/dist/cli/login/LoginApp.js.map +1 -0
- package/dist/cli/print-mode.js +196 -177
- package/dist/cli/print-mode.js.map +1 -0
- package/dist/cli/serve-mode.js +615 -530
- package/dist/cli/serve-mode.js.map +1 -0
- package/dist/cli/services/agent-config.d.ts +5 -1
- package/dist/cli/services/agent-config.js +66 -36
- package/dist/cli/services/agent-config.js.map +1 -0
- package/dist/cli/services/agent-definitions.d.ts +4 -1
- package/dist/cli/services/agent-definitions.js +97 -56
- package/dist/cli/services/agent-definitions.js.map +1 -0
- package/dist/cli/services/agent-events.js +225 -162
- package/dist/cli/services/agent-events.js.map +1 -0
- package/dist/cli/services/agent-loop.js +976 -688
- package/dist/cli/services/agent-loop.js.map +1 -0
- package/dist/cli/services/agent-worker-base.d.ts +35 -5
- package/dist/cli/services/agent-worker-base.js +337 -153
- package/dist/cli/services/agent-worker-base.js.map +1 -0
- package/dist/cli/services/api-retry.js +69 -64
- package/dist/cli/services/api-retry.js.map +1 -0
- package/dist/cli/services/auth-service.d.ts +3 -3
- package/dist/cli/services/auth-service.js +209 -132
- package/dist/cli/services/auth-service.js.map +1 -0
- package/dist/cli/services/background-processes.js +343 -267
- package/dist/cli/services/background-processes.js.map +1 -0
- package/dist/cli/services/browser-auth.d.ts +2 -2
- package/dist/cli/services/browser-auth.js +159 -118
- package/dist/cli/services/browser-auth.js.map +1 -0
- package/dist/cli/services/claude-md-loader.js +40 -36
- package/dist/cli/services/claude-md-loader.js.map +1 -0
- package/dist/cli/services/config-store.d.ts +9 -4
- package/dist/cli/services/config-store.js +164 -117
- package/dist/cli/services/config-store.js.map +1 -0
- package/dist/cli/services/debug-log.d.ts +1 -1
- package/dist/cli/services/debug-log.js +34 -35
- package/dist/cli/services/debug-log.js.map +1 -0
- package/dist/cli/services/env-detect.d.ts +7 -0
- package/dist/cli/services/env-detect.js +9 -0
- package/dist/cli/services/env-detect.js.map +1 -0
- package/dist/cli/services/error-logger.js +187 -169
- package/dist/cli/services/error-logger.js.map +1 -0
- package/dist/cli/services/file-history.d.ts +1 -1
- package/dist/cli/services/file-history.js +50 -54
- package/dist/cli/services/file-history.js.map +1 -0
- package/dist/cli/services/format-server-response.js +332 -372
- package/dist/cli/services/format-server-response.js.map +1 -0
- package/dist/cli/services/git-context.js +61 -45
- package/dist/cli/services/git-context.js.map +1 -0
- package/dist/cli/services/hooks.d.ts +2 -2
- package/dist/cli/services/hooks.js +195 -180
- package/dist/cli/services/hooks.js.map +1 -0
- package/dist/cli/services/ink-incremental.d.ts +19 -0
- package/dist/cli/services/ink-incremental.js +59 -0
- package/dist/cli/services/ink-incremental.js.map +1 -0
- package/dist/cli/services/ink-resize-fix.js +54 -44
- package/dist/cli/services/ink-resize-fix.js.map +1 -0
- package/dist/cli/services/ink-sync-output.d.ts +12 -0
- package/dist/cli/services/ink-sync-output.js +16 -0
- package/dist/cli/services/ink-sync-output.js.map +1 -0
- package/dist/cli/services/interactive-tools.js +268 -212
- package/dist/cli/services/interactive-tools.js.map +1 -0
- package/dist/cli/services/keybinding-manager.d.ts +11 -1
- package/dist/cli/services/keybinding-manager.js +126 -63
- package/dist/cli/services/keybinding-manager.js.map +1 -0
- package/dist/cli/services/local-tools.d.ts +1 -1
- package/dist/cli/services/local-tools.js +939 -656
- package/dist/cli/services/local-tools.js.map +1 -0
- package/dist/cli/services/lsp-manager.js +757 -594
- package/dist/cli/services/lsp-manager.js.map +1 -0
- package/dist/cli/services/mcp-client.d.ts +1 -1
- package/dist/cli/services/mcp-client.js +173 -134
- package/dist/cli/services/mcp-client.js.map +1 -0
- package/dist/cli/services/memory-manager.js +53 -40
- package/dist/cli/services/memory-manager.js.map +1 -0
- package/dist/cli/services/model-manager.js +55 -40
- package/dist/cli/services/model-manager.js.map +1 -0
- package/dist/cli/services/model-router.js +115 -85
- package/dist/cli/services/model-router.js.map +1 -0
- package/dist/cli/services/paths.d.ts +30 -0
- package/dist/cli/services/paths.js +81 -0
- package/dist/cli/services/paths.js.map +1 -0
- package/dist/cli/services/permission-modes.js +32 -25
- package/dist/cli/services/permission-modes.js.map +1 -0
- package/dist/cli/services/rewind.js +182 -168
- package/dist/cli/services/rewind.js.map +1 -0
- package/dist/cli/services/ripgrep.js +115 -115
- package/dist/cli/services/ripgrep.js.map +1 -0
- package/dist/cli/services/sandbox.d.ts +1 -1
- package/dist/cli/services/sandbox.js +58 -37
- package/dist/cli/services/sandbox.js.map +1 -0
- package/dist/cli/services/server-tools.js +738 -565
- package/dist/cli/services/server-tools.js.map +1 -0
- package/dist/cli/services/session-persistence.js +69 -74
- package/dist/cli/services/session-persistence.js.map +1 -0
- package/dist/cli/services/subagent-worker.js +42 -27
- package/dist/cli/services/subagent-worker.js.map +1 -0
- package/dist/cli/services/subagent.d.ts +2 -0
- package/dist/cli/services/subagent.js +605 -433
- package/dist/cli/services/subagent.js.map +1 -0
- package/dist/cli/services/system-prompt.js +86 -78
- package/dist/cli/services/system-prompt.js.map +1 -0
- package/dist/cli/services/task-decomposer.d.ts +1 -1
- package/dist/cli/services/task-decomposer.js +172 -139
- package/dist/cli/services/task-decomposer.js.map +1 -0
- package/dist/cli/services/team-lead.d.ts +2 -2
- package/dist/cli/services/team-lead.js +727 -529
- package/dist/cli/services/team-lead.js.map +1 -0
- package/dist/cli/services/team-state.js +319 -319
- package/dist/cli/services/team-state.js.map +1 -0
- package/dist/cli/services/teammate.d.ts +8 -2
- package/dist/cli/services/teammate.js +857 -569
- package/dist/cli/services/teammate.js.map +1 -0
- package/dist/cli/services/telemetry.d.ts +6 -1
- package/dist/cli/services/telemetry.js +180 -157
- package/dist/cli/services/telemetry.js.map +1 -0
- package/dist/cli/services/tools/agent-tools.d.ts +3 -3
- package/dist/cli/services/tools/agent-tools.js +480 -322
- package/dist/cli/services/tools/agent-tools.js.map +1 -0
- package/dist/cli/services/tools/file-ops.js +563 -450
- package/dist/cli/services/tools/file-ops.js.map +1 -0
- package/dist/cli/services/tools/search-tools.js +231 -162
- package/dist/cli/services/tools/search-tools.js.map +1 -0
- package/dist/cli/services/tools/shell-exec.js +197 -151
- package/dist/cli/services/tools/shell-exec.js.map +1 -0
- package/dist/cli/services/tools/task-manager.js +206 -173
- package/dist/cli/services/tools/task-manager.js.map +1 -0
- package/dist/cli/services/tools/web-tools.js +388 -341
- package/dist/cli/services/tools/web-tools.js.map +1 -0
- package/dist/cli/setup/SetupApp.d.ts +2 -2
- package/dist/cli/setup/SetupApp.js +608 -160
- package/dist/cli/setup/SetupApp.js.map +1 -0
- package/dist/cli/shared/ErrorBoundary.d.ts +22 -0
- package/dist/cli/shared/ErrorBoundary.js +73 -0
- package/dist/cli/shared/ErrorBoundary.js.map +1 -0
- package/dist/cli/shared/MatrixIntro.js +66 -69
- package/dist/cli/shared/MatrixIntro.js.map +1 -0
- package/dist/cli/shared/SpinnerSlot.d.ts +14 -0
- package/dist/cli/shared/SpinnerSlot.js +63 -0
- package/dist/cli/shared/SpinnerSlot.js.map +1 -0
- package/dist/cli/shared/Theme.d.ts +1 -1
- package/dist/cli/shared/Theme.js +136 -92
- package/dist/cli/shared/Theme.js.map +1 -0
- package/dist/cli/shared/WhaleBanner.js +99 -11
- package/dist/cli/shared/WhaleBanner.js.map +1 -0
- package/dist/cli/shared/markdown.d.ts +3 -1
- package/dist/cli/shared/markdown.js +736 -674
- package/dist/cli/shared/markdown.js.map +1 -0
- package/dist/cli/shared/marked-terminal.d.js +2 -0
- package/dist/cli/shared/marked-terminal.d.js.map +1 -0
- package/dist/cli/shared/theme-manager.js +99 -90
- package/dist/cli/shared/theme-manager.js.map +1 -0
- package/dist/cli/shared/theme-presets.js +256 -254
- package/dist/cli/shared/theme-presets.js.map +1 -0
- package/dist/cli/status/StatusApp.js +235 -86
- package/dist/cli/status/StatusApp.js.map +1 -0
- package/dist/cli/stores/StoreApp.js +275 -65
- package/dist/cli/stores/StoreApp.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +509 -396
- package/dist/index.js.map +1 -0
- package/dist/local-agent/connection.d.ts +2 -2
- package/dist/local-agent/connection.js +352 -293
- package/dist/local-agent/connection.js.map +1 -0
- package/dist/local-agent/discovery.js +259 -122
- package/dist/local-agent/discovery.js.map +1 -0
- package/dist/local-agent/executor.js +216 -193
- package/dist/local-agent/executor.js.map +1 -0
- package/dist/local-agent/index.d.ts +2 -2
- package/dist/local-agent/index.js +156 -156
- package/dist/local-agent/index.js.map +1 -0
- package/dist/node/adapters/base.js +18 -8
- package/dist/node/adapters/base.js.map +1 -0
- package/dist/node/adapters/discord.js +286 -275
- package/dist/node/adapters/discord.js.map +1 -0
- package/dist/node/adapters/email.js +189 -202
- package/dist/node/adapters/email.js.map +1 -0
- package/dist/node/adapters/imessage.js +145 -142
- package/dist/node/adapters/imessage.js.map +1 -0
- package/dist/node/adapters/slack.js +237 -236
- package/dist/node/adapters/slack.js.map +1 -0
- package/dist/node/adapters/sms.js +149 -151
- package/dist/node/adapters/sms.js.map +1 -0
- package/dist/node/adapters/telegram.js +88 -92
- package/dist/node/adapters/telegram.js.map +1 -0
- package/dist/node/adapters/webchat.js +160 -136
- package/dist/node/adapters/webchat.js.map +1 -0
- package/dist/node/adapters/whatsapp.js +212 -215
- package/dist/node/adapters/whatsapp.js.map +1 -0
- package/dist/node/cli.js +884 -653
- package/dist/node/cli.js.map +1 -0
- package/dist/node/config.js +20 -18
- package/dist/node/config.js.map +1 -0
- package/dist/node/gateway-client.js +191 -181
- package/dist/node/gateway-client.js.map +1 -0
- package/dist/node/portal/clipboard.js +161 -130
- package/dist/node/portal/clipboard.js.map +1 -0
- package/dist/node/portal/discovery.js +51 -45
- package/dist/node/portal/discovery.js.map +1 -0
- package/dist/node/portal/forward.js +64 -58
- package/dist/node/portal/forward.js.map +1 -0
- package/dist/node/portal/index.js +246 -221
- package/dist/node/portal/index.js.map +1 -0
- package/dist/node/portal/multiplexer.js +192 -182
- package/dist/node/portal/multiplexer.js.map +1 -0
- package/dist/node/portal/permissions.js +102 -70
- package/dist/node/portal/permissions.js.map +1 -0
- package/dist/node/portal/protocol.js +153 -116
- package/dist/node/portal/protocol.js.map +1 -0
- package/dist/node/portal/screen.js +80 -69
- package/dist/node/portal/screen.js.map +1 -0
- package/dist/node/portal/session.js +124 -117
- package/dist/node/portal/session.js.map +1 -0
- package/dist/node/portal/shell.js +140 -113
- package/dist/node/portal/shell.js.map +1 -0
- package/dist/node/portal/stream.js +77 -75
- package/dist/node/portal/stream.js.map +1 -0
- package/dist/node/portal/transfer.js +190 -167
- package/dist/node/portal/transfer.js.map +1 -0
- package/dist/node/portal/ui.js +124 -99
- package/dist/node/portal/ui.js.map +1 -0
- package/dist/node/remote-desktop/compile-helper.js +50 -45
- package/dist/node/remote-desktop/compile-helper.js.map +1 -0
- package/dist/node/remote-desktop/index.js +215 -187
- package/dist/node/remote-desktop/index.js.map +1 -0
- package/dist/node/remote-desktop/protocol.js +45 -29
- package/dist/node/remote-desktop/protocol.js.map +1 -0
- package/dist/node/runtime.js +493 -410
- package/dist/node/runtime.js.map +1 -0
- package/dist/server/handlers/__test-utils__/test-db.js +39 -89
- package/dist/server/handlers/__test-utils__/test-db.js.map +1 -0
- package/dist/server/handlers/analytics.js +467 -261
- package/dist/server/handlers/analytics.js.map +1 -0
- package/dist/server/handlers/api-docs.js +1030 -895
- package/dist/server/handlers/api-docs.js.map +1 -0
- package/dist/server/handlers/api-keys.js +291 -242
- package/dist/server/handlers/api-keys.js.map +1 -0
- package/dist/server/handlers/billing.js +330 -239
- package/dist/server/handlers/billing.js.map +1 -0
- package/dist/server/handlers/browser.js +468 -395
- package/dist/server/handlers/browser.js.map +1 -0
- package/dist/server/handlers/catalog.js +1377 -978
- package/dist/server/handlers/catalog.js.map +1 -0
- package/dist/server/handlers/clickhouse.js +157 -109
- package/dist/server/handlers/clickhouse.js.map +1 -0
- package/dist/server/handlers/comms.js +1439 -984
- package/dist/server/handlers/comms.js.map +1 -0
- package/dist/server/handlers/creations.js +461 -394
- package/dist/server/handlers/creations.js.map +1 -0
- package/dist/server/handlers/crm.js +1082 -791
- package/dist/server/handlers/crm.js.map +1 -0
- package/dist/server/handlers/discovery.js +251 -232
- package/dist/server/handlers/discovery.js.map +1 -0
- package/dist/server/handlers/embeddings.js +241 -164
- package/dist/server/handlers/embeddings.js.map +1 -0
- package/dist/server/handlers/enrichment.js +887 -718
- package/dist/server/handlers/enrichment.js.map +1 -0
- package/dist/server/handlers/image-gen.js +467 -376
- package/dist/server/handlers/image-gen.js.map +1 -0
- package/dist/server/handlers/inventory.js +797 -424
- package/dist/server/handlers/inventory.js.map +1 -0
- package/dist/server/handlers/kali.js +272 -230
- package/dist/server/handlers/kali.js.map +1 -0
- package/dist/server/handlers/llm-providers.js +803 -580
- package/dist/server/handlers/llm-providers.js.map +1 -0
- package/dist/server/handlers/local-agent.js +133 -105
- package/dist/server/handlers/local-agent.js.map +1 -0
- package/dist/server/handlers/media.js +1179 -857
- package/dist/server/handlers/media.js.map +1 -0
- package/dist/server/handlers/meta-ads.js +2669 -2093
- package/dist/server/handlers/meta-ads.js.map +1 -0
- package/dist/server/handlers/nodes.js +1321 -913
- package/dist/server/handlers/nodes.js.map +1 -0
- package/dist/server/handlers/operations.js +183 -157
- package/dist/server/handlers/operations.js.map +1 -0
- package/dist/server/handlers/platform.js +346 -210
- package/dist/server/handlers/platform.js.map +1 -0
- package/dist/server/handlers/remove-bg.js +118 -86
- package/dist/server/handlers/remove-bg.js.map +1 -0
- package/dist/server/handlers/storefront.js +586 -446
- package/dist/server/handlers/storefront.js.map +1 -0
- package/dist/server/handlers/supply-chain.js +546 -326
- package/dist/server/handlers/supply-chain.js.map +1 -0
- package/dist/server/handlers/transcription.js +106 -97
- package/dist/server/handlers/transcription.js.map +1 -0
- package/dist/server/handlers/video-gen.js +593 -424
- package/dist/server/handlers/video-gen.js.map +1 -0
- package/dist/server/handlers/voice.js +1458 -1039
- package/dist/server/handlers/voice.js.map +1 -0
- package/dist/server/handlers/workflow-steps.js +2837 -2116
- package/dist/server/handlers/workflow-steps.js.map +1 -0
- package/dist/server/handlers/workflows.js +1630 -933
- package/dist/server/handlers/workflows.js.map +1 -0
- package/dist/server/index.js +3167 -2422
- package/dist/server/index.js.map +1 -0
- package/dist/server/lib/batch-client.js +471 -409
- package/dist/server/lib/batch-client.js.map +1 -0
- package/dist/server/lib/clickhouse-buffer.js +118 -104
- package/dist/server/lib/clickhouse-buffer.js.map +1 -0
- package/dist/server/lib/clickhouse-client.js +107 -107
- package/dist/server/lib/clickhouse-client.js.map +1 -0
- package/dist/server/lib/coa-renderer.js +1786 -356
- package/dist/server/lib/coa-renderer.js.map +1 -0
- package/dist/server/lib/code-worker-pool.js +227 -177
- package/dist/server/lib/code-worker-pool.js.map +1 -0
- package/dist/server/lib/code-worker.js +174 -164
- package/dist/server/lib/code-worker.js.map +1 -0
- package/dist/server/lib/compaction-service.d.ts +2 -12
- package/dist/server/lib/compaction-service.js +74 -184
- package/dist/server/lib/compaction-service.js.map +1 -0
- package/dist/server/lib/logger.js +36 -24
- package/dist/server/lib/logger.js.map +1 -0
- package/dist/server/lib/otel.js +101 -80
- package/dist/server/lib/otel.js.map +1 -0
- package/dist/server/lib/pdf-renderer.js +952 -788
- package/dist/server/lib/pdf-renderer.js.map +1 -0
- package/dist/server/lib/prompt-sanitizer.js +188 -108
- package/dist/server/lib/prompt-sanitizer.js.map +1 -0
- package/dist/server/lib/provider-capabilities.js +136 -138
- package/dist/server/lib/provider-capabilities.js.map +1 -0
- package/dist/server/lib/provider-failover.js +190 -168
- package/dist/server/lib/provider-failover.js.map +1 -0
- package/dist/server/lib/rate-limiter.js +186 -117
- package/dist/server/lib/rate-limiter.js.map +1 -0
- package/dist/server/lib/react-pdf-layout.js +551 -382
- package/dist/server/lib/react-pdf-layout.js.map +1 -0
- package/dist/server/lib/server-agent-loop.d.ts +4 -1
- package/dist/server/lib/server-agent-loop.js +906 -634
- package/dist/server/lib/server-agent-loop.js.map +1 -0
- package/dist/server/lib/server-subagent.js +260 -164
- package/dist/server/lib/server-subagent.js.map +1 -0
- package/dist/server/lib/session-checkpoint.js +105 -96
- package/dist/server/lib/session-checkpoint.js.map +1 -0
- package/dist/server/lib/ssrf-guard.js +193 -184
- package/dist/server/lib/ssrf-guard.js.map +1 -0
- package/dist/server/lib/supabase-client.js +94 -82
- package/dist/server/lib/supabase-client.js.map +1 -0
- package/dist/server/lib/template-resolver.js +154 -176
- package/dist/server/lib/template-resolver.js.map +1 -0
- package/dist/server/lib/utils.js +242 -133
- package/dist/server/lib/utils.js.map +1 -0
- package/dist/server/local-agent-gateway.d.ts +2 -2
- package/dist/server/local-agent-gateway.js +785 -627
- package/dist/server/local-agent-gateway.js.map +1 -0
- package/dist/server/providers/anthropic.js +250 -172
- package/dist/server/providers/anthropic.js.map +1 -0
- package/dist/server/providers/bedrock.js +217 -158
- package/dist/server/providers/bedrock.js.map +1 -0
- package/dist/server/providers/gemini.js +548 -418
- package/dist/server/providers/gemini.js.map +1 -0
- package/dist/server/providers/openai.js +571 -437
- package/dist/server/providers/openai.js.map +1 -0
- package/dist/server/providers/registry.js +23 -18
- package/dist/server/providers/registry.js.map +1 -0
- package/dist/server/providers/shared.js +123 -95
- package/dist/server/providers/shared.js.map +1 -0
- package/dist/server/providers/types.js +1 -11
- package/dist/server/providers/types.js.map +1 -0
- package/dist/server/proxy-handlers.js +209 -165
- package/dist/server/proxy-handlers.js.map +1 -0
- package/dist/server/tool-router.js +959 -599
- package/dist/server/tool-router.js.map +1 -0
- package/dist/server/validation.js +248 -188
- package/dist/server/validation.js.map +1 -0
- package/dist/server/worker.js +202 -133
- package/dist/server/worker.js.map +1 -0
- package/dist/setup.d.ts +2 -2
- package/dist/setup.js +151 -147
- package/dist/setup.js.map +1 -0
- package/dist/shared/agent-core.d.ts +115 -26
- package/dist/shared/agent-core.js +956 -522
- package/dist/shared/agent-core.js.map +1 -0
- package/dist/shared/anthropic-types.js +1 -6
- package/dist/shared/anthropic-types.js.map +1 -0
- package/dist/shared/api-client.d.ts +16 -9
- package/dist/shared/api-client.js +419 -327
- package/dist/shared/api-client.js.map +1 -0
- package/dist/shared/compaction.d.ts +36 -0
- package/dist/shared/compaction.js +138 -0
- package/dist/shared/compaction.js.map +1 -0
- package/dist/shared/constants.js +67 -64
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/sse-parser.js +221 -219
- package/dist/shared/sse-parser.js.map +1 -0
- package/dist/shared/tool-dispatch.d.ts +4 -0
- package/dist/shared/tool-dispatch.js +226 -165
- package/dist/shared/tool-dispatch.js.map +1 -0
- package/dist/shared/types.js +1 -6
- package/dist/shared/types.js.map +1 -0
- package/dist/types/cli-highlight.d.js +2 -0
- package/dist/types/cli-highlight.d.js.map +1 -0
- package/dist/types/diff.d.js +2 -0
- package/dist/types/diff.d.js.map +1 -0
- package/dist/types/pdf-parse.d.js +2 -0
- package/dist/types/pdf-parse.d.js.map +1 -0
- package/dist/updater.d.ts +1 -1
- package/dist/updater.js +118 -92
- package/dist/updater.js.map +1 -0
- package/dist/webchat/widget.js +227 -380
- package/dist/webchat/widget.js.map +1 -0
- package/package.json +22 -10
- package/vendor/ink/build/ansi-tokenizer.d.ts +38 -0
- package/vendor/ink/build/ansi-tokenizer.js +316 -0
- package/vendor/ink/build/ansi-tokenizer.js.map +1 -0
- package/vendor/ink/build/apply-styles.js +175 -0
- package/vendor/ink/build/build-layout.js +77 -0
- package/vendor/ink/build/calculate-wrapped-text.js +53 -0
- package/vendor/ink/build/colorize.d.ts +3 -0
- package/vendor/ink/build/colorize.js +48 -0
- package/vendor/ink/build/colorize.js.map +1 -0
- package/vendor/ink/build/components/AccessibilityContext.d.ts +3 -0
- package/vendor/ink/build/components/AccessibilityContext.js +5 -0
- package/vendor/ink/build/components/AccessibilityContext.js.map +1 -0
- package/vendor/ink/build/components/App.d.ts +18 -0
- package/vendor/ink/build/components/App.js +351 -0
- package/vendor/ink/build/components/App.js.map +1 -0
- package/vendor/ink/build/components/AppContext.d.ts +15 -0
- package/vendor/ink/build/components/AppContext.js +11 -0
- package/vendor/ink/build/components/AppContext.js.map +1 -0
- package/vendor/ink/build/components/BackgroundContext.d.ts +4 -0
- package/vendor/ink/build/components/BackgroundContext.js +3 -0
- package/vendor/ink/build/components/BackgroundContext.js.map +1 -0
- package/vendor/ink/build/components/Box.d.ts +117 -0
- package/vendor/ink/build/components/Box.js +34 -0
- package/vendor/ink/build/components/Box.js.map +1 -0
- package/vendor/ink/build/components/Color.js +62 -0
- package/vendor/ink/build/components/Cursor.d.ts +83 -0
- package/vendor/ink/build/components/Cursor.js +53 -0
- package/vendor/ink/build/components/Cursor.js.map +1 -0
- package/vendor/ink/build/components/CursorContext.d.ts +11 -0
- package/vendor/ink/build/components/CursorContext.js +8 -0
- package/vendor/ink/build/components/CursorContext.js.map +1 -0
- package/vendor/ink/build/components/ErrorBoundary.d.ts +18 -0
- package/vendor/ink/build/components/ErrorBoundary.js +23 -0
- package/vendor/ink/build/components/ErrorBoundary.js.map +1 -0
- package/vendor/ink/build/components/ErrorOverview.d.ts +6 -0
- package/vendor/ink/build/components/ErrorOverview.js +84 -0
- package/vendor/ink/build/components/ErrorOverview.js.map +1 -0
- package/vendor/ink/build/components/FocusContext.d.ts +16 -0
- package/vendor/ink/build/components/FocusContext.js +17 -0
- package/vendor/ink/build/components/FocusContext.js.map +1 -0
- package/vendor/ink/build/components/Newline.d.ts +13 -0
- package/vendor/ink/build/components/Newline.js +8 -0
- package/vendor/ink/build/components/Newline.js.map +1 -0
- package/vendor/ink/build/components/Spacer.d.ts +7 -0
- package/vendor/ink/build/components/Spacer.js +11 -0
- package/vendor/ink/build/components/Spacer.js.map +1 -0
- package/vendor/ink/build/components/Static.d.ts +24 -0
- package/vendor/ink/build/components/Static.js +28 -0
- package/vendor/ink/build/components/Static.js.map +1 -0
- package/vendor/ink/build/components/StderrContext.d.ts +15 -0
- package/vendor/ink/build/components/StderrContext.js +13 -0
- package/vendor/ink/build/components/StderrContext.js.map +1 -0
- package/vendor/ink/build/components/StdinContext.d.ts +22 -0
- package/vendor/ink/build/components/StdinContext.js +19 -0
- package/vendor/ink/build/components/StdinContext.js.map +1 -0
- package/vendor/ink/build/components/StdoutContext.d.ts +15 -0
- package/vendor/ink/build/components/StdoutContext.js +13 -0
- package/vendor/ink/build/components/StdoutContext.js.map +1 -0
- package/vendor/ink/build/components/Text.d.ts +55 -0
- package/vendor/ink/build/components/Text.js +50 -0
- package/vendor/ink/build/components/Text.js.map +1 -0
- package/vendor/ink/build/components/Transform.d.ts +16 -0
- package/vendor/ink/build/components/Transform.js +15 -0
- package/vendor/ink/build/components/Transform.js.map +1 -0
- package/vendor/ink/build/cursor-helpers.d.ts +38 -0
- package/vendor/ink/build/cursor-helpers.js +56 -0
- package/vendor/ink/build/cursor-helpers.js.map +1 -0
- package/vendor/ink/build/devtools-window-polyfill.d.ts +1 -0
- package/vendor/ink/build/devtools-window-polyfill.js +65 -0
- package/vendor/ink/build/devtools-window-polyfill.js.map +1 -0
- package/vendor/ink/build/devtools.d.ts +1 -0
- package/vendor/ink/build/devtools.js +11 -0
- package/vendor/ink/build/devtools.js.map +1 -0
- package/vendor/ink/build/dom.d.ts +56 -0
- package/vendor/ink/build/dom.js +124 -0
- package/vendor/ink/build/dom.js.map +1 -0
- package/vendor/ink/build/experimental/apply-style.js +140 -0
- package/vendor/ink/build/experimental/dom.js +123 -0
- package/vendor/ink/build/experimental/output.js +91 -0
- package/vendor/ink/build/experimental/reconciler.js +141 -0
- package/vendor/ink/build/experimental/renderer.js +81 -0
- package/vendor/ink/build/get-max-width.d.ts +3 -0
- package/vendor/ink/build/get-max-width.js +10 -0
- package/vendor/ink/build/get-max-width.js.map +1 -0
- package/vendor/ink/build/hooks/use-app.d.ts +5 -0
- package/vendor/ink/build/hooks/use-app.js +8 -0
- package/vendor/ink/build/hooks/use-app.js.map +1 -0
- package/vendor/ink/build/hooks/use-cursor.d.ts +12 -0
- package/vendor/ink/build/hooks/use-cursor.js +29 -0
- package/vendor/ink/build/hooks/use-cursor.js.map +1 -0
- package/vendor/ink/build/hooks/use-focus-manager.d.ts +28 -0
- package/vendor/ink/build/hooks/use-focus-manager.js +17 -0
- package/vendor/ink/build/hooks/use-focus-manager.js.map +1 -0
- package/vendor/ink/build/hooks/use-focus.d.ts +29 -0
- package/vendor/ink/build/hooks/use-focus.js +42 -0
- package/vendor/ink/build/hooks/use-focus.js.map +1 -0
- package/vendor/ink/build/hooks/use-input.d.ts +131 -0
- package/vendor/ink/build/hooks/use-input.js +124 -0
- package/vendor/ink/build/hooks/use-input.js.map +1 -0
- package/vendor/ink/build/hooks/use-is-screen-reader-enabled.d.ts +5 -0
- package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js +11 -0
- package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js.map +1 -0
- package/vendor/ink/build/hooks/use-stderr.d.ts +5 -0
- package/vendor/ink/build/hooks/use-stderr.js +8 -0
- package/vendor/ink/build/hooks/use-stderr.js.map +1 -0
- package/vendor/ink/build/hooks/use-stdin.d.ts +5 -0
- package/vendor/ink/build/hooks/use-stdin.js +8 -0
- package/vendor/ink/build/hooks/use-stdin.js.map +1 -0
- package/vendor/ink/build/hooks/use-stdout.d.ts +5 -0
- package/vendor/ink/build/hooks/use-stdout.js +8 -0
- package/vendor/ink/build/hooks/use-stdout.js.map +1 -0
- package/vendor/ink/build/hooks/useInput.js +38 -0
- package/vendor/ink/build/index.d.ts +34 -0
- package/vendor/ink/build/index.js +20 -0
- package/vendor/ink/build/index.js.map +1 -0
- package/vendor/ink/build/ink.d.ts +90 -0
- package/vendor/ink/build/ink.js +654 -0
- package/vendor/ink/build/ink.js.map +1 -0
- package/vendor/ink/build/input-parser.d.ts +7 -0
- package/vendor/ink/build/input-parser.js +154 -0
- package/vendor/ink/build/input-parser.js.map +1 -0
- package/vendor/ink/build/instance.js +205 -0
- package/vendor/ink/build/instances.d.ts +3 -0
- package/vendor/ink/build/instances.js +8 -0
- package/vendor/ink/build/instances.js.map +1 -0
- package/vendor/ink/build/kitty-keyboard.d.ts +23 -0
- package/vendor/ink/build/kitty-keyboard.js +32 -0
- package/vendor/ink/build/kitty-keyboard.js.map +1 -0
- package/vendor/ink/build/layout.d.ts +7 -0
- package/vendor/ink/build/layout.js +33 -0
- package/vendor/ink/build/layout.js.map +1 -0
- package/vendor/ink/build/log-update.d.ts +19 -0
- package/vendor/ink/build/log-update.js +243 -0
- package/vendor/ink/build/log-update.js.map +1 -0
- package/vendor/ink/build/measure-element.d.ts +16 -0
- package/vendor/ink/build/measure-element.js +9 -0
- package/vendor/ink/build/measure-element.js.map +1 -0
- package/vendor/ink/build/measure-text.d.ts +6 -0
- package/vendor/ink/build/measure-text.js +21 -0
- package/vendor/ink/build/measure-text.js.map +1 -0
- package/vendor/ink/build/options.d.ts +52 -0
- package/vendor/ink/build/options.js +2 -0
- package/vendor/ink/build/options.js.map +1 -0
- package/vendor/ink/build/output.d.ts +35 -0
- package/vendor/ink/build/output.js +183 -0
- package/vendor/ink/build/output.js.map +1 -0
- package/vendor/ink/build/parse-keypress.d.ts +22 -0
- package/vendor/ink/build/parse-keypress.js +493 -0
- package/vendor/ink/build/parse-keypress.js.map +1 -0
- package/vendor/ink/build/reconciler.d.ts +4 -0
- package/vendor/ink/build/reconciler.js +274 -0
- package/vendor/ink/build/reconciler.js.map +1 -0
- package/vendor/ink/build/render-background.d.ts +4 -0
- package/vendor/ink/build/render-background.js +25 -0
- package/vendor/ink/build/render-background.js.map +1 -0
- package/vendor/ink/build/render-border.d.ts +4 -0
- package/vendor/ink/build/render-border.js +73 -0
- package/vendor/ink/build/render-border.js.map +1 -0
- package/vendor/ink/build/render-node-to-output.d.ts +14 -0
- package/vendor/ink/build/render-node-to-output.js +147 -0
- package/vendor/ink/build/render-node-to-output.js.map +1 -0
- package/vendor/ink/build/render-to-string.d.ts +38 -0
- package/vendor/ink/build/render-to-string.js +115 -0
- package/vendor/ink/build/render-to-string.js.map +1 -0
- package/vendor/ink/build/render.d.ts +121 -0
- package/vendor/ink/build/render.js +55 -0
- package/vendor/ink/build/render.js.map +1 -0
- package/vendor/ink/build/renderer.d.ts +8 -0
- package/vendor/ink/build/renderer.js +55 -0
- package/vendor/ink/build/renderer.js.map +1 -0
- package/vendor/ink/build/sanitize-ansi.d.ts +2 -0
- package/vendor/ink/build/sanitize-ansi.js +27 -0
- package/vendor/ink/build/sanitize-ansi.js.map +1 -0
- package/vendor/ink/build/screen-reader-update.d.ts +13 -0
- package/vendor/ink/build/screen-reader-update.js +38 -0
- package/vendor/ink/build/screen-reader-update.js.map +1 -0
- package/vendor/ink/build/squash-text-nodes.d.ts +3 -0
- package/vendor/ink/build/squash-text-nodes.js +36 -0
- package/vendor/ink/build/squash-text-nodes.js.map +1 -0
- package/vendor/ink/build/styles.d.ts +240 -0
- package/vendor/ink/build/styles.js +232 -0
- package/vendor/ink/build/styles.js.map +1 -0
- package/vendor/ink/build/utils.d.ts +2 -0
- package/vendor/ink/build/utils.js +4 -0
- package/vendor/ink/build/utils.js.map +1 -0
- package/vendor/ink/build/wrap-text.d.ts +3 -0
- package/vendor/ink/build/wrap-text.js +31 -0
- package/vendor/ink/build/wrap-text.js.map +1 -0
- package/vendor/ink/build/write-synchronized.d.ts +4 -0
- package/vendor/ink/build/write-synchronized.js +7 -0
- package/vendor/ink/build/write-synchronized.js.map +1 -0
- package/vendor/ink/license +10 -0
- package/vendor/ink/node_modules/@types/node/LICENSE +21 -0
- package/vendor/ink/node_modules/@types/node/README.md +15 -0
- package/vendor/ink/node_modules/@types/node/assert/strict.d.ts +105 -0
- package/vendor/ink/node_modules/@types/node/assert.d.ts +955 -0
- package/vendor/ink/node_modules/@types/node/async_hooks.d.ts +623 -0
- package/vendor/ink/node_modules/@types/node/buffer.buffer.d.ts +466 -0
- package/vendor/ink/node_modules/@types/node/buffer.d.ts +1810 -0
- package/vendor/ink/node_modules/@types/node/child_process.d.ts +1428 -0
- package/vendor/ink/node_modules/@types/node/cluster.d.ts +486 -0
- package/vendor/ink/node_modules/@types/node/compatibility/iterators.d.ts +21 -0
- package/vendor/ink/node_modules/@types/node/console.d.ts +151 -0
- package/vendor/ink/node_modules/@types/node/constants.d.ts +20 -0
- package/vendor/ink/node_modules/@types/node/crypto.d.ts +4065 -0
- package/vendor/ink/node_modules/@types/node/dgram.d.ts +564 -0
- package/vendor/ink/node_modules/@types/node/diagnostics_channel.d.ts +576 -0
- package/vendor/ink/node_modules/@types/node/dns/promises.d.ts +503 -0
- package/vendor/ink/node_modules/@types/node/dns.d.ts +922 -0
- package/vendor/ink/node_modules/@types/node/domain.d.ts +166 -0
- package/vendor/ink/node_modules/@types/node/events.d.ts +1054 -0
- package/vendor/ink/node_modules/@types/node/fs/promises.d.ts +1329 -0
- package/vendor/ink/node_modules/@types/node/fs.d.ts +4676 -0
- package/vendor/ink/node_modules/@types/node/globals.d.ts +150 -0
- package/vendor/ink/node_modules/@types/node/globals.typedarray.d.ts +101 -0
- package/vendor/ink/node_modules/@types/node/http.d.ts +2167 -0
- package/vendor/ink/node_modules/@types/node/http2.d.ts +2480 -0
- package/vendor/ink/node_modules/@types/node/https.d.ts +405 -0
- package/vendor/ink/node_modules/@types/node/index.d.ts +115 -0
- package/vendor/ink/node_modules/@types/node/inspector/promises.d.ts +41 -0
- package/vendor/ink/node_modules/@types/node/inspector.d.ts +224 -0
- package/vendor/ink/node_modules/@types/node/inspector.generated.d.ts +4226 -0
- package/vendor/ink/node_modules/@types/node/module.d.ts +819 -0
- package/vendor/ink/node_modules/@types/node/net.d.ts +933 -0
- package/vendor/ink/node_modules/@types/node/os.d.ts +507 -0
- package/vendor/ink/node_modules/@types/node/package.json +155 -0
- package/vendor/ink/node_modules/@types/node/path/posix.d.ts +8 -0
- package/vendor/ink/node_modules/@types/node/path/win32.d.ts +8 -0
- package/vendor/ink/node_modules/@types/node/path.d.ts +187 -0
- package/vendor/ink/node_modules/@types/node/perf_hooks.d.ts +643 -0
- package/vendor/ink/node_modules/@types/node/process.d.ts +2156 -0
- package/vendor/ink/node_modules/@types/node/punycode.d.ts +117 -0
- package/vendor/ink/node_modules/@types/node/querystring.d.ts +152 -0
- package/vendor/ink/node_modules/@types/node/quic.d.ts +910 -0
- package/vendor/ink/node_modules/@types/node/readline/promises.d.ts +161 -0
- package/vendor/ink/node_modules/@types/node/readline.d.ts +541 -0
- package/vendor/ink/node_modules/@types/node/repl.d.ts +415 -0
- package/vendor/ink/node_modules/@types/node/sea.d.ts +162 -0
- package/vendor/ink/node_modules/@types/node/sqlite.d.ts +955 -0
- package/vendor/ink/node_modules/@types/node/stream/consumers.d.ts +38 -0
- package/vendor/ink/node_modules/@types/node/stream/promises.d.ts +211 -0
- package/vendor/ink/node_modules/@types/node/stream/web.d.ts +296 -0
- package/vendor/ink/node_modules/@types/node/stream.d.ts +1760 -0
- package/vendor/ink/node_modules/@types/node/string_decoder.d.ts +67 -0
- package/vendor/ink/node_modules/@types/node/test/reporters.d.ts +96 -0
- package/vendor/ink/node_modules/@types/node/test.d.ts +2240 -0
- package/vendor/ink/node_modules/@types/node/timers/promises.d.ts +108 -0
- package/vendor/ink/node_modules/@types/node/timers.d.ts +159 -0
- package/vendor/ink/node_modules/@types/node/tls.d.ts +1198 -0
- package/vendor/ink/node_modules/@types/node/trace_events.d.ts +197 -0
- package/vendor/ink/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +462 -0
- package/vendor/ink/node_modules/@types/node/ts5.6/compatibility/float16array.d.ts +71 -0
- package/vendor/ink/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +36 -0
- package/vendor/ink/node_modules/@types/node/ts5.6/index.d.ts +117 -0
- package/vendor/ink/node_modules/@types/node/ts5.7/compatibility/float16array.d.ts +72 -0
- package/vendor/ink/node_modules/@types/node/ts5.7/index.d.ts +117 -0
- package/vendor/ink/node_modules/@types/node/tty.d.ts +250 -0
- package/vendor/ink/node_modules/@types/node/url.d.ts +519 -0
- package/vendor/ink/node_modules/@types/node/util/types.d.ts +558 -0
- package/vendor/ink/node_modules/@types/node/util.d.ts +1662 -0
- package/vendor/ink/node_modules/@types/node/v8.d.ts +983 -0
- package/vendor/ink/node_modules/@types/node/vm.d.ts +1208 -0
- package/vendor/ink/node_modules/@types/node/wasi.d.ts +202 -0
- package/vendor/ink/node_modules/@types/node/web-globals/abortcontroller.d.ts +59 -0
- package/vendor/ink/node_modules/@types/node/web-globals/blob.d.ts +23 -0
- package/vendor/ink/node_modules/@types/node/web-globals/console.d.ts +9 -0
- package/vendor/ink/node_modules/@types/node/web-globals/crypto.d.ts +39 -0
- package/vendor/ink/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
- package/vendor/ink/node_modules/@types/node/web-globals/encoding.d.ts +11 -0
- package/vendor/ink/node_modules/@types/node/web-globals/events.d.ts +106 -0
- package/vendor/ink/node_modules/@types/node/web-globals/fetch.d.ts +69 -0
- package/vendor/ink/node_modules/@types/node/web-globals/importmeta.d.ts +13 -0
- package/vendor/ink/node_modules/@types/node/web-globals/messaging.d.ts +23 -0
- package/vendor/ink/node_modules/@types/node/web-globals/navigator.d.ts +25 -0
- package/vendor/ink/node_modules/@types/node/web-globals/performance.d.ts +45 -0
- package/vendor/ink/node_modules/@types/node/web-globals/storage.d.ts +24 -0
- package/vendor/ink/node_modules/@types/node/web-globals/streams.d.ts +115 -0
- package/vendor/ink/node_modules/@types/node/web-globals/timers.d.ts +44 -0
- package/vendor/ink/node_modules/@types/node/web-globals/url.d.ts +24 -0
- package/vendor/ink/node_modules/@types/node/worker_threads.d.ts +717 -0
- package/vendor/ink/node_modules/@types/node/zlib.d.ts +618 -0
- package/vendor/ink/node_modules/node-pty/LICENSE +69 -0
- package/vendor/ink/node_modules/node-pty/README.md +164 -0
- package/vendor/ink/node_modules/node-pty/binding.gyp +150 -0
- package/vendor/ink/node_modules/node-pty/lib/conpty_console_list_agent.js +25 -0
- package/vendor/ink/node_modules/node-pty/lib/eventEmitter2.js +47 -0
- package/vendor/ink/node_modules/node-pty/lib/index.js +52 -0
- package/vendor/ink/node_modules/node-pty/lib/interfaces.js +7 -0
- package/vendor/ink/node_modules/node-pty/lib/shared/conout.js +11 -0
- package/vendor/ink/node_modules/node-pty/lib/terminal.js +190 -0
- package/vendor/ink/node_modules/node-pty/lib/types.js +7 -0
- package/vendor/ink/node_modules/node-pty/lib/unixTerminal.js +349 -0
- package/vendor/ink/node_modules/node-pty/lib/utils.js +39 -0
- package/vendor/ink/node_modules/node-pty/lib/windowsConoutConnection.js +125 -0
- package/vendor/ink/node_modules/node-pty/lib/windowsPtyAgent.js +287 -0
- package/vendor/ink/node_modules/node-pty/lib/windowsTerminal.js +201 -0
- package/vendor/ink/node_modules/node-pty/lib/worker/conoutSocketWorker.js +22 -0
- package/vendor/ink/node_modules/node-pty/package.json +65 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/darwin-arm64/pty.node +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/darwin-arm64/spawn-helper +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/darwin-x64/pty.node +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/darwin-x64/spawn-helper +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/linux-arm64/pty.node +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/linux-x64/pty.node +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty.pdb +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.pdb +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty/conpty.dll +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty.node +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty.pdb +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.pdb +0 -0
- package/vendor/ink/node_modules/node-pty/scripts/post-install.js +76 -0
- package/vendor/ink/node_modules/node-pty/scripts/prebuild.js +34 -0
- package/vendor/ink/node_modules/node-pty/src/unix/pty.cc +875 -0
- package/vendor/ink/node_modules/node-pty/src/unix/spawn-helper.cc +23 -0
- package/vendor/ink/node_modules/node-pty/src/win/conpty.cc +582 -0
- package/vendor/ink/node_modules/node-pty/src/win/conpty.h +41 -0
- package/vendor/ink/node_modules/node-pty/src/win/conpty_console_list.cc +44 -0
- package/vendor/ink/node_modules/node-pty/src/win/path_util.cc +95 -0
- package/vendor/ink/node_modules/node-pty/src/win/path_util.h +26 -0
- package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-arm64/OpenConsole.exe +0 -0
- package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-arm64/conpty.dll +0 -0
- package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-x64/OpenConsole.exe +0 -0
- package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-x64/conpty.dll +0 -0
- package/vendor/ink/node_modules/node-pty/typings/node-pty.d.ts +215 -0
- package/vendor/ink/node_modules/undici-types/LICENSE +21 -0
- package/vendor/ink/node_modules/undici-types/README.md +6 -0
- package/vendor/ink/node_modules/undici-types/agent.d.ts +32 -0
- package/vendor/ink/node_modules/undici-types/api.d.ts +43 -0
- package/vendor/ink/node_modules/undici-types/balanced-pool.d.ts +30 -0
- package/vendor/ink/node_modules/undici-types/cache-interceptor.d.ts +173 -0
- package/vendor/ink/node_modules/undici-types/cache.d.ts +36 -0
- package/vendor/ink/node_modules/undici-types/client-stats.d.ts +15 -0
- package/vendor/ink/node_modules/undici-types/client.d.ts +108 -0
- package/vendor/ink/node_modules/undici-types/connector.d.ts +34 -0
- package/vendor/ink/node_modules/undici-types/content-type.d.ts +21 -0
- package/vendor/ink/node_modules/undici-types/cookies.d.ts +30 -0
- package/vendor/ink/node_modules/undici-types/diagnostics-channel.d.ts +74 -0
- package/vendor/ink/node_modules/undici-types/dispatcher.d.ts +276 -0
- package/vendor/ink/node_modules/undici-types/env-http-proxy-agent.d.ts +22 -0
- package/vendor/ink/node_modules/undici-types/errors.d.ts +161 -0
- package/vendor/ink/node_modules/undici-types/eventsource.d.ts +66 -0
- package/vendor/ink/node_modules/undici-types/fetch.d.ts +211 -0
- package/vendor/ink/node_modules/undici-types/formdata.d.ts +108 -0
- package/vendor/ink/node_modules/undici-types/global-dispatcher.d.ts +9 -0
- package/vendor/ink/node_modules/undici-types/global-origin.d.ts +7 -0
- package/vendor/ink/node_modules/undici-types/h2c-client.d.ts +73 -0
- package/vendor/ink/node_modules/undici-types/handlers.d.ts +15 -0
- package/vendor/ink/node_modules/undici-types/header.d.ts +160 -0
- package/vendor/ink/node_modules/undici-types/index.d.ts +88 -0
- package/vendor/ink/node_modules/undici-types/interceptors.d.ts +73 -0
- package/vendor/ink/node_modules/undici-types/mock-agent.d.ts +68 -0
- package/vendor/ink/node_modules/undici-types/mock-call-history.d.ts +111 -0
- package/vendor/ink/node_modules/undici-types/mock-client.d.ts +27 -0
- package/vendor/ink/node_modules/undici-types/mock-errors.d.ts +12 -0
- package/vendor/ink/node_modules/undici-types/mock-interceptor.d.ts +94 -0
- package/vendor/ink/node_modules/undici-types/mock-pool.d.ts +27 -0
- package/vendor/ink/node_modules/undici-types/package.json +55 -0
- package/vendor/ink/node_modules/undici-types/patch.d.ts +29 -0
- package/vendor/ink/node_modules/undici-types/pool-stats.d.ts +19 -0
- package/vendor/ink/node_modules/undici-types/pool.d.ts +41 -0
- package/vendor/ink/node_modules/undici-types/proxy-agent.d.ts +29 -0
- package/vendor/ink/node_modules/undici-types/readable.d.ts +68 -0
- package/vendor/ink/node_modules/undici-types/retry-agent.d.ts +8 -0
- package/vendor/ink/node_modules/undici-types/retry-handler.d.ts +125 -0
- package/vendor/ink/node_modules/undici-types/round-robin-pool.d.ts +41 -0
- package/vendor/ink/node_modules/undici-types/snapshot-agent.d.ts +109 -0
- package/vendor/ink/node_modules/undici-types/util.d.ts +18 -0
- package/vendor/ink/node_modules/undici-types/utility.d.ts +7 -0
- package/vendor/ink/node_modules/undici-types/webidl.d.ts +341 -0
- package/vendor/ink/node_modules/undici-types/websocket.d.ts +186 -0
- package/vendor/ink/package.json +201 -0
- package/vendor/ink/readme.md +2636 -0
- package/bin/swag-agent.js +0 -9
- package/dist/server/lib/pg-rate-limiter.d.ts +0 -21
- package/dist/server/lib/pg-rate-limiter.js +0 -86
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* All business logic lives server-side — CLI is a thin client.
|
|
9
9
|
* Claude formats the JSON results for the user (no client-side formatter).
|
|
10
10
|
*/
|
|
11
|
+
|
|
11
12
|
import { createClient } from "@supabase/supabase-js";
|
|
12
13
|
import { writeFileSync, readFileSync, mkdirSync } from "node:fs";
|
|
13
14
|
import { join } from "node:path";
|
|
@@ -18,226 +19,271 @@ import { tmpdir } from "node:os";
|
|
|
18
19
|
import { resolveConfig } from "./config-store.js";
|
|
19
20
|
import { getValidToken, createAuthenticatedClient } from "./auth-service.js";
|
|
20
21
|
import { formatServerResponse } from "./format-server-response.js";
|
|
22
|
+
|
|
23
|
+
// ============================================================================
|
|
24
|
+
// EXECUTION CONTEXT — set by agent-loop before tool dispatch
|
|
25
|
+
// Provides trace + user identity for server-side telemetry correlation.
|
|
26
|
+
// ============================================================================
|
|
27
|
+
|
|
21
28
|
let executionContext = {};
|
|
29
|
+
|
|
22
30
|
/**
|
|
23
31
|
* Set the execution context for server tool calls.
|
|
24
32
|
* Called by agent-loop.ts before each turn so tool calls carry trace/user identity.
|
|
25
33
|
*/
|
|
26
34
|
export function setServerToolContext(ctx) {
|
|
27
|
-
|
|
35
|
+
executionContext = ctx;
|
|
28
36
|
}
|
|
29
37
|
// ============================================================================
|
|
30
38
|
// SUPABASE CLIENT (tiered: service role > user JWT)
|
|
31
39
|
// Used only for loading tool definitions from ai_tool_registry.
|
|
32
40
|
// Tool execution goes through the edge function.
|
|
33
41
|
// ============================================================================
|
|
42
|
+
|
|
34
43
|
let cachedClient = null;
|
|
35
44
|
let cachedStoreId = "";
|
|
36
45
|
let cachedAuthMethod = "none";
|
|
37
46
|
let cachedToken = "";
|
|
38
47
|
async function getSupabaseClient() {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
cachedClient
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
cachedStoreId = config.storeId || "";
|
|
49
|
-
cachedAuthMethod = "service_role";
|
|
50
|
-
return { client: cachedClient, storeId: cachedStoreId };
|
|
48
|
+
const config = resolveConfig();
|
|
49
|
+
|
|
50
|
+
// Tier 1: Service role key (full access, MCP server mode) — never expires
|
|
51
|
+
if (config.supabaseUrl && config.supabaseKey) {
|
|
52
|
+
if (cachedClient && cachedAuthMethod === "service_role") {
|
|
53
|
+
return {
|
|
54
|
+
client: cachedClient,
|
|
55
|
+
storeId: cachedStoreId
|
|
56
|
+
};
|
|
51
57
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
58
|
+
cachedClient = createClient(config.supabaseUrl, config.supabaseKey, {
|
|
59
|
+
auth: {
|
|
60
|
+
persistSession: false,
|
|
61
|
+
autoRefreshToken: false
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
cachedStoreId = config.storeId || "";
|
|
65
|
+
cachedAuthMethod = "service_role";
|
|
66
|
+
return {
|
|
67
|
+
client: cachedClient,
|
|
68
|
+
storeId: cachedStoreId
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Tier 2: User JWT (CLI login) — recreate client when token refreshes
|
|
73
|
+
const token = await getValidToken();
|
|
74
|
+
if (token) {
|
|
75
|
+
if (cachedClient && cachedToken === token) {
|
|
76
|
+
cachedStoreId = config.storeId || "";
|
|
77
|
+
return {
|
|
78
|
+
client: cachedClient,
|
|
79
|
+
storeId: cachedStoreId
|
|
80
|
+
};
|
|
64
81
|
}
|
|
65
|
-
cachedClient =
|
|
66
|
-
cachedToken =
|
|
67
|
-
|
|
68
|
-
|
|
82
|
+
cachedClient = createAuthenticatedClient(token);
|
|
83
|
+
cachedToken = token;
|
|
84
|
+
cachedStoreId = config.storeId || "";
|
|
85
|
+
cachedAuthMethod = "jwt";
|
|
86
|
+
return {
|
|
87
|
+
client: cachedClient,
|
|
88
|
+
storeId: cachedStoreId
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
cachedClient = null;
|
|
92
|
+
cachedToken = "";
|
|
93
|
+
cachedAuthMethod = "none";
|
|
94
|
+
return null;
|
|
69
95
|
}
|
|
70
96
|
export function resetServerToolClient() {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
97
|
+
cachedClient = null;
|
|
98
|
+
cachedStoreId = "";
|
|
99
|
+
cachedToken = "";
|
|
100
|
+
cachedAuthMethod = "none";
|
|
101
|
+
connectionVerified = false;
|
|
102
|
+
// Also clear tool cache so next load fetches fresh
|
|
103
|
+
loadedTools = [];
|
|
104
|
+
loadedToolNames.clear();
|
|
105
|
+
toolsLoadedAt = 0;
|
|
80
106
|
}
|
|
107
|
+
|
|
81
108
|
// ============================================================================
|
|
82
109
|
// CONNECTION CHECK
|
|
83
110
|
// ============================================================================
|
|
111
|
+
|
|
84
112
|
let connectionVerified = false;
|
|
85
113
|
export async function checkConnection() {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
}
|
|
114
|
+
if (connectionVerified) return true;
|
|
115
|
+
const conn = await getSupabaseClient();
|
|
116
|
+
if (!conn) return false;
|
|
117
|
+
try {
|
|
118
|
+
// Quick health check — query a small table
|
|
119
|
+
const {
|
|
120
|
+
error
|
|
121
|
+
} = await conn.client.from("stores").select("id").limit(1);
|
|
122
|
+
connectionVerified = !error;
|
|
123
|
+
return connectionVerified;
|
|
124
|
+
} catch {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
100
127
|
}
|
|
128
|
+
|
|
101
129
|
// ============================================================================
|
|
102
130
|
// TOOL DEFINITIONS — loaded from ai_tool_registry (single source of truth)
|
|
103
131
|
// ============================================================================
|
|
132
|
+
|
|
104
133
|
let loadedTools = [];
|
|
105
134
|
let loadedToolNames = new Set();
|
|
106
135
|
let toolsLoadedAt = 0;
|
|
107
136
|
const TOOL_CACHE_TTL = 60_000; // 1 minute
|
|
137
|
+
|
|
108
138
|
/**
|
|
109
139
|
* Load server tool definitions from ai_tool_registry.
|
|
110
140
|
* Same query as the MCP server (index.ts). Cached for 60s.
|
|
111
141
|
* Filters out tool_mode='code' (those are local CLI tools).
|
|
112
142
|
*/
|
|
113
143
|
export async function loadServerToolDefinitions(force = false) {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
console.error("[server-tools] Failed to load from ai_tool_registry:", error.message);
|
|
129
|
-
return loadedTools; // Return stale cache on error
|
|
130
|
-
}
|
|
131
|
-
loadedTools = (data || []).map(t => ({
|
|
132
|
-
name: t.name,
|
|
133
|
-
description: t.description || t.definition?.description || `Execute ${t.name}`,
|
|
134
|
-
input_schema: t.definition?.input_schema || { type: "object", properties: {} },
|
|
135
|
-
}));
|
|
136
|
-
// Rebuild the name set
|
|
137
|
-
loadedToolNames.clear();
|
|
138
|
-
for (const tool of loadedTools) {
|
|
139
|
-
loadedToolNames.add(tool.name);
|
|
140
|
-
}
|
|
141
|
-
toolsLoadedAt = Date.now();
|
|
142
|
-
connectionVerified = true;
|
|
143
|
-
return loadedTools;
|
|
144
|
+
// Return cache if fresh
|
|
145
|
+
if (!force && loadedTools.length > 0 && Date.now() - toolsLoadedAt < TOOL_CACHE_TTL) {
|
|
146
|
+
return loadedTools;
|
|
147
|
+
}
|
|
148
|
+
const conn = await getSupabaseClient();
|
|
149
|
+
if (!conn) return [];
|
|
150
|
+
try {
|
|
151
|
+
const {
|
|
152
|
+
data,
|
|
153
|
+
error
|
|
154
|
+
} = await conn.client.from("ai_tool_registry").select("name, description, definition").eq("is_active", true).neq("tool_mode", "code");
|
|
155
|
+
if (error) {
|
|
156
|
+
console.error("[server-tools] Failed to load from ai_tool_registry:", error.message);
|
|
157
|
+
return loadedTools; // Return stale cache on error
|
|
144
158
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
159
|
+
loadedTools = (data || []).map(t => ({
|
|
160
|
+
name: t.name,
|
|
161
|
+
description: t.description || t.definition?.description || `Execute ${t.name}`,
|
|
162
|
+
input_schema: t.definition?.input_schema || {
|
|
163
|
+
type: "object",
|
|
164
|
+
properties: {}
|
|
165
|
+
}
|
|
166
|
+
}));
|
|
167
|
+
|
|
168
|
+
// Rebuild the name set
|
|
169
|
+
loadedToolNames.clear();
|
|
170
|
+
for (const tool of loadedTools) {
|
|
171
|
+
loadedToolNames.add(tool.name);
|
|
148
172
|
}
|
|
173
|
+
toolsLoadedAt = Date.now();
|
|
174
|
+
connectionVerified = true;
|
|
175
|
+
return loadedTools;
|
|
176
|
+
} catch (err) {
|
|
177
|
+
console.error("[server-tools] Error loading tool definitions:", err);
|
|
178
|
+
return loadedTools;
|
|
179
|
+
}
|
|
149
180
|
}
|
|
181
|
+
|
|
150
182
|
/**
|
|
151
183
|
* Check if a tool name is a server tool.
|
|
152
184
|
* After first load, checks against the dynamically loaded set.
|
|
153
185
|
*/
|
|
154
186
|
export function isServerTool(name) {
|
|
155
|
-
|
|
187
|
+
return loadedToolNames.has(name);
|
|
156
188
|
}
|
|
189
|
+
|
|
157
190
|
/**
|
|
158
191
|
* Get currently loaded definitions (for /tools listing).
|
|
159
192
|
* Returns whatever is cached — call loadServerToolDefinitions() first to populate.
|
|
160
193
|
*/
|
|
161
194
|
export function getAllServerToolDefinitions() {
|
|
162
|
-
|
|
195
|
+
return loadedTools;
|
|
163
196
|
}
|
|
197
|
+
|
|
164
198
|
// ============================================================================
|
|
165
199
|
// SERVER STATUS
|
|
166
200
|
// ============================================================================
|
|
201
|
+
|
|
167
202
|
export async function getServerStatus() {
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
203
|
+
const {
|
|
204
|
+
loadConfig
|
|
205
|
+
} = await import("./config-store.js");
|
|
206
|
+
const config = loadConfig();
|
|
207
|
+
|
|
208
|
+
// Loading tools also verifies connection
|
|
209
|
+
const tools = await loadServerToolDefinitions();
|
|
210
|
+
return {
|
|
211
|
+
connected: tools.length > 0,
|
|
212
|
+
storeId: config.store_id || "",
|
|
213
|
+
storeName: config.store_name || "",
|
|
214
|
+
toolCount: tools.length,
|
|
215
|
+
authMethod: cachedAuthMethod
|
|
216
|
+
};
|
|
179
217
|
}
|
|
218
|
+
|
|
180
219
|
// ============================================================================
|
|
181
220
|
// EXECUTE SERVER TOOL — proxied to edge function
|
|
182
221
|
// ============================================================================
|
|
222
|
+
|
|
183
223
|
/** Media fields that contain base64-encoded binary data */
|
|
184
224
|
const MEDIA_FIELDS = {
|
|
185
|
-
|
|
186
|
-
|
|
225
|
+
audio_base64: {
|
|
226
|
+
ext: "mp3",
|
|
227
|
+
label: "audio"
|
|
228
|
+
},
|
|
229
|
+
stems_zip_base64: {
|
|
230
|
+
ext: "zip",
|
|
231
|
+
label: "stems"
|
|
232
|
+
}
|
|
187
233
|
};
|
|
234
|
+
|
|
188
235
|
/** Tools that produce downloadable media files via file_url */
|
|
189
236
|
const MEDIA_TOOLS = new Set(["voice", "image_gen", "video_gen"]);
|
|
237
|
+
|
|
190
238
|
/**
|
|
191
239
|
* Download a single file_url to a local path, replacing the URL in the data.
|
|
192
240
|
* inputArgs is the original tool call args — used to derive descriptive filenames
|
|
193
241
|
* when the result data doesn't include the text/prompt.
|
|
194
242
|
*/
|
|
195
243
|
async function downloadSingleMedia(data, toolName, outDir, inputArgs) {
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
try {
|
|
211
|
-
const urlPath = new URL(fileUrl).pathname;
|
|
212
|
-
const urlExt = urlPath.split(".").pop();
|
|
213
|
-
if (urlExt && urlExt.length <= 4)
|
|
214
|
-
format = urlExt;
|
|
215
|
-
}
|
|
216
|
-
catch { /* invalid URL — use default */ }
|
|
217
|
-
}
|
|
218
|
-
if (!format)
|
|
219
|
-
format = toolName === "image_gen" ? "png" : toolName === "video_gen" ? "mp4" : "mp3";
|
|
220
|
-
const ts = Date.now();
|
|
221
|
-
const nameParts = [action, label, String(ts)].filter(Boolean);
|
|
222
|
-
const filename = `${nameParts.join("-")}.${format}`;
|
|
223
|
-
const localPath = join(outDir, filename);
|
|
244
|
+
const fileUrl = data.file_url;
|
|
245
|
+
if (typeof fileUrl !== "string" || !fileUrl.startsWith("http")) return;
|
|
246
|
+
|
|
247
|
+
// Derive a descriptive filename
|
|
248
|
+
// Check result data first, then fall back to input args for text/prompt
|
|
249
|
+
let label = "";
|
|
250
|
+
const text = data.prompt || data.text || inputArgs?.text || inputArgs?.prompt;
|
|
251
|
+
if (text) {
|
|
252
|
+
label = text.substring(0, 40).replace(/[^a-zA-Z0-9]+/g, "-").replace(/-+$/, "").toLowerCase();
|
|
253
|
+
}
|
|
254
|
+
const action = data.action || inputArgs?.action || toolName;
|
|
255
|
+
// Detect format: explicit field > file extension from URL > tool-based default
|
|
256
|
+
let format = data.format;
|
|
257
|
+
if (!format) {
|
|
224
258
|
try {
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
259
|
+
const urlPath = new URL(fileUrl).pathname;
|
|
260
|
+
const urlExt = urlPath.split(".").pop();
|
|
261
|
+
if (urlExt && urlExt.length <= 4) format = urlExt;
|
|
262
|
+
} catch {/* invalid URL — use default */}
|
|
263
|
+
}
|
|
264
|
+
if (!format) format = toolName === "image_gen" ? "png" : toolName === "video_gen" ? "mp4" : "mp3";
|
|
265
|
+
const ts = Date.now();
|
|
266
|
+
const nameParts = [action, label, String(ts)].filter(Boolean);
|
|
267
|
+
const filename = `${nameParts.join("-")}.${format}`;
|
|
268
|
+
const localPath = join(outDir, filename);
|
|
269
|
+
try {
|
|
270
|
+
const resp = await fetch(fileUrl);
|
|
271
|
+
if (!resp.ok) {
|
|
272
|
+
data.download_error = `Failed to download: HTTP ${resp.status}`;
|
|
273
|
+
return;
|
|
239
274
|
}
|
|
275
|
+
const buffer = Buffer.from(await resp.arrayBuffer());
|
|
276
|
+
writeFileSync(localPath, buffer);
|
|
277
|
+
|
|
278
|
+
// Keep file_url for downstream tools (email, workflows) that need public URLs
|
|
279
|
+
data.local_file = localPath;
|
|
280
|
+
data.file_size = buffer.length;
|
|
281
|
+
delete data.download;
|
|
282
|
+
} catch (err) {
|
|
283
|
+
data.download_error = `Download failed: ${err.message || err}`;
|
|
284
|
+
}
|
|
240
285
|
}
|
|
286
|
+
|
|
241
287
|
/**
|
|
242
288
|
* Download remote media (file_url) to the user's working directory.
|
|
243
289
|
* This ensures the LLM never needs to handle URLs — it just reports local paths.
|
|
@@ -247,79 +293,87 @@ async function downloadSingleMedia(data, toolName, outDir, inputArgs) {
|
|
|
247
293
|
* (file_url inside images[] or previews[] arrays).
|
|
248
294
|
*/
|
|
249
295
|
async function downloadRemoteMedia(data, toolName, inputArgs) {
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
296
|
+
// Save to cwd — the user's working directory, not a hidden temp folder
|
|
297
|
+
const outDir = process.cwd();
|
|
298
|
+
|
|
299
|
+
// Single file at top level (voice speak, image_gen generate, etc.)
|
|
300
|
+
if (typeof data.file_url === "string" && data.file_url.startsWith("http")) {
|
|
301
|
+
await downloadSingleMedia(data, toolName, outDir, inputArgs);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// Batch arrays — image_gen batch returns images[], voice_design returns previews[]
|
|
305
|
+
if (Array.isArray(data.images)) {
|
|
306
|
+
for (const img of data.images) {
|
|
307
|
+
if (img && typeof img === "object" && typeof img.file_url === "string") {
|
|
308
|
+
await downloadSingleMedia(img, toolName, outDir);
|
|
309
|
+
}
|
|
255
310
|
}
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
if (Array.isArray(data.previews)) {
|
|
265
|
-
for (const preview of data.previews) {
|
|
266
|
-
if (preview && typeof preview === "object" && typeof preview.file_url === "string") {
|
|
267
|
-
await downloadSingleMedia(preview, toolName, outDir);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
311
|
+
}
|
|
312
|
+
if (Array.isArray(data.previews)) {
|
|
313
|
+
for (const preview of data.previews) {
|
|
314
|
+
if (preview && typeof preview === "object" && typeof preview.file_url === "string") {
|
|
315
|
+
await downloadSingleMedia(preview, toolName, outDir);
|
|
316
|
+
}
|
|
270
317
|
}
|
|
318
|
+
}
|
|
271
319
|
}
|
|
320
|
+
|
|
272
321
|
/**
|
|
273
322
|
* Extract base64 media from tool results, save to temp files, and replace
|
|
274
323
|
* with file paths. This prevents truncation from destroying binary data
|
|
275
324
|
* that the model needs to save for the user.
|
|
276
325
|
*/
|
|
277
326
|
function extractMediaToFiles(data, toolName) {
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
try {
|
|
292
|
-
writeFileSync(filePath, Buffer.from(b64, "base64"));
|
|
293
|
-
// Replace base64 with file path so model can reference it
|
|
294
|
-
data[field] = `(saved to ${filePath})`;
|
|
295
|
-
data[`${label}_file`] = filePath;
|
|
296
|
-
}
|
|
297
|
-
catch {
|
|
298
|
-
// Leave original data if write fails
|
|
299
|
-
}
|
|
327
|
+
const outDir = join(tmpdir(), "whale-audio");
|
|
328
|
+
let dirCreated = false;
|
|
329
|
+
for (const [field, {
|
|
330
|
+
ext,
|
|
331
|
+
label
|
|
332
|
+
}] of Object.entries(MEDIA_FIELDS)) {
|
|
333
|
+
const b64 = data[field];
|
|
334
|
+
if (typeof b64 !== "string" || b64.length < 100) continue;
|
|
335
|
+
if (!dirCreated) {
|
|
336
|
+
mkdirSync(outDir, {
|
|
337
|
+
recursive: true
|
|
338
|
+
});
|
|
339
|
+
dirCreated = true;
|
|
300
340
|
}
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
}
|
|
341
|
+
const ts = Date.now();
|
|
342
|
+
const filename = `${toolName}-${label}-${ts}.${ext}`;
|
|
343
|
+
const filePath = join(outDir, filename);
|
|
344
|
+
try {
|
|
345
|
+
writeFileSync(filePath, Buffer.from(b64, "base64"));
|
|
346
|
+
// Replace base64 with file path so model can reference it
|
|
347
|
+
data[field] = `(saved to ${filePath})`;
|
|
348
|
+
data[`${label}_file`] = filePath;
|
|
349
|
+
} catch {
|
|
350
|
+
// Leave original data if write fails
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
// Handle voice_design previews array
|
|
355
|
+
if (Array.isArray(data.previews)) {
|
|
356
|
+
if (!dirCreated) {
|
|
357
|
+
mkdirSync(outDir, {
|
|
358
|
+
recursive: true
|
|
359
|
+
});
|
|
321
360
|
}
|
|
361
|
+
for (let i = 0; i < data.previews.length; i++) {
|
|
362
|
+
const preview = data.previews[i];
|
|
363
|
+
if (!preview?.audio_base64 || typeof preview.audio_base64 !== "string") continue;
|
|
364
|
+
const ts = Date.now();
|
|
365
|
+
const filePath = join(outDir, `${toolName}-preview-${i}-${ts}.mp3`);
|
|
366
|
+
try {
|
|
367
|
+
writeFileSync(filePath, Buffer.from(preview.audio_base64, "base64"));
|
|
368
|
+
preview.audio_base64 = `(saved to ${filePath})`;
|
|
369
|
+
preview.audio_file = filePath;
|
|
370
|
+
} catch {
|
|
371
|
+
// Leave original
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
322
375
|
}
|
|
376
|
+
|
|
323
377
|
/**
|
|
324
378
|
* Execute a server tool via the Fly.io server or Supabase edge function (mode: "tool").
|
|
325
379
|
* Returns the raw JSON — Claude formats it for the user.
|
|
@@ -329,387 +383,506 @@ function extractMediaToFiles(data, toolName) {
|
|
|
329
383
|
* and emits `tool_output` events via the optional emitter for real-time CLI rendering.
|
|
330
384
|
*/
|
|
331
385
|
export async function executeServerTool(name, input, emitter) {
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
386
|
+
const config = resolveConfig();
|
|
387
|
+
if (!config.serverUrl) {
|
|
388
|
+
return {
|
|
389
|
+
success: false,
|
|
390
|
+
output: "No server URL configured — server tools unavailable."
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
// Auth token: service role key preferred, user JWT fallback
|
|
395
|
+
let authToken = config.supabaseKey;
|
|
396
|
+
if (!authToken) {
|
|
397
|
+
authToken = (await getValidToken()) || "";
|
|
398
|
+
}
|
|
399
|
+
if (!authToken) {
|
|
400
|
+
return {
|
|
401
|
+
success: false,
|
|
402
|
+
output: "No auth token — server tools unavailable. Run: whale login"
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
// ── Pre-process file_paths for voice tool ──
|
|
407
|
+
// Reads local files and base64-encodes them so the LLM never handles binary data.
|
|
408
|
+
// CRITICAL: We must NOT mutate `input` — the agent loop keeps a reference to it
|
|
409
|
+
// in the conversation history. If we inject base64 into `input`, it leaks into
|
|
410
|
+
// the LLM context and blows the 200K token limit.
|
|
411
|
+
let serverArgs = input;
|
|
412
|
+
if (name === "voice" && (input.file_paths || input.file_path)) {
|
|
413
|
+
let paths = [];
|
|
414
|
+
if (Array.isArray(input.file_paths)) {
|
|
415
|
+
paths = input.file_paths;
|
|
416
|
+
} else if (typeof input.file_path === "string") {
|
|
417
|
+
paths = [input.file_path];
|
|
335
418
|
}
|
|
336
|
-
//
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
419
|
+
const MAX_TOTAL_BYTES = 7_000_000; // 7MB raw = ~9.3MB base64, under 10MB server limit
|
|
420
|
+
const MAX_SINGLE_FILE = 2_000_000; // 2MB per file (~2 min at 128kbps) — enough for good clone
|
|
421
|
+
const samples = [];
|
|
422
|
+
let totalBytes = 0;
|
|
423
|
+
for (const p of paths) {
|
|
424
|
+
try {
|
|
425
|
+
let buf = readFileSync(p);
|
|
426
|
+
// IVC: trim to 2MB per file. PVC: no trim (needs 30+ min for best quality)
|
|
427
|
+
const isPVC = input.action === "pvc_upload";
|
|
428
|
+
if (!isPVC && buf.length > MAX_SINGLE_FILE) {
|
|
429
|
+
buf = buf.subarray(0, MAX_SINGLE_FILE);
|
|
430
|
+
}
|
|
431
|
+
totalBytes += buf.length;
|
|
432
|
+
const maxTotal = isPVC ? 25_000_000 : MAX_TOTAL_BYTES;
|
|
433
|
+
if (totalBytes > maxTotal) break; // use what we have
|
|
434
|
+
samples.push(buf.toString("base64"));
|
|
435
|
+
} catch (err) {
|
|
436
|
+
// Skip unreadable files instead of killing the entire batch
|
|
437
|
+
continue;
|
|
438
|
+
}
|
|
340
439
|
}
|
|
341
|
-
if (
|
|
342
|
-
|
|
440
|
+
if (samples.length === 0) {
|
|
441
|
+
return {
|
|
442
|
+
success: false,
|
|
443
|
+
output: "No valid audio files found in the provided paths."
|
|
444
|
+
};
|
|
343
445
|
}
|
|
344
|
-
|
|
345
|
-
//
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
const samples = [];
|
|
361
|
-
let totalBytes = 0;
|
|
362
|
-
for (const p of paths) {
|
|
363
|
-
try {
|
|
364
|
-
let buf = readFileSync(p);
|
|
365
|
-
// IVC: trim to 2MB per file. PVC: no trim (needs 30+ min for best quality)
|
|
366
|
-
const isPVC = input.action === "pvc_upload";
|
|
367
|
-
if (!isPVC && buf.length > MAX_SINGLE_FILE) {
|
|
368
|
-
buf = buf.subarray(0, MAX_SINGLE_FILE);
|
|
369
|
-
}
|
|
370
|
-
totalBytes += buf.length;
|
|
371
|
-
const maxTotal = isPVC ? 25_000_000 : MAX_TOTAL_BYTES;
|
|
372
|
-
if (totalBytes > maxTotal)
|
|
373
|
-
break; // use what we have
|
|
374
|
-
samples.push(buf.toString("base64"));
|
|
375
|
-
}
|
|
376
|
-
catch (err) {
|
|
377
|
-
// Skip unreadable files instead of killing the entire batch
|
|
378
|
-
continue;
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
if (samples.length === 0) {
|
|
382
|
-
return { success: false, output: "No valid audio files found in the provided paths." };
|
|
383
|
-
}
|
|
384
|
-
// Build a SEPARATE args object for the server — never touch `input`
|
|
385
|
-
const { file_paths: _fp, file_path: _f, ...rest } = input;
|
|
386
|
-
serverArgs = { ...rest };
|
|
387
|
-
if (input.action === "clone_voice" || input.action === "pvc_upload") {
|
|
388
|
-
serverArgs.audio_samples = samples;
|
|
389
|
-
}
|
|
390
|
-
else if (input.action === "voice_design") {
|
|
391
|
-
serverArgs.reference_audio_base64 = samples[0];
|
|
392
|
-
}
|
|
393
|
-
else {
|
|
394
|
-
serverArgs.audio_base64 = samples[0];
|
|
395
|
-
}
|
|
446
|
+
|
|
447
|
+
// Build a SEPARATE args object for the server — never touch `input`
|
|
448
|
+
const {
|
|
449
|
+
file_paths: _fp,
|
|
450
|
+
file_path: _f,
|
|
451
|
+
...rest
|
|
452
|
+
} = input;
|
|
453
|
+
serverArgs = {
|
|
454
|
+
...rest
|
|
455
|
+
};
|
|
456
|
+
if (input.action === "clone_voice" || input.action === "pvc_upload") {
|
|
457
|
+
serverArgs.audio_samples = samples;
|
|
458
|
+
} else if (input.action === "voice_design") {
|
|
459
|
+
serverArgs.reference_audio_base64 = samples[0];
|
|
460
|
+
} else {
|
|
461
|
+
serverArgs.audio_base64 = samples[0];
|
|
396
462
|
}
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
// ── Pre-process file_path(s) for media upload tool ──
|
|
466
|
+
// Same pattern as voice: read local files in-process so base64 never flows
|
|
467
|
+
// through shell output (which truncates at ~100K chars) or conversation context.
|
|
468
|
+
// Also intercept file_url that's actually a local path (agents confuse the two).
|
|
469
|
+
if (name === "media" && (input.action === "upload" || input.action === "bulk_upload")) {
|
|
470
|
+
const fileUrl = input.file_url;
|
|
471
|
+
if (fileUrl && (fileUrl.startsWith("/") || /^[A-Z]:\\/i.test(fileUrl)) && !input.file_path && !input.file_paths) {
|
|
472
|
+
input = {
|
|
473
|
+
...input,
|
|
474
|
+
file_path: fileUrl
|
|
475
|
+
};
|
|
476
|
+
delete input.file_url;
|
|
407
477
|
}
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
}
|
|
416
|
-
if (paths.length > 0) {
|
|
417
|
-
const MAX_FILE_SIZE = 10_000_000; // 10MB per file
|
|
418
|
-
const MAX_BATCH_BYTES = 50_000_000; // 50MB total batch
|
|
419
|
-
const MAX_BATCH_COUNT = 50;
|
|
420
|
-
if (paths.length === 1) {
|
|
421
|
-
// ── Single file → standard upload action ──
|
|
422
|
-
const filePath = paths[0];
|
|
423
|
-
try {
|
|
424
|
-
const buf = readFileSync(filePath);
|
|
425
|
-
if (buf.length > MAX_FILE_SIZE) {
|
|
426
|
-
return { success: false, output: `File too large: ${(buf.length / 1_000_000).toFixed(1)}MB (max 10MB). Compress or resize first.` };
|
|
427
|
-
}
|
|
428
|
-
const { file_path: _fp, file_paths: _fps, ...rest } = input;
|
|
429
|
-
serverArgs = { ...rest, action: "upload", base64: buf.toString("base64") };
|
|
430
|
-
if (!serverArgs.file_name) {
|
|
431
|
-
const basename = filePath.split("/").pop() || filePath.split("\\").pop() || "";
|
|
432
|
-
if (basename)
|
|
433
|
-
serverArgs.file_name = basename;
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
catch (err) {
|
|
437
|
-
return { success: false, output: `Cannot read file "${filePath}": ${err.message || err}` };
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
else {
|
|
441
|
-
// ── Multiple files → bulk_upload action ──
|
|
442
|
-
const files = [];
|
|
443
|
-
const errors = [];
|
|
444
|
-
let totalBytes = 0;
|
|
445
|
-
for (const filePath of paths.slice(0, MAX_BATCH_COUNT)) {
|
|
446
|
-
try {
|
|
447
|
-
const buf = readFileSync(filePath);
|
|
448
|
-
if (buf.length > MAX_FILE_SIZE) {
|
|
449
|
-
errors.push(`${filePath.split("/").pop()}: ${(buf.length / 1_000_000).toFixed(1)}MB exceeds 10MB limit, skipped`);
|
|
450
|
-
continue;
|
|
451
|
-
}
|
|
452
|
-
totalBytes += buf.length;
|
|
453
|
-
if (totalBytes > MAX_BATCH_BYTES) {
|
|
454
|
-
errors.push(`Batch limit reached (50MB) — remaining files skipped`);
|
|
455
|
-
break;
|
|
456
|
-
}
|
|
457
|
-
const basename = filePath.split("/").pop() || filePath.split("\\").pop() || "file";
|
|
458
|
-
files.push({ base64: buf.toString("base64"), file_name: basename });
|
|
459
|
-
}
|
|
460
|
-
catch (err) {
|
|
461
|
-
errors.push(`${filePath.split("/").pop()}: ${err.message || "unreadable"}`);
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
if (paths.length > MAX_BATCH_COUNT) {
|
|
465
|
-
errors.push(`Only first ${MAX_BATCH_COUNT} files processed (${paths.length} provided)`);
|
|
466
|
-
}
|
|
467
|
-
if (files.length === 0) {
|
|
468
|
-
return { success: false, output: `No valid files to upload. Errors:\n${errors.join("\n")}` };
|
|
469
|
-
}
|
|
470
|
-
const { file_path: _fp, file_paths: _fps, ...rest } = input;
|
|
471
|
-
serverArgs = { ...rest, action: "bulk_upload", files, _read_errors: errors.length > 0 ? errors : undefined };
|
|
472
|
-
}
|
|
473
|
-
}
|
|
478
|
+
}
|
|
479
|
+
if (name === "media" && (input.action === "upload" || input.action === "bulk_upload") && (input.file_path || input.file_paths)) {
|
|
480
|
+
let paths = [];
|
|
481
|
+
if (Array.isArray(input.file_paths)) {
|
|
482
|
+
paths = input.file_paths;
|
|
483
|
+
} else if (typeof input.file_path === "string") {
|
|
484
|
+
paths = [input.file_path];
|
|
474
485
|
}
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
486
|
+
if (paths.length > 0) {
|
|
487
|
+
const MAX_FILE_SIZE = 10_000_000; // 10MB per file
|
|
488
|
+
const MAX_BATCH_BYTES = 50_000_000; // 50MB total batch
|
|
489
|
+
const MAX_BATCH_COUNT = 50;
|
|
490
|
+
if (paths.length === 1) {
|
|
491
|
+
// ── Single file → standard upload action ──
|
|
492
|
+
const filePath = paths[0];
|
|
479
493
|
try {
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
494
|
+
const buf = readFileSync(filePath);
|
|
495
|
+
if (buf.length > MAX_FILE_SIZE) {
|
|
496
|
+
return {
|
|
497
|
+
success: false,
|
|
498
|
+
output: `File too large: ${(buf.length / 1_000_000).toFixed(1)}MB (max 10MB). Compress or resize first.`
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
const {
|
|
502
|
+
file_path: _fp,
|
|
503
|
+
file_paths: _fps,
|
|
504
|
+
...rest
|
|
505
|
+
} = input;
|
|
506
|
+
serverArgs = {
|
|
507
|
+
...rest,
|
|
508
|
+
action: "upload",
|
|
509
|
+
base64: buf.toString("base64")
|
|
510
|
+
};
|
|
511
|
+
if (!serverArgs.file_name) {
|
|
512
|
+
const basename = filePath.split("/").pop() || filePath.split("\\").pop() || "";
|
|
513
|
+
if (basename) serverArgs.file_name = basename;
|
|
514
|
+
}
|
|
515
|
+
} catch (err) {
|
|
516
|
+
return {
|
|
517
|
+
success: false,
|
|
518
|
+
output: `Cannot read file "${filePath}": ${err.message || err}`
|
|
519
|
+
};
|
|
520
|
+
}
|
|
521
|
+
} else {
|
|
522
|
+
// ── Multiple files → bulk_upload action ──
|
|
523
|
+
const files = [];
|
|
524
|
+
const errors = [];
|
|
525
|
+
let totalBytes = 0;
|
|
526
|
+
for (const filePath of paths.slice(0, MAX_BATCH_COUNT)) {
|
|
527
|
+
try {
|
|
528
|
+
const buf = readFileSync(filePath);
|
|
529
|
+
if (buf.length > MAX_FILE_SIZE) {
|
|
530
|
+
errors.push(`${filePath.split("/").pop()}: ${(buf.length / 1_000_000).toFixed(1)}MB exceeds 10MB limit, skipped`);
|
|
531
|
+
continue;
|
|
483
532
|
}
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
if (basename)
|
|
489
|
-
serverArgs.file_name = basename;
|
|
533
|
+
totalBytes += buf.length;
|
|
534
|
+
if (totalBytes > MAX_BATCH_BYTES) {
|
|
535
|
+
errors.push(`Batch limit reached (50MB) — remaining files skipped`);
|
|
536
|
+
break;
|
|
490
537
|
}
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
538
|
+
const basename = filePath.split("/").pop() || filePath.split("\\").pop() || "file";
|
|
539
|
+
files.push({
|
|
540
|
+
base64: buf.toString("base64"),
|
|
541
|
+
file_name: basename
|
|
542
|
+
});
|
|
543
|
+
} catch (err) {
|
|
544
|
+
errors.push(`${filePath.split("/").pop()}: ${err.message || "unreadable"}`);
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
if (paths.length > MAX_BATCH_COUNT) {
|
|
548
|
+
errors.push(`Only first ${MAX_BATCH_COUNT} files processed (${paths.length} provided)`);
|
|
549
|
+
}
|
|
550
|
+
if (files.length === 0) {
|
|
551
|
+
return {
|
|
552
|
+
success: false,
|
|
553
|
+
output: `No valid files to upload. Errors:\n${errors.join("\n")}`
|
|
554
|
+
};
|
|
555
|
+
}
|
|
556
|
+
const {
|
|
557
|
+
file_path: _fp,
|
|
558
|
+
file_paths: _fps,
|
|
559
|
+
...rest
|
|
560
|
+
} = input;
|
|
561
|
+
serverArgs = {
|
|
562
|
+
...rest,
|
|
563
|
+
action: "bulk_upload",
|
|
564
|
+
files,
|
|
565
|
+
_read_errors: errors.length > 0 ? errors : undefined
|
|
566
|
+
};
|
|
567
|
+
}
|
|
495
568
|
}
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
// ── Pre-process file_path for media replace tool ──
|
|
572
|
+
// Same pattern as upload: read local file in-process, base64-encode for server.
|
|
573
|
+
if (name === "media" && input.action === "replace" && (input.file_path || typeof input.file_url === "string" && input.file_url.startsWith("/"))) {
|
|
574
|
+
const localPath = input.file_path || input.file_url;
|
|
575
|
+
try {
|
|
576
|
+
const buf = readFileSync(localPath);
|
|
577
|
+
if (buf.length > 10_000_000) {
|
|
578
|
+
return {
|
|
579
|
+
success: false,
|
|
580
|
+
output: `File too large: ${(buf.length / 1_000_000).toFixed(1)}MB (max 10MB). Compress or resize first.`
|
|
581
|
+
};
|
|
582
|
+
}
|
|
583
|
+
const {
|
|
584
|
+
file_path: _fp,
|
|
585
|
+
file_url: _fu,
|
|
586
|
+
...rest
|
|
587
|
+
} = input;
|
|
588
|
+
serverArgs = {
|
|
589
|
+
...rest,
|
|
590
|
+
base64: buf.toString("base64")
|
|
591
|
+
};
|
|
592
|
+
if (!serverArgs.file_name) {
|
|
593
|
+
const basename = localPath.split("/").pop() || localPath.split("\\").pop() || "";
|
|
594
|
+
if (basename) serverArgs.file_name = basename;
|
|
595
|
+
}
|
|
596
|
+
} catch (err) {
|
|
597
|
+
return {
|
|
598
|
+
success: false,
|
|
599
|
+
output: `Cannot read file "${localPath}": ${err.message || err}`
|
|
600
|
+
};
|
|
511
601
|
}
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
}
|
|
541
|
-
const { attachments: _a, ...rest } = input;
|
|
542
|
-
serverArgs = { ...rest, attachments: processed };
|
|
543
|
-
}
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
// ── Pre-process image_path for remove_bg tool ──
|
|
605
|
+
// Same pattern: read local image, send as image_base64.
|
|
606
|
+
if (name === "remove_bg" && (input.image_path || typeof input.image_url === "string" && input.image_url.startsWith("/"))) {
|
|
607
|
+
const imgPath = input.image_path || input.image_url;
|
|
608
|
+
try {
|
|
609
|
+
const buf = readFileSync(imgPath);
|
|
610
|
+
if (buf.length > 10_000_000) {
|
|
611
|
+
return {
|
|
612
|
+
success: false,
|
|
613
|
+
output: `Image too large: ${(buf.length / 1_000_000).toFixed(1)}MB (max 10MB).`
|
|
614
|
+
};
|
|
615
|
+
}
|
|
616
|
+
const {
|
|
617
|
+
image_path: _ip,
|
|
618
|
+
image_url: _iu,
|
|
619
|
+
...rest
|
|
620
|
+
} = input;
|
|
621
|
+
serverArgs = {
|
|
622
|
+
...rest,
|
|
623
|
+
image_base64: buf.toString("base64")
|
|
624
|
+
};
|
|
625
|
+
} catch (err) {
|
|
626
|
+
return {
|
|
627
|
+
success: false,
|
|
628
|
+
output: `Cannot read image "${imgPath}": ${err.message || err}`
|
|
629
|
+
};
|
|
544
630
|
}
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
return { success: false, output: `Cannot read file "${localPath}": ${err.message || err}` };
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
// ── Pre-process file_path in email attachments ──
|
|
634
|
+
// Reads local files referenced in attachments[].file_path, converts to base64 content.
|
|
635
|
+
if (name === "email" && input.action === "send" && Array.isArray(input.attachments)) {
|
|
636
|
+
const rawAtts = input.attachments;
|
|
637
|
+
const hasLocalFiles = rawAtts.some(a => a.file_path || typeof a.url === "string" && a.url.startsWith("/"));
|
|
638
|
+
if (hasLocalFiles) {
|
|
639
|
+
const processed = [];
|
|
640
|
+
for (const att of rawAtts) {
|
|
641
|
+
const localPath = att.file_path || (typeof att.url === "string" && att.url.startsWith("/") ? att.url : null);
|
|
642
|
+
if (localPath) {
|
|
643
|
+
try {
|
|
644
|
+
const buf = readFileSync(localPath);
|
|
645
|
+
if (buf.length > 10_000_000) {
|
|
646
|
+
return {
|
|
647
|
+
success: false,
|
|
648
|
+
output: `Attachment too large: ${localPath.split("/").pop()} is ${(buf.length / 1_000_000).toFixed(1)}MB (max 10MB).`
|
|
649
|
+
};
|
|
565
650
|
}
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
const isStreamable = name === "kali" && emitter &&
|
|
571
|
-
(input.action === "exec" || input.action === "exec_stream");
|
|
572
|
-
if (isStreamable) {
|
|
573
|
-
try {
|
|
574
|
-
const serverUrl = config.serverUrl;
|
|
575
|
-
const response = await fetch(serverUrl, {
|
|
576
|
-
method: "POST",
|
|
577
|
-
headers: {
|
|
578
|
-
"Content-Type": "application/json",
|
|
579
|
-
"Authorization": `Bearer ${authToken}`,
|
|
580
|
-
},
|
|
581
|
-
body: JSON.stringify({
|
|
582
|
-
mode: "tool_stream",
|
|
583
|
-
tool_name: name,
|
|
584
|
-
args: serverArgs,
|
|
585
|
-
store_id: config.storeId || undefined,
|
|
586
|
-
trace_id: executionContext.traceId || undefined,
|
|
587
|
-
conversation_id: executionContext.conversationId || undefined,
|
|
588
|
-
userId: executionContext.userId || undefined,
|
|
589
|
-
userEmail: executionContext.userEmail || undefined,
|
|
590
|
-
source: executionContext.source || "whale-code",
|
|
591
|
-
}),
|
|
651
|
+
const filename = att.filename || localPath.split("/").pop() || "attachment";
|
|
652
|
+
processed.push({
|
|
653
|
+
filename,
|
|
654
|
+
content: buf.toString("base64")
|
|
592
655
|
});
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
try {
|
|
617
|
-
const parsed = JSON.parse(line);
|
|
618
|
-
if (parsed.type === "progress" && parsed.progress) {
|
|
619
|
-
const p = parsed.progress;
|
|
620
|
-
if ((p.type === "stdout" || p.type === "stderr") && p.data) {
|
|
621
|
-
emitter.emitToolOutput(name, p.data);
|
|
622
|
-
}
|
|
623
|
-
}
|
|
624
|
-
else if (parsed.type === "status" && parsed.progress) {
|
|
625
|
-
emitter.emitToolProgress(name, parsed.progress);
|
|
626
|
-
}
|
|
627
|
-
else if (parsed.type === "result") {
|
|
628
|
-
finalResult = parsed;
|
|
629
|
-
}
|
|
630
|
-
}
|
|
631
|
-
catch { /* skip malformed lines */ }
|
|
632
|
-
}
|
|
633
|
-
}
|
|
634
|
-
// Process remaining buffer
|
|
635
|
-
const remaining = buffer.trim();
|
|
636
|
-
if (remaining) {
|
|
637
|
-
try {
|
|
638
|
-
const parsed = JSON.parse(remaining);
|
|
639
|
-
if (parsed.type === "result")
|
|
640
|
-
finalResult = parsed;
|
|
641
|
-
}
|
|
642
|
-
catch { /* skip */ }
|
|
643
|
-
}
|
|
644
|
-
if (finalResult) {
|
|
645
|
-
if (finalResult.success && finalResult.data) {
|
|
646
|
-
const output = typeof finalResult.data === "string"
|
|
647
|
-
? finalResult.data
|
|
648
|
-
: formatServerResponse(finalResult.data, name);
|
|
649
|
-
return { success: true, output };
|
|
650
|
-
}
|
|
651
|
-
return { success: false, output: finalResult.error || `Server tool "${name}" returned success=false` };
|
|
652
|
-
}
|
|
653
|
-
return { success: false, output: "No result received from streaming tool execution" };
|
|
654
|
-
}
|
|
655
|
-
catch (err) {
|
|
656
|
-
return { success: false, output: `Server tool stream error: ${err.message || err}` };
|
|
657
|
-
}
|
|
656
|
+
} catch (err) {
|
|
657
|
+
return {
|
|
658
|
+
success: false,
|
|
659
|
+
output: `Cannot read attachment "${localPath}": ${err.message || err}`
|
|
660
|
+
};
|
|
661
|
+
}
|
|
662
|
+
} else if (att.content && att.filename) {
|
|
663
|
+
processed.push({
|
|
664
|
+
filename: att.filename,
|
|
665
|
+
content: att.content
|
|
666
|
+
});
|
|
667
|
+
} else if (att.url && att.filename) {
|
|
668
|
+
processed.push(att); // URL-based, let server fetch it
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
const {
|
|
672
|
+
attachments: _a,
|
|
673
|
+
...rest
|
|
674
|
+
} = input;
|
|
675
|
+
serverArgs = {
|
|
676
|
+
...rest,
|
|
677
|
+
attachments: processed
|
|
678
|
+
};
|
|
658
679
|
}
|
|
659
|
-
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
// ── Pre-process file_path for kali upload ──
|
|
683
|
+
// Reads local file and sends content as base64 to the kali box.
|
|
684
|
+
if (name === "kali" && input.action === "upload" && (input.file_path || input.local_path)) {
|
|
685
|
+
const localPath = input.file_path || input.local_path;
|
|
686
|
+
if (localPath && !input.content) {
|
|
687
|
+
try {
|
|
688
|
+
const buf = readFileSync(localPath);
|
|
689
|
+
if (buf.length > 50_000_000) {
|
|
690
|
+
return {
|
|
691
|
+
success: false,
|
|
692
|
+
output: `File too large for kali upload: ${(buf.length / 1_000_000).toFixed(1)}MB (max 50MB).`
|
|
693
|
+
};
|
|
694
|
+
}
|
|
695
|
+
const {
|
|
696
|
+
file_path: _fp,
|
|
697
|
+
local_path: _lp,
|
|
698
|
+
...rest
|
|
699
|
+
} = input;
|
|
700
|
+
serverArgs = {
|
|
701
|
+
...rest,
|
|
702
|
+
content: buf.toString("base64"),
|
|
703
|
+
encoding: "base64"
|
|
704
|
+
};
|
|
705
|
+
// Auto-set remote path from filename if not provided
|
|
706
|
+
if (!serverArgs.path) {
|
|
707
|
+
const basename = localPath.split("/").pop() || "upload";
|
|
708
|
+
serverArgs.path = `/tmp/${basename}`;
|
|
709
|
+
}
|
|
710
|
+
} catch (err) {
|
|
711
|
+
return {
|
|
712
|
+
success: false,
|
|
713
|
+
output: `Cannot read file "${localPath}": ${err.message || err}`
|
|
714
|
+
};
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
// ── Streaming path for kali exec actions ──
|
|
720
|
+
// Uses NDJSON streaming to show live stdout/stderr in the CLI while the command runs.
|
|
721
|
+
const isStreamable = name === "kali" && emitter && (input.action === "exec" || input.action === "exec_stream");
|
|
722
|
+
if (isStreamable) {
|
|
660
723
|
try {
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
724
|
+
const serverUrl = config.serverUrl;
|
|
725
|
+
const response = await fetch(serverUrl, {
|
|
726
|
+
method: "POST",
|
|
727
|
+
headers: {
|
|
728
|
+
"Content-Type": "application/json",
|
|
729
|
+
"Authorization": `Bearer ${authToken}`
|
|
730
|
+
},
|
|
731
|
+
body: JSON.stringify({
|
|
732
|
+
mode: "tool_stream",
|
|
733
|
+
tool_name: name,
|
|
734
|
+
args: serverArgs,
|
|
735
|
+
store_id: config.storeId || undefined,
|
|
736
|
+
trace_id: executionContext.traceId || undefined,
|
|
737
|
+
conversation_id: executionContext.conversationId || undefined,
|
|
738
|
+
userId: executionContext.userId || undefined,
|
|
739
|
+
userEmail: executionContext.userEmail || undefined,
|
|
740
|
+
source: executionContext.source || "whale-code"
|
|
741
|
+
})
|
|
742
|
+
});
|
|
743
|
+
if (!response.ok) {
|
|
744
|
+
const text = await response.text().catch(() => "");
|
|
745
|
+
return {
|
|
746
|
+
success: false,
|
|
747
|
+
output: `Server tool stream error: HTTP ${response.status}: ${text.substring(0, 500)}`
|
|
748
|
+
};
|
|
749
|
+
}
|
|
750
|
+
if (!response.body) {
|
|
751
|
+
return {
|
|
752
|
+
success: false,
|
|
753
|
+
output: "Server returned no response body for tool_stream"
|
|
754
|
+
};
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
// Read NDJSON stream — emit progress events, collect final result
|
|
758
|
+
const reader = response.body.getReader();
|
|
759
|
+
const decoder = new TextDecoder();
|
|
760
|
+
let buffer = "";
|
|
761
|
+
let finalResult = null;
|
|
762
|
+
while (true) {
|
|
763
|
+
const {
|
|
764
|
+
done,
|
|
765
|
+
value
|
|
766
|
+
} = await reader.read();
|
|
767
|
+
if (done) break;
|
|
768
|
+
buffer += decoder.decode(value, {
|
|
769
|
+
stream: true
|
|
679
770
|
});
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
const SAFETY_MAX_SERVER_CHARS = 500_000;
|
|
697
|
-
if (output.length > SAFETY_MAX_SERVER_CHARS) {
|
|
698
|
-
output = output.slice(0, SAFETY_MAX_SERVER_CHARS)
|
|
699
|
-
+ `\n\n... (safety truncated — ${output.length.toLocaleString()} chars total)`;
|
|
771
|
+
let newlineIdx;
|
|
772
|
+
while ((newlineIdx = buffer.indexOf("\n")) !== -1) {
|
|
773
|
+
const line = buffer.substring(0, newlineIdx).trim();
|
|
774
|
+
buffer = buffer.substring(newlineIdx + 1);
|
|
775
|
+
if (!line) continue;
|
|
776
|
+
try {
|
|
777
|
+
const parsed = JSON.parse(line);
|
|
778
|
+
if (parsed.type === "progress" && parsed.progress) {
|
|
779
|
+
const p = parsed.progress;
|
|
780
|
+
if ((p.type === "stdout" || p.type === "stderr") && p.data) {
|
|
781
|
+
emitter.emitToolOutput(name, p.data);
|
|
782
|
+
}
|
|
783
|
+
} else if (parsed.type === "status" && parsed.progress) {
|
|
784
|
+
emitter.emitToolProgress(name, parsed.progress);
|
|
785
|
+
} else if (parsed.type === "result") {
|
|
786
|
+
finalResult = parsed;
|
|
700
787
|
}
|
|
701
|
-
|
|
702
|
-
}
|
|
703
|
-
// Extract error from nested data if top-level error is missing
|
|
704
|
-
let errorMsg = result.error;
|
|
705
|
-
if (!errorMsg && result.data && typeof result.data === "object") {
|
|
706
|
-
const nested = result.data.error;
|
|
707
|
-
if (typeof nested === "string")
|
|
708
|
-
errorMsg = nested;
|
|
788
|
+
} catch {/* skip malformed lines */}
|
|
709
789
|
}
|
|
710
|
-
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
// Process remaining buffer
|
|
793
|
+
const remaining = buffer.trim();
|
|
794
|
+
if (remaining) {
|
|
795
|
+
try {
|
|
796
|
+
const parsed = JSON.parse(remaining);
|
|
797
|
+
if (parsed.type === "result") finalResult = parsed;
|
|
798
|
+
} catch {/* skip */}
|
|
799
|
+
}
|
|
800
|
+
if (finalResult) {
|
|
801
|
+
if (finalResult.success && finalResult.data) {
|
|
802
|
+
const output = typeof finalResult.data === "string" ? finalResult.data : formatServerResponse(finalResult.data, name);
|
|
803
|
+
return {
|
|
804
|
+
success: true,
|
|
805
|
+
output
|
|
806
|
+
};
|
|
807
|
+
}
|
|
808
|
+
return {
|
|
809
|
+
success: false,
|
|
810
|
+
output: finalResult.error || `Server tool "${name}" returned success=false`
|
|
811
|
+
};
|
|
812
|
+
}
|
|
813
|
+
return {
|
|
814
|
+
success: false,
|
|
815
|
+
output: "No result received from streaming tool execution"
|
|
816
|
+
};
|
|
817
|
+
} catch (err) {
|
|
818
|
+
return {
|
|
819
|
+
success: false,
|
|
820
|
+
output: `Server tool stream error: ${err.message || err}`
|
|
821
|
+
};
|
|
822
|
+
}
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
// ── Standard path: non-streaming tools ──
|
|
826
|
+
try {
|
|
827
|
+
const serverUrl = config.serverUrl;
|
|
828
|
+
const response = await fetch(serverUrl, {
|
|
829
|
+
method: "POST",
|
|
830
|
+
headers: {
|
|
831
|
+
"Content-Type": "application/json",
|
|
832
|
+
"Authorization": `Bearer ${authToken}`
|
|
833
|
+
},
|
|
834
|
+
body: JSON.stringify({
|
|
835
|
+
mode: "tool",
|
|
836
|
+
tool_name: name,
|
|
837
|
+
args: serverArgs,
|
|
838
|
+
store_id: config.storeId || undefined,
|
|
839
|
+
trace_id: executionContext.traceId || undefined,
|
|
840
|
+
conversation_id: executionContext.conversationId || undefined,
|
|
841
|
+
userId: executionContext.userId || undefined,
|
|
842
|
+
userEmail: executionContext.userEmail || undefined,
|
|
843
|
+
source: executionContext.source || "whale-code"
|
|
844
|
+
})
|
|
845
|
+
});
|
|
846
|
+
const result = await response.json();
|
|
847
|
+
if (result.success) {
|
|
848
|
+
if (result.data && typeof result.data === "object") {
|
|
849
|
+
const dataObj = result.data;
|
|
850
|
+
// Auto-download remote media files to local temp paths
|
|
851
|
+
if (MEDIA_TOOLS.has(name)) {
|
|
852
|
+
await downloadRemoteMedia(dataObj, name, input);
|
|
853
|
+
}
|
|
854
|
+
// Legacy: extract base64 media to temp files
|
|
855
|
+
extractMediaToFiles(dataObj, name);
|
|
856
|
+
}
|
|
857
|
+
let output = typeof result.data === "string" ? result.data : formatServerResponse(result.data, name);
|
|
858
|
+
|
|
859
|
+
// Safety cap only — Anthropic context_management handles normal limits.
|
|
860
|
+
// Old limit was 30K which caused constant truncation and extra tool calls.
|
|
861
|
+
const SAFETY_MAX_SERVER_CHARS = 500_000;
|
|
862
|
+
if (output.length > SAFETY_MAX_SERVER_CHARS) {
|
|
863
|
+
output = output.slice(0, SAFETY_MAX_SERVER_CHARS) + `\n\n... (safety truncated — ${output.length.toLocaleString()} chars total)`;
|
|
864
|
+
}
|
|
865
|
+
return {
|
|
866
|
+
success: true,
|
|
867
|
+
output
|
|
868
|
+
};
|
|
711
869
|
}
|
|
712
|
-
|
|
713
|
-
|
|
870
|
+
|
|
871
|
+
// Extract error from nested data if top-level error is missing
|
|
872
|
+
let errorMsg = result.error;
|
|
873
|
+
if (!errorMsg && result.data && typeof result.data === "object") {
|
|
874
|
+
const nested = result.data.error;
|
|
875
|
+
if (typeof nested === "string") errorMsg = nested;
|
|
714
876
|
}
|
|
877
|
+
return {
|
|
878
|
+
success: false,
|
|
879
|
+
output: errorMsg || `Server tool "${name}" returned success=false with no error message`
|
|
880
|
+
};
|
|
881
|
+
} catch (err) {
|
|
882
|
+
return {
|
|
883
|
+
success: false,
|
|
884
|
+
output: `Server tool error: ${err.message || err}`
|
|
885
|
+
};
|
|
886
|
+
}
|
|
715
887
|
}
|
|
888
|
+
//# sourceMappingURL=server-tools.js.map
|