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,215 +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 — git, docker, languages, network, system, cloud, regression
|
|
85
|
-
// ============================================================================
|
|
86
|
-
|
|
87
|
-
describe("ALLOWED — git, docker, system, cloud", () => {
|
|
88
|
-
describe("git", () => {
|
|
89
|
-
it("git status", async () => expect(await isAllowed("git status")).toBe(true));
|
|
90
|
-
it("git add .", async () => expect(await isAllowed("git add .")).toBe(true));
|
|
91
|
-
it("git commit -m 'msg'", async () => expect(await isAllowed("git commit -m 'test'")).toBe(true));
|
|
92
|
-
it("git push", async () => expect(await isAllowed("git push")).toBe(true));
|
|
93
|
-
it("git push --force", async () => expect(await isAllowed("git push --force")).toBe(true));
|
|
94
|
-
it("git pull", async () => expect(await isAllowed("git pull")).toBe(true));
|
|
95
|
-
it("git clone url", async () => expect(await isAllowed("git clone https://github.com/user/repo.git")).toBe(true));
|
|
96
|
-
it("git checkout -b new-branch", async () => expect(await isAllowed("git checkout -b new-branch")).toBe(true));
|
|
97
|
-
it("git reset --hard HEAD~1", async () => expect(await isAllowed("git reset --hard HEAD~1")).toBe(true));
|
|
98
|
-
it("git clean -fdx", async () => expect(await isAllowed("git clean -fdx")).toBe(true));
|
|
99
|
-
it("git stash", async () => expect(await isAllowed("git stash")).toBe(true));
|
|
100
|
-
it("git rebase main", async () => expect(await isAllowed("git rebase main")).toBe(true));
|
|
101
|
-
it("git log --oneline -20", async () => expect(await isAllowed("git log --oneline -20")).toBe(true));
|
|
102
|
-
it("git diff HEAD~3", async () => expect(await isAllowed("git diff HEAD~3")).toBe(true));
|
|
103
|
-
});
|
|
104
|
-
describe("Docker", () => {
|
|
105
|
-
it("docker build", async () => expect(await isAllowed("docker build -t myapp .")).toBe(true));
|
|
106
|
-
it("docker run", async () => expect(await isAllowed("docker run -it ubuntu bash")).toBe(true));
|
|
107
|
-
it("docker compose up", async () => expect(await isAllowed("docker compose up -d")).toBe(true));
|
|
108
|
-
it("docker system prune -af", async () => expect(await isAllowed("docker system prune -af")).toBe(true));
|
|
109
|
-
it("docker kill container", async () => expect(await isAllowed("docker kill my-container")).toBe(true));
|
|
110
|
-
it("docker rm container", async () => expect(await isAllowed("docker rm my-container")).toBe(true));
|
|
111
|
-
it("docker rmi image", async () => expect(await isAllowed("docker rmi my-image:latest")).toBe(true));
|
|
112
|
-
it("docker exec", async () => expect(await isAllowed("docker exec -it container bash")).toBe(true));
|
|
113
|
-
});
|
|
114
|
-
describe("other languages and build tools", () => {
|
|
115
|
-
it("cargo build", async () => expect(await isAllowed("cargo build --release")).toBe(true));
|
|
116
|
-
it("cargo clean", async () => expect(await isAllowed("cargo clean")).toBe(true));
|
|
117
|
-
it("cargo test", async () => expect(await isAllowed("cargo test")).toBe(true));
|
|
118
|
-
it("go build", async () => expect(await isAllowed("go build ./...")).toBe(true));
|
|
119
|
-
it("go test", async () => expect(await isAllowed("go test ./...")).toBe(true));
|
|
120
|
-
it("go mod tidy", async () => expect(await isAllowed("go mod tidy")).toBe(true));
|
|
121
|
-
it("javac Main.java", async () => expect(await isAllowed("javac Main.java")).toBe(true));
|
|
122
|
-
it("mvn clean install", async () => expect(await isAllowed("mvn clean install")).toBe(true));
|
|
123
|
-
it("gradle build", async () => expect(await isAllowed("gradle build")).toBe(true));
|
|
124
|
-
it("ruby script.rb", async () => expect(await isAllowed("ruby script.rb")).toBe(true));
|
|
125
|
-
it("gem install bundler", async () => expect(await isAllowed("gem install bundler")).toBe(true));
|
|
126
|
-
it("bundle install", async () => expect(await isAllowed("bundle install")).toBe(true));
|
|
127
|
-
it("make clean", async () => expect(await isAllowed("make clean")).toBe(true));
|
|
128
|
-
it("make -j8", async () => expect(await isAllowed("make -j8")).toBe(true));
|
|
129
|
-
it("cmake ..", async () => expect(await isAllowed("cmake ..")).toBe(true));
|
|
130
|
-
it("swift build", async () => expect(await isAllowed("swift build")).toBe(true));
|
|
131
|
-
it("swift test", async () => expect(await isAllowed("swift test")).toBe(true));
|
|
132
|
-
});
|
|
133
|
-
describe("network commands", () => {
|
|
134
|
-
it("curl URL", async () => expect(await isAllowed("curl https://api.example.com/data")).toBe(true));
|
|
135
|
-
it("curl POST", async () => expect(await isAllowed("curl -X POST -d '{\"key\":\"val\"}' https://api.com")).toBe(true));
|
|
136
|
-
it("curl | jq", async () => expect(await isAllowed("curl https://api.com | jq .")).toBe(true));
|
|
137
|
-
it("curl -o file", async () => expect(await isAllowed("curl -o output.json https://api.com/data")).toBe(true));
|
|
138
|
-
it("wget file", async () => expect(await isAllowed("wget https://example.com/file.tar.gz")).toBe(true));
|
|
139
|
-
it("wget -O file", async () => expect(await isAllowed("wget -O output.zip https://example.com/release.zip")).toBe(true));
|
|
140
|
-
it("curl | bash (install script)", async () => expect(await isAllowed("curl -fsSL https://bun.sh/install | bash")).toBe(true));
|
|
141
|
-
it("ssh command", async () => expect(await isAllowed("ssh user@host 'uptime'")).toBe(true));
|
|
142
|
-
it("scp file", async () => expect(await isAllowed("scp ./file.txt user@host:/tmp/")).toBe(true));
|
|
143
|
-
it("rsync", async () => expect(await isAllowed("rsync -avz ./dist/ user@host:/var/www/")).toBe(true));
|
|
144
|
-
});
|
|
145
|
-
describe("system and dev tools", () => {
|
|
146
|
-
it("ls -la", async () => expect(await isAllowed("ls -la")).toBe(true));
|
|
147
|
-
it("cat file", async () => expect(await isAllowed("cat package.json")).toBe(true));
|
|
148
|
-
it("grep -r pattern", async () => expect(await isAllowed("grep -r 'TODO' src/")).toBe(true));
|
|
149
|
-
it("find . -name '*.ts'", async () => expect(await isAllowed("find . -name '*.ts'")).toBe(true));
|
|
150
|
-
it("tar czf", async () => expect(await isAllowed("tar czf archive.tar.gz ./dist")).toBe(true));
|
|
151
|
-
it("tar xzf", async () => expect(await isAllowed("tar xzf archive.tar.gz")).toBe(true));
|
|
152
|
-
it("cp -r", async () => expect(await isAllowed("cp -r src/ backup/")).toBe(true));
|
|
153
|
-
it("mv file", async () => expect(await isAllowed("mv old.txt new.txt")).toBe(true));
|
|
154
|
-
it("mkdir -p", async () => expect(await isAllowed("mkdir -p src/components/ui")).toBe(true));
|
|
155
|
-
it("touch file", async () => expect(await isAllowed("touch .env.local")).toBe(true));
|
|
156
|
-
it("ps aux", async () => expect(await isAllowed("ps aux")).toBe(true));
|
|
157
|
-
it("kill process", async () => expect(await isAllowed("kill -9 12345")).toBe(true));
|
|
158
|
-
it("env", async () => expect(await isAllowed("env")).toBe(true));
|
|
159
|
-
it("which node", async () => expect(await isAllowed("which node")).toBe(true));
|
|
160
|
-
it("whoami", async () => expect(await isAllowed("whoami")).toBe(true));
|
|
161
|
-
it("uname -a", async () => expect(await isAllowed("uname -a")).toBe(true));
|
|
162
|
-
it("df -h", async () => expect(await isAllowed("df -h")).toBe(true));
|
|
163
|
-
it("du -sh .", async () => expect(await isAllowed("du -sh .")).toBe(true));
|
|
164
|
-
});
|
|
165
|
-
describe("macOS / Homebrew", () => {
|
|
166
|
-
it("brew install", async () => expect(await isAllowed("brew install postgresql")).toBe(true));
|
|
167
|
-
it("brew upgrade", async () => expect(await isAllowed("brew upgrade")).toBe(true));
|
|
168
|
-
it("brew services start", async () => expect(await isAllowed("brew services start postgresql")).toBe(true));
|
|
169
|
-
it("xcode-select --install", async () => expect(await isAllowed("xcode-select --install")).toBe(true));
|
|
170
|
-
it("open .", async () => expect(await isAllowed("open .")).toBe(true));
|
|
171
|
-
it("pbcopy", async () => expect(await isAllowed("echo 'text' | pbcopy")).toBe(true));
|
|
172
|
-
});
|
|
173
|
-
describe("dd on regular files", () => {
|
|
174
|
-
it("dd to regular file", async () => expect(await isAllowed("dd if=/dev/urandom of=./random.bin bs=1024 count=1")).toBe(true));
|
|
175
|
-
it("dd between files", async () => expect(await isAllowed("dd if=input.bin of=output.bin")).toBe(true));
|
|
176
|
-
it("dd to /dev/null", async () => expect(await isAllowed("dd if=./bigfile of=/dev/null bs=1M")).toBe(true));
|
|
177
|
-
it("dd to /tmp", async () => expect(await isAllowed("dd if=/dev/zero of=/tmp/testfile bs=1M count=10")).toBe(true));
|
|
178
|
-
});
|
|
179
|
-
describe("piped and chained commands", () => {
|
|
180
|
-
it("pipe to grep", async () => expect(await isAllowed("cat file.txt | grep 'error'")).toBe(true));
|
|
181
|
-
it("pipe to wc", async () => expect(await isAllowed("find . -name '*.ts' | wc -l")).toBe(true));
|
|
182
|
-
it("&& chain", async () => expect(await isAllowed("npm install && npm run build && npm test")).toBe(true));
|
|
183
|
-
it("|| fallback", async () => expect(await isAllowed("which bun || npm install -g bun")).toBe(true));
|
|
184
|
-
it("subshell", async () => expect(await isAllowed("(cd /tmp && tar xzf archive.tar.gz)")).toBe(true));
|
|
185
|
-
it("base64 encode", async () => expect(await isAllowed("echo 'hello' | base64")).toBe(true));
|
|
186
|
-
it("base64 decode to file", async () => expect(await isAllowed("base64 -d encoded.txt > output.bin")).toBe(true));
|
|
187
|
-
});
|
|
188
|
-
describe("database tools", () => {
|
|
189
|
-
it("psql", async () => expect(await isAllowed("psql -h localhost -U user dbname")).toBe(true));
|
|
190
|
-
it("mysql", async () => expect(await isAllowed("mysql -u root -p dbname")).toBe(true));
|
|
191
|
-
it("redis-cli", async () => expect(await isAllowed("redis-cli PING")).toBe(true));
|
|
192
|
-
it("mongosh", async () => expect(await isAllowed("mongosh --eval 'db.getCollectionNames()'")).toBe(true));
|
|
193
|
-
it("sqlite3", async () => expect(await isAllowed("sqlite3 test.db '.tables'")).toBe(true));
|
|
194
|
-
});
|
|
195
|
-
describe("cloud and devops", () => {
|
|
196
|
-
it("aws s3 ls", async () => expect(await isAllowed("aws s3 ls s3://my-bucket/")).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("flyctl deploy", async () => expect(await isAllowed("flyctl deploy")).toBe(true));
|
|
201
|
-
it("vercel deploy", async () => expect(await isAllowed("vercel --prod")).toBe(true));
|
|
202
|
-
it("gh pr create", async () => expect(await isAllowed("gh pr create --title 'fix' --body 'desc'")).toBe(true));
|
|
203
|
-
});
|
|
204
|
-
describe("previously blocked — now allowed (regression checks)", () => {
|
|
205
|
-
it("chown -R user ~/.npm", async () => expect(await isAllowed("chown -R whale ~/.npm")).toBe(true));
|
|
206
|
-
it("sudo chown -R $(whoami) /Users/whale/.npm-cache", async () => expect(await isAllowed("sudo chown -R $(whoami) /Users/whale/.npm-cache")).toBe(true));
|
|
207
|
-
it("chmod 777 /tmp/test", async () => expect(await isAllowed("chmod 777 /tmp/test")).toBe(true));
|
|
208
|
-
it("rm -rf /tmp/build-cache", async () => expect(await isAllowed("rm -rf /tmp/build-cache")).toBe(true));
|
|
209
|
-
it("rm -rf /Users/whale/project/node_modules", async () => expect(await isAllowed("rm -rf /Users/whale/project/node_modules")).toBe(true));
|
|
210
|
-
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));
|
|
211
|
-
it("curl install script | bash", async () => expect(await isAllowed("curl -fsSL https://bun.sh/install | bash")).toBe(true));
|
|
212
|
-
it("node -e with require", async () => expect(await isAllowed("node -e 'require(\"child_process\").execSync(\"ls\")'")).toBe(true));
|
|
213
|
-
it("python -e with os.system", async () => expect(await isAllowed("python -e 'import os; os.system(\"ls\")'")).toBe(true));
|
|
214
|
-
});
|
|
215
|
-
});
|
|
@@ -1,154 +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 — everything a developer needs
|
|
85
|
-
// ============================================================================
|
|
86
|
-
|
|
87
|
-
describe("ALLOWED — normal developer commands", () => {
|
|
88
|
-
// ── File operations ──
|
|
89
|
-
describe("rm on specific paths (NOT root/home)", () => {
|
|
90
|
-
it("rm -rf node_modules", async () => expect(await isAllowed("rm -rf node_modules")).toBe(true));
|
|
91
|
-
it("rm -rf ./dist", async () => expect(await isAllowed("rm -rf ./dist")).toBe(true));
|
|
92
|
-
it("rm -rf /tmp/build", async () => expect(await isAllowed("rm -rf /tmp/build")).toBe(true));
|
|
93
|
-
it("rm -rf /Users/whale/project/node_modules", async () => expect(await isAllowed("rm -rf /Users/whale/project/node_modules")).toBe(true));
|
|
94
|
-
it("rm -rf ~/project/dist", async () => expect(await isAllowed("rm -rf ~/project/dist")).toBe(true));
|
|
95
|
-
it("rm -rf ~/Downloads/old-stuff", async () => expect(await isAllowed("rm -rf ~/Downloads/old-stuff")).toBe(true));
|
|
96
|
-
it("rm -rf ~/.npm-cache", async () => expect(await isAllowed("rm -rf ~/.npm-cache")).toBe(true));
|
|
97
|
-
it("rm -rf /var/tmp/cache", async () => expect(await isAllowed("rm -rf /var/tmp/cache")).toBe(true));
|
|
98
|
-
it("rm -f /tmp/lockfile", async () => expect(await isAllowed("rm -f /tmp/lockfile")).toBe(true));
|
|
99
|
-
it("rm file.txt", async () => expect(await isAllowed("rm file.txt")).toBe(true));
|
|
100
|
-
it("rm -r build/", async () => expect(await isAllowed("rm -r build/")).toBe(true));
|
|
101
|
-
it("rm -rf .next .turbo dist", async () => expect(await isAllowed("rm -rf .next .turbo dist")).toBe(true));
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
// ── chmod / chown (sandbox blocks writes outside cwd) ──
|
|
105
|
-
describe("chmod and chown", () => {
|
|
106
|
-
it("chmod 755 ./scripts/deploy.sh", async () => expect(await isAllowed("chmod 755 ./scripts/deploy.sh")).toBe(true));
|
|
107
|
-
it("chmod +x ./run.sh", async () => expect(await isAllowed("chmod +x ./run.sh")).toBe(true));
|
|
108
|
-
it("chmod -R 755 ./scripts", async () => expect(await isAllowed("chmod -R 755 ./scripts")).toBe(true));
|
|
109
|
-
it("chmod 777 /tmp/test", async () => expect(await isAllowed("chmod 777 /tmp/test")).toBe(true));
|
|
110
|
-
it("chmod -R 777 /tmp/test", async () => expect(await isAllowed("chmod -R 777 /tmp/test")).toBe(true));
|
|
111
|
-
it("chown -R $(whoami) ~/.npm", async () => expect(await isAllowed("chown -R $(whoami) ~/.npm")).toBe(true));
|
|
112
|
-
it("chown -R whale /Users/whale/.npm-cache", async () => expect(await isAllowed("chown -R whale /Users/whale/.npm-cache")).toBe(true));
|
|
113
|
-
it("chown -R whale:staff ./build", async () => expect(await isAllowed("chown -R whale:staff ./build")).toBe(true));
|
|
114
|
-
it("sudo chown -R $(whoami) ~/.npm", async () => expect(await isAllowed("sudo chown -R $(whoami) ~/.npm")).toBe(true));
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
// ── npm / Node.js ──
|
|
118
|
-
describe("npm and Node.js", () => {
|
|
119
|
-
it("npm install", async () => expect(await isAllowed("npm install")).toBe(true));
|
|
120
|
-
it("npm install --force", async () => expect(await isAllowed("npm install --force")).toBe(true));
|
|
121
|
-
it("npm ci", async () => expect(await isAllowed("npm ci")).toBe(true));
|
|
122
|
-
it("npm run build", async () => expect(await isAllowed("npm run build")).toBe(true));
|
|
123
|
-
it("npm run dev", async () => expect(await isAllowed("npm run dev")).toBe(true));
|
|
124
|
-
it("npm test", async () => expect(await isAllowed("npm test")).toBe(true));
|
|
125
|
-
it("npm cache clean --force", async () => expect(await isAllowed("npm cache clean --force")).toBe(true));
|
|
126
|
-
it("npm rebuild", async () => expect(await isAllowed("npm rebuild")).toBe(true));
|
|
127
|
-
it("npm link", async () => expect(await isAllowed("npm link")).toBe(true));
|
|
128
|
-
it("npm pack", async () => expect(await isAllowed("npm pack")).toBe(true));
|
|
129
|
-
it("npm publish", async () => expect(await isAllowed("npm publish")).toBe(true));
|
|
130
|
-
it("npx create-react-app my-app", async () => expect(await isAllowed("npx create-react-app my-app")).toBe(true));
|
|
131
|
-
it("npx tsc --noEmit", async () => expect(await isAllowed("npx tsc --noEmit")).toBe(true));
|
|
132
|
-
it("node server.js", async () => expect(await isAllowed("node server.js")).toBe(true));
|
|
133
|
-
it("node -e 'console.log(1)'", async () => expect(await isAllowed("node -e 'console.log(1)'")).toBe(true));
|
|
134
|
-
it("node -e with require", async () => expect(await isAllowed("node -e 'require(\"fs\").readFileSync(\"x\")'")).toBe(true));
|
|
135
|
-
it("bun install", async () => expect(await isAllowed("bun install")).toBe(true));
|
|
136
|
-
it("bun run dev", async () => expect(await isAllowed("bun run dev")).toBe(true));
|
|
137
|
-
it("pnpm install", async () => expect(await isAllowed("pnpm install")).toBe(true));
|
|
138
|
-
it("yarn install", async () => expect(await isAllowed("yarn install")).toBe(true));
|
|
139
|
-
it("deno run script.ts", async () => expect(await isAllowed("deno run script.ts")).toBe(true));
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
// ── Python ──
|
|
143
|
-
describe("Python", () => {
|
|
144
|
-
it("pip install package", async () => expect(await isAllowed("pip install flask")).toBe(true));
|
|
145
|
-
it("pip install -r requirements.txt", async () => expect(await isAllowed("pip install -r requirements.txt")).toBe(true));
|
|
146
|
-
it("pip install --force-reinstall", async () => expect(await isAllowed("pip install --force-reinstall package")).toBe(true));
|
|
147
|
-
it("python script.py", async () => expect(await isAllowed("python script.py")).toBe(true));
|
|
148
|
-
it("python -m venv .venv", async () => expect(await isAllowed("python -m venv .venv")).toBe(true));
|
|
149
|
-
it("python -e 'print(1)'", async () => expect(await isAllowed("python -e 'print(1)'")).toBe(true));
|
|
150
|
-
it("python -c 'import os; print(os.getcwd())'", async () => expect(await isAllowed("python -c 'import os; print(os.getcwd())'")).toBe(true));
|
|
151
|
-
it("pytest", async () => expect(await isAllowed("pytest -xvs tests/")).toBe(true));
|
|
152
|
-
it("uv pip install", async () => expect(await isAllowed("uv pip install flask")).toBe(true));
|
|
153
|
-
});
|
|
154
|
-
});
|
|
@@ -1,132 +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 isBlocked(command) {
|
|
77
|
-
const result = await runCommand({
|
|
78
|
-
command
|
|
79
|
-
});
|
|
80
|
-
return result.output.includes("blocked for safety");
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// ============================================================================
|
|
84
|
-
// BLOCKED — truly catastrophic commands
|
|
85
|
-
// ============================================================================
|
|
86
|
-
|
|
87
|
-
describe("BLOCKED — catastrophic commands", () => {
|
|
88
|
-
describe("rm on literal root", () => {
|
|
89
|
-
it("blocks rm -rf /", async () => expect(await isBlocked("rm -rf /")).toBe(true));
|
|
90
|
-
it("blocks rm -rf /*", async () => expect(await isBlocked("rm -rf /*")).toBe(true));
|
|
91
|
-
it("blocks rm -fr /", async () => expect(await isBlocked("rm -fr /")).toBe(true));
|
|
92
|
-
it("blocks rm -r -f /", async () => expect(await isBlocked("rm -r -f /")).toBe(true));
|
|
93
|
-
it("blocks rm -rf / in chain", async () => expect(await isBlocked("rm -rf / && echo done")).toBe(true));
|
|
94
|
-
it("blocks rm -rf / ; cmd", async () => expect(await isBlocked("rm -rf / ; echo hi")).toBe(true));
|
|
95
|
-
it("blocks rm -rf / (trailing space)", async () => expect(await isBlocked("rm -rf / ")).toBe(true));
|
|
96
|
-
});
|
|
97
|
-
describe("rm on literal home", () => {
|
|
98
|
-
it("blocks rm -rf ~", async () => expect(await isBlocked("rm -rf ~")).toBe(true));
|
|
99
|
-
it("blocks rm -rf ~/", async () => expect(await isBlocked("rm -rf ~/")).toBe(true));
|
|
100
|
-
it("blocks rm -rf ~/*", async () => expect(await isBlocked("rm -rf ~/*")).toBe(true));
|
|
101
|
-
it("blocks rm -rf ~ in chain", async () => expect(await isBlocked("rm -rf ~ && echo done")).toBe(true));
|
|
102
|
-
});
|
|
103
|
-
describe("mkfs — format filesystem", () => {
|
|
104
|
-
it("blocks mkfs", async () => expect(await isBlocked("mkfs /dev/sda1")).toBe(true));
|
|
105
|
-
it("blocks mkfs.ext4", async () => expect(await isBlocked("mkfs.ext4 /dev/sda1")).toBe(true));
|
|
106
|
-
it("blocks MKFS (case-insensitive)", async () => expect(await isBlocked("MKFS /dev/sda")).toBe(true));
|
|
107
|
-
});
|
|
108
|
-
describe("dd to block devices", () => {
|
|
109
|
-
it("blocks dd to /dev/sda", async () => expect(await isBlocked("dd if=/dev/zero of=/dev/sda")).toBe(true));
|
|
110
|
-
it("blocks dd to /dev/disk0", async () => expect(await isBlocked("dd if=backup.img of=/dev/disk0")).toBe(true));
|
|
111
|
-
it("blocks dd to /dev/rdisk0", async () => expect(await isBlocked("dd if=backup.img of=/dev/rdisk0")).toBe(true));
|
|
112
|
-
it("blocks dd to /dev/nvme0n1", async () => expect(await isBlocked("dd if=/dev/zero of=/dev/nvme0n1")).toBe(true));
|
|
113
|
-
it("blocks dd to /dev/hda", async () => expect(await isBlocked("dd if=/dev/zero of=/dev/hda")).toBe(true));
|
|
114
|
-
it("blocks dd to /dev/vda", async () => expect(await isBlocked("dd if=/dev/zero of=/dev/vda")).toBe(true));
|
|
115
|
-
});
|
|
116
|
-
describe("redirect to block devices", () => {
|
|
117
|
-
it("blocks > /dev/sda", async () => expect(await isBlocked("echo 'data' > /dev/sda")).toBe(true));
|
|
118
|
-
it("blocks > /dev/disk0", async () => expect(await isBlocked("echo 'data' > /dev/disk0")).toBe(true));
|
|
119
|
-
});
|
|
120
|
-
describe("fork bomb", () => {
|
|
121
|
-
it("blocks :(){ :|:& };:", async () => expect(await isBlocked(":(){ :|:& };:")).toBe(true));
|
|
122
|
-
});
|
|
123
|
-
describe("command length limit", () => {
|
|
124
|
-
it("blocks commands exceeding 10000 characters", async () => {
|
|
125
|
-
const result = await runCommand({
|
|
126
|
-
command: "x".repeat(10001)
|
|
127
|
-
});
|
|
128
|
-
expect(result.success).toBe(false);
|
|
129
|
-
expect(result.output).toContain("Command too long");
|
|
130
|
-
});
|
|
131
|
-
});
|
|
132
|
-
});
|