whale-code 6.5.11 → 6.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/chat/ChatApp.js +7 -11
- package/dist/cli/chat/ChatApp.js.map +1 -1
- package/dist/cli/chat/ChatInput.js +7 -3
- package/dist/cli/chat/ChatInput.js.map +1 -1
- package/dist/cli/chat/MessageList.js +5 -6
- package/dist/cli/chat/MessageList.js.map +1 -1
- package/dist/cli/chat/StatusBar.d.ts +2 -2
- package/dist/cli/chat/StatusBar.js +90 -160
- package/dist/cli/chat/StatusBar.js.map +1 -1
- package/dist/cli/chat/components/LiveArea.js +78 -115
- package/dist/cli/chat/components/LiveArea.js.map +1 -1
- package/dist/cli/chat/components/StaticMessages.js +60 -79
- package/dist/cli/chat/components/StaticMessages.js.map +1 -1
- package/dist/cli/chat/hooks/useAgentLoop.js +45 -37
- package/dist/cli/chat/hooks/useAgentLoop.js.map +1 -1
- package/dist/cli/chat/store.d.ts +12 -0
- package/dist/cli/chat/store.js +19 -0
- package/dist/cli/chat/store.js.map +1 -1
- package/dist/cli/services/agent-loop-tools.js +10 -1
- package/dist/cli/services/agent-loop-tools.js.map +1 -1
- package/dist/cli/services/cli-agent-loop.js +3 -2
- package/dist/cli/services/cli-agent-loop.js.map +1 -1
- package/dist/cli/services/config-store.js +4 -3
- package/dist/cli/services/config-store.js.map +1 -1
- package/dist/cli/services/memory-manager.js +2 -2
- package/dist/cli/services/memory-manager.js.map +1 -1
- package/dist/cli/services/permission-modes.js +14 -10
- package/dist/cli/services/permission-modes.js.map +1 -1
- package/dist/cli/services/session-client.js +2 -1
- package/dist/cli/services/session-client.js.map +1 -1
- package/dist/cli/services/session-persistence.js +14 -6
- package/dist/cli/services/session-persistence.js.map +1 -1
- package/dist/cli/shared/SpinnerSlot.js +4 -1
- package/dist/cli/shared/SpinnerSlot.js.map +1 -1
- package/dist/server/handlers/browser-lifecycle.js +10 -0
- package/dist/server/handlers/browser-lifecycle.js.map +1 -1
- package/dist/server/handlers/browser.js +16 -1
- package/dist/server/handlers/browser.js.map +1 -1
- package/dist/server/handlers/campaigns.js +11 -0
- package/dist/server/handlers/campaigns.js.map +1 -1
- package/dist/server/handlers/catalog-products.js +19 -5
- package/dist/server/handlers/catalog-products.js.map +1 -1
- package/dist/server/handlers/catalog.js +42 -8
- package/dist/server/handlers/catalog.js.map +1 -1
- package/dist/server/handlers/clickhouse.js +4 -4
- package/dist/server/handlers/clickhouse.js.map +1 -1
- package/dist/server/handlers/comms-email.js +70 -8
- package/dist/server/handlers/comms-email.js.map +1 -1
- package/dist/server/handlers/comms.js +63 -21
- package/dist/server/handlers/comms.js.map +1 -1
- package/dist/server/handlers/coupons.js +141 -77
- package/dist/server/handlers/coupons.js.map +1 -1
- package/dist/server/handlers/google-ads.js +280 -8
- package/dist/server/handlers/google-ads.js.map +1 -1
- package/dist/server/handlers/remove-bg.d.ts +33 -0
- package/dist/server/handlers/remove-bg.js +698 -44
- package/dist/server/handlers/remove-bg.js.map +1 -1
- package/dist/server/handlers/supply-chain.js +93 -1
- package/dist/server/handlers/supply-chain.js.map +1 -1
- package/dist/server/handlers/workflow-steps-types.d.ts +1 -1
- package/dist/server/handlers/workflow-steps-types.js +7 -1
- package/dist/server/handlers/workflow-steps-types.js.map +1 -1
- package/dist/server/handlers/workflow-steps.js +1 -1
- package/dist/server/handlers/workflow-steps.js.map +1 -1
- package/dist/server/index.js +122 -29
- package/dist/server/index.js.map +1 -1
- package/dist/server/lib/agent-loop-turn.js +33 -3
- package/dist/server/lib/agent-loop-turn.js.map +1 -1
- package/dist/server/lib/agent-loop-types.d.ts +6 -2
- package/dist/server/lib/agent-loop-types.js +14 -2
- package/dist/server/lib/agent-loop-types.js.map +1 -1
- package/dist/server/lib/clickhouse-client.js +4 -2
- package/dist/server/lib/clickhouse-client.js.map +1 -1
- package/dist/server/lib/code-worker.js +4 -1
- package/dist/server/lib/code-worker.js.map +1 -1
- package/dist/server/providers/anthropic.js +103 -33
- package/dist/server/providers/anthropic.js.map +1 -1
- package/dist/server/server-chat.js +2 -2
- package/dist/server/server-chat.js.map +1 -1
- package/dist/server/server-helpers.d.ts +8 -1
- package/dist/server/server-helpers.js +17 -3
- package/dist/server/server-helpers.js.map +1 -1
- package/dist/server/server-persist.js +34 -21
- package/dist/server/server-persist.js.map +1 -1
- package/dist/server/server-rate-limit.d.ts +0 -1
- package/dist/server/server-rate-limit.js +5 -5
- package/dist/server/server-rate-limit.js.map +1 -1
- package/dist/server/server-routes-approvals.js +2 -2
- package/dist/server/server-routes-approvals.js.map +1 -1
- package/dist/server/server-routes-auth.js +2 -2
- package/dist/server/server-routes-auth.js.map +1 -1
- package/dist/server/server-routes-events.js +2 -2
- package/dist/server/server-routes-events.js.map +1 -1
- package/dist/server/server-routes-public.js +4 -4
- package/dist/server/server-routes-public.js.map +1 -1
- package/dist/server/server-routes-webchat.js +3 -3
- package/dist/server/server-routes-webchat.js.map +1 -1
- package/dist/server/server-store-circuit-breaker.js +1 -1
- package/dist/server/server-store-circuit-breaker.js.map +1 -1
- package/dist/server/tool-router.js +7 -4
- package/dist/server/tool-router.js.map +1 -1
- package/dist/server/validation.js +11 -0
- package/dist/server/validation.js.map +1 -1
- package/dist/shared/api-client.js +38 -11
- package/dist/shared/api-client.js.map +1 -1
- package/package.json +12 -10
- package/vendor/ink/build/ink.js +68 -24
- package/vendor/ink/node_modules/react-devtools-core/README.md +152 -0
- package/vendor/ink/node_modules/react-devtools-core/backend.js +1 -0
- package/vendor/ink/node_modules/react-devtools-core/dist/648.chunk.js +2 -0
- package/vendor/ink/node_modules/react-devtools-core/dist/648.chunk.js.map +1 -0
- package/vendor/ink/node_modules/react-devtools-core/dist/backend.js +15691 -0
- package/vendor/ink/node_modules/react-devtools-core/dist/backend.js.map +1 -0
- package/vendor/ink/node_modules/react-devtools-core/dist/importFile.worker.worker.js +2 -0
- package/vendor/ink/node_modules/react-devtools-core/dist/importFile.worker.worker.js.map +1 -0
- package/vendor/ink/node_modules/react-devtools-core/dist/parseSourceAndMetadata.worker.worker.js +14 -0
- package/vendor/ink/node_modules/react-devtools-core/dist/parseSourceAndMetadata.worker.worker.js.map +1 -0
- package/vendor/ink/node_modules/react-devtools-core/dist/standalone.js +2 -0
- package/vendor/ink/node_modules/react-devtools-core/dist/standalone.js.map +1 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/LICENSE +21 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/README.md +495 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/browser.js +8 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/index.js +10 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/buffer-util.js +129 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/constants.js +10 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/event-target.js +184 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/extension.js +223 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/limiter.js +55 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/permessage-deflate.js +518 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/receiver.js +607 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/sender.js +409 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/stream.js +180 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/validation.js +104 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/websocket-server.js +449 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/websocket.js +1197 -0
- package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/package.json +56 -0
- package/vendor/ink/node_modules/react-devtools-core/package.json +38 -0
- package/vendor/ink/node_modules/react-devtools-core/standalone.js +1 -0
- package/dist/cli/__tests__/print-mode-streaming.test.js +0 -270
- package/dist/cli/__tests__/print-mode.basic-output.test.js +0 -230
- package/dist/cli/__tests__/print-mode.session-errors.test.js +0 -252
- package/dist/cli/__tests__/print-mode.test.js +0 -273
- package/dist/cli/__tests__/serve-mode-messages.test.js +0 -338
- package/dist/cli/__tests__/serve-mode.messages.part2.test.js +0 -266
- package/dist/cli/__tests__/serve-mode.messages.test.js +0 -277
- package/dist/cli/__tests__/serve-mode.startup-http.test.js +0 -279
- package/dist/cli/__tests__/serve-mode.test.js +0 -345
- package/dist/cli/chat/NodeManager.d.ts +0 -30
- package/dist/cli/chat/NodeManager.js +0 -66
- package/dist/cli/chat/NodeManager.js.map +0 -1
- package/dist/cli/chat/chat-input-menu-handler.d.ts +0 -32
- package/dist/cli/chat/hooks/slash-imsg-handlers.js +0 -148
- package/dist/cli/chat/hooks/slash-imsg-handlers.js.map +0 -1
- package/dist/cli/chat/hooks/useStreamingReducer.d.ts +0 -66
- package/dist/cli/commands/__tests__/config-cmd.test.js +0 -270
- package/dist/cli/commands/__tests__/doctor.test.js +0 -257
- package/dist/cli/commands/__tests__/imsg-node-bridge.test.js +0 -99
- package/dist/cli/commands/__tests__/imsg-utils.test.js +0 -73
- package/dist/cli/commands/__tests__/init.test.js +0 -214
- package/dist/cli/commands/__tests__/mcp.test.js +0 -287
- package/dist/cli/commands/imsg-watcher-helpers.d.ts +0 -40
- package/dist/cli/commands/imsg-watcher-helpers.js +0 -184
- package/dist/cli/commands/imsg-watcher-helpers.js.map +0 -1
- package/dist/cli/commands/imsg-watcher.d.ts +0 -11
- package/dist/cli/commands/imsg-watcher.js +0 -230
- package/dist/cli/commands/imsg-watcher.js.map +0 -1
- package/dist/cli/services/__tests__/agent-definitions.test.js +0 -153
- package/dist/cli/services/__tests__/agent-events-global.test.js +0 -39
- package/dist/cli/services/__tests__/agent-events.part2.test.js +0 -113
- package/dist/cli/services/__tests__/agent-events.test.js +0 -157
- package/dist/cli/services/__tests__/agent-loop-auth.test.js +0 -392
- package/dist/cli/services/__tests__/agent-loop-budget.test.js +0 -389
- package/dist/cli/services/__tests__/agent-loop-tools-lifecycle.test.js +0 -430
- package/dist/cli/services/__tests__/agent-loop-tools-maxturns.test.js +0 -486
- package/dist/cli/services/__tests__/agent-loop-utils-execution.test.js +0 -528
- package/dist/cli/services/__tests__/agent-loop-utils-helpers.test.js +0 -466
- package/dist/cli/services/__tests__/agent-worker-base-execute.test.js +0 -257
- package/dist/cli/services/__tests__/agent-worker-base-helpers.test.js +0 -198
- package/dist/cli/services/__tests__/agent-worker-base.test.js +0 -278
- package/dist/cli/services/__tests__/auth-service-exports.test.js +0 -41
- package/dist/cli/services/__tests__/auth-service.part2.test.js +0 -169
- package/dist/cli/services/__tests__/auth-service.test.js +0 -242
- package/dist/cli/services/__tests__/background-processes.test.js +0 -282
- package/dist/cli/services/__tests__/claude-md-loader.test.js +0 -134
- package/dist/cli/services/__tests__/config-store.test.js +0 -247
- package/dist/cli/services/__tests__/debug-log.test.js +0 -199
- package/dist/cli/services/__tests__/edge-cases-caching.test.js +0 -174
- package/dist/cli/services/__tests__/edge-cases-compaction-core.test.js +0 -226
- package/dist/cli/services/__tests__/edge-cases-compaction-openai.test.js +0 -152
- package/dist/cli/services/__tests__/edge-cases-compaction-shapes.test.js +0 -53
- package/dist/cli/services/__tests__/edge-cases-compaction-thinking.test.js +0 -226
- package/dist/cli/services/__tests__/edge-cases-compaction.test.js +0 -131
- package/dist/cli/services/__tests__/edge-cases-paths.test.js +0 -86
- package/dist/cli/services/__tests__/error-logger-messages.test.js +0 -81
- package/dist/cli/services/__tests__/error-logger-transport.test.js +0 -119
- package/dist/cli/services/__tests__/error-logger.test.js +0 -264
- package/dist/cli/services/__tests__/file-history.test.js +0 -136
- package/dist/cli/services/__tests__/git-context-cache-reset.test.js +0 -223
- package/dist/cli/services/__tests__/git-context.test.js +0 -241
- package/dist/cli/services/__tests__/interactive-tools-execute.test.js +0 -166
- package/dist/cli/services/__tests__/interactive-tools-plan.test.js +0 -197
- package/dist/cli/services/__tests__/interactive-tools.part2.test.js +0 -168
- package/dist/cli/services/__tests__/interactive-tools.test.js +0 -179
- package/dist/cli/services/__tests__/keybinding-manager.test.js +0 -205
- package/dist/cli/services/__tests__/local-tools-dispatch.test.js +0 -404
- package/dist/cli/services/__tests__/local-tools.test.js +0 -238
- package/dist/cli/services/__tests__/lsp-manager.test.js +0 -364
- package/dist/cli/services/__tests__/mcp-client-connect-disconnect.test.js +0 -310
- package/dist/cli/services/__tests__/mcp-client.test.js +0 -93
- package/dist/cli/services/__tests__/memory-manager.test.js +0 -154
- package/dist/cli/services/__tests__/model-manager-utils.test.js +0 -154
- package/dist/cli/services/__tests__/model-manager.test.js +0 -175
- package/dist/cli/services/__tests__/permission-modes.test.js +0 -222
- package/dist/cli/services/__tests__/ripgrep.test.js +0 -328
- package/dist/cli/services/__tests__/server-tools-execute.test.js +0 -317
- package/dist/cli/services/__tests__/server-tools.test.js +0 -272
- package/dist/cli/services/__tests__/session-persistence.test.js +0 -245
- package/dist/cli/services/__tests__/subagent-basic.test.js +0 -489
- package/dist/cli/services/__tests__/subagent-edge.test.js +0 -545
- package/dist/cli/services/__tests__/subagent-prompts.test.js +0 -558
- package/dist/cli/services/__tests__/subagent-worker-errors.test.js +0 -255
- package/dist/cli/services/__tests__/subagent-worker.test.js +0 -242
- package/dist/cli/services/__tests__/system-prompt.test.js +0 -210
- package/dist/cli/services/__tests__/team-lead-comms-messaging.test.js +0 -250
- package/dist/cli/services/__tests__/team-lead-comms-result.test.js +0 -232
- package/dist/cli/services/__tests__/team-lead-comms-stop.test.js +0 -344
- package/dist/cli/services/__tests__/team-lead-comms.test.js +0 -285
- package/dist/cli/services/__tests__/team-lead-create.test.js +0 -327
- package/dist/cli/services/__tests__/team-lead-run.test.js +0 -318
- package/dist/cli/services/__tests__/team-lead-stop.test.js +0 -199
- package/dist/cli/services/__tests__/team-state-comms.test.js +0 -240
- package/dist/cli/services/__tests__/team-state-core.test.js +0 -230
- package/dist/cli/services/__tests__/team-state-tasks-complete-fail-available.test.js +0 -224
- package/dist/cli/services/__tests__/team-state-tasks.test.js +0 -184
- package/dist/cli/services/__tests__/telemetry-ai-metadata.test.js +0 -116
- package/dist/cli/services/__tests__/telemetry.part2.test.js +0 -195
- package/dist/cli/services/__tests__/telemetry.test.js +0 -176
- package/dist/cli/services/agent-loop-iteration.d.ts +0 -13
- package/dist/cli/services/agent-loop-setup.d.ts +0 -32
- package/dist/cli/services/agent-worker-base-api.d.ts +0 -19
- package/dist/cli/services/agent-worker-base-helpers.d.ts +0 -27
- package/dist/cli/services/agent-worker-base-tools.d.ts +0 -16
- package/dist/cli/services/agent-worker-base-types.d.ts +0 -81
- package/dist/cli/services/background-agents.d.ts +0 -26
- package/dist/cli/services/background-processes-ops.d.ts +0 -24
- package/dist/cli/services/background-tool-defs.d.ts +0 -50
- package/dist/cli/services/config-modules-model.test.js +0 -133
- package/dist/cli/services/config-modules-permission.test.js +0 -85
- package/dist/cli/services/config-modules-permissions.test.js +0 -85
- package/dist/cli/services/config-modules-session.test.js +0 -297
- package/dist/cli/services/format-server-response-columns.test.js +0 -265
- package/dist/cli/services/format-server-response-fallback.test.js +0 -65
- package/dist/cli/services/format-server-response-primitives-basic.test.js +0 -261
- package/dist/cli/services/format-server-response-primitives-nested.test.js +0 -188
- package/dist/cli/services/format-server-response-primitives.test.js +0 -300
- package/dist/cli/services/format-server-response-realworld.test.js +0 -248
- package/dist/cli/services/format-server-response-values.test.js +0 -247
- package/dist/cli/services/hooks-runners.test.js +0 -184
- package/dist/cli/services/hooks.glob-load.test.js +0 -233
- package/dist/cli/services/hooks.run-hooks.test.js +0 -184
- package/dist/cli/services/hooks.test.js +0 -233
- package/dist/cli/services/ink-incremental.d.ts +0 -19
- package/dist/cli/services/ink-incremental.js +0 -59
- package/dist/cli/services/ink-incremental.js.map +0 -1
- package/dist/cli/services/ink-resize-fix.d.ts +0 -18
- package/dist/cli/services/ink-resize-fix.js +0 -76
- package/dist/cli/services/ink-resize-fix.js.map +0 -1
- package/dist/cli/services/ink-sync-output.d.ts +0 -12
- package/dist/cli/services/ink-sync-output.js +0 -16
- package/dist/cli/services/ink-sync-output.js.map +0 -1
- package/dist/cli/services/interactive-tool-defs.d.ts +0 -80
- package/dist/cli/services/local-tools-definitions.d.ts +0 -6
- package/dist/cli/services/local-tools-files.test.js +0 -256
- package/dist/cli/services/local-tools-read-many.d.ts +0 -6
- package/dist/cli/services/model-router.test.js +0 -245
- package/dist/cli/services/rewind-rewindTo.test.js +0 -202
- package/dist/cli/services/rewind.test.js +0 -175
- package/dist/cli/services/sandbox.test.js +0 -198
- package/dist/cli/services/subagent-execution.d.ts +0 -12
- package/dist/cli/services/team-lead-auto.d.ts +0 -11
- package/dist/cli/services/team-lead-execution.d.ts +0 -28
- package/dist/cli/services/teammate-loop.js +0 -557
- package/dist/cli/services/teammate-loop.js.map +0 -1
- package/dist/cli/services/tools/__tests__/agent-tools-tasks-teams.test.js +0 -250
- package/dist/cli/services/tools/__tests__/agent-tools-teams.test.js +0 -200
- package/dist/cli/services/tools/__tests__/agent-tools.test.js +0 -340
- package/dist/cli/services/tools/__tests__/file-ops-cache.test.js +0 -152
- package/dist/cli/services/tools/__tests__/file-ops-notebook.test.js +0 -249
- package/dist/cli/services/tools/__tests__/file-ops-read.test.js +0 -261
- package/dist/cli/services/tools/__tests__/file-ops-write.test.js +0 -292
- package/dist/cli/services/tools/__tests__/search-tools-rg.test.js +0 -92
- package/dist/cli/services/tools/__tests__/search-tools.part2.test.js +0 -174
- package/dist/cli/services/tools/__tests__/search-tools.test.js +0 -227
- package/dist/cli/services/tools/__tests__/shell-exec-allowed-core.test.js +0 -163
- package/dist/cli/services/tools/__tests__/shell-exec-allowed-extended.test.js +0 -220
- package/dist/cli/services/tools/__tests__/shell-exec-allowed.part2.test.js +0 -215
- package/dist/cli/services/tools/__tests__/shell-exec-allowed.test.js +0 -154
- package/dist/cli/services/tools/__tests__/shell-exec-blocked.test.js +0 -132
- package/dist/cli/services/tools/__tests__/shell-exec-execution.test.js +0 -245
- package/dist/cli/services/tools/__tests__/task-manager-create.test.js +0 -110
- package/dist/cli/services/tools/__tests__/task-manager-crud.test.js +0 -339
- package/dist/cli/services/tools/__tests__/task-manager-list-get.test.js +0 -343
- package/dist/cli/services/tools/__tests__/task-manager-query.test.js +0 -346
- package/dist/cli/services/tools/__tests__/task-manager-routing.test.js +0 -58
- package/dist/cli/services/tools/__tests__/task-manager-update.test.js +0 -224
- package/dist/cli/services/tools/__tests__/task-manager.test.js +0 -159
- package/dist/cli/services/tools/__tests__/web-tools-html-search.test.js +0 -227
- package/dist/cli/services/tools/__tests__/web-tools.test.js +0 -285
- package/dist/cli/services/tools/shell-exec.test.js +0 -148
- package/dist/cli/shared/SharedTick.d.ts +0 -10
- package/dist/cli/shared/__tests__/markdown.test.js +0 -188
- package/dist/local-agent/__tests__/connection-disconnect.test.js +0 -201
- package/dist/local-agent/__tests__/connection-lifecycle.test.js +0 -289
- package/dist/local-agent/__tests__/connection-msghandling.test.js +0 -311
- package/dist/local-agent/__tests__/connection-reconnect.test.js +0 -230
- package/dist/local-agent/__tests__/connection-toolexec.test.js +0 -253
- package/dist/local-agent/__tests__/discovery.test.js +0 -328
- package/dist/local-agent/__tests__/executor-background.test.js +0 -219
- package/dist/local-agent/__tests__/executor-exec.test.js +0 -221
- package/dist/local-agent/__tests__/executor-jobs-sessions.test.js +0 -220
- package/dist/local-agent/__tests__/executor-system-info.test.js +0 -133
- package/dist/local-agent/__tests__/executor-systeminfo.test.js +0 -109
- package/dist/local-agent/__tests__/executor.test.js +0 -235
- package/dist/local-agent/__tests__/index.test.js +0 -139
- package/dist/node/__tests__/cli-channels.test.js +0 -293
- package/dist/node/__tests__/cli-config-edge.test.js +0 -154
- package/dist/node/__tests__/cli-config.test.js +0 -215
- package/dist/node/__tests__/config.test.js +0 -292
- package/dist/node/__tests__/runtime-heartbeat.test.js +0 -153
- package/dist/node/__tests__/runtime-lifecycle-init.test.js +0 -263
- package/dist/node/__tests__/runtime-lifecycle-stats.test.js +0 -180
- package/dist/node/__tests__/runtime-lifecycle.test.js +0 -305
- package/dist/node/__tests__/runtime-relay.test.js +0 -341
- package/dist/node/adapters/__tests__/base.test.js +0 -286
- package/dist/node/adapters/__tests__/discord.test.js +0 -284
- package/dist/node/adapters/__tests__/email-send.test.js +0 -295
- package/dist/node/adapters/__tests__/email.inbound-send.test.js +0 -217
- package/dist/node/adapters/__tests__/email.lifecycle.test.js +0 -211
- package/dist/node/adapters/__tests__/email.test.js +0 -290
- package/dist/node/adapters/__tests__/email.webhook-send.test.js +0 -251
- package/dist/node/adapters/__tests__/imessage-filter.test.js +0 -183
- package/dist/node/adapters/__tests__/imessage-lifecycle.test.js +0 -215
- package/dist/node/adapters/__tests__/imessage-send-restart.test.js +0 -227
- package/dist/node/adapters/__tests__/slack.part2.test.js +0 -135
- package/dist/node/adapters/__tests__/slack.test.js +0 -241
- package/dist/node/adapters/__tests__/sms-extras.test.js +0 -108
- package/dist/node/adapters/__tests__/sms-lifecycle.test.js +0 -203
- package/dist/node/adapters/__tests__/sms-messaging.test.js +0 -266
- package/dist/node/adapters/__tests__/sms.part2.test.js +0 -174
- package/dist/node/adapters/__tests__/sms.test.js +0 -253
- package/dist/node/adapters/__tests__/telegram-polling.test.js +0 -256
- package/dist/node/adapters/__tests__/telegram-send.test.js +0 -166
- package/dist/node/adapters/__tests__/webchat-inbound.test.js +0 -188
- package/dist/node/adapters/__tests__/webchat-outbound.test.js +0 -178
- package/dist/node/adapters/__tests__/whatsapp-inbound.test.js +0 -200
- package/dist/node/adapters/__tests__/whatsapp-send.test.js +0 -212
- package/dist/node/adapters/__tests__/whatsapp.test.js +0 -280
- package/dist/server/__tests__/gateway-fast-fail.test.js +0 -160
- package/dist/server/__tests__/local-agent-gateway.test.js +0 -186
- package/dist/server/__tests__/proxy-handlers-delegation.test.js +0 -240
- package/dist/server/__tests__/proxy-handlers-validation.test.js +0 -211
- package/dist/server/__tests__/proxy-handlers.part2.test.js +0 -240
- package/dist/server/__tests__/proxy-handlers.test.js +0 -213
- package/dist/server/__tests__/strip-base64-e2e.test.js +0 -303
- package/dist/server/__tests__/strip-base64.test.js +0 -256
- package/dist/server/__tests__/tool-router-agent-tools.test.js +0 -324
- package/dist/server/__tests__/tool-router-execute-core.test.js +0 -357
- package/dist/server/__tests__/tool-router-execute-permissions.test.js +0 -332
- package/dist/server/__tests__/tool-router-execute.test.js +0 -348
- package/dist/server/__tests__/tool-router-load.test.js +0 -432
- package/dist/server/__tests__/tool-router-permissions.test.js +0 -359
- package/dist/server/__tests__/tool-router-registry-cache.test.js +0 -383
- package/dist/server/__tests__/tool-router-registry-handlers.test.js +0 -272
- package/dist/server/__tests__/tool-router-registry.test.js +0 -331
- package/dist/server/__tests__/validation-inventory.test.js +0 -250
- package/dist/server/__tests__/validation-misc.test.js +0 -243
- package/dist/server/__tests__/validation-supply-chain.test.js +0 -188
- package/dist/server/__tests__/worker.test.js +0 -265
- package/dist/server/handlers/__tests__/conversation-lock.test.js +0 -117
- package/dist/server/handlers/__tests__/e2e/auth-cross-platform-login.e2e.test.js +0 -268
- package/dist/server/handlers/__tests__/e2e/auth-cross-platform-tokens.e2e.test.js +0 -264
- package/dist/server/handlers/__tests__/e2e/email-pipeline-send.e2e.test.js +0 -214
- package/dist/server/handlers/__tests__/e2e/email-pipeline-threads.e2e.test.js +0 -168
- package/dist/server/handlers/__tests__/e2e/error-logging-pipeline-dedup.e2e.test.js +0 -229
- package/dist/server/handlers/__tests__/e2e/error-logging-pipeline.e2e.test.js +0 -239
- package/dist/server/handlers/__tests__/e2e/error-logging-rate-limit.e2e.test.js +0 -150
- package/dist/server/handlers/__tests__/e2e/inventory-sync-guards.e2e.test.js +0 -177
- package/dist/server/handlers/__tests__/e2e/inventory-sync.e2e.test.js +0 -228
- package/dist/server/handlers/__tests__/e2e/inventory-sync.part2.e2e.test.js +0 -188
- package/dist/server/handlers/__tests__/e2e/order-lifecycle-fulfillment.e2e.test.js +0 -295
- package/dist/server/handlers/__tests__/e2e/order-lifecycle.e2e.test.js +0 -277
- package/dist/server/handlers/__tests__/e2e/order-lifecycle.fulfillment.e2e.test.js +0 -307
- package/dist/server/handlers/__tests__/e2e/order-lifecycle.setup.e2e.test.js +0 -177
- package/dist/server/handlers/__tests__/e2e/storefront-checkout-cart.e2e.test.js +0 -255
- package/dist/server/handlers/__tests__/e2e/storefront-checkout-webhook.e2e.test.js +0 -231
- package/dist/server/handlers/__tests__/e2e/workflow-execution-failures.e2e.test.js +0 -235
- package/dist/server/handlers/__tests__/e2e/workflow-execution.e2e.test.js +0 -294
- package/dist/server/handlers/__tests__/e2e/workflow-security.e2e.test.js +0 -311
- package/dist/server/handlers/__tests__/e2e/workflow-security.part2.e2e.test.js +0 -267
- package/dist/server/handlers/__tests__/workflow-cache.test.js +0 -237
- package/dist/server/handlers/analytics-errors-edge.test.js +0 -173
- package/dist/server/handlers/analytics.test.js +0 -280
- package/dist/server/handlers/api-docs-examples-ext.d.ts +0 -9
- package/dist/server/handlers/api-docs-examples-ext.js +0 -278
- package/dist/server/handlers/api-docs-examples-ext.js.map +0 -1
- package/dist/server/handlers/api-docs-examples.d.ts +0 -8
- package/dist/server/handlers/api-docs-examples.js +0 -221
- package/dist/server/handlers/api-docs-examples.js.map +0 -1
- package/dist/server/handlers/api-docs-sections-ext.d.ts +0 -2
- package/dist/server/handlers/api-docs-sections-ext.js +0 -497
- package/dist/server/handlers/api-docs-sections-ext.js.map +0 -1
- package/dist/server/handlers/api-docs-sections.d.ts +0 -21
- package/dist/server/handlers/api-docs-sections.js +0 -293
- package/dist/server/handlers/api-docs-sections.js.map +0 -1
- package/dist/server/handlers/api-keys.part2.test.js +0 -157
- package/dist/server/handlers/api-keys.test.js +0 -161
- package/dist/server/handlers/billing-routes.test.js +0 -123
- package/dist/server/handlers/billing.test.js +0 -215
- package/dist/server/handlers/browser-actions-errors.test.js +0 -94
- package/dist/server/handlers/browser-actions.part2.test.js +0 -190
- package/dist/server/handlers/browser-actions.test.js +0 -190
- package/dist/server/handlers/browser-validation.test.js +0 -257
- package/dist/server/handlers/catalog.test.js +0 -297
- package/dist/server/handlers/comms.test.js +0 -289
- package/dist/server/handlers/creations-advanced-collections.test.js +0 -214
- package/dist/server/handlers/creations-advanced-generate.test.js +0 -142
- package/dist/server/handlers/creations-advanced.test.js +0 -171
- package/dist/server/handlers/creations-collections-preview.test.js +0 -214
- package/dist/server/handlers/creations-crud.test.js +0 -260
- package/dist/server/handlers/creations-mutations.test.js +0 -197
- package/dist/server/handlers/crm.test.js +0 -179
- package/dist/server/handlers/discovery-advertise.test.js +0 -185
- package/dist/server/handlers/discovery-scan.test.js +0 -233
- package/dist/server/handlers/embeddings-embed-search.test.js +0 -196
- package/dist/server/handlers/embeddings-index-delete-stats.test.js +0 -140
- package/dist/server/handlers/embeddings-search.test.js +0 -221
- package/dist/server/handlers/embeddings.test.js +0 -137
- package/dist/server/handlers/enrichment-breach.d.ts +0 -8
- package/dist/server/handlers/enrichment-breach.js +0 -266
- package/dist/server/handlers/enrichment-breach.js.map +0 -1
- package/dist/server/handlers/enrichment-data.d.ts +0 -13
- package/dist/server/handlers/enrichment-data.js +0 -145
- package/dist/server/handlers/enrichment-data.js.map +0 -1
- package/dist/server/handlers/enrichment-mutations.test.js +0 -240
- package/dist/server/handlers/enrichment-queries.test.js +0 -181
- package/dist/server/handlers/enrichment-validation.test.js +0 -177
- package/dist/server/handlers/enrichment-writes.d.ts +0 -16
- package/dist/server/handlers/enrichment-writes.js +0 -226
- package/dist/server/handlers/enrichment-writes.js.map +0 -1
- package/dist/server/handlers/image-gen.test.js +0 -205
- package/dist/server/handlers/inventory.test.js +0 -380
- package/dist/server/handlers/kali-background.test.js +0 -222
- package/dist/server/handlers/kali-errors.test.js +0 -92
- package/dist/server/handlers/kali-validation.test.js +0 -234
- package/dist/server/handlers/llm-providers-actions.test.js +0 -220
- package/dist/server/handlers/llm-providers-anthropic.test.js +0 -239
- package/dist/server/handlers/llm-providers-failover.test.js +0 -232
- package/dist/server/handlers/llm-providers-providers.test.js +0 -300
- package/dist/server/handlers/llm-providers-validation.test.js +0 -239
- package/dist/server/handlers/local-agent-tools.test.js +0 -224
- package/dist/server/handlers/local-agent.test.js +0 -198
- package/dist/server/handlers/local-agent.tools-status.test.js +0 -204
- package/dist/server/handlers/local-agent.validation-exec.test.js +0 -182
- package/dist/server/handlers/meta-ads-audience-rules.test.js +0 -243
- package/dist/server/handlers/meta-ads-audience-targeting.test.js +0 -205
- package/dist/server/handlers/meta-ads-audiences-targeting.test.js +0 -383
- package/dist/server/handlers/meta-ads-crud-ads.test.js +0 -136
- package/dist/server/handlers/meta-ads-crud-campaigns.test.js +0 -189
- package/dist/server/handlers/meta-ads-crud-create.test.js +0 -303
- package/dist/server/handlers/meta-ads-crud-list-update.test.js +0 -259
- package/dist/server/handlers/meta-ads-delete-publish-sync.test.js +0 -282
- package/dist/server/handlers/meta-ads-insights.test.js +0 -80
- package/dist/server/handlers/meta-ads-list-get.test.js +0 -237
- package/dist/server/handlers/meta-ads-publish-delete.test.js +0 -254
- package/dist/server/handlers/meta-ads-publish-helpers.js +0 -117
- package/dist/server/handlers/meta-ads-publish-helpers.js.map +0 -1
- package/dist/server/handlers/meta-ads-publish-sync.test.js +0 -205
- package/dist/server/handlers/meta-ads-publish.test.js +0 -254
- package/dist/server/handlers/meta-ads-sync-insights.test.js +0 -184
- package/dist/server/handlers/meta-ads-update.test.js +0 -117
- package/dist/server/handlers/nodes-channels.test.js +0 -413
- package/dist/server/handlers/nodes-events.test.js +0 -131
- package/dist/server/handlers/nodes-list-delete.test.js +0 -171
- package/dist/server/handlers/nodes-messages-delivery.test.js +0 -208
- package/dist/server/handlers/nodes-messages.test.js +0 -211
- package/dist/server/handlers/nodes-register.test.js +0 -277
- package/dist/server/handlers/nodes.test.js +0 -353
- package/dist/server/handlers/operations.test.js +0 -136
- package/dist/server/handlers/platform-telemetry.test.js +0 -200
- package/dist/server/handlers/platform-websearch.test.js +0 -160
- package/dist/server/handlers/storefront.test.js +0 -329
- package/dist/server/handlers/supply-chain.test.js +0 -347
- package/dist/server/handlers/transcription.test.js +0 -118
- package/dist/server/handlers/video-gen-veo.js +0 -114
- package/dist/server/handlers/video-gen-veo.js.map +0 -1
- package/dist/server/handlers/video-gen.test.js +0 -146
- package/dist/server/handlers/voice.test.js +0 -153
- package/dist/server/handlers/workflow-steps.test.js +0 -330
- package/dist/server/handlers/workflows-extras.test.js +0 -65
- package/dist/server/handlers/workflows.part2.test.js +0 -170
- package/dist/server/handlers/workflows.test.js +0 -281
- package/dist/server/lib/__tests__/batch-client-conversion-jsonl.test.js +0 -171
- package/dist/server/lib/__tests__/batch-client-polling.test.js +0 -292
- package/dist/server/lib/__tests__/batch-client-queue.test.js +0 -270
- package/dist/server/lib/__tests__/clickhouse-buffer.test.js +0 -236
- package/dist/server/lib/__tests__/code-worker-edge-cases.test.js +0 -118
- package/dist/server/lib/__tests__/code-worker-pool-execute.test.js +0 -193
- package/dist/server/lib/__tests__/code-worker-pool-execution.test.js +0 -165
- package/dist/server/lib/__tests__/code-worker-pool-init.test.js +0 -131
- package/dist/server/lib/__tests__/code-worker-pool.test.js +0 -194
- package/dist/server/lib/__tests__/code-worker-sandbox-ops.test.js +0 -123
- package/dist/server/lib/__tests__/code-worker-sandbox.test.js +0 -217
- package/dist/server/lib/__tests__/code-worker.test.js +0 -179
- package/dist/server/lib/__tests__/compaction-service-generate.test.js +0 -229
- package/dist/server/lib/__tests__/compaction-service.test.js +0 -319
- package/dist/server/lib/__tests__/otel.test.js +0 -146
- package/dist/server/lib/__tests__/prompt-sanitizer-validation.test.js +0 -165
- package/dist/server/lib/__tests__/prompt-sanitizer.sanitize.test.js +0 -343
- package/dist/server/lib/__tests__/prompt-sanitizer.test.js +0 -328
- package/dist/server/lib/__tests__/prompt-sanitizer.validate-tool.test.js +0 -145
- package/dist/server/lib/__tests__/provider-capabilities.test.js +0 -263
- package/dist/server/lib/__tests__/provider-failover-routing.test.js +0 -145
- package/dist/server/lib/__tests__/provider-failover-state.test.js +0 -131
- package/dist/server/lib/__tests__/rate-limiter-budgets.test.js +0 -216
- package/dist/server/lib/__tests__/rate-limiter.budgets-tools.test.js +0 -113
- package/dist/server/lib/__tests__/rate-limiter.check-request.test.js +0 -141
- package/dist/server/lib/__tests__/rate-limiter.stats-lifecycle.test.js +0 -135
- package/dist/server/lib/__tests__/rate-limiter.test.js +0 -207
- package/dist/server/lib/__tests__/server-agent-loop-abort-conditions.test.js +0 -544
- package/dist/server/lib/__tests__/server-agent-loop-abort.part2.test.js +0 -504
- package/dist/server/lib/__tests__/server-agent-loop-abort.test.js +0 -396
- package/dist/server/lib/__tests__/server-agent-loop-compaction.test.js +0 -397
- package/dist/server/lib/__tests__/server-agent-loop-failover.test.js +0 -356
- package/dist/server/lib/__tests__/server-agent-loop-features-caching.test.js +0 -519
- package/dist/server/lib/__tests__/server-agent-loop-features-edges.test.js +0 -512
- package/dist/server/lib/__tests__/server-subagent-bailout.test.js +0 -194
- package/dist/server/lib/__tests__/server-subagent-basics.test.js +0 -348
- package/dist/server/lib/__tests__/server-subagent-errors-abort.test.js +0 -319
- package/dist/server/lib/__tests__/server-subagent-errors-progress.test.js +0 -253
- package/dist/server/lib/__tests__/server-subagent-errors.part2.test.js +0 -253
- package/dist/server/lib/__tests__/server-subagent-errors.test.js +0 -319
- package/dist/server/lib/__tests__/session-checkpoint-load.test.js +0 -275
- package/dist/server/lib/__tests__/session-checkpoint-save.test.js +0 -159
- package/dist/server/lib/__tests__/ssrf-guard.test.js +0 -93
- package/dist/server/lib/__tests__/supabase-client.test.js +0 -111
- package/dist/server/lib/__tests__/template-resolver.test.js +0 -317
- package/dist/server/lib/__tests__/utils-timeout.test.js +0 -49
- package/dist/server/lib/__tests__/utils.test.js +0 -322
- package/dist/server/providers/__tests__/anthropic-adapter.test.js +0 -228
- package/dist/server/providers/__tests__/anthropic-betas-toolchoice.test.js +0 -257
- package/dist/server/providers/__tests__/anthropic-errors.test.js +0 -262
- package/dist/server/providers/__tests__/anthropic-stream-core.test.js +0 -275
- package/dist/server/providers/__tests__/anthropic-streaming-betas.test.js +0 -247
- package/dist/server/providers/__tests__/anthropic-streaming-core.test.js +0 -275
- package/dist/server/providers/__tests__/bedrock-config.test.js +0 -177
- package/dist/server/providers/__tests__/bedrock-stream-behavior-streaming.test.js +0 -272
- package/dist/server/providers/__tests__/bedrock-stream-behavior-toolchoice.test.js +0 -214
- package/dist/server/providers/__tests__/bedrock-stream-behavior.part2.test.js +0 -165
- package/dist/server/providers/__tests__/bedrock-stream-behavior.test.js +0 -309
- package/dist/server/providers/__tests__/bedrock-stream-body-credentials.test.js +0 -170
- package/dist/server/providers/__tests__/bedrock-stream-body-extras.test.js +0 -183
- package/dist/server/providers/__tests__/bedrock-stream-body-request.test.js +0 -305
- package/dist/server/providers/__tests__/bedrock-stream-body.part2.test.js +0 -305
- package/dist/server/providers/__tests__/bedrock-stream-body.test.js +0 -175
- package/dist/server/providers/__tests__/bedrock-stream-errors.test.js +0 -165
- package/dist/server/providers/__tests__/gemini-config-methods.test.js +0 -182
- package/dist/server/providers/__tests__/gemini-config-streaming.test.js +0 -257
- package/dist/server/providers/__tests__/gemini-conversion-messages.test.js +0 -247
- package/dist/server/providers/__tests__/gemini-conversion-schema.test.js +0 -365
- package/dist/server/providers/__tests__/gemini-tools-choice.test.js +0 -221
- package/dist/server/providers/__tests__/gemini-tools-fn.test.js +0 -252
- package/dist/server/providers/__tests__/openai-config.test.js +0 -194
- package/dist/server/providers/__tests__/openai-conversion.test.js +0 -276
- package/dist/server/providers/__tests__/openai-messages.test.js +0 -261
- package/dist/server/providers/__tests__/openai-streaming.test.js +0 -394
- package/dist/server/providers/__tests__/openai-tools-cache.test.js +0 -227
- package/dist/server/providers/__tests__/registry.test.js +0 -183
- package/dist/server/providers/__tests__/shared.test.js +0 -297
- package/dist/shared/agent-core-config.test.js +0 -132
- package/dist/shared/agent-core-context-thinking.test.js +0 -293
- package/dist/shared/agent-core-loop-calls.test.js +0 -174
- package/dist/shared/agent-core-loop-detector-bail.test.js +0 -201
- package/dist/shared/agent-core-loop-detector.test.js +0 -195
- package/dist/shared/agent-core-loop-errors.test.js +0 -258
- package/dist/shared/agent-core-pricing.test.js +0 -191
- package/dist/shared/agent-core-sanitize-retry.test.js +0 -129
- package/dist/shared/api-client-build-request.test.js +0 -228
- package/dist/shared/api-client-build-system-caching.test.js +0 -107
- package/dist/shared/api-client-build.test.js +0 -223
- package/dist/shared/api-client-config.d.ts +0 -21
- package/dist/shared/api-client-helpers.d.ts +0 -57
- package/dist/shared/api-client-helpers.test.js +0 -261
- package/dist/shared/api-client-proxy-happy.test.js +0 -255
- package/dist/shared/api-client-proxy-retry.test.js +0 -307
- package/dist/shared/api-client-proxy.d.ts +0 -26
- package/dist/shared/api-client-proxy.test.js +0 -255
- package/dist/shared/api-client-retry.test.js +0 -307
- package/dist/shared/api-client-system-trimming.test.js +0 -261
- package/dist/shared/api-client-trimming.d.ts +0 -36
- package/dist/shared/api-client.test.js +0 -228
- package/dist/shared/compaction-thinking.test.js +0 -315
- package/dist/shared/compaction-trimming.test.js +0 -223
- package/dist/shared/sse-parser-callbacks.test.js +0 -422
- package/dist/shared/sse-parser-collect.test.js +0 -252
- package/dist/shared/sse-parser-e2e.test.js +0 -558
- package/dist/shared/sse-parser-parse.test.js +0 -253
- package/dist/shared/tool-dispatch-advanced-batch-build.test.js +0 -405
- package/dist/shared/tool-dispatch-advanced.test.js +0 -320
- package/dist/shared/tool-dispatch-basic.test.js +0 -278
- package/dist/shared/tool-dispatch-content.d.ts +0 -14
- package/dist/shared/tool-dispatch-parallel.test.js +0 -378
- package/dist/webchat/__tests__/widget-messaging.test.js +0 -323
- package/dist/webchat/__tests__/widget.test.js +0 -273
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
|
-
|
|
3
|
-
// ============================================================================
|
|
4
|
-
// Mocks
|
|
5
|
-
// ============================================================================
|
|
6
|
-
|
|
7
|
-
vi.mock("fs", () => ({
|
|
8
|
-
existsSync: vi.fn(path => {
|
|
9
|
-
if (path === "/nonexistent") return false;
|
|
10
|
-
return true;
|
|
11
|
-
})
|
|
12
|
-
}));
|
|
13
|
-
vi.mock("child_process", () => ({
|
|
14
|
-
execSync: vi.fn(cmd => {
|
|
15
|
-
// Simulate find results for globSearch fallback
|
|
16
|
-
if (cmd.includes("find") && cmd.includes("-name '*.ts'")) {
|
|
17
|
-
return "/project/src/index.ts\n/project/src/utils.ts\n";
|
|
18
|
-
}
|
|
19
|
-
if (cmd.includes("find") && cmd.includes("-name '*.{ts,tsx}'")) {
|
|
20
|
-
return ""; // brace expansion handled differently
|
|
21
|
-
}
|
|
22
|
-
if (cmd.includes("find") && cmd.includes("No files found")) {
|
|
23
|
-
return "";
|
|
24
|
-
}
|
|
25
|
-
// Simulate grep results
|
|
26
|
-
if (cmd.includes("grep") && cmd.includes("-l")) {
|
|
27
|
-
return "/project/src/index.ts\n/project/src/utils.ts\n";
|
|
28
|
-
}
|
|
29
|
-
if (cmd.includes("grep") && cmd.includes("-c")) {
|
|
30
|
-
return "/project/src/index.ts:5\n/project/src/utils.ts:0\n";
|
|
31
|
-
}
|
|
32
|
-
if (cmd.includes("grep") && cmd.includes("-n")) {
|
|
33
|
-
return "/project/src/index.ts:10: const x = 1;\n/project/src/index.ts:20: const y = 2;\n";
|
|
34
|
-
}
|
|
35
|
-
if (cmd.includes("grep")) {
|
|
36
|
-
return "/project/src/index.ts\n";
|
|
37
|
-
}
|
|
38
|
-
return "";
|
|
39
|
-
})
|
|
40
|
-
}));
|
|
41
|
-
const mockRgAvailable = vi.fn(() => false);
|
|
42
|
-
const mockRgGlob = vi.fn(() => null);
|
|
43
|
-
const mockRgGrep = vi.fn(() => null);
|
|
44
|
-
vi.mock("../../ripgrep.js", () => ({
|
|
45
|
-
isRgAvailable: () => mockRgAvailable(),
|
|
46
|
-
rgGlob: opts => mockRgGlob(opts),
|
|
47
|
-
rgGrep: opts => mockRgGrep(opts)
|
|
48
|
-
}));
|
|
49
|
-
import { globSearch, grepSearch } from "../search-tools.js";
|
|
50
|
-
import { execSync } from "child_process";
|
|
51
|
-
beforeEach(() => {
|
|
52
|
-
vi.clearAllMocks();
|
|
53
|
-
mockRgAvailable.mockReturnValue(false);
|
|
54
|
-
mockRgGlob.mockReturnValue(null);
|
|
55
|
-
mockRgGrep.mockReturnValue(null);
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
// ============================================================================
|
|
59
|
-
// globSearch
|
|
60
|
-
// ============================================================================
|
|
61
|
-
|
|
62
|
-
describe("globSearch", () => {
|
|
63
|
-
it("returns error for nonexistent directory", () => {
|
|
64
|
-
const result = globSearch({
|
|
65
|
-
pattern: "*.ts",
|
|
66
|
-
path: "/nonexistent"
|
|
67
|
-
});
|
|
68
|
-
expect(result.success).toBe(false);
|
|
69
|
-
expect(result.output).toContain("Directory not found");
|
|
70
|
-
});
|
|
71
|
-
it("uses ripgrep when available", () => {
|
|
72
|
-
mockRgAvailable.mockReturnValue(true);
|
|
73
|
-
mockRgGlob.mockReturnValue("/project/src/index.ts\n/project/src/utils.ts");
|
|
74
|
-
const result = globSearch({
|
|
75
|
-
pattern: "*.ts",
|
|
76
|
-
path: "/project"
|
|
77
|
-
});
|
|
78
|
-
expect(result.success).toBe(true);
|
|
79
|
-
expect(result.output).toContain("2 files");
|
|
80
|
-
expect(mockRgGlob).toHaveBeenCalledWith(expect.objectContaining({
|
|
81
|
-
pattern: "*.ts",
|
|
82
|
-
path: "/project",
|
|
83
|
-
headLimit: 200
|
|
84
|
-
}));
|
|
85
|
-
});
|
|
86
|
-
it("returns 'No files found' when rg returns null", () => {
|
|
87
|
-
mockRgAvailable.mockReturnValue(true);
|
|
88
|
-
mockRgGlob.mockReturnValue(null);
|
|
89
|
-
const result = globSearch({
|
|
90
|
-
pattern: "*.xyz",
|
|
91
|
-
path: "/project"
|
|
92
|
-
});
|
|
93
|
-
expect(result.success).toBe(true);
|
|
94
|
-
expect(result.output).toBe("No files found");
|
|
95
|
-
});
|
|
96
|
-
it("falls back to find when rg is unavailable", () => {
|
|
97
|
-
mockRgAvailable.mockReturnValue(false);
|
|
98
|
-
const result = globSearch({
|
|
99
|
-
pattern: "*.ts",
|
|
100
|
-
path: "/project"
|
|
101
|
-
});
|
|
102
|
-
expect(result.success).toBe(true);
|
|
103
|
-
expect(result.output).toContain("files");
|
|
104
|
-
expect(execSync).toHaveBeenCalled();
|
|
105
|
-
});
|
|
106
|
-
it("falls back to find when rg throws", () => {
|
|
107
|
-
mockRgAvailable.mockReturnValue(true);
|
|
108
|
-
mockRgGlob.mockImplementation(() => {
|
|
109
|
-
throw new Error("rg failed");
|
|
110
|
-
});
|
|
111
|
-
const result = globSearch({
|
|
112
|
-
pattern: "*.ts",
|
|
113
|
-
path: "/project"
|
|
114
|
-
});
|
|
115
|
-
expect(result.success).toBe(true);
|
|
116
|
-
// Should have fallen through to find
|
|
117
|
-
expect(execSync).toHaveBeenCalled();
|
|
118
|
-
});
|
|
119
|
-
it("uses cwd as default path", () => {
|
|
120
|
-
mockRgAvailable.mockReturnValue(false);
|
|
121
|
-
const result = globSearch({
|
|
122
|
-
pattern: "*.ts"
|
|
123
|
-
});
|
|
124
|
-
expect(result.success).toBe(true);
|
|
125
|
-
});
|
|
126
|
-
it("extracts directory part from pattern with slashes", () => {
|
|
127
|
-
mockRgAvailable.mockReturnValue(false);
|
|
128
|
-
globSearch({
|
|
129
|
-
pattern: "src/**/*.ts",
|
|
130
|
-
path: "/project"
|
|
131
|
-
});
|
|
132
|
-
// Should have called execSync with a find command
|
|
133
|
-
expect(execSync).toHaveBeenCalled();
|
|
134
|
-
const cmd = vi.mocked(execSync).mock.calls[0][0];
|
|
135
|
-
expect(cmd).toContain("find");
|
|
136
|
-
});
|
|
137
|
-
it("handles brace expansion patterns in fallback mode", () => {
|
|
138
|
-
mockRgAvailable.mockReturnValue(false);
|
|
139
|
-
vi.mocked(execSync).mockReturnValueOnce("/project/a.ts\n/project/b.tsx\n");
|
|
140
|
-
const result = globSearch({
|
|
141
|
-
pattern: "*.{ts,tsx}",
|
|
142
|
-
path: "/project"
|
|
143
|
-
});
|
|
144
|
-
expect(result.success).toBe(true);
|
|
145
|
-
// The find command should have OR conditions for brace expansion
|
|
146
|
-
const cmd = vi.mocked(execSync).mock.calls[0][0];
|
|
147
|
-
expect(cmd).toContain("-o");
|
|
148
|
-
});
|
|
149
|
-
it("returns no files for empty find result", () => {
|
|
150
|
-
mockRgAvailable.mockReturnValue(false);
|
|
151
|
-
vi.mocked(execSync).mockReturnValueOnce("");
|
|
152
|
-
const result = globSearch({
|
|
153
|
-
pattern: "*.xyz",
|
|
154
|
-
path: "/project"
|
|
155
|
-
});
|
|
156
|
-
expect(result.success).toBe(true);
|
|
157
|
-
expect(result.output).toContain("No files found");
|
|
158
|
-
});
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
// ============================================================================
|
|
162
|
-
// grepSearch
|
|
163
|
-
// ============================================================================
|
|
164
|
-
|
|
165
|
-
describe("grepSearch", () => {
|
|
166
|
-
it("uses ripgrep when available", () => {
|
|
167
|
-
mockRgAvailable.mockReturnValue(true);
|
|
168
|
-
mockRgGrep.mockReturnValue("/project/src/index.ts\n/project/src/utils.ts");
|
|
169
|
-
const result = grepSearch({
|
|
170
|
-
pattern: "import",
|
|
171
|
-
path: "/project"
|
|
172
|
-
});
|
|
173
|
-
expect(result.success).toBe(true);
|
|
174
|
-
expect(result.output).toContain("index.ts");
|
|
175
|
-
expect(mockRgGrep).toHaveBeenCalledWith(expect.objectContaining({
|
|
176
|
-
pattern: "import",
|
|
177
|
-
path: "/project"
|
|
178
|
-
}));
|
|
179
|
-
});
|
|
180
|
-
it("returns 'No matches found' when rg returns null", () => {
|
|
181
|
-
mockRgAvailable.mockReturnValue(true);
|
|
182
|
-
mockRgGrep.mockReturnValue(null);
|
|
183
|
-
const result = grepSearch({
|
|
184
|
-
pattern: "nonexistent_symbol",
|
|
185
|
-
path: "/project"
|
|
186
|
-
});
|
|
187
|
-
expect(result.success).toBe(true);
|
|
188
|
-
expect(result.output).toBe("No matches found");
|
|
189
|
-
});
|
|
190
|
-
it("filters zero-count entries in count mode", () => {
|
|
191
|
-
mockRgAvailable.mockReturnValue(true);
|
|
192
|
-
mockRgGrep.mockReturnValue("/project/a.ts:5\n/project/b.ts:0\n/project/c.ts:3");
|
|
193
|
-
const result = grepSearch({
|
|
194
|
-
pattern: "test",
|
|
195
|
-
path: "/project",
|
|
196
|
-
output_mode: "count"
|
|
197
|
-
});
|
|
198
|
-
expect(result.success).toBe(true);
|
|
199
|
-
expect(result.output).toContain("/project/a.ts:5");
|
|
200
|
-
expect(result.output).toContain("/project/c.ts:3");
|
|
201
|
-
expect(result.output).not.toContain(":0");
|
|
202
|
-
});
|
|
203
|
-
it("applies offset to results", () => {
|
|
204
|
-
mockRgAvailable.mockReturnValue(true);
|
|
205
|
-
mockRgGrep.mockReturnValue("line1\nline2\nline3\nline4\nline5");
|
|
206
|
-
const result = grepSearch({
|
|
207
|
-
pattern: "test",
|
|
208
|
-
path: "/project",
|
|
209
|
-
offset: 2
|
|
210
|
-
});
|
|
211
|
-
expect(result.success).toBe(true);
|
|
212
|
-
expect(result.output).toBe("line3\nline4\nline5");
|
|
213
|
-
});
|
|
214
|
-
it("falls back to system grep when rg unavailable", () => {
|
|
215
|
-
mockRgAvailable.mockReturnValue(false);
|
|
216
|
-
const result = grepSearch({
|
|
217
|
-
pattern: "import",
|
|
218
|
-
path: "/project",
|
|
219
|
-
output_mode: "files_with_matches"
|
|
220
|
-
});
|
|
221
|
-
expect(result.success).toBe(true);
|
|
222
|
-
expect(execSync).toHaveBeenCalled();
|
|
223
|
-
const cmd = vi.mocked(execSync).mock.calls[0][0];
|
|
224
|
-
expect(cmd).toContain("grep");
|
|
225
|
-
expect(cmd).toContain("-l");
|
|
226
|
-
});
|
|
227
|
-
});
|
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from "vitest";
|
|
2
|
-
|
|
3
|
-
// Mock child_process.spawn so commands are NOT actually executed.
|
|
4
|
-
vi.mock("child_process", async () => {
|
|
5
|
-
const actual = await vi.importActual("child_process");
|
|
6
|
-
return {
|
|
7
|
-
...actual,
|
|
8
|
-
spawn: vi.fn(cmd => {
|
|
9
|
-
const {
|
|
10
|
-
EventEmitter
|
|
11
|
-
} = require("events");
|
|
12
|
-
const {
|
|
13
|
-
Readable
|
|
14
|
-
} = require("stream");
|
|
15
|
-
const child = new EventEmitter();
|
|
16
|
-
const echoMatch = typeof cmd === "string" ? cmd.match(/^echo\s+(.*)/) : null;
|
|
17
|
-
let pushed = false;
|
|
18
|
-
child.stdout = new Readable({
|
|
19
|
-
read() {
|
|
20
|
-
if (echoMatch && !pushed) {
|
|
21
|
-
pushed = true;
|
|
22
|
-
this.push(echoMatch[1] + "\n");
|
|
23
|
-
}
|
|
24
|
-
this.push(null);
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
child.stderr = new Readable({
|
|
28
|
-
read() {
|
|
29
|
-
this.push(null);
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
child.stdin = {
|
|
33
|
-
write: vi.fn(),
|
|
34
|
-
end: vi.fn()
|
|
35
|
-
};
|
|
36
|
-
child.pid = 99999;
|
|
37
|
-
child.kill = vi.fn();
|
|
38
|
-
setTimeout(() => child.emit("exit", 0), 5);
|
|
39
|
-
return child;
|
|
40
|
-
})
|
|
41
|
-
};
|
|
42
|
-
});
|
|
43
|
-
vi.mock("../../sandbox.js", () => ({
|
|
44
|
-
sandboxCommand: vi.fn((cmd, _cwd) => ({
|
|
45
|
-
wrapped: cmd,
|
|
46
|
-
profilePath: null
|
|
47
|
-
})),
|
|
48
|
-
cleanupSandbox: vi.fn()
|
|
49
|
-
}));
|
|
50
|
-
vi.mock("../../background-processes.js", () => ({
|
|
51
|
-
spawnBackground: vi.fn(async () => ({
|
|
52
|
-
status: "running",
|
|
53
|
-
message: "Process started"
|
|
54
|
-
})),
|
|
55
|
-
readProcessOutput: vi.fn(_id => ({
|
|
56
|
-
status: "completed",
|
|
57
|
-
exitCode: 0,
|
|
58
|
-
newOutput: "output data",
|
|
59
|
-
newErrors: ""
|
|
60
|
-
})),
|
|
61
|
-
killProcess: vi.fn(() => ({
|
|
62
|
-
success: true,
|
|
63
|
-
message: "Process killed"
|
|
64
|
-
})),
|
|
65
|
-
listProcesses: vi.fn(() => [])
|
|
66
|
-
}));
|
|
67
|
-
vi.mock("../../agent-events.js", () => ({
|
|
68
|
-
getGlobalEmitter: vi.fn(() => ({
|
|
69
|
-
emitToolOutput: vi.fn()
|
|
70
|
-
}))
|
|
71
|
-
}));
|
|
72
|
-
vi.mock("../../debug-log.js", () => ({
|
|
73
|
-
debugLog: vi.fn()
|
|
74
|
-
}));
|
|
75
|
-
import { runCommand } from "../shell-exec.js";
|
|
76
|
-
async function isAllowed(command) {
|
|
77
|
-
const result = await runCommand({
|
|
78
|
-
command
|
|
79
|
-
});
|
|
80
|
-
return !result.output.includes("blocked for safety");
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// ============================================================================
|
|
84
|
-
// ALLOWED — file ops, chmod/chown, npm/Node, Python, git
|
|
85
|
-
// ============================================================================
|
|
86
|
-
|
|
87
|
-
describe("ALLOWED — core developer commands", () => {
|
|
88
|
-
describe("rm on specific paths (NOT root/home)", () => {
|
|
89
|
-
it("rm -rf node_modules", async () => expect(await isAllowed("rm -rf node_modules")).toBe(true));
|
|
90
|
-
it("rm -rf ./dist", async () => expect(await isAllowed("rm -rf ./dist")).toBe(true));
|
|
91
|
-
it("rm -rf /tmp/build", async () => expect(await isAllowed("rm -rf /tmp/build")).toBe(true));
|
|
92
|
-
it("rm -rf /Users/whale/project/node_modules", async () => expect(await isAllowed("rm -rf /Users/whale/project/node_modules")).toBe(true));
|
|
93
|
-
it("rm -rf ~/project/dist", async () => expect(await isAllowed("rm -rf ~/project/dist")).toBe(true));
|
|
94
|
-
it("rm -rf ~/Downloads/old-stuff", async () => expect(await isAllowed("rm -rf ~/Downloads/old-stuff")).toBe(true));
|
|
95
|
-
it("rm -rf ~/.npm-cache", async () => expect(await isAllowed("rm -rf ~/.npm-cache")).toBe(true));
|
|
96
|
-
it("rm -rf /var/tmp/cache", async () => expect(await isAllowed("rm -rf /var/tmp/cache")).toBe(true));
|
|
97
|
-
it("rm -f /tmp/lockfile", async () => expect(await isAllowed("rm -f /tmp/lockfile")).toBe(true));
|
|
98
|
-
it("rm file.txt", async () => expect(await isAllowed("rm file.txt")).toBe(true));
|
|
99
|
-
it("rm -r build/", async () => expect(await isAllowed("rm -r build/")).toBe(true));
|
|
100
|
-
it("rm -rf .next .turbo dist", async () => expect(await isAllowed("rm -rf .next .turbo dist")).toBe(true));
|
|
101
|
-
});
|
|
102
|
-
describe("chmod and chown", () => {
|
|
103
|
-
it("chmod 755 ./scripts/deploy.sh", async () => expect(await isAllowed("chmod 755 ./scripts/deploy.sh")).toBe(true));
|
|
104
|
-
it("chmod +x ./run.sh", async () => expect(await isAllowed("chmod +x ./run.sh")).toBe(true));
|
|
105
|
-
it("chmod -R 755 ./scripts", async () => expect(await isAllowed("chmod -R 755 ./scripts")).toBe(true));
|
|
106
|
-
it("chmod 777 /tmp/test", async () => expect(await isAllowed("chmod 777 /tmp/test")).toBe(true));
|
|
107
|
-
it("chmod -R 777 /tmp/test", async () => expect(await isAllowed("chmod -R 777 /tmp/test")).toBe(true));
|
|
108
|
-
it("chown -R $(whoami) ~/.npm", async () => expect(await isAllowed("chown -R $(whoami) ~/.npm")).toBe(true));
|
|
109
|
-
it("chown -R whale /Users/whale/.npm-cache", async () => expect(await isAllowed("chown -R whale /Users/whale/.npm-cache")).toBe(true));
|
|
110
|
-
it("chown -R whale:staff ./build", async () => expect(await isAllowed("chown -R whale:staff ./build")).toBe(true));
|
|
111
|
-
it("sudo chown -R $(whoami) ~/.npm", async () => expect(await isAllowed("sudo chown -R $(whoami) ~/.npm")).toBe(true));
|
|
112
|
-
});
|
|
113
|
-
describe("npm and Node.js", () => {
|
|
114
|
-
it("npm install", async () => expect(await isAllowed("npm install")).toBe(true));
|
|
115
|
-
it("npm install --force", async () => expect(await isAllowed("npm install --force")).toBe(true));
|
|
116
|
-
it("npm ci", async () => expect(await isAllowed("npm ci")).toBe(true));
|
|
117
|
-
it("npm run build", async () => expect(await isAllowed("npm run build")).toBe(true));
|
|
118
|
-
it("npm run dev", async () => expect(await isAllowed("npm run dev")).toBe(true));
|
|
119
|
-
it("npm test", async () => expect(await isAllowed("npm test")).toBe(true));
|
|
120
|
-
it("npm cache clean --force", async () => expect(await isAllowed("npm cache clean --force")).toBe(true));
|
|
121
|
-
it("npm rebuild", async () => expect(await isAllowed("npm rebuild")).toBe(true));
|
|
122
|
-
it("npm link", async () => expect(await isAllowed("npm link")).toBe(true));
|
|
123
|
-
it("npm pack", async () => expect(await isAllowed("npm pack")).toBe(true));
|
|
124
|
-
it("npm publish", async () => expect(await isAllowed("npm publish")).toBe(true));
|
|
125
|
-
it("npx create-react-app my-app", async () => expect(await isAllowed("npx create-react-app my-app")).toBe(true));
|
|
126
|
-
it("npx tsc --noEmit", async () => expect(await isAllowed("npx tsc --noEmit")).toBe(true));
|
|
127
|
-
it("node server.js", async () => expect(await isAllowed("node server.js")).toBe(true));
|
|
128
|
-
it("node -e 'console.log(1)'", async () => expect(await isAllowed("node -e 'console.log(1)'")).toBe(true));
|
|
129
|
-
it("node -e with require", async () => expect(await isAllowed("node -e 'require(\"fs\").readFileSync(\"x\")'")).toBe(true));
|
|
130
|
-
it("bun install", async () => expect(await isAllowed("bun install")).toBe(true));
|
|
131
|
-
it("bun run dev", async () => expect(await isAllowed("bun run dev")).toBe(true));
|
|
132
|
-
it("pnpm install", async () => expect(await isAllowed("pnpm install")).toBe(true));
|
|
133
|
-
it("yarn install", async () => expect(await isAllowed("yarn install")).toBe(true));
|
|
134
|
-
it("deno run script.ts", async () => expect(await isAllowed("deno run script.ts")).toBe(true));
|
|
135
|
-
});
|
|
136
|
-
describe("Python", () => {
|
|
137
|
-
it("pip install package", async () => expect(await isAllowed("pip install flask")).toBe(true));
|
|
138
|
-
it("pip install -r requirements.txt", async () => expect(await isAllowed("pip install -r requirements.txt")).toBe(true));
|
|
139
|
-
it("pip install --force-reinstall", async () => expect(await isAllowed("pip install --force-reinstall package")).toBe(true));
|
|
140
|
-
it("python script.py", async () => expect(await isAllowed("python script.py")).toBe(true));
|
|
141
|
-
it("python -m venv .venv", async () => expect(await isAllowed("python -m venv .venv")).toBe(true));
|
|
142
|
-
it("python -e 'print(1)'", async () => expect(await isAllowed("python -e 'print(1)'")).toBe(true));
|
|
143
|
-
it("python -c 'import os; print(os.getcwd())'", async () => expect(await isAllowed("python -c 'import os; print(os.getcwd())'")).toBe(true));
|
|
144
|
-
it("pytest", async () => expect(await isAllowed("pytest -xvs tests/")).toBe(true));
|
|
145
|
-
it("uv pip install", async () => expect(await isAllowed("uv pip install flask")).toBe(true));
|
|
146
|
-
});
|
|
147
|
-
describe("git", () => {
|
|
148
|
-
it("git status", async () => expect(await isAllowed("git status")).toBe(true));
|
|
149
|
-
it("git add .", async () => expect(await isAllowed("git add .")).toBe(true));
|
|
150
|
-
it("git commit -m 'msg'", async () => expect(await isAllowed("git commit -m 'test'")).toBe(true));
|
|
151
|
-
it("git push", async () => expect(await isAllowed("git push")).toBe(true));
|
|
152
|
-
it("git push --force", async () => expect(await isAllowed("git push --force")).toBe(true));
|
|
153
|
-
it("git pull", async () => expect(await isAllowed("git pull")).toBe(true));
|
|
154
|
-
it("git clone url", async () => expect(await isAllowed("git clone https://github.com/user/repo.git")).toBe(true));
|
|
155
|
-
it("git checkout -b new-branch", async () => expect(await isAllowed("git checkout -b new-branch")).toBe(true));
|
|
156
|
-
it("git reset --hard HEAD~1", async () => expect(await isAllowed("git reset --hard HEAD~1")).toBe(true));
|
|
157
|
-
it("git clean -fdx", async () => expect(await isAllowed("git clean -fdx")).toBe(true));
|
|
158
|
-
it("git stash", async () => expect(await isAllowed("git stash")).toBe(true));
|
|
159
|
-
it("git rebase main", async () => expect(await isAllowed("git rebase main")).toBe(true));
|
|
160
|
-
it("git log --oneline -20", async () => expect(await isAllowed("git log --oneline -20")).toBe(true));
|
|
161
|
-
it("git diff HEAD~3", async () => expect(await isAllowed("git diff HEAD~3")).toBe(true));
|
|
162
|
-
});
|
|
163
|
-
});
|
|
@@ -1,220 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from "vitest";
|
|
2
|
-
|
|
3
|
-
// Mock child_process.spawn so commands are NOT actually executed.
|
|
4
|
-
vi.mock("child_process", async () => {
|
|
5
|
-
const actual = await vi.importActual("child_process");
|
|
6
|
-
return {
|
|
7
|
-
...actual,
|
|
8
|
-
spawn: vi.fn(cmd => {
|
|
9
|
-
const {
|
|
10
|
-
EventEmitter
|
|
11
|
-
} = require("events");
|
|
12
|
-
const {
|
|
13
|
-
Readable
|
|
14
|
-
} = require("stream");
|
|
15
|
-
const child = new EventEmitter();
|
|
16
|
-
const echoMatch = typeof cmd === "string" ? cmd.match(/^echo\s+(.*)/) : null;
|
|
17
|
-
let pushed = false;
|
|
18
|
-
child.stdout = new Readable({
|
|
19
|
-
read() {
|
|
20
|
-
if (echoMatch && !pushed) {
|
|
21
|
-
pushed = true;
|
|
22
|
-
this.push(echoMatch[1] + "\n");
|
|
23
|
-
}
|
|
24
|
-
this.push(null);
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
child.stderr = new Readable({
|
|
28
|
-
read() {
|
|
29
|
-
this.push(null);
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
child.stdin = {
|
|
33
|
-
write: vi.fn(),
|
|
34
|
-
end: vi.fn()
|
|
35
|
-
};
|
|
36
|
-
child.pid = 99999;
|
|
37
|
-
child.kill = vi.fn();
|
|
38
|
-
setTimeout(() => child.emit("exit", 0), 5);
|
|
39
|
-
return child;
|
|
40
|
-
})
|
|
41
|
-
};
|
|
42
|
-
});
|
|
43
|
-
vi.mock("../../sandbox.js", () => ({
|
|
44
|
-
sandboxCommand: vi.fn((cmd, _cwd) => ({
|
|
45
|
-
wrapped: cmd,
|
|
46
|
-
profilePath: null
|
|
47
|
-
})),
|
|
48
|
-
cleanupSandbox: vi.fn()
|
|
49
|
-
}));
|
|
50
|
-
vi.mock("../../background-processes.js", () => ({
|
|
51
|
-
spawnBackground: vi.fn(async () => ({
|
|
52
|
-
status: "running",
|
|
53
|
-
message: "Process started"
|
|
54
|
-
})),
|
|
55
|
-
readProcessOutput: vi.fn(_id => ({
|
|
56
|
-
status: "completed",
|
|
57
|
-
exitCode: 0,
|
|
58
|
-
newOutput: "output data",
|
|
59
|
-
newErrors: ""
|
|
60
|
-
})),
|
|
61
|
-
killProcess: vi.fn(() => ({
|
|
62
|
-
success: true,
|
|
63
|
-
message: "Process killed"
|
|
64
|
-
})),
|
|
65
|
-
listProcesses: vi.fn(() => [])
|
|
66
|
-
}));
|
|
67
|
-
vi.mock("../../agent-events.js", () => ({
|
|
68
|
-
getGlobalEmitter: vi.fn(() => ({
|
|
69
|
-
emitToolOutput: vi.fn()
|
|
70
|
-
}))
|
|
71
|
-
}));
|
|
72
|
-
vi.mock("../../debug-log.js", () => ({
|
|
73
|
-
debugLog: vi.fn()
|
|
74
|
-
}));
|
|
75
|
-
import { runCommand } from "../shell-exec.js";
|
|
76
|
-
async function isAllowed(command) {
|
|
77
|
-
const result = await runCommand({
|
|
78
|
-
command
|
|
79
|
-
});
|
|
80
|
-
return !result.output.includes("blocked for safety");
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// ============================================================================
|
|
84
|
-
// ALLOWED — Docker, other languages, network, system, macOS, dd, piped,
|
|
85
|
-
// database, cloud/devops, and regression checks
|
|
86
|
-
// ============================================================================
|
|
87
|
-
|
|
88
|
-
describe("ALLOWED — extended developer commands", () => {
|
|
89
|
-
describe("Docker", () => {
|
|
90
|
-
it("docker build", async () => expect(await isAllowed("docker build -t myapp .")).toBe(true));
|
|
91
|
-
it("docker run", async () => expect(await isAllowed("docker run -it ubuntu bash")).toBe(true));
|
|
92
|
-
it("docker compose up", async () => expect(await isAllowed("docker compose up -d")).toBe(true));
|
|
93
|
-
it("docker system prune -af", async () => expect(await isAllowed("docker system prune -af")).toBe(true));
|
|
94
|
-
it("docker kill container", async () => expect(await isAllowed("docker kill my-container")).toBe(true));
|
|
95
|
-
it("docker rm container", async () => expect(await isAllowed("docker rm my-container")).toBe(true));
|
|
96
|
-
it("docker rmi image", async () => expect(await isAllowed("docker rmi my-image:latest")).toBe(true));
|
|
97
|
-
it("docker exec", async () => expect(await isAllowed("docker exec -it container bash")).toBe(true));
|
|
98
|
-
});
|
|
99
|
-
describe("other languages and build tools", () => {
|
|
100
|
-
it("cargo build", async () => expect(await isAllowed("cargo build --release")).toBe(true));
|
|
101
|
-
it("cargo clean", async () => expect(await isAllowed("cargo clean")).toBe(true));
|
|
102
|
-
it("cargo test", async () => expect(await isAllowed("cargo test")).toBe(true));
|
|
103
|
-
it("go build", async () => expect(await isAllowed("go build ./...")).toBe(true));
|
|
104
|
-
it("go test", async () => expect(await isAllowed("go test ./...")).toBe(true));
|
|
105
|
-
it("go mod tidy", async () => expect(await isAllowed("go mod tidy")).toBe(true));
|
|
106
|
-
it("javac Main.java", async () => expect(await isAllowed("javac Main.java")).toBe(true));
|
|
107
|
-
it("mvn clean install", async () => expect(await isAllowed("mvn clean install")).toBe(true));
|
|
108
|
-
it("gradle build", async () => expect(await isAllowed("gradle build")).toBe(true));
|
|
109
|
-
it("ruby script.rb", async () => expect(await isAllowed("ruby script.rb")).toBe(true));
|
|
110
|
-
it("gem install bundler", async () => expect(await isAllowed("gem install bundler")).toBe(true));
|
|
111
|
-
it("bundle install", async () => expect(await isAllowed("bundle install")).toBe(true));
|
|
112
|
-
it("make clean", async () => expect(await isAllowed("make clean")).toBe(true));
|
|
113
|
-
it("make -j8", async () => expect(await isAllowed("make -j8")).toBe(true));
|
|
114
|
-
it("cmake ..", async () => expect(await isAllowed("cmake ..")).toBe(true));
|
|
115
|
-
it("swift build", async () => expect(await isAllowed("swift build")).toBe(true));
|
|
116
|
-
it("swift test", async () => expect(await isAllowed("swift test")).toBe(true));
|
|
117
|
-
});
|
|
118
|
-
describe("network commands", () => {
|
|
119
|
-
it("curl URL", async () => expect(await isAllowed("curl https://api.example.com/data")).toBe(true));
|
|
120
|
-
it("curl POST", async () => expect(await isAllowed("curl -X POST -d '{\"key\":\"val\"}' https://api.com")).toBe(true));
|
|
121
|
-
it("curl | jq", async () => expect(await isAllowed("curl https://api.com | jq .")).toBe(true));
|
|
122
|
-
it("curl -o file", async () => expect(await isAllowed("curl -o output.json https://api.com/data")).toBe(true));
|
|
123
|
-
it("wget file", async () => expect(await isAllowed("wget https://example.com/file.tar.gz")).toBe(true));
|
|
124
|
-
it("wget -O file", async () => expect(await isAllowed("wget -O output.zip https://example.com/release.zip")).toBe(true));
|
|
125
|
-
it("curl | bash (install script)", async () => expect(await isAllowed("curl -fsSL https://bun.sh/install | bash")).toBe(true));
|
|
126
|
-
it("wget | bash", async () => expect(await isAllowed("wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash")).toBe(true));
|
|
127
|
-
it("ssh command", async () => expect(await isAllowed("ssh user@host 'uptime'")).toBe(true));
|
|
128
|
-
it("scp file", async () => expect(await isAllowed("scp ./file.txt user@host:/tmp/")).toBe(true));
|
|
129
|
-
it("rsync", async () => expect(await isAllowed("rsync -avz ./dist/ user@host:/var/www/")).toBe(true));
|
|
130
|
-
});
|
|
131
|
-
describe("system and dev tools", () => {
|
|
132
|
-
it("ls -la", async () => expect(await isAllowed("ls -la")).toBe(true));
|
|
133
|
-
it("cat file", async () => expect(await isAllowed("cat package.json")).toBe(true));
|
|
134
|
-
it("grep -r pattern", async () => expect(await isAllowed("grep -r 'TODO' src/")).toBe(true));
|
|
135
|
-
it("find . -name '*.ts'", async () => expect(await isAllowed("find . -name '*.ts'")).toBe(true));
|
|
136
|
-
it("find . -delete", async () => expect(await isAllowed("find . -name '*.pyc' -delete")).toBe(true));
|
|
137
|
-
it("tar czf", async () => expect(await isAllowed("tar czf archive.tar.gz ./dist")).toBe(true));
|
|
138
|
-
it("tar xzf", async () => expect(await isAllowed("tar xzf archive.tar.gz")).toBe(true));
|
|
139
|
-
it("unzip file", async () => expect(await isAllowed("unzip release.zip -d ./out")).toBe(true));
|
|
140
|
-
it("cp -r", async () => expect(await isAllowed("cp -r src/ backup/")).toBe(true));
|
|
141
|
-
it("mv file", async () => expect(await isAllowed("mv old.txt new.txt")).toBe(true));
|
|
142
|
-
it("mkdir -p", async () => expect(await isAllowed("mkdir -p src/components/ui")).toBe(true));
|
|
143
|
-
it("touch file", async () => expect(await isAllowed("touch .env.local")).toBe(true));
|
|
144
|
-
it("ln -s", async () => expect(await isAllowed("ln -s ../config.json ./config.json")).toBe(true));
|
|
145
|
-
it("wc -l", async () => expect(await isAllowed("wc -l src/**/*.ts")).toBe(true));
|
|
146
|
-
it("sort file", async () => expect(await isAllowed("sort -u names.txt")).toBe(true));
|
|
147
|
-
it("head / tail", async () => expect(await isAllowed("tail -100 /var/log/system.log")).toBe(true));
|
|
148
|
-
it("ps aux", async () => expect(await isAllowed("ps aux")).toBe(true));
|
|
149
|
-
it("kill process", async () => expect(await isAllowed("kill -9 12345")).toBe(true));
|
|
150
|
-
it("pkill process", async () => expect(await isAllowed("pkill -f 'node server'")).toBe(true));
|
|
151
|
-
it("lsof -i :3000", async () => expect(await isAllowed("lsof -i :3000")).toBe(true));
|
|
152
|
-
it("env", async () => expect(await isAllowed("env")).toBe(true));
|
|
153
|
-
it("which node", async () => expect(await isAllowed("which node")).toBe(true));
|
|
154
|
-
it("whoami", async () => expect(await isAllowed("whoami")).toBe(true));
|
|
155
|
-
it("uname -a", async () => expect(await isAllowed("uname -a")).toBe(true));
|
|
156
|
-
it("df -h", async () => expect(await isAllowed("df -h")).toBe(true));
|
|
157
|
-
it("du -sh .", async () => expect(await isAllowed("du -sh .")).toBe(true));
|
|
158
|
-
it("xargs", async () => expect(await isAllowed("find . -name '*.log' | xargs rm")).toBe(true));
|
|
159
|
-
});
|
|
160
|
-
describe("macOS / Homebrew", () => {
|
|
161
|
-
it("brew install", async () => expect(await isAllowed("brew install postgresql")).toBe(true));
|
|
162
|
-
it("brew upgrade", async () => expect(await isAllowed("brew upgrade")).toBe(true));
|
|
163
|
-
it("brew services start", async () => expect(await isAllowed("brew services start postgresql")).toBe(true));
|
|
164
|
-
it("xcode-select --install", async () => expect(await isAllowed("xcode-select --install")).toBe(true));
|
|
165
|
-
it("open .", async () => expect(await isAllowed("open .")).toBe(true));
|
|
166
|
-
it("pbcopy", async () => expect(await isAllowed("echo 'text' | pbcopy")).toBe(true));
|
|
167
|
-
it("defaults write", async () => expect(await isAllowed("defaults write com.apple.finder AppleShowAllFiles YES")).toBe(true));
|
|
168
|
-
});
|
|
169
|
-
describe("dd on regular files (NOT block devices)", () => {
|
|
170
|
-
it("dd to regular file", async () => expect(await isAllowed("dd if=/dev/urandom of=./random.bin bs=1024 count=1")).toBe(true));
|
|
171
|
-
it("dd between files", async () => expect(await isAllowed("dd if=input.bin of=output.bin")).toBe(true));
|
|
172
|
-
it("dd to /dev/null", async () => expect(await isAllowed("dd if=./bigfile of=/dev/null bs=1M")).toBe(true));
|
|
173
|
-
it("dd to /tmp", async () => expect(await isAllowed("dd if=/dev/zero of=/tmp/testfile bs=1M count=10")).toBe(true));
|
|
174
|
-
});
|
|
175
|
-
describe("piped and chained commands", () => {
|
|
176
|
-
it("pipe to grep", async () => expect(await isAllowed("cat file.txt | grep 'error'")).toBe(true));
|
|
177
|
-
it("pipe to wc", async () => expect(await isAllowed("find . -name '*.ts' | wc -l")).toBe(true));
|
|
178
|
-
it("pipe to sort | uniq", async () => expect(await isAllowed("cat log.txt | sort | uniq -c | sort -rn")).toBe(true));
|
|
179
|
-
it("&& chain", async () => expect(await isAllowed("npm install && npm run build && npm test")).toBe(true));
|
|
180
|
-
it("|| fallback", async () => expect(await isAllowed("which bun || npm install -g bun")).toBe(true));
|
|
181
|
-
it("subshell", async () => expect(await isAllowed("(cd /tmp && tar xzf archive.tar.gz)")).toBe(true));
|
|
182
|
-
it("command substitution", async () => expect(await isAllowed("echo $(node -e 'console.log(1+1)')")).toBe(true));
|
|
183
|
-
it("base64 encode", async () => expect(await isAllowed("echo 'hello' | base64")).toBe(true));
|
|
184
|
-
it("base64 decode to file", async () => expect(await isAllowed("base64 -d encoded.txt > output.bin")).toBe(true));
|
|
185
|
-
it("base64 decode pipe to cat", async () => expect(await isAllowed("echo 'aGVsbG8=' | base64 -d | cat")).toBe(true));
|
|
186
|
-
});
|
|
187
|
-
describe("database tools", () => {
|
|
188
|
-
it("psql", async () => expect(await isAllowed("psql -h localhost -U user dbname")).toBe(true));
|
|
189
|
-
it("mysql", async () => expect(await isAllowed("mysql -u root -p dbname")).toBe(true));
|
|
190
|
-
it("redis-cli", async () => expect(await isAllowed("redis-cli PING")).toBe(true));
|
|
191
|
-
it("mongosh", async () => expect(await isAllowed("mongosh --eval 'db.getCollectionNames()'")).toBe(true));
|
|
192
|
-
it("sqlite3", async () => expect(await isAllowed("sqlite3 test.db '.tables'")).toBe(true));
|
|
193
|
-
});
|
|
194
|
-
describe("cloud and devops", () => {
|
|
195
|
-
it("aws s3 ls", async () => expect(await isAllowed("aws s3 ls s3://my-bucket/")).toBe(true));
|
|
196
|
-
it("aws deploy", async () => expect(await isAllowed("aws ecs update-service --force-new-deployment")).toBe(true));
|
|
197
|
-
it("gcloud", async () => expect(await isAllowed("gcloud app deploy")).toBe(true));
|
|
198
|
-
it("terraform apply", async () => expect(await isAllowed("terraform apply -auto-approve")).toBe(true));
|
|
199
|
-
it("kubectl", async () => expect(await isAllowed("kubectl get pods -A")).toBe(true));
|
|
200
|
-
it("helm install", async () => expect(await isAllowed("helm install myrelease mychart/")).toBe(true));
|
|
201
|
-
it("flyctl deploy", async () => expect(await isAllowed("flyctl deploy")).toBe(true));
|
|
202
|
-
it("vercel deploy", async () => expect(await isAllowed("vercel --prod")).toBe(true));
|
|
203
|
-
it("gh pr create", async () => expect(await isAllowed("gh pr create --title 'fix' --body 'desc'")).toBe(true));
|
|
204
|
-
it("gh run view", async () => expect(await isAllowed("gh run view 12345")).toBe(true));
|
|
205
|
-
});
|
|
206
|
-
describe("previously blocked — now allowed (regression checks)", () => {
|
|
207
|
-
it("chown -R user ~/.npm", async () => expect(await isAllowed("chown -R whale ~/.npm")).toBe(true));
|
|
208
|
-
it("chown -R user ~/.npm-cache", async () => expect(await isAllowed("chown -R whale ~/.npm-cache")).toBe(true));
|
|
209
|
-
it("sudo chown -R $(whoami) /Users/whale/.npm-cache", async () => expect(await isAllowed("sudo chown -R $(whoami) /Users/whale/.npm-cache")).toBe(true));
|
|
210
|
-
it("chmod 777 /tmp/test", async () => expect(await isAllowed("chmod 777 /tmp/test")).toBe(true));
|
|
211
|
-
it("chmod -R 777 /tmp/test", async () => expect(await isAllowed("chmod -R 777 /tmp/test")).toBe(true));
|
|
212
|
-
it("rm -rf /tmp/build-cache", async () => expect(await isAllowed("rm -rf /tmp/build-cache")).toBe(true));
|
|
213
|
-
it("rm -rf /Users/whale/project/node_modules", async () => expect(await isAllowed("rm -rf /Users/whale/project/node_modules")).toBe(true));
|
|
214
|
-
it("rm -f /var/tmp/lockfile", async () => expect(await isAllowed("rm -f /var/tmp/lockfile")).toBe(true));
|
|
215
|
-
it("dd if=/dev/zero of=./testfile bs=1M count=1", async () => expect(await isAllowed("dd if=/dev/zero of=./testfile bs=1M count=1")).toBe(true));
|
|
216
|
-
it("curl install script | bash", async () => expect(await isAllowed("curl -fsSL https://bun.sh/install | bash")).toBe(true));
|
|
217
|
-
it("node -e with require", async () => expect(await isAllowed("node -e 'require(\"child_process\").execSync(\"ls\")'")).toBe(true));
|
|
218
|
-
it("python -e with os.system", async () => expect(await isAllowed("python -e 'import os; os.system(\"ls\")'")).toBe(true));
|
|
219
|
-
});
|
|
220
|
-
});
|