whale-code 6.5.10 → 6.6.0
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/dist/cli/chat/ChatApp.js +7 -11
- package/dist/cli/chat/ChatApp.js.map +1 -1
- package/dist/cli/chat/ChatInput.js +7 -3
- package/dist/cli/chat/ChatInput.js.map +1 -1
- package/dist/cli/chat/MessageList.js +5 -6
- package/dist/cli/chat/MessageList.js.map +1 -1
- package/dist/cli/chat/StatusBar.d.ts +2 -2
- package/dist/cli/chat/StatusBar.js +90 -160
- package/dist/cli/chat/StatusBar.js.map +1 -1
- package/dist/cli/chat/components/LiveArea.js +78 -115
- package/dist/cli/chat/components/LiveArea.js.map +1 -1
- package/dist/cli/chat/components/StaticMessages.js +60 -79
- package/dist/cli/chat/components/StaticMessages.js.map +1 -1
- package/dist/cli/chat/hooks/useAgentLoop.js +45 -37
- package/dist/cli/chat/hooks/useAgentLoop.js.map +1 -1
- package/dist/cli/chat/store.d.ts +12 -0
- package/dist/cli/chat/store.js +19 -0
- package/dist/cli/chat/store.js.map +1 -1
- package/dist/cli/commands/doctor.js +1 -6
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/services/agent-loop-tools.js +11 -2
- package/dist/cli/services/agent-loop-tools.js.map +1 -1
- package/dist/cli/services/agent-loop.js +1 -1
- package/dist/cli/services/agent-loop.js.map +1 -1
- package/dist/cli/services/cli-agent-loop.js +3 -2
- package/dist/cli/services/cli-agent-loop.js.map +1 -1
- package/dist/cli/services/config-store.d.ts +8 -10
- package/dist/cli/services/config-store.js +14 -13
- package/dist/cli/services/config-store.js.map +1 -1
- package/dist/cli/services/memory-manager.js +2 -2
- package/dist/cli/services/memory-manager.js.map +1 -1
- package/dist/cli/services/permission-modes.js +14 -10
- package/dist/cli/services/permission-modes.js.map +1 -1
- package/dist/cli/services/session-client.js +2 -1
- package/dist/cli/services/session-client.js.map +1 -1
- package/dist/cli/services/session-persistence.js +14 -6
- package/dist/cli/services/session-persistence.js.map +1 -1
- package/dist/cli/setup/SetupApp.d.ts +2 -2
- package/dist/cli/setup/SetupApp.js +91 -254
- package/dist/cli/setup/SetupApp.js.map +1 -1
- package/dist/cli/shared/SpinnerSlot.js +4 -1
- package/dist/cli/shared/SpinnerSlot.js.map +1 -1
- package/dist/cli/status/StatusApp.js +3 -3
- package/dist/cli/status/StatusApp.js.map +1 -1
- package/dist/index.js +13 -3
- package/dist/index.js.map +1 -1
- package/dist/server/handlers/browser-lifecycle.js +10 -0
- package/dist/server/handlers/browser-lifecycle.js.map +1 -1
- package/dist/server/handlers/browser.js +16 -1
- package/dist/server/handlers/browser.js.map +1 -1
- package/dist/server/handlers/campaigns.js +11 -0
- package/dist/server/handlers/campaigns.js.map +1 -1
- package/dist/server/handlers/catalog-products.js +19 -5
- package/dist/server/handlers/catalog-products.js.map +1 -1
- package/dist/server/handlers/catalog.js +42 -8
- package/dist/server/handlers/catalog.js.map +1 -1
- package/dist/server/handlers/clickhouse.js +4 -4
- package/dist/server/handlers/clickhouse.js.map +1 -1
- package/dist/server/handlers/comms-email.js +70 -8
- package/dist/server/handlers/comms-email.js.map +1 -1
- package/dist/server/handlers/comms.js +63 -21
- package/dist/server/handlers/comms.js.map +1 -1
- package/dist/server/handlers/coupons.js +141 -77
- package/dist/server/handlers/coupons.js.map +1 -1
- package/dist/server/handlers/google-ads.js +280 -8
- package/dist/server/handlers/google-ads.js.map +1 -1
- package/dist/server/handlers/remove-bg.d.ts +33 -0
- package/dist/server/handlers/remove-bg.js +698 -44
- package/dist/server/handlers/remove-bg.js.map +1 -1
- package/dist/server/handlers/supply-chain.js +93 -1
- package/dist/server/handlers/supply-chain.js.map +1 -1
- package/dist/server/handlers/workflow-steps-types.d.ts +1 -1
- package/dist/server/handlers/workflow-steps-types.js +7 -1
- package/dist/server/handlers/workflow-steps-types.js.map +1 -1
- package/dist/server/handlers/workflow-steps.js +1 -1
- package/dist/server/handlers/workflow-steps.js.map +1 -1
- package/dist/server/index.js +122 -29
- package/dist/server/index.js.map +1 -1
- package/dist/server/lib/agent-loop-turn.js +33 -3
- package/dist/server/lib/agent-loop-turn.js.map +1 -1
- package/dist/server/lib/agent-loop-types.d.ts +6 -2
- package/dist/server/lib/agent-loop-types.js +14 -2
- package/dist/server/lib/agent-loop-types.js.map +1 -1
- package/dist/server/lib/clickhouse-client.js +4 -2
- package/dist/server/lib/clickhouse-client.js.map +1 -1
- package/dist/server/lib/code-worker.js +4 -1
- package/dist/server/lib/code-worker.js.map +1 -1
- package/dist/server/providers/anthropic.js +103 -33
- package/dist/server/providers/anthropic.js.map +1 -1
- package/dist/server/server-chat.js +2 -2
- package/dist/server/server-chat.js.map +1 -1
- package/dist/server/server-helpers.d.ts +8 -1
- package/dist/server/server-helpers.js +17 -3
- package/dist/server/server-helpers.js.map +1 -1
- package/dist/server/server-persist.js +34 -21
- package/dist/server/server-persist.js.map +1 -1
- package/dist/server/server-rate-limit.d.ts +0 -1
- package/dist/server/server-rate-limit.js +5 -5
- package/dist/server/server-rate-limit.js.map +1 -1
- package/dist/server/server-routes-approvals.js +2 -2
- package/dist/server/server-routes-approvals.js.map +1 -1
- package/dist/server/server-routes-auth.js +2 -2
- package/dist/server/server-routes-auth.js.map +1 -1
- package/dist/server/server-routes-events.js +2 -2
- package/dist/server/server-routes-events.js.map +1 -1
- package/dist/server/server-routes-public.js +4 -4
- package/dist/server/server-routes-public.js.map +1 -1
- package/dist/server/server-routes-webchat.js +3 -3
- package/dist/server/server-routes-webchat.js.map +1 -1
- package/dist/server/server-store-circuit-breaker.js +1 -1
- package/dist/server/server-store-circuit-breaker.js.map +1 -1
- package/dist/server/tool-router.js +7 -4
- package/dist/server/tool-router.js.map +1 -1
- package/dist/server/validation.js +11 -0
- package/dist/server/validation.js.map +1 -1
- package/dist/setup.js +5 -25
- package/dist/setup.js.map +1 -1
- package/dist/shared/api-client.js +38 -11
- package/dist/shared/api-client.js.map +1 -1
- package/package.json +12 -10
- package/vendor/ink/build/ink.js +68 -24
- package/vendor/ink/node_modules/react-devtools-core/README.md +152 -0
- package/vendor/ink/node_modules/react-devtools-core/backend.js +1 -0
- package/vendor/ink/node_modules/react-devtools-core/dist/648.chunk.js +2 -0
- package/vendor/ink/node_modules/react-devtools-core/dist/648.chunk.js.map +1 -0
- package/vendor/ink/node_modules/react-devtools-core/dist/backend.js +15691 -0
- package/vendor/ink/node_modules/react-devtools-core/dist/backend.js.map +1 -0
- package/vendor/ink/node_modules/react-devtools-core/dist/importFile.worker.worker.js +2 -0
- package/vendor/ink/node_modules/react-devtools-core/dist/importFile.worker.worker.js.map +1 -0
- package/vendor/ink/node_modules/react-devtools-core/dist/parseSourceAndMetadata.worker.worker.js +14 -0
- package/vendor/ink/node_modules/react-devtools-core/dist/parseSourceAndMetadata.worker.worker.js.map +1 -0
- package/vendor/ink/node_modules/react-devtools-core/dist/standalone.js +2 -0
- package/vendor/ink/node_modules/react-devtools-core/dist/standalone.js.map +1 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/LICENSE +21 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/README.md +495 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/browser.js +8 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/index.js +10 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/buffer-util.js +129 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/constants.js +10 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/event-target.js +184 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/extension.js +223 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/limiter.js +55 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/permessage-deflate.js +518 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/receiver.js +607 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/sender.js +409 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/stream.js +180 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/validation.js +104 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/websocket-server.js +449 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/websocket.js +1197 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/package.json +56 -0
- package/vendor/ink/node_modules/react-devtools-core/package.json +38 -0
- package/vendor/ink/node_modules/react-devtools-core/standalone.js +1 -0
- package/dist/cli/__tests__/print-mode-streaming.test.js +0 -270
- package/dist/cli/__tests__/print-mode.basic-output.test.js +0 -230
- package/dist/cli/__tests__/print-mode.session-errors.test.js +0 -252
- package/dist/cli/__tests__/print-mode.test.js +0 -273
- package/dist/cli/__tests__/serve-mode-messages.test.js +0 -338
- package/dist/cli/__tests__/serve-mode.messages.part2.test.js +0 -266
- package/dist/cli/__tests__/serve-mode.messages.test.js +0 -277
- package/dist/cli/__tests__/serve-mode.startup-http.test.js +0 -279
- package/dist/cli/__tests__/serve-mode.test.js +0 -345
- package/dist/cli/chat/NodeManager.d.ts +0 -30
- package/dist/cli/chat/NodeManager.js +0 -66
- package/dist/cli/chat/NodeManager.js.map +0 -1
- package/dist/cli/chat/chat-input-menu-handler.d.ts +0 -32
- package/dist/cli/chat/hooks/slash-imsg-handlers.js +0 -148
- package/dist/cli/chat/hooks/slash-imsg-handlers.js.map +0 -1
- package/dist/cli/chat/hooks/useStreamingReducer.d.ts +0 -66
- package/dist/cli/commands/__tests__/config-cmd.test.js +0 -270
- package/dist/cli/commands/__tests__/doctor.test.js +0 -257
- package/dist/cli/commands/__tests__/imsg-node-bridge.test.js +0 -99
- package/dist/cli/commands/__tests__/imsg-utils.test.js +0 -73
- package/dist/cli/commands/__tests__/init.test.js +0 -214
- package/dist/cli/commands/__tests__/mcp.test.js +0 -287
- package/dist/cli/commands/imsg-watcher-helpers.d.ts +0 -40
- package/dist/cli/commands/imsg-watcher-helpers.js +0 -184
- package/dist/cli/commands/imsg-watcher-helpers.js.map +0 -1
- package/dist/cli/commands/imsg-watcher.d.ts +0 -11
- package/dist/cli/commands/imsg-watcher.js +0 -230
- package/dist/cli/commands/imsg-watcher.js.map +0 -1
- package/dist/cli/services/__tests__/agent-definitions.test.js +0 -153
- package/dist/cli/services/__tests__/agent-events-global.test.js +0 -39
- package/dist/cli/services/__tests__/agent-events.part2.test.js +0 -113
- package/dist/cli/services/__tests__/agent-events.test.js +0 -157
- package/dist/cli/services/__tests__/agent-loop-auth.test.js +0 -392
- package/dist/cli/services/__tests__/agent-loop-budget.test.js +0 -389
- package/dist/cli/services/__tests__/agent-loop-tools-lifecycle.test.js +0 -430
- package/dist/cli/services/__tests__/agent-loop-tools-maxturns.test.js +0 -486
- package/dist/cli/services/__tests__/agent-loop-utils-execution.test.js +0 -528
- package/dist/cli/services/__tests__/agent-loop-utils-helpers.test.js +0 -466
- package/dist/cli/services/__tests__/agent-worker-base-execute.test.js +0 -257
- package/dist/cli/services/__tests__/agent-worker-base-helpers.test.js +0 -198
- package/dist/cli/services/__tests__/agent-worker-base.test.js +0 -278
- package/dist/cli/services/__tests__/auth-service-exports.test.js +0 -41
- package/dist/cli/services/__tests__/auth-service.part2.test.js +0 -169
- package/dist/cli/services/__tests__/auth-service.test.js +0 -242
- package/dist/cli/services/__tests__/background-processes.test.js +0 -282
- package/dist/cli/services/__tests__/claude-md-loader.test.js +0 -134
- package/dist/cli/services/__tests__/config-store.test.js +0 -247
- package/dist/cli/services/__tests__/debug-log.test.js +0 -199
- package/dist/cli/services/__tests__/edge-cases-caching.test.js +0 -174
- package/dist/cli/services/__tests__/edge-cases-compaction-core.test.js +0 -226
- package/dist/cli/services/__tests__/edge-cases-compaction-openai.test.js +0 -152
- package/dist/cli/services/__tests__/edge-cases-compaction-shapes.test.js +0 -53
- package/dist/cli/services/__tests__/edge-cases-compaction-thinking.test.js +0 -226
- package/dist/cli/services/__tests__/edge-cases-compaction.test.js +0 -131
- package/dist/cli/services/__tests__/edge-cases-paths.test.js +0 -86
- package/dist/cli/services/__tests__/error-logger-messages.test.js +0 -81
- package/dist/cli/services/__tests__/error-logger-transport.test.js +0 -119
- package/dist/cli/services/__tests__/error-logger.test.js +0 -264
- package/dist/cli/services/__tests__/file-history.test.js +0 -136
- package/dist/cli/services/__tests__/git-context-cache-reset.test.js +0 -223
- package/dist/cli/services/__tests__/git-context.test.js +0 -241
- package/dist/cli/services/__tests__/interactive-tools-execute.test.js +0 -166
- package/dist/cli/services/__tests__/interactive-tools-plan.test.js +0 -197
- package/dist/cli/services/__tests__/interactive-tools.part2.test.js +0 -168
- package/dist/cli/services/__tests__/interactive-tools.test.js +0 -179
- package/dist/cli/services/__tests__/keybinding-manager.test.js +0 -205
- package/dist/cli/services/__tests__/local-tools-dispatch.test.js +0 -404
- package/dist/cli/services/__tests__/local-tools.test.js +0 -238
- package/dist/cli/services/__tests__/lsp-manager.test.js +0 -364
- package/dist/cli/services/__tests__/mcp-client-connect-disconnect.test.js +0 -310
- package/dist/cli/services/__tests__/mcp-client.test.js +0 -93
- package/dist/cli/services/__tests__/memory-manager.test.js +0 -154
- package/dist/cli/services/__tests__/model-manager-utils.test.js +0 -154
- package/dist/cli/services/__tests__/model-manager.test.js +0 -175
- package/dist/cli/services/__tests__/permission-modes.test.js +0 -222
- package/dist/cli/services/__tests__/ripgrep.test.js +0 -328
- package/dist/cli/services/__tests__/server-tools-execute.test.js +0 -317
- package/dist/cli/services/__tests__/server-tools.test.js +0 -272
- package/dist/cli/services/__tests__/session-persistence.test.js +0 -245
- package/dist/cli/services/__tests__/subagent-basic.test.js +0 -489
- package/dist/cli/services/__tests__/subagent-edge.test.js +0 -545
- package/dist/cli/services/__tests__/subagent-prompts.test.js +0 -558
- package/dist/cli/services/__tests__/subagent-worker-errors.test.js +0 -255
- package/dist/cli/services/__tests__/subagent-worker.test.js +0 -242
- package/dist/cli/services/__tests__/system-prompt.test.js +0 -210
- package/dist/cli/services/__tests__/team-lead-comms-messaging.test.js +0 -250
- package/dist/cli/services/__tests__/team-lead-comms-result.test.js +0 -232
- package/dist/cli/services/__tests__/team-lead-comms-stop.test.js +0 -344
- package/dist/cli/services/__tests__/team-lead-comms.test.js +0 -285
- package/dist/cli/services/__tests__/team-lead-create.test.js +0 -327
- package/dist/cli/services/__tests__/team-lead-run.test.js +0 -318
- package/dist/cli/services/__tests__/team-lead-stop.test.js +0 -199
- package/dist/cli/services/__tests__/team-state-comms.test.js +0 -240
- package/dist/cli/services/__tests__/team-state-core.test.js +0 -230
- package/dist/cli/services/__tests__/team-state-tasks-complete-fail-available.test.js +0 -224
- package/dist/cli/services/__tests__/team-state-tasks.test.js +0 -184
- package/dist/cli/services/__tests__/telemetry-ai-metadata.test.js +0 -116
- package/dist/cli/services/__tests__/telemetry.part2.test.js +0 -195
- package/dist/cli/services/__tests__/telemetry.test.js +0 -176
- package/dist/cli/services/agent-loop-iteration.d.ts +0 -13
- package/dist/cli/services/agent-loop-setup.d.ts +0 -32
- package/dist/cli/services/agent-worker-base-api.d.ts +0 -19
- package/dist/cli/services/agent-worker-base-helpers.d.ts +0 -27
- package/dist/cli/services/agent-worker-base-tools.d.ts +0 -16
- package/dist/cli/services/agent-worker-base-types.d.ts +0 -81
- package/dist/cli/services/background-agents.d.ts +0 -26
- package/dist/cli/services/background-processes-ops.d.ts +0 -24
- package/dist/cli/services/background-tool-defs.d.ts +0 -50
- package/dist/cli/services/config-modules-model.test.js +0 -133
- package/dist/cli/services/config-modules-permission.test.js +0 -85
- package/dist/cli/services/config-modules-permissions.test.js +0 -85
- package/dist/cli/services/config-modules-session.test.js +0 -297
- package/dist/cli/services/format-server-response-columns.test.js +0 -265
- package/dist/cli/services/format-server-response-fallback.test.js +0 -65
- package/dist/cli/services/format-server-response-primitives-basic.test.js +0 -261
- package/dist/cli/services/format-server-response-primitives-nested.test.js +0 -188
- package/dist/cli/services/format-server-response-primitives.test.js +0 -300
- package/dist/cli/services/format-server-response-realworld.test.js +0 -248
- package/dist/cli/services/format-server-response-values.test.js +0 -247
- package/dist/cli/services/hooks-runners.test.js +0 -184
- package/dist/cli/services/hooks.glob-load.test.js +0 -233
- package/dist/cli/services/hooks.run-hooks.test.js +0 -184
- package/dist/cli/services/hooks.test.js +0 -233
- package/dist/cli/services/ink-incremental.d.ts +0 -19
- package/dist/cli/services/ink-incremental.js +0 -59
- package/dist/cli/services/ink-incremental.js.map +0 -1
- package/dist/cli/services/ink-resize-fix.d.ts +0 -18
- package/dist/cli/services/ink-resize-fix.js +0 -76
- package/dist/cli/services/ink-resize-fix.js.map +0 -1
- package/dist/cli/services/ink-sync-output.d.ts +0 -12
- package/dist/cli/services/ink-sync-output.js +0 -16
- package/dist/cli/services/ink-sync-output.js.map +0 -1
- package/dist/cli/services/interactive-tool-defs.d.ts +0 -80
- package/dist/cli/services/local-tools-definitions.d.ts +0 -6
- package/dist/cli/services/local-tools-files.test.js +0 -256
- package/dist/cli/services/local-tools-read-many.d.ts +0 -6
- package/dist/cli/services/model-router.test.js +0 -245
- package/dist/cli/services/rewind-rewindTo.test.js +0 -202
- package/dist/cli/services/rewind.test.js +0 -175
- package/dist/cli/services/sandbox.test.js +0 -198
- package/dist/cli/services/subagent-execution.d.ts +0 -12
- package/dist/cli/services/team-lead-auto.d.ts +0 -11
- package/dist/cli/services/team-lead-execution.d.ts +0 -28
- package/dist/cli/services/teammate-loop.js +0 -557
- package/dist/cli/services/teammate-loop.js.map +0 -1
- package/dist/cli/services/tools/__tests__/agent-tools-tasks-teams.test.js +0 -250
- package/dist/cli/services/tools/__tests__/agent-tools-teams.test.js +0 -200
- package/dist/cli/services/tools/__tests__/agent-tools.test.js +0 -340
- package/dist/cli/services/tools/__tests__/file-ops-cache.test.js +0 -152
- package/dist/cli/services/tools/__tests__/file-ops-notebook.test.js +0 -249
- package/dist/cli/services/tools/__tests__/file-ops-read.test.js +0 -261
- package/dist/cli/services/tools/__tests__/file-ops-write.test.js +0 -292
- package/dist/cli/services/tools/__tests__/search-tools-rg.test.js +0 -92
- package/dist/cli/services/tools/__tests__/search-tools.part2.test.js +0 -174
- package/dist/cli/services/tools/__tests__/search-tools.test.js +0 -227
- package/dist/cli/services/tools/__tests__/shell-exec-allowed-core.test.js +0 -163
- package/dist/cli/services/tools/__tests__/shell-exec-allowed-extended.test.js +0 -220
- package/dist/cli/services/tools/__tests__/shell-exec-allowed.part2.test.js +0 -215
- package/dist/cli/services/tools/__tests__/shell-exec-allowed.test.js +0 -154
- package/dist/cli/services/tools/__tests__/shell-exec-blocked.test.js +0 -132
- package/dist/cli/services/tools/__tests__/shell-exec-execution.test.js +0 -245
- package/dist/cli/services/tools/__tests__/task-manager-create.test.js +0 -110
- package/dist/cli/services/tools/__tests__/task-manager-crud.test.js +0 -339
- package/dist/cli/services/tools/__tests__/task-manager-list-get.test.js +0 -343
- package/dist/cli/services/tools/__tests__/task-manager-query.test.js +0 -346
- package/dist/cli/services/tools/__tests__/task-manager-routing.test.js +0 -58
- package/dist/cli/services/tools/__tests__/task-manager-update.test.js +0 -224
- package/dist/cli/services/tools/__tests__/task-manager.test.js +0 -159
- package/dist/cli/services/tools/__tests__/web-tools-html-search.test.js +0 -227
- package/dist/cli/services/tools/__tests__/web-tools.test.js +0 -285
- package/dist/cli/services/tools/shell-exec.test.js +0 -148
- package/dist/cli/shared/SharedTick.d.ts +0 -10
- package/dist/cli/shared/__tests__/markdown.test.js +0 -188
- package/dist/local-agent/__tests__/connection-disconnect.test.js +0 -201
- package/dist/local-agent/__tests__/connection-lifecycle.test.js +0 -289
- package/dist/local-agent/__tests__/connection-msghandling.test.js +0 -311
- package/dist/local-agent/__tests__/connection-reconnect.test.js +0 -230
- package/dist/local-agent/__tests__/connection-toolexec.test.js +0 -253
- package/dist/local-agent/__tests__/discovery.test.js +0 -328
- package/dist/local-agent/__tests__/executor-background.test.js +0 -219
- package/dist/local-agent/__tests__/executor-exec.test.js +0 -221
- package/dist/local-agent/__tests__/executor-jobs-sessions.test.js +0 -220
- package/dist/local-agent/__tests__/executor-system-info.test.js +0 -133
- package/dist/local-agent/__tests__/executor-systeminfo.test.js +0 -109
- package/dist/local-agent/__tests__/executor.test.js +0 -235
- package/dist/local-agent/__tests__/index.test.js +0 -139
- package/dist/node/__tests__/cli-channels.test.js +0 -293
- package/dist/node/__tests__/cli-config-edge.test.js +0 -154
- package/dist/node/__tests__/cli-config.test.js +0 -215
- package/dist/node/__tests__/config.test.js +0 -292
- package/dist/node/__tests__/runtime-heartbeat.test.js +0 -153
- package/dist/node/__tests__/runtime-lifecycle-init.test.js +0 -263
- package/dist/node/__tests__/runtime-lifecycle-stats.test.js +0 -180
- package/dist/node/__tests__/runtime-lifecycle.test.js +0 -305
- package/dist/node/__tests__/runtime-relay.test.js +0 -341
- package/dist/node/adapters/__tests__/base.test.js +0 -286
- package/dist/node/adapters/__tests__/discord.test.js +0 -284
- package/dist/node/adapters/__tests__/email-send.test.js +0 -295
- package/dist/node/adapters/__tests__/email.inbound-send.test.js +0 -217
- package/dist/node/adapters/__tests__/email.lifecycle.test.js +0 -211
- package/dist/node/adapters/__tests__/email.test.js +0 -290
- package/dist/node/adapters/__tests__/email.webhook-send.test.js +0 -251
- package/dist/node/adapters/__tests__/imessage-filter.test.js +0 -183
- package/dist/node/adapters/__tests__/imessage-lifecycle.test.js +0 -215
- package/dist/node/adapters/__tests__/imessage-send-restart.test.js +0 -227
- package/dist/node/adapters/__tests__/slack.part2.test.js +0 -135
- package/dist/node/adapters/__tests__/slack.test.js +0 -241
- package/dist/node/adapters/__tests__/sms-extras.test.js +0 -108
- package/dist/node/adapters/__tests__/sms-lifecycle.test.js +0 -203
- package/dist/node/adapters/__tests__/sms-messaging.test.js +0 -266
- package/dist/node/adapters/__tests__/sms.part2.test.js +0 -174
- package/dist/node/adapters/__tests__/sms.test.js +0 -253
- package/dist/node/adapters/__tests__/telegram-polling.test.js +0 -256
- package/dist/node/adapters/__tests__/telegram-send.test.js +0 -166
- package/dist/node/adapters/__tests__/webchat-inbound.test.js +0 -188
- package/dist/node/adapters/__tests__/webchat-outbound.test.js +0 -178
- package/dist/node/adapters/__tests__/whatsapp-inbound.test.js +0 -200
- package/dist/node/adapters/__tests__/whatsapp-send.test.js +0 -212
- package/dist/node/adapters/__tests__/whatsapp.test.js +0 -280
- package/dist/server/__tests__/gateway-fast-fail.test.js +0 -160
- package/dist/server/__tests__/local-agent-gateway.test.js +0 -186
- package/dist/server/__tests__/proxy-handlers-delegation.test.js +0 -240
- package/dist/server/__tests__/proxy-handlers-validation.test.js +0 -211
- package/dist/server/__tests__/proxy-handlers.part2.test.js +0 -240
- package/dist/server/__tests__/proxy-handlers.test.js +0 -213
- package/dist/server/__tests__/strip-base64-e2e.test.js +0 -303
- package/dist/server/__tests__/strip-base64.test.js +0 -256
- package/dist/server/__tests__/tool-router-agent-tools.test.js +0 -324
- package/dist/server/__tests__/tool-router-execute-core.test.js +0 -357
- package/dist/server/__tests__/tool-router-execute-permissions.test.js +0 -332
- package/dist/server/__tests__/tool-router-execute.test.js +0 -348
- package/dist/server/__tests__/tool-router-load.test.js +0 -432
- package/dist/server/__tests__/tool-router-permissions.test.js +0 -359
- package/dist/server/__tests__/tool-router-registry-cache.test.js +0 -383
- package/dist/server/__tests__/tool-router-registry-handlers.test.js +0 -272
- package/dist/server/__tests__/tool-router-registry.test.js +0 -331
- package/dist/server/__tests__/validation-inventory.test.js +0 -250
- package/dist/server/__tests__/validation-misc.test.js +0 -243
- package/dist/server/__tests__/validation-supply-chain.test.js +0 -188
- package/dist/server/__tests__/worker.test.js +0 -265
- package/dist/server/handlers/__tests__/conversation-lock.test.js +0 -117
- package/dist/server/handlers/__tests__/e2e/auth-cross-platform-login.e2e.test.js +0 -268
- package/dist/server/handlers/__tests__/e2e/auth-cross-platform-tokens.e2e.test.js +0 -264
- package/dist/server/handlers/__tests__/e2e/email-pipeline-send.e2e.test.js +0 -214
- package/dist/server/handlers/__tests__/e2e/email-pipeline-threads.e2e.test.js +0 -168
- package/dist/server/handlers/__tests__/e2e/error-logging-pipeline-dedup.e2e.test.js +0 -229
- package/dist/server/handlers/__tests__/e2e/error-logging-pipeline.e2e.test.js +0 -239
- package/dist/server/handlers/__tests__/e2e/error-logging-rate-limit.e2e.test.js +0 -150
- package/dist/server/handlers/__tests__/e2e/inventory-sync-guards.e2e.test.js +0 -177
- package/dist/server/handlers/__tests__/e2e/inventory-sync.e2e.test.js +0 -228
- package/dist/server/handlers/__tests__/e2e/inventory-sync.part2.e2e.test.js +0 -188
- package/dist/server/handlers/__tests__/e2e/order-lifecycle-fulfillment.e2e.test.js +0 -295
- package/dist/server/handlers/__tests__/e2e/order-lifecycle.e2e.test.js +0 -277
- package/dist/server/handlers/__tests__/e2e/order-lifecycle.fulfillment.e2e.test.js +0 -307
- package/dist/server/handlers/__tests__/e2e/order-lifecycle.setup.e2e.test.js +0 -177
- package/dist/server/handlers/__tests__/e2e/storefront-checkout-cart.e2e.test.js +0 -255
- package/dist/server/handlers/__tests__/e2e/storefront-checkout-webhook.e2e.test.js +0 -231
- package/dist/server/handlers/__tests__/e2e/workflow-execution-failures.e2e.test.js +0 -235
- package/dist/server/handlers/__tests__/e2e/workflow-execution.e2e.test.js +0 -294
- package/dist/server/handlers/__tests__/e2e/workflow-security.e2e.test.js +0 -311
- package/dist/server/handlers/__tests__/e2e/workflow-security.part2.e2e.test.js +0 -267
- package/dist/server/handlers/__tests__/workflow-cache.test.js +0 -237
- package/dist/server/handlers/analytics-errors-edge.test.js +0 -173
- package/dist/server/handlers/analytics.test.js +0 -280
- package/dist/server/handlers/api-docs-examples-ext.d.ts +0 -9
- package/dist/server/handlers/api-docs-examples-ext.js +0 -278
- package/dist/server/handlers/api-docs-examples-ext.js.map +0 -1
- package/dist/server/handlers/api-docs-examples.d.ts +0 -8
- package/dist/server/handlers/api-docs-examples.js +0 -221
- package/dist/server/handlers/api-docs-examples.js.map +0 -1
- package/dist/server/handlers/api-docs-sections-ext.d.ts +0 -2
- package/dist/server/handlers/api-docs-sections-ext.js +0 -497
- package/dist/server/handlers/api-docs-sections-ext.js.map +0 -1
- package/dist/server/handlers/api-docs-sections.d.ts +0 -21
- package/dist/server/handlers/api-docs-sections.js +0 -293
- package/dist/server/handlers/api-docs-sections.js.map +0 -1
- package/dist/server/handlers/api-keys.part2.test.js +0 -157
- package/dist/server/handlers/api-keys.test.js +0 -161
- package/dist/server/handlers/billing-routes.test.js +0 -123
- package/dist/server/handlers/billing.test.js +0 -215
- package/dist/server/handlers/browser-actions-errors.test.js +0 -94
- package/dist/server/handlers/browser-actions.part2.test.js +0 -190
- package/dist/server/handlers/browser-actions.test.js +0 -190
- package/dist/server/handlers/browser-validation.test.js +0 -257
- package/dist/server/handlers/catalog.test.js +0 -297
- package/dist/server/handlers/comms.test.js +0 -289
- package/dist/server/handlers/creations-advanced-collections.test.js +0 -214
- package/dist/server/handlers/creations-advanced-generate.test.js +0 -142
- package/dist/server/handlers/creations-advanced.test.js +0 -171
- package/dist/server/handlers/creations-collections-preview.test.js +0 -214
- package/dist/server/handlers/creations-crud.test.js +0 -260
- package/dist/server/handlers/creations-mutations.test.js +0 -197
- package/dist/server/handlers/crm.test.js +0 -179
- package/dist/server/handlers/discovery-advertise.test.js +0 -185
- package/dist/server/handlers/discovery-scan.test.js +0 -233
- package/dist/server/handlers/embeddings-embed-search.test.js +0 -196
- package/dist/server/handlers/embeddings-index-delete-stats.test.js +0 -140
- package/dist/server/handlers/embeddings-search.test.js +0 -221
- package/dist/server/handlers/embeddings.test.js +0 -137
- package/dist/server/handlers/enrichment-breach.d.ts +0 -8
- package/dist/server/handlers/enrichment-breach.js +0 -266
- package/dist/server/handlers/enrichment-breach.js.map +0 -1
- package/dist/server/handlers/enrichment-data.d.ts +0 -13
- package/dist/server/handlers/enrichment-data.js +0 -145
- package/dist/server/handlers/enrichment-data.js.map +0 -1
- package/dist/server/handlers/enrichment-mutations.test.js +0 -240
- package/dist/server/handlers/enrichment-queries.test.js +0 -181
- package/dist/server/handlers/enrichment-validation.test.js +0 -177
- package/dist/server/handlers/enrichment-writes.d.ts +0 -16
- package/dist/server/handlers/enrichment-writes.js +0 -226
- package/dist/server/handlers/enrichment-writes.js.map +0 -1
- package/dist/server/handlers/image-gen.test.js +0 -205
- package/dist/server/handlers/inventory.test.js +0 -380
- package/dist/server/handlers/kali-background.test.js +0 -222
- package/dist/server/handlers/kali-errors.test.js +0 -92
- package/dist/server/handlers/kali-validation.test.js +0 -234
- package/dist/server/handlers/llm-providers-actions.test.js +0 -220
- package/dist/server/handlers/llm-providers-anthropic.test.js +0 -239
- package/dist/server/handlers/llm-providers-failover.test.js +0 -232
- package/dist/server/handlers/llm-providers-providers.test.js +0 -300
- package/dist/server/handlers/llm-providers-validation.test.js +0 -239
- package/dist/server/handlers/local-agent-tools.test.js +0 -224
- package/dist/server/handlers/local-agent.test.js +0 -198
- package/dist/server/handlers/local-agent.tools-status.test.js +0 -204
- package/dist/server/handlers/local-agent.validation-exec.test.js +0 -182
- package/dist/server/handlers/meta-ads-audience-rules.test.js +0 -243
- package/dist/server/handlers/meta-ads-audience-targeting.test.js +0 -205
- package/dist/server/handlers/meta-ads-audiences-targeting.test.js +0 -383
- package/dist/server/handlers/meta-ads-crud-ads.test.js +0 -136
- package/dist/server/handlers/meta-ads-crud-campaigns.test.js +0 -189
- package/dist/server/handlers/meta-ads-crud-create.test.js +0 -303
- package/dist/server/handlers/meta-ads-crud-list-update.test.js +0 -259
- package/dist/server/handlers/meta-ads-delete-publish-sync.test.js +0 -282
- package/dist/server/handlers/meta-ads-insights.test.js +0 -80
- package/dist/server/handlers/meta-ads-list-get.test.js +0 -237
- package/dist/server/handlers/meta-ads-publish-delete.test.js +0 -254
- package/dist/server/handlers/meta-ads-publish-helpers.js +0 -117
- package/dist/server/handlers/meta-ads-publish-helpers.js.map +0 -1
- package/dist/server/handlers/meta-ads-publish-sync.test.js +0 -205
- package/dist/server/handlers/meta-ads-publish.test.js +0 -254
- package/dist/server/handlers/meta-ads-sync-insights.test.js +0 -184
- package/dist/server/handlers/meta-ads-update.test.js +0 -117
- package/dist/server/handlers/nodes-channels.test.js +0 -413
- package/dist/server/handlers/nodes-events.test.js +0 -131
- package/dist/server/handlers/nodes-list-delete.test.js +0 -171
- package/dist/server/handlers/nodes-messages-delivery.test.js +0 -208
- package/dist/server/handlers/nodes-messages.test.js +0 -211
- package/dist/server/handlers/nodes-register.test.js +0 -277
- package/dist/server/handlers/nodes.test.js +0 -353
- package/dist/server/handlers/operations.test.js +0 -136
- package/dist/server/handlers/platform-telemetry.test.js +0 -200
- package/dist/server/handlers/platform-websearch.test.js +0 -160
- package/dist/server/handlers/storefront.test.js +0 -329
- package/dist/server/handlers/supply-chain.test.js +0 -347
- package/dist/server/handlers/transcription.test.js +0 -118
- package/dist/server/handlers/video-gen-veo.js +0 -114
- package/dist/server/handlers/video-gen-veo.js.map +0 -1
- package/dist/server/handlers/video-gen.test.js +0 -146
- package/dist/server/handlers/voice.test.js +0 -153
- package/dist/server/handlers/workflow-steps.test.js +0 -330
- package/dist/server/handlers/workflows-extras.test.js +0 -65
- package/dist/server/handlers/workflows.part2.test.js +0 -170
- package/dist/server/handlers/workflows.test.js +0 -281
- package/dist/server/lib/__tests__/batch-client-conversion-jsonl.test.js +0 -171
- package/dist/server/lib/__tests__/batch-client-polling.test.js +0 -292
- package/dist/server/lib/__tests__/batch-client-queue.test.js +0 -270
- package/dist/server/lib/__tests__/clickhouse-buffer.test.js +0 -236
- package/dist/server/lib/__tests__/code-worker-edge-cases.test.js +0 -118
- package/dist/server/lib/__tests__/code-worker-pool-execute.test.js +0 -193
- package/dist/server/lib/__tests__/code-worker-pool-execution.test.js +0 -165
- package/dist/server/lib/__tests__/code-worker-pool-init.test.js +0 -131
- package/dist/server/lib/__tests__/code-worker-pool.test.js +0 -194
- package/dist/server/lib/__tests__/code-worker-sandbox-ops.test.js +0 -123
- package/dist/server/lib/__tests__/code-worker-sandbox.test.js +0 -217
- package/dist/server/lib/__tests__/code-worker.test.js +0 -179
- package/dist/server/lib/__tests__/compaction-service-generate.test.js +0 -229
- package/dist/server/lib/__tests__/compaction-service.test.js +0 -319
- package/dist/server/lib/__tests__/otel.test.js +0 -146
- package/dist/server/lib/__tests__/prompt-sanitizer-validation.test.js +0 -165
- package/dist/server/lib/__tests__/prompt-sanitizer.sanitize.test.js +0 -343
- package/dist/server/lib/__tests__/prompt-sanitizer.test.js +0 -328
- package/dist/server/lib/__tests__/prompt-sanitizer.validate-tool.test.js +0 -145
- package/dist/server/lib/__tests__/provider-capabilities.test.js +0 -263
- package/dist/server/lib/__tests__/provider-failover-routing.test.js +0 -145
- package/dist/server/lib/__tests__/provider-failover-state.test.js +0 -131
- package/dist/server/lib/__tests__/rate-limiter-budgets.test.js +0 -216
- package/dist/server/lib/__tests__/rate-limiter.budgets-tools.test.js +0 -113
- package/dist/server/lib/__tests__/rate-limiter.check-request.test.js +0 -141
- package/dist/server/lib/__tests__/rate-limiter.stats-lifecycle.test.js +0 -135
- package/dist/server/lib/__tests__/rate-limiter.test.js +0 -207
- package/dist/server/lib/__tests__/server-agent-loop-abort-conditions.test.js +0 -544
- package/dist/server/lib/__tests__/server-agent-loop-abort.part2.test.js +0 -504
- package/dist/server/lib/__tests__/server-agent-loop-abort.test.js +0 -396
- package/dist/server/lib/__tests__/server-agent-loop-compaction.test.js +0 -397
- package/dist/server/lib/__tests__/server-agent-loop-failover.test.js +0 -356
- package/dist/server/lib/__tests__/server-agent-loop-features-caching.test.js +0 -519
- package/dist/server/lib/__tests__/server-agent-loop-features-edges.test.js +0 -512
- package/dist/server/lib/__tests__/server-subagent-bailout.test.js +0 -194
- package/dist/server/lib/__tests__/server-subagent-basics.test.js +0 -348
- package/dist/server/lib/__tests__/server-subagent-errors-abort.test.js +0 -319
- package/dist/server/lib/__tests__/server-subagent-errors-progress.test.js +0 -253
- package/dist/server/lib/__tests__/server-subagent-errors.part2.test.js +0 -253
- package/dist/server/lib/__tests__/server-subagent-errors.test.js +0 -319
- package/dist/server/lib/__tests__/session-checkpoint-load.test.js +0 -275
- package/dist/server/lib/__tests__/session-checkpoint-save.test.js +0 -159
- package/dist/server/lib/__tests__/ssrf-guard.test.js +0 -93
- package/dist/server/lib/__tests__/supabase-client.test.js +0 -111
- package/dist/server/lib/__tests__/template-resolver.test.js +0 -317
- package/dist/server/lib/__tests__/utils-timeout.test.js +0 -49
- package/dist/server/lib/__tests__/utils.test.js +0 -322
- package/dist/server/providers/__tests__/anthropic-adapter.test.js +0 -228
- package/dist/server/providers/__tests__/anthropic-betas-toolchoice.test.js +0 -257
- package/dist/server/providers/__tests__/anthropic-errors.test.js +0 -262
- package/dist/server/providers/__tests__/anthropic-stream-core.test.js +0 -275
- package/dist/server/providers/__tests__/anthropic-streaming-betas.test.js +0 -247
- package/dist/server/providers/__tests__/anthropic-streaming-core.test.js +0 -275
- package/dist/server/providers/__tests__/bedrock-config.test.js +0 -177
- package/dist/server/providers/__tests__/bedrock-stream-behavior-streaming.test.js +0 -272
- package/dist/server/providers/__tests__/bedrock-stream-behavior-toolchoice.test.js +0 -214
- package/dist/server/providers/__tests__/bedrock-stream-behavior.part2.test.js +0 -165
- package/dist/server/providers/__tests__/bedrock-stream-behavior.test.js +0 -309
- package/dist/server/providers/__tests__/bedrock-stream-body-credentials.test.js +0 -170
- package/dist/server/providers/__tests__/bedrock-stream-body-extras.test.js +0 -183
- package/dist/server/providers/__tests__/bedrock-stream-body-request.test.js +0 -305
- package/dist/server/providers/__tests__/bedrock-stream-body.part2.test.js +0 -305
- package/dist/server/providers/__tests__/bedrock-stream-body.test.js +0 -175
- package/dist/server/providers/__tests__/bedrock-stream-errors.test.js +0 -165
- package/dist/server/providers/__tests__/gemini-config-methods.test.js +0 -182
- package/dist/server/providers/__tests__/gemini-config-streaming.test.js +0 -257
- package/dist/server/providers/__tests__/gemini-conversion-messages.test.js +0 -247
- package/dist/server/providers/__tests__/gemini-conversion-schema.test.js +0 -365
- package/dist/server/providers/__tests__/gemini-tools-choice.test.js +0 -221
- package/dist/server/providers/__tests__/gemini-tools-fn.test.js +0 -252
- package/dist/server/providers/__tests__/openai-config.test.js +0 -194
- package/dist/server/providers/__tests__/openai-conversion.test.js +0 -276
- package/dist/server/providers/__tests__/openai-messages.test.js +0 -261
- package/dist/server/providers/__tests__/openai-streaming.test.js +0 -394
- package/dist/server/providers/__tests__/openai-tools-cache.test.js +0 -227
- package/dist/server/providers/__tests__/registry.test.js +0 -183
- package/dist/server/providers/__tests__/shared.test.js +0 -297
- package/dist/shared/agent-core-config.test.js +0 -132
- package/dist/shared/agent-core-context-thinking.test.js +0 -293
- package/dist/shared/agent-core-loop-calls.test.js +0 -174
- package/dist/shared/agent-core-loop-detector-bail.test.js +0 -201
- package/dist/shared/agent-core-loop-detector.test.js +0 -195
- package/dist/shared/agent-core-loop-errors.test.js +0 -258
- package/dist/shared/agent-core-pricing.test.js +0 -191
- package/dist/shared/agent-core-sanitize-retry.test.js +0 -129
- package/dist/shared/api-client-build-request.test.js +0 -228
- package/dist/shared/api-client-build-system-caching.test.js +0 -107
- package/dist/shared/api-client-build.test.js +0 -223
- package/dist/shared/api-client-config.d.ts +0 -21
- package/dist/shared/api-client-helpers.d.ts +0 -57
- package/dist/shared/api-client-helpers.test.js +0 -261
- package/dist/shared/api-client-proxy-happy.test.js +0 -255
- package/dist/shared/api-client-proxy-retry.test.js +0 -307
- package/dist/shared/api-client-proxy.d.ts +0 -26
- package/dist/shared/api-client-proxy.test.js +0 -255
- package/dist/shared/api-client-retry.test.js +0 -307
- package/dist/shared/api-client-system-trimming.test.js +0 -261
- package/dist/shared/api-client-trimming.d.ts +0 -36
- package/dist/shared/api-client.test.js +0 -228
- package/dist/shared/compaction-thinking.test.js +0 -315
- package/dist/shared/compaction-trimming.test.js +0 -223
- package/dist/shared/sse-parser-callbacks.test.js +0 -422
- package/dist/shared/sse-parser-collect.test.js +0 -252
- package/dist/shared/sse-parser-e2e.test.js +0 -558
- package/dist/shared/sse-parser-parse.test.js +0 -253
- package/dist/shared/tool-dispatch-advanced-batch-build.test.js +0 -405
- package/dist/shared/tool-dispatch-advanced.test.js +0 -320
- package/dist/shared/tool-dispatch-basic.test.js +0 -278
- package/dist/shared/tool-dispatch-content.d.ts +0 -14
- package/dist/shared/tool-dispatch-parallel.test.js +0 -378
- package/dist/webchat/__tests__/widget-messaging.test.js +0 -323
- package/dist/webchat/__tests__/widget.test.js +0 -273
package/dist/setup.js
CHANGED
|
@@ -116,36 +116,16 @@ export async function runSetup() {
|
|
|
116
116
|
return;
|
|
117
117
|
}
|
|
118
118
|
|
|
119
|
-
//
|
|
120
|
-
|
|
121
|
-
console.log("");
|
|
122
|
-
const supabaseUrl = await prompt(rl, " Supabase URL");
|
|
123
|
-
if (!supabaseUrl) {
|
|
124
|
-
console.log(" Supabase URL is required. Aborting.");
|
|
125
|
-
rl.close();
|
|
126
|
-
return;
|
|
127
|
-
}
|
|
128
|
-
const supabaseKey = await prompt(rl, " Supabase Service Role Key");
|
|
129
|
-
if (!supabaseKey) {
|
|
130
|
-
console.log(" Service Role Key is required. Aborting.");
|
|
131
|
-
rl.close();
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
const storeId = await prompt(rl, " Store ID (optional, press enter to skip)");
|
|
119
|
+
// No API keys needed — whale-code uses built-in platform credentials.
|
|
120
|
+
// Users authenticate via `whale login` (browser OAuth).
|
|
121
|
+
console.log(" No API keys required — authentication is handled by `whale login`.");
|
|
135
122
|
console.log("");
|
|
136
123
|
|
|
137
|
-
// Build MCP server entry
|
|
124
|
+
// Build MCP server entry — no env vars needed for normal users
|
|
138
125
|
const serverEntry = {
|
|
139
126
|
type: "stdio",
|
|
140
127
|
command: "npx",
|
|
141
|
-
args: ["-y", "whale-code"]
|
|
142
|
-
env: {
|
|
143
|
-
SUPABASE_URL: supabaseUrl,
|
|
144
|
-
SUPABASE_SERVICE_ROLE_KEY: supabaseKey,
|
|
145
|
-
...(storeId ? {
|
|
146
|
-
STORE_ID: storeId
|
|
147
|
-
} : {})
|
|
148
|
-
}
|
|
128
|
+
args: ["-y", "whale-code"]
|
|
149
129
|
};
|
|
150
130
|
|
|
151
131
|
// Install to each detected CLI
|
package/dist/setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","names":["existsSync","mkdirSync","readFileSync","writeFileSync","homedir","dirname","join","createInterface","home","CLI_TARGETS","name","configPath","configKey","detect","format","servers","process","platform","readJSON","path","JSON","parse","writeJSON","data","dir","recursive","stringify","prompt","rl","question","defaultValue","suffix","Promise","resolve","answer","trim","promptYN","defaultYes","hint","a","toLowerCase","runSetup","input","stdin","output","stdout","console","log","detected","filter","t","notDetected","length","forEach","close","supabaseUrl","supabaseKey","storeId","serverEntry","type","command","args","env","SUPABASE_URL","SUPABASE_SERVICE_ROLE_KEY","STORE_ID","installed","target","install","config","overwrite","isDirectRun","argv","includes","catch","error"],"sources":["../src/setup.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Whale Code — Interactive Setup\n *\n * Detects installed MCP-compatible CLIs and writes config for each.\n * Usage: whale setup\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { dirname, join } from \"path\";\nimport { createInterface } from \"readline\";\n\n// ============================================================================\n// CLI CONFIG TARGETS\n// ============================================================================\n\ninterface CLITarget {\n name: string;\n configPath: string;\n configKey: string; // JSON key that holds MCP servers\n detect: () => boolean;\n format: (servers: Record<string, any>) => Record<string, any>;\n}\n\nconst home = homedir();\n\nconst CLI_TARGETS: CLITarget[] = [\n {\n name: \"Claude Code\",\n configPath: join(home, \".claude\", \"settings.json\"),\n configKey: \"mcpServers\",\n detect: () => existsSync(join(home, \".claude\")),\n format: (servers) => servers,\n },\n {\n name: \"Claude Desktop\",\n configPath:\n process.platform === \"darwin\"\n ? join(home, \"Library\", \"Application Support\", \"Claude\", \"claude_desktop_config.json\")\n : join(home, \"AppData\", \"Roaming\", \"Claude\", \"claude_desktop_config.json\"),\n configKey: \"mcpServers\",\n detect: () =>\n existsSync(\n process.platform === \"darwin\"\n ? join(home, \"Library\", \"Application Support\", \"Claude\")\n : join(home, \"AppData\", \"Roaming\", \"Claude\")\n ),\n format: (servers) => servers,\n },\n {\n name: \"Cursor\",\n configPath: join(home, \".cursor\", \"mcp.json\"),\n configKey: \"mcpServers\",\n detect: () => existsSync(join(home, \".cursor\")),\n format: (servers) => servers,\n },\n {\n name: \"Windsurf\",\n configPath: join(home, \".codeium\", \"windsurf\", \"mcp_config.json\"),\n configKey: \"mcpServers\",\n detect: () => existsSync(join(home, \".codeium\", \"windsurf\")),\n format: (servers) => servers,\n },\n {\n name: \"Gemini CLI\",\n configPath: join(home, \".gemini\", \"settings.json\"),\n configKey: \"mcpServers\",\n detect: () => existsSync(join(home, \".gemini\")),\n format: (servers) => servers,\n },\n];\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\nfunction readJSON(path: string): Record<string, any> {\n try {\n return JSON.parse(readFileSync(path, \"utf-8\"));\n } catch {\n return {};\n }\n}\n\nfunction writeJSON(path: string, data: Record<string, any>): void {\n const dir = dirname(path);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n writeFileSync(path, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\");\n}\n\nfunction prompt(rl: ReturnType<typeof createInterface>, question: string, defaultValue?: string): Promise<string> {\n const suffix = defaultValue ? ` (${defaultValue})` : \"\";\n return new Promise((resolve) => {\n rl.question(`${question}${suffix}: `, (answer) => {\n resolve(answer.trim() || defaultValue || \"\");\n });\n });\n}\n\nfunction promptYN(rl: ReturnType<typeof createInterface>, question: string, defaultYes = true): Promise<boolean> {\n const hint = defaultYes ? \"[Y/n]\" : \"[y/N]\";\n return new Promise((resolve) => {\n rl.question(`${question} ${hint} `, (answer) => {\n const a = answer.trim().toLowerCase();\n if (a === \"\") resolve(defaultYes);\n else resolve(a === \"y\" || a === \"yes\");\n });\n });\n}\n\n// ============================================================================\n// MAIN\n// ============================================================================\n\nexport async function runSetup(): Promise<void> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n\n console.log(\"\");\n console.log(\" Whale Code — Setup\");\n console.log(\" ══════════════════\");\n console.log(\"\");\n\n // Detect installed CLIs\n const detected = CLI_TARGETS.filter((t) => t.detect());\n const notDetected = CLI_TARGETS.filter((t) => !t.detect());\n\n if (detected.length > 0) {\n console.log(\" Detected CLIs:\");\n detected.forEach((t) => console.log(` + ${t.name}`));\n }\n if (notDetected.length > 0) {\n console.log(\" Not found:\");\n notDetected.forEach((t) => console.log(` - ${t.name}`));\n }\n console.log(\"\");\n\n if (detected.length === 0) {\n console.log(\" No supported MCP clients detected.\");\n console.log(\" Install Claude Code, Claude Desktop, Cursor, Windsurf, or Gemini CLI first.\");\n rl.close();\n return;\n }\n\n // Collect credentials\n console.log(\" Enter your Supabase credentials:\");\n console.log(\"\");\n\n const supabaseUrl = await prompt(rl, \" Supabase URL\");\n if (!supabaseUrl) {\n console.log(\" Supabase URL is required. Aborting.\");\n rl.close();\n return;\n }\n\n const supabaseKey = await prompt(rl, \" Supabase Service Role Key\");\n if (!supabaseKey) {\n console.log(\" Service Role Key is required. Aborting.\");\n rl.close();\n return;\n }\n\n const storeId = await prompt(rl, \" Store ID (optional, press enter to skip)\");\n\n console.log(\"\");\n\n // Build MCP server entry\n const serverEntry: Record<string, any> = {\n type: \"stdio\",\n command: \"npx\",\n args: [\"-y\", \"whale-code\"],\n env: {\n SUPABASE_URL: supabaseUrl,\n SUPABASE_SERVICE_ROLE_KEY: supabaseKey,\n ...(storeId ? { STORE_ID: storeId } : {}),\n },\n };\n\n // Install to each detected CLI\n let installed = 0;\n for (const target of detected) {\n const install = await promptYN(rl, ` Install to ${target.name}?`);\n if (!install) continue;\n\n const config = readJSON(target.configPath);\n if (!config[target.configKey]) config[target.configKey] = {};\n\n // Check for existing entry\n if (config[target.configKey][\"whale-code\"]) {\n const overwrite = await promptYN(rl, ` whale-code already configured in ${target.name}. Overwrite?`, false);\n if (!overwrite) continue;\n }\n\n config[target.configKey][\"whale-code\"] = target.format(serverEntry);\n writeJSON(target.configPath, config);\n console.log(` Wrote ${target.configPath}`);\n installed++;\n }\n\n console.log(\"\");\n if (installed > 0) {\n console.log(` Done! Installed to ${installed} CLI${installed > 1 ? \"s\" : \"\"}.`);\n console.log(\" Restart your CLI(s) to load the MCP server.\");\n } else {\n console.log(\" No changes made.\");\n }\n console.log(\"\");\n\n rl.close();\n}\n\n// Run if called directly\nconst isDirectRun = process.argv[1]?.includes(\"setup\");\nif (isDirectRun) {\n runSetup().catch(console.error);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"setup.js","names":["existsSync","mkdirSync","readFileSync","writeFileSync","homedir","dirname","join","createInterface","home","CLI_TARGETS","name","configPath","configKey","detect","format","servers","process","platform","readJSON","path","JSON","parse","writeJSON","data","dir","recursive","stringify","prompt","rl","question","defaultValue","suffix","Promise","resolve","answer","trim","promptYN","defaultYes","hint","a","toLowerCase","runSetup","input","stdin","output","stdout","console","log","detected","filter","t","notDetected","length","forEach","close","serverEntry","type","command","args","installed","target","install","config","overwrite","isDirectRun","argv","includes","catch","error"],"sources":["../src/setup.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Whale Code — Interactive Setup\n *\n * Detects installed MCP-compatible CLIs and writes config for each.\n * Usage: whale setup\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { dirname, join } from \"path\";\nimport { createInterface } from \"readline\";\n\n// ============================================================================\n// CLI CONFIG TARGETS\n// ============================================================================\n\ninterface CLITarget {\n name: string;\n configPath: string;\n configKey: string; // JSON key that holds MCP servers\n detect: () => boolean;\n format: (servers: Record<string, any>) => Record<string, any>;\n}\n\nconst home = homedir();\n\nconst CLI_TARGETS: CLITarget[] = [\n {\n name: \"Claude Code\",\n configPath: join(home, \".claude\", \"settings.json\"),\n configKey: \"mcpServers\",\n detect: () => existsSync(join(home, \".claude\")),\n format: (servers) => servers,\n },\n {\n name: \"Claude Desktop\",\n configPath:\n process.platform === \"darwin\"\n ? join(home, \"Library\", \"Application Support\", \"Claude\", \"claude_desktop_config.json\")\n : join(home, \"AppData\", \"Roaming\", \"Claude\", \"claude_desktop_config.json\"),\n configKey: \"mcpServers\",\n detect: () =>\n existsSync(\n process.platform === \"darwin\"\n ? join(home, \"Library\", \"Application Support\", \"Claude\")\n : join(home, \"AppData\", \"Roaming\", \"Claude\")\n ),\n format: (servers) => servers,\n },\n {\n name: \"Cursor\",\n configPath: join(home, \".cursor\", \"mcp.json\"),\n configKey: \"mcpServers\",\n detect: () => existsSync(join(home, \".cursor\")),\n format: (servers) => servers,\n },\n {\n name: \"Windsurf\",\n configPath: join(home, \".codeium\", \"windsurf\", \"mcp_config.json\"),\n configKey: \"mcpServers\",\n detect: () => existsSync(join(home, \".codeium\", \"windsurf\")),\n format: (servers) => servers,\n },\n {\n name: \"Gemini CLI\",\n configPath: join(home, \".gemini\", \"settings.json\"),\n configKey: \"mcpServers\",\n detect: () => existsSync(join(home, \".gemini\")),\n format: (servers) => servers,\n },\n];\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\nfunction readJSON(path: string): Record<string, any> {\n try {\n return JSON.parse(readFileSync(path, \"utf-8\"));\n } catch {\n return {};\n }\n}\n\nfunction writeJSON(path: string, data: Record<string, any>): void {\n const dir = dirname(path);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n writeFileSync(path, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\");\n}\n\nfunction prompt(rl: ReturnType<typeof createInterface>, question: string, defaultValue?: string): Promise<string> {\n const suffix = defaultValue ? ` (${defaultValue})` : \"\";\n return new Promise((resolve) => {\n rl.question(`${question}${suffix}: `, (answer) => {\n resolve(answer.trim() || defaultValue || \"\");\n });\n });\n}\n\nfunction promptYN(rl: ReturnType<typeof createInterface>, question: string, defaultYes = true): Promise<boolean> {\n const hint = defaultYes ? \"[Y/n]\" : \"[y/N]\";\n return new Promise((resolve) => {\n rl.question(`${question} ${hint} `, (answer) => {\n const a = answer.trim().toLowerCase();\n if (a === \"\") resolve(defaultYes);\n else resolve(a === \"y\" || a === \"yes\");\n });\n });\n}\n\n// ============================================================================\n// MAIN\n// ============================================================================\n\nexport async function runSetup(): Promise<void> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n\n console.log(\"\");\n console.log(\" Whale Code — Setup\");\n console.log(\" ══════════════════\");\n console.log(\"\");\n\n // Detect installed CLIs\n const detected = CLI_TARGETS.filter((t) => t.detect());\n const notDetected = CLI_TARGETS.filter((t) => !t.detect());\n\n if (detected.length > 0) {\n console.log(\" Detected CLIs:\");\n detected.forEach((t) => console.log(` + ${t.name}`));\n }\n if (notDetected.length > 0) {\n console.log(\" Not found:\");\n notDetected.forEach((t) => console.log(` - ${t.name}`));\n }\n console.log(\"\");\n\n if (detected.length === 0) {\n console.log(\" No supported MCP clients detected.\");\n console.log(\" Install Claude Code, Claude Desktop, Cursor, Windsurf, or Gemini CLI first.\");\n rl.close();\n return;\n }\n\n // No API keys needed — whale-code uses built-in platform credentials.\n // Users authenticate via `whale login` (browser OAuth).\n console.log(\" No API keys required — authentication is handled by `whale login`.\");\n console.log(\"\");\n\n // Build MCP server entry — no env vars needed for normal users\n const serverEntry: Record<string, any> = {\n type: \"stdio\",\n command: \"npx\",\n args: [\"-y\", \"whale-code\"],\n };\n\n // Install to each detected CLI\n let installed = 0;\n for (const target of detected) {\n const install = await promptYN(rl, ` Install to ${target.name}?`);\n if (!install) continue;\n\n const config = readJSON(target.configPath);\n if (!config[target.configKey]) config[target.configKey] = {};\n\n // Check for existing entry\n if (config[target.configKey][\"whale-code\"]) {\n const overwrite = await promptYN(rl, ` whale-code already configured in ${target.name}. Overwrite?`, false);\n if (!overwrite) continue;\n }\n\n config[target.configKey][\"whale-code\"] = target.format(serverEntry);\n writeJSON(target.configPath, config);\n console.log(` Wrote ${target.configPath}`);\n installed++;\n }\n\n console.log(\"\");\n if (installed > 0) {\n console.log(` Done! Installed to ${installed} CLI${installed > 1 ? \"s\" : \"\"}.`);\n console.log(\" Restart your CLI(s) to load the MCP server.\");\n } else {\n console.log(\" No changes made.\");\n }\n console.log(\"\");\n\n rl.close();\n}\n\n// Run if called directly\nconst isDirectRun = process.argv[1]?.includes(\"setup\");\nif (isDirectRun) {\n runSetup().catch(console.error);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -5,14 +5,24 @@
|
|
|
5
5
|
* CLI-only: always calls through server proxy (no direct Anthropic SDK usage).
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import { getContextManagement, getMaxOutputTokens, getThinkingConfig, isRetryableError, addPromptCaching } from "./agent-core.js";
|
|
8
|
+
import { getContextManagement, getMaxOutputTokens, getThinkingConfig, isRetryableError, categorizeError, addPromptCaching } from "./agent-core.js";
|
|
9
9
|
import { getProvider } from "./constants.js";
|
|
10
10
|
// ============================================================================
|
|
11
11
|
// CONSTANTS
|
|
12
12
|
// ============================================================================
|
|
13
13
|
|
|
14
|
-
const MAX_RETRIES =
|
|
15
|
-
const RETRY_BASE_DELAY_MS =
|
|
14
|
+
const MAX_RETRIES = 5;
|
|
15
|
+
const RETRY_BASE_DELAY_MS = 2000;
|
|
16
|
+
const RETRY_MAX_DELAY_MS = 60000;
|
|
17
|
+
const MODEL_FALLBACK_AFTER = 2;
|
|
18
|
+
|
|
19
|
+
// Auto-derive fallback model when not explicitly provided
|
|
20
|
+
const AUTO_FALLBACK = {
|
|
21
|
+
"claude-opus-4-6": "claude-sonnet-4-6",
|
|
22
|
+
"claude-opus-4-5-20251101": "claude-sonnet-4-5-20250929",
|
|
23
|
+
"claude-opus-4-20250514": "claude-sonnet-4-20250514",
|
|
24
|
+
"claude-opus-4-1-20250805": "claude-sonnet-4-5-20250929"
|
|
25
|
+
};
|
|
16
26
|
|
|
17
27
|
// ============================================================================
|
|
18
28
|
// API REQUEST CONFIG BUILDER
|
|
@@ -243,7 +253,31 @@ export async function callServerProxy(config) {
|
|
|
243
253
|
if (attempt < MAX_RETRIES && isRetryableError(err)) {
|
|
244
254
|
const errMsg = err instanceof Error ? err.message : String(err);
|
|
245
255
|
config.onRetry?.(attempt + 1, MAX_RETRIES, errMsg);
|
|
246
|
-
const
|
|
256
|
+
const {
|
|
257
|
+
category
|
|
258
|
+
} = categorizeError(err);
|
|
259
|
+
let delay = Math.min(RETRY_BASE_DELAY_MS * Math.pow(2, attempt), RETRY_MAX_DELAY_MS);
|
|
260
|
+
|
|
261
|
+
// Overloaded/rate-limited: longer backoff + model fallback
|
|
262
|
+
if (category === "PROVIDER_DOWN" || category === "RATE_LIMIT") {
|
|
263
|
+
delay = Math.min(delay * 3, RETRY_MAX_DELAY_MS);
|
|
264
|
+
|
|
265
|
+
// After N failed attempts, downgrade model (Opus → Sonnet)
|
|
266
|
+
if (attempt >= MODEL_FALLBACK_AFTER) {
|
|
267
|
+
const fallback = config.fallbackModel || AUTO_FALLBACK[config.model];
|
|
268
|
+
if (fallback && config.model !== fallback) {
|
|
269
|
+
const fromModel = config.model;
|
|
270
|
+
config.model = fallback;
|
|
271
|
+
config.onFallback?.(fromModel, config.model);
|
|
272
|
+
// Fallback model likely available — shorter delay
|
|
273
|
+
delay = Math.min(RETRY_BASE_DELAY_MS, delay);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// Jitter ±25%
|
|
279
|
+
const jitter = delay * 0.25 * (Math.random() * 2 - 1);
|
|
280
|
+
delay = Math.round(delay + jitter);
|
|
247
281
|
|
|
248
282
|
// Abort-aware backoff — ESC can interrupt the wait immediately
|
|
249
283
|
await new Promise((resolve, reject) => {
|
|
@@ -260,13 +294,6 @@ export async function callServerProxy(config) {
|
|
|
260
294
|
once: true
|
|
261
295
|
});
|
|
262
296
|
});
|
|
263
|
-
|
|
264
|
-
// Fallback model on last retry
|
|
265
|
-
if (attempt === MAX_RETRIES - 1 && config.fallbackModel) {
|
|
266
|
-
const fromModel = config.model;
|
|
267
|
-
config.model = config.fallbackModel;
|
|
268
|
-
config.onFallback?.(fromModel, config.model);
|
|
269
|
-
}
|
|
270
297
|
continue;
|
|
271
298
|
}
|
|
272
299
|
throw err;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.js","names":["getContextManagement","getMaxOutputTokens","getThinkingConfig","isRetryableError","addPromptCaching","getProvider","MAX_RETRIES","RETRY_BASE_DELAY_MS","buildAPIRequest","opts","model","contextProfile","thinkingEnabled","maxOutputTokens","contextOverrides","provider","isAnthropicModel","betas","edits","ctxMgmt","config","type","keep","value","trigger","supportsCompaction","includes","push","pause_after_compaction","instructions","thinkingCfg","beta","maxTokens","thinking","budget_tokens","Math","min","filter","e","contextManagement","callServerProxy","proxyUrl","signal","timeoutMs","tokenRefreshed","attempt","body","mode","messages","system","tools","max_tokens","apiConfig","stream","length","context_management","temperature","storeId","store_id","Array","isArray","msgs","keepFrom","max","i","msg","content","block","source","text","sub","serialized","JSON","stringify","fetchOpts","method","headers","token","String","Buffer","byteLength","controller","timeout","AbortController","setTimeout","abort","response","fetch","clearTimeout","ok","errorBody","status","onTokenRefresh","newToken","Object","assign","Error","err","aborted","errMsg","message","onRetry","delay","pow","Promise","resolve","reject","reason","timer","onAbort","addEventListener","once","fallbackModel","fromModel","onFallback","buildSystemBlocks","systemPrompt","costContext","enableCaching","cache_control","prepareWithCaching","trimGeminiContext","estimatedTokens","threshold","keepRecent","toolResultCount","trimCount","trimmed","map","callTranscribe","audioBase64","mediaType","Authorization","audio_base64","media_type","errText","data","json","success","transcript","error","trimOpenAIContext","COMPACTION_TIMEOUT_MS","requestProviderCompaction","system_prompt","compaction_content"],"sources":["../../src/shared/api-client.ts"],"sourcesContent":["/**\n * Unified API Client — ONE server proxy caller with retry and config builder.\n *\n * Replaces proxy+direct call paths in agent-loop, subagent, teammate.\n * CLI-only: always calls through server proxy (no direct Anthropic SDK usage).\n */\n\nimport {\n getContextManagement,\n getMaxOutputTokens,\n getThinkingConfig,\n isRetryableError,\n addPromptCaching,\n} from \"./agent-core.js\";\nimport type { CompactableMessage } from \"./compaction.js\";\nimport { getProvider } from \"./constants.js\";\nimport type { ContextProfile, APIRequestConfig } from \"./types.js\";\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst MAX_RETRIES = 3;\nconst RETRY_BASE_DELAY_MS = 1000;\n\n// ============================================================================\n// API REQUEST CONFIG BUILDER\n// ============================================================================\n\n/**\n * Build all Anthropic API config from a simple profile.\n *\n * Profiles:\n * - 'main': clear at 80K/keep 3, compact at 120K (Opus only)\n * - 'subagent': clear at 60K/keep 2, no compaction, 8192 max tokens\n * - 'teammate': clear at 80K/keep 3, no compaction\n */\nexport function buildAPIRequest(opts: {\n model: string;\n contextProfile: ContextProfile;\n thinkingEnabled?: boolean;\n maxOutputTokens?: number;\n contextOverrides?: import(\"./agent-core.js\").ContextManagementOverrides;\n}): APIRequestConfig {\n const { model, contextProfile, thinkingEnabled = false, maxOutputTokens, contextOverrides } = opts;\n\n // Context management config per profile\n // Non-Anthropic models (Gemini, OpenAI, etc.) don't support Anthropic betas or context management\n const provider = getProvider(model);\n const isAnthropicModel = provider === \"anthropic\" || provider === \"bedrock\";\n let betas: string[] = isAnthropicModel ? [\"context-management-2025-06-27\"] : [];\n let edits: Array<Record<string, unknown>> = [];\n\n switch (contextProfile) {\n case \"main\": {\n const ctxMgmt = getContextManagement(model, contextOverrides);\n betas = [...ctxMgmt.betas];\n edits = ctxMgmt.config.edits;\n break;\n }\n case \"subagent\":\n if (isAnthropicModel) {\n edits = [\n {\n type: \"clear_thinking_20251015\",\n keep: { type: \"thinking_turns\", value: 1 },\n },\n {\n type: \"clear_tool_uses_20250919\",\n trigger: { type: \"input_tokens\", value: 60_000 },\n keep: { type: \"tool_uses\", value: 2 },\n },\n ];\n // Compaction for sub-agents on models that support it (lower threshold than main agent).\n // Trigger at 80K — above the 60K clear_tool_uses threshold so clearing fires first.\n const supportsCompaction = model.includes(\"opus-4-6\") || model.includes(\"sonnet-4-6\");\n if (supportsCompaction) {\n edits.push({\n type: \"compact_20260112\",\n trigger: { type: \"input_tokens\", value: 80_000 },\n pause_after_compaction: true,\n instructions: \"Summarize preserving: task goal, files found/modified, key findings, next steps.\",\n });\n betas.push(\"compact-2026-01-12\");\n }\n }\n break;\n case \"teammate\": {\n const ctxMgmt = getContextManagement(model);\n betas = [...ctxMgmt.betas];\n edits = ctxMgmt.config.edits;\n break;\n }\n }\n\n // Thinking config\n const thinkingCfg = getThinkingConfig(model, thinkingEnabled);\n if (thinkingCfg.beta) betas.push(thinkingCfg.beta);\n\n // Max tokens — caller is responsible for setting appropriate limits per context\n const maxTokens = getMaxOutputTokens(model, maxOutputTokens);\n\n // Build thinking param (ensure budget < maxTokens)\n // Only include for Anthropic/Bedrock — Gemini/OpenAI handle thinking internally\n let thinking: { type: string; budget_tokens?: number } | undefined;\n if (isAnthropicModel && thinkingCfg.thinking.type !== \"disabled\") {\n thinking = thinkingCfg.thinking.budget_tokens\n ? { ...thinkingCfg.thinking, budget_tokens: Math.min(thinkingCfg.thinking.budget_tokens, maxTokens - 1) }\n : thinkingCfg.thinking;\n }\n\n // Strip clear_thinking edits when thinking is disabled — API requires thinking\n // to be enabled or adaptive for clear_thinking_20251015 to be accepted\n if (!thinking) {\n edits = edits.filter(e => e.type !== \"clear_thinking_20251015\");\n }\n\n return {\n betas,\n contextManagement: { edits },\n thinking,\n maxTokens,\n };\n}\n\n// ============================================================================\n// SERVER PROXY CALLER\n// ============================================================================\n\nexport interface CallServerProxyConfig {\n proxyUrl: string;\n token: string;\n model: string;\n system: object[];\n messages: object[];\n tools: object[];\n apiConfig: APIRequestConfig;\n signal?: AbortSignal;\n timeoutMs?: number;\n fallbackModel?: string;\n storeId?: string; // Required for non-Anthropic providers (credential resolution)\n onFallback?: (fromModel: string, toModel: string) => void;\n onRetry?: (attempt: number, maxRetries: number, error: string) => void;\n /** Called on 401 to refresh the auth token. Returns new token or null. */\n onTokenRefresh?: () => Promise<string | null>;\n}\n\n/**\n * Call server proxy endpoint and return raw SSE stream.\n * Retries with exponential backoff on 429/500/529.\n */\nexport async function callServerProxy(\n config: CallServerProxyConfig,\n): Promise<ReadableStream<Uint8Array>> {\n const { proxyUrl, signal, timeoutMs } = config;\n let tokenRefreshed = false;\n\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {\n try {\n const body: Record<string, unknown> = {\n mode: \"proxy\",\n messages: config.messages,\n system: config.system,\n tools: config.tools,\n model: config.model,\n max_tokens: config.apiConfig.maxTokens,\n stream: true,\n betas: config.apiConfig.betas,\n ...(config.apiConfig.contextManagement?.edits?.length\n ? { context_management: config.apiConfig.contextManagement }\n : {}),\n };\n if (config.apiConfig.thinking) {\n body.thinking = config.apiConfig.thinking;\n // Anthropic requires temperature=1.0 when thinking is enabled — enforce client-side\n if (config.apiConfig.thinking.type !== \"disabled\") {\n body.temperature = 1.0;\n }\n }\n if (config.storeId) {\n body.store_id = config.storeId;\n }\n\n // Prune old base64 images from conversation history before serializing.\n // Keep images only in the last 2 messages to avoid multi-MB request bodies\n // that can cause \"Invalid JSON\" errors from body truncation on the proxy.\n if (Array.isArray(body.messages) && (body.messages as any[]).length > 4) {\n const msgs = body.messages as any[];\n const keepFrom = Math.max(0, msgs.length - 2);\n for (let i = 0; i < keepFrom; i++) {\n const msg = msgs[i];\n if (!Array.isArray(msg?.content)) continue;\n for (const block of msg.content) {\n if (block.type === \"image\" && block.source?.type === \"base64\") {\n block.type = \"text\";\n block.text = \"[image]\";\n delete block.source;\n }\n if (block.type === \"tool_result\" && Array.isArray(block.content)) {\n for (const sub of block.content) {\n if (sub.type === \"image\" && sub.source?.type === \"base64\") {\n sub.type = \"text\";\n sub.text = \"[image]\";\n delete sub.source;\n }\n }\n }\n }\n }\n }\n\n const serialized = JSON.stringify(body);\n const fetchOpts: RequestInit = {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Authorization\": `Bearer ${config.token}`,\n \"Content-Length\": String(Buffer.byteLength(serialized)),\n },\n body: serialized,\n signal,\n };\n\n // Apply timeout only when the caller did NOT already supply a signal\n let controller: AbortController | undefined;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n if (timeoutMs && !signal) {\n controller = new AbortController();\n timeout = setTimeout(() => controller!.abort(), timeoutMs);\n fetchOpts.signal = controller.signal;\n }\n\n try {\n const response = await fetch(proxyUrl, fetchOpts);\n if (timeout) clearTimeout(timeout);\n\n if (response.ok && response.body) {\n return response.body;\n }\n\n const errorBody = await response.text();\n\n // Auto-refresh on 401 (token invalidated server-side before local expiry)\n if (response.status === 401 && config.onTokenRefresh && !tokenRefreshed) {\n const newToken = await config.onTokenRefresh();\n if (newToken) {\n tokenRefreshed = true;\n config.token = newToken;\n continue; // retry with new token\n }\n }\n\n throw Object.assign(\n new Error(`Proxy error (${response.status}): ${errorBody}`),\n { status: response.status },\n );\n } catch (err) {\n if (timeout) clearTimeout(timeout);\n throw err;\n }\n } catch (err: unknown) {\n if (signal?.aborted) throw err;\n\n if (attempt < MAX_RETRIES && isRetryableError(err)) {\n const errMsg = err instanceof Error ? err.message : String(err);\n config.onRetry?.(attempt + 1, MAX_RETRIES, errMsg);\n const delay = RETRY_BASE_DELAY_MS * Math.pow(2, attempt);\n\n // Abort-aware backoff — ESC can interrupt the wait immediately\n await new Promise<void>((resolve, reject) => {\n if (signal?.aborted) { reject(signal.reason ?? new Error(\"Aborted\")); return; }\n const timer = setTimeout(resolve, delay);\n const onAbort = () => { clearTimeout(timer); reject(signal!.reason ?? new Error(\"Aborted\")); };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n\n // Fallback model on last retry\n if (attempt === MAX_RETRIES - 1 && config.fallbackModel) {\n const fromModel = config.model;\n config.model = config.fallbackModel;\n config.onFallback?.(fromModel, config.model);\n }\n continue;\n }\n throw err;\n }\n }\n\n throw new Error(\"Failed to get response after retries\");\n}\n\n// ============================================================================\n// HELPERS — system prompt + caching setup\n// ============================================================================\n\n/**\n * Build system blocks with prompt caching.\n * Cached system prompt + optional dynamic cost context (after cache breakpoint).\n */\nexport function buildSystemBlocks(\n systemPrompt: string,\n costContext?: string,\n enableCaching = true,\n): Array<Record<string, unknown>> {\n const system: Array<Record<string, unknown>> = [];\n\n if (enableCaching) {\n system.push({\n type: \"text\",\n text: systemPrompt,\n cache_control: { type: \"ephemeral\" },\n });\n } else {\n system.push({ type: \"text\", text: systemPrompt });\n }\n\n if (costContext) {\n system.push({ type: \"text\", text: costContext });\n }\n\n return system;\n}\n\n/**\n * Prepare messages and tools with prompt caching.\n * Skips cache_control injection for Gemini (uses implicit caching).\n */\nexport function prepareWithCaching<\n T extends object = object,\n M extends { role: string; content: unknown } = { role: string; content: unknown },\n>(\n tools: T[],\n messages: M[],\n model?: string,\n): { tools: T[]; messages: M[] } {\n if (model) {\n const provider = getProvider(model);\n if (provider === \"gemini\" || provider === \"openai\") {\n return { tools, messages };\n }\n }\n return addPromptCaching(tools, messages);\n}\n\n// ============================================================================\n// GEMINI CONTEXT TRIMMING\n// ============================================================================\n\n/**\n * Client-side context trimming for Gemini (no server-side context management).\n * When estimated input tokens exceed threshold, replaces old tool result contents\n * with \"[trimmed]\" to stay within Gemini's 1M context window.\n */\nexport function trimGeminiContext<T extends CompactableMessage>(\n messages: T[],\n estimatedTokens: number,\n threshold = 950_000,\n keepRecent = 5,\n): T[] {\n if (estimatedTokens < threshold) return messages;\n\n type Block = { type?: string; content?: unknown };\n let toolResultCount = 0;\n for (const msg of messages) {\n if (Array.isArray(msg.content)) {\n for (const block of msg.content as Block[]) {\n if (block.type === \"tool_result\") toolResultCount++;\n }\n }\n }\n\n if (toolResultCount <= keepRecent) return messages;\n\n const trimCount = toolResultCount - keepRecent;\n let trimmed = 0;\n\n return messages.map((msg) => {\n if (!Array.isArray(msg.content)) return msg;\n const content = (msg.content as Block[]).map((block) => {\n if (block.type === \"tool_result\" && trimmed < trimCount) {\n trimmed++;\n if (typeof block.content === \"string\") {\n return { ...block, content: \"[trimmed]\" };\n } else if (Array.isArray(block.content)) {\n return { ...block, content: [{ type: \"text\", text: \"[trimmed]\" }] };\n }\n }\n return block;\n });\n return { ...msg, content } as T;\n });\n}\n\n// ============================================================================\n// OPENAI CONTEXT TRIMMING\n// ============================================================================\n\n/**\n * Client-side context trimming for OpenAI (no server-side context management).\n * When estimated input tokens exceed threshold, replaces old tool result contents\n * with \"[trimmed]\" to stay within OpenAI's 200K context window.\n */\n// ============================================================================\n// AUDIO TRANSCRIPTION CLIENT\n// ============================================================================\n\n/**\n * Call server transcription endpoint (OpenAI Whisper via our Fly.io proxy).\n * Used by tool-dispatch when __AUDIO__ marker is detected in tool results.\n */\nexport async function callTranscribe(opts: {\n proxyUrl: string;\n token: string;\n storeId: string;\n audioBase64: string;\n mediaType: string;\n}): Promise<string> {\n const { proxyUrl, token, storeId, audioBase64, mediaType } = opts;\n\n // Use same server URL as proxy, just different mode\n const response = await fetch(proxyUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({\n mode: \"transcribe\",\n audio_base64: audioBase64,\n media_type: mediaType,\n store_id: storeId,\n }),\n });\n\n if (!response.ok) {\n const errText = await response.text();\n throw new Error(`Transcription failed (${response.status}): ${errText}`);\n }\n\n const data = (await response.json()) as { success: boolean; transcript?: string; error?: string };\n if (!data.success || !data.transcript) {\n throw new Error(data.error || \"Transcription returned no transcript\");\n }\n\n return data.transcript;\n}\n\n// ============================================================================\n// OPENAI CONTEXT TRIMMING\n// ============================================================================\n\nexport function trimOpenAIContext<T extends CompactableMessage>(\n messages: T[],\n estimatedTokens: number,\n threshold = 190_000,\n keepRecent = 5,\n): T[] {\n if (estimatedTokens < threshold) return messages;\n\n type Block = { type?: string; content?: unknown };\n let toolResultCount = 0;\n for (const msg of messages) {\n if (Array.isArray(msg.content)) {\n for (const block of msg.content as Block[]) {\n if (block.type === \"tool_result\") toolResultCount++;\n }\n }\n }\n\n if (toolResultCount <= keepRecent) return messages;\n\n const trimCount = toolResultCount - keepRecent;\n let trimmed = 0;\n\n return messages.map((msg) => {\n if (!Array.isArray(msg.content)) return msg;\n const content = (msg.content as Block[]).map((block) => {\n if (block.type === \"tool_result\" && trimmed < trimCount) {\n trimmed++;\n if (typeof block.content === \"string\") {\n return { ...block, content: \"[trimmed]\" };\n } else if (Array.isArray(block.content)) {\n return { ...block, content: [{ type: \"text\", text: \"[trimmed]\" }] };\n }\n }\n return block;\n });\n return { ...msg, content } as T;\n });\n}\n\n// ============================================================================\n// PROVIDER COMPACTION CLIENT\n// ============================================================================\n\nconst COMPACTION_TIMEOUT_MS = 30_000;\n\n/**\n * Request conversation compaction from the server (Haiku summarization).\n * Used by non-Anthropic providers (OpenAI, Gemini) that lack native compaction.\n * Returns summary string or null on failure (caller keeps unsummarized history).\n */\nexport async function requestProviderCompaction(opts: {\n proxyUrl: string;\n token: string;\n messages: object[];\n systemPrompt: string;\n}): Promise<string | null> {\n const { proxyUrl, token, messages, systemPrompt } = opts;\n\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), COMPACTION_TIMEOUT_MS);\n\n try {\n const response = await fetch(proxyUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({\n mode: \"compact\",\n messages,\n system_prompt: systemPrompt,\n }),\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n\n if (!response.ok) return null;\n\n const data = (await response.json()) as {\n success: boolean;\n compaction_content?: string;\n error?: string;\n };\n\n return data.success && data.compaction_content ? data.compaction_content : null;\n } finally {\n clearTimeout(timeout);\n }\n } catch {\n return null; // Graceful failure — caller keeps unsummarized history\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"api-client.js","names":["getContextManagement","getMaxOutputTokens","getThinkingConfig","isRetryableError","categorizeError","addPromptCaching","getProvider","MAX_RETRIES","RETRY_BASE_DELAY_MS","RETRY_MAX_DELAY_MS","MODEL_FALLBACK_AFTER","AUTO_FALLBACK","buildAPIRequest","opts","model","contextProfile","thinkingEnabled","maxOutputTokens","contextOverrides","provider","isAnthropicModel","betas","edits","ctxMgmt","config","type","keep","value","trigger","supportsCompaction","includes","push","pause_after_compaction","instructions","thinkingCfg","beta","maxTokens","thinking","budget_tokens","Math","min","filter","e","contextManagement","callServerProxy","proxyUrl","signal","timeoutMs","tokenRefreshed","attempt","body","mode","messages","system","tools","max_tokens","apiConfig","stream","length","context_management","temperature","storeId","store_id","Array","isArray","msgs","keepFrom","max","i","msg","content","block","source","text","sub","serialized","JSON","stringify","fetchOpts","method","headers","token","String","Buffer","byteLength","controller","timeout","AbortController","setTimeout","abort","response","fetch","clearTimeout","ok","errorBody","status","onTokenRefresh","newToken","Object","assign","Error","err","aborted","errMsg","message","onRetry","category","delay","pow","fallback","fallbackModel","fromModel","onFallback","jitter","random","round","Promise","resolve","reject","reason","timer","onAbort","addEventListener","once","buildSystemBlocks","systemPrompt","costContext","enableCaching","cache_control","prepareWithCaching","trimGeminiContext","estimatedTokens","threshold","keepRecent","toolResultCount","trimCount","trimmed","map","callTranscribe","audioBase64","mediaType","Authorization","audio_base64","media_type","errText","data","json","success","transcript","error","trimOpenAIContext","COMPACTION_TIMEOUT_MS","requestProviderCompaction","system_prompt","compaction_content"],"sources":["../../src/shared/api-client.ts"],"sourcesContent":["/**\n * Unified API Client — ONE server proxy caller with retry and config builder.\n *\n * Replaces proxy+direct call paths in agent-loop, subagent, teammate.\n * CLI-only: always calls through server proxy (no direct Anthropic SDK usage).\n */\n\nimport {\n getContextManagement,\n getMaxOutputTokens,\n getThinkingConfig,\n isRetryableError,\n categorizeError,\n addPromptCaching,\n} from \"./agent-core.js\";\nimport type { CompactableMessage } from \"./compaction.js\";\nimport { getProvider } from \"./constants.js\";\nimport type { ContextProfile, APIRequestConfig } from \"./types.js\";\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst MAX_RETRIES = 5;\nconst RETRY_BASE_DELAY_MS = 2000;\nconst RETRY_MAX_DELAY_MS = 60000;\nconst MODEL_FALLBACK_AFTER = 2;\n\n// Auto-derive fallback model when not explicitly provided\nconst AUTO_FALLBACK: Record<string, string> = {\n \"claude-opus-4-6\": \"claude-sonnet-4-6\",\n \"claude-opus-4-5-20251101\": \"claude-sonnet-4-5-20250929\",\n \"claude-opus-4-20250514\": \"claude-sonnet-4-20250514\",\n \"claude-opus-4-1-20250805\": \"claude-sonnet-4-5-20250929\",\n};\n\n// ============================================================================\n// API REQUEST CONFIG BUILDER\n// ============================================================================\n\n/**\n * Build all Anthropic API config from a simple profile.\n *\n * Profiles:\n * - 'main': clear at 80K/keep 3, compact at 120K (Opus only)\n * - 'subagent': clear at 60K/keep 2, no compaction, 8192 max tokens\n * - 'teammate': clear at 80K/keep 3, no compaction\n */\nexport function buildAPIRequest(opts: {\n model: string;\n contextProfile: ContextProfile;\n thinkingEnabled?: boolean;\n maxOutputTokens?: number;\n contextOverrides?: import(\"./agent-core.js\").ContextManagementOverrides;\n}): APIRequestConfig {\n const { model, contextProfile, thinkingEnabled = false, maxOutputTokens, contextOverrides } = opts;\n\n // Context management config per profile\n // Non-Anthropic models (Gemini, OpenAI, etc.) don't support Anthropic betas or context management\n const provider = getProvider(model);\n const isAnthropicModel = provider === \"anthropic\" || provider === \"bedrock\";\n let betas: string[] = isAnthropicModel ? [\"context-management-2025-06-27\"] : [];\n let edits: Array<Record<string, unknown>> = [];\n\n switch (contextProfile) {\n case \"main\": {\n const ctxMgmt = getContextManagement(model, contextOverrides);\n betas = [...ctxMgmt.betas];\n edits = ctxMgmt.config.edits;\n break;\n }\n case \"subagent\":\n if (isAnthropicModel) {\n edits = [\n {\n type: \"clear_thinking_20251015\",\n keep: { type: \"thinking_turns\", value: 1 },\n },\n {\n type: \"clear_tool_uses_20250919\",\n trigger: { type: \"input_tokens\", value: 60_000 },\n keep: { type: \"tool_uses\", value: 2 },\n },\n ];\n // Compaction for sub-agents on models that support it (lower threshold than main agent).\n // Trigger at 80K — above the 60K clear_tool_uses threshold so clearing fires first.\n const supportsCompaction = model.includes(\"opus-4-6\") || model.includes(\"sonnet-4-6\");\n if (supportsCompaction) {\n edits.push({\n type: \"compact_20260112\",\n trigger: { type: \"input_tokens\", value: 80_000 },\n pause_after_compaction: true,\n instructions: \"Summarize preserving: task goal, files found/modified, key findings, next steps.\",\n });\n betas.push(\"compact-2026-01-12\");\n }\n }\n break;\n case \"teammate\": {\n const ctxMgmt = getContextManagement(model);\n betas = [...ctxMgmt.betas];\n edits = ctxMgmt.config.edits;\n break;\n }\n }\n\n // Thinking config\n const thinkingCfg = getThinkingConfig(model, thinkingEnabled);\n if (thinkingCfg.beta) betas.push(thinkingCfg.beta);\n\n // Max tokens — caller is responsible for setting appropriate limits per context\n const maxTokens = getMaxOutputTokens(model, maxOutputTokens);\n\n // Build thinking param (ensure budget < maxTokens)\n // Only include for Anthropic/Bedrock — Gemini/OpenAI handle thinking internally\n let thinking: { type: string; budget_tokens?: number } | undefined;\n if (isAnthropicModel && thinkingCfg.thinking.type !== \"disabled\") {\n thinking = thinkingCfg.thinking.budget_tokens\n ? { ...thinkingCfg.thinking, budget_tokens: Math.min(thinkingCfg.thinking.budget_tokens, maxTokens - 1) }\n : thinkingCfg.thinking;\n }\n\n // Strip clear_thinking edits when thinking is disabled — API requires thinking\n // to be enabled or adaptive for clear_thinking_20251015 to be accepted\n if (!thinking) {\n edits = edits.filter(e => e.type !== \"clear_thinking_20251015\");\n }\n\n return {\n betas,\n contextManagement: { edits },\n thinking,\n maxTokens,\n };\n}\n\n// ============================================================================\n// SERVER PROXY CALLER\n// ============================================================================\n\nexport interface CallServerProxyConfig {\n proxyUrl: string;\n token: string;\n model: string;\n system: object[];\n messages: object[];\n tools: object[];\n apiConfig: APIRequestConfig;\n signal?: AbortSignal;\n timeoutMs?: number;\n fallbackModel?: string;\n storeId?: string; // Required for non-Anthropic providers (credential resolution)\n onFallback?: (fromModel: string, toModel: string) => void;\n onRetry?: (attempt: number, maxRetries: number, error: string) => void;\n /** Called on 401 to refresh the auth token. Returns new token or null. */\n onTokenRefresh?: () => Promise<string | null>;\n}\n\n/**\n * Call server proxy endpoint and return raw SSE stream.\n * Retries with exponential backoff on 429/500/529.\n */\nexport async function callServerProxy(\n config: CallServerProxyConfig,\n): Promise<ReadableStream<Uint8Array>> {\n const { proxyUrl, signal, timeoutMs } = config;\n let tokenRefreshed = false;\n\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {\n try {\n const body: Record<string, unknown> = {\n mode: \"proxy\",\n messages: config.messages,\n system: config.system,\n tools: config.tools,\n model: config.model,\n max_tokens: config.apiConfig.maxTokens,\n stream: true,\n betas: config.apiConfig.betas,\n ...(config.apiConfig.contextManagement?.edits?.length\n ? { context_management: config.apiConfig.contextManagement }\n : {}),\n };\n if (config.apiConfig.thinking) {\n body.thinking = config.apiConfig.thinking;\n // Anthropic requires temperature=1.0 when thinking is enabled — enforce client-side\n if (config.apiConfig.thinking.type !== \"disabled\") {\n body.temperature = 1.0;\n }\n }\n if (config.storeId) {\n body.store_id = config.storeId;\n }\n\n // Prune old base64 images from conversation history before serializing.\n // Keep images only in the last 2 messages to avoid multi-MB request bodies\n // that can cause \"Invalid JSON\" errors from body truncation on the proxy.\n if (Array.isArray(body.messages) && (body.messages as any[]).length > 4) {\n const msgs = body.messages as any[];\n const keepFrom = Math.max(0, msgs.length - 2);\n for (let i = 0; i < keepFrom; i++) {\n const msg = msgs[i];\n if (!Array.isArray(msg?.content)) continue;\n for (const block of msg.content) {\n if (block.type === \"image\" && block.source?.type === \"base64\") {\n block.type = \"text\";\n block.text = \"[image]\";\n delete block.source;\n }\n if (block.type === \"tool_result\" && Array.isArray(block.content)) {\n for (const sub of block.content) {\n if (sub.type === \"image\" && sub.source?.type === \"base64\") {\n sub.type = \"text\";\n sub.text = \"[image]\";\n delete sub.source;\n }\n }\n }\n }\n }\n }\n\n const serialized = JSON.stringify(body);\n const fetchOpts: RequestInit = {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Authorization\": `Bearer ${config.token}`,\n \"Content-Length\": String(Buffer.byteLength(serialized)),\n },\n body: serialized,\n signal,\n };\n\n // Apply timeout only when the caller did NOT already supply a signal\n let controller: AbortController | undefined;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n if (timeoutMs && !signal) {\n controller = new AbortController();\n timeout = setTimeout(() => controller!.abort(), timeoutMs);\n fetchOpts.signal = controller.signal;\n }\n\n try {\n const response = await fetch(proxyUrl, fetchOpts);\n if (timeout) clearTimeout(timeout);\n\n if (response.ok && response.body) {\n return response.body;\n }\n\n const errorBody = await response.text();\n\n // Auto-refresh on 401 (token invalidated server-side before local expiry)\n if (response.status === 401 && config.onTokenRefresh && !tokenRefreshed) {\n const newToken = await config.onTokenRefresh();\n if (newToken) {\n tokenRefreshed = true;\n config.token = newToken;\n continue; // retry with new token\n }\n }\n\n throw Object.assign(\n new Error(`Proxy error (${response.status}): ${errorBody}`),\n { status: response.status },\n );\n } catch (err) {\n if (timeout) clearTimeout(timeout);\n throw err;\n }\n } catch (err: unknown) {\n if (signal?.aborted) throw err;\n\n if (attempt < MAX_RETRIES && isRetryableError(err)) {\n const errMsg = err instanceof Error ? err.message : String(err);\n config.onRetry?.(attempt + 1, MAX_RETRIES, errMsg);\n\n const { category } = categorizeError(err);\n let delay = Math.min(RETRY_BASE_DELAY_MS * Math.pow(2, attempt), RETRY_MAX_DELAY_MS);\n\n // Overloaded/rate-limited: longer backoff + model fallback\n if (category === \"PROVIDER_DOWN\" || category === \"RATE_LIMIT\") {\n delay = Math.min(delay * 3, RETRY_MAX_DELAY_MS);\n\n // After N failed attempts, downgrade model (Opus → Sonnet)\n if (attempt >= MODEL_FALLBACK_AFTER) {\n const fallback = config.fallbackModel || AUTO_FALLBACK[config.model];\n if (fallback && config.model !== fallback) {\n const fromModel = config.model;\n config.model = fallback;\n config.onFallback?.(fromModel, config.model);\n // Fallback model likely available — shorter delay\n delay = Math.min(RETRY_BASE_DELAY_MS, delay);\n }\n }\n }\n\n // Jitter ±25%\n const jitter = delay * 0.25 * (Math.random() * 2 - 1);\n delay = Math.round(delay + jitter);\n\n // Abort-aware backoff — ESC can interrupt the wait immediately\n await new Promise<void>((resolve, reject) => {\n if (signal?.aborted) { reject(signal.reason ?? new Error(\"Aborted\")); return; }\n const timer = setTimeout(resolve, delay);\n const onAbort = () => { clearTimeout(timer); reject(signal!.reason ?? new Error(\"Aborted\")); };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n continue;\n }\n throw err;\n }\n }\n\n throw new Error(\"Failed to get response after retries\");\n}\n\n// ============================================================================\n// HELPERS — system prompt + caching setup\n// ============================================================================\n\n/**\n * Build system blocks with prompt caching.\n * Cached system prompt + optional dynamic cost context (after cache breakpoint).\n */\nexport function buildSystemBlocks(\n systemPrompt: string,\n costContext?: string,\n enableCaching = true,\n): Array<Record<string, unknown>> {\n const system: Array<Record<string, unknown>> = [];\n\n if (enableCaching) {\n system.push({\n type: \"text\",\n text: systemPrompt,\n cache_control: { type: \"ephemeral\" },\n });\n } else {\n system.push({ type: \"text\", text: systemPrompt });\n }\n\n if (costContext) {\n system.push({ type: \"text\", text: costContext });\n }\n\n return system;\n}\n\n/**\n * Prepare messages and tools with prompt caching.\n * Skips cache_control injection for Gemini (uses implicit caching).\n */\nexport function prepareWithCaching<\n T extends object = object,\n M extends { role: string; content: unknown } = { role: string; content: unknown },\n>(\n tools: T[],\n messages: M[],\n model?: string,\n): { tools: T[]; messages: M[] } {\n if (model) {\n const provider = getProvider(model);\n if (provider === \"gemini\" || provider === \"openai\") {\n return { tools, messages };\n }\n }\n return addPromptCaching(tools, messages);\n}\n\n// ============================================================================\n// GEMINI CONTEXT TRIMMING\n// ============================================================================\n\n/**\n * Client-side context trimming for Gemini (no server-side context management).\n * When estimated input tokens exceed threshold, replaces old tool result contents\n * with \"[trimmed]\" to stay within Gemini's 1M context window.\n */\nexport function trimGeminiContext<T extends CompactableMessage>(\n messages: T[],\n estimatedTokens: number,\n threshold = 950_000,\n keepRecent = 5,\n): T[] {\n if (estimatedTokens < threshold) return messages;\n\n type Block = { type?: string; content?: unknown };\n let toolResultCount = 0;\n for (const msg of messages) {\n if (Array.isArray(msg.content)) {\n for (const block of msg.content as Block[]) {\n if (block.type === \"tool_result\") toolResultCount++;\n }\n }\n }\n\n if (toolResultCount <= keepRecent) return messages;\n\n const trimCount = toolResultCount - keepRecent;\n let trimmed = 0;\n\n return messages.map((msg) => {\n if (!Array.isArray(msg.content)) return msg;\n const content = (msg.content as Block[]).map((block) => {\n if (block.type === \"tool_result\" && trimmed < trimCount) {\n trimmed++;\n if (typeof block.content === \"string\") {\n return { ...block, content: \"[trimmed]\" };\n } else if (Array.isArray(block.content)) {\n return { ...block, content: [{ type: \"text\", text: \"[trimmed]\" }] };\n }\n }\n return block;\n });\n return { ...msg, content } as T;\n });\n}\n\n// ============================================================================\n// OPENAI CONTEXT TRIMMING\n// ============================================================================\n\n/**\n * Client-side context trimming for OpenAI (no server-side context management).\n * When estimated input tokens exceed threshold, replaces old tool result contents\n * with \"[trimmed]\" to stay within OpenAI's 200K context window.\n */\n// ============================================================================\n// AUDIO TRANSCRIPTION CLIENT\n// ============================================================================\n\n/**\n * Call server transcription endpoint (OpenAI Whisper via our Fly.io proxy).\n * Used by tool-dispatch when __AUDIO__ marker is detected in tool results.\n */\nexport async function callTranscribe(opts: {\n proxyUrl: string;\n token: string;\n storeId: string;\n audioBase64: string;\n mediaType: string;\n}): Promise<string> {\n const { proxyUrl, token, storeId, audioBase64, mediaType } = opts;\n\n // Use same server URL as proxy, just different mode\n const response = await fetch(proxyUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({\n mode: \"transcribe\",\n audio_base64: audioBase64,\n media_type: mediaType,\n store_id: storeId,\n }),\n });\n\n if (!response.ok) {\n const errText = await response.text();\n throw new Error(`Transcription failed (${response.status}): ${errText}`);\n }\n\n const data = (await response.json()) as { success: boolean; transcript?: string; error?: string };\n if (!data.success || !data.transcript) {\n throw new Error(data.error || \"Transcription returned no transcript\");\n }\n\n return data.transcript;\n}\n\n// ============================================================================\n// OPENAI CONTEXT TRIMMING\n// ============================================================================\n\nexport function trimOpenAIContext<T extends CompactableMessage>(\n messages: T[],\n estimatedTokens: number,\n threshold = 190_000,\n keepRecent = 5,\n): T[] {\n if (estimatedTokens < threshold) return messages;\n\n type Block = { type?: string; content?: unknown };\n let toolResultCount = 0;\n for (const msg of messages) {\n if (Array.isArray(msg.content)) {\n for (const block of msg.content as Block[]) {\n if (block.type === \"tool_result\") toolResultCount++;\n }\n }\n }\n\n if (toolResultCount <= keepRecent) return messages;\n\n const trimCount = toolResultCount - keepRecent;\n let trimmed = 0;\n\n return messages.map((msg) => {\n if (!Array.isArray(msg.content)) return msg;\n const content = (msg.content as Block[]).map((block) => {\n if (block.type === \"tool_result\" && trimmed < trimCount) {\n trimmed++;\n if (typeof block.content === \"string\") {\n return { ...block, content: \"[trimmed]\" };\n } else if (Array.isArray(block.content)) {\n return { ...block, content: [{ type: \"text\", text: \"[trimmed]\" }] };\n }\n }\n return block;\n });\n return { ...msg, content } as T;\n });\n}\n\n// ============================================================================\n// PROVIDER COMPACTION CLIENT\n// ============================================================================\n\nconst COMPACTION_TIMEOUT_MS = 30_000;\n\n/**\n * Request conversation compaction from the server (Haiku summarization).\n * Used by non-Anthropic providers (OpenAI, Gemini) that lack native compaction.\n * Returns summary string or null on failure (caller keeps unsummarized history).\n */\nexport async function requestProviderCompaction(opts: {\n proxyUrl: string;\n token: string;\n messages: object[];\n systemPrompt: string;\n}): Promise<string | null> {\n const { proxyUrl, token, messages, systemPrompt } = opts;\n\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), COMPACTION_TIMEOUT_MS);\n\n try {\n const response = await fetch(proxyUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({\n mode: \"compact\",\n messages,\n system_prompt: systemPrompt,\n }),\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n\n if (!response.ok) return null;\n\n const data = (await response.json()) as {\n success: boolean;\n compaction_content?: string;\n error?: string;\n };\n\n return data.success && data.compaction_content ? data.compaction_content : null;\n } finally {\n clearTimeout(timeout);\n }\n } catch {\n return null; // Graceful failure — caller keeps unsummarized history\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "whale-code",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.6.0",
|
|
4
4
|
"description": "whale code — local-first AI agent CLI for inventory, orders, and analytics powered by MCP",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -23,42 +23,44 @@
|
|
|
23
23
|
"postinstall": "chmod +x node_modules/node-pty/prebuilds/darwin-arm64/spawn-helper 2>/dev/null || true"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
+
"@alcalzone/ansi-tokenize": "^0.2.4",
|
|
26
27
|
"@anthropic-ai/sdk": "^0.74.0",
|
|
27
28
|
"@aws-sdk/client-bedrock-runtime": "^3.1000.0",
|
|
28
29
|
"@google/genai": "^1.41.0",
|
|
29
30
|
"@modelcontextprotocol/sdk": "^1.25.3",
|
|
31
|
+
"@napi-rs/canvas": "^0.1.97",
|
|
30
32
|
"@react-pdf/renderer": "^4.3.2",
|
|
31
33
|
"@supabase/supabase-js": "2.95.3",
|
|
32
|
-
"bonjour-service": "^1.3.0",
|
|
33
|
-
"chalk": "^5.6.2",
|
|
34
|
-
"diff": "^8.0.3",
|
|
35
|
-
"@alcalzone/ansi-tokenize": "^0.2.4",
|
|
36
34
|
"ansi-escapes": "^7.3.0",
|
|
37
35
|
"auto-bind": "^5.0.1",
|
|
36
|
+
"bonjour-service": "^1.3.0",
|
|
37
|
+
"chalk": "^5.6.2",
|
|
38
38
|
"cli-boxes": "^3.0.0",
|
|
39
39
|
"cli-cursor": "^4.0.0",
|
|
40
40
|
"cli-truncate": "^5.1.1",
|
|
41
41
|
"code-excerpt": "^4.0.0",
|
|
42
|
+
"diff": "^8.0.3",
|
|
42
43
|
"es-toolkit": "^1.39.10",
|
|
43
44
|
"indent-string": "^5.0.0",
|
|
44
45
|
"ink": "file:./vendor/ink",
|
|
45
|
-
"is-in-ci": "^2.0.0",
|
|
46
|
-
"patch-console": "^2.0.0",
|
|
47
|
-
"react-devtools-core": "^6.1.1",
|
|
48
|
-
"react-reconciler": "^0.33.0",
|
|
49
46
|
"ink-select-input": "^6.2.0",
|
|
50
47
|
"ink-text-input": "^6.0.0",
|
|
48
|
+
"is-in-ci": "^2.0.0",
|
|
51
49
|
"marked": "^15.0.12",
|
|
52
50
|
"marked-terminal": "^7.3.0",
|
|
53
51
|
"node-pty": "^1.1.0",
|
|
54
52
|
"openai": "^6.22.0",
|
|
53
|
+
"patch-console": "^2.0.0",
|
|
55
54
|
"pdf-parse": "^1.1.1",
|
|
55
|
+
"pdfjs-dist": "^5.5.207",
|
|
56
56
|
"pg": "^8.18.0",
|
|
57
57
|
"pino": "^10.3.1",
|
|
58
58
|
"playwright-core": "^1.58.2",
|
|
59
59
|
"qrcode": "^1.5.4",
|
|
60
60
|
"react": "^19.2.4",
|
|
61
|
+
"react-devtools-core": "^6.1.1",
|
|
61
62
|
"react-pdf-html": "^2.1.5",
|
|
63
|
+
"react-reconciler": "^0.33.0",
|
|
62
64
|
"scheduler": "^0.27.0",
|
|
63
65
|
"shiki": "^4.0.0",
|
|
64
66
|
"signal-exit": "^3.0.7",
|
|
@@ -66,8 +68,8 @@
|
|
|
66
68
|
"stack-utils": "^2.0.6",
|
|
67
69
|
"terminal-size": "^4.0.1",
|
|
68
70
|
"widest-line": "^6.0.0",
|
|
69
|
-
"yoga-layout": "~3.2.1",
|
|
70
71
|
"ws": "^8.19.0",
|
|
72
|
+
"yoga-layout": "~3.2.1",
|
|
71
73
|
"zod": "^4.3.6",
|
|
72
74
|
"zustand": "^5.0.11"
|
|
73
75
|
},
|
package/vendor/ink/build/ink.js
CHANGED
|
@@ -25,13 +25,18 @@ const noop = () => { };
|
|
|
25
25
|
/**
|
|
26
26
|
* Count the visual (wrapped) lines an output string occupies at a given terminal width.
|
|
27
27
|
* Accounts for ANSI escape codes via string-width and long-line wrapping.
|
|
28
|
+
* Ignores trailing empty line from trailing '\n' (matches log-update's visibleLineCount).
|
|
28
29
|
*/
|
|
29
30
|
function countVisualLines(output, termWidth) {
|
|
30
31
|
if (!output) return 0;
|
|
31
32
|
const lines = output.split('\n');
|
|
33
|
+
// A trailing '\n' produces an empty final element that doesn't occupy
|
|
34
|
+
// a visual row on screen — the cursor just moves to the next line.
|
|
35
|
+
// Exclude it so cursorUp() doesn't overshoot into static content.
|
|
36
|
+
const count = output.endsWith('\n') ? lines.length - 1 : lines.length;
|
|
32
37
|
let total = 0;
|
|
33
|
-
for (
|
|
34
|
-
const w = stringWidth(
|
|
38
|
+
for (let i = 0; i < count; i++) {
|
|
39
|
+
const w = stringWidth(lines[i]);
|
|
35
40
|
total += w === 0 ? 1 : Math.ceil(w / termWidth);
|
|
36
41
|
}
|
|
37
42
|
return total;
|
|
@@ -124,6 +129,7 @@ export default class Ink {
|
|
|
124
129
|
unsubscribeResize;
|
|
125
130
|
throttledOnRender;
|
|
126
131
|
hasPendingThrottledRender = false;
|
|
132
|
+
lastWasFullscreen = false;
|
|
127
133
|
kittyProtocolEnabled = false;
|
|
128
134
|
cancelKittyDetection;
|
|
129
135
|
constructor(options) {
|
|
@@ -219,39 +225,31 @@ export default class Ink {
|
|
|
219
225
|
return size?.columns ?? 80;
|
|
220
226
|
};
|
|
221
227
|
resized = () => {
|
|
222
|
-
const currentWidth = this.getTerminalWidth();
|
|
223
|
-
// Re-layout at new width
|
|
224
228
|
this.calculateLayout();
|
|
225
229
|
const { output, outputHeight, staticOutput } = render(this.rootNode, this.isScreenReaderEnabled);
|
|
226
230
|
const hasStaticOutput = staticOutput && staticOutput !== '\n';
|
|
227
231
|
if (hasStaticOutput) {
|
|
228
232
|
this.fullStaticOutput += staticOutput;
|
|
229
233
|
}
|
|
230
|
-
// Terminal reflow during resize makes line-count-based erasure unreliable.
|
|
231
|
-
// Erase generously: use the full visible terminal height as upper bound.
|
|
232
|
-
// This clears any ghost lines from reflow without touching scrollback.
|
|
233
234
|
const rows = this.options.stdout.rows || 24;
|
|
234
|
-
const safeErase = Math.max(rows, this.lastOutputHeight + 2);
|
|
235
235
|
const isFullscreen = this.options.stdout.isTTY && outputHeight >= rows;
|
|
236
236
|
const outputToRender = isFullscreen ? output : output + '\n';
|
|
237
|
+
// After resize, terminal reflow makes cursor position and line counts
|
|
238
|
+
// unpredictable. The only reliable approach: clear everything and
|
|
239
|
+
// rewrite from scratch. fullStaticOutput contains the entire
|
|
240
|
+
// conversation history, so the user sees zero content loss.
|
|
237
241
|
const sync = shouldSynchronize(this.options.stdout);
|
|
238
242
|
if (sync) this.options.stdout.write(bsu);
|
|
239
|
-
// Clear via log-update first to reset its tracking, then erase any
|
|
240
|
-
// remaining ghost lines that log-update didn't know about.
|
|
241
|
-
this.log.clear();
|
|
242
243
|
this.options.stdout.write(
|
|
243
|
-
ansiEscapes.
|
|
244
|
-
|
|
244
|
+
ansiEscapes.clearTerminal +
|
|
245
|
+
this.fullStaticOutput +
|
|
245
246
|
outputToRender
|
|
246
247
|
);
|
|
247
248
|
if (sync) this.options.stdout.write(esu);
|
|
248
249
|
this.lastOutput = output;
|
|
249
250
|
this.lastOutputToRender = outputToRender;
|
|
250
251
|
this.lastOutputHeight = outputHeight;
|
|
251
|
-
|
|
252
|
-
const newVisualLines = countVisualLines(outputToRender, currentWidth);
|
|
253
|
-
this.log.sync(outputToRender, newVisualLines);
|
|
254
|
-
this.lastTerminalWidth = currentWidth;
|
|
252
|
+
this.log.sync(outputToRender);
|
|
255
253
|
};
|
|
256
254
|
resolveExitPromise = () => { };
|
|
257
255
|
rejectExitPromise = () => { };
|
|
@@ -359,21 +357,67 @@ export default class Ink {
|
|
|
359
357
|
// Only apply when writing to a real TTY — piped output always gets trailing newlines.
|
|
360
358
|
const isFullscreen = this.options.stdout.isTTY && outputHeight >= this.options.stdout.rows;
|
|
361
359
|
const outputToRender = isFullscreen ? output : output + '\n';
|
|
362
|
-
|
|
360
|
+
// ── Fullscreen handling ──
|
|
361
|
+
// When the live area fills/exceeds the terminal, log-update's cursor
|
|
362
|
+
// math breaks (can't reach scrolled-off lines). Two modes:
|
|
363
|
+
//
|
|
364
|
+
// Sustained fullscreen: move cursor to home and overwrite the screen
|
|
365
|
+
// in place with the live area. No clearTerminal (causes flash), no
|
|
366
|
+
// eraseLines (destroys visible static content). Static content that
|
|
367
|
+
// was pushed to scrollback by the transition frame stays untouched.
|
|
368
|
+
// \x1b[J erases any leftover lines if the output shrinks.
|
|
369
|
+
//
|
|
370
|
+
// Transition OUT: clearTerminal + fullStaticOutput to restore the
|
|
371
|
+
// conversation onto the visible screen.
|
|
372
|
+
if (isFullscreen) {
|
|
373
|
+
if (output === this.lastOutput && !hasStaticOutput) {
|
|
374
|
+
this.lastWasFullscreen = true;
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
363
377
|
const sync = shouldSynchronize(this.options.stdout);
|
|
364
|
-
if (sync)
|
|
365
|
-
|
|
378
|
+
if (sync) this.options.stdout.write(bsu);
|
|
379
|
+
if (!this.lastWasFullscreen) {
|
|
380
|
+
// Entering fullscreen: full rewrite to push static to scrollback
|
|
381
|
+
this.options.stdout.write(
|
|
382
|
+
ansiEscapes.clearTerminal +
|
|
383
|
+
this.fullStaticOutput +
|
|
384
|
+
outputToRender
|
|
385
|
+
);
|
|
386
|
+
} else {
|
|
387
|
+
// Sustained: cursor home, overwrite live area, erase remainder
|
|
388
|
+
this.options.stdout.write(
|
|
389
|
+
'\x1b[H' +
|
|
390
|
+
(hasStaticOutput ? staticOutput : '') +
|
|
391
|
+
outputToRender +
|
|
392
|
+
'\x1b[J'
|
|
393
|
+
);
|
|
366
394
|
}
|
|
367
|
-
this.options.stdout.write(ansiEscapes.clearTerminal + this.fullStaticOutput + output);
|
|
368
395
|
this.lastOutput = output;
|
|
369
396
|
this.lastOutputToRender = outputToRender;
|
|
370
397
|
this.lastOutputHeight = outputHeight;
|
|
398
|
+
this.lastWasFullscreen = true;
|
|
371
399
|
this.log.sync(outputToRender);
|
|
372
|
-
if (sync)
|
|
373
|
-
|
|
374
|
-
|
|
400
|
+
if (sync) this.options.stdout.write(esu);
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
if (this.lastWasFullscreen) {
|
|
404
|
+
// Exiting fullscreen: restore static content to visible screen
|
|
405
|
+
this.lastWasFullscreen = false;
|
|
406
|
+
const sync = shouldSynchronize(this.options.stdout);
|
|
407
|
+
if (sync) this.options.stdout.write(bsu);
|
|
408
|
+
this.options.stdout.write(
|
|
409
|
+
ansiEscapes.clearTerminal +
|
|
410
|
+
this.fullStaticOutput +
|
|
411
|
+
outputToRender
|
|
412
|
+
);
|
|
413
|
+
this.lastOutput = output;
|
|
414
|
+
this.lastOutputToRender = outputToRender;
|
|
415
|
+
this.lastOutputHeight = outputHeight;
|
|
416
|
+
this.log.sync(outputToRender);
|
|
417
|
+
if (sync) this.options.stdout.write(esu);
|
|
375
418
|
return;
|
|
376
419
|
}
|
|
420
|
+
// ── Normal (non-fullscreen) rendering ──
|
|
377
421
|
// To ensure static output is cleanly rendered before main output, clear main output first
|
|
378
422
|
if (hasStaticOutput) {
|
|
379
423
|
const sync = shouldSynchronize(this.options.stdout);
|