@superblocksteam/vite-plugin-file-sync 2.0.72-next.12 → 2.0.72-next.15
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/ai-service/agent/prompts/build-base-system-prompt.d.ts +2 -1
- package/dist/ai-service/agent/prompts/build-base-system-prompt.d.ts.map +1 -1
- package/dist/ai-service/agent/prompts/build-base-system-prompt.js +18 -2
- package/dist/ai-service/agent/prompts/build-base-system-prompt.js.map +1 -1
- package/dist/ai-service/agent/subagents/testing/index.d.ts +3 -0
- package/dist/ai-service/agent/subagents/testing/index.d.ts.map +1 -0
- package/dist/ai-service/agent/subagents/testing/index.js +2 -0
- package/dist/ai-service/agent/subagents/testing/index.js.map +1 -0
- package/dist/ai-service/agent/subagents/testing/prompt-builder.d.ts +10 -0
- package/dist/ai-service/agent/subagents/testing/prompt-builder.d.ts.map +1 -0
- package/dist/ai-service/agent/subagents/testing/prompt-builder.js +162 -0
- package/dist/ai-service/agent/subagents/testing/prompt-builder.js.map +1 -0
- package/dist/ai-service/agent/subagents/testing/types.d.ts +67 -0
- package/dist/ai-service/agent/subagents/testing/types.d.ts.map +1 -0
- package/dist/ai-service/agent/subagents/testing/types.js +2 -0
- package/dist/ai-service/agent/subagents/testing/types.js.map +1 -0
- package/dist/ai-service/agent/subagents/types.d.ts +9 -8
- package/dist/ai-service/agent/subagents/types.d.ts.map +1 -1
- package/dist/ai-service/agent/subagents/types.js +9 -9
- package/dist/ai-service/agent/subagents/types.js.map +1 -1
- package/dist/ai-service/agent/tool-message-utils.d.ts +7 -2
- package/dist/ai-service/agent/tool-message-utils.d.ts.map +1 -1
- package/dist/ai-service/agent/tool-message-utils.js +21 -2
- package/dist/ai-service/agent/tool-message-utils.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/api-source.d.ts +1 -1
- package/dist/ai-service/agent/tools/apis/api-source.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/api-source.js +37 -9
- package/dist/ai-service/agent/tools/apis/api-source.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/test-api.js +1 -1
- package/dist/ai-service/agent/tools/apis/test-api.js.map +1 -1
- package/dist/ai-service/agent/tools/build-capture-screenshot.d.ts +1 -0
- package/dist/ai-service/agent/tools/build-capture-screenshot.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-capture-screenshot.js +4 -2
- package/dist/ai-service/agent/tools/build-capture-screenshot.js.map +1 -1
- package/dist/ai-service/agent/tools/build-delete-file.d.ts +1 -1
- package/dist/ai-service/agent/tools/build-manage-checklist.d.ts +1 -1
- package/dist/ai-service/agent/tools/{build-read-files.d.ts → build-read-file.d.ts} +10 -6
- package/dist/ai-service/agent/tools/build-read-file.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/build-read-file.js +139 -0
- package/dist/ai-service/agent/tools/build-read-file.js.map +1 -0
- package/dist/ai-service/agent/tools/build-reload-file.d.ts +9 -3
- package/dist/ai-service/agent/tools/build-reload-file.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-reload-file.js +20 -9
- package/dist/ai-service/agent/tools/build-reload-file.js.map +1 -1
- package/dist/ai-service/agent/tools/get-console-logs.js +1 -1
- package/dist/ai-service/agent/tools/get-console-logs.js.map +1 -1
- package/dist/ai-service/agent/tools/get-runtime-errors.js +1 -1
- package/dist/ai-service/agent/tools/get-runtime-errors.js.map +1 -1
- package/dist/ai-service/agent/tools/index.d.ts +5 -1
- package/dist/ai-service/agent/tools/index.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/index.js +5 -1
- package/dist/ai-service/agent/tools/index.js.map +1 -1
- package/dist/ai-service/agent/tools/integrations/execute-request.d.ts +1 -1
- package/dist/ai-service/agent/tools/integrations/internal.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/integrations/internal.js +8 -1
- package/dist/ai-service/agent/tools/integrations/internal.js.map +1 -1
- package/dist/ai-service/agent/tools.d.ts.map +1 -1
- package/dist/ai-service/agent/tools.js +124 -31
- package/dist/ai-service/agent/tools.js.map +1 -1
- package/dist/ai-service/agent/tools2/access-control.d.ts +23 -1
- package/dist/ai-service/agent/tools2/access-control.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/access-control.js +67 -1
- package/dist/ai-service/agent/tools2/access-control.js.map +1 -1
- package/dist/ai-service/agent/tools2/entity-permissions.d.ts +26 -0
- package/dist/ai-service/agent/tools2/entity-permissions.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/entity-permissions.js +15 -0
- package/dist/ai-service/agent/tools2/entity-permissions.js.map +1 -1
- package/dist/ai-service/agent/tools2/example.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/example.js +2 -4
- package/dist/ai-service/agent/tools2/example.js.map +1 -1
- package/dist/ai-service/agent/tools2/index.d.ts +1 -1
- package/dist/ai-service/agent/tools2/index.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/index.js +1 -1
- package/dist/ai-service/agent/tools2/index.js.map +1 -1
- package/dist/ai-service/agent/tools2/registry.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/registry.js +37 -23
- package/dist/ai-service/agent/tools2/registry.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/ask-multi-choice.d.ts +0 -1
- package/dist/ai-service/agent/tools2/tools/ask-multi-choice.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/ask-multi-choice.js +1 -6
- package/dist/ai-service/agent/tools2/tools/ask-multi-choice.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/end-test-run.d.ts +31 -0
- package/dist/ai-service/agent/tools2/tools/end-test-run.d.ts.map +1 -0
- package/dist/ai-service/agent/tools2/tools/end-test-run.js +107 -0
- package/dist/ai-service/agent/tools2/tools/end-test-run.js.map +1 -0
- package/dist/ai-service/agent/tools2/tools/exit-plan-mode.d.ts +2 -1
- package/dist/ai-service/agent/tools2/tools/exit-plan-mode.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/exit-plan-mode.js +63 -76
- package/dist/ai-service/agent/tools2/tools/exit-plan-mode.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/list-attachments.d.ts +15 -0
- package/dist/ai-service/agent/tools2/tools/list-attachments.d.ts.map +1 -0
- package/dist/ai-service/agent/tools2/tools/list-attachments.js +47 -0
- package/dist/ai-service/agent/tools2/tools/list-attachments.js.map +1 -0
- package/dist/ai-service/agent/tools2/tools/start-test-run.d.ts +24 -0
- package/dist/ai-service/agent/tools2/tools/start-test-run.d.ts.map +1 -0
- package/dist/ai-service/agent/tools2/tools/start-test-run.js +340 -0
- package/dist/ai-service/agent/tools2/tools/start-test-run.js.map +1 -0
- package/dist/ai-service/agent/tools2/tools/update-test-case-status.d.ts +29 -0
- package/dist/ai-service/agent/tools2/tools/update-test-case-status.d.ts.map +1 -0
- package/dist/ai-service/agent/tools2/tools/update-test-case-status.js +106 -0
- package/dist/ai-service/agent/tools2/tools/update-test-case-status.js.map +1 -0
- package/dist/ai-service/agent/tools2/types.d.ts +6 -24
- package/dist/ai-service/agent/tools2/types.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/types.js +4 -15
- package/dist/ai-service/agent/tools2/types.js.map +1 -1
- package/dist/ai-service/agent/utils.d.ts +10 -0
- package/dist/ai-service/agent/utils.d.ts.map +1 -1
- package/dist/ai-service/agent/utils.js +160 -2
- package/dist/ai-service/agent/utils.js.map +1 -1
- package/dist/ai-service/attachments/index.d.ts +2 -0
- package/dist/ai-service/attachments/index.d.ts.map +1 -0
- package/dist/ai-service/attachments/index.js +2 -0
- package/dist/ai-service/attachments/index.js.map +1 -0
- package/dist/ai-service/attachments/store.d.ts +65 -0
- package/dist/ai-service/attachments/store.d.ts.map +1 -0
- package/dist/ai-service/attachments/store.js +158 -0
- package/dist/ai-service/attachments/store.js.map +1 -0
- package/dist/ai-service/chat/chat-session-store.d.ts.map +1 -1
- package/dist/ai-service/chat/chat-session-store.js +133 -1
- package/dist/ai-service/chat/chat-session-store.js.map +1 -1
- package/dist/ai-service/context-download.d.ts +24 -0
- package/dist/ai-service/context-download.d.ts.map +1 -0
- package/dist/ai-service/context-download.js +127 -0
- package/dist/ai-service/context-download.js.map +1 -0
- package/dist/ai-service/context-upload.d.ts +17 -0
- package/dist/ai-service/context-upload.d.ts.map +1 -0
- package/dist/ai-service/context-upload.js +100 -0
- package/dist/ai-service/context-upload.js.map +1 -0
- package/dist/ai-service/features.d.ts +4 -0
- package/dist/ai-service/features.d.ts.map +1 -1
- package/dist/ai-service/features.js +4 -0
- package/dist/ai-service/features.js.map +1 -1
- package/dist/ai-service/index.d.ts +27 -3
- package/dist/ai-service/index.d.ts.map +1 -1
- package/dist/ai-service/index.js +259 -20
- package/dist/ai-service/index.js.map +1 -1
- package/dist/ai-service/judge/integration/mcp-client.d.ts +3 -6
- package/dist/ai-service/judge/integration/mcp-client.d.ts.map +1 -1
- package/dist/ai-service/judge/integration/mcp-client.js.map +1 -1
- package/dist/ai-service/judge/tools/playwright-action.d.ts +1 -1
- package/dist/ai-service/judge/tools/submit-feedback.d.ts +1 -1
- package/dist/ai-service/llm/client.d.ts +6 -0
- package/dist/ai-service/llm/client.d.ts.map +1 -1
- package/dist/ai-service/llm/client.js +9 -0
- package/dist/ai-service/llm/client.js.map +1 -1
- package/dist/ai-service/llm/context/constants.d.ts +8 -0
- package/dist/ai-service/llm/context/constants.d.ts.map +1 -1
- package/dist/ai-service/llm/context/constants.js +8 -0
- package/dist/ai-service/llm/context/constants.js.map +1 -1
- package/dist/ai-service/llm/context/context.d.ts +4 -0
- package/dist/ai-service/llm/context/context.d.ts.map +1 -1
- package/dist/ai-service/llm/context/context.js +22 -9
- package/dist/ai-service/llm/context/context.js.map +1 -1
- package/dist/ai-service/llm/context/manager.d.ts +6 -1
- package/dist/ai-service/llm/context/manager.d.ts.map +1 -1
- package/dist/ai-service/llm/context/manager.js +9 -1
- package/dist/ai-service/llm/context/manager.js.map +1 -1
- package/dist/ai-service/llm/context/serialization.d.ts +3 -0
- package/dist/ai-service/llm/context/serialization.d.ts.map +1 -1
- package/dist/ai-service/llm/context/utils/message-utils.d.ts +10 -0
- package/dist/ai-service/llm/context/utils/message-utils.d.ts.map +1 -1
- package/dist/ai-service/llm/context/utils/message-utils.js +92 -0
- package/dist/ai-service/llm/context/utils/message-utils.js.map +1 -1
- package/dist/ai-service/llm/interaction/provider.d.ts +1 -0
- package/dist/ai-service/llm/interaction/provider.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/config.d.ts +2 -0
- package/dist/ai-service/llm/stream/config.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/config.js +1 -0
- package/dist/ai-service/llm/stream/config.js.map +1 -1
- package/dist/ai-service/llm/stream/event-bus.d.ts +5 -0
- package/dist/ai-service/llm/stream/event-bus.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/event-bus.js.map +1 -1
- package/dist/ai-service/llm/stream/observers/llmobs.d.ts +4 -1
- package/dist/ai-service/llm/stream/observers/llmobs.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/observers/llmobs.js +194 -10
- package/dist/ai-service/llm/stream/observers/llmobs.js.map +1 -1
- package/dist/ai-service/llm/stream/observers/logging.d.ts +1 -0
- package/dist/ai-service/llm/stream/observers/logging.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/observers/logging.js +92 -20
- package/dist/ai-service/llm/stream/observers/logging.js.map +1 -1
- package/dist/ai-service/llm/stream/orchestrator.d.ts +7 -1
- package/dist/ai-service/llm/stream/orchestrator.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/orchestrator.js +23 -3
- package/dist/ai-service/llm/stream/orchestrator.js.map +1 -1
- package/dist/ai-service/llm/stream/retry-engine.d.ts +1 -0
- package/dist/ai-service/llm/stream/retry-engine.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/retry-engine.js +20 -1
- package/dist/ai-service/llm/stream/retry-engine.js.map +1 -1
- package/dist/ai-service/llm/stream/session.d.ts +14 -2
- package/dist/ai-service/llm/stream/session.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/session.js +15 -28
- package/dist/ai-service/llm/stream/session.js.map +1 -1
- package/dist/ai-service/llmobs/otel-exporter.d.ts +58 -0
- package/dist/ai-service/llmobs/otel-exporter.d.ts.map +1 -0
- package/dist/ai-service/llmobs/otel-exporter.js +182 -0
- package/dist/ai-service/llmobs/otel-exporter.js.map +1 -0
- package/dist/ai-service/llmobs/tracer.d.ts +9 -5
- package/dist/ai-service/llmobs/tracer.d.ts.map +1 -1
- package/dist/ai-service/llmobs/tracer.js +46 -41
- package/dist/ai-service/llmobs/tracer.js.map +1 -1
- package/dist/ai-service/llmobs/types.d.ts +1 -0
- package/dist/ai-service/llmobs/types.d.ts.map +1 -1
- package/dist/ai-service/mcp/adapter/mcp-tool-adapter.d.ts +1 -1
- package/dist/ai-service/mcp/adapter/mcp-tool-adapter.d.ts.map +1 -1
- package/dist/ai-service/mcp/adapter/mcp-tool-adapter.js +5 -2
- package/dist/ai-service/mcp/adapter/mcp-tool-adapter.js.map +1 -1
- package/dist/ai-service/mcp/embedded-playwright-mcp-server.d.ts +33 -1
- package/dist/ai-service/mcp/embedded-playwright-mcp-server.d.ts.map +1 -1
- package/dist/ai-service/mcp/embedded-playwright-mcp-server.js +949 -91
- package/dist/ai-service/mcp/embedded-playwright-mcp-server.js.map +1 -1
- package/dist/ai-service/mcp/playwright-server.d.ts +39 -0
- package/dist/ai-service/mcp/playwright-server.d.ts.map +1 -1
- package/dist/ai-service/mcp/playwright-server.js +56 -0
- package/dist/ai-service/mcp/playwright-server.js.map +1 -1
- package/dist/ai-service/mcp/types.d.ts +4 -0
- package/dist/ai-service/mcp/types.d.ts.map +1 -1
- package/dist/ai-service/prompts/explain-code.d.ts +2 -2
- package/dist/ai-service/prompts/explain-code.d.ts.map +1 -1
- package/dist/ai-service/prompts/explain-code.js +2 -2
- package/dist/ai-service/prompts/explain-code.js.map +1 -1
- package/dist/ai-service/state-machine/clark-fsm.d.ts +20 -1
- package/dist/ai-service/state-machine/clark-fsm.d.ts.map +1 -1
- package/dist/ai-service/state-machine/clark-fsm.js +16 -0
- package/dist/ai-service/state-machine/clark-fsm.js.map +1 -1
- package/dist/ai-service/state-machine/fsm.d.ts.map +1 -1
- package/dist/ai-service/state-machine/fsm.js +1 -0
- package/dist/ai-service/state-machine/fsm.js.map +1 -1
- package/dist/ai-service/state-machine/handlers/agent-planning.d.ts.map +1 -1
- package/dist/ai-service/state-machine/handlers/agent-planning.js +71 -7
- package/dist/ai-service/state-machine/handlers/agent-planning.js.map +1 -1
- package/dist/ai-service/state-machine/handlers/llm-generating.d.ts.map +1 -1
- package/dist/ai-service/state-machine/handlers/llm-generating.js +112 -33
- package/dist/ai-service/state-machine/handlers/llm-generating.js.map +1 -1
- package/dist/ai-service/state-machine/helpers/peer.d.ts +1 -1
- package/dist/ai-service/state-machine/helpers/peer.d.ts.map +1 -1
- package/dist/ai-service/state-machine/helpers/peer.js +21 -4
- package/dist/ai-service/state-machine/helpers/peer.js.map +1 -1
- package/dist/ai-service/state-machine/mocks.d.ts.map +1 -1
- package/dist/ai-service/state-machine/mocks.js +2 -0
- package/dist/ai-service/state-machine/mocks.js.map +1 -1
- package/dist/ai-service/state-machine/traced-fsm.d.ts +2 -0
- package/dist/ai-service/state-machine/traced-fsm.d.ts.map +1 -1
- package/dist/ai-service/state-machine/traced-fsm.js +18 -0
- package/dist/ai-service/state-machine/traced-fsm.js.map +1 -1
- package/dist/ai-service/util/safe-parse.d.ts +2 -0
- package/dist/ai-service/util/safe-parse.d.ts.map +1 -0
- package/dist/ai-service/util/safe-parse.js +9 -0
- package/dist/ai-service/util/safe-parse.js.map +1 -0
- package/dist/ai-service/util/safe-stringify.d.ts.map +1 -1
- package/dist/ai-service/util/safe-stringify.js +7 -0
- package/dist/ai-service/util/safe-stringify.js.map +1 -1
- package/dist/ai-service/util/scoped-token-utils.d.ts +15 -0
- package/dist/ai-service/util/scoped-token-utils.d.ts.map +1 -0
- package/dist/ai-service/util/scoped-token-utils.js +131 -0
- package/dist/ai-service/util/scoped-token-utils.js.map +1 -0
- package/dist/ai-service/util/stop-condition.d.ts +1 -0
- package/dist/ai-service/util/stop-condition.d.ts.map +1 -1
- package/dist/ai-service/util/stop-condition.js +5 -0
- package/dist/ai-service/util/stop-condition.js.map +1 -1
- package/dist/ai-service/util/strip-content.d.ts +2 -0
- package/dist/ai-service/util/strip-content.d.ts.map +1 -0
- package/dist/ai-service/util/strip-content.js +31 -0
- package/dist/ai-service/util/strip-content.js.map +1 -0
- package/dist/ai-service/util/tool-signature.d.ts +13 -0
- package/dist/ai-service/util/tool-signature.d.ts.map +1 -0
- package/dist/ai-service/util/tool-signature.js +38 -0
- package/dist/ai-service/util/tool-signature.js.map +1 -0
- package/dist/file-sync-vite-plugin.d.ts.map +1 -1
- package/dist/file-sync-vite-plugin.js +4 -1
- package/dist/file-sync-vite-plugin.js.map +1 -1
- package/dist/injected-index.js +2 -2
- package/dist/injected-index.js.map +1 -1
- package/dist/parsing/jsx.d.ts.map +1 -1
- package/dist/parsing/jsx.js +0 -2
- package/dist/parsing/jsx.js.map +1 -1
- package/dist/server-rpc/index.js +1 -1
- package/dist/server-rpc/index.js.map +1 -1
- package/dist/socket-manager.d.ts.map +1 -1
- package/dist/socket-manager.js +61 -4
- package/dist/socket-manager.js.map +1 -1
- package/package.json +9 -9
- package/dist/ai-service/agent/tools/build-read-files.d.ts.map +0 -1
- package/dist/ai-service/agent/tools/build-read-files.js +0 -67
- package/dist/ai-service/agent/tools/build-read-files.js.map +0 -1
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
import { generateObject } from "ai";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { getLogger } from "../../../../util/logger.js";
|
|
4
|
+
import { sendUserMessageChannel } from "../../../state-machine/helpers/peer.js";
|
|
5
|
+
import { buildTestSubagentSystemPrompt } from "../../subagents/testing/prompt-builder.js";
|
|
6
|
+
import { SubagentType } from "../../subagents/types.js";
|
|
7
|
+
import { processTestStreamChunk } from "../../utils.js";
|
|
8
|
+
import { createToolFactory, ToolCategory, PermissionLevel } from "../types.js";
|
|
9
|
+
/**
|
|
10
|
+
* startTestRun - Invokes the Testing Agent subagent to perform end-to-end testing.
|
|
11
|
+
*
|
|
12
|
+
* This tool:
|
|
13
|
+
* 1. Creates a test run with a unique ID
|
|
14
|
+
* 2. Sends test_run_start message to UI
|
|
15
|
+
* 3. Invokes the TEST subagent with filtered tools
|
|
16
|
+
* 4. Suppresses text/reasoning output (all context in tool descriptions)
|
|
17
|
+
* 5. Streams tool results back to the user
|
|
18
|
+
*/
|
|
19
|
+
export const startTestRunToolFactory = createToolFactory("startTestRun", ({ clark, services, }) => {
|
|
20
|
+
const logger = getLogger();
|
|
21
|
+
return {
|
|
22
|
+
description: `
|
|
23
|
+
Invoke the Testing Agent to perform end-to-end testing of the application.
|
|
24
|
+
|
|
25
|
+
Use this tool to start a test run when:
|
|
26
|
+
- The plan has enableTesting set to true
|
|
27
|
+
- The user explicitly asks to test (e.g., "test this", "make sure it works", "verify the changes")
|
|
28
|
+
|
|
29
|
+
The Testing Agent will:
|
|
30
|
+
- Take screenshots to verify UI state
|
|
31
|
+
- Interact with form fields, buttons, etc.
|
|
32
|
+
- Validate that the plan was executed correctly
|
|
33
|
+
- Report test results
|
|
34
|
+
|
|
35
|
+
**IMPORTANT**: Call this tool when:
|
|
36
|
+
- enableTesting is set on the plan context (REQUIRED)
|
|
37
|
+
- User explicitly asks to test the app
|
|
38
|
+
- After completing a significant feature build
|
|
39
|
+
- When the user says things like "make sure it works", "verify", "test it out"
|
|
40
|
+
|
|
41
|
+
The Testing Agent has access to Playwright browser automation and can interact with the running application.
|
|
42
|
+
|
|
43
|
+
**IF TESTS FAIL (status: "failed")**:
|
|
44
|
+
You MUST fix the issues and re-test. Do NOT call \`build_finalize\` until tests pass.
|
|
45
|
+
1. Review the summary to understand what failed
|
|
46
|
+
2. Fix the code to address the failures
|
|
47
|
+
3. Call \`startTestRun\` again to verify your fixes
|
|
48
|
+
4. Repeat until status is "completed" (max 3 attempts)
|
|
49
|
+
`,
|
|
50
|
+
category: ToolCategory.SUBAGENT,
|
|
51
|
+
defaultPermission: PermissionLevel.ALLOW,
|
|
52
|
+
readOnly: true,
|
|
53
|
+
inputSchema: z.object({
|
|
54
|
+
header: z
|
|
55
|
+
.string()
|
|
56
|
+
.describe("Short, concise header for display (e.g., 'Calculator Test', 'Login Flow', 'Form Validation')"),
|
|
57
|
+
testDescription: z
|
|
58
|
+
.string()
|
|
59
|
+
.describe("Detailed description of what to test for the prompt (e.g., 'Test basic arithmetic operations, special functions, and edge cases') based on the the user prompt and/or the plan to verify"),
|
|
60
|
+
}),
|
|
61
|
+
execute: async ({ header, testDescription }) => {
|
|
62
|
+
const testRunId = crypto.randomUUID();
|
|
63
|
+
const displayHeader = header || "End-to-end testing";
|
|
64
|
+
// check if planContext.enableTesting is explicitly set to false. if so exit this tool
|
|
65
|
+
if (clark.context.planContext?.enableTesting === false) {
|
|
66
|
+
logger.info(`[TestSubagent] Plan context enableTesting is false, exiting tool`);
|
|
67
|
+
return {
|
|
68
|
+
success: true,
|
|
69
|
+
testRunId,
|
|
70
|
+
status: "completed",
|
|
71
|
+
summary: "Testing disabled in plan context",
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
logger.info(`[TestSubagent] Test description: ${testDescription}`);
|
|
75
|
+
// Phase 1: Generate test cases via LLM call (before subagent execution)
|
|
76
|
+
const testCaseSchema = z.object({
|
|
77
|
+
testCases: z
|
|
78
|
+
.array(z.object({
|
|
79
|
+
id: z.string().describe("Unique ID for this test case"),
|
|
80
|
+
name: z.string().describe("Short name for the test case"),
|
|
81
|
+
description: z
|
|
82
|
+
.string()
|
|
83
|
+
.describe("Brief description of what this test verifies"),
|
|
84
|
+
}))
|
|
85
|
+
.min(1)
|
|
86
|
+
.max(7)
|
|
87
|
+
.describe("1-7 test cases covering the key functionality to verify. For simpler functionality, generate fewer test cases."),
|
|
88
|
+
});
|
|
89
|
+
let generatedTestCases = [];
|
|
90
|
+
try {
|
|
91
|
+
const { object: testCasesResult } = await generateObject({
|
|
92
|
+
model: services.llmProvider.modelForTask("classifyPrompt"),
|
|
93
|
+
schema: testCaseSchema,
|
|
94
|
+
prompt: `You are a QA expert. Generate 3-7 test cases to verify the following functionality.
|
|
95
|
+
|
|
96
|
+
Test Description: ${testDescription}
|
|
97
|
+
|
|
98
|
+
${clark.context.planContext?.plan ? `Plan Context:\n${clark.context.planContext.plan}` : ""}
|
|
99
|
+
|
|
100
|
+
Guidelines:
|
|
101
|
+
- Each test case should verify ONE specific piece of functionality
|
|
102
|
+
- Test cases should be feature-level, not click-level (e.g., "Login form submission" not "Click login button")
|
|
103
|
+
- Use unique IDs like "test-1", "test-2", etc.
|
|
104
|
+
- Keep names concise (max 50 chars)
|
|
105
|
+
- Cover both happy path and edge cases where relevant
|
|
106
|
+
- The test cases are meant to be executed in order, so if there are dependencies between test cases, make sure to order the test cases accordingly.
|
|
107
|
+
- Generate 1-3 test cases for simple changes (styling, colors, text)
|
|
108
|
+
- Generate 3-5 test cases for medium complexity (form fields, simple interactions)
|
|
109
|
+
- Generate 5-7 test cases only for complex features (multi-step flows, validation logic)
|
|
110
|
+
- ONLY test what is described - do NOT test unrelated functionality
|
|
111
|
+
|
|
112
|
+
Generate test cases that would be useful for verifying this functionality works correctly.`,
|
|
113
|
+
});
|
|
114
|
+
generatedTestCases = testCasesResult.testCases;
|
|
115
|
+
logger.info(`[TestSubagent] Generated ${generatedTestCases.length} test cases`);
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
// If test case generation fails, continue without predefined cases
|
|
119
|
+
logger.warn(`[TestSubagent] Failed to generate test cases: ${error instanceof Error ? error.message : String(error)}`);
|
|
120
|
+
}
|
|
121
|
+
// Prepare test cases with initial status
|
|
122
|
+
const testCases = generatedTestCases.map((tc) => ({
|
|
123
|
+
...tc,
|
|
124
|
+
status: "not_started",
|
|
125
|
+
}));
|
|
126
|
+
// Store test run ID and test cases in context
|
|
127
|
+
clark.updateContext({
|
|
128
|
+
currentTestRunId: testRunId,
|
|
129
|
+
currentTestCases: testCases,
|
|
130
|
+
testCaseStatuses: new Map(testCases.map((tc) => [tc.id, "not_started"])),
|
|
131
|
+
});
|
|
132
|
+
// Send test_run_start message to UI with test cases
|
|
133
|
+
const sendUserMessage = sendUserMessageChannel(clark, services.chatSessionStore);
|
|
134
|
+
await sendUserMessage({
|
|
135
|
+
type: "test_run_start",
|
|
136
|
+
testRunId,
|
|
137
|
+
header: displayHeader,
|
|
138
|
+
testCases: testCases.length > 0 ? testCases : undefined,
|
|
139
|
+
role: "assistant",
|
|
140
|
+
content: "",
|
|
141
|
+
});
|
|
142
|
+
// Capture interactive elements from the current page for DOM context
|
|
143
|
+
// This helps the LLM know which elements are available for interaction
|
|
144
|
+
// without needing to explore the DOM with evaluate()
|
|
145
|
+
let interactiveElements = [];
|
|
146
|
+
try {
|
|
147
|
+
interactiveElements =
|
|
148
|
+
await services.mcpServerManager.captureInteractiveElements();
|
|
149
|
+
logger.info(`[TestSubagent] Captured ${interactiveElements.length} interactive elements for DOM context`);
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
logger.warn(`[TestSubagent] Failed to capture interactive elements: ${error instanceof Error ? error.message : String(error)}`);
|
|
153
|
+
}
|
|
154
|
+
// Build test-specific system prompt with test cases and DOM context
|
|
155
|
+
const testSystemPrompt = buildTestSubagentSystemPrompt({
|
|
156
|
+
testRunId,
|
|
157
|
+
header: displayHeader,
|
|
158
|
+
planContext: clark.context.planContext,
|
|
159
|
+
testCases,
|
|
160
|
+
interactiveElements,
|
|
161
|
+
});
|
|
162
|
+
// Get tools filtered for TEST subagent
|
|
163
|
+
const accessControl = clark.getAccessControl();
|
|
164
|
+
const testTools = await services.toolRegistry.getToolsRecord({
|
|
165
|
+
...accessControl,
|
|
166
|
+
subagent: SubagentType.TEST,
|
|
167
|
+
});
|
|
168
|
+
// Invoke the test subagent
|
|
169
|
+
try {
|
|
170
|
+
const maxSteps = 100;
|
|
171
|
+
const testCaseList = testCases.length > 0
|
|
172
|
+
? `\n\nYou MUST execute ALL ${testCases.length} test cases listed in the system prompt:\n${testCases.map((tc) => `- ${tc.id}: ${tc.name}`).join("\n")}`
|
|
173
|
+
: "";
|
|
174
|
+
const result = await clark.streamText(services, {
|
|
175
|
+
system: testSystemPrompt,
|
|
176
|
+
user: {
|
|
177
|
+
role: "user",
|
|
178
|
+
content: `Test the application.${testCaseList}\n\nContext: ${testDescription}`,
|
|
179
|
+
},
|
|
180
|
+
tools: testTools,
|
|
181
|
+
context: {
|
|
182
|
+
// don't send over the full chat history to improve performance
|
|
183
|
+
messages: [],
|
|
184
|
+
},
|
|
185
|
+
maxSteps,
|
|
186
|
+
// Stop when endTestRun is called (like judge stops on submitFeedback)
|
|
187
|
+
stopWhen: ({ steps }) => {
|
|
188
|
+
const lastStep = steps[steps.length - 1];
|
|
189
|
+
const hasEndTestRun = lastStep?.toolCalls?.some((tc) => tc.toolName === "endTestRun");
|
|
190
|
+
return hasEndTestRun ?? false;
|
|
191
|
+
},
|
|
192
|
+
// Warn about remaining steps and force endTestRun on final step
|
|
193
|
+
prepareStep: (step) => {
|
|
194
|
+
const remainingSteps = maxSteps - step.stepNumber - 1;
|
|
195
|
+
const halfwayPoint = Math.floor(maxSteps / 2);
|
|
196
|
+
let modifiedStep = step;
|
|
197
|
+
// Check if user requested to skip a test case
|
|
198
|
+
const skipRequestedForTestCase = clark.context.skipRequestedForTestCase;
|
|
199
|
+
if (skipRequestedForTestCase) {
|
|
200
|
+
logger.info(`[TestSubagent] User requested skip for test case: ${skipRequestedForTestCase}`);
|
|
201
|
+
// Find the next test case to run
|
|
202
|
+
const currentTestCases = clark.context.currentTestCases ?? [];
|
|
203
|
+
const skippedIndex = currentTestCases.findIndex((tc) => tc.id === skipRequestedForTestCase);
|
|
204
|
+
const nextTestCase = skippedIndex >= 0 &&
|
|
205
|
+
skippedIndex < currentTestCases.length - 1
|
|
206
|
+
? currentTestCases[skippedIndex + 1]
|
|
207
|
+
: null;
|
|
208
|
+
let skipInstruction;
|
|
209
|
+
if (nextTestCase) {
|
|
210
|
+
skipInstruction = `**USER SKIPPED TEST CASE**: The user has skipped test case "${skipRequestedForTestCase}". Move immediately to the next test case "${nextTestCase.id}" (${nextTestCase.name}). Do NOT continue testing the skipped case. Call \`updateTestCaseStatus\` with status "running" for "${nextTestCase.id}" and proceed with testing it.`;
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
skipInstruction = `**USER SKIPPED TEST CASE**: The user has skipped test case "${skipRequestedForTestCase}" which was the last test case. Call \`endTestRun\` to complete the test run.`;
|
|
214
|
+
}
|
|
215
|
+
const skipMessage = {
|
|
216
|
+
role: "user",
|
|
217
|
+
content: [
|
|
218
|
+
{
|
|
219
|
+
type: "text",
|
|
220
|
+
text: skipInstruction,
|
|
221
|
+
},
|
|
222
|
+
],
|
|
223
|
+
};
|
|
224
|
+
// We'll keep injecting this instruction until the agent actually starts a different
|
|
225
|
+
// test case (cleared in updateTestCaseStatus) or ends the run.
|
|
226
|
+
const lastMessage = modifiedStep.messages.at(-1);
|
|
227
|
+
const lastText = typeof lastMessage === "object" &&
|
|
228
|
+
lastMessage &&
|
|
229
|
+
"content" in lastMessage &&
|
|
230
|
+
Array.isArray(lastMessage.content)
|
|
231
|
+
? lastMessage.content?.[0]?.text
|
|
232
|
+
: undefined;
|
|
233
|
+
modifiedStep =
|
|
234
|
+
lastText === skipInstruction
|
|
235
|
+
? modifiedStep
|
|
236
|
+
: {
|
|
237
|
+
...modifiedStep,
|
|
238
|
+
messages: [...modifiedStep.messages, skipMessage],
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
// Final step: restrict to endTestRun only
|
|
242
|
+
if (step.stepNumber === maxSteps - 1) {
|
|
243
|
+
const warningMessage = {
|
|
244
|
+
role: "user",
|
|
245
|
+
content: [
|
|
246
|
+
{
|
|
247
|
+
type: "text",
|
|
248
|
+
text: "**CRITICAL: This is your FINAL step. You MUST call `endTestRun` now. No other tools are available.**",
|
|
249
|
+
},
|
|
250
|
+
],
|
|
251
|
+
};
|
|
252
|
+
return {
|
|
253
|
+
...modifiedStep,
|
|
254
|
+
messages: [...modifiedStep.messages, warningMessage],
|
|
255
|
+
activeTools: ["endTestRun"],
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
// Warn from halfway point onwards
|
|
259
|
+
else if (step.stepNumber >= halfwayPoint && remainingSteps > 0) {
|
|
260
|
+
const warningMessage = {
|
|
261
|
+
role: "user",
|
|
262
|
+
content: [
|
|
263
|
+
{
|
|
264
|
+
type: "text",
|
|
265
|
+
text: `**IMPORTANT: You have ${remainingSteps} step${remainingSteps === 1 ? "" : "s"} remaining. Wrap up testing and call \`endTestRun\` soon.**`,
|
|
266
|
+
},
|
|
267
|
+
],
|
|
268
|
+
};
|
|
269
|
+
return {
|
|
270
|
+
...modifiedStep,
|
|
271
|
+
messages: [...modifiedStep.messages, warningMessage],
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
return modifiedStep;
|
|
275
|
+
},
|
|
276
|
+
});
|
|
277
|
+
let testSummary = null;
|
|
278
|
+
// Process stream chunks with test-specific handling
|
|
279
|
+
// - Text/reasoning is suppressed (not sent to UI)
|
|
280
|
+
// - browser_playwright_action results become test steps
|
|
281
|
+
// - endTestRun handles sending test_run_end message with reconciliation
|
|
282
|
+
for await (const chunk of result.fullStream) {
|
|
283
|
+
// Extract summary from endTestRun result for the return value
|
|
284
|
+
if (chunk.type === "tool-result" &&
|
|
285
|
+
"toolName" in chunk &&
|
|
286
|
+
chunk.toolName === "endTestRun") {
|
|
287
|
+
const output = chunk.output;
|
|
288
|
+
if (output?.success) {
|
|
289
|
+
testSummary = {
|
|
290
|
+
testStatus: output.testStatus,
|
|
291
|
+
summary: output.summary,
|
|
292
|
+
};
|
|
293
|
+
logger.info(`[TestSubagent] Test summary extracted - ${output.summary}`);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
await processTestStreamChunk(chunk, clark, services);
|
|
297
|
+
}
|
|
298
|
+
logger.info(`[TestSubagent] Test run completed: ${testRunId}`);
|
|
299
|
+
// Build the final result from testSummary, using defaults for missing values
|
|
300
|
+
const status = testSummary?.testStatus ?? "completed";
|
|
301
|
+
const summary = testSummary?.summary ?? "Testing completed without summary.";
|
|
302
|
+
// Note: test_run_end message is sent by endTestRun tool with reconciliation
|
|
303
|
+
// We need to send it here only if endTestRun wasn't called (shouldn't happen normally)
|
|
304
|
+
if (!testSummary) {
|
|
305
|
+
void sendUserMessage({
|
|
306
|
+
type: "test_run_end",
|
|
307
|
+
testRunId,
|
|
308
|
+
testStatus: "completed",
|
|
309
|
+
summary: "Testing completed.",
|
|
310
|
+
role: "assistant",
|
|
311
|
+
content: "",
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
return {
|
|
315
|
+
success: true,
|
|
316
|
+
testRunId,
|
|
317
|
+
status,
|
|
318
|
+
summary,
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
catch (error) {
|
|
322
|
+
logger.error(`[TestSubagent] Test run failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
323
|
+
// Send test_run_end with failed status
|
|
324
|
+
await sendUserMessage({
|
|
325
|
+
type: "test_run_end",
|
|
326
|
+
testRunId,
|
|
327
|
+
testStatus: "failed",
|
|
328
|
+
role: "assistant",
|
|
329
|
+
content: "",
|
|
330
|
+
});
|
|
331
|
+
// Clear test run context
|
|
332
|
+
clark.updateContext({
|
|
333
|
+
currentTestRunId: undefined,
|
|
334
|
+
});
|
|
335
|
+
throw error;
|
|
336
|
+
}
|
|
337
|
+
},
|
|
338
|
+
};
|
|
339
|
+
});
|
|
340
|
+
//# sourceMappingURL=start-test-run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-test-run.js","sourceRoot":"","sources":["../../../../../src/ai-service/agent/tools2/tools/start-test-run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Clark, ClarkStateHandlerParams } from "../../../state-machine/clark-fsm.js";
|
|
2
|
+
/**
|
|
3
|
+
* updateTestCaseStatus - Updates the status of a specific test case during a test run.
|
|
4
|
+
*
|
|
5
|
+
* This tool:
|
|
6
|
+
* 1. Validates that the test case ID exists
|
|
7
|
+
* 2. Updates the status in clark context (server-side tracking)
|
|
8
|
+
* 3. Sends test_case_update message to UI
|
|
9
|
+
*
|
|
10
|
+
* Only accessible to the TEST subagent (ToolCategory.TEST).
|
|
11
|
+
*/
|
|
12
|
+
export declare const updateTestCaseStatusToolFactory: import("../types.js").ToolFactory<{
|
|
13
|
+
clark: Clark;
|
|
14
|
+
services: ClarkStateHandlerParams;
|
|
15
|
+
}, import("../types.js").Tool<{
|
|
16
|
+
status: "failed" | "running" | "passed" | "skipped";
|
|
17
|
+
testCaseId: string;
|
|
18
|
+
}, {
|
|
19
|
+
success: boolean;
|
|
20
|
+
error: string;
|
|
21
|
+
testCaseId?: undefined;
|
|
22
|
+
status?: undefined;
|
|
23
|
+
} | {
|
|
24
|
+
success: boolean;
|
|
25
|
+
testCaseId: string;
|
|
26
|
+
status: "failed" | "running" | "passed" | "skipped";
|
|
27
|
+
error?: undefined;
|
|
28
|
+
}>>;
|
|
29
|
+
//# sourceMappingURL=update-test-case-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-test-case-status.d.ts","sourceRoot":"","sources":["../../../../../src/ai-service/agent/tools2/tools/update-test-case-status.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,KAAK,EACL,uBAAuB,EACxB,MAAM,qCAAqC,CAAC;AAE7C;;;;;;;;;GASG;AACH,eAAO,MAAM,+BAA+B;WAMjC,KAAK;cACF,uBAAuB;;;;;;;;;;;;;;GAqHpC,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { getLogger } from "../../../../util/logger.js";
|
|
3
|
+
import { sendUserMessageChannel } from "../../../state-machine/helpers/peer.js";
|
|
4
|
+
import { createToolFactory, ToolCategory, PermissionLevel } from "../types.js";
|
|
5
|
+
/**
|
|
6
|
+
* updateTestCaseStatus - Updates the status of a specific test case during a test run.
|
|
7
|
+
*
|
|
8
|
+
* This tool:
|
|
9
|
+
* 1. Validates that the test case ID exists
|
|
10
|
+
* 2. Updates the status in clark context (server-side tracking)
|
|
11
|
+
* 3. Sends test_case_update message to UI
|
|
12
|
+
*
|
|
13
|
+
* Only accessible to the TEST subagent (ToolCategory.TEST).
|
|
14
|
+
*/
|
|
15
|
+
export const updateTestCaseStatusToolFactory = createToolFactory("updateTestCaseStatus", ({ clark, services, }) => {
|
|
16
|
+
const logger = getLogger();
|
|
17
|
+
return {
|
|
18
|
+
description: `
|
|
19
|
+
Update the status of a specific test case during the test run.
|
|
20
|
+
|
|
21
|
+
**IMPORTANT**: You MUST call this tool:
|
|
22
|
+
1. BEFORE starting each test case - set status to "running"
|
|
23
|
+
2. AFTER completing each test case - set status to "passed" or "failed"
|
|
24
|
+
|
|
25
|
+
Example workflow for test case "test-1":
|
|
26
|
+
1. updateTestCaseStatus({ testCaseId: "test-1", status: "running" })
|
|
27
|
+
2. ... perform browser actions for the test ...
|
|
28
|
+
3. updateTestCaseStatus({ testCaseId: "test-1", status: "passed" })
|
|
29
|
+
|
|
30
|
+
This ensures the UI shows real-time progress of which tests are running and their results.
|
|
31
|
+
`,
|
|
32
|
+
category: ToolCategory.TEST,
|
|
33
|
+
defaultPermission: PermissionLevel.ALLOW,
|
|
34
|
+
readOnly: true,
|
|
35
|
+
inputSchema: z.object({
|
|
36
|
+
testCaseId: z
|
|
37
|
+
.string()
|
|
38
|
+
.describe("ID of the test case to update (e.g., 'test-1')"),
|
|
39
|
+
status: z
|
|
40
|
+
.enum(["running", "passed", "failed", "skipped"])
|
|
41
|
+
.describe("New status for the test case: 'running' when starting, 'passed' or 'failed' when complete, 'skipped' when user skips the test"),
|
|
42
|
+
}),
|
|
43
|
+
execute: async ({ testCaseId, status }) => {
|
|
44
|
+
const testRunId = clark.context.currentTestRunId;
|
|
45
|
+
const testCases = clark.context.currentTestCases;
|
|
46
|
+
if (!testRunId) {
|
|
47
|
+
logger.warn(`[TestSubagent] No active test run for updateTestCaseStatus`);
|
|
48
|
+
return {
|
|
49
|
+
success: false,
|
|
50
|
+
error: "No active test run",
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
const existingStatuses = clark.context.testCaseStatuses;
|
|
54
|
+
const existingStatus = existingStatuses?.get(testCaseId);
|
|
55
|
+
if (existingStatus === "skipped" && status !== "skipped") {
|
|
56
|
+
// Prevent the test subagent from "un-skipping" a test case that the user skipped.
|
|
57
|
+
// This keeps UI + server-side reconciliation consistent.
|
|
58
|
+
logger.info(`[TestSubagent] Ignoring status update for skipped test case '${testCaseId}': attempted '${status}'`);
|
|
59
|
+
return {
|
|
60
|
+
success: false,
|
|
61
|
+
error: `Test case '${testCaseId}' was skipped by the user`,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
// Validate that the test case exists
|
|
65
|
+
if (testCases && testCases.length > 0) {
|
|
66
|
+
const testCaseExists = testCases.some((tc) => tc.id === testCaseId);
|
|
67
|
+
if (!testCaseExists) {
|
|
68
|
+
logger.warn(`[TestSubagent] Test case ID '${testCaseId}' not found in current test cases`);
|
|
69
|
+
// Don't fail - allow the update anyway in case of LLM inconsistency
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Update status in context for server-side tracking
|
|
73
|
+
const testCaseStatuses = clark.context.testCaseStatuses ??
|
|
74
|
+
new Map();
|
|
75
|
+
testCaseStatuses.set(testCaseId, status);
|
|
76
|
+
// Clear sticky skip instruction once the agent starts a different test case.
|
|
77
|
+
// This prevents the skip instruction from being injected repeatedly after the agent moves on.
|
|
78
|
+
const skipRequestedForTestCase = clark.context.skipRequestedForTestCase;
|
|
79
|
+
clark.updateContext({
|
|
80
|
+
testCaseStatuses,
|
|
81
|
+
...(status === "running" &&
|
|
82
|
+
skipRequestedForTestCase &&
|
|
83
|
+
testCaseId !== skipRequestedForTestCase
|
|
84
|
+
? { skipRequestedForTestCase: undefined }
|
|
85
|
+
: {}),
|
|
86
|
+
});
|
|
87
|
+
// Send test_case_update message to UI
|
|
88
|
+
const sendUserMessage = sendUserMessageChannel(clark, services.chatSessionStore);
|
|
89
|
+
await sendUserMessage({
|
|
90
|
+
type: "test_case_update",
|
|
91
|
+
testRunId,
|
|
92
|
+
testCaseId,
|
|
93
|
+
testCaseStatus: status,
|
|
94
|
+
role: "assistant",
|
|
95
|
+
content: "",
|
|
96
|
+
});
|
|
97
|
+
logger.info(`[TestSubagent] Test case '${testCaseId}' status updated to '${status}'`);
|
|
98
|
+
return {
|
|
99
|
+
success: true,
|
|
100
|
+
testCaseId,
|
|
101
|
+
status,
|
|
102
|
+
};
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
});
|
|
106
|
+
//# sourceMappingURL=update-test-case-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-test-case-status.js","sourceRoot":"","sources":["../../../../../src/ai-service/agent/tools2/tools/update-test-case-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAM/E;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,iBAAiB,CAC9D,sBAAsB,EACtB,CAAC,EACC,KAAK,EACL,QAAQ,GAIT,EAAE,EAAE;IACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,OAAO;QACL,WAAW,EAAE;;;;;;;;;;;;;CAalB;QACK,QAAQ,EAAE,YAAY,CAAC,IAAI;QAC3B,iBAAiB,EAAE,eAAe,CAAC,KAAK;QACxC,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,UAAU,EAAE,CAAC;iBACV,MAAM,EAAE;iBACR,QAAQ,CAAC,gDAAgD,CAAC;YAC7D,MAAM,EAAE,CAAC;iBACN,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;iBAChD,QAAQ,CACP,+HAA+H,CAChI;SACJ,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE;YACxC,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC;YACjD,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC;YAEjD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CACT,4DAA4D,CAC7D,CAAC;gBACF,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,oBAAoB;iBAC5B,CAAC;YACJ,CAAC;YAED,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC;YACxD,MAAM,cAAc,GAAG,gBAAgB,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;YACzD,IAAI,cAAc,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzD,kFAAkF;gBAClF,yDAAyD;gBACzD,MAAM,CAAC,IAAI,CACT,gEAAgE,UAAU,iBAAiB,MAAM,GAAG,CACrG,CAAC;gBACF,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,cAAc,UAAU,2BAA2B;iBAC3D,CAAC;YACJ,CAAC;YAED,qCAAqC;YACrC,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtC,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;gBACpE,IAAI,CAAC,cAAc,EAAE,CAAC;oBACpB,MAAM,CAAC,IAAI,CACT,gCAAgC,UAAU,mCAAmC,CAC9E,CAAC;oBACF,oEAAoE;gBACtE,CAAC;YACH,CAAC;YAED,oDAAoD;YACpD,MAAM,gBAAgB,GACpB,KAAK,CAAC,OAAO,CAAC,gBAAgB;gBAC9B,IAAI,GAAG,EAGJ,CAAC;YACN,gBAAgB,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACzC,6EAA6E;YAC7E,8FAA8F;YAC9F,MAAM,wBAAwB,GAAG,KAAK,CAAC,OAAO,CAAC,wBAAwB,CAAC;YACxE,KAAK,CAAC,aAAa,CAAC;gBAClB,gBAAgB;gBAChB,GAAG,CAAC,MAAM,KAAK,SAAS;oBACxB,wBAAwB;oBACxB,UAAU,KAAK,wBAAwB;oBACrC,CAAC,CAAC,EAAE,wBAAwB,EAAE,SAAS,EAAE;oBACzC,CAAC,CAAC,EAAE,CAAC;aACR,CAAC,CAAC;YAEH,sCAAsC;YACtC,MAAM,eAAe,GAAG,sBAAsB,CAC5C,KAAK,EACL,QAAQ,CAAC,gBAAgB,CAC1B,CAAC;YACF,MAAM,eAAe,CAAC;gBACpB,IAAI,EAAE,kBAAkB;gBACxB,SAAS;gBACT,UAAU;gBACV,cAAc,EAAE,MAAM;gBACtB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,EAAE;aACZ,CAAC,CAAC;YAEH,MAAM,CAAC,IAAI,CACT,6BAA6B,UAAU,wBAAwB,MAAM,GAAG,CACzE,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,UAAU;gBACV,MAAM;aACP,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC,CACF,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { SubagentType } from "../subagents/types.js";
|
|
2
|
-
import type { AiMode, AiEntityType, PlanContext, PromptContextEntity, PromptContextIntegration, AiPermissionType, AiToolPermission } from "@superblocksteam/library-shared/types";
|
|
2
|
+
import type { AiMode, AiEntityType, PlanContext, PromptContextEntity, PromptContextIntegration, AiPermissionType, AiToolPermission, AiToolExecutionErrorCode } from "@superblocksteam/library-shared/types";
|
|
3
3
|
import type { ToolCallOptions } from "ai";
|
|
4
4
|
import type z from "zod";
|
|
5
5
|
/**
|
|
@@ -15,7 +15,8 @@ export declare enum ToolCategory {
|
|
|
15
15
|
METADATA = "metadata",
|
|
16
16
|
DATA = "data",
|
|
17
17
|
PLAN = "plan",
|
|
18
|
-
TEST = "test"
|
|
18
|
+
TEST = "test",
|
|
19
|
+
DEBUG = "debug"
|
|
19
20
|
}
|
|
20
21
|
/**
|
|
21
22
|
* Entity reference extracted from tool input.
|
|
@@ -147,20 +148,6 @@ export declare enum PermissionLevel {
|
|
|
147
148
|
/** Block execution completely */
|
|
148
149
|
BLOCK = "block"
|
|
149
150
|
}
|
|
150
|
-
/**
|
|
151
|
-
* User response to a tool permission prompt.
|
|
152
|
-
*
|
|
153
|
-
* Controls both execution and whether the permission should be stored
|
|
154
|
-
* in the entity permission store for future use.
|
|
155
|
-
*/
|
|
156
|
-
export declare enum ToolPermissionResponse {
|
|
157
|
-
/** Execute the tool once, but don't store permission (user will be prompted again next time) */
|
|
158
|
-
ALLOW = "allow",
|
|
159
|
-
/** Execute the tool AND store permission in the entity store (never prompt again for this entity) */
|
|
160
|
-
ALWAYS_ALLOW = "always_allow",
|
|
161
|
-
/** Block execution completely */
|
|
162
|
-
DENY = "deny"
|
|
163
|
-
}
|
|
164
151
|
/**
|
|
165
152
|
* Factory for creating tool instances.
|
|
166
153
|
*
|
|
@@ -255,13 +242,6 @@ export interface AccessControlContext {
|
|
|
255
242
|
* Rules are evaluated in order, most restrictive wins.
|
|
256
243
|
*/
|
|
257
244
|
export type AccessControlRule = (tool: Tool, context: AccessControlContext, input?: any) => PermissionLevel | Promise<PermissionLevel>;
|
|
258
|
-
/**
|
|
259
|
-
* Result from a prompt handler, including the response and which permissions to always allow.
|
|
260
|
-
*/
|
|
261
|
-
export interface PromptHandlerResult {
|
|
262
|
-
response: ToolPermissionResponse;
|
|
263
|
-
alwaysAllowPermissions?: AiToolPermission[];
|
|
264
|
-
}
|
|
265
245
|
/**
|
|
266
246
|
* Handler for prompting user for confirmation.
|
|
267
247
|
*
|
|
@@ -279,7 +259,7 @@ export interface PromptHandlerResult {
|
|
|
279
259
|
* - ALWAYS_ALLOW: Execute and store permission for future use (with alwaysAllowPermissions indicating which specific permissions to store)
|
|
280
260
|
* - DENY: Block execution
|
|
281
261
|
*/
|
|
282
|
-
export type PromptHandler = (tool: Tool, input: any, permissions: AiToolPermission[], context: AccessControlContext, options?: ToolCallOptions) => Promise<
|
|
262
|
+
export type PromptHandler = (tool: Tool, input: any, permissions: AiToolPermission[], context: AccessControlContext, options?: ToolCallOptions) => Promise<void>;
|
|
283
263
|
/**
|
|
284
264
|
* Middleware function that can transform tools.
|
|
285
265
|
* Receives the tool name and tool instance, returns transformed tool.
|
|
@@ -302,6 +282,7 @@ export interface ToolExecutionErrorOptions {
|
|
|
302
282
|
input: any;
|
|
303
283
|
context: AccessControlContext;
|
|
304
284
|
cause?: unknown;
|
|
285
|
+
code?: AiToolExecutionErrorCode;
|
|
305
286
|
}
|
|
306
287
|
export declare class ToolExecutionError extends Error {
|
|
307
288
|
readonly name: string;
|
|
@@ -310,6 +291,7 @@ export declare class ToolExecutionError extends Error {
|
|
|
310
291
|
constructor(message: string, options?: ToolExecutionErrorOptions);
|
|
311
292
|
constructor(options?: ToolExecutionErrorOptions);
|
|
312
293
|
private getMessage;
|
|
294
|
+
get code(): AiToolExecutionErrorCode | undefined;
|
|
313
295
|
get toolName(): string | undefined;
|
|
314
296
|
get input(): any;
|
|
315
297
|
get message(): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/ai-service/agent/tools2/types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EACV,MAAM,EACN,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,wBAAwB,EACxB,gBAAgB,EAChB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/ai-service/agent/tools2/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,7 @@ export var ToolCategory;
|
|
|
14
14
|
ToolCategory["DATA"] = "data";
|
|
15
15
|
ToolCategory["PLAN"] = "plan";
|
|
16
16
|
ToolCategory["TEST"] = "test";
|
|
17
|
+
ToolCategory["DEBUG"] = "debug";
|
|
17
18
|
})(ToolCategory || (ToolCategory = {}));
|
|
18
19
|
/**
|
|
19
20
|
* Permission levels for tool execution.
|
|
@@ -27,21 +28,6 @@ export var PermissionLevel;
|
|
|
27
28
|
/** Block execution completely */
|
|
28
29
|
PermissionLevel["BLOCK"] = "block";
|
|
29
30
|
})(PermissionLevel || (PermissionLevel = {}));
|
|
30
|
-
/**
|
|
31
|
-
* User response to a tool permission prompt.
|
|
32
|
-
*
|
|
33
|
-
* Controls both execution and whether the permission should be stored
|
|
34
|
-
* in the entity permission store for future use.
|
|
35
|
-
*/
|
|
36
|
-
export var ToolPermissionResponse;
|
|
37
|
-
(function (ToolPermissionResponse) {
|
|
38
|
-
/** Execute the tool once, but don't store permission (user will be prompted again next time) */
|
|
39
|
-
ToolPermissionResponse["ALLOW"] = "allow";
|
|
40
|
-
/** Execute the tool AND store permission in the entity store (never prompt again for this entity) */
|
|
41
|
-
ToolPermissionResponse["ALWAYS_ALLOW"] = "always_allow";
|
|
42
|
-
/** Block execution completely */
|
|
43
|
-
ToolPermissionResponse["DENY"] = "deny";
|
|
44
|
-
})(ToolPermissionResponse || (ToolPermissionResponse = {}));
|
|
45
31
|
/**
|
|
46
32
|
* Helper function to create a tool factory without name duplication.
|
|
47
33
|
*
|
|
@@ -121,6 +107,9 @@ export class ToolExecutionError extends Error {
|
|
|
121
107
|
}
|
|
122
108
|
return message;
|
|
123
109
|
}
|
|
110
|
+
get code() {
|
|
111
|
+
return this.options?.code;
|
|
112
|
+
}
|
|
124
113
|
get toolName() {
|
|
125
114
|
return this.options?.toolName;
|
|
126
115
|
}
|