whale-code 6.5.5 → 6.5.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -31
- package/bin/{swagmanager-mcp.js → whale-code.js} +17 -2
- package/dist/cli/app.js +148 -72
- package/dist/cli/app.js.map +1 -0
- package/dist/cli/chat/AgentSelector.js +105 -10
- package/dist/cli/chat/AgentSelector.js.map +1 -0
- package/dist/cli/chat/ChatApp.d.ts +31 -0
- package/dist/cli/chat/ChatApp.js +539 -286
- package/dist/cli/chat/ChatApp.js.map +1 -0
- package/dist/cli/chat/ChatInput.js +1088 -770
- package/dist/cli/chat/ChatInput.js.map +1 -0
- package/dist/cli/chat/MarkdownText.js +39 -14
- package/dist/cli/chat/MarkdownText.js.map +1 -0
- package/dist/cli/chat/MemoryManager.js +181 -46
- package/dist/cli/chat/MemoryManager.js.map +1 -0
- package/dist/cli/chat/MessageList.d.ts +2 -3
- package/dist/cli/chat/MessageList.js +186 -45
- package/dist/cli/chat/MessageList.js.map +1 -0
- package/dist/cli/chat/ModelSelector.js +282 -63
- package/dist/cli/chat/ModelSelector.js.map +1 -0
- package/dist/cli/chat/NodeManager.js +165 -75
- package/dist/cli/chat/NodeManager.js.map +1 -0
- package/dist/cli/chat/NodeSelector.js +171 -30
- package/dist/cli/chat/NodeSelector.js.map +1 -0
- package/dist/cli/chat/PlanApproval.js +281 -57
- package/dist/cli/chat/PlanApproval.js.map +1 -0
- package/dist/cli/chat/RewindViewer.js +559 -144
- package/dist/cli/chat/RewindViewer.js.map +1 -0
- package/dist/cli/chat/SessionManager.js +137 -30
- package/dist/cli/chat/SessionManager.js.map +1 -0
- package/dist/cli/chat/SlashMenu.js +293 -164
- package/dist/cli/chat/SlashMenu.js.map +1 -0
- package/dist/cli/chat/StatusBar.js +172 -9
- package/dist/cli/chat/StatusBar.js.map +1 -0
- package/dist/cli/chat/StoreSelector.js +147 -18
- package/dist/cli/chat/StoreSelector.js.map +1 -0
- package/dist/cli/chat/StreamingText.d.ts +1 -5
- package/dist/cli/chat/StreamingText.js +22 -7
- package/dist/cli/chat/StreamingText.js.map +1 -0
- package/dist/cli/chat/SubagentPanel.d.ts +1 -2
- package/dist/cli/chat/SubagentPanel.js +612 -72
- package/dist/cli/chat/SubagentPanel.js.map +1 -0
- package/dist/cli/chat/TeamPanel.d.ts +1 -0
- package/dist/cli/chat/TeamPanel.js +230 -30
- package/dist/cli/chat/TeamPanel.js.map +1 -0
- package/dist/cli/chat/ThemeSelector.js +84 -24
- package/dist/cli/chat/ThemeSelector.js.map +1 -0
- package/dist/cli/chat/ToolIndicator.js +1476 -371
- package/dist/cli/chat/ToolIndicator.js.map +1 -0
- package/dist/cli/chat/hooks/useAgentLoop.d.ts +1 -0
- package/dist/cli/chat/hooks/useAgentLoop.js +481 -367
- package/dist/cli/chat/hooks/useAgentLoop.js.map +1 -0
- package/dist/cli/chat/hooks/useSlashCommands.d.ts +3 -14
- package/dist/cli/chat/hooks/useSlashCommands.js +744 -572
- package/dist/cli/chat/hooks/useSlashCommands.js.map +1 -0
- package/dist/cli/commands/config-cmd.js +56 -57
- package/dist/cli/commands/config-cmd.js.map +1 -0
- package/dist/cli/commands/db.js +184 -169
- package/dist/cli/commands/db.js.map +1 -0
- package/dist/cli/commands/doctor.js +212 -122
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/init.js +211 -244
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/mcp.js +127 -122
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/login/LoginApp.js +355 -141
- package/dist/cli/login/LoginApp.js.map +1 -0
- package/dist/cli/print-mode.js +196 -177
- package/dist/cli/print-mode.js.map +1 -0
- package/dist/cli/serve-mode.js +615 -530
- package/dist/cli/serve-mode.js.map +1 -0
- package/dist/cli/services/agent-config.d.ts +5 -1
- package/dist/cli/services/agent-config.js +66 -36
- package/dist/cli/services/agent-config.js.map +1 -0
- package/dist/cli/services/agent-definitions.d.ts +4 -1
- package/dist/cli/services/agent-definitions.js +97 -56
- package/dist/cli/services/agent-definitions.js.map +1 -0
- package/dist/cli/services/agent-events.js +225 -162
- package/dist/cli/services/agent-events.js.map +1 -0
- package/dist/cli/services/agent-loop.js +976 -688
- package/dist/cli/services/agent-loop.js.map +1 -0
- package/dist/cli/services/agent-worker-base.d.ts +35 -5
- package/dist/cli/services/agent-worker-base.js +337 -153
- package/dist/cli/services/agent-worker-base.js.map +1 -0
- package/dist/cli/services/api-retry.js +69 -64
- package/dist/cli/services/api-retry.js.map +1 -0
- package/dist/cli/services/auth-service.d.ts +3 -3
- package/dist/cli/services/auth-service.js +209 -132
- package/dist/cli/services/auth-service.js.map +1 -0
- package/dist/cli/services/background-processes.js +343 -267
- package/dist/cli/services/background-processes.js.map +1 -0
- package/dist/cli/services/browser-auth.d.ts +2 -2
- package/dist/cli/services/browser-auth.js +159 -118
- package/dist/cli/services/browser-auth.js.map +1 -0
- package/dist/cli/services/claude-md-loader.js +40 -36
- package/dist/cli/services/claude-md-loader.js.map +1 -0
- package/dist/cli/services/config-store.d.ts +9 -4
- package/dist/cli/services/config-store.js +164 -117
- package/dist/cli/services/config-store.js.map +1 -0
- package/dist/cli/services/debug-log.d.ts +1 -1
- package/dist/cli/services/debug-log.js +34 -35
- package/dist/cli/services/debug-log.js.map +1 -0
- package/dist/cli/services/env-detect.d.ts +7 -0
- package/dist/cli/services/env-detect.js +9 -0
- package/dist/cli/services/env-detect.js.map +1 -0
- package/dist/cli/services/error-logger.js +187 -169
- package/dist/cli/services/error-logger.js.map +1 -0
- package/dist/cli/services/file-history.d.ts +1 -1
- package/dist/cli/services/file-history.js +50 -54
- package/dist/cli/services/file-history.js.map +1 -0
- package/dist/cli/services/format-server-response.js +332 -372
- package/dist/cli/services/format-server-response.js.map +1 -0
- package/dist/cli/services/git-context.js +61 -45
- package/dist/cli/services/git-context.js.map +1 -0
- package/dist/cli/services/hooks.d.ts +2 -2
- package/dist/cli/services/hooks.js +195 -180
- package/dist/cli/services/hooks.js.map +1 -0
- package/dist/cli/services/ink-incremental.d.ts +19 -0
- package/dist/cli/services/ink-incremental.js +59 -0
- package/dist/cli/services/ink-incremental.js.map +1 -0
- package/dist/cli/services/ink-resize-fix.js +54 -44
- package/dist/cli/services/ink-resize-fix.js.map +1 -0
- package/dist/cli/services/ink-sync-output.d.ts +12 -0
- package/dist/cli/services/ink-sync-output.js +16 -0
- package/dist/cli/services/ink-sync-output.js.map +1 -0
- package/dist/cli/services/interactive-tools.js +268 -212
- package/dist/cli/services/interactive-tools.js.map +1 -0
- package/dist/cli/services/keybinding-manager.d.ts +11 -1
- package/dist/cli/services/keybinding-manager.js +126 -63
- package/dist/cli/services/keybinding-manager.js.map +1 -0
- package/dist/cli/services/local-tools.d.ts +1 -1
- package/dist/cli/services/local-tools.js +939 -656
- package/dist/cli/services/local-tools.js.map +1 -0
- package/dist/cli/services/lsp-manager.js +757 -594
- package/dist/cli/services/lsp-manager.js.map +1 -0
- package/dist/cli/services/mcp-client.d.ts +1 -1
- package/dist/cli/services/mcp-client.js +173 -134
- package/dist/cli/services/mcp-client.js.map +1 -0
- package/dist/cli/services/memory-manager.js +53 -40
- package/dist/cli/services/memory-manager.js.map +1 -0
- package/dist/cli/services/model-manager.js +55 -40
- package/dist/cli/services/model-manager.js.map +1 -0
- package/dist/cli/services/model-router.js +115 -85
- package/dist/cli/services/model-router.js.map +1 -0
- package/dist/cli/services/paths.d.ts +30 -0
- package/dist/cli/services/paths.js +81 -0
- package/dist/cli/services/paths.js.map +1 -0
- package/dist/cli/services/permission-modes.js +32 -25
- package/dist/cli/services/permission-modes.js.map +1 -0
- package/dist/cli/services/rewind.js +182 -168
- package/dist/cli/services/rewind.js.map +1 -0
- package/dist/cli/services/ripgrep.js +115 -115
- package/dist/cli/services/ripgrep.js.map +1 -0
- package/dist/cli/services/sandbox.d.ts +1 -1
- package/dist/cli/services/sandbox.js +58 -37
- package/dist/cli/services/sandbox.js.map +1 -0
- package/dist/cli/services/server-tools.js +738 -565
- package/dist/cli/services/server-tools.js.map +1 -0
- package/dist/cli/services/session-persistence.js +69 -74
- package/dist/cli/services/session-persistence.js.map +1 -0
- package/dist/cli/services/subagent-worker.js +42 -27
- package/dist/cli/services/subagent-worker.js.map +1 -0
- package/dist/cli/services/subagent.d.ts +2 -0
- package/dist/cli/services/subagent.js +605 -433
- package/dist/cli/services/subagent.js.map +1 -0
- package/dist/cli/services/system-prompt.js +86 -78
- package/dist/cli/services/system-prompt.js.map +1 -0
- package/dist/cli/services/task-decomposer.d.ts +1 -1
- package/dist/cli/services/task-decomposer.js +172 -139
- package/dist/cli/services/task-decomposer.js.map +1 -0
- package/dist/cli/services/team-lead.d.ts +2 -2
- package/dist/cli/services/team-lead.js +727 -529
- package/dist/cli/services/team-lead.js.map +1 -0
- package/dist/cli/services/team-state.js +319 -319
- package/dist/cli/services/team-state.js.map +1 -0
- package/dist/cli/services/teammate.d.ts +8 -2
- package/dist/cli/services/teammate.js +857 -569
- package/dist/cli/services/teammate.js.map +1 -0
- package/dist/cli/services/telemetry.d.ts +6 -1
- package/dist/cli/services/telemetry.js +180 -157
- package/dist/cli/services/telemetry.js.map +1 -0
- package/dist/cli/services/tools/agent-tools.d.ts +3 -3
- package/dist/cli/services/tools/agent-tools.js +480 -322
- package/dist/cli/services/tools/agent-tools.js.map +1 -0
- package/dist/cli/services/tools/file-ops.js +563 -450
- package/dist/cli/services/tools/file-ops.js.map +1 -0
- package/dist/cli/services/tools/search-tools.js +231 -162
- package/dist/cli/services/tools/search-tools.js.map +1 -0
- package/dist/cli/services/tools/shell-exec.js +197 -151
- package/dist/cli/services/tools/shell-exec.js.map +1 -0
- package/dist/cli/services/tools/task-manager.js +206 -173
- package/dist/cli/services/tools/task-manager.js.map +1 -0
- package/dist/cli/services/tools/web-tools.js +388 -341
- package/dist/cli/services/tools/web-tools.js.map +1 -0
- package/dist/cli/setup/SetupApp.d.ts +2 -2
- package/dist/cli/setup/SetupApp.js +608 -160
- package/dist/cli/setup/SetupApp.js.map +1 -0
- package/dist/cli/shared/ErrorBoundary.d.ts +22 -0
- package/dist/cli/shared/ErrorBoundary.js +73 -0
- package/dist/cli/shared/ErrorBoundary.js.map +1 -0
- package/dist/cli/shared/MatrixIntro.js +66 -69
- package/dist/cli/shared/MatrixIntro.js.map +1 -0
- package/dist/cli/shared/SpinnerSlot.d.ts +14 -0
- package/dist/cli/shared/SpinnerSlot.js +63 -0
- package/dist/cli/shared/SpinnerSlot.js.map +1 -0
- package/dist/cli/shared/Theme.d.ts +1 -1
- package/dist/cli/shared/Theme.js +136 -92
- package/dist/cli/shared/Theme.js.map +1 -0
- package/dist/cli/shared/WhaleBanner.js +99 -11
- package/dist/cli/shared/WhaleBanner.js.map +1 -0
- package/dist/cli/shared/markdown.d.ts +3 -1
- package/dist/cli/shared/markdown.js +736 -674
- package/dist/cli/shared/markdown.js.map +1 -0
- package/dist/cli/shared/marked-terminal.d.js +2 -0
- package/dist/cli/shared/marked-terminal.d.js.map +1 -0
- package/dist/cli/shared/theme-manager.js +99 -90
- package/dist/cli/shared/theme-manager.js.map +1 -0
- package/dist/cli/shared/theme-presets.js +256 -254
- package/dist/cli/shared/theme-presets.js.map +1 -0
- package/dist/cli/status/StatusApp.js +235 -86
- package/dist/cli/status/StatusApp.js.map +1 -0
- package/dist/cli/stores/StoreApp.js +275 -65
- package/dist/cli/stores/StoreApp.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +509 -396
- package/dist/index.js.map +1 -0
- package/dist/local-agent/connection.d.ts +2 -2
- package/dist/local-agent/connection.js +352 -293
- package/dist/local-agent/connection.js.map +1 -0
- package/dist/local-agent/discovery.js +259 -122
- package/dist/local-agent/discovery.js.map +1 -0
- package/dist/local-agent/executor.js +216 -193
- package/dist/local-agent/executor.js.map +1 -0
- package/dist/local-agent/index.d.ts +2 -2
- package/dist/local-agent/index.js +156 -156
- package/dist/local-agent/index.js.map +1 -0
- package/dist/node/adapters/base.js +18 -8
- package/dist/node/adapters/base.js.map +1 -0
- package/dist/node/adapters/discord.js +286 -275
- package/dist/node/adapters/discord.js.map +1 -0
- package/dist/node/adapters/email.js +189 -202
- package/dist/node/adapters/email.js.map +1 -0
- package/dist/node/adapters/imessage.js +145 -142
- package/dist/node/adapters/imessage.js.map +1 -0
- package/dist/node/adapters/slack.js +237 -236
- package/dist/node/adapters/slack.js.map +1 -0
- package/dist/node/adapters/sms.js +149 -151
- package/dist/node/adapters/sms.js.map +1 -0
- package/dist/node/adapters/telegram.js +88 -92
- package/dist/node/adapters/telegram.js.map +1 -0
- package/dist/node/adapters/webchat.js +160 -136
- package/dist/node/adapters/webchat.js.map +1 -0
- package/dist/node/adapters/whatsapp.js +212 -215
- package/dist/node/adapters/whatsapp.js.map +1 -0
- package/dist/node/cli.js +884 -653
- package/dist/node/cli.js.map +1 -0
- package/dist/node/config.js +20 -18
- package/dist/node/config.js.map +1 -0
- package/dist/node/gateway-client.js +191 -181
- package/dist/node/gateway-client.js.map +1 -0
- package/dist/node/portal/clipboard.js +161 -130
- package/dist/node/portal/clipboard.js.map +1 -0
- package/dist/node/portal/discovery.js +51 -45
- package/dist/node/portal/discovery.js.map +1 -0
- package/dist/node/portal/forward.js +64 -58
- package/dist/node/portal/forward.js.map +1 -0
- package/dist/node/portal/index.js +246 -221
- package/dist/node/portal/index.js.map +1 -0
- package/dist/node/portal/multiplexer.js +192 -182
- package/dist/node/portal/multiplexer.js.map +1 -0
- package/dist/node/portal/permissions.js +102 -70
- package/dist/node/portal/permissions.js.map +1 -0
- package/dist/node/portal/protocol.js +153 -116
- package/dist/node/portal/protocol.js.map +1 -0
- package/dist/node/portal/screen.js +80 -69
- package/dist/node/portal/screen.js.map +1 -0
- package/dist/node/portal/session.js +124 -117
- package/dist/node/portal/session.js.map +1 -0
- package/dist/node/portal/shell.js +140 -113
- package/dist/node/portal/shell.js.map +1 -0
- package/dist/node/portal/stream.js +77 -75
- package/dist/node/portal/stream.js.map +1 -0
- package/dist/node/portal/transfer.js +190 -167
- package/dist/node/portal/transfer.js.map +1 -0
- package/dist/node/portal/ui.js +124 -99
- package/dist/node/portal/ui.js.map +1 -0
- package/dist/node/remote-desktop/compile-helper.js +50 -45
- package/dist/node/remote-desktop/compile-helper.js.map +1 -0
- package/dist/node/remote-desktop/index.js +215 -187
- package/dist/node/remote-desktop/index.js.map +1 -0
- package/dist/node/remote-desktop/protocol.js +45 -29
- package/dist/node/remote-desktop/protocol.js.map +1 -0
- package/dist/node/runtime.js +493 -410
- package/dist/node/runtime.js.map +1 -0
- package/dist/server/handlers/__test-utils__/test-db.js +39 -89
- package/dist/server/handlers/__test-utils__/test-db.js.map +1 -0
- package/dist/server/handlers/analytics.js +467 -261
- package/dist/server/handlers/analytics.js.map +1 -0
- package/dist/server/handlers/api-docs.js +1030 -895
- package/dist/server/handlers/api-docs.js.map +1 -0
- package/dist/server/handlers/api-keys.js +291 -242
- package/dist/server/handlers/api-keys.js.map +1 -0
- package/dist/server/handlers/billing.js +330 -239
- package/dist/server/handlers/billing.js.map +1 -0
- package/dist/server/handlers/browser.js +468 -395
- package/dist/server/handlers/browser.js.map +1 -0
- package/dist/server/handlers/catalog.js +1377 -978
- package/dist/server/handlers/catalog.js.map +1 -0
- package/dist/server/handlers/clickhouse.js +157 -109
- package/dist/server/handlers/clickhouse.js.map +1 -0
- package/dist/server/handlers/comms.js +1439 -984
- package/dist/server/handlers/comms.js.map +1 -0
- package/dist/server/handlers/creations.js +461 -394
- package/dist/server/handlers/creations.js.map +1 -0
- package/dist/server/handlers/crm.js +1082 -791
- package/dist/server/handlers/crm.js.map +1 -0
- package/dist/server/handlers/discovery.js +251 -232
- package/dist/server/handlers/discovery.js.map +1 -0
- package/dist/server/handlers/embeddings.js +241 -164
- package/dist/server/handlers/embeddings.js.map +1 -0
- package/dist/server/handlers/enrichment.js +887 -718
- package/dist/server/handlers/enrichment.js.map +1 -0
- package/dist/server/handlers/image-gen.js +467 -376
- package/dist/server/handlers/image-gen.js.map +1 -0
- package/dist/server/handlers/inventory.js +797 -424
- package/dist/server/handlers/inventory.js.map +1 -0
- package/dist/server/handlers/kali.js +272 -230
- package/dist/server/handlers/kali.js.map +1 -0
- package/dist/server/handlers/llm-providers.js +803 -580
- package/dist/server/handlers/llm-providers.js.map +1 -0
- package/dist/server/handlers/local-agent.js +133 -105
- package/dist/server/handlers/local-agent.js.map +1 -0
- package/dist/server/handlers/media.js +1179 -857
- package/dist/server/handlers/media.js.map +1 -0
- package/dist/server/handlers/meta-ads.js +2669 -2093
- package/dist/server/handlers/meta-ads.js.map +1 -0
- package/dist/server/handlers/nodes.js +1321 -913
- package/dist/server/handlers/nodes.js.map +1 -0
- package/dist/server/handlers/operations.js +183 -157
- package/dist/server/handlers/operations.js.map +1 -0
- package/dist/server/handlers/platform.js +346 -210
- package/dist/server/handlers/platform.js.map +1 -0
- package/dist/server/handlers/remove-bg.js +118 -86
- package/dist/server/handlers/remove-bg.js.map +1 -0
- package/dist/server/handlers/storefront.js +586 -446
- package/dist/server/handlers/storefront.js.map +1 -0
- package/dist/server/handlers/supply-chain.js +546 -326
- package/dist/server/handlers/supply-chain.js.map +1 -0
- package/dist/server/handlers/transcription.js +106 -97
- package/dist/server/handlers/transcription.js.map +1 -0
- package/dist/server/handlers/video-gen.js +593 -424
- package/dist/server/handlers/video-gen.js.map +1 -0
- package/dist/server/handlers/voice.js +1458 -1039
- package/dist/server/handlers/voice.js.map +1 -0
- package/dist/server/handlers/workflow-steps.js +2837 -2116
- package/dist/server/handlers/workflow-steps.js.map +1 -0
- package/dist/server/handlers/workflows.js +1630 -933
- package/dist/server/handlers/workflows.js.map +1 -0
- package/dist/server/index.js +3167 -2422
- package/dist/server/index.js.map +1 -0
- package/dist/server/lib/batch-client.js +471 -409
- package/dist/server/lib/batch-client.js.map +1 -0
- package/dist/server/lib/clickhouse-buffer.js +118 -104
- package/dist/server/lib/clickhouse-buffer.js.map +1 -0
- package/dist/server/lib/clickhouse-client.js +107 -107
- package/dist/server/lib/clickhouse-client.js.map +1 -0
- package/dist/server/lib/coa-renderer.js +1786 -356
- package/dist/server/lib/coa-renderer.js.map +1 -0
- package/dist/server/lib/code-worker-pool.js +227 -177
- package/dist/server/lib/code-worker-pool.js.map +1 -0
- package/dist/server/lib/code-worker.js +174 -164
- package/dist/server/lib/code-worker.js.map +1 -0
- package/dist/server/lib/compaction-service.d.ts +2 -12
- package/dist/server/lib/compaction-service.js +74 -184
- package/dist/server/lib/compaction-service.js.map +1 -0
- package/dist/server/lib/logger.js +36 -24
- package/dist/server/lib/logger.js.map +1 -0
- package/dist/server/lib/otel.js +101 -80
- package/dist/server/lib/otel.js.map +1 -0
- package/dist/server/lib/pdf-renderer.js +952 -788
- package/dist/server/lib/pdf-renderer.js.map +1 -0
- package/dist/server/lib/prompt-sanitizer.js +188 -108
- package/dist/server/lib/prompt-sanitizer.js.map +1 -0
- package/dist/server/lib/provider-capabilities.js +136 -138
- package/dist/server/lib/provider-capabilities.js.map +1 -0
- package/dist/server/lib/provider-failover.js +190 -168
- package/dist/server/lib/provider-failover.js.map +1 -0
- package/dist/server/lib/rate-limiter.js +186 -117
- package/dist/server/lib/rate-limiter.js.map +1 -0
- package/dist/server/lib/react-pdf-layout.js +551 -382
- package/dist/server/lib/react-pdf-layout.js.map +1 -0
- package/dist/server/lib/server-agent-loop.d.ts +4 -1
- package/dist/server/lib/server-agent-loop.js +906 -634
- package/dist/server/lib/server-agent-loop.js.map +1 -0
- package/dist/server/lib/server-subagent.js +260 -164
- package/dist/server/lib/server-subagent.js.map +1 -0
- package/dist/server/lib/session-checkpoint.js +105 -96
- package/dist/server/lib/session-checkpoint.js.map +1 -0
- package/dist/server/lib/ssrf-guard.js +193 -184
- package/dist/server/lib/ssrf-guard.js.map +1 -0
- package/dist/server/lib/supabase-client.js +94 -82
- package/dist/server/lib/supabase-client.js.map +1 -0
- package/dist/server/lib/template-resolver.js +154 -176
- package/dist/server/lib/template-resolver.js.map +1 -0
- package/dist/server/lib/utils.js +242 -133
- package/dist/server/lib/utils.js.map +1 -0
- package/dist/server/local-agent-gateway.d.ts +2 -2
- package/dist/server/local-agent-gateway.js +785 -627
- package/dist/server/local-agent-gateway.js.map +1 -0
- package/dist/server/providers/anthropic.js +250 -172
- package/dist/server/providers/anthropic.js.map +1 -0
- package/dist/server/providers/bedrock.js +217 -158
- package/dist/server/providers/bedrock.js.map +1 -0
- package/dist/server/providers/gemini.js +548 -418
- package/dist/server/providers/gemini.js.map +1 -0
- package/dist/server/providers/openai.js +571 -437
- package/dist/server/providers/openai.js.map +1 -0
- package/dist/server/providers/registry.js +23 -18
- package/dist/server/providers/registry.js.map +1 -0
- package/dist/server/providers/shared.js +123 -95
- package/dist/server/providers/shared.js.map +1 -0
- package/dist/server/providers/types.js +1 -11
- package/dist/server/providers/types.js.map +1 -0
- package/dist/server/proxy-handlers.js +209 -165
- package/dist/server/proxy-handlers.js.map +1 -0
- package/dist/server/tool-router.js +959 -599
- package/dist/server/tool-router.js.map +1 -0
- package/dist/server/validation.js +248 -188
- package/dist/server/validation.js.map +1 -0
- package/dist/server/worker.js +202 -133
- package/dist/server/worker.js.map +1 -0
- package/dist/setup.d.ts +2 -2
- package/dist/setup.js +151 -147
- package/dist/setup.js.map +1 -0
- package/dist/shared/agent-core.d.ts +115 -26
- package/dist/shared/agent-core.js +956 -522
- package/dist/shared/agent-core.js.map +1 -0
- package/dist/shared/anthropic-types.js +1 -6
- package/dist/shared/anthropic-types.js.map +1 -0
- package/dist/shared/api-client.d.ts +16 -9
- package/dist/shared/api-client.js +419 -327
- package/dist/shared/api-client.js.map +1 -0
- package/dist/shared/compaction.d.ts +36 -0
- package/dist/shared/compaction.js +138 -0
- package/dist/shared/compaction.js.map +1 -0
- package/dist/shared/constants.js +67 -64
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/sse-parser.js +221 -219
- package/dist/shared/sse-parser.js.map +1 -0
- package/dist/shared/tool-dispatch.d.ts +4 -0
- package/dist/shared/tool-dispatch.js +226 -165
- package/dist/shared/tool-dispatch.js.map +1 -0
- package/dist/shared/types.js +1 -6
- package/dist/shared/types.js.map +1 -0
- package/dist/types/cli-highlight.d.js +2 -0
- package/dist/types/cli-highlight.d.js.map +1 -0
- package/dist/types/diff.d.js +2 -0
- package/dist/types/diff.d.js.map +1 -0
- package/dist/types/pdf-parse.d.js +2 -0
- package/dist/types/pdf-parse.d.js.map +1 -0
- package/dist/updater.d.ts +1 -1
- package/dist/updater.js +118 -92
- package/dist/updater.js.map +1 -0
- package/dist/webchat/widget.js +227 -380
- package/dist/webchat/widget.js.map +1 -0
- package/package.json +22 -10
- package/vendor/ink/build/ansi-tokenizer.d.ts +38 -0
- package/vendor/ink/build/ansi-tokenizer.js +316 -0
- package/vendor/ink/build/ansi-tokenizer.js.map +1 -0
- package/vendor/ink/build/apply-styles.js +175 -0
- package/vendor/ink/build/build-layout.js +77 -0
- package/vendor/ink/build/calculate-wrapped-text.js +53 -0
- package/vendor/ink/build/colorize.d.ts +3 -0
- package/vendor/ink/build/colorize.js +48 -0
- package/vendor/ink/build/colorize.js.map +1 -0
- package/vendor/ink/build/components/AccessibilityContext.d.ts +3 -0
- package/vendor/ink/build/components/AccessibilityContext.js +5 -0
- package/vendor/ink/build/components/AccessibilityContext.js.map +1 -0
- package/vendor/ink/build/components/App.d.ts +18 -0
- package/vendor/ink/build/components/App.js +351 -0
- package/vendor/ink/build/components/App.js.map +1 -0
- package/vendor/ink/build/components/AppContext.d.ts +15 -0
- package/vendor/ink/build/components/AppContext.js +11 -0
- package/vendor/ink/build/components/AppContext.js.map +1 -0
- package/vendor/ink/build/components/BackgroundContext.d.ts +4 -0
- package/vendor/ink/build/components/BackgroundContext.js +3 -0
- package/vendor/ink/build/components/BackgroundContext.js.map +1 -0
- package/vendor/ink/build/components/Box.d.ts +117 -0
- package/vendor/ink/build/components/Box.js +34 -0
- package/vendor/ink/build/components/Box.js.map +1 -0
- package/vendor/ink/build/components/Color.js +62 -0
- package/vendor/ink/build/components/Cursor.d.ts +83 -0
- package/vendor/ink/build/components/Cursor.js +53 -0
- package/vendor/ink/build/components/Cursor.js.map +1 -0
- package/vendor/ink/build/components/CursorContext.d.ts +11 -0
- package/vendor/ink/build/components/CursorContext.js +8 -0
- package/vendor/ink/build/components/CursorContext.js.map +1 -0
- package/vendor/ink/build/components/ErrorBoundary.d.ts +18 -0
- package/vendor/ink/build/components/ErrorBoundary.js +23 -0
- package/vendor/ink/build/components/ErrorBoundary.js.map +1 -0
- package/vendor/ink/build/components/ErrorOverview.d.ts +6 -0
- package/vendor/ink/build/components/ErrorOverview.js +84 -0
- package/vendor/ink/build/components/ErrorOverview.js.map +1 -0
- package/vendor/ink/build/components/FocusContext.d.ts +16 -0
- package/vendor/ink/build/components/FocusContext.js +17 -0
- package/vendor/ink/build/components/FocusContext.js.map +1 -0
- package/vendor/ink/build/components/Newline.d.ts +13 -0
- package/vendor/ink/build/components/Newline.js +8 -0
- package/vendor/ink/build/components/Newline.js.map +1 -0
- package/vendor/ink/build/components/Spacer.d.ts +7 -0
- package/vendor/ink/build/components/Spacer.js +11 -0
- package/vendor/ink/build/components/Spacer.js.map +1 -0
- package/vendor/ink/build/components/Static.d.ts +24 -0
- package/vendor/ink/build/components/Static.js +28 -0
- package/vendor/ink/build/components/Static.js.map +1 -0
- package/vendor/ink/build/components/StderrContext.d.ts +15 -0
- package/vendor/ink/build/components/StderrContext.js +13 -0
- package/vendor/ink/build/components/StderrContext.js.map +1 -0
- package/vendor/ink/build/components/StdinContext.d.ts +22 -0
- package/vendor/ink/build/components/StdinContext.js +19 -0
- package/vendor/ink/build/components/StdinContext.js.map +1 -0
- package/vendor/ink/build/components/StdoutContext.d.ts +15 -0
- package/vendor/ink/build/components/StdoutContext.js +13 -0
- package/vendor/ink/build/components/StdoutContext.js.map +1 -0
- package/vendor/ink/build/components/Text.d.ts +55 -0
- package/vendor/ink/build/components/Text.js +50 -0
- package/vendor/ink/build/components/Text.js.map +1 -0
- package/vendor/ink/build/components/Transform.d.ts +16 -0
- package/vendor/ink/build/components/Transform.js +15 -0
- package/vendor/ink/build/components/Transform.js.map +1 -0
- package/vendor/ink/build/cursor-helpers.d.ts +38 -0
- package/vendor/ink/build/cursor-helpers.js +56 -0
- package/vendor/ink/build/cursor-helpers.js.map +1 -0
- package/vendor/ink/build/devtools-window-polyfill.d.ts +1 -0
- package/vendor/ink/build/devtools-window-polyfill.js +65 -0
- package/vendor/ink/build/devtools-window-polyfill.js.map +1 -0
- package/vendor/ink/build/devtools.d.ts +1 -0
- package/vendor/ink/build/devtools.js +11 -0
- package/vendor/ink/build/devtools.js.map +1 -0
- package/vendor/ink/build/dom.d.ts +56 -0
- package/vendor/ink/build/dom.js +124 -0
- package/vendor/ink/build/dom.js.map +1 -0
- package/vendor/ink/build/experimental/apply-style.js +140 -0
- package/vendor/ink/build/experimental/dom.js +123 -0
- package/vendor/ink/build/experimental/output.js +91 -0
- package/vendor/ink/build/experimental/reconciler.js +141 -0
- package/vendor/ink/build/experimental/renderer.js +81 -0
- package/vendor/ink/build/get-max-width.d.ts +3 -0
- package/vendor/ink/build/get-max-width.js +10 -0
- package/vendor/ink/build/get-max-width.js.map +1 -0
- package/vendor/ink/build/hooks/use-app.d.ts +5 -0
- package/vendor/ink/build/hooks/use-app.js +8 -0
- package/vendor/ink/build/hooks/use-app.js.map +1 -0
- package/vendor/ink/build/hooks/use-cursor.d.ts +12 -0
- package/vendor/ink/build/hooks/use-cursor.js +29 -0
- package/vendor/ink/build/hooks/use-cursor.js.map +1 -0
- package/vendor/ink/build/hooks/use-focus-manager.d.ts +28 -0
- package/vendor/ink/build/hooks/use-focus-manager.js +17 -0
- package/vendor/ink/build/hooks/use-focus-manager.js.map +1 -0
- package/vendor/ink/build/hooks/use-focus.d.ts +29 -0
- package/vendor/ink/build/hooks/use-focus.js +42 -0
- package/vendor/ink/build/hooks/use-focus.js.map +1 -0
- package/vendor/ink/build/hooks/use-input.d.ts +131 -0
- package/vendor/ink/build/hooks/use-input.js +124 -0
- package/vendor/ink/build/hooks/use-input.js.map +1 -0
- package/vendor/ink/build/hooks/use-is-screen-reader-enabled.d.ts +5 -0
- package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js +11 -0
- package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js.map +1 -0
- package/vendor/ink/build/hooks/use-stderr.d.ts +5 -0
- package/vendor/ink/build/hooks/use-stderr.js +8 -0
- package/vendor/ink/build/hooks/use-stderr.js.map +1 -0
- package/vendor/ink/build/hooks/use-stdin.d.ts +5 -0
- package/vendor/ink/build/hooks/use-stdin.js +8 -0
- package/vendor/ink/build/hooks/use-stdin.js.map +1 -0
- package/vendor/ink/build/hooks/use-stdout.d.ts +5 -0
- package/vendor/ink/build/hooks/use-stdout.js +8 -0
- package/vendor/ink/build/hooks/use-stdout.js.map +1 -0
- package/vendor/ink/build/hooks/useInput.js +38 -0
- package/vendor/ink/build/index.d.ts +34 -0
- package/vendor/ink/build/index.js +20 -0
- package/vendor/ink/build/index.js.map +1 -0
- package/vendor/ink/build/ink.d.ts +90 -0
- package/vendor/ink/build/ink.js +654 -0
- package/vendor/ink/build/ink.js.map +1 -0
- package/vendor/ink/build/input-parser.d.ts +7 -0
- package/vendor/ink/build/input-parser.js +154 -0
- package/vendor/ink/build/input-parser.js.map +1 -0
- package/vendor/ink/build/instance.js +205 -0
- package/vendor/ink/build/instances.d.ts +3 -0
- package/vendor/ink/build/instances.js +8 -0
- package/vendor/ink/build/instances.js.map +1 -0
- package/vendor/ink/build/kitty-keyboard.d.ts +23 -0
- package/vendor/ink/build/kitty-keyboard.js +32 -0
- package/vendor/ink/build/kitty-keyboard.js.map +1 -0
- package/vendor/ink/build/layout.d.ts +7 -0
- package/vendor/ink/build/layout.js +33 -0
- package/vendor/ink/build/layout.js.map +1 -0
- package/vendor/ink/build/log-update.d.ts +19 -0
- package/vendor/ink/build/log-update.js +243 -0
- package/vendor/ink/build/log-update.js.map +1 -0
- package/vendor/ink/build/measure-element.d.ts +16 -0
- package/vendor/ink/build/measure-element.js +9 -0
- package/vendor/ink/build/measure-element.js.map +1 -0
- package/vendor/ink/build/measure-text.d.ts +6 -0
- package/vendor/ink/build/measure-text.js +21 -0
- package/vendor/ink/build/measure-text.js.map +1 -0
- package/vendor/ink/build/options.d.ts +52 -0
- package/vendor/ink/build/options.js +2 -0
- package/vendor/ink/build/options.js.map +1 -0
- package/vendor/ink/build/output.d.ts +35 -0
- package/vendor/ink/build/output.js +183 -0
- package/vendor/ink/build/output.js.map +1 -0
- package/vendor/ink/build/parse-keypress.d.ts +22 -0
- package/vendor/ink/build/parse-keypress.js +493 -0
- package/vendor/ink/build/parse-keypress.js.map +1 -0
- package/vendor/ink/build/reconciler.d.ts +4 -0
- package/vendor/ink/build/reconciler.js +274 -0
- package/vendor/ink/build/reconciler.js.map +1 -0
- package/vendor/ink/build/render-background.d.ts +4 -0
- package/vendor/ink/build/render-background.js +25 -0
- package/vendor/ink/build/render-background.js.map +1 -0
- package/vendor/ink/build/render-border.d.ts +4 -0
- package/vendor/ink/build/render-border.js +73 -0
- package/vendor/ink/build/render-border.js.map +1 -0
- package/vendor/ink/build/render-node-to-output.d.ts +14 -0
- package/vendor/ink/build/render-node-to-output.js +147 -0
- package/vendor/ink/build/render-node-to-output.js.map +1 -0
- package/vendor/ink/build/render-to-string.d.ts +38 -0
- package/vendor/ink/build/render-to-string.js +115 -0
- package/vendor/ink/build/render-to-string.js.map +1 -0
- package/vendor/ink/build/render.d.ts +121 -0
- package/vendor/ink/build/render.js +55 -0
- package/vendor/ink/build/render.js.map +1 -0
- package/vendor/ink/build/renderer.d.ts +8 -0
- package/vendor/ink/build/renderer.js +55 -0
- package/vendor/ink/build/renderer.js.map +1 -0
- package/vendor/ink/build/sanitize-ansi.d.ts +2 -0
- package/vendor/ink/build/sanitize-ansi.js +27 -0
- package/vendor/ink/build/sanitize-ansi.js.map +1 -0
- package/vendor/ink/build/screen-reader-update.d.ts +13 -0
- package/vendor/ink/build/screen-reader-update.js +38 -0
- package/vendor/ink/build/screen-reader-update.js.map +1 -0
- package/vendor/ink/build/squash-text-nodes.d.ts +3 -0
- package/vendor/ink/build/squash-text-nodes.js +36 -0
- package/vendor/ink/build/squash-text-nodes.js.map +1 -0
- package/vendor/ink/build/styles.d.ts +240 -0
- package/vendor/ink/build/styles.js +232 -0
- package/vendor/ink/build/styles.js.map +1 -0
- package/vendor/ink/build/utils.d.ts +2 -0
- package/vendor/ink/build/utils.js +4 -0
- package/vendor/ink/build/utils.js.map +1 -0
- package/vendor/ink/build/wrap-text.d.ts +3 -0
- package/vendor/ink/build/wrap-text.js +31 -0
- package/vendor/ink/build/wrap-text.js.map +1 -0
- package/vendor/ink/build/write-synchronized.d.ts +4 -0
- package/vendor/ink/build/write-synchronized.js +7 -0
- package/vendor/ink/build/write-synchronized.js.map +1 -0
- package/vendor/ink/license +10 -0
- package/vendor/ink/node_modules/@types/node/LICENSE +21 -0
- package/vendor/ink/node_modules/@types/node/README.md +15 -0
- package/vendor/ink/node_modules/@types/node/assert/strict.d.ts +105 -0
- package/vendor/ink/node_modules/@types/node/assert.d.ts +955 -0
- package/vendor/ink/node_modules/@types/node/async_hooks.d.ts +623 -0
- package/vendor/ink/node_modules/@types/node/buffer.buffer.d.ts +466 -0
- package/vendor/ink/node_modules/@types/node/buffer.d.ts +1810 -0
- package/vendor/ink/node_modules/@types/node/child_process.d.ts +1428 -0
- package/vendor/ink/node_modules/@types/node/cluster.d.ts +486 -0
- package/vendor/ink/node_modules/@types/node/compatibility/iterators.d.ts +21 -0
- package/vendor/ink/node_modules/@types/node/console.d.ts +151 -0
- package/vendor/ink/node_modules/@types/node/constants.d.ts +20 -0
- package/vendor/ink/node_modules/@types/node/crypto.d.ts +4065 -0
- package/vendor/ink/node_modules/@types/node/dgram.d.ts +564 -0
- package/vendor/ink/node_modules/@types/node/diagnostics_channel.d.ts +576 -0
- package/vendor/ink/node_modules/@types/node/dns/promises.d.ts +503 -0
- package/vendor/ink/node_modules/@types/node/dns.d.ts +922 -0
- package/vendor/ink/node_modules/@types/node/domain.d.ts +166 -0
- package/vendor/ink/node_modules/@types/node/events.d.ts +1054 -0
- package/vendor/ink/node_modules/@types/node/fs/promises.d.ts +1329 -0
- package/vendor/ink/node_modules/@types/node/fs.d.ts +4676 -0
- package/vendor/ink/node_modules/@types/node/globals.d.ts +150 -0
- package/vendor/ink/node_modules/@types/node/globals.typedarray.d.ts +101 -0
- package/vendor/ink/node_modules/@types/node/http.d.ts +2167 -0
- package/vendor/ink/node_modules/@types/node/http2.d.ts +2480 -0
- package/vendor/ink/node_modules/@types/node/https.d.ts +405 -0
- package/vendor/ink/node_modules/@types/node/index.d.ts +115 -0
- package/vendor/ink/node_modules/@types/node/inspector/promises.d.ts +41 -0
- package/vendor/ink/node_modules/@types/node/inspector.d.ts +224 -0
- package/vendor/ink/node_modules/@types/node/inspector.generated.d.ts +4226 -0
- package/vendor/ink/node_modules/@types/node/module.d.ts +819 -0
- package/vendor/ink/node_modules/@types/node/net.d.ts +933 -0
- package/vendor/ink/node_modules/@types/node/os.d.ts +507 -0
- package/vendor/ink/node_modules/@types/node/package.json +155 -0
- package/vendor/ink/node_modules/@types/node/path/posix.d.ts +8 -0
- package/vendor/ink/node_modules/@types/node/path/win32.d.ts +8 -0
- package/vendor/ink/node_modules/@types/node/path.d.ts +187 -0
- package/vendor/ink/node_modules/@types/node/perf_hooks.d.ts +643 -0
- package/vendor/ink/node_modules/@types/node/process.d.ts +2156 -0
- package/vendor/ink/node_modules/@types/node/punycode.d.ts +117 -0
- package/vendor/ink/node_modules/@types/node/querystring.d.ts +152 -0
- package/vendor/ink/node_modules/@types/node/quic.d.ts +910 -0
- package/vendor/ink/node_modules/@types/node/readline/promises.d.ts +161 -0
- package/vendor/ink/node_modules/@types/node/readline.d.ts +541 -0
- package/vendor/ink/node_modules/@types/node/repl.d.ts +415 -0
- package/vendor/ink/node_modules/@types/node/sea.d.ts +162 -0
- package/vendor/ink/node_modules/@types/node/sqlite.d.ts +955 -0
- package/vendor/ink/node_modules/@types/node/stream/consumers.d.ts +38 -0
- package/vendor/ink/node_modules/@types/node/stream/promises.d.ts +211 -0
- package/vendor/ink/node_modules/@types/node/stream/web.d.ts +296 -0
- package/vendor/ink/node_modules/@types/node/stream.d.ts +1760 -0
- package/vendor/ink/node_modules/@types/node/string_decoder.d.ts +67 -0
- package/vendor/ink/node_modules/@types/node/test/reporters.d.ts +96 -0
- package/vendor/ink/node_modules/@types/node/test.d.ts +2240 -0
- package/vendor/ink/node_modules/@types/node/timers/promises.d.ts +108 -0
- package/vendor/ink/node_modules/@types/node/timers.d.ts +159 -0
- package/vendor/ink/node_modules/@types/node/tls.d.ts +1198 -0
- package/vendor/ink/node_modules/@types/node/trace_events.d.ts +197 -0
- package/vendor/ink/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +462 -0
- package/vendor/ink/node_modules/@types/node/ts5.6/compatibility/float16array.d.ts +71 -0
- package/vendor/ink/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +36 -0
- package/vendor/ink/node_modules/@types/node/ts5.6/index.d.ts +117 -0
- package/vendor/ink/node_modules/@types/node/ts5.7/compatibility/float16array.d.ts +72 -0
- package/vendor/ink/node_modules/@types/node/ts5.7/index.d.ts +117 -0
- package/vendor/ink/node_modules/@types/node/tty.d.ts +250 -0
- package/vendor/ink/node_modules/@types/node/url.d.ts +519 -0
- package/vendor/ink/node_modules/@types/node/util/types.d.ts +558 -0
- package/vendor/ink/node_modules/@types/node/util.d.ts +1662 -0
- package/vendor/ink/node_modules/@types/node/v8.d.ts +983 -0
- package/vendor/ink/node_modules/@types/node/vm.d.ts +1208 -0
- package/vendor/ink/node_modules/@types/node/wasi.d.ts +202 -0
- package/vendor/ink/node_modules/@types/node/web-globals/abortcontroller.d.ts +59 -0
- package/vendor/ink/node_modules/@types/node/web-globals/blob.d.ts +23 -0
- package/vendor/ink/node_modules/@types/node/web-globals/console.d.ts +9 -0
- package/vendor/ink/node_modules/@types/node/web-globals/crypto.d.ts +39 -0
- package/vendor/ink/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
- package/vendor/ink/node_modules/@types/node/web-globals/encoding.d.ts +11 -0
- package/vendor/ink/node_modules/@types/node/web-globals/events.d.ts +106 -0
- package/vendor/ink/node_modules/@types/node/web-globals/fetch.d.ts +69 -0
- package/vendor/ink/node_modules/@types/node/web-globals/importmeta.d.ts +13 -0
- package/vendor/ink/node_modules/@types/node/web-globals/messaging.d.ts +23 -0
- package/vendor/ink/node_modules/@types/node/web-globals/navigator.d.ts +25 -0
- package/vendor/ink/node_modules/@types/node/web-globals/performance.d.ts +45 -0
- package/vendor/ink/node_modules/@types/node/web-globals/storage.d.ts +24 -0
- package/vendor/ink/node_modules/@types/node/web-globals/streams.d.ts +115 -0
- package/vendor/ink/node_modules/@types/node/web-globals/timers.d.ts +44 -0
- package/vendor/ink/node_modules/@types/node/web-globals/url.d.ts +24 -0
- package/vendor/ink/node_modules/@types/node/worker_threads.d.ts +717 -0
- package/vendor/ink/node_modules/@types/node/zlib.d.ts +618 -0
- package/vendor/ink/node_modules/node-pty/LICENSE +69 -0
- package/vendor/ink/node_modules/node-pty/README.md +164 -0
- package/vendor/ink/node_modules/node-pty/binding.gyp +150 -0
- package/vendor/ink/node_modules/node-pty/lib/conpty_console_list_agent.js +25 -0
- package/vendor/ink/node_modules/node-pty/lib/eventEmitter2.js +47 -0
- package/vendor/ink/node_modules/node-pty/lib/index.js +52 -0
- package/vendor/ink/node_modules/node-pty/lib/interfaces.js +7 -0
- package/vendor/ink/node_modules/node-pty/lib/shared/conout.js +11 -0
- package/vendor/ink/node_modules/node-pty/lib/terminal.js +190 -0
- package/vendor/ink/node_modules/node-pty/lib/types.js +7 -0
- package/vendor/ink/node_modules/node-pty/lib/unixTerminal.js +349 -0
- package/vendor/ink/node_modules/node-pty/lib/utils.js +39 -0
- package/vendor/ink/node_modules/node-pty/lib/windowsConoutConnection.js +125 -0
- package/vendor/ink/node_modules/node-pty/lib/windowsPtyAgent.js +287 -0
- package/vendor/ink/node_modules/node-pty/lib/windowsTerminal.js +201 -0
- package/vendor/ink/node_modules/node-pty/lib/worker/conoutSocketWorker.js +22 -0
- package/vendor/ink/node_modules/node-pty/package.json +65 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/darwin-arm64/pty.node +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/darwin-arm64/spawn-helper +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/darwin-x64/pty.node +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/darwin-x64/spawn-helper +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/linux-arm64/pty.node +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/linux-x64/pty.node +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty.pdb +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.pdb +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty/conpty.dll +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty.node +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty.pdb +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
- package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.pdb +0 -0
- package/vendor/ink/node_modules/node-pty/scripts/post-install.js +76 -0
- package/vendor/ink/node_modules/node-pty/scripts/prebuild.js +34 -0
- package/vendor/ink/node_modules/node-pty/src/unix/pty.cc +875 -0
- package/vendor/ink/node_modules/node-pty/src/unix/spawn-helper.cc +23 -0
- package/vendor/ink/node_modules/node-pty/src/win/conpty.cc +582 -0
- package/vendor/ink/node_modules/node-pty/src/win/conpty.h +41 -0
- package/vendor/ink/node_modules/node-pty/src/win/conpty_console_list.cc +44 -0
- package/vendor/ink/node_modules/node-pty/src/win/path_util.cc +95 -0
- package/vendor/ink/node_modules/node-pty/src/win/path_util.h +26 -0
- package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-arm64/OpenConsole.exe +0 -0
- package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-arm64/conpty.dll +0 -0
- package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-x64/OpenConsole.exe +0 -0
- package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-x64/conpty.dll +0 -0
- package/vendor/ink/node_modules/node-pty/typings/node-pty.d.ts +215 -0
- package/vendor/ink/node_modules/undici-types/LICENSE +21 -0
- package/vendor/ink/node_modules/undici-types/README.md +6 -0
- package/vendor/ink/node_modules/undici-types/agent.d.ts +32 -0
- package/vendor/ink/node_modules/undici-types/api.d.ts +43 -0
- package/vendor/ink/node_modules/undici-types/balanced-pool.d.ts +30 -0
- package/vendor/ink/node_modules/undici-types/cache-interceptor.d.ts +173 -0
- package/vendor/ink/node_modules/undici-types/cache.d.ts +36 -0
- package/vendor/ink/node_modules/undici-types/client-stats.d.ts +15 -0
- package/vendor/ink/node_modules/undici-types/client.d.ts +108 -0
- package/vendor/ink/node_modules/undici-types/connector.d.ts +34 -0
- package/vendor/ink/node_modules/undici-types/content-type.d.ts +21 -0
- package/vendor/ink/node_modules/undici-types/cookies.d.ts +30 -0
- package/vendor/ink/node_modules/undici-types/diagnostics-channel.d.ts +74 -0
- package/vendor/ink/node_modules/undici-types/dispatcher.d.ts +276 -0
- package/vendor/ink/node_modules/undici-types/env-http-proxy-agent.d.ts +22 -0
- package/vendor/ink/node_modules/undici-types/errors.d.ts +161 -0
- package/vendor/ink/node_modules/undici-types/eventsource.d.ts +66 -0
- package/vendor/ink/node_modules/undici-types/fetch.d.ts +211 -0
- package/vendor/ink/node_modules/undici-types/formdata.d.ts +108 -0
- package/vendor/ink/node_modules/undici-types/global-dispatcher.d.ts +9 -0
- package/vendor/ink/node_modules/undici-types/global-origin.d.ts +7 -0
- package/vendor/ink/node_modules/undici-types/h2c-client.d.ts +73 -0
- package/vendor/ink/node_modules/undici-types/handlers.d.ts +15 -0
- package/vendor/ink/node_modules/undici-types/header.d.ts +160 -0
- package/vendor/ink/node_modules/undici-types/index.d.ts +88 -0
- package/vendor/ink/node_modules/undici-types/interceptors.d.ts +73 -0
- package/vendor/ink/node_modules/undici-types/mock-agent.d.ts +68 -0
- package/vendor/ink/node_modules/undici-types/mock-call-history.d.ts +111 -0
- package/vendor/ink/node_modules/undici-types/mock-client.d.ts +27 -0
- package/vendor/ink/node_modules/undici-types/mock-errors.d.ts +12 -0
- package/vendor/ink/node_modules/undici-types/mock-interceptor.d.ts +94 -0
- package/vendor/ink/node_modules/undici-types/mock-pool.d.ts +27 -0
- package/vendor/ink/node_modules/undici-types/package.json +55 -0
- package/vendor/ink/node_modules/undici-types/patch.d.ts +29 -0
- package/vendor/ink/node_modules/undici-types/pool-stats.d.ts +19 -0
- package/vendor/ink/node_modules/undici-types/pool.d.ts +41 -0
- package/vendor/ink/node_modules/undici-types/proxy-agent.d.ts +29 -0
- package/vendor/ink/node_modules/undici-types/readable.d.ts +68 -0
- package/vendor/ink/node_modules/undici-types/retry-agent.d.ts +8 -0
- package/vendor/ink/node_modules/undici-types/retry-handler.d.ts +125 -0
- package/vendor/ink/node_modules/undici-types/round-robin-pool.d.ts +41 -0
- package/vendor/ink/node_modules/undici-types/snapshot-agent.d.ts +109 -0
- package/vendor/ink/node_modules/undici-types/util.d.ts +18 -0
- package/vendor/ink/node_modules/undici-types/utility.d.ts +7 -0
- package/vendor/ink/node_modules/undici-types/webidl.d.ts +341 -0
- package/vendor/ink/node_modules/undici-types/websocket.d.ts +186 -0
- package/vendor/ink/package.json +201 -0
- package/vendor/ink/readme.md +2636 -0
- package/bin/swag-agent.js +0 -9
- package/dist/server/lib/pg-rate-limiter.d.ts +0 -21
- package/dist/server/lib/pg-rate-limiter.js +0 -86
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Hooks are configured in:
|
|
5
5
|
* - Project: .whale/hooks.json (array of HookConfig)
|
|
6
|
-
* - User: ~/.
|
|
6
|
+
* - User: ~/.whale/hooks.json (array of HookConfig)
|
|
7
7
|
*
|
|
8
8
|
* Both are loaded and merged (project hooks run first).
|
|
9
9
|
*
|
|
@@ -16,243 +16,258 @@
|
|
|
16
16
|
* If allow: false, the tool call is blocked and message is returned as the tool result.
|
|
17
17
|
* If hook exits non-zero, it is logged as a warning but does not crash the session.
|
|
18
18
|
*/
|
|
19
|
+
|
|
19
20
|
import { existsSync, readFileSync } from "fs";
|
|
20
21
|
import { join } from "path";
|
|
21
|
-
import { homedir } from "os";
|
|
22
22
|
import { spawn } from "child_process";
|
|
23
|
+
import { HOOKS_PATH } from "./paths.js";
|
|
24
|
+
|
|
25
|
+
// ============================================================================
|
|
26
|
+
// TYPES
|
|
27
|
+
// ============================================================================
|
|
28
|
+
|
|
29
|
+
/** JSON sent to hook process on stdin */
|
|
30
|
+
|
|
31
|
+
/** JSON output from hook process on stdout */
|
|
32
|
+
|
|
23
33
|
const DEFAULT_TIMEOUT_MS = 10_000;
|
|
34
|
+
|
|
24
35
|
// ============================================================================
|
|
25
36
|
// GLOB MATCHING
|
|
26
37
|
// ============================================================================
|
|
38
|
+
|
|
27
39
|
/**
|
|
28
40
|
* Match a tool name against a simple glob pattern.
|
|
29
41
|
* Supports * (any chars) and ? (single char).
|
|
30
42
|
*/
|
|
31
43
|
export function matchGlob(pattern, name) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
.replace(/\*/g, ".*")
|
|
36
|
-
.replace(/\?/g, ".");
|
|
37
|
-
return new RegExp(`^${regex}$`).test(name);
|
|
44
|
+
// Escape regex special chars except * and ?
|
|
45
|
+
const regex = pattern.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*").replace(/\?/g, ".");
|
|
46
|
+
return new RegExp(`^${regex}$`).test(name);
|
|
38
47
|
}
|
|
48
|
+
|
|
39
49
|
// ============================================================================
|
|
40
50
|
// LOAD HOOKS
|
|
41
51
|
// ============================================================================
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
"SessionStart",
|
|
46
|
-
"SessionEnd",
|
|
47
|
-
"Notification",
|
|
48
|
-
];
|
|
52
|
+
|
|
53
|
+
const VALID_EVENTS = ["BeforeTool", "AfterTool", "SessionStart", "SessionEnd", "Notification"];
|
|
54
|
+
|
|
49
55
|
/**
|
|
50
|
-
* Load hooks from project (.whale/hooks.json) and user (~/.
|
|
56
|
+
* Load hooks from project (.whale/hooks.json) and user (~/.whale/hooks.json).
|
|
51
57
|
* Project hooks come first in the array, then user hooks.
|
|
52
58
|
* Invalid files are skipped with a warning.
|
|
53
59
|
*/
|
|
54
60
|
export function loadHooks(cwd) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
61
|
+
const hooks = [];
|
|
62
|
+
|
|
63
|
+
// Project hooks (higher priority, run first)
|
|
64
|
+
const projectPath = join(cwd, ".whale", "hooks.json");
|
|
65
|
+
const projectHooks = loadHooksFromFile(projectPath);
|
|
66
|
+
if (projectHooks) hooks.push(...projectHooks);
|
|
67
|
+
|
|
68
|
+
// User hooks
|
|
69
|
+
const userPath = HOOKS_PATH;
|
|
70
|
+
const userHooks = loadHooksFromFile(userPath);
|
|
71
|
+
if (userHooks) hooks.push(...userHooks);
|
|
72
|
+
return hooks;
|
|
67
73
|
}
|
|
68
74
|
function loadHooksFromFile(filePath) {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
return null;
|
|
77
|
-
}
|
|
78
|
-
// Validate each hook config
|
|
79
|
-
return parsed.filter((h) => {
|
|
80
|
-
if (!h || typeof h !== "object")
|
|
81
|
-
return false;
|
|
82
|
-
const hook = h;
|
|
83
|
-
if (typeof hook.event !== "string" || typeof hook.command !== "string") {
|
|
84
|
-
console.error(`[hooks] Warning: Invalid hook in ${filePath}, missing event or command`);
|
|
85
|
-
return false;
|
|
86
|
-
}
|
|
87
|
-
if (!VALID_EVENTS.includes(hook.event)) {
|
|
88
|
-
console.error(`[hooks] Warning: Invalid event "${hook.event}" in ${filePath}`);
|
|
89
|
-
return false;
|
|
90
|
-
}
|
|
91
|
-
return true;
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
catch (err) {
|
|
95
|
-
console.error(`[hooks] Warning: Failed to parse ${filePath}: ${err instanceof Error ? err.message : err}`);
|
|
96
|
-
return null;
|
|
75
|
+
if (!existsSync(filePath)) return null;
|
|
76
|
+
try {
|
|
77
|
+
const raw = readFileSync(filePath, "utf-8");
|
|
78
|
+
const parsed = JSON.parse(raw);
|
|
79
|
+
if (!Array.isArray(parsed)) {
|
|
80
|
+
console.error(`[hooks] Warning: ${filePath} should be a JSON array, skipping`);
|
|
81
|
+
return null;
|
|
97
82
|
}
|
|
83
|
+
// Validate each hook config
|
|
84
|
+
return parsed.filter(h => {
|
|
85
|
+
if (!h || typeof h !== "object") return false;
|
|
86
|
+
const hook = h;
|
|
87
|
+
if (typeof hook.event !== "string" || typeof hook.command !== "string") {
|
|
88
|
+
console.error(`[hooks] Warning: Invalid hook in ${filePath}, missing event or command`);
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
if (!VALID_EVENTS.includes(hook.event)) {
|
|
92
|
+
console.error(`[hooks] Warning: Invalid event "${hook.event}" in ${filePath}`);
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
return true;
|
|
96
|
+
});
|
|
97
|
+
} catch (err) {
|
|
98
|
+
console.error(`[hooks] Warning: Failed to parse ${filePath}: ${err instanceof Error ? err.message : err}`);
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
98
101
|
}
|
|
102
|
+
|
|
99
103
|
// ============================================================================
|
|
100
104
|
// EXECUTE HOOK
|
|
101
105
|
// ============================================================================
|
|
106
|
+
|
|
102
107
|
/**
|
|
103
108
|
* Execute a hook command with JSON payload on stdin.
|
|
104
109
|
* Returns parsed JSON response from stdout, or null on error/timeout.
|
|
105
110
|
*/
|
|
106
111
|
export async function executeHook(hook, payload) {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
child.kill("SIGKILL");
|
|
131
|
-
}
|
|
132
|
-
catch {
|
|
133
|
-
/* ignore */
|
|
134
|
-
}
|
|
135
|
-
settle(null);
|
|
136
|
-
}
|
|
137
|
-
}, timeout);
|
|
138
|
-
child.stdout?.on("data", (data) => {
|
|
139
|
-
stdout += data.toString();
|
|
140
|
-
});
|
|
141
|
-
child.stderr?.on("data", (data) => {
|
|
142
|
-
stderr += data.toString();
|
|
143
|
-
});
|
|
144
|
-
child.on("error", (err) => {
|
|
145
|
-
console.error(`[hooks] Warning: Hook "${hook.command}" failed to start: ${err.message}`);
|
|
146
|
-
settle(null);
|
|
147
|
-
});
|
|
148
|
-
child.on("close", (code) => {
|
|
149
|
-
if (code !== 0) {
|
|
150
|
-
if (stderr) {
|
|
151
|
-
console.error(`[hooks] Warning: Hook "${hook.command}" exited with code ${code}: ${stderr.trim()}`);
|
|
152
|
-
}
|
|
153
|
-
else {
|
|
154
|
-
console.error(`[hooks] Warning: Hook "${hook.command}" exited with code ${code}`);
|
|
155
|
-
}
|
|
156
|
-
settle(null);
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
|
-
// Parse stdout as JSON
|
|
160
|
-
const trimmed = stdout.trim();
|
|
161
|
-
if (!trimmed) {
|
|
162
|
-
settle(null);
|
|
163
|
-
return;
|
|
164
|
-
}
|
|
165
|
-
try {
|
|
166
|
-
settle(JSON.parse(trimmed));
|
|
167
|
-
}
|
|
168
|
-
catch {
|
|
169
|
-
// Non-JSON output is not an error, just no structured response
|
|
170
|
-
settle(null);
|
|
171
|
-
}
|
|
172
|
-
});
|
|
173
|
-
// Write payload to stdin
|
|
112
|
+
const timeout = hook.timeout ?? DEFAULT_TIMEOUT_MS;
|
|
113
|
+
return new Promise(resolve => {
|
|
114
|
+
let stdout = "";
|
|
115
|
+
let stderr = "";
|
|
116
|
+
let settled = false;
|
|
117
|
+
const child = spawn("/bin/sh", ["-c", hook.command], {
|
|
118
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
119
|
+
env: {
|
|
120
|
+
...process.env
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
let timer;
|
|
124
|
+
const settle = result => {
|
|
125
|
+
if (settled) return;
|
|
126
|
+
settled = true;
|
|
127
|
+
if (timer) clearTimeout(timer);
|
|
128
|
+
resolve(result);
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
// Kill on timeout
|
|
132
|
+
timer = setTimeout(() => {
|
|
133
|
+
if (!settled) {
|
|
134
|
+
console.error(`[hooks] Warning: Hook "${hook.command}" timed out after ${timeout}ms, killing`);
|
|
174
135
|
try {
|
|
175
|
-
|
|
176
|
-
|
|
136
|
+
child.kill("SIGKILL");
|
|
137
|
+
} catch {
|
|
138
|
+
/* ignore */
|
|
177
139
|
}
|
|
178
|
-
|
|
179
|
-
|
|
140
|
+
settle(null);
|
|
141
|
+
}
|
|
142
|
+
}, timeout);
|
|
143
|
+
child.stdout?.on("data", data => {
|
|
144
|
+
stdout += data.toString();
|
|
145
|
+
});
|
|
146
|
+
child.stderr?.on("data", data => {
|
|
147
|
+
stderr += data.toString();
|
|
148
|
+
});
|
|
149
|
+
child.on("error", err => {
|
|
150
|
+
console.error(`[hooks] Warning: Hook "${hook.command}" failed to start: ${err.message}`);
|
|
151
|
+
settle(null);
|
|
152
|
+
});
|
|
153
|
+
child.on("close", code => {
|
|
154
|
+
if (code !== 0) {
|
|
155
|
+
if (stderr) {
|
|
156
|
+
console.error(`[hooks] Warning: Hook "${hook.command}" exited with code ${code}: ${stderr.trim()}`);
|
|
157
|
+
} else {
|
|
158
|
+
console.error(`[hooks] Warning: Hook "${hook.command}" exited with code ${code}`);
|
|
180
159
|
}
|
|
160
|
+
settle(null);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Parse stdout as JSON
|
|
165
|
+
const trimmed = stdout.trim();
|
|
166
|
+
if (!trimmed) {
|
|
167
|
+
settle(null);
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
try {
|
|
171
|
+
settle(JSON.parse(trimmed));
|
|
172
|
+
} catch {
|
|
173
|
+
// Non-JSON output is not an error, just no structured response
|
|
174
|
+
settle(null);
|
|
175
|
+
}
|
|
181
176
|
});
|
|
177
|
+
|
|
178
|
+
// Write payload to stdin
|
|
179
|
+
try {
|
|
180
|
+
child.stdin?.write(JSON.stringify(payload));
|
|
181
|
+
child.stdin?.end();
|
|
182
|
+
} catch {
|
|
183
|
+
// stdin may already be closed — that is fine
|
|
184
|
+
}
|
|
185
|
+
});
|
|
182
186
|
}
|
|
187
|
+
|
|
183
188
|
// ============================================================================
|
|
184
189
|
// PUBLIC API
|
|
185
190
|
// ============================================================================
|
|
191
|
+
|
|
186
192
|
/**
|
|
187
193
|
* Run BeforeTool hooks for a given tool call.
|
|
188
194
|
* Returns whether the tool call should proceed and optionally modified input.
|
|
189
195
|
*/
|
|
190
196
|
export async function runBeforeToolHook(hooks, toolName, input) {
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
}
|
|
211
|
-
// If hook modifies input and is allowed to
|
|
212
|
-
if (hook.allowModify && response.modified_input) {
|
|
213
|
-
return { allow: true, modifiedInput: response.modified_input };
|
|
214
|
-
}
|
|
197
|
+
const matching = hooks.filter(h => h.event === "BeforeTool" && (!h.pattern || matchGlob(h.pattern, toolName)));
|
|
198
|
+
if (matching.length === 0) return {
|
|
199
|
+
allow: true
|
|
200
|
+
};
|
|
201
|
+
const payload = {
|
|
202
|
+
event: "BeforeTool",
|
|
203
|
+
tool_name: toolName,
|
|
204
|
+
tool_input: input
|
|
205
|
+
};
|
|
206
|
+
for (const hook of matching) {
|
|
207
|
+
const response = await executeHook(hook, payload);
|
|
208
|
+
if (!response) continue;
|
|
209
|
+
|
|
210
|
+
// If any hook blocks, stop immediately
|
|
211
|
+
if (response.allow === false) {
|
|
212
|
+
return {
|
|
213
|
+
allow: false,
|
|
214
|
+
message: response.message || `Blocked by hook: ${hook.command}`
|
|
215
|
+
};
|
|
215
216
|
}
|
|
216
|
-
|
|
217
|
+
|
|
218
|
+
// If hook modifies input and is allowed to
|
|
219
|
+
if (hook.allowModify && response.modified_input) {
|
|
220
|
+
return {
|
|
221
|
+
allow: true,
|
|
222
|
+
modifiedInput: response.modified_input
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return {
|
|
227
|
+
allow: true
|
|
228
|
+
};
|
|
217
229
|
}
|
|
230
|
+
|
|
218
231
|
/**
|
|
219
232
|
* Run AfterTool hooks for a given tool result.
|
|
220
233
|
* Returns optionally modified output.
|
|
221
234
|
*/
|
|
222
235
|
export async function runAfterToolHook(hooks, toolName, output, success) {
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
}
|
|
236
|
+
const matching = hooks.filter(h => h.event === "AfterTool" && (!h.pattern || matchGlob(h.pattern, toolName)));
|
|
237
|
+
if (matching.length === 0) return {};
|
|
238
|
+
const payload = {
|
|
239
|
+
event: "AfterTool",
|
|
240
|
+
tool_name: toolName,
|
|
241
|
+
tool_output: output,
|
|
242
|
+
tool_success: success
|
|
243
|
+
};
|
|
244
|
+
for (const hook of matching) {
|
|
245
|
+
const response = await executeHook(hook, payload);
|
|
246
|
+
if (!response) continue;
|
|
247
|
+
|
|
248
|
+
// If hook modifies output and is allowed to
|
|
249
|
+
if (hook.allowModify && response.modified_output !== undefined) {
|
|
250
|
+
return {
|
|
251
|
+
modifiedOutput: response.modified_output
|
|
252
|
+
};
|
|
241
253
|
}
|
|
242
|
-
|
|
254
|
+
}
|
|
255
|
+
return {};
|
|
243
256
|
}
|
|
257
|
+
|
|
244
258
|
/**
|
|
245
259
|
* Run session lifecycle hooks (SessionStart, SessionEnd, Notification).
|
|
246
260
|
* Fire-and-forget — errors are logged but don't affect session.
|
|
247
261
|
*/
|
|
248
262
|
export async function runSessionHook(hooks, event, data) {
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
263
|
+
const matching = hooks.filter(h => h.event === event);
|
|
264
|
+
if (matching.length === 0) return;
|
|
265
|
+
const payload = {
|
|
266
|
+
event,
|
|
267
|
+
...(data || {})
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
// Run all session hooks concurrently — don't wait or fail
|
|
271
|
+
await Promise.allSettled(matching.map(hook => executeHook(hook, payload)));
|
|
258
272
|
}
|
|
273
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","names":["existsSync","readFileSync","join","spawn","HOOKS_PATH","DEFAULT_TIMEOUT_MS","matchGlob","pattern","name","regex","replace","RegExp","test","VALID_EVENTS","loadHooks","cwd","hooks","projectPath","projectHooks","loadHooksFromFile","push","userPath","userHooks","filePath","raw","parsed","JSON","parse","Array","isArray","console","error","filter","h","hook","event","command","includes","err","Error","message","executeHook","payload","timeout","Promise","resolve","stdout","stderr","settled","child","stdio","env","process","timer","settle","result","clearTimeout","setTimeout","kill","on","data","toString","code","trim","trimmed","stdin","write","stringify","end","runBeforeToolHook","toolName","input","matching","length","allow","tool_name","tool_input","response","allowModify","modified_input","modifiedInput","runAfterToolHook","output","success","tool_output","tool_success","modified_output","undefined","modifiedOutput","runSessionHook","allSettled","map"],"sources":["../../../src/cli/services/hooks.ts"],"sourcesContent":["/**\n * Hooks System — shell commands that run before/after tool calls and at session lifecycle events.\n *\n * Hooks are configured in:\n * - Project: .whale/hooks.json (array of HookConfig)\n * - User: ~/.whale/hooks.json (array of HookConfig)\n *\n * Both are loaded and merged (project hooks run first).\n *\n * Hook process receives JSON on stdin:\n * { event, tool_name?, tool_input?, tool_output?, tool_success?, session_id? }\n *\n * Hook process may output JSON on stdout:\n * { allow?: boolean, message?: string, modified_input?: object, modified_output?: string }\n *\n * If allow: false, the tool call is blocked and message is returned as the tool result.\n * If hook exits non-zero, it is logged as a warning but does not crash the session.\n */\n\nimport { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { spawn } from \"child_process\";\nimport { HOOKS_PATH } from \"./paths.js\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport type HookEvent =\n | \"BeforeTool\"\n | \"AfterTool\"\n | \"SessionStart\"\n | \"SessionEnd\"\n | \"Notification\";\n\nexport interface HookConfig {\n /** Which event triggers this hook */\n event: HookEvent;\n /** Shell command to run */\n command: string;\n /** Optional: only trigger for matching tool names (glob pattern) */\n pattern?: string;\n /** Max ms to wait for hook process (default 10000) */\n timeout?: number;\n /** Can hook modify the tool input/output? (default false) */\n allowModify?: boolean;\n}\n\n/** JSON sent to hook process on stdin */\ninterface HookPayload {\n event: HookEvent;\n tool_name?: string;\n tool_input?: Record<string, unknown>;\n tool_output?: string;\n tool_success?: boolean;\n session_id?: string;\n}\n\n/** JSON output from hook process on stdout */\ninterface HookResponse {\n allow?: boolean;\n message?: string;\n modified_input?: Record<string, unknown>;\n modified_output?: string;\n}\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\n// ============================================================================\n// GLOB MATCHING\n// ============================================================================\n\n/**\n * Match a tool name against a simple glob pattern.\n * Supports * (any chars) and ? (single char).\n */\nexport function matchGlob(pattern: string, name: string): boolean {\n // Escape regex special chars except * and ?\n const regex = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\*/g, \".*\")\n .replace(/\\?/g, \".\");\n return new RegExp(`^${regex}$`).test(name);\n}\n\n// ============================================================================\n// LOAD HOOKS\n// ============================================================================\n\nconst VALID_EVENTS: HookEvent[] = [\n \"BeforeTool\",\n \"AfterTool\",\n \"SessionStart\",\n \"SessionEnd\",\n \"Notification\",\n];\n\n/**\n * Load hooks from project (.whale/hooks.json) and user (~/.whale/hooks.json).\n * Project hooks come first in the array, then user hooks.\n * Invalid files are skipped with a warning.\n */\nexport function loadHooks(cwd: string): HookConfig[] {\n const hooks: HookConfig[] = [];\n\n // Project hooks (higher priority, run first)\n const projectPath = join(cwd, \".whale\", \"hooks.json\");\n const projectHooks = loadHooksFromFile(projectPath);\n if (projectHooks) hooks.push(...projectHooks);\n\n // User hooks\n const userPath = HOOKS_PATH;\n const userHooks = loadHooksFromFile(userPath);\n if (userHooks) hooks.push(...userHooks);\n\n return hooks;\n}\n\nfunction loadHooksFromFile(filePath: string): HookConfig[] | null {\n if (!existsSync(filePath)) return null;\n try {\n const raw = readFileSync(filePath, \"utf-8\");\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) {\n console.error(`[hooks] Warning: ${filePath} should be a JSON array, skipping`);\n return null;\n }\n // Validate each hook config\n return parsed.filter((h: unknown) => {\n if (!h || typeof h !== \"object\") return false;\n const hook = h as Record<string, unknown>;\n if (typeof hook.event !== \"string\" || typeof hook.command !== \"string\") {\n console.error(`[hooks] Warning: Invalid hook in ${filePath}, missing event or command`);\n return false;\n }\n if (!VALID_EVENTS.includes(hook.event as HookEvent)) {\n console.error(`[hooks] Warning: Invalid event \"${hook.event}\" in ${filePath}`);\n return false;\n }\n return true;\n }) as HookConfig[];\n } catch (err) {\n console.error(\n `[hooks] Warning: Failed to parse ${filePath}: ${err instanceof Error ? err.message : err}`,\n );\n return null;\n }\n}\n\n// ============================================================================\n// EXECUTE HOOK\n// ============================================================================\n\n/**\n * Execute a hook command with JSON payload on stdin.\n * Returns parsed JSON response from stdout, or null on error/timeout.\n */\nexport async function executeHook(\n hook: HookConfig,\n payload: HookPayload,\n): Promise<HookResponse | null> {\n const timeout = hook.timeout ?? DEFAULT_TIMEOUT_MS;\n\n return new Promise((resolve) => {\n let stdout = \"\";\n let stderr = \"\";\n let settled = false;\n\n const child = spawn(\"/bin/sh\", [\"-c\", hook.command], {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: { ...process.env },\n });\n\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const settle = (result: HookResponse | null) => {\n if (settled) return;\n settled = true;\n if (timer) clearTimeout(timer);\n resolve(result);\n };\n\n // Kill on timeout\n timer = setTimeout(() => {\n if (!settled) {\n console.error(\n `[hooks] Warning: Hook \"${hook.command}\" timed out after ${timeout}ms, killing`,\n );\n try {\n child.kill(\"SIGKILL\");\n } catch {\n /* ignore */\n }\n settle(null);\n }\n }, timeout);\n\n child.stdout?.on(\"data\", (data: Buffer) => {\n stdout += data.toString();\n });\n\n child.stderr?.on(\"data\", (data: Buffer) => {\n stderr += data.toString();\n });\n\n child.on(\"error\", (err) => {\n console.error(\n `[hooks] Warning: Hook \"${hook.command}\" failed to start: ${err.message}`,\n );\n settle(null);\n });\n\n child.on(\"close\", (code) => {\n if (code !== 0) {\n if (stderr) {\n console.error(\n `[hooks] Warning: Hook \"${hook.command}\" exited with code ${code}: ${stderr.trim()}`,\n );\n } else {\n console.error(\n `[hooks] Warning: Hook \"${hook.command}\" exited with code ${code}`,\n );\n }\n settle(null);\n return;\n }\n\n // Parse stdout as JSON\n const trimmed = stdout.trim();\n if (!trimmed) {\n settle(null);\n return;\n }\n try {\n settle(JSON.parse(trimmed) as HookResponse);\n } catch {\n // Non-JSON output is not an error, just no structured response\n settle(null);\n }\n });\n\n // Write payload to stdin\n try {\n child.stdin?.write(JSON.stringify(payload));\n child.stdin?.end();\n } catch {\n // stdin may already be closed — that is fine\n }\n });\n}\n\n// ============================================================================\n// PUBLIC API\n// ============================================================================\n\n/**\n * Run BeforeTool hooks for a given tool call.\n * Returns whether the tool call should proceed and optionally modified input.\n */\nexport async function runBeforeToolHook(\n hooks: HookConfig[],\n toolName: string,\n input: Record<string, unknown>,\n): Promise<{\n allow: boolean;\n message?: string;\n modifiedInput?: Record<string, unknown>;\n}> {\n const matching = hooks.filter(\n (h) =>\n h.event === \"BeforeTool\" &&\n (!h.pattern || matchGlob(h.pattern, toolName)),\n );\n\n if (matching.length === 0) return { allow: true };\n\n const payload: HookPayload = {\n event: \"BeforeTool\",\n tool_name: toolName,\n tool_input: input,\n };\n\n for (const hook of matching) {\n const response = await executeHook(hook, payload);\n if (!response) continue;\n\n // If any hook blocks, stop immediately\n if (response.allow === false) {\n return {\n allow: false,\n message: response.message || `Blocked by hook: ${hook.command}`,\n };\n }\n\n // If hook modifies input and is allowed to\n if (hook.allowModify && response.modified_input) {\n return { allow: true, modifiedInput: response.modified_input };\n }\n }\n\n return { allow: true };\n}\n\n/**\n * Run AfterTool hooks for a given tool result.\n * Returns optionally modified output.\n */\nexport async function runAfterToolHook(\n hooks: HookConfig[],\n toolName: string,\n output: string,\n success: boolean,\n): Promise<{ modifiedOutput?: string }> {\n const matching = hooks.filter(\n (h) =>\n h.event === \"AfterTool\" &&\n (!h.pattern || matchGlob(h.pattern, toolName)),\n );\n\n if (matching.length === 0) return {};\n\n const payload: HookPayload = {\n event: \"AfterTool\",\n tool_name: toolName,\n tool_output: output,\n tool_success: success,\n };\n\n for (const hook of matching) {\n const response = await executeHook(hook, payload);\n if (!response) continue;\n\n // If hook modifies output and is allowed to\n if (hook.allowModify && response.modified_output !== undefined) {\n return { modifiedOutput: response.modified_output };\n }\n }\n\n return {};\n}\n\n/**\n * Run session lifecycle hooks (SessionStart, SessionEnd, Notification).\n * Fire-and-forget — errors are logged but don't affect session.\n */\nexport async function runSessionHook(\n hooks: HookConfig[],\n event: \"SessionStart\" | \"SessionEnd\" | \"Notification\",\n data?: Record<string, unknown>,\n): Promise<void> {\n const matching = hooks.filter((h) => h.event === event);\n\n if (matching.length === 0) return;\n\n const payload: HookPayload = {\n event,\n ...(data || {}),\n };\n\n // Run all session hooks concurrently — don't wait or fail\n await Promise.allSettled(matching.map((hook) => executeHook(hook, payload)));\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ink Incremental Rendering Patch
|
|
3
|
+
*
|
|
4
|
+
* Replaces Ink's standard log-update instance (erase everything, rewrite everything)
|
|
5
|
+
* with its built-in incremental variant (only rewrite changed lines).
|
|
6
|
+
*
|
|
7
|
+
* This dramatically reduces flicker for updates that change few lines (spinners,
|
|
8
|
+
* streaming text, tool status changes) because unchanged lines are never touched.
|
|
9
|
+
*
|
|
10
|
+
* How it works:
|
|
11
|
+
* - Ink's log-update has two modes: standard (erase+rewrite all) and incremental
|
|
12
|
+
* (line-level diff — skip unchanged lines, rewrite only changed ones)
|
|
13
|
+
* - Ink defaults to standard mode. This patch swaps in incremental mode.
|
|
14
|
+
* - The throttledLog arrow function accesses this.log dynamically (not via closure),
|
|
15
|
+
* so replacing ink.log is picked up automatically. No autoBind issues.
|
|
16
|
+
*
|
|
17
|
+
* Call after render() — the Ink instance must exist in the registry.
|
|
18
|
+
*/
|
|
19
|
+
export declare function patchInkIncremental(): Promise<void>;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ink Incremental Rendering Patch
|
|
3
|
+
*
|
|
4
|
+
* Replaces Ink's standard log-update instance (erase everything, rewrite everything)
|
|
5
|
+
* with its built-in incremental variant (only rewrite changed lines).
|
|
6
|
+
*
|
|
7
|
+
* This dramatically reduces flicker for updates that change few lines (spinners,
|
|
8
|
+
* streaming text, tool status changes) because unchanged lines are never touched.
|
|
9
|
+
*
|
|
10
|
+
* How it works:
|
|
11
|
+
* - Ink's log-update has two modes: standard (erase+rewrite all) and incremental
|
|
12
|
+
* (line-level diff — skip unchanged lines, rewrite only changed ones)
|
|
13
|
+
* - Ink defaults to standard mode. This patch swaps in incremental mode.
|
|
14
|
+
* - The throttledLog arrow function accesses this.log dynamically (not via closure),
|
|
15
|
+
* so replacing ink.log is picked up automatically. No autoBind issues.
|
|
16
|
+
*
|
|
17
|
+
* Call after render() — the Ink instance must exist in the registry.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { pathToFileURL } from "url";
|
|
21
|
+
import { resolve, dirname } from "path";
|
|
22
|
+
import { fileURLToPath } from "url";
|
|
23
|
+
export async function patchInkIncremental() {
|
|
24
|
+
try {
|
|
25
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
26
|
+
const inkBuildDir = resolve(__dirname, "..", "..", "..", "node_modules", "ink", "build");
|
|
27
|
+
const [{
|
|
28
|
+
default: instances
|
|
29
|
+
}, {
|
|
30
|
+
default: logUpdate
|
|
31
|
+
}] = await Promise.all([import(/* @vite-ignore */pathToFileURL(resolve(inkBuildDir, "instances.js")).href), import(/* @vite-ignore */pathToFileURL(resolve(inkBuildDir, "log-update.js")).href)]);
|
|
32
|
+
const ink = instances.get(process.stdout);
|
|
33
|
+
if (!ink) return;
|
|
34
|
+
const oldLog = ink.log;
|
|
35
|
+
const incrementalLog = logUpdate.create(ink.options.stdout, {
|
|
36
|
+
incremental: true
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
// Sync the new log's internal state with what's currently on screen
|
|
40
|
+
if (ink.lastOutputToRender) {
|
|
41
|
+
incrementalLog.sync(ink.lastOutputToRender);
|
|
42
|
+
}
|
|
43
|
+
if (ink.cursorPosition) {
|
|
44
|
+
incrementalLog.setCursorPosition(ink.cursorPosition);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Replace the log instance
|
|
48
|
+
ink.log = incrementalLog;
|
|
49
|
+
|
|
50
|
+
// In unthrottled mode (debug/screenReader), throttledLog === oldLog (direct ref).
|
|
51
|
+
// Replace it too so all paths use the incremental renderer.
|
|
52
|
+
if (ink.throttledLog === oldLog) {
|
|
53
|
+
ink.throttledLog = incrementalLog;
|
|
54
|
+
}
|
|
55
|
+
} catch {
|
|
56
|
+
// Silent fail — incremental rendering is best-effort
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=ink-incremental.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ink-incremental.js","names":["pathToFileURL","resolve","dirname","fileURLToPath","patchInkIncremental","__dirname","import","meta","url","inkBuildDir","default","instances","logUpdate","Promise","all","href","ink","get","process","stdout","oldLog","log","incrementalLog","create","options","incremental","lastOutputToRender","sync","cursorPosition","setCursorPosition","throttledLog"],"sources":["../../../src/cli/services/ink-incremental.ts"],"sourcesContent":["/**\n * Ink Incremental Rendering Patch\n *\n * Replaces Ink's standard log-update instance (erase everything, rewrite everything)\n * with its built-in incremental variant (only rewrite changed lines).\n *\n * This dramatically reduces flicker for updates that change few lines (spinners,\n * streaming text, tool status changes) because unchanged lines are never touched.\n *\n * How it works:\n * - Ink's log-update has two modes: standard (erase+rewrite all) and incremental\n * (line-level diff — skip unchanged lines, rewrite only changed ones)\n * - Ink defaults to standard mode. This patch swaps in incremental mode.\n * - The throttledLog arrow function accesses this.log dynamically (not via closure),\n * so replacing ink.log is picked up automatically. No autoBind issues.\n *\n * Call after render() — the Ink instance must exist in the registry.\n */\n\nimport { pathToFileURL } from \"url\";\nimport { resolve, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\n\ninterface InkLog {\n (output: string): boolean | void;\n clear: () => void;\n done: () => void;\n sync: (str: string) => void;\n setCursorPosition: (pos: unknown) => void;\n isCursorDirty: () => boolean;\n willRender: (str: string) => boolean;\n}\n\ninterface InkInstance {\n log: InkLog;\n throttledLog: InkLog | ((output: string) => void);\n lastOutputToRender: string;\n cursorPosition: unknown;\n options: { stdout: NodeJS.WriteStream };\n}\n\nexport async function patchInkIncremental(): Promise<void> {\n try {\n const __dirname = dirname(fileURLToPath(import.meta.url));\n const inkBuildDir = resolve(__dirname, \"..\", \"..\", \"..\", \"node_modules\", \"ink\", \"build\");\n\n const [{ default: instances }, { default: logUpdate }] = await Promise.all([\n import(/* @vite-ignore */ pathToFileURL(resolve(inkBuildDir, \"instances.js\")).href) as Promise<{\n default: WeakMap<NodeJS.WriteStream, InkInstance>;\n }>,\n import(/* @vite-ignore */ pathToFileURL(resolve(inkBuildDir, \"log-update.js\")).href) as Promise<{\n default: {\n create: (\n stream: NodeJS.WriteStream,\n opts?: { incremental?: boolean; showCursor?: boolean },\n ) => InkLog;\n };\n }>,\n ]);\n\n const ink = instances.get(process.stdout);\n if (!ink) return;\n\n const oldLog = ink.log;\n const incrementalLog = logUpdate.create(ink.options.stdout, { incremental: true });\n\n // Sync the new log's internal state with what's currently on screen\n if (ink.lastOutputToRender) {\n incrementalLog.sync(ink.lastOutputToRender);\n }\n if (ink.cursorPosition) {\n incrementalLog.setCursorPosition(ink.cursorPosition);\n }\n\n // Replace the log instance\n ink.log = incrementalLog;\n\n // In unthrottled mode (debug/screenReader), throttledLog === oldLog (direct ref).\n // Replace it too so all paths use the incremental renderer.\n if (ink.throttledLog === (oldLog as unknown)) {\n ink.throttledLog = incrementalLog;\n }\n } catch {\n // Silent fail — incremental rendering is best-effort\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,aAAa,QAAQ,KAAK;AACnC,SAASC,OAAO,EAAEC,OAAO,QAAQ,MAAM;AACvC,SAASC,aAAa,QAAQ,KAAK;AAoBnC,OAAO,eAAeC,mBAAmBA,CAAA,EAAkB;EACzD,IAAI;IACF,MAAMC,SAAS,GAAGH,OAAO,CAACC,aAAa,CAACG,MAAM,CAACC,IAAI,CAACC,GAAG,CAAC,CAAC;IACzD,MAAMC,WAAW,GAAGR,OAAO,CAACI,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,CAAC;IAExF,MAAM,CAAC;MAAEK,OAAO,EAAEC;IAAU,CAAC,EAAE;MAAED,OAAO,EAAEE;IAAU,CAAC,CAAC,GAAG,MAAMC,OAAO,CAACC,GAAG,CAAC,CACzE,MAAM,CAAC,kBAAmBd,aAAa,CAACC,OAAO,CAACQ,WAAW,EAAE,cAAc,CAAC,CAAC,CAACM,IAAI,CAAC,EAGnF,MAAM,CAAC,kBAAmBf,aAAa,CAACC,OAAO,CAACQ,WAAW,EAAE,eAAe,CAAC,CAAC,CAACM,IAAI,CAAC,CAQrF,CAAC;IAEF,MAAMC,GAAG,GAAGL,SAAS,CAACM,GAAG,CAACC,OAAO,CAACC,MAAM,CAAC;IACzC,IAAI,CAACH,GAAG,EAAE;IAEV,MAAMI,MAAM,GAAGJ,GAAG,CAACK,GAAG;IACtB,MAAMC,cAAc,GAAGV,SAAS,CAACW,MAAM,CAACP,GAAG,CAACQ,OAAO,CAACL,MAAM,EAAE;MAAEM,WAAW,EAAE;IAAK,CAAC,CAAC;;IAElF;IACA,IAAIT,GAAG,CAACU,kBAAkB,EAAE;MAC1BJ,cAAc,CAACK,IAAI,CAACX,GAAG,CAACU,kBAAkB,CAAC;IAC7C;IACA,IAAIV,GAAG,CAACY,cAAc,EAAE;MACtBN,cAAc,CAACO,iBAAiB,CAACb,GAAG,CAACY,cAAc,CAAC;IACtD;;IAEA;IACAZ,GAAG,CAACK,GAAG,GAAGC,cAAc;;IAExB;IACA;IACA,IAAIN,GAAG,CAACc,YAAY,KAAMV,MAAkB,EAAE;MAC5CJ,GAAG,CAACc,YAAY,GAAGR,cAAc;IACnC;EACF,CAAC,CAAC,MAAM;IACN;EAAA;AAEJ","ignoreList":[]}
|