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
|
@@ -7,43 +7,57 @@
|
|
|
7
7
|
* - Cost optimization (Haiku for simple tasks)
|
|
8
8
|
* - Resume capability for long-running tasks
|
|
9
9
|
*/
|
|
10
|
+
|
|
10
11
|
import { readFileSync, existsSync, writeFileSync, mkdirSync, appendFileSync } from "fs";
|
|
11
12
|
import { join } from "path";
|
|
12
13
|
import { homedir, tmpdir } from "os";
|
|
13
|
-
import { LOCAL_TOOL_DEFINITIONS
|
|
14
|
-
import { LoopDetector, estimateCostUsd, demoteSubagentModel, AGENT_DEFAULTS } from "../../shared/agent-core.js";
|
|
14
|
+
import { LOCAL_TOOL_DEFINITIONS } from "./local-tools.js";
|
|
15
|
+
import { LoopDetector, estimateCostUsd, demoteSubagentModel, AGENT_DEFAULTS, resolveAgentLoopConfig } from "../../shared/agent-core.js";
|
|
16
|
+
import { preCompact } from "../../shared/compaction.js";
|
|
15
17
|
import { loadCLIAgentConfig } from "./agent-config.js";
|
|
16
18
|
import { MODEL_MAP } from "../../shared/constants.js";
|
|
17
|
-
import { loadServerToolDefinitions
|
|
18
|
-
import { logSpan, generateSpanId, generateTraceId } from "./telemetry.js";
|
|
19
|
+
import { loadServerToolDefinitions } from "./server-tools.js";
|
|
20
|
+
import { logSpan, generateSpanId, generateTraceId, PKG_VERSION } from "./telemetry.js";
|
|
19
21
|
import { loadClaudeMd } from "./agent-loop.js";
|
|
20
22
|
import { getGlobalEmitter } from "./agent-events.js";
|
|
21
23
|
import { getAgentDefinition } from "./agent-definitions.js";
|
|
22
|
-
import { callAgentAPI, executeToolBlocks, extractTextBlocks, extractToolUseBlocks, getResponseText, yieldToEventLoop, yieldForRender, } from "./agent-worker-base.js";
|
|
24
|
+
import { callAgentAPI, executeToolBlocks, extractTextBlocks, extractToolUseBlocks, getResponseText, yieldToEventLoop, yieldForRender, deduplicateTools, assertUniqueToolNames } from "./agent-worker-base.js";
|
|
25
|
+
|
|
26
|
+
// ============================================================================
|
|
27
|
+
// TYPES
|
|
28
|
+
// ============================================================================
|
|
29
|
+
|
|
30
|
+
// Documentation lookups, web research
|
|
31
|
+
|
|
32
|
+
// Accepts built-in types + custom agent names from .whale/agents/
|
|
33
|
+
|
|
23
34
|
// ============================================================================
|
|
24
35
|
// CONSTANTS
|
|
25
36
|
// ============================================================================
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
37
|
+
|
|
38
|
+
const AGENTS_DIR = join(homedir(), ".whale", "agents");
|
|
39
|
+
|
|
40
|
+
// No hard cap on subagent turns — agent self-regulates via end_turn (Claude Code parity).
|
|
41
|
+
// DB config (subagent_max_turns) controls the default. Callers can override via max_turns param.
|
|
42
|
+
|
|
30
43
|
// ============================================================================
|
|
31
44
|
// AGENT PROMPTS — specialized per type
|
|
32
45
|
// ============================================================================
|
|
46
|
+
|
|
33
47
|
// Build agent prompt with working directory context
|
|
34
48
|
function buildAgentPrompt(type, cwd) {
|
|
35
|
-
|
|
49
|
+
const cwdContext = `
|
|
36
50
|
## Working Directory
|
|
37
51
|
You are working in: ${cwd}
|
|
38
52
|
All file paths should be relative to or absolute from this directory.
|
|
39
53
|
IMPORTANT: Focus ONLY on files within this directory. Do not get confused by other projects.
|
|
40
54
|
`;
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
55
|
+
|
|
56
|
+
// Check for custom agent definition first
|
|
57
|
+
const custom = getAgentDefinition(type);
|
|
58
|
+
if (custom) return custom.prompt + cwdContext;
|
|
59
|
+
const prompts = {
|
|
60
|
+
explore: `You are an exploration agent. Your ONLY job is to quickly find specific information in the codebase, then STOP.
|
|
47
61
|
|
|
48
62
|
Tools available:
|
|
49
63
|
- glob: Find files by pattern (e.g., "**/*.ts")
|
|
@@ -70,7 +84,7 @@ Return a concise summary with:
|
|
|
70
84
|
- Direct answer to the question asked
|
|
71
85
|
|
|
72
86
|
IMPORTANT: Complete in 2-4 turns. If you haven't found it by turn 4, summarize what you found and STOP.`,
|
|
73
|
-
|
|
87
|
+
plan: `You are a planning agent. Your ONLY job is to analyze the codebase and create an implementation plan, then STOP.
|
|
74
88
|
|
|
75
89
|
Tools available:
|
|
76
90
|
- glob: Find files by pattern
|
|
@@ -104,7 +118,7 @@ ${cwdContext}
|
|
|
104
118
|
- [Any considerations]
|
|
105
119
|
|
|
106
120
|
IMPORTANT: Complete in 3-5 turns. If you haven't finished by turn 5, output your best plan and STOP.`,
|
|
107
|
-
|
|
121
|
+
"general-purpose": `You are an autonomous agent for discrete tasks. Complete the task, then STOP.
|
|
108
122
|
|
|
109
123
|
Tools available:
|
|
110
124
|
- File operations: read_file, write_file, edit_file, glob, grep
|
|
@@ -137,7 +151,7 @@ ${cwdContext}
|
|
|
137
151
|
[Any problems encountered]
|
|
138
152
|
|
|
139
153
|
IMPORTANT: This is a discrete task. Complete it in 4-6 turns maximum. Do not loop.`,
|
|
140
|
-
|
|
154
|
+
research: `You are a research agent. Find the specific information requested, then STOP.
|
|
141
155
|
|
|
142
156
|
Tools available:
|
|
143
157
|
- web_fetch: Fetch and parse web content
|
|
@@ -171,450 +185,607 @@ ${cwdContext}
|
|
|
171
185
|
### Caveats
|
|
172
186
|
[Any version requirements or limitations]
|
|
173
187
|
|
|
174
|
-
IMPORTANT: Complete in 2-4 turns. Stop as soon as you have a good answer
|
|
175
|
-
|
|
176
|
-
|
|
188
|
+
IMPORTANT: Complete in 2-4 turns. Stop as soon as you have a good answer.`
|
|
189
|
+
};
|
|
190
|
+
return prompts[type] || prompts["general-purpose"];
|
|
177
191
|
}
|
|
192
|
+
|
|
178
193
|
// ============================================================================
|
|
179
194
|
// AGENT STATE PERSISTENCE
|
|
180
195
|
// ============================================================================
|
|
196
|
+
|
|
181
197
|
function ensureAgentsDir() {
|
|
182
|
-
|
|
183
|
-
|
|
198
|
+
if (!existsSync(AGENTS_DIR)) mkdirSync(AGENTS_DIR, {
|
|
199
|
+
recursive: true
|
|
200
|
+
});
|
|
184
201
|
}
|
|
185
202
|
function saveAgentState(state) {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
203
|
+
ensureAgentsDir();
|
|
204
|
+
const path = join(AGENTS_DIR, `${state.id}.json`);
|
|
205
|
+
writeFileSync(path, JSON.stringify(state, null, 2), "utf-8");
|
|
189
206
|
}
|
|
190
207
|
function loadAgentState(agentId) {
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
return null;
|
|
199
|
-
}
|
|
208
|
+
const path = join(AGENTS_DIR, `${agentId}.json`);
|
|
209
|
+
if (!existsSync(path)) return null;
|
|
210
|
+
try {
|
|
211
|
+
return JSON.parse(readFileSync(path, "utf-8"));
|
|
212
|
+
} catch {
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
200
215
|
}
|
|
201
216
|
function generateAgentId() {
|
|
202
|
-
|
|
217
|
+
return `agent-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
203
218
|
}
|
|
219
|
+
|
|
204
220
|
// ============================================================================
|
|
205
221
|
// TOOL FILTERING — restrict tools per agent type
|
|
206
222
|
// ============================================================================
|
|
223
|
+
|
|
207
224
|
function getToolsForAgent(type) {
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
"glob", "grep", "notebook_edit", "web_fetch", "tasks",
|
|
225
|
-
];
|
|
226
|
-
default:
|
|
227
|
-
return ["read_file", "glob", "grep"];
|
|
228
|
-
}
|
|
225
|
+
// Check for custom agent definition with explicit tools
|
|
226
|
+
const custom = getAgentDefinition(type);
|
|
227
|
+
if (custom?.tools && custom.tools.length > 0) return custom.tools;
|
|
228
|
+
switch (type) {
|
|
229
|
+
case "explore":
|
|
230
|
+
return ["glob", "grep", "read_file", "list_directory", "search_files", "search_content"];
|
|
231
|
+
case "plan":
|
|
232
|
+
return ["glob", "grep", "read_file", "list_directory", "search_files", "search_content"];
|
|
233
|
+
case "research":
|
|
234
|
+
return ["web_fetch", "web_search", "read_file", "grep", "glob"];
|
|
235
|
+
case "general-purpose":
|
|
236
|
+
// All tools EXCEPT delegation — "Subagents cannot spawn other subagents" (Claude Code parity)
|
|
237
|
+
return ["read_file", "write_file", "edit_file", "list_directory", "search_files", "search_content", "run_command", "glob", "grep", "notebook_edit", "web_fetch"];
|
|
238
|
+
default:
|
|
239
|
+
return ["read_file", "glob", "grep"];
|
|
240
|
+
}
|
|
229
241
|
}
|
|
230
242
|
async function getFilteredTools(type) {
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
}
|
|
250
|
-
return localTools;
|
|
243
|
+
const allowedNames = new Set(getToolsForAgent(type));
|
|
244
|
+
|
|
245
|
+
// Local tools
|
|
246
|
+
const localTools = LOCAL_TOOL_DEFINITIONS.filter(t => allowedNames.has(t.name)).map(t => ({
|
|
247
|
+
name: t.name,
|
|
248
|
+
description: t.description,
|
|
249
|
+
input_schema: t.input_schema
|
|
250
|
+
}));
|
|
251
|
+
|
|
252
|
+
// Add server tools if available, filtering by allowed names
|
|
253
|
+
try {
|
|
254
|
+
const serverTools = await loadServerToolDefinitions();
|
|
255
|
+
const allowedServerTools = serverTools.filter(t => allowedNames.has(t.name));
|
|
256
|
+
localTools.push(...allowedServerTools);
|
|
257
|
+
} catch {/* server tools unavailable */}
|
|
258
|
+
|
|
259
|
+
// Deduplicate: local tools take priority over server tools with same name
|
|
260
|
+
return deduplicateTools(localTools);
|
|
251
261
|
}
|
|
262
|
+
|
|
252
263
|
// ============================================================================
|
|
253
264
|
// DISPLAY HELPERS — icons and colors for trace visualization
|
|
254
265
|
// ============================================================================
|
|
266
|
+
|
|
255
267
|
function getAgentIcon(type) {
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
268
|
+
const icons = {
|
|
269
|
+
explore: "🔍",
|
|
270
|
+
// Magnifying glass for exploration
|
|
271
|
+
plan: "📋",
|
|
272
|
+
// Clipboard for planning
|
|
273
|
+
"general-purpose": "🤖",
|
|
274
|
+
// Robot for autonomous work
|
|
275
|
+
research: "📚" // Books for research
|
|
276
|
+
};
|
|
277
|
+
return icons[type] || "⚙️";
|
|
263
278
|
}
|
|
264
279
|
function getAgentColor(type) {
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
280
|
+
const colors = {
|
|
281
|
+
explore: "#3B82F6",
|
|
282
|
+
// Blue for exploration
|
|
283
|
+
plan: "#8B5CF6",
|
|
284
|
+
// Purple for planning
|
|
285
|
+
"general-purpose": "#10B981",
|
|
286
|
+
// Green for general work
|
|
287
|
+
research: "#F59E0B" // Amber for research
|
|
288
|
+
};
|
|
289
|
+
return colors[type] || "#6B7280";
|
|
272
290
|
}
|
|
291
|
+
|
|
273
292
|
// ============================================================================
|
|
274
293
|
// SUBAGENT EXECUTION
|
|
275
294
|
// ============================================================================
|
|
295
|
+
|
|
276
296
|
// Progress emitter — uses event system instead of stderr to avoid UI conflicts
|
|
277
297
|
// The global emitter batches and routes these to ChatApp without causing re-renders
|
|
278
298
|
// NOTE: No module-level mutable state — agentId/turn passed through function params for parallel safety
|
|
299
|
+
|
|
279
300
|
function emitSubagentProgress(agentType, agentId, message, turn, toolName) {
|
|
280
|
-
|
|
281
|
-
|
|
301
|
+
const emitter = getGlobalEmitter();
|
|
302
|
+
emitter.emitSubagentProgress(agentId, agentType, message, turn, toolName);
|
|
282
303
|
}
|
|
283
304
|
export async function runSubagent(options) {
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
state
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
source: "claude_code",
|
|
341
|
-
serviceName: "whale-cli",
|
|
342
|
-
serviceVersion: "2.1.0",
|
|
343
|
-
model: modelId,
|
|
344
|
-
agentId,
|
|
345
|
-
agentName: name || `subagent-${subagent_type}`,
|
|
346
|
-
// Inherit parent's trace to keep hierarchy intact
|
|
347
|
-
traceId: parentTraceContext?.traceId || generateTraceId(),
|
|
348
|
-
spanId: subagentSpanId,
|
|
349
|
-
parentSpanId: parentTraceContext?.spanId, // Parent's spanId becomes our parentSpanId
|
|
350
|
-
conversationId: parentTraceContext?.conversationId,
|
|
351
|
-
turnNumber: parentTraceContext?.turnNumber, // Inherit parent turn, don't increment
|
|
352
|
-
userId: parentTraceContext?.userId,
|
|
353
|
-
userEmail: parentTraceContext?.userEmail,
|
|
354
|
-
traceFlags: 1,
|
|
305
|
+
const {
|
|
306
|
+
prompt,
|
|
307
|
+
subagent_type,
|
|
308
|
+
model,
|
|
309
|
+
resume,
|
|
310
|
+
max_turns,
|
|
311
|
+
name,
|
|
312
|
+
parentContext,
|
|
313
|
+
parentTraceContext,
|
|
314
|
+
taskContext,
|
|
315
|
+
signal
|
|
316
|
+
} = options;
|
|
317
|
+
const agentId = resume || generateAgentId();
|
|
318
|
+
const cwd = process.cwd();
|
|
319
|
+
const systemPrompt = buildAgentPrompt(subagent_type, cwd);
|
|
320
|
+
const startTime = Date.now();
|
|
321
|
+
|
|
322
|
+
// Check for custom agent definition with per-agent config
|
|
323
|
+
const customDef = getAgentDefinition(subagent_type);
|
|
324
|
+
|
|
325
|
+
// Model resolution: caller override → agent definition → demotion logic → haiku
|
|
326
|
+
const effectiveModelAlias = model || customDef?.model || demoteSubagentModel(model, subagent_type);
|
|
327
|
+
const modelId = MODEL_MAP[effectiveModelAlias] || MODEL_MAP["haiku"];
|
|
328
|
+
|
|
329
|
+
// Resolve all config from DB → AGENT_DEFAULTS fallback (single source of truth)
|
|
330
|
+
const dbAgent = await loadCLIAgentConfig();
|
|
331
|
+
const resolved = dbAgent ? resolveAgentLoopConfig(dbAgent, "sse") : null;
|
|
332
|
+
const dbMaxTurns = resolved?.subagentMaxTurns ?? AGENT_DEFAULTS.subagentMaxTurns;
|
|
333
|
+
const dbMaxTokens = customDef?.max_tokens ?? resolved?.subagentMaxTokens ?? AGENT_DEFAULTS.subagentMaxTokens;
|
|
334
|
+
// 0 = no limit (agent self-regulates via end_turn, Claude Code parity)
|
|
335
|
+
// Safety: LoopDetector + cost budget + stall detection are the real guards.
|
|
336
|
+
const rawMaxTurns = max_turns ? Math.max(1, max_turns) : dbMaxTurns;
|
|
337
|
+
const effectiveMaxTurns = rawMaxTurns === 0 ? Number.MAX_SAFE_INTEGER : rawMaxTurns;
|
|
338
|
+
const maxToolResultChars = resolved?.maxToolResultChars ?? AGENT_DEFAULTS.maxToolResultChars;
|
|
339
|
+
const maxRetries = resolved?.subagentMaxRetries ?? AGENT_DEFAULTS.subagentMaxRetries;
|
|
340
|
+
const maxContinuations = resolved?.subagentMaxContinuations ?? AGENT_DEFAULTS.subagentMaxContinuations;
|
|
341
|
+
|
|
342
|
+
// Extract short description from prompt (first sentence or 60 chars)
|
|
343
|
+
const descMatch = prompt.match(/^[^.!?\n]+/);
|
|
344
|
+
const shortDescription = name || (descMatch ? descMatch[0].slice(0, 60) + (descMatch[0].length > 60 ? "…" : "") : prompt.slice(0, 60) + (prompt.length > 60 ? "…" : ""));
|
|
345
|
+
|
|
346
|
+
// Emit subagent start event
|
|
347
|
+
const emitter = getGlobalEmitter();
|
|
348
|
+
emitter.emitSubagentStart(agentId, subagent_type, model || "inherited", shortDescription);
|
|
349
|
+
|
|
350
|
+
// Load or create agent state
|
|
351
|
+
let state = resume ? loadAgentState(resume) : null;
|
|
352
|
+
if (!state) {
|
|
353
|
+
state = {
|
|
354
|
+
id: agentId,
|
|
355
|
+
type: subagent_type,
|
|
356
|
+
model: modelId,
|
|
357
|
+
messages: [],
|
|
358
|
+
toolsUsed: [],
|
|
359
|
+
createdAt: new Date().toISOString(),
|
|
360
|
+
updatedAt: new Date().toISOString()
|
|
355
361
|
};
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
tool_type: "subagent_tool",
|
|
464
|
-
tool_input: tu?.input,
|
|
465
|
-
agent_id: agentId,
|
|
466
|
-
agent_type: subagent_type,
|
|
467
|
-
is_subagent_tool: true,
|
|
468
|
-
iteration: turn,
|
|
469
|
-
},
|
|
470
|
-
});
|
|
471
|
-
},
|
|
472
|
-
},
|
|
473
|
-
});
|
|
474
|
-
// Track tool usage
|
|
475
|
-
for (const tn of turnToolsUsed) {
|
|
476
|
-
if (!state.toolsUsed.includes(tn)) {
|
|
477
|
-
state.toolsUsed.push(tn);
|
|
478
|
-
}
|
|
479
|
-
}
|
|
480
|
-
// Append assistant response + tool results
|
|
481
|
-
state.messages.push({
|
|
482
|
-
role: "assistant",
|
|
483
|
-
content: response.content,
|
|
484
|
-
});
|
|
485
|
-
state.messages.push({
|
|
486
|
-
role: "user",
|
|
487
|
-
content: toolResults,
|
|
488
|
-
});
|
|
489
|
-
// Yield to event loop after tool execution
|
|
490
|
-
await yieldToEventLoop();
|
|
362
|
+
}
|
|
363
|
+
const loopDetector = resolved ? LoopDetector.fromResolved(resolved) : new LoopDetector();
|
|
364
|
+
|
|
365
|
+
// Get filtered tools for this agent type (deduped)
|
|
366
|
+
const tools = await getFilteredTools(subagent_type);
|
|
367
|
+
assertUniqueToolNames(tools);
|
|
368
|
+
|
|
369
|
+
// Build full system prompt with optional parent context and task dedup context
|
|
370
|
+
let fullSystemPrompt = systemPrompt;
|
|
371
|
+
if (parentContext) {
|
|
372
|
+
fullSystemPrompt += `\n\n## Parent Conversation Context\n${parentContext}`;
|
|
373
|
+
}
|
|
374
|
+
if (taskContext) {
|
|
375
|
+
fullSystemPrompt += `\n\n## Other Agents\n${taskContext}\nDo NOT duplicate research or work that other agents are handling. Focus only on your assigned task.`;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
// Add CLAUDE.md if available
|
|
379
|
+
const claudeMd = loadClaudeMd();
|
|
380
|
+
if (claudeMd) {
|
|
381
|
+
fullSystemPrompt += `\n\n## Project Instructions\n${claudeMd.content}`;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
// Add user prompt to messages
|
|
385
|
+
state.messages.push({
|
|
386
|
+
role: "user",
|
|
387
|
+
content: prompt
|
|
388
|
+
});
|
|
389
|
+
let totalIn = 0;
|
|
390
|
+
let totalOut = 0;
|
|
391
|
+
let totalCacheRead = 0;
|
|
392
|
+
let totalCacheCreate = 0;
|
|
393
|
+
let finalText = "";
|
|
394
|
+
|
|
395
|
+
// Create subagent span context — inherit parent's trace context for hierarchy
|
|
396
|
+
// IMPORTANT: Don't increment global turn number — subagent is part of parent turn
|
|
397
|
+
const subagentSpanId = generateSpanId();
|
|
398
|
+
const turnCtx = {
|
|
399
|
+
source: "claude_code",
|
|
400
|
+
serviceName: "whale-cli",
|
|
401
|
+
serviceVersion: PKG_VERSION,
|
|
402
|
+
model: modelId,
|
|
403
|
+
agentId,
|
|
404
|
+
agentName: name || `subagent-${subagent_type}`,
|
|
405
|
+
// Inherit parent's trace to keep hierarchy intact
|
|
406
|
+
traceId: parentTraceContext?.traceId || generateTraceId(),
|
|
407
|
+
spanId: subagentSpanId,
|
|
408
|
+
parentSpanId: parentTraceContext?.spanId,
|
|
409
|
+
// Parent's spanId becomes our parentSpanId
|
|
410
|
+
conversationId: parentTraceContext?.conversationId,
|
|
411
|
+
turnNumber: parentTraceContext?.turnNumber,
|
|
412
|
+
// Inherit parent turn, don't increment
|
|
413
|
+
userId: parentTraceContext?.userId,
|
|
414
|
+
userEmail: parentTraceContext?.userEmail,
|
|
415
|
+
traceFlags: 1
|
|
416
|
+
};
|
|
417
|
+
try {
|
|
418
|
+
for (let turn = 0; turn < effectiveMaxTurns; turn++) {
|
|
419
|
+
// Check for cancellation at start of each turn
|
|
420
|
+
if (signal?.aborted) {
|
|
421
|
+
emitSubagentProgress(subagent_type, agentId, "cancelled", turn + 1);
|
|
422
|
+
emitter.emitSubagentDone(agentId, subagent_type, false, "Cancelled", {
|
|
423
|
+
input: totalIn,
|
|
424
|
+
output: totalOut
|
|
425
|
+
}, state.toolsUsed, Date.now() - startTime);
|
|
426
|
+
return {
|
|
427
|
+
success: false,
|
|
428
|
+
output: "Cancelled",
|
|
429
|
+
agentId,
|
|
430
|
+
tokensUsed: {
|
|
431
|
+
input: totalIn,
|
|
432
|
+
output: totalOut
|
|
433
|
+
},
|
|
434
|
+
toolsUsed: state.toolsUsed
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
// Emit progress and yield before API call to keep UI responsive
|
|
439
|
+
emitSubagentProgress(subagent_type, agentId, `turn ${turn + 1}: calling API...`, turn + 1);
|
|
440
|
+
await yieldForRender(); // Give Ink time to render the progress update
|
|
441
|
+
|
|
442
|
+
// Adaptive thinking enabled — model decides when to think (Claude Code parity).
|
|
443
|
+
// Opus 4.6 uses adaptive thinking by default; no separate enable/disable needed.
|
|
444
|
+
const apiStart = Date.now();
|
|
445
|
+
let response;
|
|
446
|
+
let lastError = null;
|
|
447
|
+
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
448
|
+
try {
|
|
449
|
+
response = await callAgentAPI({
|
|
450
|
+
modelId,
|
|
451
|
+
contextProfile: "subagent",
|
|
452
|
+
systemPrompt: fullSystemPrompt,
|
|
453
|
+
messages: state.messages,
|
|
454
|
+
tools,
|
|
455
|
+
thinkingEnabled: true,
|
|
456
|
+
maxOutputTokens: dbMaxTokens,
|
|
457
|
+
cacheLastTool: true,
|
|
458
|
+
abortSignal: signal
|
|
459
|
+
});
|
|
460
|
+
lastError = null;
|
|
461
|
+
break;
|
|
462
|
+
} catch (err) {
|
|
463
|
+
lastError = err;
|
|
464
|
+
if (attempt < maxRetries - 1 && (err.status === 429 || err.status === 500 || err.status === 529)) {
|
|
465
|
+
await new Promise(r => setTimeout(r, 1000 * Math.pow(2, attempt)));
|
|
466
|
+
continue;
|
|
467
|
+
}
|
|
468
|
+
throw err;
|
|
491
469
|
}
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
470
|
+
}
|
|
471
|
+
if (lastError) throw lastError;
|
|
472
|
+
const apiDuration = Date.now() - apiStart;
|
|
473
|
+
|
|
474
|
+
// Yield after API call
|
|
475
|
+
await yieldToEventLoop();
|
|
476
|
+
totalIn += response.usage.input_tokens;
|
|
477
|
+
totalOut += response.usage.output_tokens;
|
|
478
|
+
totalCacheRead += response.usage.cache_read_tokens;
|
|
479
|
+
totalCacheCreate += response.usage.cache_creation_tokens;
|
|
480
|
+
|
|
481
|
+
// Log API call as child span — include cache tokens for accurate cost
|
|
482
|
+
const apiCostUsd = estimateCostUsd(response.usage.input_tokens, response.usage.output_tokens, modelId, 0,
|
|
483
|
+
// thinkingTokens (disabled for subagents)
|
|
484
|
+
response.usage.cache_read_tokens, response.usage.cache_creation_tokens);
|
|
485
|
+
logSpan({
|
|
486
|
+
action: "claude_api_request",
|
|
487
|
+
durationMs: apiDuration,
|
|
488
|
+
context: {
|
|
489
|
+
...turnCtx,
|
|
490
|
+
spanId: generateSpanId(),
|
|
491
|
+
// New span for this API call
|
|
492
|
+
parentSpanId: turnCtx.spanId,
|
|
493
|
+
// Parent is the subagent
|
|
494
|
+
inputTokens: response.usage.input_tokens,
|
|
495
|
+
outputTokens: response.usage.output_tokens,
|
|
496
|
+
cacheReadTokens: response.usage.cache_read_tokens,
|
|
497
|
+
cacheCreationTokens: response.usage.cache_creation_tokens,
|
|
498
|
+
totalCost: apiCostUsd,
|
|
499
|
+
model: modelId
|
|
500
|
+
},
|
|
501
|
+
details: {
|
|
502
|
+
"gen_ai.request.model": modelId,
|
|
503
|
+
"gen_ai.usage.input_tokens": response.usage.input_tokens,
|
|
504
|
+
"gen_ai.usage.output_tokens": response.usage.output_tokens,
|
|
505
|
+
"gen_ai.usage.cache_read_tokens": response.usage.cache_read_tokens,
|
|
506
|
+
"gen_ai.usage.cache_creation_tokens": response.usage.cache_creation_tokens,
|
|
507
|
+
"gen_ai.usage.cost": apiCostUsd,
|
|
508
|
+
agent_id: agentId,
|
|
509
|
+
agent_type: subagent_type,
|
|
510
|
+
turn: turn + 1,
|
|
511
|
+
stop_reason: response.stop_reason,
|
|
512
|
+
is_subagent_api: true
|
|
513
|
+
}
|
|
514
|
+
});
|
|
515
|
+
|
|
516
|
+
// Yield to event loop to keep UI responsive
|
|
517
|
+
await yieldToEventLoop();
|
|
518
|
+
|
|
519
|
+
// Extract text and tool use using shared helpers
|
|
520
|
+
const textBlocks = extractTextBlocks(response.content);
|
|
521
|
+
const toolBlocks = extractToolUseBlocks(response.content);
|
|
522
|
+
if (textBlocks.length) {
|
|
523
|
+
finalText = getResponseText(response.content);
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
// Compaction handling — API paused after generating summary.
|
|
527
|
+
// Per Anthropic docs: just use the compaction block, don't preserve old messages.
|
|
528
|
+
if (response.stop_reason === "compaction") {
|
|
529
|
+
const compactionBlock = response.content.find(b => b.type === "compaction");
|
|
530
|
+
if (compactionBlock) {
|
|
531
|
+
state.compactionCount = (state.compactionCount ?? 0) + 1;
|
|
532
|
+
state.messages = [{
|
|
533
|
+
role: "assistant",
|
|
534
|
+
content: [{
|
|
535
|
+
type: "compaction",
|
|
536
|
+
content: compactionBlock.content
|
|
537
|
+
}]
|
|
538
|
+
}, {
|
|
539
|
+
role: "user",
|
|
540
|
+
content: [{
|
|
541
|
+
type: "text",
|
|
542
|
+
text: "Continue with your task."
|
|
543
|
+
}]
|
|
544
|
+
}];
|
|
545
|
+
turn--; // Don't count compaction as a turn
|
|
546
|
+
continue;
|
|
529
547
|
}
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
// No tool calls — check stop reason
|
|
551
|
+
if (toolBlocks.length === 0 || response.stop_reason === "end_turn") {
|
|
552
|
+
// max_tokens: response was truncated mid-generation — give the model a chance to finish
|
|
553
|
+
// Cap at 2 continuations to prevent infinite loops on very large outputs
|
|
554
|
+
if (response.stop_reason === "max_tokens" && (state.continuations ?? 0) < maxContinuations) {
|
|
555
|
+
state.continuations = (state.continuations ?? 0) + 1;
|
|
556
|
+
state.messages.push({
|
|
557
|
+
role: "assistant",
|
|
558
|
+
content: response.content
|
|
559
|
+
});
|
|
560
|
+
const contCount = state.continuations ?? 1;
|
|
561
|
+
const contText = contCount === 1 ? "[Your response was truncated due to the output token limit. If writing a large file, split into multiple smaller write_file calls (~200 lines each). Continue concisely.]" : `[Truncated again (${contCount}/${maxContinuations}). You MUST reduce output size — use multiple small write_file calls, not one large one.]`;
|
|
562
|
+
state.messages.push({
|
|
563
|
+
role: "user",
|
|
564
|
+
content: [{
|
|
565
|
+
type: "text",
|
|
566
|
+
text: contText
|
|
567
|
+
}]
|
|
568
|
+
});
|
|
569
|
+
continue;
|
|
570
|
+
}
|
|
571
|
+
emitSubagentProgress(subagent_type, agentId, `done (${turn + 1} turn${turn > 0 ? "s" : ""})`, turn + 1);
|
|
572
|
+
break;
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
// Emit tool usage progress
|
|
576
|
+
const toolNames = toolBlocks.map(b => b.name).join(", ");
|
|
577
|
+
emitSubagentProgress(subagent_type, agentId, `using: ${toolNames}`, turn + 1);
|
|
578
|
+
|
|
579
|
+
// Execute tools using shared executeToolBlocks
|
|
580
|
+
const {
|
|
581
|
+
toolResults,
|
|
582
|
+
toolsUsed: turnToolsUsed
|
|
583
|
+
} = await executeToolBlocks({
|
|
584
|
+
toolBlocks,
|
|
585
|
+
loopDetector,
|
|
586
|
+
signal,
|
|
587
|
+
callbacks: {
|
|
588
|
+
onToolStart: (toolName, input) => {
|
|
589
|
+
emitSubagentProgress(subagent_type, agentId, `running ${toolName}`, turn + 1, toolName);
|
|
590
|
+
emitter.emitSubagentToolStart(agentId, toolName, input);
|
|
591
|
+
},
|
|
592
|
+
onToolEnd: (toolName, success, durationMs) => {
|
|
593
|
+
emitter.emitSubagentToolEnd(agentId, toolName, success, durationMs);
|
|
594
|
+
|
|
595
|
+
// Log tool call as child span of the subagent
|
|
596
|
+
const tu = toolBlocks.find(b => b.name === toolName);
|
|
597
|
+
logSpan({
|
|
598
|
+
action: `tool.${toolName}`,
|
|
599
|
+
durationMs,
|
|
600
|
+
context: {
|
|
536
601
|
...turnCtx,
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
602
|
+
spanId: generateSpanId(),
|
|
603
|
+
parentSpanId: turnCtx.spanId
|
|
604
|
+
},
|
|
605
|
+
error: success ? undefined : "(see tool result)",
|
|
606
|
+
details: {
|
|
607
|
+
tool_type: "subagent_tool",
|
|
608
|
+
tool_input: tu?.input,
|
|
543
609
|
agent_id: agentId,
|
|
544
610
|
agent_type: subagent_type,
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
611
|
+
is_subagent_tool: true,
|
|
612
|
+
iteration: turn
|
|
613
|
+
}
|
|
614
|
+
});
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
});
|
|
618
|
+
|
|
619
|
+
// Track tool usage
|
|
620
|
+
for (const tn of turnToolsUsed) {
|
|
621
|
+
if (!state.toolsUsed.includes(tn)) {
|
|
622
|
+
state.toolsUsed.push(tn);
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
// Append assistant response + tool results
|
|
627
|
+
state.messages.push({
|
|
628
|
+
role: "assistant",
|
|
629
|
+
content: response.content
|
|
630
|
+
});
|
|
631
|
+
state.messages.push({
|
|
632
|
+
role: "user",
|
|
633
|
+
content: toolResults
|
|
634
|
+
});
|
|
635
|
+
|
|
636
|
+
// Progress nudge: when approaching turn limit without any edits, warn the agent
|
|
637
|
+
const turnsRemaining = effectiveMaxTurns - turn - 1;
|
|
638
|
+
const nudgeThreshold = Math.ceil(effectiveMaxTurns * 0.25); // Last 25% of turns
|
|
639
|
+
if (turnsRemaining === nudgeThreshold && turnsRemaining > 0) {
|
|
640
|
+
const editTools = ["write_file", "edit_file", "create_file", "notebook_edit"];
|
|
641
|
+
const hasEdited = state.toolsUsed.some(t => editTools.includes(t));
|
|
642
|
+
if (!hasEdited) {
|
|
643
|
+
state.messages.push({
|
|
644
|
+
role: "user",
|
|
645
|
+
content: [{
|
|
646
|
+
type: "text",
|
|
647
|
+
text: `⚠️ TURN LIMIT WARNING: You have ${turnsRemaining} turns remaining out of ${effectiveMaxTurns} and have NOT made any file edits yet. Stop exploring and start producing your output NOW. If you need to write or edit files, do it immediately. Prioritize delivering results over gathering more information.`
|
|
648
|
+
}]
|
|
649
|
+
});
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
// Pre-compact: trim large tool results and thinking blocks to prevent context bloat.
|
|
654
|
+
// Without this, context grows unbounded (4K→28K→73K tokens per turn).
|
|
655
|
+
const {
|
|
656
|
+
messages: compactedMessages
|
|
657
|
+
} = preCompact(state.messages, {
|
|
658
|
+
maxToolResultChars,
|
|
659
|
+
stripThinking: true
|
|
660
|
+
});
|
|
661
|
+
state.messages = compactedMessages;
|
|
662
|
+
|
|
663
|
+
// Yield to event loop after tool execution
|
|
664
|
+
await yieldToEventLoop();
|
|
588
665
|
}
|
|
666
|
+
|
|
667
|
+
// Save state for potential resume
|
|
668
|
+
state.updatedAt = new Date().toISOString();
|
|
669
|
+
saveAgentState(state);
|
|
670
|
+
|
|
671
|
+
// Log single subagent span with all metadata for trace visualization
|
|
672
|
+
const subagentTotalCost = estimateCostUsd(totalIn, totalOut, modelId, 0, totalCacheRead, totalCacheCreate);
|
|
673
|
+
logSpan({
|
|
674
|
+
action: `subagent.${subagent_type}`,
|
|
675
|
+
durationMs: Date.now() - new Date(state.createdAt).getTime(),
|
|
676
|
+
context: {
|
|
677
|
+
...turnCtx,
|
|
678
|
+
inputTokens: totalIn,
|
|
679
|
+
outputTokens: totalOut,
|
|
680
|
+
totalCost: subagentTotalCost
|
|
681
|
+
},
|
|
682
|
+
details: {
|
|
683
|
+
agent_id: agentId,
|
|
684
|
+
agent_type: subagent_type,
|
|
685
|
+
model: modelId,
|
|
686
|
+
// OpenTelemetry gen_ai semantic conventions
|
|
687
|
+
"gen_ai.request.model": modelId,
|
|
688
|
+
"gen_ai.usage.input_tokens": totalIn,
|
|
689
|
+
"gen_ai.usage.output_tokens": totalOut,
|
|
690
|
+
"gen_ai.usage.cache_read_tokens": totalCacheRead,
|
|
691
|
+
"gen_ai.usage.cache_creation_tokens": totalCacheCreate,
|
|
692
|
+
"gen_ai.usage.cost": subagentTotalCost,
|
|
693
|
+
// Execution metrics
|
|
694
|
+
turns: state.messages.length / 2,
|
|
695
|
+
tools_used: state.toolsUsed,
|
|
696
|
+
tool_count: state.toolsUsed.length,
|
|
697
|
+
// Hierarchy
|
|
698
|
+
is_subagent: true,
|
|
699
|
+
parent_trace_id: parentTraceContext?.traceId,
|
|
700
|
+
parent_span_id: parentTraceContext?.spanId,
|
|
701
|
+
// Display metadata
|
|
702
|
+
display_name: `${subagent_type.charAt(0).toUpperCase() + subagent_type.slice(1)} Agent`,
|
|
703
|
+
display_icon: getAgentIcon(subagent_type),
|
|
704
|
+
display_color: getAgentColor(subagent_type),
|
|
705
|
+
// Content previews
|
|
706
|
+
summary: finalText.slice(0, 2000) + (finalText.length > 2000 ? "..." : ""),
|
|
707
|
+
prompt_preview: prompt.slice(0, 200) + (prompt.length > 200 ? "..." : "")
|
|
708
|
+
}
|
|
709
|
+
});
|
|
710
|
+
|
|
711
|
+
// Emit subagent done event
|
|
712
|
+
emitter.emitSubagentDone(agentId, subagent_type, true, finalText || "(No output from agent)", {
|
|
713
|
+
input: totalIn,
|
|
714
|
+
output: totalOut
|
|
715
|
+
}, state.toolsUsed, Date.now() - startTime);
|
|
716
|
+
return {
|
|
717
|
+
success: true,
|
|
718
|
+
output: finalText || "(No output from agent)",
|
|
719
|
+
agentId,
|
|
720
|
+
tokensUsed: {
|
|
721
|
+
input: totalIn,
|
|
722
|
+
output: totalOut
|
|
723
|
+
},
|
|
724
|
+
toolsUsed: state.toolsUsed
|
|
725
|
+
};
|
|
726
|
+
} catch (err) {
|
|
727
|
+
// Emit subagent error event
|
|
728
|
+
emitter.emitSubagentDone(agentId, subagent_type, false, `Agent error: ${err.message || err}`, {
|
|
729
|
+
input: totalIn,
|
|
730
|
+
output: totalOut
|
|
731
|
+
}, state.toolsUsed, Date.now() - startTime);
|
|
732
|
+
return {
|
|
733
|
+
success: false,
|
|
734
|
+
output: `Agent error: ${err.message || err}`,
|
|
735
|
+
agentId,
|
|
736
|
+
tokensUsed: {
|
|
737
|
+
input: totalIn,
|
|
738
|
+
output: totalOut
|
|
739
|
+
},
|
|
740
|
+
toolsUsed: state.toolsUsed
|
|
741
|
+
};
|
|
742
|
+
}
|
|
589
743
|
}
|
|
744
|
+
|
|
590
745
|
// ============================================================================
|
|
591
746
|
// BACKGROUND AGENT EXECUTION
|
|
592
747
|
// ============================================================================
|
|
748
|
+
|
|
593
749
|
export async function runSubagentBackground(options) {
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
750
|
+
const agentId = options.resume || generateAgentId();
|
|
751
|
+
const outputFile = join(tmpdir(), `whale-agent-${agentId}.output`);
|
|
752
|
+
|
|
753
|
+
// Write initial status
|
|
754
|
+
writeFileSync(outputFile, `Agent ${agentId} started (${options.subagent_type})\n`, "utf-8");
|
|
755
|
+
|
|
756
|
+
// Import background process tracker (dynamic to avoid circular deps)
|
|
757
|
+
const bgModule = await import("./background-processes.js");
|
|
758
|
+
bgModule.registerBackgroundAgent(agentId, options.subagent_type, outputFile);
|
|
759
|
+
|
|
760
|
+
// Start agent in detached async — don't await
|
|
761
|
+
runSubagent({
|
|
762
|
+
...options,
|
|
763
|
+
resume: undefined
|
|
764
|
+
}).then(result => {
|
|
765
|
+
appendFileSync(outputFile, `\n---DONE---\n${JSON.stringify({
|
|
766
|
+
success: result.success,
|
|
767
|
+
agentId: result.agentId,
|
|
768
|
+
output: result.output
|
|
769
|
+
})}\n`, "utf-8");
|
|
770
|
+
import("./background-processes.js").then(m => m.markAgentDone(agentId, result.success));
|
|
771
|
+
}).catch(err => {
|
|
772
|
+
appendFileSync(outputFile, `\n---ERROR---\n${err.message}\n`, "utf-8");
|
|
773
|
+
import("./background-processes.js").then(m => m.markAgentDone(agentId, false));
|
|
774
|
+
});
|
|
775
|
+
return {
|
|
776
|
+
agentId,
|
|
777
|
+
outputFile
|
|
778
|
+
};
|
|
610
779
|
}
|
|
780
|
+
|
|
611
781
|
// ============================================================================
|
|
612
782
|
// TOOL DEFINITION — for integration with main agent loop
|
|
613
783
|
// ============================================================================
|
|
784
|
+
|
|
614
785
|
// Following Claude Code pattern: discrete, focused tasks with clear completion criteria
|
|
615
786
|
export const TASK_TOOL_DEFINITION = {
|
|
616
|
-
|
|
617
|
-
|
|
787
|
+
name: "task",
|
|
788
|
+
description: `Launch a subagent in isolated context. Subagents have full tool access and batch multiple tool calls per turn (glob + grep + read_file in parallel). Launch multiple task calls in one response for parallel execution.
|
|
618
789
|
|
|
619
790
|
Use for any work requiring 3+ tool calls or touching multiple parts of the codebase.
|
|
620
791
|
|
|
@@ -625,28 +796,29 @@ Agent types:
|
|
|
625
796
|
- research: Look up specific info (2-4 turns)
|
|
626
797
|
|
|
627
798
|
Each agent completes autonomously and returns results.`,
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
},
|
|
650
|
-
required: ["prompt", "subagent_type"],
|
|
799
|
+
input_schema: {
|
|
800
|
+
type: "object",
|
|
801
|
+
properties: {
|
|
802
|
+
prompt: {
|
|
803
|
+
type: "string",
|
|
804
|
+
description: "Specific task with clear completion criteria. Include: what to find/do, where to look, what to return."
|
|
805
|
+
},
|
|
806
|
+
subagent_type: {
|
|
807
|
+
type: "string",
|
|
808
|
+
enum: ["explore", "plan", "general-purpose", "research"],
|
|
809
|
+
description: "Agent type: explore=find, plan=design, general-purpose=do, research=lookup."
|
|
810
|
+
},
|
|
811
|
+
model: {
|
|
812
|
+
type: "string",
|
|
813
|
+
enum: ["sonnet", "haiku"],
|
|
814
|
+
description: "Optional model. haiku (default) for fast tasks, sonnet for complex reasoning."
|
|
815
|
+
},
|
|
816
|
+
resume: {
|
|
817
|
+
type: "string",
|
|
818
|
+
description: "Agent ID to resume (rarely needed)."
|
|
819
|
+
}
|
|
651
820
|
},
|
|
821
|
+
required: ["prompt", "subagent_type"]
|
|
822
|
+
}
|
|
652
823
|
};
|
|
824
|
+
//# sourceMappingURL=subagent.js.map
|