whale-code 6.5.11 → 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/services/agent-loop-tools.js +10 -1
- package/dist/cli/services/agent-loop-tools.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.js +4 -3
- 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/shared/SpinnerSlot.js +4 -1
- package/dist/cli/shared/SpinnerSlot.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/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
|
@@ -35,13 +35,13 @@ export function useAgentLoop(deps) {
|
|
|
35
35
|
clearTimeout(flushTimerRef.current);
|
|
36
36
|
flushTimerRef.current = null;
|
|
37
37
|
}
|
|
38
|
-
|
|
38
|
+
|
|
39
|
+
// Atomic: add user message + reset streaming state + set isStreaming in one render
|
|
40
|
+
store.getState().startStreaming({
|
|
39
41
|
role: "user",
|
|
40
42
|
text: userMessage,
|
|
41
43
|
images: images?.map(img => img.name)
|
|
42
44
|
});
|
|
43
|
-
store.getState().resetStreamingState();
|
|
44
|
-
store.getState().setIsStreaming(true);
|
|
45
45
|
thinkingChunksRef.current = 0;
|
|
46
46
|
thinkingDoneRef.current = false;
|
|
47
47
|
const abort = new AbortController();
|
|
@@ -83,52 +83,60 @@ export function useAgentLoop(deps) {
|
|
|
83
83
|
}
|
|
84
84
|
function flushAll() {
|
|
85
85
|
flushTimerRef.current = null;
|
|
86
|
-
|
|
86
|
+
// Batch ALL dirty fields into a single store update.
|
|
87
|
+
// Prevents intermediate renders with inconsistent state
|
|
88
|
+
// (e.g., new text but old tools) that cause visual glitching.
|
|
89
|
+
const patch = {};
|
|
87
90
|
if (dirty.text) {
|
|
88
|
-
|
|
91
|
+
patch.streamingText = accTextRef.current;
|
|
89
92
|
dirty.text = false;
|
|
90
93
|
}
|
|
91
94
|
if (dirty.thinking) {
|
|
92
|
-
|
|
95
|
+
patch.thinkingText = thinkingBuffer.value;
|
|
93
96
|
dirty.thinking = false;
|
|
94
97
|
}
|
|
95
98
|
if (dirty.tools) {
|
|
96
|
-
|
|
99
|
+
patch.activeTools = [...toolCalls];
|
|
97
100
|
dirty.tools = false;
|
|
98
101
|
}
|
|
99
102
|
if (dirty.team) {
|
|
100
|
-
|
|
103
|
+
patch.teamState = {
|
|
101
104
|
name: team.teamName,
|
|
102
105
|
tasksCompleted: team.teamCompleted,
|
|
103
106
|
tasksTotal: team.teamTotal,
|
|
104
107
|
teammates: new Map(teammateStatus)
|
|
105
|
-
}
|
|
108
|
+
};
|
|
106
109
|
dirty.team = false;
|
|
107
110
|
}
|
|
108
111
|
if (dirty.subagents) {
|
|
109
|
-
|
|
110
|
-
if (pendingCompleted.length > 0) s.setCompletedSubagents(prev => [...prev, ...pendingCompleted.splice(0)]);
|
|
112
|
+
patch.subagentActivity = new Map(subagentMap);
|
|
111
113
|
dirty.subagents = false;
|
|
112
114
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
115
|
+
// Messages and completedSubagents need current state for appending
|
|
116
|
+
const needsMessages = dirty.messages && pendingToolMsgs.length > 0;
|
|
117
|
+
const needsCompleted = pendingCompleted.length > 0;
|
|
118
|
+
if (needsMessages || needsCompleted) {
|
|
119
|
+
const msgBatch = needsMessages ? pendingToolMsgs.splice(0) : [];
|
|
120
|
+
const completedBatch = needsCompleted ? pendingCompleted.splice(0) : [];
|
|
121
|
+
store.setState(s => ({
|
|
122
|
+
...patch,
|
|
123
|
+
messages: msgBatch.length > 0 ? [...s.messages, ...msgBatch] : s.messages,
|
|
124
|
+
completedSubagents: completedBatch.length > 0 ? [...s.completedSubagents, ...completedBatch] : s.completedSubagents
|
|
125
|
+
}));
|
|
126
|
+
} else if (Object.keys(patch).length > 0) {
|
|
127
|
+
store.setState(patch);
|
|
117
128
|
}
|
|
129
|
+
dirty.messages = false;
|
|
118
130
|
lastContentUpdateRef.current = Date.now();
|
|
119
131
|
}
|
|
120
132
|
const flushText = () => {
|
|
121
|
-
const s_0 = store.getState();
|
|
122
133
|
const text = accTextRef.current;
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
}]);
|
|
134
|
+
// Atomic: commit text to messages + clear streaming/thinking in one update
|
|
135
|
+
// Prevents intermediate render showing text in both Static and LiveArea
|
|
136
|
+
store.getState().commitStreamingText(text);
|
|
127
137
|
accTextRef.current = "";
|
|
128
138
|
dirty.text = false;
|
|
129
|
-
s_0.setStreamingText("");
|
|
130
139
|
thinkingBuffer.value = "";
|
|
131
|
-
s_0.setThinkingText("");
|
|
132
140
|
};
|
|
133
141
|
const emitter = new AgentEventEmitter();
|
|
134
142
|
const thinkingRefs = {
|
|
@@ -272,31 +280,31 @@ export function useAgentLoop(deps) {
|
|
|
272
280
|
flushAll();
|
|
273
281
|
|
|
274
282
|
// Collect all pending messages into a single batch
|
|
275
|
-
const
|
|
276
|
-
if (pendingToolMsgs.length > 0)
|
|
283
|
+
const batch_0 = [];
|
|
284
|
+
if (pendingToolMsgs.length > 0) batch_0.push(...pendingToolMsgs.splice(0));
|
|
277
285
|
const allCompleted = [...store.getState().completedSubagents, ...pendingCompleted.splice(0)];
|
|
278
|
-
if (allCompleted.length > 0)
|
|
286
|
+
if (allCompleted.length > 0) batch_0.push({
|
|
279
287
|
role: "assistant",
|
|
280
288
|
text: "",
|
|
281
289
|
completedSubagents: allCompleted
|
|
282
290
|
});
|
|
283
291
|
const finalText = accTextRef.current;
|
|
284
|
-
if (finalText.trim() || usage)
|
|
292
|
+
if (finalText.trim() || usage) batch_0.push({
|
|
285
293
|
role: "assistant",
|
|
286
294
|
text: finalText,
|
|
287
295
|
usage
|
|
288
296
|
});
|
|
289
297
|
|
|
290
298
|
// Atomic update — commit messages + reset streaming + set isStreaming=false in one render
|
|
291
|
-
store.getState().finishStreaming(
|
|
299
|
+
store.getState().finishStreaming(batch_0);
|
|
292
300
|
|
|
293
301
|
// Rewind checkpoint (no-op on messages, just tracks state)
|
|
294
|
-
store.getState().setMessages(
|
|
302
|
+
store.getState().setMessages(prev => {
|
|
295
303
|
const fileChanges = rewindManagerRef.current.getCurrentFileChanges();
|
|
296
|
-
rewindManagerRef.current.addCheckpoint(turnIndexRef.current,
|
|
304
|
+
rewindManagerRef.current.addCheckpoint(turnIndexRef.current, prev.length, finalText.trim() || "(tool-only turn)", fileChanges);
|
|
297
305
|
rewindManagerRef.current.commitTurn();
|
|
298
306
|
turnIndexRef.current++;
|
|
299
|
-
return
|
|
307
|
+
return prev;
|
|
300
308
|
});
|
|
301
309
|
abortRef.current = null;
|
|
302
310
|
conversationRef.current = finalMessages;
|
|
@@ -318,13 +326,13 @@ export function useAgentLoop(deps) {
|
|
|
318
326
|
team.teamCompleted = 0;
|
|
319
327
|
teammateStatus.clear();
|
|
320
328
|
flushAll();
|
|
321
|
-
const
|
|
322
|
-
if (pendingToolMsgs.length > 0)
|
|
323
|
-
if (err !== "Cancelled")
|
|
329
|
+
const batch_1 = [];
|
|
330
|
+
if (pendingToolMsgs.length > 0) batch_1.push(...pendingToolMsgs.splice(0));
|
|
331
|
+
if (err !== "Cancelled") batch_1.push({
|
|
324
332
|
role: "assistant",
|
|
325
333
|
text: `\x1b[31m\u2718 Error: ${err}\x1b[0m`
|
|
326
334
|
});
|
|
327
|
-
store.getState().finishStreaming(
|
|
335
|
+
store.getState().finishStreaming(batch_1);
|
|
328
336
|
abortRef.current = null;
|
|
329
337
|
if (partialMessages && partialMessages.length > 0) conversationRef.current = partialMessages;
|
|
330
338
|
}
|
|
@@ -342,12 +350,12 @@ export function useAgentLoop(deps) {
|
|
|
342
350
|
teammateStatus.clear();
|
|
343
351
|
flushAll();
|
|
344
352
|
const errMsg = e_13 instanceof Error ? e_13.message : String(e_13);
|
|
345
|
-
const
|
|
346
|
-
if (errMsg !== "Cancelled")
|
|
353
|
+
const batch = [];
|
|
354
|
+
if (errMsg !== "Cancelled") batch.push({
|
|
347
355
|
role: "assistant",
|
|
348
356
|
text: `\x1b[31m\u2718 Error: ${errMsg}\x1b[0m`
|
|
349
357
|
});
|
|
350
|
-
store.getState().finishStreaming(
|
|
358
|
+
store.getState().finishStreaming(batch);
|
|
351
359
|
abortRef.current = null;
|
|
352
360
|
}
|
|
353
361
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAgentLoop.js","names":["useRef","runAgentLoop","AgentEventEmitter","saveSession","listBackups","getChatStore","handleThinking","handleText","handleToolOutput","handleToolProgress","handleTeamStart","handleTeamTask","handleTeamProgress","handleTeamDone","handleSubagentStart","handleSubagentProgress","handleSubagentToolStart","handleSubagentToolEnd","handleSubagentDone","handleDone","useAgentLoop","deps","conversationRef","abortRef","accTextRef","lastContentUpdateRef","thinkingChunksRef","thinkingDoneRef","rewindManagerRef","turnIndexRef","flushTimerRef","handleSend","userMessage","images","store","isStreaming","thinkingEnabled","getState","current","clearTimeout","addMessage","role","text","map","img","name","resetStreamingState","setIsStreaming","abort","AbortController","toolCalls","usage","dirty","tools","team","subagents","messages","thinking","thinkingBuffer","value","subagentMap","Map","pendingCompleted","pendingToolMsgs","teamName","teamTotal","teamCompleted","teammateStatus","markDirty","field","setTimeout","flushAll","cancelFlush","s","setStreamingText","setThinkingText","setActiveTools","setTeamState","tasksCompleted","tasksTotal","teammates","setSubagentActivity","length","setCompletedSubagents","prev","splice","batch","setMessages","Date","now","flushText","trim","emitter","thinkingRefs","eventCtx","EVENT_HANDLERS","e","tool_output","tool_progress","team_start","team_task","team_progress","team_done","v","subagent_start","subagent_progress","subagent_tool_start","subagent_tool_end","subagent_done","done","unsub","onEvent","event","type","message","base64","mediaType","conversationHistory","abortSignal","signal","callbacks","onText","onToolStart","input","idx","findIndex","t","status","push","onToolResult","success","result","durationMs","completedTool","JSON","stringify","FILE_TOOLS","includes","filePath","file_path","backups","fileName","split","pop","backup","find","b","endsWith","trackFileChange","backupPath","path","operation","isNewFile","onUsage","input_tokens","output_tokens","thinking_tokens","model","costUsd","cacheReadTokens","cacheCreationTokens","cache_read_tokens","cache_creation_tokens","onAutoCompact","before","after","tokensSaved","toFixed","onDone","finalMessages","destroy","clear","allCompleted","completedSubagents","finalText","finishStreaming","fileChanges","getCurrentFileChanges","addCheckpoint","commitTurn","sid","sessionId","onError","err","partialMessages","errMsg","Error","String"],"sources":["../../../../src/cli/chat/hooks/useAgentLoop.ts"],"sourcesContent":["/**\n * useAgentLoop — agent loop runner extracted from ChatApp\n *\n * Uses Zustand store for all state updates.\n * Event handlers extracted to agent-loop-events.ts.\n */\n\nimport { useRef } from \"react\";\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport { runAgentLoop } from \"../../services/agent-loop.js\";\nimport { AgentEventEmitter, type AgentEvent } from \"../../services/agent-events.js\";\nimport { RewindManager } from \"../../services/rewind.js\";\nimport { saveSession } from \"../../services/session-persistence.js\";\nimport { listBackups } from \"../../services/file-history.js\";\nimport type { ChatMessage, ToolCall } from \"../MessageList.js\";\nimport type { SubagentActivityState, CompletedSubagentInfo } from \"../SubagentPanel.js\";\nimport type { ImageAttachment } from \"../ChatInput.js\";\nimport { getChatStore } from \"../store.js\";\nimport {\n type EventCtx, type TeamRefs, type ThinkingRefs,\n handleThinking, handleText, handleToolOutput, handleToolProgress,\n handleTeamStart, handleTeamTask, handleTeamProgress, handleTeamDone,\n handleSubagentStart, handleSubagentProgress, handleSubagentToolStart,\n handleSubagentToolEnd, handleSubagentDone, handleDone,\n} from \"./agent-loop-events.js\";\n\nexport interface AgentLoopDeps {\n conversationRef: React.MutableRefObject<Anthropic.MessageParam[]>;\n abortRef: React.MutableRefObject<AbortController | null>;\n accTextRef: React.MutableRefObject<string>;\n lastContentUpdateRef: React.MutableRefObject<number>;\n thinkingChunksRef: React.MutableRefObject<number>;\n thinkingDoneRef: React.MutableRefObject<boolean>;\n rewindManagerRef: React.MutableRefObject<RewindManager>;\n turnIndexRef: React.MutableRefObject<number>;\n}\n\nexport function useAgentLoop(deps: AgentLoopDeps) {\n const {\n conversationRef, abortRef,\n accTextRef, lastContentUpdateRef, thinkingChunksRef, thinkingDoneRef,\n rewindManagerRef, turnIndexRef,\n } = deps;\n\n const flushTimerRef = useRef<NodeJS.Timeout | null>(null);\n\n const handleSend = async (userMessage: string, images?: ImageAttachment[]) => {\n const store = getChatStore();\n const { isStreaming, thinkingEnabled } = store.getState();\n if (isStreaming) return;\n\n if (flushTimerRef.current) {\n clearTimeout(flushTimerRef.current);\n flushTimerRef.current = null;\n }\n\n store.getState().addMessage({ role: \"user\", text: userMessage, images: images?.map(img => img.name) });\n store.getState().resetStreamingState();\n store.getState().setIsStreaming(true);\n thinkingChunksRef.current = 0;\n thinkingDoneRef.current = false;\n\n const abort = new AbortController();\n abortRef.current = abort;\n accTextRef.current = \"\";\n const toolCalls: ToolCall[] = [];\n let usage: ChatMessage[\"usage\"];\n\n // Render batching\n const dirty = { text: false, tools: false, team: false, subagents: false, messages: false, thinking: false };\n const thinkingBuffer = { value: \"\" };\n const subagentMap = new Map<string, SubagentActivityState>();\n const pendingCompleted: CompletedSubagentInfo[] = [];\n const pendingToolMsgs: ChatMessage[] = [];\n const team: TeamRefs = { teamName: \"\", teamTotal: 0, teamCompleted: 0 };\n const teammateStatus = new Map<string, { name: string; status: string; startTime: number }>();\n\n function markDirty(field: keyof typeof dirty) {\n dirty[field] = true;\n if (!flushTimerRef.current) flushTimerRef.current = setTimeout(flushAll, 200);\n }\n\n function cancelFlush() {\n if (flushTimerRef.current) { clearTimeout(flushTimerRef.current); flushTimerRef.current = null; }\n }\n\n function flushAll() {\n flushTimerRef.current = null;\n const s = store.getState();\n if (dirty.text) { s.setStreamingText(accTextRef.current); dirty.text = false; }\n if (dirty.thinking) { s.setThinkingText(thinkingBuffer.value); dirty.thinking = false; }\n if (dirty.tools) { s.setActiveTools([...toolCalls]); dirty.tools = false; }\n if (dirty.team) {\n s.setTeamState({ name: team.teamName, tasksCompleted: team.teamCompleted, tasksTotal: team.teamTotal, teammates: new Map(teammateStatus) });\n dirty.team = false;\n }\n if (dirty.subagents) {\n s.setSubagentActivity(new Map(subagentMap));\n if (pendingCompleted.length > 0) s.setCompletedSubagents(prev => [...prev, ...pendingCompleted.splice(0)]);\n dirty.subagents = false;\n }\n if (dirty.messages) {\n const batch = pendingToolMsgs.splice(0);\n if (batch.length > 0) s.setMessages(prev => [...prev, ...batch]);\n dirty.messages = false;\n }\n lastContentUpdateRef.current = Date.now();\n }\n\n const flushText = () => {\n const s = store.getState();\n const text = accTextRef.current;\n if (text.trim()) s.setMessages(prev => [...prev, { role: \"assistant\" as const, text }]);\n accTextRef.current = \"\";\n dirty.text = false;\n s.setStreamingText(\"\");\n thinkingBuffer.value = \"\";\n s.setThinkingText(\"\");\n };\n\n const emitter = new AgentEventEmitter();\n const thinkingRefs: ThinkingRefs = { thinkingChunksRef, thinkingDoneRef, thinkingBuffer, accTextRef };\n const eventCtx: EventCtx = { markDirty, cancelFlush, flushAll, toolCalls, subagentMap, pendingCompleted, teammateStatus };\n\n const EVENT_HANDLERS: Record<string, (event: any) => void> = {\n thinking: (e) => handleThinking(e, eventCtx, thinkingRefs),\n text: (e) => handleText(e, eventCtx, thinkingRefs),\n tool_output: (e) => handleToolOutput(e, eventCtx),\n tool_progress: (e) => handleToolProgress(e, eventCtx),\n team_start: (e) => handleTeamStart(e, eventCtx, team),\n team_task: (e) => handleTeamTask(e, eventCtx, team),\n team_progress: (e) => handleTeamProgress(e, eventCtx),\n team_done: (e) => handleTeamDone(e, eventCtx, team, accTextRef, (v) => store.getState().setTeamState(v), (v) => store.getState().setStreamingText(v)),\n subagent_start: (e) => handleSubagentStart(e, eventCtx),\n subagent_progress: (e) => handleSubagentProgress(e, eventCtx),\n subagent_tool_start: (e) => handleSubagentToolStart(e, eventCtx),\n subagent_tool_end: (e) => handleSubagentToolEnd(e, eventCtx),\n subagent_done: (e) => handleSubagentDone(e, eventCtx),\n done: (e) => handleDone(e, eventCtx, accTextRef),\n };\n\n const unsub = emitter.onEvent((event: AgentEvent) => { EVENT_HANDLERS[event.type]?.(event); });\n\n try {\n await runAgentLoop({\n message: userMessage,\n images: images?.map(img => ({ base64: img.base64, mediaType: img.mediaType })),\n conversationHistory: conversationRef.current,\n abortSignal: abort.signal,\n emitter,\n thinking: thinkingEnabled,\n callbacks: {\n onText: () => {},\n onToolStart: (name, input) => {\n if (input) {\n const idx = toolCalls.findIndex(t => t.name === name && t.status === \"running\" && !t.input);\n if (idx >= 0) { toolCalls[idx].input = input; } else { toolCalls.push({ name, status: \"running\", input }); }\n markDirty(\"tools\");\n lastContentUpdateRef.current = Date.now();\n return;\n }\n flushText();\n toolCalls.push({ name, status: \"running\" });\n markDirty(\"tools\");\n lastContentUpdateRef.current = Date.now();\n },\n onToolResult: (name, success, result, input, durationMs) => {\n const completedTool: ToolCall = { name, status: success ? \"success\" : \"error\", result: typeof result === \"string\" ? result : JSON.stringify(result), input, durationMs };\n const idx = toolCalls.findIndex((t) => t.name === name && t.status === \"running\");\n if (idx >= 0) toolCalls.splice(idx, 1);\n\n if (success && input) {\n const FILE_TOOLS = [\"write_file\", \"edit_file\", \"multi_edit\"];\n if (FILE_TOOLS.includes(name)) {\n try {\n const filePath = (input as Record<string, unknown>).file_path as string | undefined;\n if (filePath) {\n const backups = listBackups();\n const fileName = filePath.split(\"/\").pop() || \"\";\n const backup = backups.find(b => b.name.endsWith(`-${fileName}`));\n rewindManagerRef.current.trackFileChange({\n filePath, backupPath: backup?.path || \"\",\n operation: name === \"write_file\" ? \"write\" : name === \"edit_file\" ? \"edit\" : \"multi_edit\",\n isNewFile: !backup,\n });\n }\n } catch { /* best effort */ }\n }\n }\n\n pendingToolMsgs.push({ role: \"assistant\" as const, text: \"\", toolCalls: [completedTool] });\n markDirty(\"messages\"); markDirty(\"tools\");\n accTextRef.current = \"\"; markDirty(\"text\");\n lastContentUpdateRef.current = Date.now();\n },\n onUsage: (input_tokens, output_tokens, thinking_tokens, model, costUsd, cacheReadTokens, cacheCreationTokens) => {\n usage = { input_tokens, output_tokens, thinking_tokens, model, costUsd, cache_read_tokens: cacheReadTokens, cache_creation_tokens: cacheCreationTokens };\n },\n onAutoCompact: (before, after, tokensSaved) => {\n pendingToolMsgs.push({ role: \"assistant\" as const, text: ` Context auto-compacted: ${before} messages -> ${after} messages (~${(tokensSaved / 1000).toFixed(0)}K tokens freed)` });\n markDirty(\"messages\");\n },\n onDone: (finalMessages) => {\n unsub(); emitter.destroy(); cancelFlush();\n // Clear team refs before flush so dirty.team won't re-create stale state\n team.teamName = \"\"; team.teamTotal = 0; team.teamCompleted = 0; teammateStatus.clear();\n flushAll();\n\n // Collect all pending messages into a single batch\n const batch: ChatMessage[] = [];\n if (pendingToolMsgs.length > 0) batch.push(...pendingToolMsgs.splice(0));\n const allCompleted = [...store.getState().completedSubagents, ...pendingCompleted.splice(0)];\n if (allCompleted.length > 0) batch.push({ role: \"assistant\" as const, text: \"\", completedSubagents: allCompleted });\n const finalText = accTextRef.current;\n if (finalText.trim() || usage) batch.push({ role: \"assistant\" as const, text: finalText, usage });\n\n // Atomic update — commit messages + reset streaming + set isStreaming=false in one render\n store.getState().finishStreaming(batch);\n\n // Rewind checkpoint (no-op on messages, just tracks state)\n store.getState().setMessages(prev => {\n const fileChanges = rewindManagerRef.current.getCurrentFileChanges();\n rewindManagerRef.current.addCheckpoint(turnIndexRef.current, prev.length, finalText.trim() || \"(tool-only turn)\", fileChanges);\n rewindManagerRef.current.commitTurn();\n turnIndexRef.current++;\n return prev;\n });\n abortRef.current = null;\n conversationRef.current = finalMessages;\n\n // Auto-save session to disk after each turn — prevents data loss\n // if the CLI is killed or crashes. Uses the store's sessionId if set\n // (from /save or /resume), otherwise creates a rolling \"current\" session.\n try {\n const sid = store.getState().sessionId || \"current\";\n saveSession(finalMessages, sid);\n } catch { /* best effort — don't block UI */ }\n },\n onError: (err, partialMessages) => {\n unsub(); emitter.destroy(); cancelFlush();\n team.teamName = \"\"; team.teamTotal = 0; team.teamCompleted = 0; teammateStatus.clear();\n flushAll();\n const batch: ChatMessage[] = [];\n if (pendingToolMsgs.length > 0) batch.push(...pendingToolMsgs.splice(0));\n if (err !== \"Cancelled\") batch.push({ role: \"assistant\", text: `\\x1b[31m\\u2718 Error: ${err}\\x1b[0m` });\n store.getState().finishStreaming(batch);\n abortRef.current = null;\n if (partialMessages && partialMessages.length > 0) conversationRef.current = partialMessages;\n },\n },\n });\n } catch (e) {\n // Ensure streaming state is always cleaned up — even if runAgentLoop\n // throws before reaching onDone/onError callbacks\n unsub(); emitter.destroy(); cancelFlush();\n team.teamName = \"\"; team.teamTotal = 0; team.teamCompleted = 0; teammateStatus.clear();\n flushAll();\n const errMsg = e instanceof Error ? e.message : String(e);\n const batch: ChatMessage[] = [];\n if (errMsg !== \"Cancelled\") batch.push({ role: \"assistant\", text: `\\x1b[31m\\u2718 Error: ${errMsg}\\x1b[0m` });\n store.getState().finishStreaming(batch);\n abortRef.current = null;\n }\n };\n\n return { handleSend };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"useAgentLoop.js","names":["useRef","runAgentLoop","AgentEventEmitter","saveSession","listBackups","getChatStore","handleThinking","handleText","handleToolOutput","handleToolProgress","handleTeamStart","handleTeamTask","handleTeamProgress","handleTeamDone","handleSubagentStart","handleSubagentProgress","handleSubagentToolStart","handleSubagentToolEnd","handleSubagentDone","handleDone","useAgentLoop","deps","conversationRef","abortRef","accTextRef","lastContentUpdateRef","thinkingChunksRef","thinkingDoneRef","rewindManagerRef","turnIndexRef","flushTimerRef","handleSend","userMessage","images","store","isStreaming","thinkingEnabled","getState","current","clearTimeout","startStreaming","role","text","map","img","name","abort","AbortController","toolCalls","usage","dirty","tools","team","subagents","messages","thinking","thinkingBuffer","value","subagentMap","Map","pendingCompleted","pendingToolMsgs","teamName","teamTotal","teamCompleted","teammateStatus","markDirty","field","setTimeout","flushAll","cancelFlush","patch","streamingText","thinkingText","activeTools","teamState","tasksCompleted","tasksTotal","teammates","subagentActivity","needsMessages","length","needsCompleted","msgBatch","splice","completedBatch","setState","s","completedSubagents","Object","keys","Date","now","flushText","commitStreamingText","emitter","thinkingRefs","eventCtx","EVENT_HANDLERS","e","tool_output","tool_progress","team_start","team_task","team_progress","team_done","v","setTeamState","setStreamingText","subagent_start","subagent_progress","subagent_tool_start","subagent_tool_end","subagent_done","done","unsub","onEvent","event","type","message","base64","mediaType","conversationHistory","abortSignal","signal","callbacks","onText","onToolStart","input","idx","findIndex","t","status","push","onToolResult","success","result","durationMs","completedTool","JSON","stringify","FILE_TOOLS","includes","filePath","file_path","backups","fileName","split","pop","backup","find","b","endsWith","trackFileChange","backupPath","path","operation","isNewFile","onUsage","input_tokens","output_tokens","thinking_tokens","model","costUsd","cacheReadTokens","cacheCreationTokens","cache_read_tokens","cache_creation_tokens","onAutoCompact","before","after","tokensSaved","toFixed","onDone","finalMessages","destroy","clear","batch","allCompleted","finalText","trim","finishStreaming","setMessages","prev","fileChanges","getCurrentFileChanges","addCheckpoint","commitTurn","sid","sessionId","onError","err","partialMessages","errMsg","Error","String"],"sources":["../../../../src/cli/chat/hooks/useAgentLoop.ts"],"sourcesContent":["/**\n * useAgentLoop — agent loop runner extracted from ChatApp\n *\n * Uses Zustand store for all state updates.\n * Event handlers extracted to agent-loop-events.ts.\n */\n\nimport { useRef } from \"react\";\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport { runAgentLoop } from \"../../services/agent-loop.js\";\nimport { AgentEventEmitter, type AgentEvent } from \"../../services/agent-events.js\";\nimport { RewindManager } from \"../../services/rewind.js\";\nimport { saveSession } from \"../../services/session-persistence.js\";\nimport { listBackups } from \"../../services/file-history.js\";\nimport type { ChatMessage, ToolCall } from \"../MessageList.js\";\nimport type { SubagentActivityState, CompletedSubagentInfo } from \"../SubagentPanel.js\";\nimport type { ImageAttachment } from \"../ChatInput.js\";\nimport { getChatStore } from \"../store.js\";\nimport {\n type EventCtx, type TeamRefs, type ThinkingRefs,\n handleThinking, handleText, handleToolOutput, handleToolProgress,\n handleTeamStart, handleTeamTask, handleTeamProgress, handleTeamDone,\n handleSubagentStart, handleSubagentProgress, handleSubagentToolStart,\n handleSubagentToolEnd, handleSubagentDone, handleDone,\n} from \"./agent-loop-events.js\";\n\nexport interface AgentLoopDeps {\n conversationRef: React.MutableRefObject<Anthropic.MessageParam[]>;\n abortRef: React.MutableRefObject<AbortController | null>;\n accTextRef: React.MutableRefObject<string>;\n lastContentUpdateRef: React.MutableRefObject<number>;\n thinkingChunksRef: React.MutableRefObject<number>;\n thinkingDoneRef: React.MutableRefObject<boolean>;\n rewindManagerRef: React.MutableRefObject<RewindManager>;\n turnIndexRef: React.MutableRefObject<number>;\n}\n\nexport function useAgentLoop(deps: AgentLoopDeps) {\n const {\n conversationRef, abortRef,\n accTextRef, lastContentUpdateRef, thinkingChunksRef, thinkingDoneRef,\n rewindManagerRef, turnIndexRef,\n } = deps;\n\n const flushTimerRef = useRef<NodeJS.Timeout | null>(null);\n\n const handleSend = async (userMessage: string, images?: ImageAttachment[]) => {\n const store = getChatStore();\n const { isStreaming, thinkingEnabled } = store.getState();\n if (isStreaming) return;\n\n if (flushTimerRef.current) {\n clearTimeout(flushTimerRef.current);\n flushTimerRef.current = null;\n }\n\n // Atomic: add user message + reset streaming state + set isStreaming in one render\n store.getState().startStreaming({ role: \"user\", text: userMessage, images: images?.map(img => img.name) });\n thinkingChunksRef.current = 0;\n thinkingDoneRef.current = false;\n\n const abort = new AbortController();\n abortRef.current = abort;\n accTextRef.current = \"\";\n const toolCalls: ToolCall[] = [];\n let usage: ChatMessage[\"usage\"];\n\n // Render batching\n const dirty = { text: false, tools: false, team: false, subagents: false, messages: false, thinking: false };\n const thinkingBuffer = { value: \"\" };\n const subagentMap = new Map<string, SubagentActivityState>();\n const pendingCompleted: CompletedSubagentInfo[] = [];\n const pendingToolMsgs: ChatMessage[] = [];\n const team: TeamRefs = { teamName: \"\", teamTotal: 0, teamCompleted: 0 };\n const teammateStatus = new Map<string, { name: string; status: string; startTime: number }>();\n\n function markDirty(field: keyof typeof dirty) {\n dirty[field] = true;\n if (!flushTimerRef.current) flushTimerRef.current = setTimeout(flushAll, 200);\n }\n\n function cancelFlush() {\n if (flushTimerRef.current) { clearTimeout(flushTimerRef.current); flushTimerRef.current = null; }\n }\n\n function flushAll() {\n flushTimerRef.current = null;\n // Batch ALL dirty fields into a single store update.\n // Prevents intermediate renders with inconsistent state\n // (e.g., new text but old tools) that cause visual glitching.\n const patch: Record<string, unknown> = {};\n if (dirty.text) { patch.streamingText = accTextRef.current; dirty.text = false; }\n if (dirty.thinking) { patch.thinkingText = thinkingBuffer.value; dirty.thinking = false; }\n if (dirty.tools) { patch.activeTools = [...toolCalls]; dirty.tools = false; }\n if (dirty.team) {\n patch.teamState = { name: team.teamName, tasksCompleted: team.teamCompleted, tasksTotal: team.teamTotal, teammates: new Map(teammateStatus) };\n dirty.team = false;\n }\n if (dirty.subagents) {\n patch.subagentActivity = new Map(subagentMap);\n dirty.subagents = false;\n }\n // Messages and completedSubagents need current state for appending\n const needsMessages = dirty.messages && pendingToolMsgs.length > 0;\n const needsCompleted = pendingCompleted.length > 0;\n if (needsMessages || needsCompleted) {\n const msgBatch = needsMessages ? pendingToolMsgs.splice(0) : [];\n const completedBatch = needsCompleted ? pendingCompleted.splice(0) : [];\n store.setState((s) => ({\n ...patch,\n messages: msgBatch.length > 0 ? [...s.messages, ...msgBatch] : s.messages,\n completedSubagents: completedBatch.length > 0 ? [...s.completedSubagents, ...completedBatch] : s.completedSubagents,\n }));\n } else if (Object.keys(patch).length > 0) {\n store.setState(patch);\n }\n dirty.messages = false;\n lastContentUpdateRef.current = Date.now();\n }\n\n const flushText = () => {\n const text = accTextRef.current;\n // Atomic: commit text to messages + clear streaming/thinking in one update\n // Prevents intermediate render showing text in both Static and LiveArea\n store.getState().commitStreamingText(text);\n accTextRef.current = \"\";\n dirty.text = false;\n thinkingBuffer.value = \"\";\n };\n\n const emitter = new AgentEventEmitter();\n const thinkingRefs: ThinkingRefs = { thinkingChunksRef, thinkingDoneRef, thinkingBuffer, accTextRef };\n const eventCtx: EventCtx = { markDirty, cancelFlush, flushAll, toolCalls, subagentMap, pendingCompleted, teammateStatus };\n\n const EVENT_HANDLERS: Record<string, (event: any) => void> = {\n thinking: (e) => handleThinking(e, eventCtx, thinkingRefs),\n text: (e) => handleText(e, eventCtx, thinkingRefs),\n tool_output: (e) => handleToolOutput(e, eventCtx),\n tool_progress: (e) => handleToolProgress(e, eventCtx),\n team_start: (e) => handleTeamStart(e, eventCtx, team),\n team_task: (e) => handleTeamTask(e, eventCtx, team),\n team_progress: (e) => handleTeamProgress(e, eventCtx),\n team_done: (e) => handleTeamDone(e, eventCtx, team, accTextRef, (v) => store.getState().setTeamState(v), (v) => store.getState().setStreamingText(v)),\n subagent_start: (e) => handleSubagentStart(e, eventCtx),\n subagent_progress: (e) => handleSubagentProgress(e, eventCtx),\n subagent_tool_start: (e) => handleSubagentToolStart(e, eventCtx),\n subagent_tool_end: (e) => handleSubagentToolEnd(e, eventCtx),\n subagent_done: (e) => handleSubagentDone(e, eventCtx),\n done: (e) => handleDone(e, eventCtx, accTextRef),\n };\n\n const unsub = emitter.onEvent((event: AgentEvent) => { EVENT_HANDLERS[event.type]?.(event); });\n\n try {\n await runAgentLoop({\n message: userMessage,\n images: images?.map(img => ({ base64: img.base64, mediaType: img.mediaType })),\n conversationHistory: conversationRef.current,\n abortSignal: abort.signal,\n emitter,\n thinking: thinkingEnabled,\n callbacks: {\n onText: () => {},\n onToolStart: (name, input) => {\n if (input) {\n const idx = toolCalls.findIndex(t => t.name === name && t.status === \"running\" && !t.input);\n if (idx >= 0) { toolCalls[idx].input = input; } else { toolCalls.push({ name, status: \"running\", input }); }\n markDirty(\"tools\");\n lastContentUpdateRef.current = Date.now();\n return;\n }\n flushText();\n toolCalls.push({ name, status: \"running\" });\n markDirty(\"tools\");\n lastContentUpdateRef.current = Date.now();\n },\n onToolResult: (name, success, result, input, durationMs) => {\n const completedTool: ToolCall = { name, status: success ? \"success\" : \"error\", result: typeof result === \"string\" ? result : JSON.stringify(result), input, durationMs };\n const idx = toolCalls.findIndex((t) => t.name === name && t.status === \"running\");\n if (idx >= 0) toolCalls.splice(idx, 1);\n\n if (success && input) {\n const FILE_TOOLS = [\"write_file\", \"edit_file\", \"multi_edit\"];\n if (FILE_TOOLS.includes(name)) {\n try {\n const filePath = (input as Record<string, unknown>).file_path as string | undefined;\n if (filePath) {\n const backups = listBackups();\n const fileName = filePath.split(\"/\").pop() || \"\";\n const backup = backups.find(b => b.name.endsWith(`-${fileName}`));\n rewindManagerRef.current.trackFileChange({\n filePath, backupPath: backup?.path || \"\",\n operation: name === \"write_file\" ? \"write\" : name === \"edit_file\" ? \"edit\" : \"multi_edit\",\n isNewFile: !backup,\n });\n }\n } catch { /* best effort */ }\n }\n }\n\n pendingToolMsgs.push({ role: \"assistant\" as const, text: \"\", toolCalls: [completedTool] });\n markDirty(\"messages\"); markDirty(\"tools\");\n accTextRef.current = \"\"; markDirty(\"text\");\n lastContentUpdateRef.current = Date.now();\n },\n onUsage: (input_tokens, output_tokens, thinking_tokens, model, costUsd, cacheReadTokens, cacheCreationTokens) => {\n usage = { input_tokens, output_tokens, thinking_tokens, model, costUsd, cache_read_tokens: cacheReadTokens, cache_creation_tokens: cacheCreationTokens };\n },\n onAutoCompact: (before, after, tokensSaved) => {\n pendingToolMsgs.push({ role: \"assistant\" as const, text: ` Context auto-compacted: ${before} messages -> ${after} messages (~${(tokensSaved / 1000).toFixed(0)}K tokens freed)` });\n markDirty(\"messages\");\n },\n onDone: (finalMessages) => {\n unsub(); emitter.destroy(); cancelFlush();\n // Clear team refs before flush so dirty.team won't re-create stale state\n team.teamName = \"\"; team.teamTotal = 0; team.teamCompleted = 0; teammateStatus.clear();\n flushAll();\n\n // Collect all pending messages into a single batch\n const batch: ChatMessage[] = [];\n if (pendingToolMsgs.length > 0) batch.push(...pendingToolMsgs.splice(0));\n const allCompleted = [...store.getState().completedSubagents, ...pendingCompleted.splice(0)];\n if (allCompleted.length > 0) batch.push({ role: \"assistant\" as const, text: \"\", completedSubagents: allCompleted });\n const finalText = accTextRef.current;\n if (finalText.trim() || usage) batch.push({ role: \"assistant\" as const, text: finalText, usage });\n\n // Atomic update — commit messages + reset streaming + set isStreaming=false in one render\n store.getState().finishStreaming(batch);\n\n // Rewind checkpoint (no-op on messages, just tracks state)\n store.getState().setMessages(prev => {\n const fileChanges = rewindManagerRef.current.getCurrentFileChanges();\n rewindManagerRef.current.addCheckpoint(turnIndexRef.current, prev.length, finalText.trim() || \"(tool-only turn)\", fileChanges);\n rewindManagerRef.current.commitTurn();\n turnIndexRef.current++;\n return prev;\n });\n abortRef.current = null;\n conversationRef.current = finalMessages;\n\n // Auto-save session to disk after each turn — prevents data loss\n // if the CLI is killed or crashes. Uses the store's sessionId if set\n // (from /save or /resume), otherwise creates a rolling \"current\" session.\n try {\n const sid = store.getState().sessionId || \"current\";\n saveSession(finalMessages, sid);\n } catch { /* best effort — don't block UI */ }\n },\n onError: (err, partialMessages) => {\n unsub(); emitter.destroy(); cancelFlush();\n team.teamName = \"\"; team.teamTotal = 0; team.teamCompleted = 0; teammateStatus.clear();\n flushAll();\n const batch: ChatMessage[] = [];\n if (pendingToolMsgs.length > 0) batch.push(...pendingToolMsgs.splice(0));\n if (err !== \"Cancelled\") batch.push({ role: \"assistant\", text: `\\x1b[31m\\u2718 Error: ${err}\\x1b[0m` });\n store.getState().finishStreaming(batch);\n abortRef.current = null;\n if (partialMessages && partialMessages.length > 0) conversationRef.current = partialMessages;\n },\n },\n });\n } catch (e) {\n // Ensure streaming state is always cleaned up — even if runAgentLoop\n // throws before reaching onDone/onError callbacks\n unsub(); emitter.destroy(); cancelFlush();\n team.teamName = \"\"; team.teamTotal = 0; team.teamCompleted = 0; teammateStatus.clear();\n flushAll();\n const errMsg = e instanceof Error ? e.message : String(e);\n const batch: ChatMessage[] = [];\n if (errMsg !== \"Cancelled\") batch.push({ role: \"assistant\", text: `\\x1b[31m\\u2718 Error: ${errMsg}\\x1b[0m` });\n store.getState().finishStreaming(batch);\n abortRef.current = null;\n }\n };\n\n return { handleSend };\n}\n"],"mappings":"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","ignoreList":[]}
|
package/dist/cli/chat/store.d.ts
CHANGED
|
@@ -101,12 +101,24 @@ export interface ChatActions {
|
|
|
101
101
|
setError: (error: string) => void;
|
|
102
102
|
setCheckpoints: (checkpoints: RewindCheckpoint[]) => void;
|
|
103
103
|
resetStreamingState: () => void;
|
|
104
|
+
/**
|
|
105
|
+
* Atomic start — adds user message, resets streaming state, and sets
|
|
106
|
+
* isStreaming=true in one store update. Prevents intermediate renders
|
|
107
|
+
* where old streaming artifacts are visible alongside the new message.
|
|
108
|
+
*/
|
|
109
|
+
startStreaming: (userMessage: ChatMessage) => void;
|
|
104
110
|
/**
|
|
105
111
|
* Atomic finish — commits final messages AND resets streaming state
|
|
106
112
|
* in a single store update, preventing intermediate renders that
|
|
107
113
|
* cause duplicate input bars.
|
|
108
114
|
*/
|
|
109
115
|
finishStreaming: (appendMessages: ChatMessage[]) => void;
|
|
116
|
+
/**
|
|
117
|
+
* Atomic text commit — moves streaming text into committed messages
|
|
118
|
+
* and clears streaming/thinking state in a single update, preventing
|
|
119
|
+
* the text from appearing in both Static and LiveArea simultaneously.
|
|
120
|
+
*/
|
|
121
|
+
commitStreamingText: (text: string) => void;
|
|
110
122
|
}
|
|
111
123
|
export type ChatStore = ChatState & ChatActions;
|
|
112
124
|
export declare function createChatStore(initialModel?: string): import("zustand/vanilla").StoreApi<ChatStore>;
|
package/dist/cli/chat/store.js
CHANGED
|
@@ -124,6 +124,17 @@ export function createChatStore(initialModel = "") {
|
|
|
124
124
|
teamState: null,
|
|
125
125
|
streamElapsed: 0
|
|
126
126
|
}),
|
|
127
|
+
startStreaming: userMessage => set(s => ({
|
|
128
|
+
messages: [...s.messages, userMessage],
|
|
129
|
+
streamingText: "",
|
|
130
|
+
thinkingText: "",
|
|
131
|
+
activeTools: [],
|
|
132
|
+
subagentActivity: new Map(),
|
|
133
|
+
completedSubagents: [],
|
|
134
|
+
teamState: null,
|
|
135
|
+
streamElapsed: 0,
|
|
136
|
+
isStreaming: true
|
|
137
|
+
})),
|
|
127
138
|
finishStreaming: appendMessages => set(s => ({
|
|
128
139
|
messages: [...s.messages, ...appendMessages],
|
|
129
140
|
streamingText: "",
|
|
@@ -134,6 +145,14 @@ export function createChatStore(initialModel = "") {
|
|
|
134
145
|
teamState: null,
|
|
135
146
|
streamElapsed: 0,
|
|
136
147
|
isStreaming: false
|
|
148
|
+
})),
|
|
149
|
+
commitStreamingText: text => set(s => ({
|
|
150
|
+
messages: text.trim() ? [...s.messages, {
|
|
151
|
+
role: "assistant",
|
|
152
|
+
text
|
|
153
|
+
}] : s.messages,
|
|
154
|
+
streamingText: "",
|
|
155
|
+
thinkingText: ""
|
|
137
156
|
}))
|
|
138
157
|
}));
|
|
139
158
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","names":["createStore","createChatStore","initialModel","set","messages","streamingText","thinkingText","isStreaming","activeTools","subagentActivity","Map","completedSubagents","teamState","streamElapsed","overlay","type","currentModel","thinkingEnabled","toolsExpanded","serverToolsAvailable","userLabel","sessionId","ready","error","checkpoints","addMessage","msg","s","addMessages","msgs","setMessages","msgsOrFn","setStreamingText","setThinkingText","setIsStreaming","setActiveTools","setSubagentActivity","setCompletedSubagents","agentsOrFn","setTeamState","setStreamElapsed","setOverlay","dismissOverlay","setCurrentModel","setThinkingEnabled","setToolsExpanded","expanded","setServerToolsAvailable","setUserLabel","setSessionId","setReady","setError","setCheckpoints","resetStreamingState","finishStreaming","appendMessages","_store","initChatStore","getChatStore","Error","useState","useEffect","useRef","useReactRef","useChatStore","selector","storeRef","selectorRef","current","value","setValue","getState","store","prev","Object","is","unsub","subscribe","state","next"],"sources":["../../../src/cli/chat/store.ts"],"sourcesContent":["/**\n * Chat Store — Zustand store replacing all prop drilling\n *\n * Single source of truth for:\n * - messages (committed to Static)\n * - streaming state (text, tools, subagents, team)\n * - overlay state (discriminated union)\n * - UI preferences (model, thinking, expanded)\n * - session identity (user label, session ID)\n *\n * All components read from this store directly.\n * No props needed except leaf-component configuration.\n */\n\nimport { createStore } from \"zustand/vanilla\";\nimport type { ToolCall, ChatMessage } from \"./MessageList.js\";\nimport type { SubagentActivityState, CompletedSubagentInfo } from \"./SubagentPanel.js\";\nimport type { StoreInfo } from \"../services/auth-service.js\";\nimport type { SessionMeta } from \"../services/session-persistence.js\";\nimport type { NodeInfo } from \"./NodeSelector.js\";\nimport type { RewindCheckpoint } from \"../services/rewind.js\";\n\n// ── Overlay State — discriminated union replaces 14 booleans ──\n\nexport type OverlayState =\n | { type: \"none\" }\n | { type: \"storeSelect\"; stores: StoreInfo[] }\n | { type: \"nodeSelect\"; nodes: NodeInfo[] }\n | { type: \"sessionManager\"; sessions: SessionMeta[] }\n | { type: \"memoryManager\"; memories: string[] }\n | { type: \"modelSelect\" }\n | { type: \"themeSelect\" }\n | { type: \"planApproval\"; planContent: string; planFile: string }\n | { type: \"rewind\" }\n | { type: \"nodeManager\"; daemonRunning: boolean; daemonPid: number | null };\n\n// ── Team State ──\n\nexport interface TeamInfo {\n name: string;\n tasksCompleted: number;\n tasksTotal: number;\n teammates: Map<string, { name: string; status: string; startTime: number }>;\n}\n\n// ── Store Shape ──\n\nexport interface ChatState {\n // Messages (committed to Ink <Static>)\n messages: ChatMessage[];\n\n // Streaming\n streamingText: string;\n thinkingText: string;\n isStreaming: boolean;\n activeTools: ToolCall[];\n subagentActivity: Map<string, SubagentActivityState>;\n completedSubagents: CompletedSubagentInfo[];\n teamState: TeamInfo | null;\n streamElapsed: number;\n\n // Overlay\n overlay: OverlayState;\n\n // UI preferences\n currentModel: string;\n thinkingEnabled: boolean;\n toolsExpanded: boolean;\n serverToolsAvailable: number;\n\n // Session identity\n userLabel: string;\n sessionId: string | null;\n ready: boolean;\n error: string;\n\n // Rewind checkpoints (read-only snapshot for overlay)\n checkpoints: RewindCheckpoint[];\n}\n\nexport interface ChatActions {\n // Messages\n addMessage: (msg: ChatMessage) => void;\n addMessages: (msgs: ChatMessage[]) => void;\n setMessages: (msgs: ChatMessage[] | ((prev: ChatMessage[]) => ChatMessage[])) => void;\n\n // Streaming\n setStreamingText: (text: string) => void;\n setThinkingText: (text: string) => void;\n setIsStreaming: (streaming: boolean) => void;\n setActiveTools: (tools: ToolCall[]) => void;\n setSubagentActivity: (activity: Map<string, SubagentActivityState>) => void;\n setCompletedSubagents: (agents: CompletedSubagentInfo[] | ((prev: CompletedSubagentInfo[]) => CompletedSubagentInfo[])) => void;\n setTeamState: (team: TeamInfo | null) => void;\n setStreamElapsed: (elapsed: number) => void;\n\n // Overlay\n setOverlay: (overlay: OverlayState) => void;\n dismissOverlay: () => void;\n\n // UI preferences\n setCurrentModel: (model: string) => void;\n setThinkingEnabled: (enabled: boolean) => void;\n setToolsExpanded: (expanded: boolean) => void;\n setServerToolsAvailable: (count: number) => void;\n\n // Session\n setUserLabel: (label: string) => void;\n setSessionId: (id: string | null) => void;\n setReady: (ready: boolean) => void;\n setError: (error: string) => void;\n setCheckpoints: (checkpoints: RewindCheckpoint[]) => void;\n\n // Batch reset for stream start/end\n resetStreamingState: () => void;\n\n /**\n * Atomic finish — commits final messages AND resets streaming state\n * in a single store update, preventing intermediate renders that\n * cause duplicate input bars.\n */\n finishStreaming: (appendMessages: ChatMessage[]) => void;\n}\n\nexport type ChatStore = ChatState & ChatActions;\n\n// ── Store Factory ──\n\nexport function createChatStore(initialModel: string = \"\") {\n return createStore<ChatStore>((set) => ({\n // Initial state\n messages: [],\n streamingText: \"\",\n thinkingText: \"\",\n isStreaming: false,\n activeTools: [],\n subagentActivity: new Map(),\n completedSubagents: [],\n teamState: null,\n streamElapsed: 0,\n overlay: { type: \"none\" },\n currentModel: initialModel,\n thinkingEnabled: true,\n toolsExpanded: false,\n serverToolsAvailable: 0,\n userLabel: \"\",\n sessionId: null,\n ready: false,\n error: \"\",\n checkpoints: [],\n\n // Actions\n addMessage: (msg) => set((s) => ({ messages: [...s.messages, msg] })),\n addMessages: (msgs) => set((s) => ({ messages: [...s.messages, ...msgs] })),\n setMessages: (msgsOrFn) => set((s) => ({\n messages: typeof msgsOrFn === \"function\" ? msgsOrFn(s.messages) : msgsOrFn,\n })),\n\n setStreamingText: (streamingText) => set({ streamingText }),\n setThinkingText: (thinkingText) => set({ thinkingText }),\n setIsStreaming: (isStreaming) => set({ isStreaming }),\n setActiveTools: (activeTools) => set({ activeTools }),\n setSubagentActivity: (subagentActivity) => set({ subagentActivity }),\n setCompletedSubagents: (agentsOrFn) => set((s) => ({\n completedSubagents: typeof agentsOrFn === \"function\" ? agentsOrFn(s.completedSubagents) : agentsOrFn,\n })),\n setTeamState: (teamState) => set({ teamState }),\n setStreamElapsed: (streamElapsed) => set({ streamElapsed }),\n\n setOverlay: (overlay) => set({ overlay }),\n dismissOverlay: () => set({ overlay: { type: \"none\" } }),\n\n setCurrentModel: (currentModel) => set({ currentModel }),\n setThinkingEnabled: (thinkingEnabled) => set({ thinkingEnabled }),\n setToolsExpanded: (expanded) => set({ toolsExpanded: expanded }),\n setServerToolsAvailable: (serverToolsAvailable) => set({ serverToolsAvailable }),\n\n setUserLabel: (userLabel) => set({ userLabel }),\n setSessionId: (sessionId) => set({ sessionId }),\n setReady: (ready) => set({ ready }),\n setError: (error) => set({ error }),\n setCheckpoints: (checkpoints) => set({ checkpoints }),\n\n resetStreamingState: () => set({\n streamingText: \"\",\n thinkingText: \"\",\n activeTools: [],\n subagentActivity: new Map(),\n completedSubagents: [],\n teamState: null,\n streamElapsed: 0,\n }),\n\n finishStreaming: (appendMessages) => set((s) => ({\n messages: [...s.messages, ...appendMessages],\n streamingText: \"\",\n thinkingText: \"\",\n activeTools: [],\n subagentActivity: new Map(),\n completedSubagents: [],\n teamState: null,\n streamElapsed: 0,\n isStreaming: false,\n })),\n }));\n}\n\n// ── Singleton ──\n// Created once at app startup, accessed by all components.\n\nlet _store: ReturnType<typeof createChatStore> | null = null;\n\nexport function initChatStore(initialModel: string = \"\"): ReturnType<typeof createChatStore> {\n if (!_store) _store = createChatStore(initialModel);\n return _store;\n}\n\nexport function getChatStore(): ReturnType<typeof createChatStore> {\n if (!_store) throw new Error(\"Chat store not initialized. Call initChatStore() first.\");\n return _store;\n}\n\n// ── React Hook (for use in Ink components) ──\n// Ink's custom renderer doesn't support useSyncExternalStore correctly,\n// so we bridge with useState + useEffect + store.subscribe instead.\n\nimport { useState, useEffect, useRef as useReactRef } from \"react\";\n\nexport function useChatStore<T>(selector: (state: ChatStore) => T): T {\n const storeRef = useReactRef(getChatStore());\n const selectorRef = useReactRef(selector);\n selectorRef.current = selector;\n\n const [value, setValue] = useState(() => selector(storeRef.current.getState()));\n\n useEffect(() => {\n const store = storeRef.current;\n // Sync immediately in case store changed between render and effect\n const current = selectorRef.current(store.getState());\n setValue((prev) => Object.is(prev, current) ? prev : current);\n\n const unsub = store.subscribe((state) => {\n const next = selectorRef.current(state);\n setValue((prev) => Object.is(prev, next) ? prev : next);\n });\n return unsub;\n }, []);\n\n return value;\n}\n\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"store.js","names":["createStore","createChatStore","initialModel","set","messages","streamingText","thinkingText","isStreaming","activeTools","subagentActivity","Map","completedSubagents","teamState","streamElapsed","overlay","type","currentModel","thinkingEnabled","toolsExpanded","serverToolsAvailable","userLabel","sessionId","ready","error","checkpoints","addMessage","msg","s","addMessages","msgs","setMessages","msgsOrFn","setStreamingText","setThinkingText","setIsStreaming","setActiveTools","setSubagentActivity","setCompletedSubagents","agentsOrFn","setTeamState","setStreamElapsed","setOverlay","dismissOverlay","setCurrentModel","setThinkingEnabled","setToolsExpanded","expanded","setServerToolsAvailable","setUserLabel","setSessionId","setReady","setError","setCheckpoints","resetStreamingState","startStreaming","userMessage","finishStreaming","appendMessages","commitStreamingText","text","trim","role","_store","initChatStore","getChatStore","Error","useState","useEffect","useRef","useReactRef","useChatStore","selector","storeRef","selectorRef","current","value","setValue","getState","store","prev","Object","is","unsub","subscribe","state","next"],"sources":["../../../src/cli/chat/store.ts"],"sourcesContent":["/**\n * Chat Store — Zustand store replacing all prop drilling\n *\n * Single source of truth for:\n * - messages (committed to Static)\n * - streaming state (text, tools, subagents, team)\n * - overlay state (discriminated union)\n * - UI preferences (model, thinking, expanded)\n * - session identity (user label, session ID)\n *\n * All components read from this store directly.\n * No props needed except leaf-component configuration.\n */\n\nimport { createStore } from \"zustand/vanilla\";\nimport type { ToolCall, ChatMessage } from \"./MessageList.js\";\nimport type { SubagentActivityState, CompletedSubagentInfo } from \"./SubagentPanel.js\";\nimport type { StoreInfo } from \"../services/auth-service.js\";\nimport type { SessionMeta } from \"../services/session-persistence.js\";\nimport type { NodeInfo } from \"./NodeSelector.js\";\nimport type { RewindCheckpoint } from \"../services/rewind.js\";\n\n// ── Overlay State — discriminated union replaces 14 booleans ──\n\nexport type OverlayState =\n | { type: \"none\" }\n | { type: \"storeSelect\"; stores: StoreInfo[] }\n | { type: \"nodeSelect\"; nodes: NodeInfo[] }\n | { type: \"sessionManager\"; sessions: SessionMeta[] }\n | { type: \"memoryManager\"; memories: string[] }\n | { type: \"modelSelect\" }\n | { type: \"themeSelect\" }\n | { type: \"planApproval\"; planContent: string; planFile: string }\n | { type: \"rewind\" }\n | { type: \"nodeManager\"; daemonRunning: boolean; daemonPid: number | null };\n\n// ── Team State ──\n\nexport interface TeamInfo {\n name: string;\n tasksCompleted: number;\n tasksTotal: number;\n teammates: Map<string, { name: string; status: string; startTime: number }>;\n}\n\n// ── Store Shape ──\n\nexport interface ChatState {\n // Messages (committed to Ink <Static>)\n messages: ChatMessage[];\n\n // Streaming\n streamingText: string;\n thinkingText: string;\n isStreaming: boolean;\n activeTools: ToolCall[];\n subagentActivity: Map<string, SubagentActivityState>;\n completedSubagents: CompletedSubagentInfo[];\n teamState: TeamInfo | null;\n streamElapsed: number;\n\n // Overlay\n overlay: OverlayState;\n\n // UI preferences\n currentModel: string;\n thinkingEnabled: boolean;\n toolsExpanded: boolean;\n serverToolsAvailable: number;\n\n // Session identity\n userLabel: string;\n sessionId: string | null;\n ready: boolean;\n error: string;\n\n // Rewind checkpoints (read-only snapshot for overlay)\n checkpoints: RewindCheckpoint[];\n}\n\nexport interface ChatActions {\n // Messages\n addMessage: (msg: ChatMessage) => void;\n addMessages: (msgs: ChatMessage[]) => void;\n setMessages: (msgs: ChatMessage[] | ((prev: ChatMessage[]) => ChatMessage[])) => void;\n\n // Streaming\n setStreamingText: (text: string) => void;\n setThinkingText: (text: string) => void;\n setIsStreaming: (streaming: boolean) => void;\n setActiveTools: (tools: ToolCall[]) => void;\n setSubagentActivity: (activity: Map<string, SubagentActivityState>) => void;\n setCompletedSubagents: (agents: CompletedSubagentInfo[] | ((prev: CompletedSubagentInfo[]) => CompletedSubagentInfo[])) => void;\n setTeamState: (team: TeamInfo | null) => void;\n setStreamElapsed: (elapsed: number) => void;\n\n // Overlay\n setOverlay: (overlay: OverlayState) => void;\n dismissOverlay: () => void;\n\n // UI preferences\n setCurrentModel: (model: string) => void;\n setThinkingEnabled: (enabled: boolean) => void;\n setToolsExpanded: (expanded: boolean) => void;\n setServerToolsAvailable: (count: number) => void;\n\n // Session\n setUserLabel: (label: string) => void;\n setSessionId: (id: string | null) => void;\n setReady: (ready: boolean) => void;\n setError: (error: string) => void;\n setCheckpoints: (checkpoints: RewindCheckpoint[]) => void;\n\n // Batch reset for stream start/end\n resetStreamingState: () => void;\n\n /**\n * Atomic start — adds user message, resets streaming state, and sets\n * isStreaming=true in one store update. Prevents intermediate renders\n * where old streaming artifacts are visible alongside the new message.\n */\n startStreaming: (userMessage: ChatMessage) => void;\n\n /**\n * Atomic finish — commits final messages AND resets streaming state\n * in a single store update, preventing intermediate renders that\n * cause duplicate input bars.\n */\n finishStreaming: (appendMessages: ChatMessage[]) => void;\n\n /**\n * Atomic text commit — moves streaming text into committed messages\n * and clears streaming/thinking state in a single update, preventing\n * the text from appearing in both Static and LiveArea simultaneously.\n */\n commitStreamingText: (text: string) => void;\n}\n\nexport type ChatStore = ChatState & ChatActions;\n\n// ── Store Factory ──\n\nexport function createChatStore(initialModel: string = \"\") {\n return createStore<ChatStore>((set) => ({\n // Initial state\n messages: [],\n streamingText: \"\",\n thinkingText: \"\",\n isStreaming: false,\n activeTools: [],\n subagentActivity: new Map(),\n completedSubagents: [],\n teamState: null,\n streamElapsed: 0,\n overlay: { type: \"none\" },\n currentModel: initialModel,\n thinkingEnabled: true,\n toolsExpanded: false,\n serverToolsAvailable: 0,\n userLabel: \"\",\n sessionId: null,\n ready: false,\n error: \"\",\n checkpoints: [],\n\n // Actions\n addMessage: (msg) => set((s) => ({ messages: [...s.messages, msg] })),\n addMessages: (msgs) => set((s) => ({ messages: [...s.messages, ...msgs] })),\n setMessages: (msgsOrFn) => set((s) => ({\n messages: typeof msgsOrFn === \"function\" ? msgsOrFn(s.messages) : msgsOrFn,\n })),\n\n setStreamingText: (streamingText) => set({ streamingText }),\n setThinkingText: (thinkingText) => set({ thinkingText }),\n setIsStreaming: (isStreaming) => set({ isStreaming }),\n setActiveTools: (activeTools) => set({ activeTools }),\n setSubagentActivity: (subagentActivity) => set({ subagentActivity }),\n setCompletedSubagents: (agentsOrFn) => set((s) => ({\n completedSubagents: typeof agentsOrFn === \"function\" ? agentsOrFn(s.completedSubagents) : agentsOrFn,\n })),\n setTeamState: (teamState) => set({ teamState }),\n setStreamElapsed: (streamElapsed) => set({ streamElapsed }),\n\n setOverlay: (overlay) => set({ overlay }),\n dismissOverlay: () => set({ overlay: { type: \"none\" } }),\n\n setCurrentModel: (currentModel) => set({ currentModel }),\n setThinkingEnabled: (thinkingEnabled) => set({ thinkingEnabled }),\n setToolsExpanded: (expanded) => set({ toolsExpanded: expanded }),\n setServerToolsAvailable: (serverToolsAvailable) => set({ serverToolsAvailable }),\n\n setUserLabel: (userLabel) => set({ userLabel }),\n setSessionId: (sessionId) => set({ sessionId }),\n setReady: (ready) => set({ ready }),\n setError: (error) => set({ error }),\n setCheckpoints: (checkpoints) => set({ checkpoints }),\n\n resetStreamingState: () => set({\n streamingText: \"\",\n thinkingText: \"\",\n activeTools: [],\n subagentActivity: new Map(),\n completedSubagents: [],\n teamState: null,\n streamElapsed: 0,\n }),\n\n startStreaming: (userMessage) => set((s) => ({\n messages: [...s.messages, userMessage],\n streamingText: \"\",\n thinkingText: \"\",\n activeTools: [],\n subagentActivity: new Map(),\n completedSubagents: [],\n teamState: null,\n streamElapsed: 0,\n isStreaming: true,\n })),\n\n finishStreaming: (appendMessages) => set((s) => ({\n messages: [...s.messages, ...appendMessages],\n streamingText: \"\",\n thinkingText: \"\",\n activeTools: [],\n subagentActivity: new Map(),\n completedSubagents: [],\n teamState: null,\n streamElapsed: 0,\n isStreaming: false,\n })),\n\n commitStreamingText: (text) => set((s) => ({\n messages: text.trim()\n ? [...s.messages, { role: \"assistant\" as const, text }]\n : s.messages,\n streamingText: \"\",\n thinkingText: \"\",\n })),\n }));\n}\n\n// ── Singleton ──\n// Created once at app startup, accessed by all components.\n\nlet _store: ReturnType<typeof createChatStore> | null = null;\n\nexport function initChatStore(initialModel: string = \"\"): ReturnType<typeof createChatStore> {\n if (!_store) _store = createChatStore(initialModel);\n return _store;\n}\n\nexport function getChatStore(): ReturnType<typeof createChatStore> {\n if (!_store) throw new Error(\"Chat store not initialized. Call initChatStore() first.\");\n return _store;\n}\n\n// ── React Hook (for use in Ink components) ──\n// Ink's custom renderer doesn't support useSyncExternalStore correctly,\n// so we bridge with useState + useEffect + store.subscribe instead.\n\nimport { useState, useEffect, useRef as useReactRef } from \"react\";\n\nexport function useChatStore<T>(selector: (state: ChatStore) => T): T {\n const storeRef = useReactRef(getChatStore());\n const selectorRef = useReactRef(selector);\n selectorRef.current = selector;\n\n const [value, setValue] = useState(() => selector(storeRef.current.getState()));\n\n useEffect(() => {\n const store = storeRef.current;\n // Sync immediately in case store changed between render and effect\n const current = selectorRef.current(store.getState());\n setValue((prev) => Object.is(prev, current) ? prev : current);\n\n const unsub = store.subscribe((state) => {\n const next = selectorRef.current(state);\n setValue((prev) => Object.is(prev, next) ? prev : next);\n });\n return unsub;\n }, []);\n\n return value;\n}\n\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -7,6 +7,7 @@ import { INTERACTIVE_TOOL_DEFINITIONS, executeInteractiveTool, waitForPlanApprov
|
|
|
7
7
|
import { loadConfig } from "./config-store.js";
|
|
8
8
|
import { isServerTool, loadServerToolDefinitions, executeServerTool } from "./server-tools.js";
|
|
9
9
|
import { mcpClientManager } from "./mcp-client.js";
|
|
10
|
+
import { preprocessMedia } from "./server-tools-preprocess.js";
|
|
10
11
|
import { getPermissionMode, isToolAllowedByPermission } from "./permission-modes.js";
|
|
11
12
|
import { runBeforeToolHook, runAfterToolHook } from "./hooks.js";
|
|
12
13
|
import { resetGitContext } from "./git-context.js";
|
|
@@ -182,7 +183,15 @@ export function buildToolExecutor(hooks, abortSignal, emitter) {
|
|
|
182
183
|
} else if (isServerTool(name)) {
|
|
183
184
|
result = await executeServerTool(name, effectiveInput, emitter);
|
|
184
185
|
} else if (mcpClientManager.isMcpTool(name)) {
|
|
185
|
-
|
|
186
|
+
// Pre-process local file paths for MCP tools (same as server tools).
|
|
187
|
+
// MCP tools bypass executeServerTool(), so preprocessing must happen here.
|
|
188
|
+
const toolBaseName = name.replace(/^mcp__[^_]+__/, ""); // strip MCP prefix
|
|
189
|
+
const ppResult = preprocessMedia(toolBaseName, effectiveInput);
|
|
190
|
+
if (!ppResult.ok) {
|
|
191
|
+
result = ppResult.error;
|
|
192
|
+
} else {
|
|
193
|
+
result = await mcpClientManager.callTool(name, ppResult.serverArgs);
|
|
194
|
+
}
|
|
186
195
|
} else {
|
|
187
196
|
result = {
|
|
188
197
|
success: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-loop-tools.js","names":["LOCAL_TOOL_DEFINITIONS","executeLocalTool","isLocalTool","INTERACTIVE_TOOL_DEFINITIONS","executeInteractiveTool","waitForPlanApproval","loadConfig","isServerTool","loadServerToolDefinitions","executeServerTool","mcpClientManager","getPermissionMode","isToolAllowedByPermission","runBeforeToolHook","runAfterToolHook","resetGitContext","resetClaudeMdCache","clearReadCache","resetAgentConfigCache","sessionInputTokens","sessionOutputTokens","getSessionTokens","input","output","addSessionTokens","resetSessionState","resetSessionLoopDetector","sessionLoopDetector","getSessionLoopDetector","setSessionLoopDetector","ld","CLI_NO_LIMIT","Number","MAX_SAFE_INTEGER","getTools","allowedTools","disallowedTools","localTools","map","t","name","description","input_schema","interactiveTools","push","serverTools","localNames","Set","uniqueServerTools","filter","has","mcpTools","allTools","length","allowed","disallowed","tools","serverToolCount","getServerToolCount","defs","INTERACTIVE_TOOL_NAMES","buildToolExecutor","hooks","abortSignal","emitter","success","effectiveInput","hookResult","hookErr","message","allow","modifiedInput","result","decision","action","feedback","isMcpTool","callTool","afterResult","modifiedOutput","undefined","truncateResult","maxLen","slice","classifyToolError","lower","toLowerCase","test","canUseAgent","config","hasToken","access_token","refresh_token","hasApiKey","process","env","ANTHROPIC_API_KEY","ready","reason"],"sources":["../../../src/cli/services/agent-loop-tools.ts"],"sourcesContent":["/**\n * Agent Loop — tool definitions, session state, and tool executor builder.\n */\n\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport {\n LOCAL_TOOL_DEFINITIONS,\n executeLocalTool,\n isLocalTool,\n} from \"./local-tools.js\";\nimport {\n INTERACTIVE_TOOL_DEFINITIONS,\n executeInteractiveTool,\n waitForPlanApproval,\n type PlanApprovalDecision,\n} from \"./interactive-tools.js\";\nimport { loadConfig } from \"./config-store.js\";\nimport {\n isServerTool,\n loadServerToolDefinitions,\n executeServerTool,\n} from \"./server-tools.js\";\nimport { mcpClientManager } from \"./mcp-client.js\";\nimport { getPermissionMode, isToolAllowedByPermission } from \"./permission-modes.js\";\nimport { runBeforeToolHook, runAfterToolHook, type HookConfig } from \"./hooks.js\";\nimport type { AgentEventEmitter } from \"./agent-events.js\";\n\nimport { resetGitContext } from \"./git-context.js\";\nimport { resetClaudeMdCache } from \"./claude-md-loader.js\";\nimport { clearReadCache } from \"./tools/file-ops.js\";\nimport { resetAgentConfigCache } from \"./agent-config.js\";\n\n// ============================================================================\n// SESSION STATE\n// ============================================================================\n\nlet sessionInputTokens = 0;\nlet sessionOutputTokens = 0;\n\nexport function getSessionTokens(): { input: number; output: number } {\n return { input: sessionInputTokens, output: sessionOutputTokens };\n}\n\nexport function addSessionTokens(input: number, output: number): void {\n sessionInputTokens += input;\n sessionOutputTokens += output;\n}\n\n/**\n * Reset all CLI-only session state. Call when starting a new conversation.\n * Does NOT reset activeModel or permissionMode.\n */\nexport function resetSessionState(): void {\n sessionInputTokens = 0;\n sessionOutputTokens = 0;\n resetSessionLoopDetector();\n resetGitContext();\n resetClaudeMdCache();\n clearReadCache();\n resetAgentConfigCache();\n}\n\n// Loop detector — managed externally by the main loop\nimport { LoopDetector } from \"../../shared/agent-core.js\";\n\nlet sessionLoopDetector: LoopDetector | null = null;\n\nexport function getSessionLoopDetector(): LoopDetector | null {\n return sessionLoopDetector;\n}\n\nexport function setSessionLoopDetector(ld: LoopDetector): void {\n sessionLoopDetector = ld;\n}\n\nexport function resetSessionLoopDetector(): void {\n sessionLoopDetector = null;\n}\n\n// No artificial turn cap\nexport const CLI_NO_LIMIT = Number.MAX_SAFE_INTEGER;\n\n// ============================================================================\n// TOOL DEFINITIONS\n// ============================================================================\n\nexport async function getTools(allowedTools?: string[], disallowedTools?: string[]): Promise<{ tools: Anthropic.Tool[]; serverToolCount: number }> {\n const localTools: Anthropic.Tool[] = LOCAL_TOOL_DEFINITIONS.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.input_schema as Anthropic.Tool[\"input_schema\"],\n }));\n\n const interactiveTools: Anthropic.Tool[] = INTERACTIVE_TOOL_DEFINITIONS.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.input_schema as Anthropic.Tool[\"input_schema\"],\n }));\n localTools.push(...interactiveTools);\n\n let serverTools: Anthropic.Tool[] = [];\n try {\n serverTools = await loadServerToolDefinitions();\n } catch {\n // Server tools silently unavailable\n }\n\n const localNames = new Set(localTools.map(t => t.name));\n const uniqueServerTools = serverTools.filter(t => !localNames.has(t.name));\n\n const mcpTools = mcpClientManager.getTools();\n\n let allTools = [...localTools, ...uniqueServerTools, ...mcpTools];\n\n if (allowedTools && allowedTools.length > 0) {\n const allowed = new Set(allowedTools);\n allTools = allTools.filter(t => allowed.has(t.name));\n }\n if (disallowedTools && disallowedTools.length > 0) {\n const disallowed = new Set(disallowedTools);\n allTools = allTools.filter(t => !disallowed.has(t.name));\n }\n\n return { tools: allTools, serverToolCount: uniqueServerTools.length };\n}\n\n/** Exposed for /status command */\nexport async function getServerToolCount(): Promise<number> {\n try {\n const defs = await loadServerToolDefinitions();\n return defs.length;\n } catch {\n return 0;\n }\n}\n\n// ============================================================================\n// TOOL EXECUTOR BUILDER\n// ============================================================================\n\nconst INTERACTIVE_TOOL_NAMES = new Set(INTERACTIVE_TOOL_DEFINITIONS.map(t => t.name));\n\nexport function buildToolExecutor(\n hooks: HookConfig[],\n abortSignal?: AbortSignal,\n emitter?: AgentEventEmitter,\n): (name: string, input: Record<string, unknown>) => Promise<{ success: boolean; output: string }> {\n return async (name: string, input: Record<string, unknown>) => {\n if (!name) return { success: false, output: \"Tool call missing name — skipping.\" };\n\n if (!isToolAllowedByPermission(name)) {\n return { success: false, output: `Tool \"${name}\" blocked by ${getPermissionMode()} mode. Switch modes with /mode.` };\n }\n\n let effectiveInput = input;\n if (hooks.length > 0) {\n let hookResult;\n try {\n hookResult = await runBeforeToolHook(hooks, name, input);\n } catch (hookErr: any) {\n return { success: false, output: `Hook error for ${name}: ${hookErr.message || hookErr}` };\n }\n if (!hookResult.allow) return { success: false, output: hookResult.message || \"Blocked by hook\" };\n if (hookResult.modifiedInput) effectiveInput = hookResult.modifiedInput;\n }\n\n let result: { success: boolean; output: string };\n if (INTERACTIVE_TOOL_NAMES.has(name)) {\n result = await executeInteractiveTool(name, effectiveInput);\n if (name === \"exit_plan_mode\" && result.success) {\n const decision: PlanApprovalDecision = await waitForPlanApproval(abortSignal);\n switch (decision.action) {\n case \"execute\": result = { success: true, output: `__PLAN_APPROVED_CLEAN__\\n${result.output}` }; break;\n case \"edit\": result = { success: true, output: \"Plan returned for revision. Make changes and use ExitPlanMode again when ready.\" }; break;\n case \"feedback\": result = { success: true, output: `User feedback on plan:\\n\\n${decision.feedback || \"(no feedback provided)\"}\\n\\nRevise the plan based on this feedback, then use ExitPlanMode again.` }; break;\n case \"cancel\": result = { success: true, output: \"Plan cancelled by user. Do not proceed with implementation.\" }; break;\n }\n }\n } else if (isLocalTool(name)) {\n result = await executeLocalTool(name, effectiveInput, abortSignal);\n } else if (isServerTool(name)) {\n result = await executeServerTool(name, effectiveInput, emitter);\n } else if (mcpClientManager.isMcpTool(name)) {\n result = await mcpClientManager.callTool(name, effectiveInput);\n } else {\n result = { success: false, output: `Unknown tool: ${name}` };\n }\n\n if (hooks.length > 0) {\n try {\n const afterResult = await runAfterToolHook(hooks, name, result.output, result.success);\n if (afterResult.modifiedOutput !== undefined) result = { ...result, output: afterResult.modifiedOutput };\n } catch {\n // After-hook failure is non-fatal — preserve original result\n }\n }\n\n return result;\n };\n}\n\n// ============================================================================\n// TELEMETRY HELPERS\n// ============================================================================\n\nexport function truncateResult(output: string, maxLen: number): string {\n if (output.length <= maxLen) return output;\n return output.slice(0, maxLen) + `... (${output.length} chars total)`;\n}\n\nexport function classifyToolError(output: string): string {\n const lower = output.toLowerCase();\n if (/timed?\\s*out|timeout/.test(lower)) return \"timeout\";\n if (/permission denied|eacces/.test(lower)) return \"permission\";\n if (/not found|no such file/.test(lower)) return \"not_found\";\n if (/command not found|exit code 127/.test(lower)) return \"command_not_found\";\n if (/import\\b.*\\berror|error\\b.*\\bimport/.test(lower)) return \"import_error\";\n if (/syntax|parse/.test(lower)) return \"syntax_error\";\n if (/externally-managed/.test(lower)) return \"env_managed\";\n return \"unknown\";\n}\n\n// ============================================================================\n// AUTH CHECK\n// ============================================================================\n\nexport function canUseAgent(): { ready: boolean; reason?: string } {\n const config = loadConfig();\n const hasToken = !!(config.access_token && config.refresh_token);\n const hasApiKey = !!process.env.ANTHROPIC_API_KEY;\n if (hasToken || hasApiKey) return { ready: true };\n return { ready: false, reason: \"Run `whale login` to authenticate.\" };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"agent-loop-tools.js","names":["LOCAL_TOOL_DEFINITIONS","executeLocalTool","isLocalTool","INTERACTIVE_TOOL_DEFINITIONS","executeInteractiveTool","waitForPlanApproval","loadConfig","isServerTool","loadServerToolDefinitions","executeServerTool","mcpClientManager","preprocessMedia","getPermissionMode","isToolAllowedByPermission","runBeforeToolHook","runAfterToolHook","resetGitContext","resetClaudeMdCache","clearReadCache","resetAgentConfigCache","sessionInputTokens","sessionOutputTokens","getSessionTokens","input","output","addSessionTokens","resetSessionState","resetSessionLoopDetector","sessionLoopDetector","getSessionLoopDetector","setSessionLoopDetector","ld","CLI_NO_LIMIT","Number","MAX_SAFE_INTEGER","getTools","allowedTools","disallowedTools","localTools","map","t","name","description","input_schema","interactiveTools","push","serverTools","localNames","Set","uniqueServerTools","filter","has","mcpTools","allTools","length","allowed","disallowed","tools","serverToolCount","getServerToolCount","defs","INTERACTIVE_TOOL_NAMES","buildToolExecutor","hooks","abortSignal","emitter","success","effectiveInput","hookResult","hookErr","message","allow","modifiedInput","result","decision","action","feedback","isMcpTool","toolBaseName","replace","ppResult","ok","error","callTool","serverArgs","afterResult","modifiedOutput","undefined","truncateResult","maxLen","slice","classifyToolError","lower","toLowerCase","test","canUseAgent","config","hasToken","access_token","refresh_token","hasApiKey","process","env","ANTHROPIC_API_KEY","ready","reason"],"sources":["../../../src/cli/services/agent-loop-tools.ts"],"sourcesContent":["/**\n * Agent Loop — tool definitions, session state, and tool executor builder.\n */\n\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport {\n LOCAL_TOOL_DEFINITIONS,\n executeLocalTool,\n isLocalTool,\n} from \"./local-tools.js\";\nimport {\n INTERACTIVE_TOOL_DEFINITIONS,\n executeInteractiveTool,\n waitForPlanApproval,\n type PlanApprovalDecision,\n} from \"./interactive-tools.js\";\nimport { loadConfig } from \"./config-store.js\";\nimport {\n isServerTool,\n loadServerToolDefinitions,\n executeServerTool,\n} from \"./server-tools.js\";\nimport { mcpClientManager } from \"./mcp-client.js\";\nimport { preprocessMedia } from \"./server-tools-preprocess.js\";\nimport { getPermissionMode, isToolAllowedByPermission } from \"./permission-modes.js\";\nimport { runBeforeToolHook, runAfterToolHook, type HookConfig } from \"./hooks.js\";\nimport type { AgentEventEmitter } from \"./agent-events.js\";\n\nimport { resetGitContext } from \"./git-context.js\";\nimport { resetClaudeMdCache } from \"./claude-md-loader.js\";\nimport { clearReadCache } from \"./tools/file-ops.js\";\nimport { resetAgentConfigCache } from \"./agent-config.js\";\n\n// ============================================================================\n// SESSION STATE\n// ============================================================================\n\nlet sessionInputTokens = 0;\nlet sessionOutputTokens = 0;\n\nexport function getSessionTokens(): { input: number; output: number } {\n return { input: sessionInputTokens, output: sessionOutputTokens };\n}\n\nexport function addSessionTokens(input: number, output: number): void {\n sessionInputTokens += input;\n sessionOutputTokens += output;\n}\n\n/**\n * Reset all CLI-only session state. Call when starting a new conversation.\n * Does NOT reset activeModel or permissionMode.\n */\nexport function resetSessionState(): void {\n sessionInputTokens = 0;\n sessionOutputTokens = 0;\n resetSessionLoopDetector();\n resetGitContext();\n resetClaudeMdCache();\n clearReadCache();\n resetAgentConfigCache();\n}\n\n// Loop detector — managed externally by the main loop\nimport { LoopDetector } from \"../../shared/agent-core.js\";\n\nlet sessionLoopDetector: LoopDetector | null = null;\n\nexport function getSessionLoopDetector(): LoopDetector | null {\n return sessionLoopDetector;\n}\n\nexport function setSessionLoopDetector(ld: LoopDetector): void {\n sessionLoopDetector = ld;\n}\n\nexport function resetSessionLoopDetector(): void {\n sessionLoopDetector = null;\n}\n\n// No artificial turn cap\nexport const CLI_NO_LIMIT = Number.MAX_SAFE_INTEGER;\n\n// ============================================================================\n// TOOL DEFINITIONS\n// ============================================================================\n\nexport async function getTools(allowedTools?: string[], disallowedTools?: string[]): Promise<{ tools: Anthropic.Tool[]; serverToolCount: number }> {\n const localTools: Anthropic.Tool[] = LOCAL_TOOL_DEFINITIONS.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.input_schema as Anthropic.Tool[\"input_schema\"],\n }));\n\n const interactiveTools: Anthropic.Tool[] = INTERACTIVE_TOOL_DEFINITIONS.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.input_schema as Anthropic.Tool[\"input_schema\"],\n }));\n localTools.push(...interactiveTools);\n\n let serverTools: Anthropic.Tool[] = [];\n try {\n serverTools = await loadServerToolDefinitions();\n } catch {\n // Server tools silently unavailable\n }\n\n const localNames = new Set(localTools.map(t => t.name));\n const uniqueServerTools = serverTools.filter(t => !localNames.has(t.name));\n\n const mcpTools = mcpClientManager.getTools();\n\n let allTools = [...localTools, ...uniqueServerTools, ...mcpTools];\n\n if (allowedTools && allowedTools.length > 0) {\n const allowed = new Set(allowedTools);\n allTools = allTools.filter(t => allowed.has(t.name));\n }\n if (disallowedTools && disallowedTools.length > 0) {\n const disallowed = new Set(disallowedTools);\n allTools = allTools.filter(t => !disallowed.has(t.name));\n }\n\n return { tools: allTools, serverToolCount: uniqueServerTools.length };\n}\n\n/** Exposed for /status command */\nexport async function getServerToolCount(): Promise<number> {\n try {\n const defs = await loadServerToolDefinitions();\n return defs.length;\n } catch {\n return 0;\n }\n}\n\n// ============================================================================\n// TOOL EXECUTOR BUILDER\n// ============================================================================\n\nconst INTERACTIVE_TOOL_NAMES = new Set(INTERACTIVE_TOOL_DEFINITIONS.map(t => t.name));\n\nexport function buildToolExecutor(\n hooks: HookConfig[],\n abortSignal?: AbortSignal,\n emitter?: AgentEventEmitter,\n): (name: string, input: Record<string, unknown>) => Promise<{ success: boolean; output: string }> {\n return async (name: string, input: Record<string, unknown>) => {\n if (!name) return { success: false, output: \"Tool call missing name — skipping.\" };\n\n if (!isToolAllowedByPermission(name)) {\n return { success: false, output: `Tool \"${name}\" blocked by ${getPermissionMode()} mode. Switch modes with /mode.` };\n }\n\n let effectiveInput = input;\n if (hooks.length > 0) {\n let hookResult;\n try {\n hookResult = await runBeforeToolHook(hooks, name, input);\n } catch (hookErr: any) {\n return { success: false, output: `Hook error for ${name}: ${hookErr.message || hookErr}` };\n }\n if (!hookResult.allow) return { success: false, output: hookResult.message || \"Blocked by hook\" };\n if (hookResult.modifiedInput) effectiveInput = hookResult.modifiedInput;\n }\n\n let result: { success: boolean; output: string };\n if (INTERACTIVE_TOOL_NAMES.has(name)) {\n result = await executeInteractiveTool(name, effectiveInput);\n if (name === \"exit_plan_mode\" && result.success) {\n const decision: PlanApprovalDecision = await waitForPlanApproval(abortSignal);\n switch (decision.action) {\n case \"execute\": result = { success: true, output: `__PLAN_APPROVED_CLEAN__\\n${result.output}` }; break;\n case \"edit\": result = { success: true, output: \"Plan returned for revision. Make changes and use ExitPlanMode again when ready.\" }; break;\n case \"feedback\": result = { success: true, output: `User feedback on plan:\\n\\n${decision.feedback || \"(no feedback provided)\"}\\n\\nRevise the plan based on this feedback, then use ExitPlanMode again.` }; break;\n case \"cancel\": result = { success: true, output: \"Plan cancelled by user. Do not proceed with implementation.\" }; break;\n }\n }\n } else if (isLocalTool(name)) {\n result = await executeLocalTool(name, effectiveInput, abortSignal);\n } else if (isServerTool(name)) {\n result = await executeServerTool(name, effectiveInput, emitter);\n } else if (mcpClientManager.isMcpTool(name)) {\n // Pre-process local file paths for MCP tools (same as server tools).\n // MCP tools bypass executeServerTool(), so preprocessing must happen here.\n const toolBaseName = name.replace(/^mcp__[^_]+__/, \"\"); // strip MCP prefix\n const ppResult = preprocessMedia(toolBaseName, effectiveInput);\n if (!ppResult.ok) {\n result = ppResult.error as { success: boolean; output: string };\n } else {\n result = await mcpClientManager.callTool(name, ppResult.serverArgs);\n }\n } else {\n result = { success: false, output: `Unknown tool: ${name}` };\n }\n\n if (hooks.length > 0) {\n try {\n const afterResult = await runAfterToolHook(hooks, name, result.output, result.success);\n if (afterResult.modifiedOutput !== undefined) result = { ...result, output: afterResult.modifiedOutput };\n } catch {\n // After-hook failure is non-fatal — preserve original result\n }\n }\n\n return result;\n };\n}\n\n// ============================================================================\n// TELEMETRY HELPERS\n// ============================================================================\n\nexport function truncateResult(output: string, maxLen: number): string {\n if (output.length <= maxLen) return output;\n return output.slice(0, maxLen) + `... (${output.length} chars total)`;\n}\n\nexport function classifyToolError(output: string): string {\n const lower = output.toLowerCase();\n if (/timed?\\s*out|timeout/.test(lower)) return \"timeout\";\n if (/permission denied|eacces/.test(lower)) return \"permission\";\n if (/not found|no such file/.test(lower)) return \"not_found\";\n if (/command not found|exit code 127/.test(lower)) return \"command_not_found\";\n if (/import\\b.*\\berror|error\\b.*\\bimport/.test(lower)) return \"import_error\";\n if (/syntax|parse/.test(lower)) return \"syntax_error\";\n if (/externally-managed/.test(lower)) return \"env_managed\";\n return \"unknown\";\n}\n\n// ============================================================================\n// AUTH CHECK\n// ============================================================================\n\nexport function canUseAgent(): { ready: boolean; reason?: string } {\n const config = loadConfig();\n const hasToken = !!(config.access_token && config.refresh_token);\n const hasApiKey = !!process.env.ANTHROPIC_API_KEY;\n if (hasToken || hasApiKey) return { ready: true };\n return { ready: false, reason: \"Run `whale login` to authenticate.\" };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -82,8 +82,9 @@ export class CLIAgentLoop extends AgentLoopBase {
|
|
|
82
82
|
const {
|
|
83
83
|
retryable
|
|
84
84
|
} = categorizeError(err);
|
|
85
|
-
if (retryable && iteration <
|
|
86
|
-
|
|
85
|
+
if (retryable && iteration < 3) {
|
|
86
|
+
const delay = 2000 * Math.pow(2, iteration);
|
|
87
|
+
await new Promise(r => setTimeout(r, Math.min(delay, 30000)));
|
|
87
88
|
return true;
|
|
88
89
|
}
|
|
89
90
|
this.cliConfig.onError?.(`API error: ${err.message}`, this.messages);
|