whale-code 6.5.6 → 6.5.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/bin/whale-code.js +23 -0
- package/dist/cli/__tests__/print-mode-streaming.test.js +270 -0
- package/dist/cli/__tests__/print-mode.basic-output.test.js +230 -0
- package/dist/cli/__tests__/print-mode.session-errors.test.js +252 -0
- package/dist/cli/__tests__/print-mode.test.js +273 -0
- package/dist/cli/__tests__/serve-mode-messages.test.js +338 -0
- package/dist/cli/__tests__/serve-mode.messages.part2.test.js +266 -0
- package/dist/cli/__tests__/serve-mode.messages.test.js +277 -0
- package/dist/cli/__tests__/serve-mode.startup-http.test.js +279 -0
- package/dist/cli/__tests__/serve-mode.test.js +345 -0
- package/dist/cli/app.d.ts +1 -0
- package/dist/cli/app.js +8 -2
- package/dist/cli/app.js.map +1 -1
- package/dist/cli/chat/ChatApp.d.ts +8 -36
- package/dist/cli/chat/ChatApp.js +135 -450
- package/dist/cli/chat/ChatApp.js.map +1 -1
- package/dist/cli/chat/ChatInput.d.ts +3 -2
- package/dist/cli/chat/ChatInput.js +37 -14
- package/dist/cli/chat/ChatInput.js.map +1 -1
- package/dist/cli/chat/ImsgManager.d.ts +20 -0
- package/dist/cli/chat/ImsgManager.js +341 -0
- package/dist/cli/chat/ImsgManager.js.map +1 -0
- package/dist/cli/chat/MarkdownText.d.ts +2 -1
- package/dist/cli/chat/MarkdownText.js +12 -8
- package/dist/cli/chat/MarkdownText.js.map +1 -1
- package/dist/cli/chat/MemoryManager.js +3 -2
- package/dist/cli/chat/MemoryManager.js.map +1 -1
- package/dist/cli/chat/MessageList.d.ts +1 -1
- package/dist/cli/chat/MessageList.js +119 -114
- package/dist/cli/chat/MessageList.js.map +1 -1
- package/dist/cli/chat/NodeManager.js +57 -170
- package/dist/cli/chat/NodeManager.js.map +1 -1
- package/dist/cli/chat/OverlayContext.d.ts +27 -0
- package/dist/cli/chat/OverlayContext.js +2 -0
- package/dist/cli/chat/OverlayContext.js.map +1 -0
- package/dist/cli/chat/PlanApproval.js +3 -2
- package/dist/cli/chat/PlanApproval.js.map +1 -1
- package/dist/cli/chat/RewindConfirmation.d.ts +12 -0
- package/dist/cli/chat/RewindConfirmation.js +243 -0
- package/dist/cli/chat/RewindConfirmation.js.map +1 -0
- package/dist/cli/chat/RewindViewer.js +5 -4
- package/dist/cli/chat/RewindViewer.js.map +1 -1
- package/dist/cli/chat/SessionManager.js +3 -2
- package/dist/cli/chat/SessionManager.js.map +1 -1
- package/dist/cli/chat/SlashMenu.d.ts +7 -24
- package/dist/cli/chat/SlashMenu.js +14 -183
- package/dist/cli/chat/SlashMenu.js.map +1 -1
- package/dist/cli/chat/StatusBar.d.ts +5 -2
- package/dist/cli/chat/StatusBar.js +80 -65
- package/dist/cli/chat/StatusBar.js.map +1 -1
- package/dist/cli/chat/StreamingText.d.ts +2 -1
- package/dist/cli/chat/StreamingText.js +2 -2
- package/dist/cli/chat/StreamingText.js.map +1 -1
- package/dist/cli/chat/SubagentPanel.d.ts +6 -6
- package/dist/cli/chat/SubagentPanel.js +159 -537
- package/dist/cli/chat/SubagentPanel.js.map +1 -1
- package/dist/cli/chat/TeamPanel.js +2 -30
- package/dist/cli/chat/TeamPanel.js.map +1 -1
- package/dist/cli/chat/ToolIndicator.d.ts +7 -23
- package/dist/cli/chat/ToolIndicator.js +543 -1443
- package/dist/cli/chat/ToolIndicator.js.map +1 -1
- package/dist/cli/chat/chat-input-menu-handler.d.ts +32 -0
- package/dist/cli/chat/components/LiveArea.d.ts +12 -0
- package/dist/cli/chat/components/LiveArea.js +252 -0
- package/dist/cli/chat/components/LiveArea.js.map +1 -0
- package/dist/cli/chat/components/OverlayRouter.d.ts +13 -0
- package/dist/cli/chat/components/OverlayRouter.js +257 -0
- package/dist/cli/chat/components/OverlayRouter.js.map +1 -0
- package/dist/cli/chat/components/StaticMessages.d.ts +9 -0
- package/dist/cli/chat/components/StaticMessages.js +132 -0
- package/dist/cli/chat/components/StaticMessages.js.map +1 -0
- package/dist/cli/chat/hooks/agent-loop-events.d.ts +77 -0
- package/dist/cli/chat/hooks/agent-loop-events.js +171 -0
- package/dist/cli/chat/hooks/agent-loop-events.js.map +1 -0
- package/dist/cli/chat/hooks/slash-command-config-system.d.ts +11 -0
- package/dist/cli/chat/hooks/slash-command-config-system.js +177 -0
- package/dist/cli/chat/hooks/slash-command-config-system.js.map +1 -0
- package/dist/cli/chat/hooks/slash-command-handlers-system.d.ts +12 -0
- package/dist/cli/chat/hooks/slash-command-handlers-system.js +127 -0
- package/dist/cli/chat/hooks/slash-command-handlers-system.js.map +1 -0
- package/dist/cli/chat/hooks/slash-command-handlers.d.ts +21 -0
- package/dist/cli/chat/hooks/slash-command-handlers.js +222 -0
- package/dist/cli/chat/hooks/slash-command-handlers.js.map +1 -0
- package/dist/cli/chat/hooks/slash-imsg-handlers.js +148 -0
- package/dist/cli/chat/hooks/slash-imsg-handlers.js.map +1 -0
- package/dist/cli/chat/hooks/slash-node-handlers.d.ts +26 -0
- package/dist/cli/chat/hooks/slash-node-handlers.js +226 -0
- package/dist/cli/chat/hooks/slash-node-handlers.js.map +1 -0
- package/dist/cli/chat/hooks/useAgentLoop.d.ts +2 -21
- package/dist/cli/chat/hooks/useAgentLoop.js +258 -401
- package/dist/cli/chat/hooks/useAgentLoop.js.map +1 -1
- package/dist/cli/chat/hooks/useElapsedClock.d.ts +19 -0
- package/dist/cli/chat/hooks/useElapsedClock.js +80 -0
- package/dist/cli/chat/hooks/useElapsedClock.js.map +1 -0
- package/dist/cli/chat/hooks/useOverlayHandlers.d.ts +23 -0
- package/dist/cli/chat/hooks/useOverlayHandlers.js +125 -0
- package/dist/cli/chat/hooks/useOverlayHandlers.js.map +1 -0
- package/dist/cli/chat/hooks/useSlashCommands.d.ts +14 -22
- package/dist/cli/chat/hooks/useSlashCommands.js +99 -720
- package/dist/cli/chat/hooks/useSlashCommands.js.map +1 -1
- package/dist/cli/chat/hooks/useStreamingReducer.d.ts +66 -0
- package/dist/cli/chat/imsg-manager-render.d.ts +29 -0
- package/dist/cli/chat/imsg-manager-render.js +294 -0
- package/dist/cli/chat/imsg-manager-render.js.map +1 -0
- package/dist/cli/chat/slash-commands.d.ts +37 -0
- package/dist/cli/chat/slash-commands.js +194 -0
- package/dist/cli/chat/slash-commands.js.map +1 -0
- package/dist/cli/chat/store.d.ts +115 -0
- package/dist/cli/chat/store.js +177 -0
- package/dist/cli/chat/store.js.map +1 -0
- package/dist/cli/chat/tool-indicator-helpers.d.ts +14 -0
- package/dist/cli/chat/tool-indicator-helpers.js +167 -0
- package/dist/cli/chat/tool-indicator-helpers.js.map +1 -0
- package/dist/cli/chat/tool-indicator-summary.d.ts +6 -0
- package/dist/cli/chat/tool-indicator-summary.js +103 -0
- package/dist/cli/chat/tool-indicator-summary.js.map +1 -0
- package/dist/cli/chat/tool-indicator-types.d.ts +66 -0
- package/dist/cli/chat/tool-indicator-types.js +177 -0
- package/dist/cli/chat/tool-indicator-types.js.map +1 -0
- package/dist/cli/commands/__tests__/config-cmd.test.js +270 -0
- package/dist/cli/commands/__tests__/doctor.test.js +257 -0
- package/dist/cli/commands/__tests__/imsg-node-bridge.test.js +99 -0
- package/dist/cli/commands/__tests__/imsg-utils.test.js +73 -0
- package/dist/cli/commands/__tests__/init.test.js +214 -0
- package/dist/cli/commands/__tests__/mcp.test.js +287 -0
- package/dist/cli/commands/imsg-config.d.ts +31 -0
- package/dist/cli/commands/imsg-config.js +104 -0
- package/dist/cli/commands/imsg-config.js.map +1 -0
- package/dist/cli/commands/imsg-node-bridge.d.ts +25 -0
- package/dist/cli/commands/imsg-node-bridge.js +229 -0
- package/dist/cli/commands/imsg-node-bridge.js.map +1 -0
- package/dist/cli/commands/imsg-utils.d.ts +14 -0
- package/dist/cli/commands/imsg-utils.js +42 -0
- package/dist/cli/commands/imsg-utils.js.map +1 -0
- package/dist/cli/commands/imsg-watcher-helpers.d.ts +40 -0
- package/dist/cli/commands/imsg-watcher-helpers.js +184 -0
- package/dist/cli/commands/imsg-watcher-helpers.js.map +1 -0
- package/dist/cli/commands/imsg-watcher.d.ts +11 -0
- package/dist/cli/commands/imsg-watcher.js +230 -0
- package/dist/cli/commands/imsg-watcher.js.map +1 -0
- package/dist/cli/commands/imsg.d.ts +14 -0
- package/dist/cli/commands/imsg.js +181 -0
- package/dist/cli/commands/imsg.js.map +1 -0
- package/dist/cli/commands/sessions.d.ts +9 -0
- package/dist/cli/commands/sessions.js +93 -0
- package/dist/cli/commands/sessions.js.map +1 -0
- package/dist/cli/login/LoginApp.js +3 -0
- package/dist/cli/login/LoginApp.js.map +1 -1
- package/dist/cli/serve-mode-persistence.d.ts +18 -0
- package/dist/cli/serve-mode-persistence.js +157 -0
- package/dist/cli/serve-mode-persistence.js.map +1 -0
- package/dist/cli/serve-mode-query.d.ts +9 -0
- package/dist/cli/serve-mode-query.js +247 -0
- package/dist/cli/serve-mode-query.js.map +1 -0
- package/dist/cli/serve-mode-types.d.ts +29 -0
- package/dist/cli/serve-mode-types.js +56 -0
- package/dist/cli/serve-mode-types.js.map +1 -0
- package/dist/cli/services/__tests__/agent-definitions.test.js +153 -0
- package/dist/cli/services/__tests__/agent-events-global.test.js +39 -0
- package/dist/cli/services/__tests__/agent-events.part2.test.js +113 -0
- package/dist/cli/services/__tests__/agent-events.test.js +157 -0
- package/dist/cli/services/__tests__/agent-loop-auth.test.js +392 -0
- package/dist/cli/services/__tests__/agent-loop-budget.test.js +389 -0
- package/dist/cli/services/__tests__/agent-loop-tools-lifecycle.test.js +430 -0
- package/dist/cli/services/__tests__/agent-loop-tools-maxturns.test.js +486 -0
- package/dist/cli/services/__tests__/agent-loop-utils-execution.test.js +528 -0
- package/dist/cli/services/__tests__/agent-loop-utils-helpers.test.js +466 -0
- package/dist/cli/services/__tests__/agent-worker-base-execute.test.js +257 -0
- package/dist/cli/services/__tests__/agent-worker-base-helpers.test.js +198 -0
- package/dist/cli/services/__tests__/agent-worker-base.test.js +278 -0
- package/dist/cli/services/__tests__/auth-service-exports.test.js +41 -0
- package/dist/cli/services/__tests__/auth-service.part2.test.js +169 -0
- package/dist/cli/services/__tests__/auth-service.test.js +242 -0
- package/dist/cli/services/__tests__/background-processes.test.js +282 -0
- package/dist/cli/services/__tests__/claude-md-loader.test.js +134 -0
- package/dist/cli/services/__tests__/config-store.test.js +247 -0
- package/dist/cli/services/__tests__/debug-log.test.js +199 -0
- package/dist/cli/services/__tests__/edge-cases-caching.test.js +174 -0
- package/dist/cli/services/__tests__/edge-cases-compaction-core.test.js +226 -0
- package/dist/cli/services/__tests__/edge-cases-compaction-openai.test.js +152 -0
- package/dist/cli/services/__tests__/edge-cases-compaction-shapes.test.js +53 -0
- package/dist/cli/services/__tests__/edge-cases-compaction-thinking.test.js +226 -0
- package/dist/cli/services/__tests__/edge-cases-compaction.test.js +131 -0
- package/dist/cli/services/__tests__/edge-cases-paths.test.js +86 -0
- package/dist/cli/services/__tests__/error-logger-messages.test.js +81 -0
- package/dist/cli/services/__tests__/error-logger-transport.test.js +119 -0
- package/dist/cli/services/__tests__/error-logger.test.js +264 -0
- package/dist/cli/services/__tests__/file-history.test.js +136 -0
- package/dist/cli/services/__tests__/git-context-cache-reset.test.js +223 -0
- package/dist/cli/services/__tests__/git-context.test.js +241 -0
- package/dist/cli/services/__tests__/interactive-tools-execute.test.js +166 -0
- package/dist/cli/services/__tests__/interactive-tools-plan.test.js +197 -0
- package/dist/cli/services/__tests__/interactive-tools.part2.test.js +168 -0
- package/dist/cli/services/__tests__/interactive-tools.test.js +179 -0
- package/dist/cli/services/__tests__/keybinding-manager.test.js +205 -0
- package/dist/cli/services/__tests__/local-tools-dispatch.test.js +404 -0
- package/dist/cli/services/__tests__/local-tools.test.js +238 -0
- package/dist/cli/services/__tests__/lsp-manager.test.js +364 -0
- package/dist/cli/services/__tests__/mcp-client-connect-disconnect.test.js +310 -0
- package/dist/cli/services/__tests__/mcp-client.test.js +93 -0
- package/dist/cli/services/__tests__/memory-manager.test.js +154 -0
- package/dist/cli/services/__tests__/model-manager-utils.test.js +154 -0
- package/dist/cli/services/__tests__/model-manager.test.js +175 -0
- package/dist/cli/services/__tests__/permission-modes.test.js +222 -0
- package/dist/cli/services/__tests__/ripgrep.test.js +328 -0
- package/dist/cli/services/__tests__/server-tools-execute.test.js +317 -0
- package/dist/cli/services/__tests__/server-tools.test.js +272 -0
- package/dist/cli/services/__tests__/session-persistence.test.js +245 -0
- package/dist/cli/services/__tests__/subagent-basic.test.js +489 -0
- package/dist/cli/services/__tests__/subagent-edge.test.js +545 -0
- package/dist/cli/services/__tests__/subagent-prompts.test.js +558 -0
- package/dist/cli/services/__tests__/subagent-worker-errors.test.js +255 -0
- package/dist/cli/services/__tests__/subagent-worker.test.js +242 -0
- package/dist/cli/services/__tests__/system-prompt.test.js +210 -0
- package/dist/cli/services/__tests__/team-lead-comms-messaging.test.js +250 -0
- package/dist/cli/services/__tests__/team-lead-comms-result.test.js +232 -0
- package/dist/cli/services/__tests__/team-lead-comms-stop.test.js +344 -0
- package/dist/cli/services/__tests__/team-lead-comms.test.js +285 -0
- package/dist/cli/services/__tests__/team-lead-create.test.js +327 -0
- package/dist/cli/services/__tests__/team-lead-run.test.js +318 -0
- package/dist/cli/services/__tests__/team-lead-stop.test.js +199 -0
- package/dist/cli/services/__tests__/team-state-comms.test.js +240 -0
- package/dist/cli/services/__tests__/team-state-core.test.js +230 -0
- package/dist/cli/services/__tests__/team-state-tasks-complete-fail-available.test.js +224 -0
- package/dist/cli/services/__tests__/team-state-tasks.test.js +184 -0
- package/dist/cli/services/__tests__/telemetry-ai-metadata.test.js +116 -0
- package/dist/cli/services/__tests__/telemetry.part2.test.js +195 -0
- package/dist/cli/services/__tests__/telemetry.test.js +176 -0
- package/dist/cli/services/agent-event-types.d.ts +148 -0
- package/dist/cli/services/agent-event-types.js +2 -0
- package/dist/cli/services/agent-event-types.js.map +1 -0
- package/dist/cli/services/agent-loop-iteration.d.ts +13 -0
- package/dist/cli/services/agent-loop-setup.d.ts +32 -0
- package/dist/cli/services/agent-loop-shell-summarize.d.ts +11 -0
- package/dist/cli/services/agent-loop-shell-summarize.js +94 -0
- package/dist/cli/services/agent-loop-shell-summarize.js.map +1 -0
- package/dist/cli/services/agent-loop-tools.d.ts +37 -0
- package/dist/cli/services/agent-loop-tools.js +243 -0
- package/dist/cli/services/agent-loop-tools.js.map +1 -0
- package/dist/cli/services/agent-loop-types.d.ts +52 -0
- package/dist/cli/services/agent-loop-types.js +25 -0
- package/dist/cli/services/agent-loop-types.js.map +1 -0
- package/dist/cli/services/agent-loop.d.ts +2 -2
- package/dist/cli/services/agent-loop.js +162 -17
- package/dist/cli/services/agent-loop.js.map +1 -1
- package/dist/cli/services/agent-worker-base-api.d.ts +19 -0
- package/dist/cli/services/agent-worker-base-helpers.d.ts +27 -0
- package/dist/cli/services/agent-worker-base-tools.d.ts +16 -0
- package/dist/cli/services/agent-worker-base-types.d.ts +81 -0
- package/dist/cli/services/agent-worker-base.js +1 -1
- package/dist/cli/services/agent-worker-base.js.map +1 -1
- package/dist/cli/services/auth-service.js +19 -19
- package/dist/cli/services/auth-service.js.map +1 -1
- package/dist/cli/services/background-agents.d.ts +26 -0
- package/dist/cli/services/background-processes-ops.d.ts +24 -0
- package/dist/cli/services/background-processes.d.ts +2 -1
- package/dist/cli/services/background-processes.js +7 -3
- package/dist/cli/services/background-processes.js.map +1 -1
- package/dist/cli/services/background-tool-defs.d.ts +50 -0
- package/dist/cli/services/cli-agent-loop.d.ts +41 -0
- package/dist/cli/services/cli-agent-loop.js +104 -0
- package/dist/cli/services/cli-agent-loop.js.map +1 -0
- package/dist/cli/services/config-modules-model.test.js +133 -0
- package/dist/cli/services/config-modules-permission.test.js +85 -0
- package/dist/cli/services/config-modules-permissions.test.js +85 -0
- package/dist/cli/services/config-modules-session.test.js +297 -0
- package/dist/cli/services/config-store.d.ts +5 -0
- package/dist/cli/services/config-store.js +90 -5
- package/dist/cli/services/config-store.js.map +1 -1
- package/dist/cli/services/error-logger-internals.d.ts +25 -0
- package/dist/cli/services/error-logger-internals.js +111 -0
- package/dist/cli/services/error-logger-internals.js.map +1 -0
- package/dist/cli/services/format-server-response-columns.test.js +265 -0
- package/dist/cli/services/format-server-response-fallback.test.js +65 -0
- package/dist/cli/services/format-server-response-formatters.d.ts +18 -0
- package/dist/cli/services/format-server-response-formatters.js +195 -0
- package/dist/cli/services/format-server-response-formatters.js.map +1 -0
- package/dist/cli/services/format-server-response-primitives-basic.test.js +261 -0
- package/dist/cli/services/format-server-response-primitives-nested.test.js +188 -0
- package/dist/cli/services/format-server-response-primitives.test.js +300 -0
- package/dist/cli/services/format-server-response-realworld.test.js +248 -0
- package/dist/cli/services/format-server-response-values.test.js +247 -0
- package/dist/cli/services/format-server-response.js +5 -3
- package/dist/cli/services/format-server-response.js.map +1 -1
- package/dist/cli/services/hooks-execute.d.ts +47 -0
- package/dist/cli/services/hooks-execute.js +181 -0
- package/dist/cli/services/hooks-execute.js.map +1 -0
- package/dist/cli/services/hooks-runners.test.js +184 -0
- package/dist/cli/services/hooks.glob-load.test.js +233 -0
- package/dist/cli/services/hooks.run-hooks.test.js +184 -0
- package/dist/cli/services/hooks.test.js +233 -0
- package/dist/cli/services/interactive-tool-defs.d.ts +80 -0
- package/dist/cli/services/interactive-tools.d.ts +5 -2
- package/dist/cli/services/interactive-tools.js +47 -33
- package/dist/cli/services/interactive-tools.js.map +1 -1
- package/dist/cli/services/keybinding-manager.d.ts +2 -0
- package/dist/cli/services/keybinding-manager.js +5 -0
- package/dist/cli/services/keybinding-manager.js.map +1 -1
- package/dist/cli/services/local-tools-agent-defs-tasks.d.ts +6 -0
- package/dist/cli/services/local-tools-agent-defs-tasks.js +245 -0
- package/dist/cli/services/local-tools-agent-defs-tasks.js.map +1 -0
- package/dist/cli/services/local-tools-agent-defs-utils.d.ts +6 -0
- package/dist/cli/services/local-tools-agent-defs-utils.js +198 -0
- package/dist/cli/services/local-tools-agent-defs-utils.js.map +1 -0
- package/dist/cli/services/local-tools-agent-defs.d.ts +10 -0
- package/dist/cli/services/local-tools-agent-defs.js +13 -0
- package/dist/cli/services/local-tools-agent-defs.js.map +1 -0
- package/dist/cli/services/local-tools-definitions.d.ts +6 -0
- package/dist/cli/services/local-tools-files.test.js +256 -0
- package/dist/cli/services/local-tools-read-many.d.ts +6 -0
- package/dist/cli/services/local-tools.js +7 -9
- package/dist/cli/services/local-tools.js.map +1 -1
- package/dist/cli/services/lsp-config.d.ts +13 -0
- package/dist/cli/services/lsp-config.js +72 -0
- package/dist/cli/services/lsp-config.js.map +1 -0
- package/dist/cli/services/lsp-formatters.d.ts +11 -0
- package/dist/cli/services/lsp-formatters.js +209 -0
- package/dist/cli/services/lsp-formatters.js.map +1 -0
- package/dist/cli/services/lsp-protocol.d.ts +9 -0
- package/dist/cli/services/lsp-protocol.js +40 -0
- package/dist/cli/services/lsp-protocol.js.map +1 -0
- package/dist/cli/services/lsp-server-docs.d.ts +8 -0
- package/dist/cli/services/lsp-server-docs.js +132 -0
- package/dist/cli/services/lsp-server-docs.js.map +1 -0
- package/dist/cli/services/lsp-server-documents.d.ts +8 -0
- package/dist/cli/services/lsp-server-documents.js +132 -0
- package/dist/cli/services/lsp-server-documents.js.map +1 -0
- package/dist/cli/services/lsp-server.d.ts +40 -0
- package/dist/cli/services/lsp-server.js +270 -0
- package/dist/cli/services/lsp-server.js.map +1 -0
- package/dist/cli/services/model-router.test.js +245 -0
- package/dist/cli/services/permission-modes.js +16 -3
- package/dist/cli/services/permission-modes.js.map +1 -1
- package/dist/cli/services/project-index.d.ts +41 -0
- package/dist/cli/services/project-index.js +286 -0
- package/dist/cli/services/project-index.js.map +1 -0
- package/dist/cli/services/rewind-rewindTo.test.js +202 -0
- package/dist/cli/services/rewind.test.js +175 -0
- package/dist/cli/services/sandbox.test.js +198 -0
- package/dist/cli/services/server-tools-client.d.ts +46 -0
- package/dist/cli/services/server-tools-client.js +211 -0
- package/dist/cli/services/server-tools-client.js.map +1 -0
- package/dist/cli/services/server-tools-media.d.ts +21 -0
- package/dist/cli/services/server-tools-media.js +163 -0
- package/dist/cli/services/server-tools-media.js.map +1 -0
- package/dist/cli/services/server-tools-preprocess.d.ts +23 -0
- package/dist/cli/services/server-tools-preprocess.js +386 -0
- package/dist/cli/services/server-tools-preprocess.js.map +1 -0
- package/dist/cli/services/server-tools.d.ts +2 -0
- package/dist/cli/services/server-tools.js +40 -15
- package/dist/cli/services/server-tools.js.map +1 -1
- package/dist/cli/services/session-client.d.ts +78 -0
- package/dist/cli/services/session-client.js +197 -0
- package/dist/cli/services/session-client.js.map +1 -0
- package/dist/cli/services/session-persistence.d.ts +3 -0
- package/dist/cli/services/session-persistence.js +12 -0
- package/dist/cli/services/session-persistence.js.map +1 -1
- package/dist/cli/services/subagent-execution.d.ts +12 -0
- package/dist/cli/services/subagent-loop-v2.d.ts +36 -0
- package/dist/cli/services/subagent-loop-v2.js +238 -0
- package/dist/cli/services/subagent-loop-v2.js.map +1 -0
- package/dist/cli/services/subagent-tools.d.ts +10 -0
- package/dist/cli/services/subagent-tools.js +96 -0
- package/dist/cli/services/subagent-tools.js.map +1 -0
- package/dist/cli/services/subagent-types.d.ts +57 -0
- package/dist/cli/services/subagent-types.js +218 -0
- package/dist/cli/services/subagent-types.js.map +1 -0
- package/dist/cli/services/subagent.js +3 -2
- package/dist/cli/services/subagent.js.map +1 -1
- package/dist/cli/services/system-prompt.js +26 -3
- package/dist/cli/services/system-prompt.js.map +1 -1
- package/dist/cli/services/team-lead-auto.d.ts +11 -0
- package/dist/cli/services/team-lead-execution.d.ts +28 -0
- package/dist/cli/services/team-lead-types.d.ts +37 -0
- package/dist/cli/services/team-lead-types.js +2 -0
- package/dist/cli/services/team-lead-types.js.map +1 -0
- package/dist/cli/services/team-lead.d.ts +60 -0
- package/dist/cli/services/team-lead.js +148 -11
- package/dist/cli/services/team-lead.js.map +1 -1
- package/dist/cli/services/team-state-members.d.ts +11 -0
- package/dist/cli/services/team-state-members.js +185 -0
- package/dist/cli/services/team-state-members.js.map +1 -0
- package/dist/cli/services/team-state-messaging.d.ts +16 -0
- package/dist/cli/services/team-state-messaging.js +90 -0
- package/dist/cli/services/team-state-messaging.js.map +1 -0
- package/dist/cli/services/team-state-tasks.d.ts +12 -0
- package/dist/cli/services/team-state-tasks.js +23 -0
- package/dist/cli/services/team-state-tasks.js.map +1 -0
- package/dist/cli/services/team-state-types.d.ts +54 -0
- package/dist/cli/services/team-state-types.js +129 -0
- package/dist/cli/services/team-state-types.js.map +1 -0
- package/dist/cli/services/team-state.d.ts +5 -0
- package/dist/cli/services/team-state.js +29 -0
- package/dist/cli/services/team-state.js.map +1 -1
- package/dist/cli/services/teammate-loop.js +557 -0
- package/dist/cli/services/teammate-loop.js.map +1 -0
- package/dist/cli/services/teammate-prompt.d.ts +2 -0
- package/dist/cli/services/teammate-prompt.js +68 -0
- package/dist/cli/services/teammate-prompt.js.map +1 -0
- package/dist/cli/services/teammate-tools.d.ts +6 -0
- package/dist/cli/services/teammate-tools.js +158 -0
- package/dist/cli/services/teammate-tools.js.map +1 -0
- package/dist/cli/services/teammate-types.d.ts +36 -0
- package/dist/cli/services/teammate-types.js +43 -0
- package/dist/cli/services/teammate-types.js.map +1 -0
- package/dist/cli/services/teammate-worker-helpers.d.ts +71 -0
- package/dist/cli/services/teammate-worker-helpers.js +183 -0
- package/dist/cli/services/teammate-worker-helpers.js.map +1 -0
- package/dist/cli/services/teammate-worker-task-cleanup.d.ts +27 -0
- package/dist/cli/services/teammate-worker-task-cleanup.js +91 -0
- package/dist/cli/services/teammate-worker-task-cleanup.js.map +1 -0
- package/dist/cli/services/teammate-worker-task-loop.d.ts +35 -0
- package/dist/cli/services/teammate-worker-task-loop.js +273 -0
- package/dist/cli/services/teammate-worker-task-loop.js.map +1 -0
- package/dist/cli/services/teammate-worker.d.ts +13 -0
- package/dist/cli/services/teammate-worker.js +294 -0
- package/dist/cli/services/teammate-worker.js.map +1 -0
- package/dist/cli/services/telemetry-spans.d.ts +17 -0
- package/dist/cli/services/telemetry-spans.js +172 -0
- package/dist/cli/services/telemetry-spans.js.map +1 -0
- package/dist/cli/services/tools/__tests__/agent-tools-tasks-teams.test.js +250 -0
- package/dist/cli/services/tools/__tests__/agent-tools-teams.test.js +200 -0
- package/dist/cli/services/tools/__tests__/agent-tools.test.js +340 -0
- package/dist/cli/services/tools/__tests__/file-ops-cache.test.js +152 -0
- package/dist/cli/services/tools/__tests__/file-ops-notebook.test.js +249 -0
- package/dist/cli/services/tools/__tests__/file-ops-read.test.js +261 -0
- package/dist/cli/services/tools/__tests__/file-ops-write.test.js +292 -0
- package/dist/cli/services/tools/__tests__/search-tools-rg.test.js +92 -0
- package/dist/cli/services/tools/__tests__/search-tools.part2.test.js +174 -0
- package/dist/cli/services/tools/__tests__/search-tools.test.js +227 -0
- package/dist/cli/services/tools/__tests__/shell-exec-allowed-core.test.js +163 -0
- package/dist/cli/services/tools/__tests__/shell-exec-allowed-extended.test.js +220 -0
- package/dist/cli/services/tools/__tests__/shell-exec-allowed.part2.test.js +215 -0
- package/dist/cli/services/tools/__tests__/shell-exec-allowed.test.js +154 -0
- package/dist/cli/services/tools/__tests__/shell-exec-blocked.test.js +132 -0
- package/dist/cli/services/tools/__tests__/shell-exec-execution.test.js +245 -0
- package/dist/cli/services/tools/__tests__/task-manager-create.test.js +110 -0
- package/dist/cli/services/tools/__tests__/task-manager-crud.test.js +339 -0
- package/dist/cli/services/tools/__tests__/task-manager-list-get.test.js +343 -0
- package/dist/cli/services/tools/__tests__/task-manager-query.test.js +346 -0
- package/dist/cli/services/tools/__tests__/task-manager-routing.test.js +58 -0
- package/dist/cli/services/tools/__tests__/task-manager-update.test.js +224 -0
- package/dist/cli/services/tools/__tests__/task-manager.test.js +159 -0
- package/dist/cli/services/tools/__tests__/web-tools-html-search.test.js +227 -0
- package/dist/cli/services/tools/__tests__/web-tools.test.js +285 -0
- package/dist/cli/services/tools/agent-tools-tasks.d.ts +10 -0
- package/dist/cli/services/tools/agent-tools-tasks.js +216 -0
- package/dist/cli/services/tools/agent-tools-tasks.js.map +1 -0
- package/dist/cli/services/tools/agent-tools-team.d.ts +8 -0
- package/dist/cli/services/tools/agent-tools-team.js +101 -0
- package/dist/cli/services/tools/agent-tools-team.js.map +1 -0
- package/dist/cli/services/tools/agent-tools.js +115 -42
- package/dist/cli/services/tools/agent-tools.js.map +1 -1
- package/dist/cli/services/tools/file-ops-notebook.d.ts +9 -0
- package/dist/cli/services/tools/file-ops-notebook.js +186 -0
- package/dist/cli/services/tools/file-ops-notebook.js.map +1 -0
- package/dist/cli/services/tools/file-ops-read.d.ts +11 -0
- package/dist/cli/services/tools/file-ops-read.js +237 -0
- package/dist/cli/services/tools/file-ops-read.js.map +1 -0
- package/dist/cli/services/tools/file-ops-write.d.ts +8 -0
- package/dist/cli/services/tools/file-ops-write.js +260 -0
- package/dist/cli/services/tools/file-ops-write.js.map +1 -0
- package/dist/cli/services/tools/file-ops.d.ts +1 -0
- package/dist/cli/services/tools/file-ops.js +167 -0
- package/dist/cli/services/tools/file-ops.js.map +1 -1
- package/dist/cli/services/tools/html-to-text.d.ts +6 -0
- package/dist/cli/services/tools/html-to-text.js +118 -0
- package/dist/cli/services/tools/html-to-text.js.map +1 -0
- package/dist/cli/services/tools/shell-exec.test.js +148 -0
- package/dist/cli/services/tools/ssrf-guard.d.ts +6 -0
- package/dist/cli/services/tools/ssrf-guard.js +80 -0
- package/dist/cli/services/tools/ssrf-guard.js.map +1 -0
- package/dist/cli/setup/SetupComponents.d.ts +10 -0
- package/dist/cli/setup/SetupComponents.js +144 -0
- package/dist/cli/setup/SetupComponents.js.map +1 -0
- package/dist/cli/setup/setup-cli-targets.d.ts +9 -0
- package/dist/cli/setup/setup-cli-targets.js +49 -0
- package/dist/cli/setup/setup-cli-targets.js.map +1 -0
- package/dist/cli/shared/InlineErrorBoundary.d.ts +22 -0
- package/dist/cli/shared/InlineErrorBoundary.js +35 -0
- package/dist/cli/shared/InlineErrorBoundary.js.map +1 -0
- package/dist/cli/shared/MatrixIntro.js +2 -1
- package/dist/cli/shared/MatrixIntro.js.map +1 -1
- package/dist/cli/shared/SharedTick.d.ts +10 -0
- package/dist/cli/shared/SpinnerSlot.d.ts +16 -8
- package/dist/cli/shared/SpinnerSlot.js +122 -29
- package/dist/cli/shared/SpinnerSlot.js.map +1 -1
- package/dist/cli/shared/WhaleBanner.js +3 -2
- package/dist/cli/shared/WhaleBanner.js.map +1 -1
- package/dist/cli/shared/__tests__/markdown.test.js +188 -0
- package/dist/cli/shared/format-utils.d.ts +16 -0
- package/dist/cli/shared/format-utils.js +121 -0
- package/dist/cli/shared/format-utils.js.map +1 -0
- package/dist/cli/shared/markdown-chart.d.ts +8 -0
- package/dist/cli/shared/markdown-chart.js +92 -0
- package/dist/cli/shared/markdown-chart.js.map +1 -0
- package/dist/cli/shared/markdown-diff.d.ts +15 -0
- package/dist/cli/shared/markdown-diff.js +205 -0
- package/dist/cli/shared/markdown-diff.js.map +1 -0
- package/dist/cli/shared/markdown-helpers.d.ts +33 -0
- package/dist/cli/shared/markdown-helpers.js +129 -0
- package/dist/cli/shared/markdown-helpers.js.map +1 -0
- package/dist/cli/shared/markdown-table.d.ts +10 -0
- package/dist/cli/shared/markdown-table.js +227 -0
- package/dist/cli/shared/markdown-table.js.map +1 -0
- package/dist/cli/shared/markdown.d.ts +2 -6
- package/dist/cli/shared/markdown.js +8 -115
- package/dist/cli/shared/markdown.js.map +1 -1
- package/dist/cli/shared/useLatestRef.d.ts +11 -0
- package/dist/cli/shared/useLatestRef.js +34 -0
- package/dist/cli/shared/useLatestRef.js.map +1 -0
- package/dist/cli/shared/useSyncState.d.ts +11 -0
- package/dist/cli/shared/useSyncState.js +39 -0
- package/dist/cli/shared/useSyncState.js.map +1 -0
- package/dist/cli/stores/StoreApp.js +3 -1
- package/dist/cli/stores/StoreApp.js.map +1 -1
- package/dist/index-agent.d.ts +11 -0
- package/dist/index-agent.js +83 -0
- package/dist/index-agent.js.map +1 -0
- package/dist/index-auth.d.ts +22 -0
- package/dist/index-auth.js +114 -0
- package/dist/index-auth.js.map +1 -0
- package/dist/index-handlers.d.ts +25 -0
- package/dist/index-handlers.js +164 -0
- package/dist/index-handlers.js.map +1 -0
- package/dist/index-tools.d.ts +22 -0
- package/dist/index-tools.js +115 -0
- package/dist/index-tools.js.map +1 -0
- package/dist/local-agent/__tests__/connection-disconnect.test.js +201 -0
- package/dist/local-agent/__tests__/connection-lifecycle.test.js +289 -0
- package/dist/local-agent/__tests__/connection-msghandling.test.js +311 -0
- package/dist/local-agent/__tests__/connection-reconnect.test.js +230 -0
- package/dist/local-agent/__tests__/connection-toolexec.test.js +253 -0
- package/dist/local-agent/__tests__/discovery.test.js +328 -0
- package/dist/local-agent/__tests__/executor-background.test.js +219 -0
- package/dist/local-agent/__tests__/executor-exec.test.js +221 -0
- package/dist/local-agent/__tests__/executor-jobs-sessions.test.js +220 -0
- package/dist/local-agent/__tests__/executor-system-info.test.js +133 -0
- package/dist/local-agent/__tests__/executor-systeminfo.test.js +109 -0
- package/dist/local-agent/__tests__/executor.test.js +235 -0
- package/dist/local-agent/__tests__/index.test.js +139 -0
- package/dist/local-agent/connection-handlers.d.ts +8 -0
- package/dist/local-agent/connection-handlers.js +112 -0
- package/dist/local-agent/connection-handlers.js.map +1 -0
- package/dist/local-agent/connection-tools.d.ts +8 -0
- package/dist/local-agent/connection-tools.js +111 -0
- package/dist/local-agent/connection-tools.js.map +1 -0
- package/dist/local-agent/executor-jobs.d.ts +12 -0
- package/dist/local-agent/executor-jobs.js +143 -0
- package/dist/local-agent/executor-jobs.js.map +1 -0
- package/dist/local-agent/executor.d.ts +3 -0
- package/dist/local-agent/executor.js +2 -2
- package/dist/local-agent/executor.js.map +1 -1
- package/dist/node/__tests__/cli-channels.test.js +293 -0
- package/dist/node/__tests__/cli-config-edge.test.js +154 -0
- package/dist/node/__tests__/cli-config.test.js +215 -0
- package/dist/node/__tests__/config.test.js +292 -0
- package/dist/node/__tests__/runtime-heartbeat.test.js +153 -0
- package/dist/node/__tests__/runtime-lifecycle-init.test.js +263 -0
- package/dist/node/__tests__/runtime-lifecycle-stats.test.js +180 -0
- package/dist/node/__tests__/runtime-lifecycle.test.js +305 -0
- package/dist/node/__tests__/runtime-relay.test.js +341 -0
- package/dist/node/adapters/__tests__/base.test.js +286 -0
- package/dist/node/adapters/__tests__/discord.test.js +284 -0
- package/dist/node/adapters/__tests__/email-send.test.js +295 -0
- package/dist/node/adapters/__tests__/email.inbound-send.test.js +217 -0
- package/dist/node/adapters/__tests__/email.lifecycle.test.js +211 -0
- package/dist/node/adapters/__tests__/email.test.js +290 -0
- package/dist/node/adapters/__tests__/email.webhook-send.test.js +251 -0
- package/dist/node/adapters/__tests__/imessage-filter.test.js +183 -0
- package/dist/node/adapters/__tests__/imessage-lifecycle.test.js +215 -0
- package/dist/node/adapters/__tests__/imessage-send-restart.test.js +227 -0
- package/dist/node/adapters/__tests__/slack.part2.test.js +135 -0
- package/dist/node/adapters/__tests__/slack.test.js +241 -0
- package/dist/node/adapters/__tests__/sms-extras.test.js +108 -0
- package/dist/node/adapters/__tests__/sms-lifecycle.test.js +203 -0
- package/dist/node/adapters/__tests__/sms-messaging.test.js +266 -0
- package/dist/node/adapters/__tests__/sms.part2.test.js +174 -0
- package/dist/node/adapters/__tests__/sms.test.js +253 -0
- package/dist/node/adapters/__tests__/telegram-polling.test.js +256 -0
- package/dist/node/adapters/__tests__/telegram-send.test.js +166 -0
- package/dist/node/adapters/__tests__/webchat-inbound.test.js +188 -0
- package/dist/node/adapters/__tests__/webchat-outbound.test.js +178 -0
- package/dist/node/adapters/__tests__/whatsapp-inbound.test.js +200 -0
- package/dist/node/adapters/__tests__/whatsapp-send.test.js +212 -0
- package/dist/node/adapters/__tests__/whatsapp.test.js +280 -0
- package/dist/node/adapters/discord-gateway.d.ts +42 -0
- package/dist/node/adapters/discord-gateway.js +169 -0
- package/dist/node/adapters/discord-gateway.js.map +1 -0
- package/dist/node/adapters/imessage.d.ts +11 -0
- package/dist/node/adapters/imessage.js +23 -6
- package/dist/node/adapters/imessage.js.map +1 -1
- package/dist/node/cli-channels.d.ts +6 -0
- package/dist/node/cli-channels.js +229 -0
- package/dist/node/cli-channels.js.map +1 -0
- package/dist/node/cli-node.d.ts +9 -0
- package/dist/node/cli-node.js +186 -0
- package/dist/node/cli-node.js.map +1 -0
- package/dist/node/cli-portal.d.ts +11 -0
- package/dist/node/cli-portal.js +503 -0
- package/dist/node/cli-portal.js.map +1 -0
- package/dist/node/portal/portal-target.d.ts +16 -0
- package/dist/node/portal/portal-target.js +102 -0
- package/dist/node/portal/portal-target.js.map +1 -0
- package/dist/node/portal/protocol-frames.d.ts +33 -0
- package/dist/node/portal/protocol-frames.js +170 -0
- package/dist/node/portal/protocol-frames.js.map +1 -0
- package/dist/node/runtime-network.d.ts +25 -0
- package/dist/node/runtime-network.js +226 -0
- package/dist/node/runtime-network.js.map +1 -0
- package/dist/node/runtime-utils.d.ts +27 -0
- package/dist/node/runtime-utils.js +99 -0
- package/dist/node/runtime-utils.js.map +1 -0
- package/dist/node/runtime.d.ts +1 -0
- package/dist/node/runtime.js +71 -1
- package/dist/node/runtime.js.map +1 -1
- package/dist/node/task-runner.d.ts +33 -0
- package/dist/node/task-runner.js +276 -0
- package/dist/node/task-runner.js.map +1 -0
- package/dist/server/__tests__/gateway-fast-fail.test.js +160 -0
- package/dist/server/__tests__/local-agent-gateway.test.js +186 -0
- package/dist/server/__tests__/proxy-handlers-delegation.test.js +240 -0
- package/dist/server/__tests__/proxy-handlers-validation.test.js +211 -0
- package/dist/server/__tests__/proxy-handlers.part2.test.js +240 -0
- package/dist/server/__tests__/proxy-handlers.test.js +213 -0
- package/dist/server/__tests__/strip-base64-e2e.test.js +303 -0
- package/dist/server/__tests__/strip-base64.test.js +256 -0
- package/dist/server/__tests__/tool-router-agent-tools.test.js +324 -0
- package/dist/server/__tests__/tool-router-execute-core.test.js +357 -0
- package/dist/server/__tests__/tool-router-execute-permissions.test.js +332 -0
- package/dist/server/__tests__/tool-router-execute.test.js +348 -0
- package/dist/server/__tests__/tool-router-load.test.js +432 -0
- package/dist/server/__tests__/tool-router-permissions.test.js +359 -0
- package/dist/server/__tests__/tool-router-registry-cache.test.js +383 -0
- package/dist/server/__tests__/tool-router-registry-handlers.test.js +272 -0
- package/dist/server/__tests__/tool-router-registry.test.js +331 -0
- package/dist/server/__tests__/validation-inventory.test.js +250 -0
- package/dist/server/__tests__/validation-misc.test.js +243 -0
- package/dist/server/__tests__/validation-supply-chain.test.js +188 -0
- package/dist/server/__tests__/worker.test.js +265 -0
- package/dist/server/handlers/__test-utils__/test-db.d.ts +2 -0
- package/dist/server/handlers/__test-utils__/test-db.js +14 -1
- package/dist/server/handlers/__test-utils__/test-db.js.map +1 -1
- package/dist/server/handlers/__tests__/conversation-lock.test.js +117 -0
- package/dist/server/handlers/__tests__/e2e/auth-cross-platform-login.e2e.test.js +268 -0
- package/dist/server/handlers/__tests__/e2e/auth-cross-platform-tokens.e2e.test.js +264 -0
- package/dist/server/handlers/__tests__/e2e/email-pipeline-send.e2e.test.js +214 -0
- package/dist/server/handlers/__tests__/e2e/email-pipeline-threads.e2e.test.js +168 -0
- package/dist/server/handlers/__tests__/e2e/error-logging-pipeline-dedup.e2e.test.js +229 -0
- package/dist/server/handlers/__tests__/e2e/error-logging-pipeline.e2e.test.js +239 -0
- package/dist/server/handlers/__tests__/e2e/error-logging-rate-limit.e2e.test.js +150 -0
- package/dist/server/handlers/__tests__/e2e/inventory-sync-guards.e2e.test.js +177 -0
- package/dist/server/handlers/__tests__/e2e/inventory-sync.e2e.test.js +228 -0
- package/dist/server/handlers/__tests__/e2e/inventory-sync.part2.e2e.test.js +188 -0
- package/dist/server/handlers/__tests__/e2e/order-lifecycle-fulfillment.e2e.test.js +295 -0
- package/dist/server/handlers/__tests__/e2e/order-lifecycle.e2e.test.js +277 -0
- package/dist/server/handlers/__tests__/e2e/order-lifecycle.fulfillment.e2e.test.js +307 -0
- package/dist/server/handlers/__tests__/e2e/order-lifecycle.setup.e2e.test.js +177 -0
- package/dist/server/handlers/__tests__/e2e/storefront-checkout-cart.e2e.test.js +255 -0
- package/dist/server/handlers/__tests__/e2e/storefront-checkout-webhook.e2e.test.js +231 -0
- package/dist/server/handlers/__tests__/e2e/workflow-execution-failures.e2e.test.js +235 -0
- package/dist/server/handlers/__tests__/e2e/workflow-execution.e2e.test.js +294 -0
- package/dist/server/handlers/__tests__/e2e/workflow-security.e2e.test.js +311 -0
- package/dist/server/handlers/__tests__/e2e/workflow-security.part2.e2e.test.js +267 -0
- package/dist/server/handlers/__tests__/workflow-cache.test.js +237 -0
- package/dist/server/handlers/analytics-errors-edge.test.js +173 -0
- package/dist/server/handlers/analytics.js +88 -1
- package/dist/server/handlers/analytics.js.map +1 -1
- package/dist/server/handlers/analytics.test.js +280 -0
- package/dist/server/handlers/api-docs-examples-ext.d.ts +9 -0
- package/dist/server/handlers/api-docs-examples-ext.js +278 -0
- package/dist/server/handlers/api-docs-examples-ext.js.map +1 -0
- package/dist/server/handlers/api-docs-examples.d.ts +8 -0
- package/dist/server/handlers/api-docs-examples.js +221 -0
- package/dist/server/handlers/api-docs-examples.js.map +1 -0
- package/dist/server/handlers/api-docs-sections-ext.d.ts +2 -0
- package/dist/server/handlers/api-docs-sections-ext.js +497 -0
- package/dist/server/handlers/api-docs-sections-ext.js.map +1 -0
- package/dist/server/handlers/api-docs-sections.d.ts +21 -0
- package/dist/server/handlers/api-docs-sections.js +293 -0
- package/dist/server/handlers/api-docs-sections.js.map +1 -0
- package/dist/server/handlers/api-docs.d.ts +2 -0
- package/dist/server/handlers/api-docs.js +177 -0
- package/dist/server/handlers/api-docs.js.map +1 -1
- package/dist/server/handlers/api-keys.part2.test.js +157 -0
- package/dist/server/handlers/api-keys.test.js +161 -0
- package/dist/server/handlers/billing-core.d.ts +28 -0
- package/dist/server/handlers/billing-core.js +126 -0
- package/dist/server/handlers/billing-core.js.map +1 -0
- package/dist/server/handlers/billing-routes.d.ts +9 -0
- package/dist/server/handlers/billing-routes.js +243 -0
- package/dist/server/handlers/billing-routes.js.map +1 -0
- package/dist/server/handlers/billing-routes.test.js +123 -0
- package/dist/server/handlers/billing.test.js +215 -0
- package/dist/server/handlers/browser-actions-errors.test.js +94 -0
- package/dist/server/handlers/browser-actions.d.ts +35 -0
- package/dist/server/handlers/browser-actions.js +171 -0
- package/dist/server/handlers/browser-actions.js.map +1 -0
- package/dist/server/handlers/browser-actions.part2.test.js +190 -0
- package/dist/server/handlers/browser-actions.test.js +190 -0
- package/dist/server/handlers/browser-captcha.d.ts +6 -0
- package/dist/server/handlers/browser-captcha.js +172 -0
- package/dist/server/handlers/browser-captcha.js.map +1 -0
- package/dist/server/handlers/browser-lifecycle.d.ts +9 -0
- package/dist/server/handlers/browser-lifecycle.js +142 -0
- package/dist/server/handlers/browser-lifecycle.js.map +1 -0
- package/dist/server/handlers/browser-validation.test.js +257 -0
- package/dist/server/handlers/catalog-advanced.d.ts +9 -0
- package/dist/server/handlers/catalog-advanced.js +352 -0
- package/dist/server/handlers/catalog-advanced.js.map +1 -0
- package/dist/server/handlers/catalog-categories.d.ts +5 -0
- package/dist/server/handlers/catalog-categories.js +181 -0
- package/dist/server/handlers/catalog-categories.js.map +1 -0
- package/dist/server/handlers/catalog-products.d.ts +5 -0
- package/dist/server/handlers/catalog-products.js +404 -0
- package/dist/server/handlers/catalog-products.js.map +1 -0
- package/dist/server/handlers/catalog-schemas.d.ts +5 -0
- package/dist/server/handlers/catalog-schemas.js +426 -0
- package/dist/server/handlers/catalog-schemas.js.map +1 -0
- package/dist/server/handlers/catalog.test.js +297 -0
- package/dist/server/handlers/comms-documents-advanced.d.ts +8 -0
- package/dist/server/handlers/comms-documents-advanced.js +159 -0
- package/dist/server/handlers/comms-documents-advanced.js.map +1 -0
- package/dist/server/handlers/comms-documents.d.ts +10 -0
- package/dist/server/handlers/comms-documents.js +445 -0
- package/dist/server/handlers/comms-documents.js.map +1 -0
- package/dist/server/handlers/comms-email.d.ts +10 -0
- package/dist/server/handlers/comms-email.js +492 -0
- package/dist/server/handlers/comms-email.js.map +1 -0
- package/dist/server/handlers/comms-pdf-generation.d.ts +8 -0
- package/dist/server/handlers/comms-pdf-generation.js +327 -0
- package/dist/server/handlers/comms-pdf-generation.js.map +1 -0
- package/dist/server/handlers/comms-pdf-helpers.d.ts +9 -0
- package/dist/server/handlers/comms-pdf-helpers.js +126 -0
- package/dist/server/handlers/comms-pdf-helpers.js.map +1 -0
- package/dist/server/handlers/comms-shared.d.ts +3 -0
- package/dist/server/handlers/comms-shared.js +28 -0
- package/dist/server/handlers/comms-shared.js.map +1 -0
- package/dist/server/handlers/comms.test.js +289 -0
- package/dist/server/handlers/creations-actions.d.ts +21 -0
- package/dist/server/handlers/creations-actions.js +250 -0
- package/dist/server/handlers/creations-actions.js.map +1 -0
- package/dist/server/handlers/creations-advanced-collections.test.js +214 -0
- package/dist/server/handlers/creations-advanced-generate.test.js +142 -0
- package/dist/server/handlers/creations-advanced.test.js +171 -0
- package/dist/server/handlers/creations-collections-preview.test.js +214 -0
- package/dist/server/handlers/creations-crud.d.ts +35 -0
- package/dist/server/handlers/creations-crud.js +248 -0
- package/dist/server/handlers/creations-crud.js.map +1 -0
- package/dist/server/handlers/creations-crud.test.js +260 -0
- package/dist/server/handlers/creations-generate.d.ts +21 -0
- package/dist/server/handlers/creations-generate.js +256 -0
- package/dist/server/handlers/creations-generate.js.map +1 -0
- package/dist/server/handlers/creations-mutations.test.js +197 -0
- package/dist/server/handlers/crm-customers-read.d.ts +58 -0
- package/dist/server/handlers/crm-customers-read.js +208 -0
- package/dist/server/handlers/crm-customers-read.js.map +1 -0
- package/dist/server/handlers/crm-customers-write.d.ts +54 -0
- package/dist/server/handlers/crm-customers-write.js +414 -0
- package/dist/server/handlers/crm-customers-write.js.map +1 -0
- package/dist/server/handlers/crm-utils.d.ts +6 -0
- package/dist/server/handlers/crm-utils.js +19 -0
- package/dist/server/handlers/crm-utils.js.map +1 -0
- package/dist/server/handlers/crm.test.js +179 -0
- package/dist/server/handlers/discovery-advertise.d.ts +18 -0
- package/dist/server/handlers/discovery-advertise.js +101 -0
- package/dist/server/handlers/discovery-advertise.js.map +1 -0
- package/dist/server/handlers/discovery-advertise.test.js +185 -0
- package/dist/server/handlers/discovery-scan.d.ts +19 -0
- package/dist/server/handlers/discovery-scan.js +107 -0
- package/dist/server/handlers/discovery-scan.js.map +1 -0
- package/dist/server/handlers/discovery-scan.test.js +233 -0
- package/dist/server/handlers/embeddings-embed-search.test.js +196 -0
- package/dist/server/handlers/embeddings-index-delete-stats.test.js +140 -0
- package/dist/server/handlers/embeddings-search.test.js +221 -0
- package/dist/server/handlers/embeddings.test.js +137 -0
- package/dist/server/handlers/enrichment-breach.d.ts +8 -0
- package/dist/server/handlers/enrichment-breach.js +266 -0
- package/dist/server/handlers/enrichment-breach.js.map +1 -0
- package/dist/server/handlers/enrichment-data.d.ts +13 -0
- package/dist/server/handlers/enrichment-data.js +145 -0
- package/dist/server/handlers/enrichment-data.js.map +1 -0
- package/dist/server/handlers/enrichment-enrich.d.ts +6 -0
- package/dist/server/handlers/enrichment-enrich.js +235 -0
- package/dist/server/handlers/enrichment-enrich.js.map +1 -0
- package/dist/server/handlers/enrichment-helpers.d.ts +10 -0
- package/dist/server/handlers/enrichment-helpers.js +17 -0
- package/dist/server/handlers/enrichment-helpers.js.map +1 -0
- package/dist/server/handlers/enrichment-mutations.test.js +240 -0
- package/dist/server/handlers/enrichment-queries.test.js +181 -0
- package/dist/server/handlers/enrichment-validation.test.js +177 -0
- package/dist/server/handlers/enrichment-writes.d.ts +16 -0
- package/dist/server/handlers/enrichment-writes.js +226 -0
- package/dist/server/handlers/enrichment-writes.js.map +1 -0
- package/dist/server/handlers/image-gen-actions.d.ts +18 -0
- package/dist/server/handlers/image-gen-actions.js +183 -0
- package/dist/server/handlers/image-gen-actions.js.map +1 -0
- package/dist/server/handlers/image-gen-providers.d.ts +29 -0
- package/dist/server/handlers/image-gen-providers.js +161 -0
- package/dist/server/handlers/image-gen-providers.js.map +1 -0
- package/dist/server/handlers/image-gen.test.js +205 -0
- package/dist/server/handlers/inventory-audit.d.ts +10 -0
- package/dist/server/handlers/inventory-audit.js +90 -0
- package/dist/server/handlers/inventory-audit.js.map +1 -0
- package/dist/server/handlers/inventory-helpers.d.ts +8 -0
- package/dist/server/handlers/inventory-helpers.js +19 -0
- package/dist/server/handlers/inventory-helpers.js.map +1 -0
- package/dist/server/handlers/inventory-query.d.ts +67 -0
- package/dist/server/handlers/inventory-query.js +299 -0
- package/dist/server/handlers/inventory-query.js.map +1 -0
- package/dist/server/handlers/inventory.test.js +380 -0
- package/dist/server/handlers/kali-background.test.js +222 -0
- package/dist/server/handlers/kali-errors.test.js +92 -0
- package/dist/server/handlers/kali-validation.test.js +234 -0
- package/dist/server/handlers/llm-providers-actions.test.js +220 -0
- package/dist/server/handlers/llm-providers-anthropic.test.js +239 -0
- package/dist/server/handlers/llm-providers-clients.d.ts +6 -0
- package/dist/server/handlers/llm-providers-clients.js +296 -0
- package/dist/server/handlers/llm-providers-clients.js.map +1 -0
- package/dist/server/handlers/llm-providers-credentials.d.ts +3 -0
- package/dist/server/handlers/llm-providers-credentials.js +109 -0
- package/dist/server/handlers/llm-providers-credentials.js.map +1 -0
- package/dist/server/handlers/llm-providers-failover.test.js +232 -0
- package/dist/server/handlers/llm-providers-models.d.ts +67 -0
- package/dist/server/handlers/llm-providers-models.js +213 -0
- package/dist/server/handlers/llm-providers-models.js.map +1 -0
- package/dist/server/handlers/llm-providers-providers.test.js +300 -0
- package/dist/server/handlers/llm-providers-validation.test.js +239 -0
- package/dist/server/handlers/local-agent-tools.test.js +224 -0
- package/dist/server/handlers/local-agent.test.js +198 -0
- package/dist/server/handlers/local-agent.tools-status.test.js +204 -0
- package/dist/server/handlers/local-agent.validation-exec.test.js +182 -0
- package/dist/server/handlers/media-actions.d.ts +14 -0
- package/dist/server/handlers/media-actions.js +398 -0
- package/dist/server/handlers/media-actions.js.map +1 -0
- package/dist/server/handlers/media-crud.d.ts +9 -0
- package/dist/server/handlers/media-crud.js +365 -0
- package/dist/server/handlers/media-crud.js.map +1 -0
- package/dist/server/handlers/media-upload.d.ts +4 -0
- package/dist/server/handlers/media-upload.js +179 -0
- package/dist/server/handlers/media-upload.js.map +1 -0
- package/dist/server/handlers/media-utils.d.ts +14 -0
- package/dist/server/handlers/media-utils.js +33 -0
- package/dist/server/handlers/media-utils.js.map +1 -0
- package/dist/server/handlers/meta-ads-advanced.d.ts +46 -0
- package/dist/server/handlers/meta-ads-advanced.js +222 -0
- package/dist/server/handlers/meta-ads-advanced.js.map +1 -0
- package/dist/server/handlers/meta-ads-audience-rules.test.js +243 -0
- package/dist/server/handlers/meta-ads-audience-targeting.test.js +205 -0
- package/dist/server/handlers/meta-ads-audiences-targeting.test.js +383 -0
- package/dist/server/handlers/meta-ads-audiences.d.ts +48 -0
- package/dist/server/handlers/meta-ads-audiences.js +214 -0
- package/dist/server/handlers/meta-ads-audiences.js.map +1 -0
- package/dist/server/handlers/meta-ads-crud-ads.test.js +136 -0
- package/dist/server/handlers/meta-ads-crud-campaigns.test.js +189 -0
- package/dist/server/handlers/meta-ads-crud-create.test.js +303 -0
- package/dist/server/handlers/meta-ads-crud-list-update.test.js +259 -0
- package/dist/server/handlers/meta-ads-crud-read.d.ts +78 -0
- package/dist/server/handlers/meta-ads-crud-read.js +204 -0
- package/dist/server/handlers/meta-ads-crud-read.js.map +1 -0
- package/dist/server/handlers/meta-ads-crud-write.d.ts +105 -0
- package/dist/server/handlers/meta-ads-crud-write.js +390 -0
- package/dist/server/handlers/meta-ads-crud-write.js.map +1 -0
- package/dist/server/handlers/meta-ads-crud.d.ts +9 -0
- package/dist/server/handlers/meta-ads-crud.js +12 -0
- package/dist/server/handlers/meta-ads-crud.js.map +1 -0
- package/dist/server/handlers/meta-ads-delete-publish-sync.test.js +282 -0
- package/dist/server/handlers/meta-ads-graph-api.d.ts +25 -0
- package/dist/server/handlers/meta-ads-graph-api.js +155 -0
- package/dist/server/handlers/meta-ads-graph-api.js.map +1 -0
- package/dist/server/handlers/meta-ads-insights.test.js +80 -0
- package/dist/server/handlers/meta-ads-list-get.test.js +237 -0
- package/dist/server/handlers/meta-ads-media.d.ts +16 -0
- package/dist/server/handlers/meta-ads-media.js +205 -0
- package/dist/server/handlers/meta-ads-media.js.map +1 -0
- package/dist/server/handlers/meta-ads-pixels-rules.d.ts +127 -0
- package/dist/server/handlers/meta-ads-pixels-rules.js +463 -0
- package/dist/server/handlers/meta-ads-pixels-rules.js.map +1 -0
- package/dist/server/handlers/meta-ads-publish-ad.d.ts +11 -0
- package/dist/server/handlers/meta-ads-publish-ad.js +229 -0
- package/dist/server/handlers/meta-ads-publish-ad.js.map +1 -0
- package/dist/server/handlers/meta-ads-publish-delete.test.js +254 -0
- package/dist/server/handlers/meta-ads-publish-helpers.js +117 -0
- package/dist/server/handlers/meta-ads-publish-helpers.js.map +1 -0
- package/dist/server/handlers/meta-ads-publish-sync.test.js +205 -0
- package/dist/server/handlers/meta-ads-publish.d.ts +14 -0
- package/dist/server/handlers/meta-ads-publish.js +194 -0
- package/dist/server/handlers/meta-ads-publish.js.map +1 -0
- package/dist/server/handlers/meta-ads-publish.test.js +254 -0
- package/dist/server/handlers/meta-ads-sync-insights.test.js +184 -0
- package/dist/server/handlers/meta-ads-targeting.d.ts +27 -0
- package/dist/server/handlers/meta-ads-targeting.js +323 -0
- package/dist/server/handlers/meta-ads-targeting.js.map +1 -0
- package/dist/server/handlers/meta-ads-types.d.ts +49 -0
- package/dist/server/handlers/meta-ads-types.js +59 -0
- package/dist/server/handlers/meta-ads-types.js.map +1 -0
- package/dist/server/handlers/meta-ads-update.test.js +117 -0
- package/dist/server/handlers/meta-ads.d.ts +25 -0
- package/dist/server/handlers/meta-ads.js +392 -3
- package/dist/server/handlers/meta-ads.js.map +1 -1
- package/dist/server/handlers/nodes-channels.test.js +413 -0
- package/dist/server/handlers/nodes-events.test.js +131 -0
- package/dist/server/handlers/nodes-handlers-channels-messages.d.ts +20 -0
- package/dist/server/handlers/nodes-handlers-channels-messages.js +314 -0
- package/dist/server/handlers/nodes-handlers-channels-messages.js.map +1 -0
- package/dist/server/handlers/nodes-handlers-channels.d.ts +19 -0
- package/dist/server/handlers/nodes-handlers-channels.js +225 -0
- package/dist/server/handlers/nodes-handlers-channels.js.map +1 -0
- package/dist/server/handlers/nodes-handlers-mgmt.d.ts +33 -0
- package/dist/server/handlers/nodes-handlers-mgmt.js +418 -0
- package/dist/server/handlers/nodes-handlers-mgmt.js.map +1 -0
- package/dist/server/handlers/nodes-list-delete.test.js +171 -0
- package/dist/server/handlers/nodes-messages-delivery.test.js +208 -0
- package/dist/server/handlers/nodes-messages.test.js +211 -0
- package/dist/server/handlers/nodes-register.test.js +277 -0
- package/dist/server/handlers/nodes-routes-channels.d.ts +9 -0
- package/dist/server/handlers/nodes-routes-channels.js +217 -0
- package/dist/server/handlers/nodes-routes-channels.js.map +1 -0
- package/dist/server/handlers/nodes-routes-crud.d.ts +9 -0
- package/dist/server/handlers/nodes-routes-crud.js +290 -0
- package/dist/server/handlers/nodes-routes-crud.js.map +1 -0
- package/dist/server/handlers/nodes-routes-delivery.d.ts +9 -0
- package/dist/server/handlers/nodes-routes-delivery.js +226 -0
- package/dist/server/handlers/nodes-routes-delivery.js.map +1 -0
- package/dist/server/handlers/nodes-routes-messages.d.ts +9 -0
- package/dist/server/handlers/nodes-routes-messages.js +218 -0
- package/dist/server/handlers/nodes-routes-messages.js.map +1 -0
- package/dist/server/handlers/nodes-routes-register.d.ts +9 -0
- package/dist/server/handlers/nodes-routes-register.js +239 -0
- package/dist/server/handlers/nodes-routes-register.js.map +1 -0
- package/dist/server/handlers/nodes-types.d.ts +82 -0
- package/dist/server/handlers/nodes-types.js +220 -0
- package/dist/server/handlers/nodes-types.js.map +1 -0
- package/dist/server/handlers/nodes-utils.d.ts +70 -0
- package/dist/server/handlers/nodes-utils.js +214 -0
- package/dist/server/handlers/nodes-utils.js.map +1 -0
- package/dist/server/handlers/nodes.test.js +353 -0
- package/dist/server/handlers/operations.test.js +136 -0
- package/dist/server/handlers/platform-telemetry.d.ts +10 -0
- package/dist/server/handlers/platform-telemetry.js +372 -0
- package/dist/server/handlers/platform-telemetry.js.map +1 -0
- package/dist/server/handlers/platform-telemetry.test.js +200 -0
- package/dist/server/handlers/platform-websearch.test.js +160 -0
- package/dist/server/handlers/sessions-handlers.d.ts +23 -0
- package/dist/server/handlers/sessions-handlers.js +374 -0
- package/dist/server/handlers/sessions-handlers.js.map +1 -0
- package/dist/server/handlers/storefront-cart.d.ts +31 -0
- package/dist/server/handlers/storefront-cart.js +381 -0
- package/dist/server/handlers/storefront-cart.js.map +1 -0
- package/dist/server/handlers/storefront.test.js +329 -0
- package/dist/server/handlers/supply-chain-transfers.d.ts +10 -0
- package/dist/server/handlers/supply-chain-transfers.js +214 -0
- package/dist/server/handlers/supply-chain-transfers.js.map +1 -0
- package/dist/server/handlers/supply-chain-utils.d.ts +2 -0
- package/dist/server/handlers/supply-chain-utils.js +21 -0
- package/dist/server/handlers/supply-chain-utils.js.map +1 -0
- package/dist/server/handlers/supply-chain.test.js +347 -0
- package/dist/server/handlers/transcription.test.js +118 -0
- package/dist/server/handlers/video-gen-providers.d.ts +30 -0
- package/dist/server/handlers/video-gen-providers.js +205 -0
- package/dist/server/handlers/video-gen-providers.js.map +1 -0
- package/dist/server/handlers/video-gen-sora.d.ts +5 -0
- package/dist/server/handlers/video-gen-sora.js +87 -0
- package/dist/server/handlers/video-gen-sora.js.map +1 -0
- package/dist/server/handlers/video-gen-veo.js +114 -0
- package/dist/server/handlers/video-gen-veo.js.map +1 -0
- package/dist/server/handlers/video-gen.test.js +146 -0
- package/dist/server/handlers/voice-handlers-audio.d.ts +9 -0
- package/dist/server/handlers/voice-handlers-audio.js +229 -0
- package/dist/server/handlers/voice-handlers-audio.js.map +1 -0
- package/dist/server/handlers/voice-handlers-music.d.ts +5 -0
- package/dist/server/handlers/voice-handlers-music.js +124 -0
- package/dist/server/handlers/voice-handlers-music.js.map +1 -0
- package/dist/server/handlers/voice-handlers-pvc.d.ts +8 -0
- package/dist/server/handlers/voice-handlers-pvc.js +345 -0
- package/dist/server/handlers/voice-handlers-pvc.js.map +1 -0
- package/dist/server/handlers/voice-handlers-tts.d.ts +5 -0
- package/dist/server/handlers/voice-handlers-tts.js +142 -0
- package/dist/server/handlers/voice-handlers-tts.js.map +1 -0
- package/dist/server/handlers/voice-handlers-voices.d.ts +8 -0
- package/dist/server/handlers/voice-handlers-voices.js +321 -0
- package/dist/server/handlers/voice-handlers-voices.js.map +1 -0
- package/dist/server/handlers/voice-utils.d.ts +32 -0
- package/dist/server/handlers/voice-utils.js +281 -0
- package/dist/server/handlers/voice-utils.js.map +1 -0
- package/dist/server/handlers/voice.test.js +153 -0
- package/dist/server/handlers/workflow-crud-advanced.d.ts +8 -0
- package/dist/server/handlers/workflow-crud-advanced.js +275 -0
- package/dist/server/handlers/workflow-crud-advanced.js.map +1 -0
- package/dist/server/handlers/workflow-crud-core.d.ts +8 -0
- package/dist/server/handlers/workflow-crud-core.js +286 -0
- package/dist/server/handlers/workflow-crud-core.js.map +1 -0
- package/dist/server/handlers/workflow-crud-events.d.ts +8 -0
- package/dist/server/handlers/workflow-crud-events.js +483 -0
- package/dist/server/handlers/workflow-crud-events.js.map +1 -0
- package/dist/server/handlers/workflow-crud-runs-lifecycle.d.ts +8 -0
- package/dist/server/handlers/workflow-crud-runs-lifecycle.js +231 -0
- package/dist/server/handlers/workflow-crud-runs-lifecycle.js.map +1 -0
- package/dist/server/handlers/workflow-crud-runs-versioning.d.ts +8 -0
- package/dist/server/handlers/workflow-crud-runs-versioning.js +319 -0
- package/dist/server/handlers/workflow-crud-runs-versioning.js.map +1 -0
- package/dist/server/handlers/workflow-crud-runs.d.ts +8 -0
- package/dist/server/handlers/workflow-crud-runs.js +18 -0
- package/dist/server/handlers/workflow-crud-runs.js.map +1 -0
- package/dist/server/handlers/workflow-steps-advancement.d.ts +13 -0
- package/dist/server/handlers/workflow-steps-advancement.js +197 -0
- package/dist/server/handlers/workflow-steps-advancement.js.map +1 -0
- package/dist/server/handlers/workflow-steps-circuit-breaker.d.ts +7 -0
- package/dist/server/handlers/workflow-steps-circuit-breaker.js +131 -0
- package/dist/server/handlers/workflow-steps-circuit-breaker.js.map +1 -0
- package/dist/server/handlers/workflow-steps-completion.d.ts +5 -0
- package/dist/server/handlers/workflow-steps-completion.js +254 -0
- package/dist/server/handlers/workflow-steps-completion.js.map +1 -0
- package/dist/server/handlers/workflow-steps-cron.d.ts +4 -0
- package/dist/server/handlers/workflow-steps-cron.js +259 -0
- package/dist/server/handlers/workflow-steps-cron.js.map +1 -0
- package/dist/server/handlers/workflow-steps-engine-execute.d.ts +3 -0
- package/dist/server/handlers/workflow-steps-engine-execute.js +388 -0
- package/dist/server/handlers/workflow-steps-engine-execute.js.map +1 -0
- package/dist/server/handlers/workflow-steps-engine-inline.d.ts +2 -0
- package/dist/server/handlers/workflow-steps-engine-inline.js +91 -0
- package/dist/server/handlers/workflow-steps-engine-inline.js.map +1 -0
- package/dist/server/handlers/workflow-steps-engine-persist.d.ts +5 -0
- package/dist/server/handlers/workflow-steps-engine-persist.js +192 -0
- package/dist/server/handlers/workflow-steps-engine-persist.js.map +1 -0
- package/dist/server/handlers/workflow-steps-engine-process.d.ts +7 -0
- package/dist/server/handlers/workflow-steps-engine-process.js +290 -0
- package/dist/server/handlers/workflow-steps-engine-process.js.map +1 -0
- package/dist/server/handlers/workflow-steps-engine.d.ts +3 -0
- package/dist/server/handlers/workflow-steps-engine.js +10 -0
- package/dist/server/handlers/workflow-steps-engine.js.map +1 -0
- package/dist/server/handlers/workflow-steps-executors-llm.d.ts +7 -0
- package/dist/server/handlers/workflow-steps-executors-llm.js +265 -0
- package/dist/server/handlers/workflow-steps-executors-llm.js.map +1 -0
- package/dist/server/handlers/workflow-steps-executors.d.ts +9 -0
- package/dist/server/handlers/workflow-steps-executors.js +188 -0
- package/dist/server/handlers/workflow-steps-executors.js.map +1 -0
- package/dist/server/handlers/workflow-steps-maintenance.d.ts +4 -0
- package/dist/server/handlers/workflow-steps-maintenance.js +256 -0
- package/dist/server/handlers/workflow-steps-maintenance.js.map +1 -0
- package/dist/server/handlers/workflow-steps-types.d.ts +84 -0
- package/dist/server/handlers/workflow-steps-types.js +179 -0
- package/dist/server/handlers/workflow-steps-types.js.map +1 -0
- package/dist/server/handlers/workflow-steps-webhook.d.ts +5 -0
- package/dist/server/handlers/workflow-steps-webhook.js +179 -0
- package/dist/server/handlers/workflow-steps-webhook.js.map +1 -0
- package/dist/server/handlers/workflow-steps.test.js +330 -0
- package/dist/server/handlers/workflows-extras.test.js +65 -0
- package/dist/server/handlers/workflows.part2.test.js +170 -0
- package/dist/server/handlers/workflows.test.js +281 -0
- package/dist/server/index.js +81 -1720
- package/dist/server/index.js.map +1 -1
- package/dist/server/lib/__tests__/batch-client-conversion-jsonl.test.js +171 -0
- package/dist/server/lib/__tests__/batch-client-polling.test.js +292 -0
- package/dist/server/lib/__tests__/batch-client-queue.test.js +270 -0
- package/dist/server/lib/__tests__/clickhouse-buffer.test.js +236 -0
- package/dist/server/lib/__tests__/code-worker-edge-cases.test.js +118 -0
- package/dist/server/lib/__tests__/code-worker-pool-execute.test.js +193 -0
- package/dist/server/lib/__tests__/code-worker-pool-execution.test.js +165 -0
- package/dist/server/lib/__tests__/code-worker-pool-init.test.js +131 -0
- package/dist/server/lib/__tests__/code-worker-pool.test.js +194 -0
- package/dist/server/lib/__tests__/code-worker-sandbox-ops.test.js +123 -0
- package/dist/server/lib/__tests__/code-worker-sandbox.test.js +217 -0
- package/dist/server/lib/__tests__/code-worker.test.js +179 -0
- package/dist/server/lib/__tests__/compaction-service-generate.test.js +229 -0
- package/dist/server/lib/__tests__/compaction-service.test.js +319 -0
- package/dist/server/lib/__tests__/otel.test.js +146 -0
- package/dist/server/lib/__tests__/prompt-sanitizer-validation.test.js +165 -0
- package/dist/server/lib/__tests__/prompt-sanitizer.sanitize.test.js +343 -0
- package/dist/server/lib/__tests__/prompt-sanitizer.test.js +328 -0
- package/dist/server/lib/__tests__/prompt-sanitizer.validate-tool.test.js +145 -0
- package/dist/server/lib/__tests__/provider-capabilities.test.js +263 -0
- package/dist/server/lib/__tests__/provider-failover-routing.test.js +145 -0
- package/dist/server/lib/__tests__/provider-failover-state.test.js +131 -0
- package/dist/server/lib/__tests__/rate-limiter-budgets.test.js +216 -0
- package/dist/server/lib/__tests__/rate-limiter.budgets-tools.test.js +113 -0
- package/dist/server/lib/__tests__/rate-limiter.check-request.test.js +141 -0
- package/dist/server/lib/__tests__/rate-limiter.stats-lifecycle.test.js +135 -0
- package/dist/server/lib/__tests__/rate-limiter.test.js +207 -0
- package/dist/server/lib/__tests__/server-agent-loop-abort-conditions.test.js +544 -0
- package/dist/server/lib/__tests__/server-agent-loop-abort.part2.test.js +504 -0
- package/dist/server/lib/__tests__/server-agent-loop-abort.test.js +396 -0
- package/dist/server/lib/__tests__/server-agent-loop-compaction.test.js +397 -0
- package/dist/server/lib/__tests__/server-agent-loop-failover.test.js +356 -0
- package/dist/server/lib/__tests__/server-agent-loop-features-caching.test.js +519 -0
- package/dist/server/lib/__tests__/server-agent-loop-features-edges.test.js +512 -0
- package/dist/server/lib/__tests__/server-subagent-bailout.test.js +194 -0
- package/dist/server/lib/__tests__/server-subagent-basics.test.js +348 -0
- package/dist/server/lib/__tests__/server-subagent-errors-abort.test.js +319 -0
- package/dist/server/lib/__tests__/server-subagent-errors-progress.test.js +253 -0
- package/dist/server/lib/__tests__/server-subagent-errors.part2.test.js +253 -0
- package/dist/server/lib/__tests__/server-subagent-errors.test.js +319 -0
- package/dist/server/lib/__tests__/session-checkpoint-load.test.js +275 -0
- package/dist/server/lib/__tests__/session-checkpoint-save.test.js +159 -0
- package/dist/server/lib/__tests__/ssrf-guard.test.js +93 -0
- package/dist/server/lib/__tests__/supabase-client.test.js +111 -0
- package/dist/server/lib/__tests__/template-resolver.test.js +317 -0
- package/dist/server/lib/__tests__/utils-timeout.test.js +49 -0
- package/dist/server/lib/__tests__/utils.test.js +322 -0
- package/dist/server/lib/agent-loop-executor.d.ts +7 -0
- package/dist/server/lib/agent-loop-executor.js +224 -0
- package/dist/server/lib/agent-loop-executor.js.map +1 -0
- package/dist/server/lib/agent-loop-turn.d.ts +53 -0
- package/dist/server/lib/agent-loop-turn.js +166 -0
- package/dist/server/lib/agent-loop-turn.js.map +1 -0
- package/dist/server/lib/agent-loop-types.d.ts +118 -0
- package/dist/server/lib/agent-loop-types.js +53 -0
- package/dist/server/lib/agent-loop-types.js.map +1 -0
- package/dist/server/lib/batch-client-anthropic.d.ts +10 -0
- package/dist/server/lib/batch-client-anthropic.js +144 -0
- package/dist/server/lib/batch-client-anthropic.js.map +1 -0
- package/dist/server/lib/batch-client-openai.d.ts +10 -0
- package/dist/server/lib/batch-client-openai.js +172 -0
- package/dist/server/lib/batch-client-openai.js.map +1 -0
- package/dist/server/lib/batch-client-types.d.ts +54 -0
- package/dist/server/lib/batch-client-types.js +27 -0
- package/dist/server/lib/batch-client-types.js.map +1 -0
- package/dist/server/lib/coa-renderer-components.d.ts +15 -0
- package/dist/server/lib/coa-renderer-components.js +361 -0
- package/dist/server/lib/coa-renderer-components.js.map +1 -0
- package/dist/server/lib/coa-renderer-pages.d.ts +15 -0
- package/dist/server/lib/coa-renderer-pages.js +467 -0
- package/dist/server/lib/coa-renderer-pages.js.map +1 -0
- package/dist/server/lib/coa-renderer-styles.d.ts +525 -0
- package/dist/server/lib/coa-renderer-styles.js +540 -0
- package/dist/server/lib/coa-renderer-styles.js.map +1 -0
- package/dist/server/lib/coa-renderer-tokens.d.ts +107 -0
- package/dist/server/lib/coa-renderer-tokens.js +46 -0
- package/dist/server/lib/coa-renderer-tokens.js.map +1 -0
- package/dist/server/lib/pdf-renderer-calc.d.ts +7 -0
- package/dist/server/lib/pdf-renderer-calc.js +272 -0
- package/dist/server/lib/pdf-renderer-calc.js.map +1 -0
- package/dist/server/lib/pdf-renderer-generation.d.ts +73 -0
- package/dist/server/lib/pdf-renderer-generation.js +298 -0
- package/dist/server/lib/pdf-renderer-generation.js.map +1 -0
- package/dist/server/lib/pdf-renderer-layout.d.ts +2 -0
- package/dist/server/lib/pdf-renderer-layout.js +144 -0
- package/dist/server/lib/pdf-renderer-layout.js.map +1 -0
- package/dist/server/lib/pdf-renderer-validation.d.ts +14 -0
- package/dist/server/lib/pdf-renderer-validation.js +220 -0
- package/dist/server/lib/pdf-renderer-validation.js.map +1 -0
- package/dist/server/lib/react-pdf-layout-elements.d.ts +8 -0
- package/dist/server/lib/react-pdf-layout-elements.js +366 -0
- package/dist/server/lib/react-pdf-layout-elements.js.map +1 -0
- package/dist/server/lib/react-pdf-layout-labels.d.ts +38 -0
- package/dist/server/lib/react-pdf-layout-labels.js +217 -0
- package/dist/server/lib/react-pdf-layout-labels.js.map +1 -0
- package/dist/server/lib/server-agent-loop-init.d.ts +28 -0
- package/dist/server/lib/server-agent-loop-init.js +138 -0
- package/dist/server/lib/server-agent-loop-init.js.map +1 -0
- package/dist/server/lib/server-agent-loop-v2.d.ts +110 -0
- package/dist/server/lib/server-agent-loop-v2.js +340 -0
- package/dist/server/lib/server-agent-loop-v2.js.map +1 -0
- package/dist/server/lib/server-agent-loop.js +2 -1
- package/dist/server/lib/server-agent-loop.js.map +1 -1
- package/dist/server/lib/server-subagent-loop.d.ts +3 -0
- package/dist/server/lib/server-subagent-loop.js +267 -0
- package/dist/server/lib/server-subagent-loop.js.map +1 -0
- package/dist/server/lib/session-types.d.ts +106 -0
- package/dist/server/lib/session-types.js +2 -0
- package/dist/server/lib/session-types.js.map +1 -0
- package/dist/server/local-agent-gateway-api.d.ts +34 -0
- package/dist/server/local-agent-gateway-api.js +156 -0
- package/dist/server/local-agent-gateway-api.js.map +1 -0
- package/dist/server/local-agent-gateway-handler.d.ts +3 -0
- package/dist/server/local-agent-gateway-handler.js +292 -0
- package/dist/server/local-agent-gateway-handler.js.map +1 -0
- package/dist/server/local-agent-gateway-init.d.ts +21 -0
- package/dist/server/local-agent-gateway-init.js +143 -0
- package/dist/server/local-agent-gateway-init.js.map +1 -0
- package/dist/server/local-agent-gateway-messages.d.ts +12 -0
- package/dist/server/local-agent-gateway-messages.js +108 -0
- package/dist/server/local-agent-gateway-messages.js.map +1 -0
- package/dist/server/local-agent-gateway-stats.d.ts +53 -0
- package/dist/server/local-agent-gateway-stats.js +129 -0
- package/dist/server/local-agent-gateway-stats.js.map +1 -0
- package/dist/server/local-agent-gateway-types.d.ts +94 -0
- package/dist/server/local-agent-gateway-types.js +78 -0
- package/dist/server/local-agent-gateway-types.js.map +1 -0
- package/dist/server/local-agent-gateway.d.ts +6 -0
- package/dist/server/local-agent-gateway.js +40 -0
- package/dist/server/local-agent-gateway.js.map +1 -1
- package/dist/server/providers/__tests__/anthropic-adapter.test.js +228 -0
- package/dist/server/providers/__tests__/anthropic-betas-toolchoice.test.js +257 -0
- package/dist/server/providers/__tests__/anthropic-errors.test.js +262 -0
- package/dist/server/providers/__tests__/anthropic-stream-core.test.js +275 -0
- package/dist/server/providers/__tests__/anthropic-streaming-betas.test.js +247 -0
- package/dist/server/providers/__tests__/anthropic-streaming-core.test.js +275 -0
- package/dist/server/providers/__tests__/bedrock-config.test.js +177 -0
- package/dist/server/providers/__tests__/bedrock-stream-behavior-streaming.test.js +272 -0
- package/dist/server/providers/__tests__/bedrock-stream-behavior-toolchoice.test.js +214 -0
- package/dist/server/providers/__tests__/bedrock-stream-behavior.part2.test.js +165 -0
- package/dist/server/providers/__tests__/bedrock-stream-behavior.test.js +309 -0
- package/dist/server/providers/__tests__/bedrock-stream-body-credentials.test.js +170 -0
- package/dist/server/providers/__tests__/bedrock-stream-body-extras.test.js +183 -0
- package/dist/server/providers/__tests__/bedrock-stream-body-request.test.js +305 -0
- package/dist/server/providers/__tests__/bedrock-stream-body.part2.test.js +305 -0
- package/dist/server/providers/__tests__/bedrock-stream-body.test.js +175 -0
- package/dist/server/providers/__tests__/bedrock-stream-errors.test.js +165 -0
- package/dist/server/providers/__tests__/gemini-config-methods.test.js +182 -0
- package/dist/server/providers/__tests__/gemini-config-streaming.test.js +257 -0
- package/dist/server/providers/__tests__/gemini-conversion-messages.test.js +247 -0
- package/dist/server/providers/__tests__/gemini-conversion-schema.test.js +365 -0
- package/dist/server/providers/__tests__/gemini-tools-choice.test.js +221 -0
- package/dist/server/providers/__tests__/gemini-tools-fn.test.js +252 -0
- package/dist/server/providers/__tests__/openai-config.test.js +194 -0
- package/dist/server/providers/__tests__/openai-conversion.test.js +276 -0
- package/dist/server/providers/__tests__/openai-messages.test.js +261 -0
- package/dist/server/providers/__tests__/openai-streaming.test.js +394 -0
- package/dist/server/providers/__tests__/openai-tools-cache.test.js +227 -0
- package/dist/server/providers/__tests__/registry.test.js +183 -0
- package/dist/server/providers/__tests__/shared.test.js +297 -0
- package/dist/server/providers/gemini-conversion.d.ts +17 -0
- package/dist/server/providers/gemini-conversion.js +185 -0
- package/dist/server/providers/gemini-conversion.js.map +1 -0
- package/dist/server/providers/gemini-streaming.d.ts +18 -0
- package/dist/server/providers/gemini-streaming.js +187 -0
- package/dist/server/providers/gemini-streaming.js.map +1 -0
- package/dist/server/providers/openai-adapter.d.ts +15 -0
- package/dist/server/providers/openai-adapter.js +423 -0
- package/dist/server/providers/openai-adapter.js.map +1 -0
- package/dist/server/providers/openai-conversion.d.ts +21 -0
- package/dist/server/providers/openai-conversion.js +191 -0
- package/dist/server/providers/openai-conversion.js.map +1 -0
- package/dist/server/server-agent.d.ts +21 -0
- package/dist/server/server-agent.js +162 -0
- package/dist/server/server-agent.js.map +1 -0
- package/dist/server/server-chat.d.ts +6 -0
- package/dist/server/server-chat.js +210 -0
- package/dist/server/server-chat.js.map +1 -0
- package/dist/server/server-cost-guard.d.ts +16 -0
- package/dist/server/server-cost-guard.js +141 -0
- package/dist/server/server-cost-guard.js.map +1 -0
- package/dist/server/server-executors.d.ts +10 -0
- package/dist/server/server-executors.js +110 -0
- package/dist/server/server-executors.js.map +1 -0
- package/dist/server/server-helpers.d.ts +49 -0
- package/dist/server/server-helpers.js +210 -0
- package/dist/server/server-helpers.js.map +1 -0
- package/dist/server/server-persist.d.ts +43 -0
- package/dist/server/server-persist.js +249 -0
- package/dist/server/server-persist.js.map +1 -0
- package/dist/server/server-rate-limit.d.ts +9 -0
- package/dist/server/server-rate-limit.js +77 -0
- package/dist/server/server-rate-limit.js.map +1 -0
- package/dist/server/server-routes-approvals.d.ts +4 -0
- package/dist/server/server-routes-approvals.js +238 -0
- package/dist/server/server-routes-approvals.js.map +1 -0
- package/dist/server/server-routes-auth.d.ts +7 -0
- package/dist/server/server-routes-auth.js +532 -0
- package/dist/server/server-routes-auth.js.map +1 -0
- package/dist/server/server-routes-events.d.ts +4 -0
- package/dist/server/server-routes-events.js +167 -0
- package/dist/server/server-routes-events.js.map +1 -0
- package/dist/server/server-routes-public.d.ts +24 -0
- package/dist/server/server-routes-public.js +453 -0
- package/dist/server/server-routes-public.js.map +1 -0
- package/dist/server/server-routes-waitpoints.d.ts +4 -0
- package/dist/server/server-routes-waitpoints.js +190 -0
- package/dist/server/server-routes-waitpoints.js.map +1 -0
- package/dist/server/server-routes-webchat.d.ts +14 -0
- package/dist/server/server-routes-webchat.js +307 -0
- package/dist/server/server-routes-webchat.js.map +1 -0
- package/dist/server/server-routes-workflows.d.ts +5 -0
- package/dist/server/server-routes-workflows.js +289 -0
- package/dist/server/server-routes-workflows.js.map +1 -0
- package/dist/server/server-sse.d.ts +13 -0
- package/dist/server/server-sse.js +197 -0
- package/dist/server/server-sse.js.map +1 -0
- package/dist/server/server-store-circuit-breaker.d.ts +32 -0
- package/dist/server/server-store-circuit-breaker.js +211 -0
- package/dist/server/server-store-circuit-breaker.js.map +1 -0
- package/dist/server/server-store.d.ts +5 -0
- package/dist/server/server-store.js +71 -0
- package/dist/server/server-store.js.map +1 -0
- package/dist/server/server-trace.d.ts +41 -0
- package/dist/server/server-trace.js +133 -0
- package/dist/server/server-trace.js.map +1 -0
- package/dist/server/server-worker.d.ts +4 -0
- package/dist/server/server-worker.js +127 -0
- package/dist/server/server-worker.js.map +1 -0
- package/dist/server/session-events.d.ts +27 -0
- package/dist/server/session-events.js +69 -0
- package/dist/server/session-events.js.map +1 -0
- package/dist/server/session-manager.d.ts +52 -0
- package/dist/server/session-manager.js +502 -0
- package/dist/server/session-manager.js.map +1 -0
- package/dist/server/tool-router-discovery.d.ts +33 -0
- package/dist/server/tool-router-discovery.js +218 -0
- package/dist/server/tool-router-discovery.js.map +1 -0
- package/dist/server/tool-router-types.d.ts +91 -0
- package/dist/server/tool-router-types.js +336 -0
- package/dist/server/tool-router-types.js.map +1 -0
- package/dist/server/tool-router-user-tools.d.ts +16 -0
- package/dist/server/tool-router-user-tools.js +269 -0
- package/dist/server/tool-router-user-tools.js.map +1 -0
- package/dist/server/validation-schemas.d.ts +12 -0
- package/dist/server/validation-schemas.js +251 -0
- package/dist/server/validation-schemas.js.map +1 -0
- package/dist/shared/agent-core-config.d.ts +12 -0
- package/dist/shared/agent-core-config.js +77 -0
- package/dist/shared/agent-core-config.js.map +1 -0
- package/dist/shared/agent-core-config.test.js +132 -0
- package/dist/shared/agent-core-context-thinking.test.js +293 -0
- package/dist/shared/agent-core-loop-calls.test.js +174 -0
- package/dist/shared/agent-core-loop-detector-bail.test.js +201 -0
- package/dist/shared/agent-core-loop-detector.test.js +195 -0
- package/dist/shared/agent-core-loop-errors.test.js +258 -0
- package/dist/shared/agent-core-loop.d.ts +53 -0
- package/dist/shared/agent-core-loop.js +251 -0
- package/dist/shared/agent-core-loop.js.map +1 -0
- package/dist/shared/agent-core-pricing.test.js +191 -0
- package/dist/shared/agent-core-sanitize-retry.test.js +129 -0
- package/dist/shared/agent-core-tools.d.ts +32 -0
- package/dist/shared/agent-core-tools.js +323 -0
- package/dist/shared/agent-core-tools.js.map +1 -0
- package/dist/shared/agent-core-types.d.ts +182 -0
- package/dist/shared/agent-core-types.js +265 -0
- package/dist/shared/agent-core-types.js.map +1 -0
- package/dist/shared/agent-core.js +1 -1
- package/dist/shared/agent-core.js.map +1 -1
- package/dist/shared/agent-loop-base.d.ts +130 -0
- package/dist/shared/agent-loop-base.js +347 -0
- package/dist/shared/agent-loop-base.js.map +1 -0
- package/dist/shared/api-client-build-request.test.js +228 -0
- package/dist/shared/api-client-build-system-caching.test.js +107 -0
- package/dist/shared/api-client-build.test.js +223 -0
- package/dist/shared/api-client-config.d.ts +21 -0
- package/dist/shared/api-client-helpers.d.ts +57 -0
- package/dist/shared/api-client-helpers.test.js +261 -0
- package/dist/shared/api-client-proxy-happy.test.js +255 -0
- package/dist/shared/api-client-proxy-retry.test.js +307 -0
- package/dist/shared/api-client-proxy.d.ts +26 -0
- package/dist/shared/api-client-proxy.test.js +255 -0
- package/dist/shared/api-client-retry.test.js +307 -0
- package/dist/shared/api-client-system-trimming.test.js +261 -0
- package/dist/shared/api-client-trimming.d.ts +36 -0
- package/dist/shared/api-client.js.map +1 -1
- package/dist/shared/api-client.test.js +228 -0
- package/dist/shared/compaction-thinking.test.js +315 -0
- package/dist/shared/compaction-trimming.test.js +223 -0
- package/dist/shared/exec-validator.d.ts +29 -0
- package/dist/shared/exec-validator.js +106 -0
- package/dist/shared/exec-validator.js.map +1 -0
- package/dist/shared/imsg-constants.d.ts +8 -0
- package/dist/shared/imsg-constants.js +13 -0
- package/dist/shared/imsg-constants.js.map +1 -0
- package/dist/shared/sse-parser-callbacks.test.js +422 -0
- package/dist/shared/sse-parser-collect.test.js +252 -0
- package/dist/shared/sse-parser-e2e.test.js +558 -0
- package/dist/shared/sse-parser-parse.test.js +253 -0
- package/dist/shared/tool-dispatch-advanced-batch-build.test.js +405 -0
- package/dist/shared/tool-dispatch-advanced.test.js +320 -0
- package/dist/shared/tool-dispatch-basic.test.js +278 -0
- package/dist/shared/tool-dispatch-content.d.ts +14 -0
- package/dist/shared/tool-dispatch-parallel.test.js +378 -0
- package/dist/shared/tool-dispatch.js +1 -1
- package/dist/shared/tool-dispatch.js.map +1 -1
- package/dist/webchat/__tests__/widget-messaging.test.js +323 -0
- package/dist/webchat/__tests__/widget.test.js +273 -0
- package/dist/webchat/widget-styles.d.ts +7 -0
- package/dist/webchat/widget-styles.js +11 -0
- package/dist/webchat/widget-styles.js.map +1 -0
- package/package.json +5 -4
- package/src/cli/services/builtin-skills/verify.md +72 -0
- package/vendor/ink/build/ink.js +33 -10
- package/vendor/ink/build/log-update.js +11 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagent.js","names":["readFileSync","existsSync","writeFileSync","mkdirSync","appendFileSync","join","homedir","tmpdir","LOCAL_TOOL_DEFINITIONS","LoopDetector","estimateCostUsd","demoteSubagentModel","AGENT_DEFAULTS","resolveAgentLoopConfig","preCompact","loadCLIAgentConfig","MODEL_MAP","loadServerToolDefinitions","logSpan","generateSpanId","generateTraceId","PKG_VERSION","loadClaudeMd","getGlobalEmitter","getAgentDefinition","callAgentAPI","executeToolBlocks","extractTextBlocks","extractToolUseBlocks","getResponseText","yieldToEventLoop","yieldForRender","deduplicateTools","assertUniqueToolNames","AGENTS_DIR","buildAgentPrompt","type","cwd","cwdContext","custom","prompt","prompts","explore","plan","research","ensureAgentsDir","recursive","saveAgentState","state","path","id","JSON","stringify","loadAgentState","agentId","parse","generateAgentId","Date","now","Math","random","toString","slice","getToolsForAgent","tools","length","getFilteredTools","allowedNames","Set","localTools","filter","t","has","name","map","description","input_schema","serverTools","allowedServerTools","push","getAgentIcon","icons","getAgentColor","colors","emitSubagentProgress","agentType","message","turn","toolName","emitter","runSubagent","options","subagent_type","model","resume","max_turns","parentContext","parentTraceContext","taskContext","signal","process","systemPrompt","startTime","customDef","effectiveModelAlias","modelId","dbAgent","resolved","dbMaxTurns","subagentMaxTurns","dbMaxTokens","max_tokens","subagentMaxTokens","rawMaxTurns","max","effectiveMaxTurns","Number","MAX_SAFE_INTEGER","maxToolResultChars","maxRetries","subagentMaxRetries","maxContinuations","subagentMaxContinuations","descMatch","match","shortDescription","emitSubagentStart","messages","toolsUsed","createdAt","toISOString","updatedAt","loopDetector","fromResolved","fullSystemPrompt","claudeMd","content","role","totalIn","totalOut","totalCacheRead","totalCacheCreate","finalText","subagentSpanId","turnCtx","source","serviceName","serviceVersion","agentName","traceId","spanId","parentSpanId","conversationId","turnNumber","userId","userEmail","traceFlags","aborted","emitSubagentDone","input","output","success","tokensUsed","apiStart","response","lastError","attempt","contextProfile","thinkingEnabled","maxOutputTokens","cacheLastTool","abortSignal","err","status","Promise","r","setTimeout","pow","apiDuration","usage","input_tokens","output_tokens","cache_read_tokens","cache_creation_tokens","apiCostUsd","action","durationMs","context","inputTokens","outputTokens","cacheReadTokens","cacheCreationTokens","totalCost","details","agent_id","agent_type","stop_reason","is_subagent_api","textBlocks","toolBlocks","compactionBlock","find","b","compactionCount","text","continuations","contCount","contText","toolNames","toolResults","turnToolsUsed","callbacks","onToolStart","emitSubagentToolStart","onToolEnd","emitSubagentToolEnd","tu","error","undefined","tool_type","tool_input","is_subagent_tool","iteration","tn","includes","turnsRemaining","nudgeThreshold","ceil","editTools","hasEdited","some","compactedMessages","stripThinking","subagentTotalCost","getTime","turns","tools_used","tool_count","is_subagent","parent_trace_id","parent_span_id","display_name","charAt","toUpperCase","display_icon","display_color","summary","prompt_preview","runSubagentBackground","outputFile","bgModule","registerBackgroundAgent","then","result","m","markAgentDone","catch","TASK_TOOL_DEFINITION","properties","enum","required"],"sources":["../../../src/cli/services/subagent.ts"],"sourcesContent":["/**\n * Subagent System — Claude Code-style Task tool for spawning specialized agents\n *\n * Subagents run in isolated context, enabling:\n * - Parallel exploration without polluting main context\n * - Specialized prompts per agent type\n * - Cost optimization (Haiku for simple tasks)\n * - Resume capability for long-running tasks\n */\n\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport { readFileSync, existsSync, writeFileSync, mkdirSync, appendFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { homedir, tmpdir } from \"os\";\nimport {\n LOCAL_TOOL_DEFINITIONS,\n} from \"./local-tools.js\";\nimport { LoopDetector, estimateCostUsd, demoteSubagentModel, AGENT_DEFAULTS, resolveAgentLoopConfig } from \"../../shared/agent-core.js\";\nimport { preCompact } from \"../../shared/compaction.js\";\nimport { loadCLIAgentConfig } from \"./agent-config.js\";\nimport { MODEL_MAP } from \"../../shared/constants.js\";\nimport {\n loadServerToolDefinitions,\n} from \"./server-tools.js\";\nimport { logSpan, generateSpanId, generateTraceId, PKG_VERSION } from \"./telemetry.js\";\nimport { loadClaudeMd } from \"./agent-loop.js\";\nimport { getGlobalEmitter } from \"./agent-events.js\";\nimport { getAgentDefinition } from \"./agent-definitions.js\";\nimport {\n callAgentAPI,\n executeToolBlocks,\n extractTextBlocks,\n extractToolUseBlocks,\n getResponseText,\n yieldToEventLoop,\n yieldForRender,\n deduplicateTools,\n assertUniqueToolNames,\n} from \"./agent-worker-base.js\";\nimport type { AgentAPIResponse } from \"./agent-worker-base.js\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport type BuiltinSubagentType =\n | \"explore\" // Fast codebase exploration\n | \"plan\" // Planning complex implementations\n | \"general-purpose\" // Multi-step autonomous tasks\n | \"research\"; // Documentation lookups, web research\n\n// Accepts built-in types + custom agent names from .whale/agents/\nexport type SubagentType = BuiltinSubagentType | (string & {});\n\nexport interface ParentTraceContext {\n traceId: string; // 32 hex chars - inherited from parent\n spanId: string; // 16 hex chars - becomes our parentSpanId\n conversationId?: string;\n turnNumber: number; // Required - subagent inherits parent turn number\n userId?: string;\n userEmail?: string;\n}\n\nexport interface SubagentOptions {\n prompt: string;\n subagent_type: SubagentType;\n model?: \"sonnet\" | \"opus\" | \"haiku\";\n resume?: string; // Agent ID to resume from\n run_in_background?: boolean; // Write output to file, return immediately\n max_turns?: number; // Override default MAX_TURNS (clamped 1-50)\n name?: string; // Display name for agent\n parentContext?: string; // Summary of parent conversation for context\n parentTraceContext?: ParentTraceContext; // W3C trace context for hierarchical spans\n taskContext?: string; // Context about other parallel agents to avoid work duplication\n signal?: AbortSignal; // AbortSignal for cancellation (ESC)\n}\n\nexport interface SubagentResult {\n success: boolean;\n output: string;\n agentId: string;\n tokensUsed: { input: number; output: number };\n toolsUsed: string[];\n}\n\ninterface AgentState {\n id: string;\n type: SubagentType;\n model: string;\n messages: Anthropic.MessageParam[];\n toolsUsed: string[];\n continuations?: number; // max_tokens continuation count (capped by DB config)\n compactionCount?: number; // server-side compaction count\n createdAt: string;\n updatedAt: string;\n}\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst AGENTS_DIR = join(homedir(), \".whale\", \"agents\");\n\n// No hard cap on subagent turns — agent self-regulates via end_turn (Claude Code parity).\n// DB config (subagent_max_turns) controls the default. Callers can override via max_turns param.\n\n// ============================================================================\n// AGENT PROMPTS — specialized per type\n// ============================================================================\n\n// Build agent prompt with working directory context\nfunction buildAgentPrompt(type: SubagentType | string, cwd: string): string {\n const cwdContext = `\n## Working Directory\nYou are working in: ${cwd}\nAll file paths should be relative to or absolute from this directory.\nIMPORTANT: Focus ONLY on files within this directory. Do not get confused by other projects.\n`;\n\n // Check for custom agent definition first\n const custom = getAgentDefinition(type);\n if (custom) return custom.prompt + cwdContext;\n\n const prompts: Record<SubagentType, string> = {\n explore: `You are an exploration agent. Your ONLY job is to quickly find specific information in the codebase, then STOP.\n\nTools available:\n- glob: Find files by pattern (e.g., \"**/*.ts\")\n- grep: Search file contents with regex\n- read_file: Read file contents\n- list_directory: List directory contents\n${cwdContext}\n## STOP CONDITIONS — You MUST stop when ANY of these are met:\n1. You found the specific information requested\n2. You've searched 3+ patterns without finding anything new\n3. You've read the key files that answer the question\n4. You've exhausted reasonable search patterns\n\n## Guidelines:\n- Call multiple tools per turn — batch glob + grep + read_file in a single response\n- Read only the necessary files to answer the question\n- DO NOT continue exploring after you have the answer\n- DO NOT read files that aren't directly relevant\n\n## Output Format:\nReturn a concise summary with:\n- File paths and line numbers for relevant code\n- Key code snippets (brief)\n- Direct answer to the question asked\n\nIMPORTANT: Complete in 2-4 turns. If you haven't found it by turn 4, summarize what you found and STOP.`,\n\n plan: `You are a planning agent. Your ONLY job is to analyze the codebase and create an implementation plan, then STOP.\n\nTools available:\n- glob: Find files by pattern\n- grep: Search file contents\n- read_file: Read file contents\n- list_directory: List directory contents\n${cwdContext}\n## STOP CONDITIONS — You MUST stop when:\n1. You've identified the files that need changes\n2. You've understood the existing patterns/architecture\n3. You've created a concrete plan with specific steps\n\n## Guidelines:\n- FIRST: Quick search to find relevant files\n- Read only files needed to understand the architecture\n- DO NOT read every file — focus on entry points and key modules\n- Create the plan as soon as you understand the structure\n\n## Output Format — Return EXACTLY this structure:\n### Summary\n[1-2 sentences on the approach]\n\n### Files to Modify\n- path/to/file.ts: [what changes]\n\n### Implementation Steps\n1. [Specific step]\n2. [Specific step]\n\n### Risks\n- [Any considerations]\n\nIMPORTANT: Complete in 3-5 turns. If you haven't finished by turn 5, output your best plan and STOP.`,\n\n \"general-purpose\": `You are an autonomous agent for discrete tasks. Complete the task, then STOP.\n\nTools available:\n- File operations: read_file, write_file, edit_file, glob, grep\n- Shell: run_command\n- Search: search_files, search_content\n- Web: web_fetch\n${cwdContext}\n## STOP CONDITIONS — You MUST stop when:\n1. The specific task is complete\n2. You've verified the changes work (if applicable)\n3. You encounter a blocker you cannot resolve\n\n## Guidelines:\n- Understand what exists before making changes\n- Make targeted changes — don't over-engineer\n- Verify your changes if possible (run tests, check syntax)\n- If blocked, explain the blocker and STOP\n\n## Output Format:\n### What I Did\n[Brief summary of actions taken]\n\n### Files Modified\n- path/to/file.ts: [change description]\n\n### Verification\n[How you verified it works, or N/A]\n\n### Issues (if any)\n[Any problems encountered]\n\nIMPORTANT: This is a discrete task. Complete it in 4-6 turns maximum. Do not loop.`,\n\n research: `You are a research agent. Find the specific information requested, then STOP.\n\nTools available:\n- web_fetch: Fetch and parse web content\n- web_search: Search the web\n- read_file: Read local files\n- grep: Search local file contents\n${cwdContext}\n## STOP CONDITIONS — You MUST stop when:\n1. You found the answer to the question\n2. You've checked 2-3 authoritative sources\n3. You've gathered enough information to answer\n\n## Guidelines:\n- Search for official documentation first\n- Check 2-3 sources, not 10\n- DO NOT keep searching after you have the answer\n- Summarize findings immediately when you have enough\n\n## Output Format:\n### Answer\n[Direct answer to the question]\n\n### Key Points\n- [Important detail 1]\n- [Important detail 2]\n\n### Sources\n- [URL 1]: [what it says]\n- [URL 2]: [what it says]\n\n### Caveats\n[Any version requirements or limitations]\n\nIMPORTANT: Complete in 2-4 turns. Stop as soon as you have a good answer.`,\n };\n\n return prompts[type] || prompts[\"general-purpose\"];\n}\n\n// ============================================================================\n// AGENT STATE PERSISTENCE\n// ============================================================================\n\nfunction ensureAgentsDir(): void {\n if (!existsSync(AGENTS_DIR)) mkdirSync(AGENTS_DIR, { recursive: true });\n}\n\nfunction saveAgentState(state: AgentState): void {\n ensureAgentsDir();\n const path = join(AGENTS_DIR, `${state.id}.json`);\n writeFileSync(path, JSON.stringify(state, null, 2), \"utf-8\");\n}\n\nfunction loadAgentState(agentId: string): AgentState | null {\n const path = join(AGENTS_DIR, `${agentId}.json`);\n if (!existsSync(path)) return null;\n try {\n return JSON.parse(readFileSync(path, \"utf-8\"));\n } catch {\n return null;\n }\n}\n\nfunction generateAgentId(): string {\n return `agent-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n// ============================================================================\n// TOOL FILTERING — restrict tools per agent type\n// ============================================================================\n\nfunction getToolsForAgent(type: SubagentType | string): string[] {\n // Check for custom agent definition with explicit tools\n const custom = getAgentDefinition(type);\n if (custom?.tools && custom.tools.length > 0) return custom.tools;\n\n switch (type) {\n case \"explore\":\n return [\"glob\", \"grep\", \"read_file\", \"list_directory\", \"search_files\", \"search_content\"];\n case \"plan\":\n return [\"glob\", \"grep\", \"read_file\", \"list_directory\", \"search_files\", \"search_content\"];\n case \"research\":\n return [\"web_fetch\", \"web_search\", \"read_file\", \"grep\", \"glob\"];\n case \"general-purpose\":\n // All tools EXCEPT delegation — \"Subagents cannot spawn other subagents\" (Claude Code parity)\n return [\n \"read_file\", \"write_file\", \"edit_file\", \"list_directory\",\n \"search_files\", \"search_content\", \"run_command\",\n \"glob\", \"grep\", \"notebook_edit\", \"web_fetch\",\n ];\n default:\n return [\"read_file\", \"glob\", \"grep\"];\n }\n}\n\nasync function getFilteredTools(type: SubagentType): Promise<Anthropic.Tool[]> {\n const allowedNames = new Set(getToolsForAgent(type));\n\n // Local tools\n const localTools: Anthropic.Tool[] = LOCAL_TOOL_DEFINITIONS\n .filter((t) => allowedNames.has(t.name))\n .map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.input_schema as Anthropic.Tool[\"input_schema\"],\n }));\n\n // Add server tools if available, filtering by allowed names\n try {\n const serverTools = await loadServerToolDefinitions();\n const allowedServerTools = serverTools.filter(t => allowedNames.has(t.name));\n localTools.push(...allowedServerTools);\n } catch { /* server tools unavailable */ }\n\n // Deduplicate: local tools take priority over server tools with same name\n return deduplicateTools(localTools);\n}\n\n// ============================================================================\n// DISPLAY HELPERS — icons and colors for trace visualization\n// ============================================================================\n\nfunction getAgentIcon(type: SubagentType): string {\n const icons: Record<SubagentType, string> = {\n explore: \"🔍\", // Magnifying glass for exploration\n plan: \"📋\", // Clipboard for planning\n \"general-purpose\": \"🤖\", // Robot for autonomous work\n research: \"📚\", // Books for research\n };\n return icons[type] || \"⚙️\";\n}\n\nfunction getAgentColor(type: SubagentType): string {\n const colors: Record<SubagentType, string> = {\n explore: \"#3B82F6\", // Blue for exploration\n plan: \"#8B5CF6\", // Purple for planning\n \"general-purpose\": \"#10B981\", // Green for general work\n research: \"#F59E0B\", // Amber for research\n };\n return colors[type] || \"#6B7280\";\n}\n\n// ============================================================================\n// SUBAGENT EXECUTION\n// ============================================================================\n\n// Progress emitter — uses event system instead of stderr to avoid UI conflicts\n// The global emitter batches and routes these to ChatApp without causing re-renders\n// NOTE: No module-level mutable state — agentId/turn passed through function params for parallel safety\n\nfunction emitSubagentProgress(agentType: SubagentType, agentId: string, message: string, turn?: number, toolName?: string): void {\n const emitter = getGlobalEmitter();\n emitter.emitSubagentProgress(agentId, agentType, message, turn, toolName);\n}\n\nexport async function runSubagent(options: SubagentOptions): Promise<SubagentResult> {\n const { prompt, subagent_type, model, resume, max_turns, name, parentContext, parentTraceContext, taskContext, signal } = options;\n\n const agentId = resume || generateAgentId();\n const cwd = process.cwd();\n const systemPrompt = buildAgentPrompt(subagent_type, cwd);\n const startTime = Date.now();\n\n // Check for custom agent definition with per-agent config\n const customDef = getAgentDefinition(subagent_type);\n\n // Model resolution: caller override → agent definition → demotion logic → haiku\n const effectiveModelAlias = model || customDef?.model || demoteSubagentModel(model, subagent_type);\n const modelId = MODEL_MAP[effectiveModelAlias] || MODEL_MAP[\"haiku\"];\n\n // Resolve all config from DB → AGENT_DEFAULTS fallback (single source of truth)\n const dbAgent = await loadCLIAgentConfig();\n const resolved = dbAgent ? resolveAgentLoopConfig(dbAgent, \"sse\") : null;\n const dbMaxTurns = resolved?.subagentMaxTurns ?? AGENT_DEFAULTS.subagentMaxTurns;\n const dbMaxTokens = customDef?.max_tokens ?? resolved?.subagentMaxTokens ?? AGENT_DEFAULTS.subagentMaxTokens;\n // 0 = no limit (agent self-regulates via end_turn, Claude Code parity)\n // Safety: LoopDetector + cost budget + stall detection are the real guards.\n const rawMaxTurns = max_turns ? Math.max(1, max_turns) : dbMaxTurns;\n const effectiveMaxTurns = rawMaxTurns === 0 ? Number.MAX_SAFE_INTEGER : rawMaxTurns;\n const maxToolResultChars = resolved?.maxToolResultChars ?? AGENT_DEFAULTS.maxToolResultChars;\n const maxRetries = resolved?.subagentMaxRetries ?? AGENT_DEFAULTS.subagentMaxRetries;\n const maxContinuations = resolved?.subagentMaxContinuations ?? AGENT_DEFAULTS.subagentMaxContinuations;\n\n // Extract short description from prompt (first sentence or 60 chars)\n const descMatch = prompt.match(/^[^.!?\\n]+/);\n const shortDescription = name || (descMatch\n ? descMatch[0].slice(0, 60) + (descMatch[0].length > 60 ? \"…\" : \"\")\n : prompt.slice(0, 60) + (prompt.length > 60 ? \"…\" : \"\"));\n\n // Emit subagent start event\n const emitter = getGlobalEmitter();\n emitter.emitSubagentStart(agentId, subagent_type, model || \"inherited\", shortDescription);\n\n // Load or create agent state\n let state = resume ? loadAgentState(resume) : null;\n if (!state) {\n state = {\n id: agentId,\n type: subagent_type,\n model: modelId,\n messages: [],\n toolsUsed: [],\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n }\n\n const loopDetector = resolved\n ? LoopDetector.fromResolved(resolved)\n : new LoopDetector();\n\n // Get filtered tools for this agent type (deduped)\n const tools = await getFilteredTools(subagent_type);\n assertUniqueToolNames(tools);\n\n // Build full system prompt with optional parent context and task dedup context\n let fullSystemPrompt = systemPrompt;\n if (parentContext) {\n fullSystemPrompt += `\\n\\n## Parent Conversation Context\\n${parentContext}`;\n }\n if (taskContext) {\n fullSystemPrompt += `\\n\\n## Other Agents\\n${taskContext}\\nDo NOT duplicate research or work that other agents are handling. Focus only on your assigned task.`;\n }\n\n // Add CLAUDE.md if available\n const claudeMd = loadClaudeMd();\n if (claudeMd) {\n fullSystemPrompt += `\\n\\n## Project Instructions\\n${claudeMd.content}`;\n }\n\n // Add user prompt to messages\n state.messages.push({ role: \"user\", content: prompt });\n\n let totalIn = 0;\n let totalOut = 0;\n let totalCacheRead = 0;\n let totalCacheCreate = 0;\n let finalText = \"\";\n\n // Create subagent span context — inherit parent's trace context for hierarchy\n // IMPORTANT: Don't increment global turn number — subagent is part of parent turn\n const subagentSpanId = generateSpanId();\n const turnCtx = {\n source: \"claude_code\" as const,\n serviceName: \"whale-cli\",\n serviceVersion: PKG_VERSION,\n model: modelId,\n agentId,\n agentName: name || `subagent-${subagent_type}`,\n // Inherit parent's trace to keep hierarchy intact\n traceId: parentTraceContext?.traceId || generateTraceId(),\n spanId: subagentSpanId,\n parentSpanId: parentTraceContext?.spanId, // Parent's spanId becomes our parentSpanId\n conversationId: parentTraceContext?.conversationId,\n turnNumber: parentTraceContext?.turnNumber, // Inherit parent turn, don't increment\n userId: parentTraceContext?.userId,\n userEmail: parentTraceContext?.userEmail,\n traceFlags: 1,\n };\n\n try {\n for (let turn = 0; turn < effectiveMaxTurns; turn++) {\n // Check for cancellation at start of each turn\n if (signal?.aborted) {\n emitSubagentProgress(subagent_type, agentId, \"cancelled\", turn + 1);\n emitter.emitSubagentDone(agentId, subagent_type, false, \"Cancelled\", { input: totalIn, output: totalOut }, state.toolsUsed, Date.now() - startTime);\n return { success: false, output: \"Cancelled\", agentId, tokensUsed: { input: totalIn, output: totalOut }, toolsUsed: state.toolsUsed };\n }\n\n // Emit progress and yield before API call to keep UI responsive\n emitSubagentProgress(subagent_type, agentId, `turn ${turn + 1}: calling API...`, turn + 1);\n await yieldForRender(); // Give Ink time to render the progress update\n\n // Adaptive thinking enabled — model decides when to think (Claude Code parity).\n // Opus 4.6 uses adaptive thinking by default; no separate enable/disable needed.\n const apiStart = Date.now();\n let response!: AgentAPIResponse;\n let lastError: Error | null = null;\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n response = await callAgentAPI({\n modelId,\n contextProfile: \"subagent\",\n systemPrompt: fullSystemPrompt,\n messages: state.messages,\n tools,\n thinkingEnabled: true,\n maxOutputTokens: dbMaxTokens,\n cacheLastTool: true,\n abortSignal: signal,\n });\n lastError = null;\n break;\n } catch (err: any) {\n lastError = err;\n if (attempt < maxRetries - 1 && (err.status === 429 || err.status === 500 || err.status === 529)) {\n await new Promise(r => setTimeout(r, 1000 * Math.pow(2, attempt)));\n continue;\n }\n throw err;\n }\n }\n if (lastError) throw lastError;\n const apiDuration = Date.now() - apiStart;\n\n // Yield after API call\n await yieldToEventLoop();\n\n totalIn += response.usage.input_tokens;\n totalOut += response.usage.output_tokens;\n totalCacheRead += response.usage.cache_read_tokens;\n totalCacheCreate += response.usage.cache_creation_tokens;\n\n // Log API call as child span — include cache tokens for accurate cost\n const apiCostUsd = estimateCostUsd(\n response.usage.input_tokens,\n response.usage.output_tokens,\n modelId,\n 0, // thinkingTokens (disabled for subagents)\n response.usage.cache_read_tokens,\n response.usage.cache_creation_tokens,\n );\n logSpan({\n action: \"claude_api_request\",\n durationMs: apiDuration,\n context: {\n ...turnCtx,\n spanId: generateSpanId(), // New span for this API call\n parentSpanId: turnCtx.spanId, // Parent is the subagent\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n cacheReadTokens: response.usage.cache_read_tokens,\n cacheCreationTokens: response.usage.cache_creation_tokens,\n totalCost: apiCostUsd,\n model: modelId,\n },\n details: {\n \"gen_ai.request.model\": modelId,\n \"gen_ai.usage.input_tokens\": response.usage.input_tokens,\n \"gen_ai.usage.output_tokens\": response.usage.output_tokens,\n \"gen_ai.usage.cache_read_tokens\": response.usage.cache_read_tokens,\n \"gen_ai.usage.cache_creation_tokens\": response.usage.cache_creation_tokens,\n \"gen_ai.usage.cost\": apiCostUsd,\n agent_id: agentId,\n agent_type: subagent_type,\n turn: turn + 1,\n stop_reason: response.stop_reason,\n is_subagent_api: true,\n },\n });\n\n // Yield to event loop to keep UI responsive\n await yieldToEventLoop();\n\n // Extract text and tool use using shared helpers\n const textBlocks = extractTextBlocks(response.content);\n const toolBlocks = extractToolUseBlocks(response.content);\n\n if (textBlocks.length) {\n finalText = getResponseText(response.content);\n }\n\n // Compaction handling — API paused after generating summary.\n // Per Anthropic docs: just use the compaction block, don't preserve old messages.\n if (response.stop_reason === \"compaction\") {\n const compactionBlock = response.content.find((b: any) => b.type === \"compaction\") as any;\n if (compactionBlock) {\n state.compactionCount = (state.compactionCount ?? 0) + 1;\n state.messages = [\n { role: \"assistant\", content: [{ type: \"compaction\", content: compactionBlock.content }] },\n { role: \"user\", content: [{ type: \"text\", text: \"Continue with your task.\" }] },\n ] as any;\n turn--; // Don't count compaction as a turn\n continue;\n }\n }\n\n // No tool calls — check stop reason\n if (toolBlocks.length === 0 || response.stop_reason === \"end_turn\") {\n // max_tokens: response was truncated mid-generation — give the model a chance to finish\n // Cap at 2 continuations to prevent infinite loops on very large outputs\n if (response.stop_reason === \"max_tokens\" && (state.continuations ?? 0) < maxContinuations) {\n state.continuations = (state.continuations ?? 0) + 1;\n state.messages.push({\n role: \"assistant\",\n content: response.content,\n });\n const contCount = state.continuations ?? 1;\n const contText = contCount === 1\n ? \"[Your response was truncated due to the output token limit. If writing a large file, split into multiple smaller write_file calls (~200 lines each). Continue concisely.]\"\n : `[Truncated again (${contCount}/${maxContinuations}). You MUST reduce output size — use multiple small write_file calls, not one large one.]`;\n state.messages.push({\n role: \"user\",\n content: [{ type: \"text\", text: contText }],\n });\n continue;\n }\n emitSubagentProgress(subagent_type, agentId, `done (${turn + 1} turn${turn > 0 ? \"s\" : \"\"})`, turn + 1);\n break;\n }\n\n // Emit tool usage progress\n const toolNames = toolBlocks.map(b => b.name).join(\", \");\n emitSubagentProgress(subagent_type, agentId, `using: ${toolNames}`, turn + 1);\n\n // Execute tools using shared executeToolBlocks\n const { toolResults, toolsUsed: turnToolsUsed } = await executeToolBlocks({\n toolBlocks,\n loopDetector,\n signal,\n callbacks: {\n onToolStart: (toolName, input) => {\n emitSubagentProgress(subagent_type, agentId, `running ${toolName}`, turn + 1, toolName);\n emitter.emitSubagentToolStart(agentId, toolName, input);\n },\n onToolEnd: (toolName, success, durationMs) => {\n emitter.emitSubagentToolEnd(agentId, toolName, success, durationMs);\n\n // Log tool call as child span of the subagent\n const tu = toolBlocks.find(b => b.name === toolName);\n logSpan({\n action: `tool.${toolName}`,\n durationMs,\n context: {\n ...turnCtx,\n spanId: generateSpanId(),\n parentSpanId: turnCtx.spanId,\n },\n error: success ? undefined : \"(see tool result)\",\n details: {\n tool_type: \"subagent_tool\",\n tool_input: tu?.input,\n agent_id: agentId,\n agent_type: subagent_type,\n is_subagent_tool: true,\n iteration: turn,\n },\n });\n },\n },\n });\n\n // Track tool usage\n for (const tn of turnToolsUsed) {\n if (!state.toolsUsed.includes(tn)) {\n state.toolsUsed.push(tn);\n }\n }\n\n // Append assistant response + tool results\n state.messages.push({\n role: \"assistant\",\n content: response.content,\n });\n state.messages.push({\n role: \"user\",\n content: toolResults,\n });\n\n // Progress nudge: when approaching turn limit without any edits, warn the agent\n const turnsRemaining = effectiveMaxTurns - turn - 1;\n const nudgeThreshold = Math.ceil(effectiveMaxTurns * 0.25); // Last 25% of turns\n if (turnsRemaining === nudgeThreshold && turnsRemaining > 0) {\n const editTools = [\"write_file\", \"edit_file\", \"create_file\", \"notebook_edit\"];\n const hasEdited = state.toolsUsed.some(t => editTools.includes(t));\n if (!hasEdited) {\n state.messages.push({\n role: \"user\",\n content: [{\n type: \"text\",\n text: `⚠️ TURN LIMIT WARNING: You have ${turnsRemaining} turns remaining out of ${effectiveMaxTurns} and have NOT made any file edits yet. Stop exploring and start producing your output NOW. If you need to write or edit files, do it immediately. Prioritize delivering results over gathering more information.`,\n }],\n });\n }\n }\n\n // Pre-compact: trim large tool results and thinking blocks to prevent context bloat.\n // Without this, context grows unbounded (4K→28K→73K tokens per turn).\n const { messages: compactedMessages } = preCompact(\n state.messages,\n { maxToolResultChars, stripThinking: true },\n );\n state.messages = compactedMessages;\n\n // Yield to event loop after tool execution\n await yieldToEventLoop();\n }\n\n // Save state for potential resume\n state.updatedAt = new Date().toISOString();\n saveAgentState(state);\n\n // Log single subagent span with all metadata for trace visualization\n const subagentTotalCost = estimateCostUsd(totalIn, totalOut, modelId, 0, totalCacheRead, totalCacheCreate);\n logSpan({\n action: `subagent.${subagent_type}`,\n durationMs: Date.now() - new Date(state.createdAt).getTime(),\n context: {\n ...turnCtx,\n inputTokens: totalIn,\n outputTokens: totalOut,\n totalCost: subagentTotalCost,\n },\n details: {\n agent_id: agentId,\n agent_type: subagent_type,\n model: modelId,\n\n // OpenTelemetry gen_ai semantic conventions\n \"gen_ai.request.model\": modelId,\n \"gen_ai.usage.input_tokens\": totalIn,\n \"gen_ai.usage.output_tokens\": totalOut,\n \"gen_ai.usage.cache_read_tokens\": totalCacheRead,\n \"gen_ai.usage.cache_creation_tokens\": totalCacheCreate,\n \"gen_ai.usage.cost\": subagentTotalCost,\n\n // Execution metrics\n turns: state.messages.length / 2,\n tools_used: state.toolsUsed,\n tool_count: state.toolsUsed.length,\n\n // Hierarchy\n is_subagent: true,\n parent_trace_id: parentTraceContext?.traceId,\n parent_span_id: parentTraceContext?.spanId,\n\n // Display metadata\n display_name: `${subagent_type.charAt(0).toUpperCase() + subagent_type.slice(1)} Agent`,\n display_icon: getAgentIcon(subagent_type),\n display_color: getAgentColor(subagent_type),\n\n // Content previews\n summary: finalText.slice(0, 2000) + (finalText.length > 2000 ? \"...\" : \"\"),\n prompt_preview: prompt.slice(0, 200) + (prompt.length > 200 ? \"...\" : \"\"),\n },\n });\n\n // Emit subagent done event\n emitter.emitSubagentDone(\n agentId,\n subagent_type,\n true,\n finalText || \"(No output from agent)\",\n { input: totalIn, output: totalOut },\n state.toolsUsed,\n Date.now() - startTime\n );\n\n return {\n success: true,\n output: finalText || \"(No output from agent)\",\n agentId,\n tokensUsed: { input: totalIn, output: totalOut },\n toolsUsed: state.toolsUsed,\n };\n } catch (err: any) {\n // Emit subagent error event\n emitter.emitSubagentDone(\n agentId,\n subagent_type,\n false,\n `Agent error: ${err.message || err}`,\n { input: totalIn, output: totalOut },\n state.toolsUsed,\n Date.now() - startTime\n );\n\n return {\n success: false,\n output: `Agent error: ${err.message || err}`,\n agentId,\n tokensUsed: { input: totalIn, output: totalOut },\n toolsUsed: state.toolsUsed,\n };\n }\n}\n\n// ============================================================================\n// BACKGROUND AGENT EXECUTION\n// ============================================================================\n\nexport async function runSubagentBackground(options: SubagentOptions): Promise<{ agentId: string; outputFile: string }> {\n const agentId = options.resume || generateAgentId();\n const outputFile = join(tmpdir(), `whale-agent-${agentId}.output`);\n\n // Write initial status\n writeFileSync(outputFile, `Agent ${agentId} started (${options.subagent_type})\\n`, \"utf-8\");\n\n // Import background process tracker (dynamic to avoid circular deps)\n const bgModule = await import(\"./background-processes.js\");\n bgModule.registerBackgroundAgent(agentId, options.subagent_type, outputFile);\n\n // Start agent in detached async — don't await\n runSubagent({ ...options, resume: undefined }).then(result => {\n appendFileSync(outputFile, `\\n---DONE---\\n${JSON.stringify({ success: result.success, agentId: result.agentId, output: result.output })}\\n`, \"utf-8\");\n import(\"./background-processes.js\").then(m => m.markAgentDone(agentId, result.success));\n }).catch(err => {\n appendFileSync(outputFile, `\\n---ERROR---\\n${err.message}\\n`, \"utf-8\");\n import(\"./background-processes.js\").then(m => m.markAgentDone(agentId, false));\n });\n\n return { agentId, outputFile };\n}\n\n// ============================================================================\n// TOOL DEFINITION — for integration with main agent loop\n// ============================================================================\n\n// Following Claude Code pattern: discrete, focused tasks with clear completion criteria\nexport const TASK_TOOL_DEFINITION: Anthropic.Tool = {\n name: \"task\",\n description: `Launch a subagent in isolated context. Subagents have full tool access and batch multiple tool calls per turn (glob + grep + read_file in parallel). Launch multiple task calls in one response for parallel execution.\n\nUse for any work requiring 3+ tool calls or touching multiple parts of the codebase.\n\nAgent types:\n- explore: Find specific files/code (2-4 turns, uses batch glob+grep)\n- plan: Create implementation plan (3-5 turns)\n- general-purpose: Complete a specific task (4-8 turns, full tool access)\n- research: Look up specific info (2-4 turns)\n\nEach agent completes autonomously and returns results.`,\n input_schema: {\n type: \"object\",\n properties: {\n prompt: {\n type: \"string\",\n description: \"Specific task with clear completion criteria. Include: what to find/do, where to look, what to return.\",\n },\n subagent_type: {\n type: \"string\",\n enum: [\"explore\", \"plan\", \"general-purpose\", \"research\"],\n description: \"Agent type: explore=find, plan=design, general-purpose=do, research=lookup.\",\n },\n model: {\n type: \"string\",\n enum: [\"sonnet\", \"haiku\"],\n description: \"Optional model. haiku (default) for fast tasks, sonnet for complex reasoning.\",\n },\n resume: {\n type: \"string\",\n description: \"Agent ID to resume (rarely needed).\",\n },\n },\n required: [\"prompt\", \"subagent_type\"],\n },\n};\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,YAAY,EAAEC,UAAU,EAAEC,aAAa,EAAEC,SAAS,EAAEC,cAAc,QAAQ,IAAI;AACvF,SAASC,IAAI,QAAQ,MAAM;AAC3B,SAASC,OAAO,EAAEC,MAAM,QAAQ,IAAI;AACpC,SACEC,sBAAsB,QACjB,kBAAkB;AACzB,SAASC,YAAY,EAAEC,eAAe,EAAEC,mBAAmB,EAAEC,cAAc,EAAEC,sBAAsB,QAAQ,4BAA4B;AACvI,SAASC,UAAU,QAAQ,4BAA4B;AACvD,SAASC,kBAAkB,QAAQ,mBAAmB;AACtD,SAASC,SAAS,QAAQ,2BAA2B;AACrD,SACEC,yBAAyB,QACpB,mBAAmB;AAC1B,SAASC,OAAO,EAAEC,cAAc,EAAEC,eAAe,EAAEC,WAAW,QAAQ,gBAAgB;AACtF,SAASC,YAAY,QAAQ,iBAAiB;AAC9C,SAASC,gBAAgB,QAAQ,mBAAmB;AACpD,SAASC,kBAAkB,QAAQ,wBAAwB;AAC3D,SACEC,YAAY,EACZC,iBAAiB,EACjBC,iBAAiB,EACjBC,oBAAoB,EACpBC,eAAe,EACfC,gBAAgB,EAChBC,cAAc,EACdC,gBAAgB,EAChBC,qBAAqB,QAChB,wBAAwB;;AAG/B;AACA;AACA;;AAMwB;;AAExB;;AA8CA;AACA;AACA;;AAEA,MAAMC,UAAU,GAAG7B,IAAI,CAACC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC;;AAEtD;AACA;;AAEA;AACA;AACA;;AAEA;AACA,SAAS6B,gBAAgBA,CAACC,IAA2B,EAAEC,GAAW,EAAU;EAC1E,MAAMC,UAAU,GAAG;AACrB;AACA,sBAAsBD,GAAG;AACzB;AACA;AACA,CAAC;;EAEC;EACA,MAAME,MAAM,GAAGf,kBAAkB,CAACY,IAAI,CAAC;EACvC,IAAIG,MAAM,EAAE,OAAOA,MAAM,CAACC,MAAM,GAAGF,UAAU;EAE7C,MAAMG,OAAqC,GAAG;IAC5CC,OAAO,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;AACA,EAAEJ,UAAU;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wGAAwG;IAEpGK,IAAI,EAAE;AACV;AACA;AACA;AACA;AACA;AACA;AACA,EAAEL,UAAU;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qGAAqG;IAEjG,iBAAiB,EAAE;AACvB;AACA;AACA;AACA;AACA;AACA;AACA,EAAEA,UAAU;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mFAAmF;IAE/EM,QAAQ,EAAE;AACd;AACA;AACA;AACA;AACA;AACA;AACA,EAAEN,UAAU;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,CAAC;EAED,OAAOG,OAAO,CAACL,IAAI,CAAC,IAAIK,OAAO,CAAC,iBAAiB,CAAC;AACpD;;AAEA;AACA;AACA;;AAEA,SAASI,eAAeA,CAAA,EAAS;EAC/B,IAAI,CAAC5C,UAAU,CAACiC,UAAU,CAAC,EAAE/B,SAAS,CAAC+B,UAAU,EAAE;IAAEY,SAAS,EAAE;EAAK,CAAC,CAAC;AACzE;AAEA,SAASC,cAAcA,CAACC,KAAiB,EAAQ;EAC/CH,eAAe,CAAC,CAAC;EACjB,MAAMI,IAAI,GAAG5C,IAAI,CAAC6B,UAAU,EAAE,GAAGc,KAAK,CAACE,EAAE,OAAO,CAAC;EACjDhD,aAAa,CAAC+C,IAAI,EAAEE,IAAI,CAACC,SAAS,CAACJ,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC;AAC9D;AAEA,SAASK,cAAcA,CAACC,OAAe,EAAqB;EAC1D,MAAML,IAAI,GAAG5C,IAAI,CAAC6B,UAAU,E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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"subagent.js","names":["readFileSync","existsSync","writeFileSync","mkdirSync","appendFileSync","join","homedir","tmpdir","LOCAL_TOOL_DEFINITIONS","LoopDetector","estimateCostUsd","demoteSubagentModel","AGENT_DEFAULTS","resolveAgentLoopConfig","preCompact","loadCLIAgentConfig","MODEL_MAP","loadServerToolDefinitions","logSpan","generateSpanId","generateTraceId","PKG_VERSION","loadClaudeMd","getGlobalEmitter","getAgentDefinition","callAgentAPI","executeToolBlocks","extractTextBlocks","extractToolUseBlocks","getResponseText","yieldToEventLoop","yieldForRender","deduplicateTools","assertUniqueToolNames","AGENTS_DIR","buildAgentPrompt","type","cwd","cwdContext","custom","prompt","prompts","explore","plan","research","ensureAgentsDir","recursive","saveAgentState","state","path","id","JSON","stringify","loadAgentState","agentId","parse","generateAgentId","Date","now","Math","random","toString","slice","getToolsForAgent","tools","length","getFilteredTools","allowedNames","Set","localTools","filter","t","has","name","map","description","input_schema","serverTools","allowedServerTools","push","getAgentIcon","icons","getAgentColor","colors","emitSubagentProgress","agentType","message","turn","toolName","emitter","runSubagent","options","subagent_type","model","resume","max_turns","parentContext","parentTraceContext","taskContext","signal","process","systemPrompt","startTime","customDef","effectiveModelAlias","modelId","dbAgent","resolved","dbMaxTurns","subagentMaxTurns","dbMaxTokens","max_tokens","subagentMaxTokens","rawMaxTurns","max","effectiveMaxTurns","Number","MAX_SAFE_INTEGER","maxToolResultChars","maxRetries","subagentMaxRetries","maxContinuations","subagentMaxContinuations","descMatch","match","shortDescription","emitSubagentStart","messages","toolsUsed","createdAt","toISOString","updatedAt","loopDetector","fromResolved","fullSystemPrompt","claudeMd","content","role","totalIn","totalOut","totalCacheRead","totalCacheCreate","finalText","subagentSpanId","turnCtx","source","serviceName","serviceVersion","agentName","traceId","spanId","parentSpanId","conversationId","turnNumber","userId","userEmail","traceFlags","aborted","emitSubagentDone","input","output","success","tokensUsed","apiStart","response","lastError","attempt","contextProfile","thinkingEnabled","maxOutputTokens","cacheLastTool","abortSignal","err","status","Promise","r","setTimeout","pow","apiDuration","usage","input_tokens","output_tokens","cache_read_tokens","cache_creation_tokens","apiCostUsd","action","durationMs","context","inputTokens","outputTokens","cacheReadTokens","cacheCreationTokens","totalCost","details","agent_id","agent_type","stop_reason","is_subagent_api","textBlocks","toolBlocks","compactionBlock","find","b","compactionCount","text","continuations","contCount","contText","toolNames","toolResults","turnToolsUsed","callbacks","onToolStart","emitSubagentToolStart","onToolEnd","emitSubagentToolEnd","tu","error","undefined","tool_type","tool_input","is_subagent_tool","iteration","tn","includes","turnsRemaining","nudgeThreshold","ceil","editTools","hasEdited","some","compactedMessages","stripThinking","subagentTotalCost","getTime","turns","tools_used","tool_count","is_subagent","parent_trace_id","parent_span_id","display_name","charAt","toUpperCase","display_icon","display_color","summary","prompt_preview","runSubagentBackground","outputFile","bgModule","abortController","registerBackgroundAgent","then","result","m","markAgentDone","catch","TASK_TOOL_DEFINITION","properties","enum","required"],"sources":["../../../src/cli/services/subagent.ts"],"sourcesContent":["/**\n * Subagent System — Claude Code-style Task tool for spawning specialized agents\n *\n * Subagents run in isolated context, enabling:\n * - Parallel exploration without polluting main context\n * - Specialized prompts per agent type\n * - Cost optimization (Haiku for simple tasks)\n * - Resume capability for long-running tasks\n */\n\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport { readFileSync, existsSync, writeFileSync, mkdirSync, appendFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { homedir, tmpdir } from \"os\";\nimport {\n LOCAL_TOOL_DEFINITIONS,\n} from \"./local-tools.js\";\nimport { LoopDetector, estimateCostUsd, demoteSubagentModel, AGENT_DEFAULTS, resolveAgentLoopConfig } from \"../../shared/agent-core.js\";\nimport { preCompact } from \"../../shared/compaction.js\";\nimport { loadCLIAgentConfig } from \"./agent-config.js\";\nimport { MODEL_MAP } from \"../../shared/constants.js\";\nimport {\n loadServerToolDefinitions,\n} from \"./server-tools.js\";\nimport { logSpan, generateSpanId, generateTraceId, PKG_VERSION } from \"./telemetry.js\";\nimport { loadClaudeMd } from \"./agent-loop.js\";\nimport { getGlobalEmitter } from \"./agent-events.js\";\nimport { getAgentDefinition } from \"./agent-definitions.js\";\nimport {\n callAgentAPI,\n executeToolBlocks,\n extractTextBlocks,\n extractToolUseBlocks,\n getResponseText,\n yieldToEventLoop,\n yieldForRender,\n deduplicateTools,\n assertUniqueToolNames,\n} from \"./agent-worker-base.js\";\nimport type { AgentAPIResponse } from \"./agent-worker-base.js\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport type BuiltinSubagentType =\n | \"explore\" // Fast codebase exploration\n | \"plan\" // Planning complex implementations\n | \"general-purpose\" // Multi-step autonomous tasks\n | \"research\"; // Documentation lookups, web research\n\n// Accepts built-in types + custom agent names from .whale/agents/\nexport type SubagentType = BuiltinSubagentType | (string & {});\n\nexport interface ParentTraceContext {\n traceId: string; // 32 hex chars - inherited from parent\n spanId: string; // 16 hex chars - becomes our parentSpanId\n conversationId?: string;\n turnNumber: number; // Required - subagent inherits parent turn number\n userId?: string;\n userEmail?: string;\n}\n\nexport interface SubagentOptions {\n prompt: string;\n subagent_type: SubagentType;\n model?: \"sonnet\" | \"opus\" | \"haiku\";\n resume?: string; // Agent ID to resume from\n run_in_background?: boolean; // Write output to file, return immediately\n max_turns?: number; // Override default MAX_TURNS (clamped 1-50)\n name?: string; // Display name for agent\n parentContext?: string; // Summary of parent conversation for context\n parentTraceContext?: ParentTraceContext; // W3C trace context for hierarchical spans\n taskContext?: string; // Context about other parallel agents to avoid work duplication\n signal?: AbortSignal; // AbortSignal for cancellation (ESC)\n}\n\nexport interface SubagentResult {\n success: boolean;\n output: string;\n agentId: string;\n tokensUsed: { input: number; output: number };\n toolsUsed: string[];\n}\n\ninterface AgentState {\n id: string;\n type: SubagentType;\n model: string;\n messages: Anthropic.MessageParam[];\n toolsUsed: string[];\n continuations?: number; // max_tokens continuation count (capped by DB config)\n compactionCount?: number; // server-side compaction count\n createdAt: string;\n updatedAt: string;\n}\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst AGENTS_DIR = join(homedir(), \".whale\", \"agents\");\n\n// No hard cap on subagent turns — agent self-regulates via end_turn (Claude Code parity).\n// DB config (subagent_max_turns) controls the default. Callers can override via max_turns param.\n\n// ============================================================================\n// AGENT PROMPTS — specialized per type\n// ============================================================================\n\n// Build agent prompt with working directory context\nfunction buildAgentPrompt(type: SubagentType | string, cwd: string): string {\n const cwdContext = `\n## Working Directory\nYou are working in: ${cwd}\nAll file paths should be relative to or absolute from this directory.\nIMPORTANT: Focus ONLY on files within this directory. Do not get confused by other projects.\n`;\n\n // Check for custom agent definition first\n const custom = getAgentDefinition(type);\n if (custom) return custom.prompt + cwdContext;\n\n const prompts: Record<SubagentType, string> = {\n explore: `You are an exploration agent. Your ONLY job is to quickly find specific information in the codebase, then STOP.\n\nTools available:\n- glob: Find files by pattern (e.g., \"**/*.ts\")\n- grep: Search file contents with regex\n- read_file: Read file contents\n- list_directory: List directory contents\n${cwdContext}\n## STOP CONDITIONS — You MUST stop when ANY of these are met:\n1. You found the specific information requested\n2. You've searched 3+ patterns without finding anything new\n3. You've read the key files that answer the question\n4. You've exhausted reasonable search patterns\n\n## Guidelines:\n- Call multiple tools per turn — batch glob + grep + read_file in a single response\n- Read only the necessary files to answer the question\n- DO NOT continue exploring after you have the answer\n- DO NOT read files that aren't directly relevant\n\n## Output Format:\nReturn a concise summary with:\n- File paths and line numbers for relevant code\n- Key code snippets (brief)\n- Direct answer to the question asked\n\nIMPORTANT: Complete in 2-4 turns. If you haven't found it by turn 4, summarize what you found and STOP.`,\n\n plan: `You are a planning agent. Your ONLY job is to analyze the codebase and create an implementation plan, then STOP.\n\nTools available:\n- glob: Find files by pattern\n- grep: Search file contents\n- read_file: Read file contents\n- list_directory: List directory contents\n${cwdContext}\n## STOP CONDITIONS — You MUST stop when:\n1. You've identified the files that need changes\n2. You've understood the existing patterns/architecture\n3. You've created a concrete plan with specific steps\n\n## Guidelines:\n- FIRST: Quick search to find relevant files\n- Read only files needed to understand the architecture\n- DO NOT read every file — focus on entry points and key modules\n- Create the plan as soon as you understand the structure\n\n## Output Format — Return EXACTLY this structure:\n### Summary\n[1-2 sentences on the approach]\n\n### Files to Modify\n- path/to/file.ts: [what changes]\n\n### Implementation Steps\n1. [Specific step]\n2. [Specific step]\n\n### Risks\n- [Any considerations]\n\nIMPORTANT: Complete in 3-5 turns. If you haven't finished by turn 5, output your best plan and STOP.`,\n\n \"general-purpose\": `You are an autonomous agent for discrete tasks. Complete the task, then STOP.\n\nTools available:\n- File operations: read_file, write_file, edit_file, glob, grep\n- Shell: run_command\n- Search: search_files, search_content\n- Web: web_fetch\n${cwdContext}\n## STOP CONDITIONS — You MUST stop when:\n1. The specific task is complete\n2. You've verified the changes work (if applicable)\n3. You encounter a blocker you cannot resolve\n\n## Guidelines:\n- Understand what exists before making changes\n- Make targeted changes — don't over-engineer\n- Verify your changes if possible (run tests, check syntax)\n- If blocked, explain the blocker and STOP\n\n## Output Format:\n### What I Did\n[Brief summary of actions taken]\n\n### Files Modified\n- path/to/file.ts: [change description]\n\n### Verification\n[How you verified it works, or N/A]\n\n### Issues (if any)\n[Any problems encountered]\n\nIMPORTANT: This is a discrete task. Complete it in 4-6 turns maximum. Do not loop.`,\n\n research: `You are a research agent. Find the specific information requested, then STOP.\n\nTools available:\n- web_fetch: Fetch and parse web content\n- web_search: Search the web\n- read_file: Read local files\n- grep: Search local file contents\n${cwdContext}\n## STOP CONDITIONS — You MUST stop when:\n1. You found the answer to the question\n2. You've checked 2-3 authoritative sources\n3. You've gathered enough information to answer\n\n## Guidelines:\n- Search for official documentation first\n- Check 2-3 sources, not 10\n- DO NOT keep searching after you have the answer\n- Summarize findings immediately when you have enough\n\n## Output Format:\n### Answer\n[Direct answer to the question]\n\n### Key Points\n- [Important detail 1]\n- [Important detail 2]\n\n### Sources\n- [URL 1]: [what it says]\n- [URL 2]: [what it says]\n\n### Caveats\n[Any version requirements or limitations]\n\nIMPORTANT: Complete in 2-4 turns. Stop as soon as you have a good answer.`,\n };\n\n return prompts[type] || prompts[\"general-purpose\"];\n}\n\n// ============================================================================\n// AGENT STATE PERSISTENCE\n// ============================================================================\n\nfunction ensureAgentsDir(): void {\n if (!existsSync(AGENTS_DIR)) mkdirSync(AGENTS_DIR, { recursive: true });\n}\n\nfunction saveAgentState(state: AgentState): void {\n ensureAgentsDir();\n const path = join(AGENTS_DIR, `${state.id}.json`);\n writeFileSync(path, JSON.stringify(state, null, 2), \"utf-8\");\n}\n\nfunction loadAgentState(agentId: string): AgentState | null {\n const path = join(AGENTS_DIR, `${agentId}.json`);\n if (!existsSync(path)) return null;\n try {\n return JSON.parse(readFileSync(path, \"utf-8\"));\n } catch {\n return null;\n }\n}\n\nfunction generateAgentId(): string {\n return `agent-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n// ============================================================================\n// TOOL FILTERING — restrict tools per agent type\n// ============================================================================\n\nfunction getToolsForAgent(type: SubagentType | string): string[] {\n // Check for custom agent definition with explicit tools\n const custom = getAgentDefinition(type);\n if (custom?.tools && custom.tools.length > 0) return custom.tools;\n\n switch (type) {\n case \"explore\":\n return [\"glob\", \"grep\", \"read_file\", \"list_directory\", \"search_files\", \"search_content\"];\n case \"plan\":\n return [\"glob\", \"grep\", \"read_file\", \"list_directory\", \"search_files\", \"search_content\"];\n case \"research\":\n return [\"web_fetch\", \"web_search\", \"read_file\", \"grep\", \"glob\"];\n case \"general-purpose\":\n // All tools EXCEPT delegation — \"Subagents cannot spawn other subagents\" (Claude Code parity)\n return [\n \"read_file\", \"write_file\", \"edit_file\", \"list_directory\",\n \"search_files\", \"search_content\", \"run_command\",\n \"glob\", \"grep\", \"notebook_edit\", \"web_fetch\",\n ];\n default:\n return [\"read_file\", \"glob\", \"grep\"];\n }\n}\n\nasync function getFilteredTools(type: SubagentType): Promise<Anthropic.Tool[]> {\n const allowedNames = new Set(getToolsForAgent(type));\n\n // Local tools\n const localTools: Anthropic.Tool[] = LOCAL_TOOL_DEFINITIONS\n .filter((t) => allowedNames.has(t.name))\n .map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.input_schema as Anthropic.Tool[\"input_schema\"],\n }));\n\n // Add server tools if available, filtering by allowed names\n try {\n const serverTools = await loadServerToolDefinitions();\n const allowedServerTools = serverTools.filter(t => allowedNames.has(t.name));\n localTools.push(...allowedServerTools);\n } catch { /* server tools unavailable */ }\n\n // Deduplicate: local tools take priority over server tools with same name\n return deduplicateTools(localTools);\n}\n\n// ============================================================================\n// DISPLAY HELPERS — icons and colors for trace visualization\n// ============================================================================\n\nfunction getAgentIcon(type: SubagentType): string {\n const icons: Record<SubagentType, string> = {\n explore: \"🔍\", // Magnifying glass for exploration\n plan: \"📋\", // Clipboard for planning\n \"general-purpose\": \"🤖\", // Robot for autonomous work\n research: \"📚\", // Books for research\n };\n return icons[type] || \"⚙️\";\n}\n\nfunction getAgentColor(type: SubagentType): string {\n const colors: Record<SubagentType, string> = {\n explore: \"#3B82F6\", // Blue for exploration\n plan: \"#8B5CF6\", // Purple for planning\n \"general-purpose\": \"#10B981\", // Green for general work\n research: \"#F59E0B\", // Amber for research\n };\n return colors[type] || \"#6B7280\";\n}\n\n// ============================================================================\n// SUBAGENT EXECUTION\n// ============================================================================\n\n// Progress emitter — uses event system instead of stderr to avoid UI conflicts\n// The global emitter batches and routes these to ChatApp without causing re-renders\n// NOTE: No module-level mutable state — agentId/turn passed through function params for parallel safety\n\nfunction emitSubagentProgress(agentType: SubagentType, agentId: string, message: string, turn?: number, toolName?: string): void {\n const emitter = getGlobalEmitter();\n emitter.emitSubagentProgress(agentId, agentType, message, turn, toolName);\n}\n\nexport async function runSubagent(options: SubagentOptions): Promise<SubagentResult> {\n const { prompt, subagent_type, model, resume, max_turns, name, parentContext, parentTraceContext, taskContext, signal } = options;\n\n const agentId = resume || generateAgentId();\n const cwd = process.cwd();\n const systemPrompt = buildAgentPrompt(subagent_type, cwd);\n const startTime = Date.now();\n\n // Check for custom agent definition with per-agent config\n const customDef = getAgentDefinition(subagent_type);\n\n // Model resolution: caller override → agent definition → demotion logic → haiku\n const effectiveModelAlias = model || customDef?.model || demoteSubagentModel(model, subagent_type);\n const modelId = MODEL_MAP[effectiveModelAlias] || MODEL_MAP[\"haiku\"];\n\n // Resolve all config from DB → AGENT_DEFAULTS fallback (single source of truth)\n const dbAgent = await loadCLIAgentConfig();\n const resolved = dbAgent ? resolveAgentLoopConfig(dbAgent, \"sse\") : null;\n const dbMaxTurns = resolved?.subagentMaxTurns ?? AGENT_DEFAULTS.subagentMaxTurns;\n const dbMaxTokens = customDef?.max_tokens ?? resolved?.subagentMaxTokens ?? AGENT_DEFAULTS.subagentMaxTokens;\n // 0 = no limit (agent self-regulates via end_turn, Claude Code parity)\n // Safety: LoopDetector + cost budget + stall detection are the real guards.\n const rawMaxTurns = max_turns ? Math.max(1, max_turns) : dbMaxTurns;\n const effectiveMaxTurns = rawMaxTurns === 0 ? Number.MAX_SAFE_INTEGER : rawMaxTurns;\n const maxToolResultChars = resolved?.maxToolResultChars ?? AGENT_DEFAULTS.maxToolResultChars;\n const maxRetries = resolved?.subagentMaxRetries ?? AGENT_DEFAULTS.subagentMaxRetries;\n const maxContinuations = resolved?.subagentMaxContinuations ?? AGENT_DEFAULTS.subagentMaxContinuations;\n\n // Extract short description from prompt (first sentence or 60 chars)\n const descMatch = prompt.match(/^[^.!?\\n]+/);\n const shortDescription = name || (descMatch\n ? descMatch[0].slice(0, 60) + (descMatch[0].length > 60 ? \"…\" : \"\")\n : prompt.slice(0, 60) + (prompt.length > 60 ? \"…\" : \"\"));\n\n // Emit subagent start event\n const emitter = getGlobalEmitter();\n emitter.emitSubagentStart(agentId, subagent_type, model || \"inherited\", shortDescription);\n\n // Load or create agent state\n let state = resume ? loadAgentState(resume) : null;\n if (!state) {\n state = {\n id: agentId,\n type: subagent_type,\n model: modelId,\n messages: [],\n toolsUsed: [],\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n }\n\n const loopDetector = resolved\n ? LoopDetector.fromResolved(resolved)\n : new LoopDetector();\n\n // Get filtered tools for this agent type (deduped)\n const tools = await getFilteredTools(subagent_type);\n assertUniqueToolNames(tools);\n\n // Build full system prompt with optional parent context and task dedup context\n let fullSystemPrompt = systemPrompt;\n if (parentContext) {\n fullSystemPrompt += `\\n\\n## Parent Conversation Context\\n${parentContext}`;\n }\n if (taskContext) {\n fullSystemPrompt += `\\n\\n## Other Agents\\n${taskContext}\\nDo NOT duplicate research or work that other agents are handling. Focus only on your assigned task.`;\n }\n\n // Add CLAUDE.md if available\n const claudeMd = loadClaudeMd();\n if (claudeMd) {\n fullSystemPrompt += `\\n\\n## Project Instructions\\n${claudeMd.content}`;\n }\n\n // Add user prompt to messages\n state.messages.push({ role: \"user\", content: prompt });\n\n let totalIn = 0;\n let totalOut = 0;\n let totalCacheRead = 0;\n let totalCacheCreate = 0;\n let finalText = \"\";\n\n // Create subagent span context — inherit parent's trace context for hierarchy\n // IMPORTANT: Don't increment global turn number — subagent is part of parent turn\n const subagentSpanId = generateSpanId();\n const turnCtx = {\n source: \"claude_code\" as const,\n serviceName: \"whale-cli\",\n serviceVersion: PKG_VERSION,\n model: modelId,\n agentId,\n agentName: name || `subagent-${subagent_type}`,\n // Inherit parent's trace to keep hierarchy intact\n traceId: parentTraceContext?.traceId || generateTraceId(),\n spanId: subagentSpanId,\n parentSpanId: parentTraceContext?.spanId, // Parent's spanId becomes our parentSpanId\n conversationId: parentTraceContext?.conversationId,\n turnNumber: parentTraceContext?.turnNumber, // Inherit parent turn, don't increment\n userId: parentTraceContext?.userId,\n userEmail: parentTraceContext?.userEmail,\n traceFlags: 1,\n };\n\n try {\n for (let turn = 0; turn < effectiveMaxTurns; turn++) {\n // Check for cancellation at start of each turn\n if (signal?.aborted) {\n emitSubagentProgress(subagent_type, agentId, \"cancelled\", turn + 1);\n emitter.emitSubagentDone(agentId, subagent_type, false, \"Cancelled\", { input: totalIn, output: totalOut }, state.toolsUsed, Date.now() - startTime);\n return { success: false, output: \"Cancelled\", agentId, tokensUsed: { input: totalIn, output: totalOut }, toolsUsed: state.toolsUsed };\n }\n\n // Emit progress and yield before API call to keep UI responsive\n emitSubagentProgress(subagent_type, agentId, `turn ${turn + 1}: calling API...`, turn + 1);\n await yieldForRender(); // Give Ink time to render the progress update\n\n // Adaptive thinking enabled — model decides when to think (Claude Code parity).\n // Opus 4.6 uses adaptive thinking by default; no separate enable/disable needed.\n const apiStart = Date.now();\n let response!: AgentAPIResponse;\n let lastError: Error | null = null;\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n response = await callAgentAPI({\n modelId,\n contextProfile: \"subagent\",\n systemPrompt: fullSystemPrompt,\n messages: state.messages,\n tools,\n thinkingEnabled: true,\n maxOutputTokens: dbMaxTokens,\n cacheLastTool: true,\n abortSignal: signal,\n });\n lastError = null;\n break;\n } catch (err: any) {\n lastError = err;\n if (attempt < maxRetries - 1 && (err.status === 429 || err.status === 500 || err.status === 529)) {\n await new Promise(r => setTimeout(r, 1000 * Math.pow(2, attempt)));\n continue;\n }\n throw err;\n }\n }\n if (lastError) throw lastError;\n const apiDuration = Date.now() - apiStart;\n\n // Yield after API call\n await yieldToEventLoop();\n\n totalIn += response.usage.input_tokens;\n totalOut += response.usage.output_tokens;\n totalCacheRead += response.usage.cache_read_tokens;\n totalCacheCreate += response.usage.cache_creation_tokens;\n\n // Log API call as child span — include cache tokens for accurate cost\n const apiCostUsd = estimateCostUsd(\n response.usage.input_tokens,\n response.usage.output_tokens,\n modelId,\n 0, // thinkingTokens (disabled for subagents)\n response.usage.cache_read_tokens,\n response.usage.cache_creation_tokens,\n );\n logSpan({\n action: \"claude_api_request\",\n durationMs: apiDuration,\n context: {\n ...turnCtx,\n spanId: generateSpanId(), // New span for this API call\n parentSpanId: turnCtx.spanId, // Parent is the subagent\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n cacheReadTokens: response.usage.cache_read_tokens,\n cacheCreationTokens: response.usage.cache_creation_tokens,\n totalCost: apiCostUsd,\n model: modelId,\n },\n details: {\n \"gen_ai.request.model\": modelId,\n \"gen_ai.usage.input_tokens\": response.usage.input_tokens,\n \"gen_ai.usage.output_tokens\": response.usage.output_tokens,\n \"gen_ai.usage.cache_read_tokens\": response.usage.cache_read_tokens,\n \"gen_ai.usage.cache_creation_tokens\": response.usage.cache_creation_tokens,\n \"gen_ai.usage.cost\": apiCostUsd,\n agent_id: agentId,\n agent_type: subagent_type,\n turn: turn + 1,\n stop_reason: response.stop_reason,\n is_subagent_api: true,\n },\n });\n\n // Yield to event loop to keep UI responsive\n await yieldToEventLoop();\n\n // Extract text and tool use using shared helpers\n const textBlocks = extractTextBlocks(response.content);\n const toolBlocks = extractToolUseBlocks(response.content);\n\n if (textBlocks.length) {\n finalText = getResponseText(response.content);\n }\n\n // Compaction handling — API paused after generating summary.\n // Per Anthropic docs: just use the compaction block, don't preserve old messages.\n if (response.stop_reason === \"compaction\") {\n const compactionBlock = response.content.find((b: any) => b.type === \"compaction\") as any;\n if (compactionBlock) {\n state.compactionCount = (state.compactionCount ?? 0) + 1;\n state.messages = [\n { role: \"assistant\", content: [{ type: \"compaction\", content: compactionBlock.content }] },\n { role: \"user\", content: [{ type: \"text\", text: \"Continue with your task.\" }] },\n ] as any;\n turn--; // Don't count compaction as a turn\n continue;\n }\n }\n\n // No tool calls — check stop reason\n if (toolBlocks.length === 0 || response.stop_reason === \"end_turn\") {\n // max_tokens: response was truncated mid-generation — give the model a chance to finish\n // Cap at 2 continuations to prevent infinite loops on very large outputs\n if (response.stop_reason === \"max_tokens\" && (state.continuations ?? 0) < maxContinuations) {\n state.continuations = (state.continuations ?? 0) + 1;\n state.messages.push({\n role: \"assistant\",\n content: response.content,\n });\n const contCount = state.continuations ?? 1;\n const contText = contCount === 1\n ? \"[Your response was truncated due to the output token limit. If writing a large file, split into multiple smaller write_file calls (~200 lines each). Continue concisely.]\"\n : `[Truncated again (${contCount}/${maxContinuations}). You MUST reduce output size — use multiple small write_file calls, not one large one.]`;\n state.messages.push({\n role: \"user\",\n content: [{ type: \"text\", text: contText }],\n });\n continue;\n }\n emitSubagentProgress(subagent_type, agentId, `done (${turn + 1} turn${turn > 0 ? \"s\" : \"\"})`, turn + 1);\n break;\n }\n\n // Emit tool usage progress\n const toolNames = toolBlocks.map(b => b.name).join(\", \");\n emitSubagentProgress(subagent_type, agentId, `using: ${toolNames}`, turn + 1);\n\n // Execute tools using shared executeToolBlocks\n const { toolResults, toolsUsed: turnToolsUsed } = await executeToolBlocks({\n toolBlocks,\n loopDetector,\n signal,\n callbacks: {\n onToolStart: (toolName, input) => {\n emitSubagentProgress(subagent_type, agentId, `running ${toolName}`, turn + 1, toolName);\n emitter.emitSubagentToolStart(agentId, toolName, input);\n },\n onToolEnd: (toolName, success, durationMs) => {\n emitter.emitSubagentToolEnd(agentId, toolName, success, durationMs);\n\n // Log tool call as child span of the subagent\n const tu = toolBlocks.find(b => b.name === toolName);\n logSpan({\n action: `tool.${toolName}`,\n durationMs,\n context: {\n ...turnCtx,\n spanId: generateSpanId(),\n parentSpanId: turnCtx.spanId,\n },\n error: success ? undefined : \"(see tool result)\",\n details: {\n tool_type: \"subagent_tool\",\n tool_input: tu?.input,\n agent_id: agentId,\n agent_type: subagent_type,\n is_subagent_tool: true,\n iteration: turn,\n },\n });\n },\n },\n });\n\n // Track tool usage\n for (const tn of turnToolsUsed) {\n if (!state.toolsUsed.includes(tn)) {\n state.toolsUsed.push(tn);\n }\n }\n\n // Append assistant response + tool results\n state.messages.push({\n role: \"assistant\",\n content: response.content,\n });\n state.messages.push({\n role: \"user\",\n content: toolResults,\n });\n\n // Progress nudge: when approaching turn limit without any edits, warn the agent\n const turnsRemaining = effectiveMaxTurns - turn - 1;\n const nudgeThreshold = Math.ceil(effectiveMaxTurns * 0.25); // Last 25% of turns\n if (turnsRemaining === nudgeThreshold && turnsRemaining > 0) {\n const editTools = [\"write_file\", \"edit_file\", \"create_file\", \"notebook_edit\"];\n const hasEdited = state.toolsUsed.some(t => editTools.includes(t));\n if (!hasEdited) {\n state.messages.push({\n role: \"user\",\n content: [{\n type: \"text\",\n text: `⚠️ TURN LIMIT WARNING: You have ${turnsRemaining} turns remaining out of ${effectiveMaxTurns} and have NOT made any file edits yet. Stop exploring and start producing your output NOW. If you need to write or edit files, do it immediately. Prioritize delivering results over gathering more information.`,\n }],\n });\n }\n }\n\n // Pre-compact: trim large tool results and thinking blocks to prevent context bloat.\n // Without this, context grows unbounded (4K→28K→73K tokens per turn).\n const { messages: compactedMessages } = preCompact(\n state.messages,\n { maxToolResultChars, stripThinking: true },\n );\n state.messages = compactedMessages;\n\n // Yield to event loop after tool execution\n await yieldToEventLoop();\n }\n\n // Save state for potential resume\n state.updatedAt = new Date().toISOString();\n saveAgentState(state);\n\n // Log single subagent span with all metadata for trace visualization\n const subagentTotalCost = estimateCostUsd(totalIn, totalOut, modelId, 0, totalCacheRead, totalCacheCreate);\n logSpan({\n action: `subagent.${subagent_type}`,\n durationMs: Date.now() - new Date(state.createdAt).getTime(),\n context: {\n ...turnCtx,\n inputTokens: totalIn,\n outputTokens: totalOut,\n totalCost: subagentTotalCost,\n },\n details: {\n agent_id: agentId,\n agent_type: subagent_type,\n model: modelId,\n\n // OpenTelemetry gen_ai semantic conventions\n \"gen_ai.request.model\": modelId,\n \"gen_ai.usage.input_tokens\": totalIn,\n \"gen_ai.usage.output_tokens\": totalOut,\n \"gen_ai.usage.cache_read_tokens\": totalCacheRead,\n \"gen_ai.usage.cache_creation_tokens\": totalCacheCreate,\n \"gen_ai.usage.cost\": subagentTotalCost,\n\n // Execution metrics\n turns: state.messages.length / 2,\n tools_used: state.toolsUsed,\n tool_count: state.toolsUsed.length,\n\n // Hierarchy\n is_subagent: true,\n parent_trace_id: parentTraceContext?.traceId,\n parent_span_id: parentTraceContext?.spanId,\n\n // Display metadata\n display_name: `${subagent_type.charAt(0).toUpperCase() + subagent_type.slice(1)} Agent`,\n display_icon: getAgentIcon(subagent_type),\n display_color: getAgentColor(subagent_type),\n\n // Content previews\n summary: finalText.slice(0, 2000) + (finalText.length > 2000 ? \"...\" : \"\"),\n prompt_preview: prompt.slice(0, 200) + (prompt.length > 200 ? \"...\" : \"\"),\n },\n });\n\n // Emit subagent done event\n emitter.emitSubagentDone(\n agentId,\n subagent_type,\n true,\n finalText || \"(No output from agent)\",\n { input: totalIn, output: totalOut },\n state.toolsUsed,\n Date.now() - startTime\n );\n\n return {\n success: true,\n output: finalText || \"(No output from agent)\",\n agentId,\n tokensUsed: { input: totalIn, output: totalOut },\n toolsUsed: state.toolsUsed,\n };\n } catch (err: any) {\n // Emit subagent error event\n emitter.emitSubagentDone(\n agentId,\n subagent_type,\n false,\n `Agent error: ${err.message || err}`,\n { input: totalIn, output: totalOut },\n state.toolsUsed,\n Date.now() - startTime\n );\n\n return {\n success: false,\n output: `Agent error: ${err.message || err}`,\n agentId,\n tokensUsed: { input: totalIn, output: totalOut },\n toolsUsed: state.toolsUsed,\n };\n }\n}\n\n// ============================================================================\n// BACKGROUND AGENT EXECUTION\n// ============================================================================\n\nexport async function runSubagentBackground(options: SubagentOptions): Promise<{ agentId: string; outputFile: string }> {\n const agentId = options.resume || generateAgentId();\n const outputFile = join(tmpdir(), `whale-agent-${agentId}.output`);\n\n // Write initial status\n writeFileSync(outputFile, `Agent ${agentId} started (${options.subagent_type})\\n`, \"utf-8\");\n\n // Import background process tracker (dynamic to avoid circular deps)\n const bgModule = await import(\"./background-processes.js\");\n const abortController = bgModule.registerBackgroundAgent(agentId, options.subagent_type, outputFile);\n\n // Start agent in detached async — don't await\n runSubagent({ ...options, resume: undefined, signal: abortController.signal }).then(result => {\n appendFileSync(outputFile, `\\n---DONE---\\n${JSON.stringify({ success: result.success, agentId: result.agentId, output: result.output })}\\n`, \"utf-8\");\n import(\"./background-processes.js\").then(m => m.markAgentDone(agentId, result.success));\n }).catch(err => {\n appendFileSync(outputFile, `\\n---ERROR---\\n${err.message}\\n`, \"utf-8\");\n import(\"./background-processes.js\").then(m => m.markAgentDone(agentId, false));\n });\n\n return { agentId, outputFile };\n}\n\n// ============================================================================\n// TOOL DEFINITION — for integration with main agent loop\n// ============================================================================\n\n// Following Claude Code pattern: discrete, focused tasks with clear completion criteria\nexport const TASK_TOOL_DEFINITION: Anthropic.Tool = {\n name: \"task\",\n description: `Launch a subagent in isolated context. Subagents have full tool access and batch multiple tool calls per turn (glob + grep + read_file in parallel). Launch multiple task calls in one response for parallel execution.\n\nUse for any work requiring 3+ tool calls or touching multiple parts of the codebase.\n\nAgent types:\n- explore: Find specific files/code (2-4 turns, uses batch glob+grep)\n- plan: Create implementation plan (3-5 turns)\n- general-purpose: Complete a specific task (4-8 turns, full tool access)\n- research: Look up specific info (2-4 turns)\n\nEach agent completes autonomously and returns results.`,\n input_schema: {\n type: \"object\",\n properties: {\n prompt: {\n type: \"string\",\n description: \"Specific task with clear completion criteria. Include: what to find/do, where to look, what to return.\",\n },\n subagent_type: {\n type: \"string\",\n enum: [\"explore\", \"plan\", \"general-purpose\", \"research\"],\n description: \"Agent type: explore=find, plan=design, general-purpose=do, research=lookup.\",\n },\n model: {\n type: \"string\",\n enum: [\"sonnet\", \"haiku\"],\n description: \"Optional model. haiku (default) for fast tasks, sonnet for complex reasoning.\",\n },\n resume: {\n type: \"string\",\n description: \"Agent ID to resume (rarely needed).\",\n },\n },\n required: [\"prompt\", \"subagent_type\"],\n },\n};\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,YAAY,EAAEC,UAAU,EAAEC,aAAa,EAAEC,SAAS,EAAEC,cAAc,QAAQ,IAAI;AACvF,SAASC,IAAI,QAAQ,MAAM;AAC3B,SAASC,OAAO,EAAEC,MAAM,QAAQ,IAAI;AACpC,SACEC,sBAAsB,QACjB,kBAAkB;AACzB,SAASC,YAAY,EAAEC,eAAe,EAAEC,mBAAmB,EAAEC,cAAc,EAAEC,sBAAsB,QAAQ,4BAA4B;AACvI,SAASC,UAAU,QAAQ,4BAA4B;AACvD,SAASC,kBAAkB,QAAQ,mBAAmB;AACtD,SAASC,SAAS,QAAQ,2BAA2B;AACrD,SACEC,yBAAyB,QACpB,mBAAmB;AAC1B,SAASC,OAAO,EAAEC,cAAc,EAAEC,eAAe,EAAEC,WAAW,QAAQ,gBAAgB;AACtF,SAASC,YAAY,QAAQ,iBAAiB;AAC9C,SAASC,gBAAgB,QAAQ,mBAAmB;AACpD,SAASC,kBAAkB,QAAQ,wBAAwB;AAC3D,SACEC,YAAY,EACZC,iBAAiB,EACjBC,iBAAiB,EACjBC,oBAAoB,EACpBC,eAAe,EACfC,gBAAgB,EAChBC,cAAc,EACdC,gBAAgB,EAChBC,qBAAqB,QAChB,wBAAwB;;AAG/B;AACA;AACA;;AAMwB;;AAExB;;AA8CA;AACA;AACA;;AAEA,MAAMC,UAAU,GAAG7B,IAAI,CAACC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC;;AAEtD;AACA;;AAEA;AACA;AACA;;AAEA;AACA,SAAS6B,gBAAgBA,CAACC,IAA2B,EAAEC,GAAW,EAAU;EAC1E,MAAMC,UAAU,GAAG;AACrB;AACA,sBAAsBD,GAAG;AACzB;AACA;AACA,CAAC;;EAEC;EACA,MAAME,MAAM,GAAGf,kBAAkB,CAACY,IAAI,CAAC;EACvC,IAAIG,MAAM,EAAE,OAAOA,MAAM,CAACC,MAAM,GAAGF,UAAU;EAE7C,MAAMG,OAAqC,GAAG;IAC5CC,OAAO,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;AACA,EAAEJ,UAAU;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wGAAwG;IAEpGK,IAAI,EAAE;AACV;AACA;AACA;AACA;AACA;AACA;AACA,EAAEL,UAAU;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qGAAqG;IAEjG,iBAAiB,EAAE;AACvB;AACA;AACA;AACA;AACA;AACA;AACA,EAAEA,UAAU;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mFAAmF;IAE/EM,QAAQ,EAAE;AACd;AACA;AACA;AACA;AACA;AACA;AACA,EAAEN,UAAU;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,CAAC;EAED,OAAOG,OAAO,CAACL,IAAI,CAAC,IAAIK,OAAO,CAAC,iBAAiB,CAAC;AACpD;;AAEA;AACA;AACA;;AAEA,SAASI,eAAeA,CAAA,EAAS;EAC/B,IAAI,CAAC5C,UAAU,CAACiC,UAAU,CAAC,EAAE/B,SAAS,CAAC+B,UAAU,EAAE;IAAEY,SAAS,EAAE;EAAK,CAAC,CAAC;AACzE;AAEA,SAASC,cAAcA,CAACC,KAAiB,EAAQ;EAC/CH,eAAe,CAAC,CAAC;EACjB,MAAMI,IAAI,GAAG5C,IAAI,CAAC6B,UAAU,EAAE,GAAGc,KAAK,CAACE,EAAE,OAAO,CAAC;EACjDhD,aAAa,CAAC+C,IAAI,EAAEE,IAAI,CAACC,SAAS,CAACJ,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC;AAC9D;AAEA,SAASK,cAAcA,CAACC,OAAe,EAAqB;EAC1D,MAAML,IAAI,GAAG5C,IAAI,CAAC6B,UAAU,E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","ignoreList":[]}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import { readdirSync } from "fs";
|
|
9
|
+
import { execFileSync } from "child_process";
|
|
9
10
|
import { loadConfig } from "./config-store.js";
|
|
10
11
|
import { loadMemory } from "./memory-manager.js";
|
|
11
12
|
import { loadClaudeMd } from "./claude-md-loader.js";
|
|
@@ -109,9 +110,10 @@ Consider the reversibility and blast radius of your actions:
|
|
|
109
110
|
|
|
110
111
|
## Teams (team_create / team_auto)
|
|
111
112
|
- Do NOT use teams for bug fixes or single-file changes — work directly. Teams are for large features with 3+ independent workstreams.
|
|
112
|
-
- **team_auto**: Give it a single task string — it auto-decomposes into parallel sub-tasks
|
|
113
|
-
- **team_create**:
|
|
114
|
-
-
|
|
113
|
+
- **team_auto**: Give it a single task string — it auto-decomposes into parallel sub-tasks and spawns them. Returns immediately with a task_id.
|
|
114
|
+
- **team_create**: Explicit control over task breakdown, file assignments, and models. Returns immediately with a task_id.
|
|
115
|
+
- Teams run in the background like any other background task. Use **task_output** to check progress, **task_stop** to kill the team or individual teammates (task_id="team-xxx/teammate-yyy").
|
|
116
|
+
- When creating teams, assign per-task models based on complexity. Most tasks should use haiku or sonnet.`;
|
|
115
117
|
if (hasServerTools) {
|
|
116
118
|
const storeCtx = storeConfig.store_name ? ` All operations are scoped to the active store: **${storeConfig.store_name}**.` : "";
|
|
117
119
|
toolSection += `
|
|
@@ -159,6 +161,27 @@ Consider the reversibility and blast radius of your actions:
|
|
|
159
161
|
}
|
|
160
162
|
sections.push(toolSection);
|
|
161
163
|
|
|
164
|
+
// ── Local CLI utilities (auto-detected) ──
|
|
165
|
+
if (process.platform === "darwin") {
|
|
166
|
+
const localTools = [];
|
|
167
|
+
try {
|
|
168
|
+
const imsgPath = execFileSync("which", ["imsg"], {
|
|
169
|
+
encoding: "utf-8",
|
|
170
|
+
timeout: 2000
|
|
171
|
+
}).trim();
|
|
172
|
+
if (imsgPath) {
|
|
173
|
+
localTools.push(`- **iMessage**: Use \`imsg send --to <email_or_phone> --text "<message>"\` to send iMessages. Do NOT use osascript or AppleScript — it lacks automation permissions. The \`imsg\` binary handles Messages.app integration natively.
|
|
174
|
+
- Query chats: \`imsg chats --limit 20 --json\`
|
|
175
|
+
- List messages: \`imsg list --limit 20 --json\`
|
|
176
|
+
- Send to address: \`imsg send --to "+14155551234" --text "Hello"\`
|
|
177
|
+
- Send to chat: \`imsg send --chat-id 42 --text "Hello"\``);
|
|
178
|
+
}
|
|
179
|
+
} catch {/* imsg not installed */}
|
|
180
|
+
if (localTools.length > 0) {
|
|
181
|
+
sections.push(`# Local CLI utilities (macOS)\n${localTools.join("\n")}`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
162
185
|
// ── Permission mode ──
|
|
163
186
|
const permissionMode = getPermissionMode();
|
|
164
187
|
if (permissionMode === "plan") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-prompt.js","names":["readdirSync","loadConfig","loadMemory","loadClaudeMd","gatherGitContext","getPermissionMode","buildSystemPrompt","hasServerTools","effort","sections","push","envLines","process","cwd","platform","Date","toISOString","split","storeConfig","store_name","store_id","gitContext","entries","withFileTypes","dirs","filter","e","isDirectory","name","startsWith","map","sort","fileNames","isFile","listing","slice","length","join","toolSection","storeCtx","permissionMode","memory","claudeMd","path","content"],"sources":["../../../src/cli/services/system-prompt.ts"],"sourcesContent":["/**\n * System Prompt Builder — assembles the full system prompt for the agent loop\n *\n * Extracted from agent-loop.ts for single-responsibility.\n * All consumers should import from agent-loop.ts (re-export facade).\n */\n\nimport { readdirSync } from \"fs\";\nimport { loadConfig } from \"./config-store.js\";\nimport { loadMemory } from \"./memory-manager.js\";\nimport { loadClaudeMd } from \"./claude-md-loader.js\";\nimport { gatherGitContext } from \"./git-context.js\";\nimport { getPermissionMode } from \"./permission-modes.js\";\n\nexport async function buildSystemPrompt(hasServerTools: boolean, effort?: \"low\" | \"medium\" | \"high\"): Promise<string> {\n const sections: string[] = [];\n\n // ── Identity ──\n sections.push(`You are whale code, an interactive CLI agent for software engineering and business operations.\nYou help users with coding tasks, debugging, refactoring, and managing business data through tools.`);\n\n // ── Environment ──\n const envLines = [\n `Working directory: ${process.cwd()}`,\n `Platform: ${process.platform}`,\n `Date: ${new Date().toISOString().split(\"T\")[0]}`,\n ];\n // Store context — critical for server tools to operate on the right data\n const storeConfig = loadConfig();\n if (storeConfig.store_name || storeConfig.store_id) {\n envLines.push(`Active store: ${storeConfig.store_name || storeConfig.store_id}`);\n }\n const gitContext = await gatherGitContext();\n if (gitContext) envLines.push(`\\n${gitContext}`);\n // Directory listing — top-level files/folders for spatial awareness\n try {\n const entries = readdirSync(process.cwd(), { withFileTypes: true });\n const dirs = entries.filter(e => e.isDirectory() && !e.name.startsWith(\".\")).map(e => e.name + \"/\").sort();\n const fileNames = entries.filter(e => e.isFile()).map(e => e.name).sort();\n const listing = [...dirs, ...fileNames].slice(0, 30);\n if (listing.length > 0) {\n envLines.push(`\\nDirectory contents:\\n${listing.join(\"\\n\")}`);\n }\n } catch { /* cwd not readable */ }\n sections.push(`# Environment\\n${envLines.join(\"\\n\")}`);\n\n // ── Doing tasks ──\n sections.push(`# Doing tasks\n- The user will primarily request software engineering tasks: solving bugs, adding features, refactoring, explaining code, and more.\n- You are highly capable and can complete ambitious, multi-step tasks autonomously. Defer to user judgement about scope.\n- ALWAYS read relevant code before proposing changes. Do not modify files you haven't read. Understand existing patterns before editing.\n- Prefer editing existing files over creating new ones. Do not create files unless absolutely necessary.\n- Avoid over-engineering. Only make changes that are directly requested or clearly necessary. Keep solutions simple and focused.\n - Don't add features, refactor code, or make \"improvements\" beyond what was asked.\n - Don't add error handling or validation for scenarios that can't happen.\n - Don't create abstractions for one-time operations.\n- Be careful not to introduce security vulnerabilities (command injection, XSS, SQL injection, etc.). If you notice insecure code you wrote, fix it immediately.\n- If your approach is blocked, do not brute force. Consider alternative approaches or ask the user.`);\n\n // ── Coding workflow ──\n sections.push(`# Mandatory coding workflow\nWhen making code changes, ALWAYS follow this sequence:\n\n1. **Read** — Read the files you intend to modify. Understand the existing code, imports, types, and patterns.\n2. **Plan** — For non-trivial changes, briefly state what you'll change and why BEFORE editing. For multi-file changes, list the files and the change for each.\n3. **Edit** — Make targeted, minimal changes. Keep edit batches small (5 or fewer edits before verifying).\n4. **Verify** — After each batch of edits, run the build or tests (e.g. \\`npm run build\\`, \\`tsc --noEmit\\`, \\`pytest\\`). Read the output. Fix errors before making more edits.\n5. **Report** — Summarize what you changed and the verification results.\n\nCRITICAL RULES:\n- NEVER skip step 1. Do not edit files you haven't read in this session.\n- NEVER make more than 5-8 edits without running a verification step.\n- If a build or test fails, read the error output carefully before attempting a fix. Do not guess.\n- If the same fix approach fails twice, STOP. Re-read the relevant code and try a fundamentally different approach.\n- If you are stuck after 3 failed attempts, explain what you've tried and ask the user for guidance.`);\n\n // ── Actions with care ──\n sections.push(`# Executing actions with care\nConsider the reversibility and blast radius of your actions:\n- Freely take local, reversible actions like editing files or running tests.\n- For hard-to-reverse or shared-state actions (deleting files, force-pushing, modifying CI, sending messages), check with the user first.\n- Do not use destructive actions as shortcuts. Identify root causes rather than bypassing safety checks.\n- If you encounter unexpected state (unfamiliar files, branches, config), investigate before overwriting — it may be the user's in-progress work.`);\n\n // ── Tool use ──\n let toolSection = `# Using tools\n- Use the RIGHT tool for the job. Do NOT use run_command when a dedicated tool exists:\n - read_file to read files (not \\`cat\\` or \\`head\\`)\n - edit_file or multi_edit to edit files (not \\`sed\\` or \\`awk\\`)\n - write_file to create files (not \\`echo >\\` or heredocs)\n - glob to find files by pattern (not \\`find\\` or \\`ls\\`)\n - grep to search content (not \\`grep\\` or \\`rg\\` via run_command)\n - run_command ONLY for shell operations: build, test, git, install, etc.\n- Call multiple INDEPENDENT tools in a single response for parallel execution. Do not chain when results are independent.\n- Only chain across turns when a result is needed for the next call.\n- If a tool fails, read the error. If it fails 3 times, try a different tool or approach entirely.\n- All file paths in tool calls should be relative to the working directory when possible (e.g. \"src/foo.ts\" not \"/Users/name/project/src/foo.ts\").\n- When the user drops a file path, read it with read_file before responding.\n- For large files (>200 lines): split across multiple write_file calls. Write the first ~200 lines, then use edit_file to append the rest in chunks. NEVER try to write an entire large file in a single tool call — it will be truncated.\n\n## Subagents (task tool) — DELEGATE AGGRESSIVELY\n- Your input tokens are expensive. Delegate ALL multi-step research to subagents instead of using tools directly.\n- ALWAYS delegate: grep/glob searches, reading multiple files, codebase exploration, test runs, linting.\n- Only use tools directly when: (1) a single read_file answers the question, or (2) you need the result in THIS turn for a decision.\n- Launch multiple subagents in parallel for independent work — this is faster AND cheaper than serial tool calls.\n- Use task with run_in_background:true for long-running tasks; check with task_output, stop with task_stop.\n- Prefer \"explore\" type for quick codebase searches (2-4 turns). Prefer \"general-purpose\" for autonomous multi-step tasks.\n- Cost-aware model routing (delegate to cheapest model that can handle the task):\n - model:\"haiku\" — file searches, schema lookups, simple reads, pattern matching ($1/$5 per 1M tokens). DEFAULT for most delegation.\n - model:\"sonnet\" — code analysis, multi-step research, plan design, code writing ($3/$15 per 1M tokens)\n - model:\"opus\" — never delegate to opus subagents (you are opus, defeats the purpose)\n\n## Teams (team_create / team_auto)\n- Do NOT use teams for bug fixes or single-file changes — work directly. Teams are for large features with 3+ independent workstreams.\n- **team_auto**: Give it a single task string — it auto-decomposes into parallel sub-tasks with file ownership, runs them, and reviews results. Best for refactoring, audits, and multi-file features.\n- **team_create**: Use when you want explicit control over task breakdown, file assignments, and models.\n- When creating teams manually, assign per-task models based on complexity. Most tasks should use haiku or sonnet.`;\n\n if (hasServerTools) {\n const storeCtx = storeConfig.store_name ? ` All operations are scoped to the active store: **${storeConfig.store_name}**.` : \"\";\n toolSection += `\n\n## Server tools (business operations)\n- Server tools (analytics, products, inventory, customers, orders, email, workflows, etc.) operate on the active store's data.${storeCtx}\n- These tools require UUIDs for mutations. ALWAYS look up IDs first: use find/list actions to resolve names to UUIDs before calling create/update/delete.\n- The store_id is automatically included in every server tool call — you do NOT need to pass it manually.\n- Use analytics for sales, revenue, and performance data. Use inventory for stock levels. Use products for the catalog.\n- Use audit_trail for store activity history (inventory changes, orders, transfers).\n- Use telemetry for AI system metrics (conversations, tool performance, errors).\n- **Inventory workflow**: (1) Find product with products tool (action=find), (2) Look up location with inventory tool (action=summary or by_location) to get location_id, (3) Use inventory tool with adjust/set and the resolved UUIDs. Always provide a reason for adjustments.\n- **Purchase Order workflow**: (1) Find supplier with supply_chain (action=find_suppliers), (2) Find products with products (action=find), (3) supply_chain action=po_create with supplier_id, location_id, items array, (4) supply_chain action=po_approve, (5) supply_chain action=po_receive to add inventory.\n- **Transfer workflow**: supply_chain action=transfer_create with from_location_id, to_location_id, items → supply_chain action=transfer_receive.\n- The inventory tool has a quick one-step transfer (action=transfer) for simple moves. Use supply_chain transfers for formal tracked transfers with approval flow.\n- Media tools (voice, image_gen, video_gen) auto-download generated files to the current working directory. The result contains a local_file path — report that path to the user. NEVER construct, guess, or curl URLs yourself.\n- **Music generation workflow** (use this for ALL song requests):\n 1. For best vocal clarity, call music_plan first to get a structured composition_plan with proper sections, lyrics per line, and timing\n 2. Review/tweak the plan (edit lyrics, adjust section durations, add style cues)\n 3. Pass the composition_plan to music_compose to generate the final song\n 4. music_compose auto-injects vocal clarity styles (clear vocals, crisp pronunciation) and uses 192kbps quality\n - For quick/simple songs, music_compose with a prompt still works but may have less clear vocals\n - For complex songs with multiple sections, use music_compose_detailed — supports section-by-section control with with_timestamps for precise timing\n - Set force_instrumental:false (default) for vocals. NEVER use speak (TTS) for song vocals — TTS speaks, it doesn't sing\n - Only set force_instrumental:true when the user explicitly wants a karaoke/backing track\n - For clear lyrics: use [Verse], [Chorus], [Bridge] markers, include BPM and key (e.g. \"120 BPM, key of C major\")\n - For vocal style: add descriptors like \"clear female vocals\", \"male rapper\", \"a cappella chorus\"\n - Exclude bad qualities: composition_plan supports negative_global_styles like \"distorted vocals\", \"mumbled lyrics\"\n- **Batch TTS**: For generating multiple audio clips at once (up to 10), use voice tool with action=batch and items=[{text, voice_name?, voice_id?}, ...]. More efficient than sequential speak calls.\n- **Voice cloning** (two tiers):\n - **Instant (IVC)**: action=clone_voice — quick, ~70% accuracy. Good for casual use. Pass file_paths=[...], CLI reads files automatically.\n - **Professional (PVC)**: Near-perfect accuracy, multi-step workflow:\n 1. pvc_create(voice_name=\"Name\") — creates PVC voice slot\n 2. pvc_upload(voice_id=..., file_paths=[...]) — upload 30+ min audio for best results\n 3. pvc_separate_speakers(voice_id=..., sample_id=...) — if audio has multiple speakers\n 4. pvc_status(voice_id=..., sample_id=...) — check separation progress\n 5. pvc_select_speaker(voice_id=..., sample_id=..., speaker_ids=[...]) — pick the right speaker\n 6. pvc_verify(voice_id=...) — submit for manual verification (required by ElevenLabs)\n 7. pvc_train(voice_id=...) — start training (5-30 min). Check with pvc_status(voice_id=...).\n - Use IVC for quick tests, PVC for production-quality voice clones.\n - file_path (single) or file_paths (array) works for clone_voice, pvc_upload, pvc_verify, voice_design, speech_to_text, voice_changer, audio_isolation, stem_separation, forced_alignment — pass file paths directly, NEVER base64-encode via bash.\n - If given a directory of clips, use glob to find all MP3s, then pass all paths at once.\n- **Voice settings**: Cloned voices auto-use optimized settings (higher similarity, lower stability). Override with explicit stability/similarity_boost params if needed.\n- **Voice tool**: Accepts voice names (e.g. \"Daniel\", \"Sarah\") — no need to look up voice IDs. Use search_voices to find voices by style/accent/gender.`;\n }\n sections.push(toolSection);\n\n // ── Permission mode ──\n const permissionMode = getPermissionMode();\n if (permissionMode === \"plan\") {\n sections.push(`# Mode: Plan (read-only)\nYou are in plan mode. Only read and search tools are available. No file writes or commands.`);\n } else if (permissionMode === \"yolo\") {\n sections.push(`# Mode: Yolo\nAll tools available without confirmation prompts.`);\n }\n\n // ── Effort ──\n if (effort === \"low\") {\n sections.push(`# Effort: Low\nBe concise and direct. Minimize exploration. Give brief answers. Skip verification for trivial changes.`);\n } else if (effort === \"high\") {\n sections.push(`# Effort: High\nBe thorough and exhaustive. Explore deeply. Verify all changes. Consider edge cases.`);\n }\n\n // ── Tone and style ──\n sections.push(`# Tone and style\n- Be concise. Use tools to do work — don't just explain what you would do.\n- NEVER use emojis — terminal renders them as broken glyphs.\n- Include $ on monetary values, % on percentages.\n- When referencing code, include file_path:line_number for easy navigation.\n- Keep output clean and monospace-aligned.\n- Use markdown tables for multi-column data.\n- Use \\`\\`\\`chart code blocks for bar charts:\n\\`\\`\\`chart\nTitle\nLabel: $value\n\\`\\`\\``);\n\n // ── Persistent memory ──\n const memory = loadMemory();\n if (memory) {\n sections.push(`# Memory (persistent across sessions)\\n${memory}`);\n }\n\n // ── Project instructions ──\n const claudeMd = loadClaudeMd();\n if (claudeMd) {\n sections.push(`# Project Instructions (${claudeMd.path})\\n${claudeMd.content}`);\n }\n\n return sections.join(\"\\n\\n\");\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"system-prompt.js","names":["readdirSync","execFileSync","loadConfig","loadMemory","loadClaudeMd","gatherGitContext","getPermissionMode","buildSystemPrompt","hasServerTools","effort","sections","push","envLines","process","cwd","platform","Date","toISOString","split","storeConfig","store_name","store_id","gitContext","entries","withFileTypes","dirs","filter","e","isDirectory","name","startsWith","map","sort","fileNames","isFile","listing","slice","length","join","toolSection","storeCtx","localTools","imsgPath","encoding","timeout","trim","permissionMode","memory","claudeMd","path","content"],"sources":["../../../src/cli/services/system-prompt.ts"],"sourcesContent":["/**\n * System Prompt Builder — assembles the full system prompt for the agent loop\n *\n * Extracted from agent-loop.ts for single-responsibility.\n * All consumers should import from agent-loop.ts (re-export facade).\n */\n\nimport { readdirSync, existsSync } from \"fs\";\nimport { execFileSync } from \"child_process\";\nimport { loadConfig } from \"./config-store.js\";\nimport { loadMemory } from \"./memory-manager.js\";\nimport { loadClaudeMd } from \"./claude-md-loader.js\";\nimport { gatherGitContext } from \"./git-context.js\";\nimport { getPermissionMode } from \"./permission-modes.js\";\n\nexport async function buildSystemPrompt(hasServerTools: boolean, effort?: \"low\" | \"medium\" | \"high\"): Promise<string> {\n const sections: string[] = [];\n\n // ── Identity ──\n sections.push(`You are whale code, an interactive CLI agent for software engineering and business operations.\nYou help users with coding tasks, debugging, refactoring, and managing business data through tools.`);\n\n // ── Environment ──\n const envLines = [\n `Working directory: ${process.cwd()}`,\n `Platform: ${process.platform}`,\n `Date: ${new Date().toISOString().split(\"T\")[0]}`,\n ];\n // Store context — critical for server tools to operate on the right data\n const storeConfig = loadConfig();\n if (storeConfig.store_name || storeConfig.store_id) {\n envLines.push(`Active store: ${storeConfig.store_name || storeConfig.store_id}`);\n }\n const gitContext = await gatherGitContext();\n if (gitContext) envLines.push(`\\n${gitContext}`);\n // Directory listing — top-level files/folders for spatial awareness\n try {\n const entries = readdirSync(process.cwd(), { withFileTypes: true });\n const dirs = entries.filter(e => e.isDirectory() && !e.name.startsWith(\".\")).map(e => e.name + \"/\").sort();\n const fileNames = entries.filter(e => e.isFile()).map(e => e.name).sort();\n const listing = [...dirs, ...fileNames].slice(0, 30);\n if (listing.length > 0) {\n envLines.push(`\\nDirectory contents:\\n${listing.join(\"\\n\")}`);\n }\n } catch { /* cwd not readable */ }\n sections.push(`# Environment\\n${envLines.join(\"\\n\")}`);\n\n // ── Doing tasks ──\n sections.push(`# Doing tasks\n- The user will primarily request software engineering tasks: solving bugs, adding features, refactoring, explaining code, and more.\n- You are highly capable and can complete ambitious, multi-step tasks autonomously. Defer to user judgement about scope.\n- ALWAYS read relevant code before proposing changes. Do not modify files you haven't read. Understand existing patterns before editing.\n- Prefer editing existing files over creating new ones. Do not create files unless absolutely necessary.\n- Avoid over-engineering. Only make changes that are directly requested or clearly necessary. Keep solutions simple and focused.\n - Don't add features, refactor code, or make \"improvements\" beyond what was asked.\n - Don't add error handling or validation for scenarios that can't happen.\n - Don't create abstractions for one-time operations.\n- Be careful not to introduce security vulnerabilities (command injection, XSS, SQL injection, etc.). If you notice insecure code you wrote, fix it immediately.\n- If your approach is blocked, do not brute force. Consider alternative approaches or ask the user.`);\n\n // ── Coding workflow ──\n sections.push(`# Mandatory coding workflow\nWhen making code changes, ALWAYS follow this sequence:\n\n1. **Read** — Read the files you intend to modify. Understand the existing code, imports, types, and patterns.\n2. **Plan** — For non-trivial changes, briefly state what you'll change and why BEFORE editing. For multi-file changes, list the files and the change for each.\n3. **Edit** — Make targeted, minimal changes. Keep edit batches small (5 or fewer edits before verifying).\n4. **Verify** — After each batch of edits, run the build or tests (e.g. \\`npm run build\\`, \\`tsc --noEmit\\`, \\`pytest\\`). Read the output. Fix errors before making more edits.\n5. **Report** — Summarize what you changed and the verification results.\n\nCRITICAL RULES:\n- NEVER skip step 1. Do not edit files you haven't read in this session.\n- NEVER make more than 5-8 edits without running a verification step.\n- If a build or test fails, read the error output carefully before attempting a fix. Do not guess.\n- If the same fix approach fails twice, STOP. Re-read the relevant code and try a fundamentally different approach.\n- If you are stuck after 3 failed attempts, explain what you've tried and ask the user for guidance.`);\n\n // ── Actions with care ──\n sections.push(`# Executing actions with care\nConsider the reversibility and blast radius of your actions:\n- Freely take local, reversible actions like editing files or running tests.\n- For hard-to-reverse or shared-state actions (deleting files, force-pushing, modifying CI, sending messages), check with the user first.\n- Do not use destructive actions as shortcuts. Identify root causes rather than bypassing safety checks.\n- If you encounter unexpected state (unfamiliar files, branches, config), investigate before overwriting — it may be the user's in-progress work.`);\n\n // ── Tool use ──\n let toolSection = `# Using tools\n- Use the RIGHT tool for the job. Do NOT use run_command when a dedicated tool exists:\n - read_file to read files (not \\`cat\\` or \\`head\\`)\n - edit_file or multi_edit to edit files (not \\`sed\\` or \\`awk\\`)\n - write_file to create files (not \\`echo >\\` or heredocs)\n - glob to find files by pattern (not \\`find\\` or \\`ls\\`)\n - grep to search content (not \\`grep\\` or \\`rg\\` via run_command)\n - run_command ONLY for shell operations: build, test, git, install, etc.\n- Call multiple INDEPENDENT tools in a single response for parallel execution. Do not chain when results are independent.\n- Only chain across turns when a result is needed for the next call.\n- If a tool fails, read the error. If it fails 3 times, try a different tool or approach entirely.\n- All file paths in tool calls should be relative to the working directory when possible (e.g. \"src/foo.ts\" not \"/Users/name/project/src/foo.ts\").\n- When the user drops a file path, read it with read_file before responding.\n- For large files (>200 lines): split across multiple write_file calls. Write the first ~200 lines, then use edit_file to append the rest in chunks. NEVER try to write an entire large file in a single tool call — it will be truncated.\n\n## Subagents (task tool) — DELEGATE AGGRESSIVELY\n- Your input tokens are expensive. Delegate ALL multi-step research to subagents instead of using tools directly.\n- ALWAYS delegate: grep/glob searches, reading multiple files, codebase exploration, test runs, linting.\n- Only use tools directly when: (1) a single read_file answers the question, or (2) you need the result in THIS turn for a decision.\n- Launch multiple subagents in parallel for independent work — this is faster AND cheaper than serial tool calls.\n- Use task with run_in_background:true for long-running tasks; check with task_output, stop with task_stop.\n- Prefer \"explore\" type for quick codebase searches (2-4 turns). Prefer \"general-purpose\" for autonomous multi-step tasks.\n- Cost-aware model routing (delegate to cheapest model that can handle the task):\n - model:\"haiku\" — file searches, schema lookups, simple reads, pattern matching ($1/$5 per 1M tokens). DEFAULT for most delegation.\n - model:\"sonnet\" — code analysis, multi-step research, plan design, code writing ($3/$15 per 1M tokens)\n - model:\"opus\" — never delegate to opus subagents (you are opus, defeats the purpose)\n\n## Teams (team_create / team_auto)\n- Do NOT use teams for bug fixes or single-file changes — work directly. Teams are for large features with 3+ independent workstreams.\n- **team_auto**: Give it a single task string — it auto-decomposes into parallel sub-tasks and spawns them. Returns immediately with a task_id.\n- **team_create**: Explicit control over task breakdown, file assignments, and models. Returns immediately with a task_id.\n- Teams run in the background like any other background task. Use **task_output** to check progress, **task_stop** to kill the team or individual teammates (task_id=\"team-xxx/teammate-yyy\").\n- When creating teams, assign per-task models based on complexity. Most tasks should use haiku or sonnet.`;\n\n if (hasServerTools) {\n const storeCtx = storeConfig.store_name ? ` All operations are scoped to the active store: **${storeConfig.store_name}**.` : \"\";\n toolSection += `\n\n## Server tools (business operations)\n- Server tools (analytics, products, inventory, customers, orders, email, workflows, etc.) operate on the active store's data.${storeCtx}\n- These tools require UUIDs for mutations. ALWAYS look up IDs first: use find/list actions to resolve names to UUIDs before calling create/update/delete.\n- The store_id is automatically included in every server tool call — you do NOT need to pass it manually.\n- Use analytics for sales, revenue, and performance data. Use inventory for stock levels. Use products for the catalog.\n- Use audit_trail for store activity history (inventory changes, orders, transfers).\n- Use telemetry for AI system metrics (conversations, tool performance, errors).\n- **Inventory workflow**: (1) Find product with products tool (action=find), (2) Look up location with inventory tool (action=summary or by_location) to get location_id, (3) Use inventory tool with adjust/set and the resolved UUIDs. Always provide a reason for adjustments.\n- **Purchase Order workflow**: (1) Find supplier with supply_chain (action=find_suppliers), (2) Find products with products (action=find), (3) supply_chain action=po_create with supplier_id, location_id, items array, (4) supply_chain action=po_approve, (5) supply_chain action=po_receive to add inventory.\n- **Transfer workflow**: supply_chain action=transfer_create with from_location_id, to_location_id, items → supply_chain action=transfer_receive.\n- The inventory tool has a quick one-step transfer (action=transfer) for simple moves. Use supply_chain transfers for formal tracked transfers with approval flow.\n- Media tools (voice, image_gen, video_gen) auto-download generated files to the current working directory. The result contains a local_file path — report that path to the user. NEVER construct, guess, or curl URLs yourself.\n- **Music generation workflow** (use this for ALL song requests):\n 1. For best vocal clarity, call music_plan first to get a structured composition_plan with proper sections, lyrics per line, and timing\n 2. Review/tweak the plan (edit lyrics, adjust section durations, add style cues)\n 3. Pass the composition_plan to music_compose to generate the final song\n 4. music_compose auto-injects vocal clarity styles (clear vocals, crisp pronunciation) and uses 192kbps quality\n - For quick/simple songs, music_compose with a prompt still works but may have less clear vocals\n - For complex songs with multiple sections, use music_compose_detailed — supports section-by-section control with with_timestamps for precise timing\n - Set force_instrumental:false (default) for vocals. NEVER use speak (TTS) for song vocals — TTS speaks, it doesn't sing\n - Only set force_instrumental:true when the user explicitly wants a karaoke/backing track\n - For clear lyrics: use [Verse], [Chorus], [Bridge] markers, include BPM and key (e.g. \"120 BPM, key of C major\")\n - For vocal style: add descriptors like \"clear female vocals\", \"male rapper\", \"a cappella chorus\"\n - Exclude bad qualities: composition_plan supports negative_global_styles like \"distorted vocals\", \"mumbled lyrics\"\n- **Batch TTS**: For generating multiple audio clips at once (up to 10), use voice tool with action=batch and items=[{text, voice_name?, voice_id?}, ...]. More efficient than sequential speak calls.\n- **Voice cloning** (two tiers):\n - **Instant (IVC)**: action=clone_voice — quick, ~70% accuracy. Good for casual use. Pass file_paths=[...], CLI reads files automatically.\n - **Professional (PVC)**: Near-perfect accuracy, multi-step workflow:\n 1. pvc_create(voice_name=\"Name\") — creates PVC voice slot\n 2. pvc_upload(voice_id=..., file_paths=[...]) — upload 30+ min audio for best results\n 3. pvc_separate_speakers(voice_id=..., sample_id=...) — if audio has multiple speakers\n 4. pvc_status(voice_id=..., sample_id=...) — check separation progress\n 5. pvc_select_speaker(voice_id=..., sample_id=..., speaker_ids=[...]) — pick the right speaker\n 6. pvc_verify(voice_id=...) — submit for manual verification (required by ElevenLabs)\n 7. pvc_train(voice_id=...) — start training (5-30 min). Check with pvc_status(voice_id=...).\n - Use IVC for quick tests, PVC for production-quality voice clones.\n - file_path (single) or file_paths (array) works for clone_voice, pvc_upload, pvc_verify, voice_design, speech_to_text, voice_changer, audio_isolation, stem_separation, forced_alignment — pass file paths directly, NEVER base64-encode via bash.\n - If given a directory of clips, use glob to find all MP3s, then pass all paths at once.\n- **Voice settings**: Cloned voices auto-use optimized settings (higher similarity, lower stability). Override with explicit stability/similarity_boost params if needed.\n- **Voice tool**: Accepts voice names (e.g. \"Daniel\", \"Sarah\") — no need to look up voice IDs. Use search_voices to find voices by style/accent/gender.`;\n }\n sections.push(toolSection);\n\n // ── Local CLI utilities (auto-detected) ──\n if (process.platform === \"darwin\") {\n const localTools: string[] = [];\n try {\n const imsgPath = execFileSync(\"which\", [\"imsg\"], { encoding: \"utf-8\", timeout: 2000 }).trim();\n if (imsgPath) {\n localTools.push(`- **iMessage**: Use \\`imsg send --to <email_or_phone> --text \"<message>\"\\` to send iMessages. Do NOT use osascript or AppleScript — it lacks automation permissions. The \\`imsg\\` binary handles Messages.app integration natively.\n - Query chats: \\`imsg chats --limit 20 --json\\`\n - List messages: \\`imsg list --limit 20 --json\\`\n - Send to address: \\`imsg send --to \"+14155551234\" --text \"Hello\"\\`\n - Send to chat: \\`imsg send --chat-id 42 --text \"Hello\"\\``);\n }\n } catch { /* imsg not installed */ }\n if (localTools.length > 0) {\n sections.push(`# Local CLI utilities (macOS)\\n${localTools.join(\"\\n\")}`);\n }\n }\n\n // ── Permission mode ──\n const permissionMode = getPermissionMode();\n if (permissionMode === \"plan\") {\n sections.push(`# Mode: Plan (read-only)\nYou are in plan mode. Only read and search tools are available. No file writes or commands.`);\n } else if (permissionMode === \"yolo\") {\n sections.push(`# Mode: Yolo\nAll tools available without confirmation prompts.`);\n }\n\n // ── Effort ──\n if (effort === \"low\") {\n sections.push(`# Effort: Low\nBe concise and direct. Minimize exploration. Give brief answers. Skip verification for trivial changes.`);\n } else if (effort === \"high\") {\n sections.push(`# Effort: High\nBe thorough and exhaustive. Explore deeply. Verify all changes. Consider edge cases.`);\n }\n\n // ── Tone and style ──\n sections.push(`# Tone and style\n- Be concise. Use tools to do work — don't just explain what you would do.\n- NEVER use emojis — terminal renders them as broken glyphs.\n- Include $ on monetary values, % on percentages.\n- When referencing code, include file_path:line_number for easy navigation.\n- Keep output clean and monospace-aligned.\n- Use markdown tables for multi-column data.\n- Use \\`\\`\\`chart code blocks for bar charts:\n\\`\\`\\`chart\nTitle\nLabel: $value\n\\`\\`\\``);\n\n // ── Persistent memory ──\n const memory = loadMemory();\n if (memory) {\n sections.push(`# Memory (persistent across sessions)\\n${memory}`);\n }\n\n // ── Project instructions ──\n const claudeMd = loadClaudeMd();\n if (claudeMd) {\n sections.push(`# Project Instructions (${claudeMd.path})\\n${claudeMd.content}`);\n }\n\n return sections.join(\"\\n\\n\");\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Team Lead Auto — Auto-decompose tasks + review results
|
|
3
|
+
*
|
|
4
|
+
* Uses Claude (haiku) to break tasks into parallel sub-tasks with file ownership,
|
|
5
|
+
* then spawns a team to execute them. Optionally runs a lightweight review pass.
|
|
6
|
+
*/
|
|
7
|
+
import type { TeamResult, AutoTeamOptions } from "./team-lead-types.js";
|
|
8
|
+
export declare function runAutoTeam(task: string, opts?: AutoTeamOptions): Promise<TeamResult & {
|
|
9
|
+
review?: string;
|
|
10
|
+
warnings?: string[];
|
|
11
|
+
}>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Team Lead Execution — runTeam, message handling, failure handling, completion
|
|
3
|
+
* Extracted from team-lead.ts for file size limits.
|
|
4
|
+
*/
|
|
5
|
+
import type { ChildProcess } from "child_process";
|
|
6
|
+
import { TeammateMessage } from "./teammate.js";
|
|
7
|
+
import type { TeamResult } from "./team-lead-types.js";
|
|
8
|
+
interface TeamLeadInternals {
|
|
9
|
+
teamId: string | null;
|
|
10
|
+
workers: Map<string, ChildProcess>;
|
|
11
|
+
lastMessageTime: Map<string, number>;
|
|
12
|
+
teamTimer: ReturnType<typeof setTimeout> | null;
|
|
13
|
+
stallInterval: ReturnType<typeof setInterval> | null;
|
|
14
|
+
resolveTeam: ((result: TeamResult) => void) | null;
|
|
15
|
+
traceId: string;
|
|
16
|
+
spanId: string;
|
|
17
|
+
startTime: number;
|
|
18
|
+
buildResult(): TeamResult;
|
|
19
|
+
}
|
|
20
|
+
export declare function handleTeammateMessage(lead: TeamLeadInternals & {
|
|
21
|
+
emit: (event: string, data: any) => boolean;
|
|
22
|
+
}, msg: TeammateMessage): void;
|
|
23
|
+
export declare function handleTeammateFailure(teamId: string | null, teammateId: string, errorMessage: string, emit: (event: string, data: any) => boolean): Promise<void>;
|
|
24
|
+
export declare function checkCompletion(lead: TeamLeadInternals & {
|
|
25
|
+
emit: (event: string, data: any) => boolean;
|
|
26
|
+
}): void;
|
|
27
|
+
export declare function buildResult(teamId: string | null, traceId: string, spanId: string, startTime: number): TeamResult;
|
|
28
|
+
export {};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Team Lead Types — Shared types and interfaces for team coordination
|
|
3
|
+
*/
|
|
4
|
+
export interface TeamConfig {
|
|
5
|
+
name: string;
|
|
6
|
+
teammateCount: number;
|
|
7
|
+
model?: "sonnet" | "opus" | "haiku";
|
|
8
|
+
tasks: Array<{
|
|
9
|
+
description: string;
|
|
10
|
+
model?: string;
|
|
11
|
+
files?: string[];
|
|
12
|
+
dependencies?: string[];
|
|
13
|
+
}>;
|
|
14
|
+
teammateNames?: string[];
|
|
15
|
+
}
|
|
16
|
+
export interface TeamResult {
|
|
17
|
+
success: boolean;
|
|
18
|
+
teamId: string;
|
|
19
|
+
summary: string;
|
|
20
|
+
taskResults: Array<{
|
|
21
|
+
description: string;
|
|
22
|
+
result: string;
|
|
23
|
+
status: "completed" | "failed";
|
|
24
|
+
}>;
|
|
25
|
+
tokensUsed: {
|
|
26
|
+
input: number;
|
|
27
|
+
output: number;
|
|
28
|
+
};
|
|
29
|
+
durationMs: number;
|
|
30
|
+
}
|
|
31
|
+
export interface AutoTeamOptions {
|
|
32
|
+
maxTeammates?: number;
|
|
33
|
+
model?: "sonnet" | "opus" | "haiku";
|
|
34
|
+
workingDirectory?: string;
|
|
35
|
+
review?: boolean;
|
|
36
|
+
signal?: AbortSignal;
|
|
37
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-lead-types.js","names":[],"sources":["../../../src/cli/services/team-lead-types.ts"],"sourcesContent":["/**\n * Team Lead Types — Shared types and interfaces for team coordination\n */\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface TeamConfig {\n name: string;\n teammateCount: number;\n model?: \"sonnet\" | \"opus\" | \"haiku\";\n tasks: Array<{\n description: string;\n model?: string;\n files?: string[];\n dependencies?: string[];\n }>;\n teammateNames?: string[];\n}\n\nexport interface TeamResult {\n success: boolean;\n teamId: string;\n summary: string;\n taskResults: Array<{\n description: string;\n result: string;\n status: \"completed\" | \"failed\";\n }>;\n tokensUsed: { input: number; output: number };\n durationMs: number;\n}\n\nexport interface AutoTeamOptions {\n maxTeammates?: number;\n model?: \"sonnet\" | \"opus\" | \"haiku\";\n workingDirectory?: string;\n review?: boolean;\n signal?: AbortSignal;\n}\n"],"mappings":"","ignoreList":[]}
|
|
@@ -35,10 +35,53 @@ export interface TeamResult {
|
|
|
35
35
|
};
|
|
36
36
|
durationMs: number;
|
|
37
37
|
}
|
|
38
|
+
export declare function getRunningTeam(teamId: string): TeamLead | undefined;
|
|
39
|
+
export interface TeammateStatus {
|
|
40
|
+
id: string;
|
|
41
|
+
name: string;
|
|
42
|
+
model: string;
|
|
43
|
+
status: "idle" | "working" | "waiting" | "done";
|
|
44
|
+
currentTask?: string;
|
|
45
|
+
currentTaskDescription?: string;
|
|
46
|
+
tokensUsed: {
|
|
47
|
+
input: number;
|
|
48
|
+
output: number;
|
|
49
|
+
};
|
|
50
|
+
alive: boolean;
|
|
51
|
+
}
|
|
52
|
+
export interface TeamSnapshot {
|
|
53
|
+
teamId: string;
|
|
54
|
+
teamName: string;
|
|
55
|
+
status: "active" | "completed" | "failed";
|
|
56
|
+
elapsedMs: number;
|
|
57
|
+
progress: {
|
|
58
|
+
total: number;
|
|
59
|
+
completed: number;
|
|
60
|
+
inProgress: number;
|
|
61
|
+
pending: number;
|
|
62
|
+
blocked: number;
|
|
63
|
+
percentComplete: number;
|
|
64
|
+
};
|
|
65
|
+
teammates: TeammateStatus[];
|
|
66
|
+
tasks: Array<{
|
|
67
|
+
id: string;
|
|
68
|
+
description: string;
|
|
69
|
+
status: string;
|
|
70
|
+
assignedTo?: string;
|
|
71
|
+
result?: string;
|
|
72
|
+
error?: string;
|
|
73
|
+
}>;
|
|
74
|
+
tokensUsed: {
|
|
75
|
+
input: number;
|
|
76
|
+
output: number;
|
|
77
|
+
};
|
|
78
|
+
}
|
|
38
79
|
export declare class TeamLead extends EventEmitter {
|
|
39
80
|
private teamId;
|
|
40
81
|
private workers;
|
|
41
82
|
private lastMessageTime;
|
|
83
|
+
/** Tracks whether each worker has sent at least one IPC message. */
|
|
84
|
+
private workerInitialized;
|
|
42
85
|
private teamTimer;
|
|
43
86
|
private stallInterval;
|
|
44
87
|
private resolveTeam;
|
|
@@ -68,8 +111,25 @@ export declare class TeamLead extends EventEmitter {
|
|
|
68
111
|
completed: number;
|
|
69
112
|
percentComplete: number;
|
|
70
113
|
} | null;
|
|
114
|
+
/** Get a detailed snapshot of team state for task_output. */
|
|
115
|
+
getSnapshot(): TeamSnapshot | null;
|
|
116
|
+
/** Kill a specific teammate by ID. Returns true if found and killed. */
|
|
117
|
+
stopTeammate(teammateId: string): boolean;
|
|
71
118
|
stop(): void;
|
|
72
119
|
}
|
|
120
|
+
/**
|
|
121
|
+
* Start an agent team in the background. Returns the team ID immediately.
|
|
122
|
+
* The team runs asynchronously — use getRunningTeam(teamId) to check status.
|
|
123
|
+
* The TeamResult promise resolves when all teammates finish.
|
|
124
|
+
*/
|
|
125
|
+
export declare function startAgentTeam(config: TeamConfig, signal?: AbortSignal): Promise<{
|
|
126
|
+
teamId: string;
|
|
127
|
+
resultPromise: Promise<TeamResult>;
|
|
128
|
+
}>;
|
|
129
|
+
/**
|
|
130
|
+
* Legacy blocking API — runs team and waits for completion.
|
|
131
|
+
* Kept for backward compatibility (team-lead-auto.ts review pass).
|
|
132
|
+
*/
|
|
73
133
|
export declare function runAgentTeam(config: TeamConfig, signal?: AbortSignal): Promise<TeamResult>;
|
|
74
134
|
export interface AutoTeamOptions {
|
|
75
135
|
maxTeammates?: number;
|