@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features.js","sourceRoot":"","sources":["../../src/ai-service/features.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAsBpB;;;;;;;;;;;;GAYG;AACH,MAAM,gBAAgB,GAAG;IACvB,2BAA2B,EAAE;QAC3B,GAAG,EAAE,2BAA2B;QAChC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;KACnB;IACD,gCAAgC,EAAE;QAChC,GAAG,EAAE,0BAA0B;QAC/B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;KACnB;IACD,oBAAoB,EAAE;QACpB,GAAG,EAAE,yBAAyB;QAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC9B;IACD,kBAAkB,EAAE;QAClB,GAAG,EAAE,0BAA0B;QAC/B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC9B;IACD,uBAAuB,EAAE;QACvB,GAAG,EAAE,+BAA+B;QACpC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC7B;IACD,sBAAsB,EAAE;QACtB,GAAG,EAAE,iCAAiC;QACtC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE;KACpB;CAC6C,CAAC;AAUjD,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC;;OAEG;IACH,MAAM,CAAC,QAAiC,EAAE;QACxC,OAAO,IAAI,KAAK,CAAC,EAA2B,EAAE;YAC5C,GAAG,CAAC,OAAO,EAAE,IAAqB;gBAChC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,IAAI,gBAAgB,CAAC,EAAE,CAAC;oBAC5D,OAAO,SAAS,CAAC;gBACnB,CAAC;gBAED,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAqC,CAAC,CAAC;gBACpE,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAE3B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;oBACtB,OAAO,SAAS,CAAC;gBACnB,CAAC;gBAED,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACzC,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;YAClD,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"features.js","sourceRoot":"","sources":["../../src/ai-service/features.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAsBpB;;;;;;;;;;;;GAYG;AACH,MAAM,gBAAgB,GAAG;IACvB,2BAA2B,EAAE;QAC3B,GAAG,EAAE,2BAA2B;QAChC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;KACnB;IACD,gCAAgC,EAAE;QAChC,GAAG,EAAE,0BAA0B;QAC/B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;KACnB;IACD,oBAAoB,EAAE;QACpB,GAAG,EAAE,yBAAyB;QAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC9B;IACD,kBAAkB,EAAE;QAClB,GAAG,EAAE,0BAA0B;QAC/B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC9B;IACD,uBAAuB,EAAE;QACvB,GAAG,EAAE,+BAA+B;QACpC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC7B;IACD,sBAAsB,EAAE;QACtB,GAAG,EAAE,iCAAiC;QACtC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE;KACpB;IACD,oBAAoB,EAAE;QACpB,GAAG,EAAE,2BAA2B;QAChC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC9B;CAC6C,CAAC;AAUjD,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC;;OAEG;IACH,MAAM,CAAC,QAAiC,EAAE;QACxC,OAAO,IAAI,KAAK,CAAC,EAA2B,EAAE;YAC5C,GAAG,CAAC,OAAO,EAAE,IAAqB;gBAChC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,IAAI,gBAAgB,CAAC,EAAE,CAAC;oBAC5D,OAAO,SAAS,CAAC;gBACnB,CAAC;gBAED,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAqC,CAAC,CAAC;gBACpE,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAE3B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;oBACtB,OAAO,SAAS,CAAC;gBACnB,CAAC;gBAED,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACzC,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;YAClD,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
|
|
@@ -5,7 +5,8 @@ import type { FileSystemManager } from "../file-system-manager.js";
|
|
|
5
5
|
import type { SourceTracker } from "../source-tracker.js";
|
|
6
6
|
import type { JudgeEvaluationOptions, JudgeEvaluationResult } from "./judge/judge-service.js";
|
|
7
7
|
import type { AiServiceConfig, AiServiceEvents, EditorClient, UserChange, ApiUpdate } from "./types.ts";
|
|
8
|
-
import type {
|
|
8
|
+
import type { ContextId } from "./llm/context/types.js";
|
|
9
|
+
import type { AiGenerateRequest, AiExplainCodeRequest, AiLabelAttachmentRequest, AiLabelAttachmentResponse, LLMProviderConfig, PromptContext, RuntimeErrorData, ConsoleLogEntry } from "@superblocksteam/library-shared/types";
|
|
9
10
|
import type { ViteDevServer } from "vite";
|
|
10
11
|
export { AiServiceFeatureFlags } from "./features.js";
|
|
11
12
|
export declare class AiService extends TracedEventEmitter<AiServiceEvents> {
|
|
@@ -18,7 +19,7 @@ export declare class AiService extends TracedEventEmitter<AiServiceEvents> {
|
|
|
18
19
|
private _appContext;
|
|
19
20
|
private llmProviderSettings;
|
|
20
21
|
private _logger;
|
|
21
|
-
private clark;
|
|
22
|
+
private readonly clark;
|
|
22
23
|
private clarkProfiler;
|
|
23
24
|
readonly chatSessionStore: ChatSessionStore;
|
|
24
25
|
private readonly contextManager;
|
|
@@ -31,6 +32,22 @@ export declare class AiService extends TracedEventEmitter<AiServiceEvents> {
|
|
|
31
32
|
private readonly mcpServerManager;
|
|
32
33
|
get appContext(): AppContextStore;
|
|
33
34
|
get clarkState(): string;
|
|
35
|
+
get appRootDirPath(): string;
|
|
36
|
+
get organizationId(): string;
|
|
37
|
+
get superblocksBaseUrl(): string;
|
|
38
|
+
/**
|
|
39
|
+
* Gets the contextId for the current conversation context.
|
|
40
|
+
* Returns null if JWT is missing or has no userId.
|
|
41
|
+
*/
|
|
42
|
+
getContextId(): ContextId | null;
|
|
43
|
+
/**
|
|
44
|
+
* Gets the JWT from Clark context
|
|
45
|
+
*/
|
|
46
|
+
getClarkJwt(): string | undefined;
|
|
47
|
+
/**
|
|
48
|
+
* Updates the JWT in Clark context
|
|
49
|
+
*/
|
|
50
|
+
updateClarkJwt(jwt: string): void;
|
|
34
51
|
constructor(config: AiServiceConfig);
|
|
35
52
|
/**
|
|
36
53
|
* Initialize the AI service. Must be called after construction.
|
|
@@ -48,10 +65,16 @@ export declare class AiService extends TracedEventEmitter<AiServiceEvents> {
|
|
|
48
65
|
private createClarkTagProviderFactory;
|
|
49
66
|
handleAiGenerate(request: AiGenerateRequest, peer: EditorClient, peerId: string): Promise<void>;
|
|
50
67
|
handleAiExplainCode(request: AiExplainCodeRequest, peer: EditorClient): Promise<void>;
|
|
68
|
+
handleAiLabelAttachment(request: AiLabelAttachmentRequest): Promise<AiLabelAttachmentResponse>;
|
|
69
|
+
/**
|
|
70
|
+
* Converts an attachment to the appropriate LLM content part.
|
|
71
|
+
*/
|
|
72
|
+
private attachmentToContentPart;
|
|
51
73
|
private submitAcceptanceEvaluation;
|
|
52
74
|
handleUserAcceptedDraft(peer: EditorClient, silently?: boolean): Promise<void>;
|
|
53
75
|
handleUserRejectedDraft(peer: EditorClient, silently?: boolean): Promise<void>;
|
|
54
76
|
handleUserCanceled(): Promise<void>;
|
|
77
|
+
handleSkipTestCase(testRunId: string, testCaseId: string): Promise<void>;
|
|
55
78
|
handleUserConnected(peer: EditorClient, peerId: string): void;
|
|
56
79
|
handleUserDisconnected(peerId: string): void;
|
|
57
80
|
private clearPeerConnection;
|
|
@@ -87,9 +110,10 @@ export declare class AiService extends TracedEventEmitter<AiServiceEvents> {
|
|
|
87
110
|
}): Promise<JudgeEvaluationResult>;
|
|
88
111
|
handleUserChange(change: UserChange): void;
|
|
89
112
|
handleNewChat(): Promise<void>;
|
|
90
|
-
|
|
113
|
+
handleRestoreToCommit(sinceTimestamp: number, commitId: string, applicationId: string, branchName: string): Promise<void>;
|
|
91
114
|
handleApiUpdate(update: ApiUpdate): Promise<void>;
|
|
92
115
|
isBusy(): boolean;
|
|
116
|
+
isAwaitingUser(): boolean;
|
|
93
117
|
/**
|
|
94
118
|
* Check if Clark is currently generating code.
|
|
95
119
|
* Used by lock-service to determine if lock should be held during generation.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai-service/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai-service/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AAiBjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAyC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAEV,eAAe,EACf,eAAe,EACf,YAAY,EACZ,UAAU,EACV,SAAS,EACV,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAWxD,OAAO,KAAK,EACV,iBAAiB,EACjB,oBAAoB,EACpB,wBAAwB,EACxB,yBAAyB,EACzB,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,eAAe,EAIhB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAE1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AA4EtD,qBAAa,SAAU,SAAQ,kBAAkB,CAAC,eAAe,CAAC;IAsEpD,OAAO,CAAC,QAAQ,CAAC,MAAM;IArEnC,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,aAAa,CAAgB;IACrC,SAAgB,gBAAgB,EAAE,gBAAgB,CAAC;IACnD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoC;IACjE,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CACD;IACrC,OAAO,CAAC,6BAA6B,CAA2B;IAChE,OAAO,CAAC,eAAe,CAAC,CAAS;IACjC,OAAO,CAAC,UAAU,CAAC,CAAgB;IACnC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA6B;IAE9D,IAAW,UAAU,IAAI,eAAe,CAEvC;IAED,IAAW,UAAU,IAAI,MAAM,CAE9B;IAED,IAAW,cAAc,IAAI,MAAM,CAElC;IAED,IAAW,cAAc,IAAI,MAAM,CAElC;IAED,IAAW,kBAAkB,IAAI,MAAM,CAEtC;IAED;;;OAGG;IACI,YAAY,IAAI,SAAS,GAAG,IAAI;IAQvC;;OAEG;IACI,WAAW,IAAI,MAAM,GAAG,SAAS;IAIxC;;OAEG;IACI,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;gBAMX,MAAM,EAAE,eAAe;IA6IpD;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAKjC;;;OAGG;IACG,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAK7C,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,4BAA4B;IAwGpC,OAAO,CAAC,MAAM;IAQd,OAAO,CAAC,6BAA6B;IAWxB,gBAAgB,CAC3B,OAAO,EAAE,iBAAiB,EAC1B,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC;IA4CH,mBAAmB,CAC9B,OAAO,EAAE,oBAAoB,EAC7B,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC;IAwNH,uBAAuB,CAClC,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,yBAAyB,CAAC;IAsFrC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAyC/B,OAAO,CAAC,0BAA0B;IAqBrB,uBAAuB,CAClC,IAAI,EAAE,YAAY,EAClB,QAAQ,CAAC,EAAE,OAAO,GACjB,OAAO,CAAC,IAAI,CAAC;IAqBH,uBAAuB,CAClC,IAAI,EAAE,YAAY,EAClB,QAAQ,CAAC,EAAE,OAAO,GACjB,OAAO,CAAC,IAAI,CAAC;IAwBH,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAUnC,kBAAkB,CAC7B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;IAiDT,mBAAmB,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IA2E7D,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAsBnD,OAAO,CAAC,mBAAmB;IASpB,sBAAsB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAyB1C,kBAAkB,CAAC,SAAS,EAAE,gBAAgB;IA8C9C,uBAAuB,CAAC,EAAE,EAAE,MAAM;IAYlC,gBAAgB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IA0CjD,2BAA2B,IAAI,IAAI;IAUnC,4BAA4B,IAAI,IAAI;IAY9B,0BAA0B,CACrC,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,aAAa,CAAA;KAAE,EACvE,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC;IAQhB;;;;;;;;OAQG;IACU,qBAAqB,CAAC,OAAO,EAAE;QAC1C,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,SAAS,CAAC,EAAE,iBAAiB,CAAC;QAC9B,OAAO,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC;QAC1C,gBAAgB,CAAC,EAAE,GAAG,CAAC;KACxB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IA6H3B,gBAAgB,CAAC,MAAM,EAAE,UAAU;IAQ7B,aAAa;IAYb,qBAAqB,CAChC,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;IA8EH,eAAe,CAAC,MAAM,EAAE,SAAS;IAkBvC,MAAM,IAAI,OAAO;IAQjB,cAAc,IAAI,OAAO;IAIhC;;;;OAIG;IACI,YAAY,IAAI,OAAO;IAS9B;;;;;;OAMG;IACU,2BAA2B,IAAI,OAAO,CAAC,IAAI,CAAC;IAYzD;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IAQpB,gCAAgC,IAAI,OAAO,CAAC,OAAO,CAAC;IAY1D,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,SAAS;IAQzD,oBAAoB,CAAC,iBAAiB,EAAE,iBAAiB;IAMzD,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAI1C,aAAa,IAAI,aAAa,GAAG,SAAS;IAIjD,OAAO,CAAC,sBAAsB;CA2C/B"}
|
package/dist/ai-service/index.js
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import os from "node:os";
|
|
2
2
|
import path from "node:path";
|
|
3
|
+
import { isTextAttachment } from "@superblocksteam/library-shared/types";
|
|
3
4
|
import { addTracingToMethods, TracedEventEmitter, } from "@superblocksteam/shared";
|
|
4
|
-
import { hasToolCall } from "ai";
|
|
5
|
+
import { generateObject, hasToolCall } from "ai";
|
|
6
|
+
import { z } from "zod";
|
|
5
7
|
import { getErrorMeta, getLogger, setDefaultLogger } from "../util/logger.js";
|
|
6
8
|
import { OperationPassthrough } from "../util/operation-queue.js";
|
|
7
|
-
import { readFile } from "./agent/tools/build-read-
|
|
9
|
+
import { readFile } from "./agent/tools/build-read-file.js";
|
|
8
10
|
import { debugCache } from "./agent/tools/debug-cache.js";
|
|
9
|
-
import {
|
|
11
|
+
import { buildReadFileToolFactory } from "./agent/tools/index.js";
|
|
10
12
|
import { SessionEntityPermissionStore, } from "./agent/tools2/entity-permissions.js";
|
|
11
13
|
import { ToolRegistry } from "./agent/tools2/registry.js";
|
|
12
14
|
import { explainCodeFinalizeToolFactory } from "./agent/tools2/tools/explain-code-finalize.js";
|
|
@@ -15,6 +17,7 @@ import { AppShell } from "./app-interface/shell.js";
|
|
|
15
17
|
import { BoltArtifactProcessor } from "./artifacts/bolt.js";
|
|
16
18
|
import { ChatSessionStore } from "./chat/chat-session-store.js";
|
|
17
19
|
import { AppContextStore } from "./context/app-context.js";
|
|
20
|
+
import { restoreContextFromCheckpoint } from "./context-download.js";
|
|
18
21
|
import { IntegrationStore } from "./integrations/store.js";
|
|
19
22
|
import { JudgeService } from "./judge/judge-service.js";
|
|
20
23
|
import { CsvJudgeStorage } from "./judge/storage/csv-storage.js";
|
|
@@ -100,8 +103,10 @@ const mergePlanContexts = (existing, incoming) => {
|
|
|
100
103
|
plan: incoming?.plan ?? existing?.plan,
|
|
101
104
|
approved: incoming?.approved !== undefined ? incoming.approved : existing?.approved,
|
|
102
105
|
integrations: incoming?.integrations ?? existing?.integrations,
|
|
106
|
+
entities: incoming?.entities ?? existing?.entities,
|
|
103
107
|
title: incoming?.title ?? existing?.title,
|
|
104
108
|
attachments: incoming?.attachments ?? existing?.attachments,
|
|
109
|
+
enableTesting: incoming?.enableTesting ?? existing?.enableTesting,
|
|
105
110
|
};
|
|
106
111
|
};
|
|
107
112
|
export class AiService extends TracedEventEmitter {
|
|
@@ -131,11 +136,48 @@ export class AiService extends TracedEventEmitter {
|
|
|
131
136
|
get clarkState() {
|
|
132
137
|
return this.clark.state;
|
|
133
138
|
}
|
|
139
|
+
get appRootDirPath() {
|
|
140
|
+
return this.config.appRootDirPath;
|
|
141
|
+
}
|
|
142
|
+
get organizationId() {
|
|
143
|
+
return this.config.organizationId;
|
|
144
|
+
}
|
|
145
|
+
get superblocksBaseUrl() {
|
|
146
|
+
return this.config.superblocksBaseUrl;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Gets the contextId for the current conversation context.
|
|
150
|
+
* Returns null if JWT is missing or has no userId.
|
|
151
|
+
*/
|
|
152
|
+
getContextId() {
|
|
153
|
+
try {
|
|
154
|
+
return getContextId(this.clark, this.config);
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Gets the JWT from Clark context
|
|
162
|
+
*/
|
|
163
|
+
getClarkJwt() {
|
|
164
|
+
return this.clark?.context?.jwt;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Updates the JWT in Clark context
|
|
168
|
+
*/
|
|
169
|
+
updateClarkJwt(jwt) {
|
|
170
|
+
if (jwt) {
|
|
171
|
+
this.clark.updateContext({ jwt });
|
|
172
|
+
}
|
|
173
|
+
}
|
|
134
174
|
constructor(config) {
|
|
135
175
|
super(config.tracer);
|
|
136
176
|
this.config = config;
|
|
137
|
-
this._logger = config.logger;
|
|
138
177
|
setDefaultLogger(config.logger);
|
|
178
|
+
// Store the wrapped logger so getLogger() can return it
|
|
179
|
+
// The wrapped logger forwards logs to the browser console when Clark logs are enabled
|
|
180
|
+
this._logger = getLogger();
|
|
139
181
|
// Prevent traced functions from creating traces when called outside of a Clark context
|
|
140
182
|
llmobs.setDefaultRootPolicy("drop-if-no-parent");
|
|
141
183
|
// todo: move to state handlers
|
|
@@ -198,9 +240,10 @@ export class AiService extends TracedEventEmitter {
|
|
|
198
240
|
appShell: this.appShell,
|
|
199
241
|
retryOptions: config.retryOptions,
|
|
200
242
|
unifiedProviderEnabled: config.features.unifiedProviderEnabled ?? false,
|
|
243
|
+
organizationId: config.organizationId,
|
|
244
|
+
applicationId: config.applicationId,
|
|
245
|
+
getJwt: () => this.getJwt(),
|
|
201
246
|
});
|
|
202
|
-
// Initialize judge service
|
|
203
|
-
this.mcpServerManager = new PlaywrightMcpServerManager(config.logger);
|
|
204
247
|
this.clark = new Clark({
|
|
205
248
|
initialContext: {
|
|
206
249
|
abortController: new AbortController(),
|
|
@@ -209,6 +252,8 @@ export class AiService extends TracedEventEmitter {
|
|
|
209
252
|
createTagProvider: this.createClarkTagProviderFactory(),
|
|
210
253
|
sessionId,
|
|
211
254
|
});
|
|
255
|
+
// Initialize judge service
|
|
256
|
+
this.mcpServerManager = new PlaywrightMcpServerManager(this.clark.logger);
|
|
212
257
|
this.config.draftInterface
|
|
213
258
|
.hasLocalDraftChanges()
|
|
214
259
|
.then((hasDraft) => {
|
|
@@ -230,6 +275,7 @@ export class AiService extends TracedEventEmitter {
|
|
|
230
275
|
"handleUserAcceptedDraft",
|
|
231
276
|
"handleUserRejectedDraft",
|
|
232
277
|
"handleUserCanceled",
|
|
278
|
+
"handleSkipTestCase",
|
|
233
279
|
"handleBuildSystemError",
|
|
234
280
|
"handleRuntimeError",
|
|
235
281
|
"handleClearRuntimeError",
|
|
@@ -257,6 +303,8 @@ export class AiService extends TracedEventEmitter {
|
|
|
257
303
|
this.getLogger().info("[ai-service] Integration cache removed");
|
|
258
304
|
}
|
|
259
305
|
getLogger() {
|
|
306
|
+
// Return the wrapped logger that forwards logs to the browser console
|
|
307
|
+
// when Clark logs are enabled (via ?clark_logs=true or SUPERBLOCKS_CLI_ENV=local)
|
|
260
308
|
return this._logger;
|
|
261
309
|
}
|
|
262
310
|
createClarkTransitionHandler() {
|
|
@@ -290,6 +338,7 @@ export class AiService extends TracedEventEmitter {
|
|
|
290
338
|
llmClient: this.llmClient,
|
|
291
339
|
toolRegistry: this.toolRegistry,
|
|
292
340
|
entityPermissionStore: this.entityPermissionStore,
|
|
341
|
+
mcpServerManager: this.mcpServerManager,
|
|
293
342
|
viteServer: this.viteServer,
|
|
294
343
|
};
|
|
295
344
|
const clarkStateHandlers = Object.fromEntries(Object.entries(clarkStateHandlerFactories).map(([state, handlerFactory]) => [state, handlerFactory(clark, params)]));
|
|
@@ -300,6 +349,7 @@ export class AiService extends TracedEventEmitter {
|
|
|
300
349
|
}
|
|
301
350
|
const handler = clarkStateHandlers[to];
|
|
302
351
|
if (!handler) {
|
|
352
|
+
this.getLogger().error(`[ai-service] No handler for state ${to}`);
|
|
303
353
|
throw new Error(`No handler for state ${to}`);
|
|
304
354
|
}
|
|
305
355
|
this.getLogger().info(`[ai-service] Transitioned from ${from} to ${to} with event ${event.type}`);
|
|
@@ -349,6 +399,7 @@ export class AiService extends TracedEventEmitter {
|
|
|
349
399
|
};
|
|
350
400
|
}
|
|
351
401
|
async handleAiGenerate(request, peer, peerId) {
|
|
402
|
+
this.getLogger().info(`[ai-service] handleAiGenerate: peerId=${peerId}`);
|
|
352
403
|
if (this.clark.state === ClarkStateNames.Dead) {
|
|
353
404
|
throw new Error("Service is unavailable");
|
|
354
405
|
}
|
|
@@ -363,6 +414,7 @@ export class AiService extends TracedEventEmitter {
|
|
|
363
414
|
...context,
|
|
364
415
|
useMockGeneration: request.mockGeneration ?? false,
|
|
365
416
|
planContext: mergePlanContexts(context.planContext, request.planContext),
|
|
417
|
+
browserContext: request.browserContext,
|
|
366
418
|
};
|
|
367
419
|
});
|
|
368
420
|
const transitionTo = transitionFrom(this.clark);
|
|
@@ -404,7 +456,7 @@ export class AiService extends TracedEventEmitter {
|
|
|
404
456
|
* Tools expect passing a Clark instance to handle shared state (e.g: search for `requiredFileReads` and its usage)
|
|
405
457
|
* We don't need it here since we only use a single read tool.
|
|
406
458
|
*/
|
|
407
|
-
const
|
|
459
|
+
const build_readFile = buildReadFileToolFactory.create({
|
|
408
460
|
clark: this.clark,
|
|
409
461
|
services: {
|
|
410
462
|
appShell: this.appShell,
|
|
@@ -425,7 +477,7 @@ export class AiService extends TracedEventEmitter {
|
|
|
425
477
|
code,
|
|
426
478
|
pageContent,
|
|
427
479
|
finalizeToolName: explainCodeFinalize.name,
|
|
428
|
-
|
|
480
|
+
readFileToolName: build_readFile.name,
|
|
429
481
|
});
|
|
430
482
|
}
|
|
431
483
|
else {
|
|
@@ -458,7 +510,7 @@ export class AiService extends TracedEventEmitter {
|
|
|
458
510
|
model,
|
|
459
511
|
stopWhen: hasToolCall(explainCodeFinalize.name),
|
|
460
512
|
tools: {
|
|
461
|
-
|
|
513
|
+
build_readFile,
|
|
462
514
|
explainCodeFinalize,
|
|
463
515
|
},
|
|
464
516
|
user: { role: "user", content: prompt },
|
|
@@ -513,6 +565,110 @@ export class AiService extends TracedEventEmitter {
|
|
|
513
565
|
});
|
|
514
566
|
}
|
|
515
567
|
}
|
|
568
|
+
async handleAiLabelAttachment(request) {
|
|
569
|
+
const logger = getLogger();
|
|
570
|
+
const startTime = Date.now();
|
|
571
|
+
const timeout = 30_000;
|
|
572
|
+
const attachment = request.attachment;
|
|
573
|
+
logger.debug("[ai-service] Labeling attachment", {
|
|
574
|
+
fileName: attachment.fileName ?? "unnamed",
|
|
575
|
+
type: attachment.type,
|
|
576
|
+
});
|
|
577
|
+
const llmConfig = request.llmConfig
|
|
578
|
+
? {
|
|
579
|
+
...request.llmConfig,
|
|
580
|
+
interleavedThinking: false,
|
|
581
|
+
thinkingEnabled: false,
|
|
582
|
+
}
|
|
583
|
+
: undefined;
|
|
584
|
+
const llmProviderSettings = this.getLLMProviderSettings(false, llmConfig);
|
|
585
|
+
const llmProvider = createLLMProvider(llmProviderSettings, () => request.jwt, llmConfig);
|
|
586
|
+
const model = llmProvider.modelForTask("fast");
|
|
587
|
+
const LabelAttachmentSchema = z.object({
|
|
588
|
+
label: z
|
|
589
|
+
.string()
|
|
590
|
+
.min(1)
|
|
591
|
+
.describe('A brief 2-3 word description (e.g., "sales dashboard", "user profile", "data table", "customer data")'),
|
|
592
|
+
insight: z
|
|
593
|
+
.string()
|
|
594
|
+
.min(1)
|
|
595
|
+
.describe('A key observation about the content (e.g., "chart displays monthly revenue", "CSV contains customer records", "JSON config for API settings")'),
|
|
596
|
+
});
|
|
597
|
+
const timeoutController = new AbortController();
|
|
598
|
+
const timeoutId = setTimeout(() => timeoutController.abort(), timeout);
|
|
599
|
+
try {
|
|
600
|
+
// Build the appropriate content part based on attachment type
|
|
601
|
+
const contentPart = this.attachmentToContentPart(attachment);
|
|
602
|
+
const { object: result } = await generateObject({
|
|
603
|
+
model,
|
|
604
|
+
schema: LabelAttachmentSchema,
|
|
605
|
+
messages: [
|
|
606
|
+
{
|
|
607
|
+
role: "user",
|
|
608
|
+
content: [
|
|
609
|
+
{
|
|
610
|
+
type: "text",
|
|
611
|
+
text: "Analyze this attachment and provide a brief label and key insight about its content.",
|
|
612
|
+
},
|
|
613
|
+
contentPart,
|
|
614
|
+
],
|
|
615
|
+
},
|
|
616
|
+
],
|
|
617
|
+
abortSignal: timeoutController.signal,
|
|
618
|
+
});
|
|
619
|
+
const durationMs = Date.now() - startTime;
|
|
620
|
+
logger.debug("[ai-service] Attachment labeling complete", {
|
|
621
|
+
fileName: attachment.fileName,
|
|
622
|
+
type: attachment.type,
|
|
623
|
+
label: result.label,
|
|
624
|
+
insight: result.insight,
|
|
625
|
+
durationMs,
|
|
626
|
+
});
|
|
627
|
+
return result;
|
|
628
|
+
}
|
|
629
|
+
finally {
|
|
630
|
+
clearTimeout(timeoutId);
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
/**
|
|
634
|
+
* Converts an attachment to the appropriate LLM content part.
|
|
635
|
+
*/
|
|
636
|
+
attachmentToContentPart(attachment) {
|
|
637
|
+
if (attachment.type === "image") {
|
|
638
|
+
return {
|
|
639
|
+
type: "image",
|
|
640
|
+
image: attachment.image,
|
|
641
|
+
};
|
|
642
|
+
}
|
|
643
|
+
else if (attachment.type === "pdf") {
|
|
644
|
+
// Parse data URL to extract base64 data
|
|
645
|
+
const match = attachment.data.match(/^data:([^;]+);base64,(.+)$/);
|
|
646
|
+
const data = match?.[2] ?? attachment.data;
|
|
647
|
+
const mediaType = match?.[1] ?? "application/pdf";
|
|
648
|
+
return {
|
|
649
|
+
type: "file",
|
|
650
|
+
data,
|
|
651
|
+
mediaType,
|
|
652
|
+
filename: attachment.fileName,
|
|
653
|
+
};
|
|
654
|
+
}
|
|
655
|
+
else if (isTextAttachment(attachment)) {
|
|
656
|
+
// Wrap text content in XML tags for structured presentation
|
|
657
|
+
const sanitizedFileName = attachment.fileName
|
|
658
|
+
.replace(/&/g, "&")
|
|
659
|
+
.replace(/"/g, """)
|
|
660
|
+
.replace(/'/g, "'")
|
|
661
|
+
.replace(/</g, "<")
|
|
662
|
+
.replace(/>/g, ">");
|
|
663
|
+
return {
|
|
664
|
+
type: "text",
|
|
665
|
+
text: `<${attachment.type}_file name="${sanitizedFileName}">\n${attachment.content}\n</${attachment.type}_file>`,
|
|
666
|
+
};
|
|
667
|
+
}
|
|
668
|
+
else {
|
|
669
|
+
throw new Error(`Unsupported attachment type: ${attachment.type}`);
|
|
670
|
+
}
|
|
671
|
+
}
|
|
516
672
|
submitAcceptanceEvaluation(wasAccepted) {
|
|
517
673
|
if (!this.clark.rootSpan) {
|
|
518
674
|
this.getLogger().warn("[ai-service] No root span available for submitting feedback");
|
|
@@ -530,12 +686,14 @@ export class AiService extends TracedEventEmitter {
|
|
|
530
686
|
}
|
|
531
687
|
}
|
|
532
688
|
async handleUserAcceptedDraft(peer, silently) {
|
|
689
|
+
this.getLogger().info(`[ai-service] handleUserAcceptedDraft`);
|
|
533
690
|
this.submitAcceptanceEvaluation(true);
|
|
534
691
|
if (this.clark.state !== ClarkStateNames.AwaitingUser) {
|
|
535
692
|
throw new Error("Service is not awaiting user input");
|
|
536
693
|
}
|
|
537
694
|
if (!this.clark.context.peer) {
|
|
538
|
-
//
|
|
695
|
+
// peer can be null if service was started with a draft
|
|
696
|
+
this.getLogger().info(`[ai-service] Setting peer from RPC caller`);
|
|
539
697
|
this.clark.updateContext({
|
|
540
698
|
peer,
|
|
541
699
|
});
|
|
@@ -544,12 +702,14 @@ export class AiService extends TracedEventEmitter {
|
|
|
544
702
|
void transitionTo({ type: USER_ACCEPTED_DRAFT, silently });
|
|
545
703
|
}
|
|
546
704
|
async handleUserRejectedDraft(peer, silently) {
|
|
705
|
+
this.getLogger().info(`[ai-service] handleUserRejectedDraft`);
|
|
547
706
|
this.submitAcceptanceEvaluation(false);
|
|
548
707
|
if (this.clark.state !== ClarkStateNames.AwaitingUser) {
|
|
549
708
|
throw new Error("Service is not awaiting user input");
|
|
550
709
|
}
|
|
551
710
|
if (!this.clark.context.peer) {
|
|
552
|
-
//
|
|
711
|
+
// peer can be null if service was started with a draft
|
|
712
|
+
this.getLogger().info(`[ai-service] Setting peer from RPC caller`);
|
|
553
713
|
this.clark.updateContext({
|
|
554
714
|
peer,
|
|
555
715
|
});
|
|
@@ -567,8 +727,42 @@ export class AiService extends TracedEventEmitter {
|
|
|
567
727
|
this.clark.context.abortController?.abort();
|
|
568
728
|
void this.clark.send({ type: USER_CANCELED });
|
|
569
729
|
}
|
|
730
|
+
async handleSkipTestCase(testRunId, testCaseId) {
|
|
731
|
+
const logger = this.getLogger();
|
|
732
|
+
logger.info(`[ai-service] Skip test case requested: testRunId=${testRunId}, testCaseId=${testCaseId}`);
|
|
733
|
+
// Verify this is the active test run
|
|
734
|
+
if (this.clark.context.currentTestRunId !== testRunId) {
|
|
735
|
+
logger.warn(`[ai-service] Skip request for testRunId=${testRunId} but current is ${this.clark.context.currentTestRunId}`);
|
|
736
|
+
return;
|
|
737
|
+
}
|
|
738
|
+
// Update context with skip request
|
|
739
|
+
this.clark.updateContext({
|
|
740
|
+
skipRequestedForTestCase: testCaseId,
|
|
741
|
+
});
|
|
742
|
+
// Update the test case status to skipped
|
|
743
|
+
const testCaseStatuses = this.clark.context.testCaseStatuses ??
|
|
744
|
+
new Map();
|
|
745
|
+
testCaseStatuses.set(testCaseId, "skipped");
|
|
746
|
+
this.clark.updateContext({
|
|
747
|
+
testCaseStatuses,
|
|
748
|
+
});
|
|
749
|
+
// Send test_case_update message to UI
|
|
750
|
+
const peer = this.clark.context.peer;
|
|
751
|
+
if (peer) {
|
|
752
|
+
void peer.call.aiPushMessage({
|
|
753
|
+
type: "test_case_update",
|
|
754
|
+
testRunId,
|
|
755
|
+
testCaseId,
|
|
756
|
+
testCaseStatus: "skipped",
|
|
757
|
+
role: "assistant",
|
|
758
|
+
content: "",
|
|
759
|
+
});
|
|
760
|
+
}
|
|
761
|
+
logger.info(`[ai-service] Test case ${testCaseId} marked as skipped, flag set for subagent`);
|
|
762
|
+
}
|
|
570
763
|
handleUserConnected(peer, peerId) {
|
|
571
764
|
const existingPeerId = this.clark.context.peerId;
|
|
765
|
+
this.getLogger().info(`[ai-service] handleUserConnected: peerId=${peerId}`);
|
|
572
766
|
if (this.clark.context.peer) {
|
|
573
767
|
if (existingPeerId === peerId) {
|
|
574
768
|
this.getLogger().info(`[ai-service] Existing peer ${peerId} reconnected; refreshing reference`);
|
|
@@ -585,6 +779,7 @@ export class AiService extends TracedEventEmitter {
|
|
|
585
779
|
peer,
|
|
586
780
|
peerId,
|
|
587
781
|
}));
|
|
782
|
+
this.getLogger().info(`[ai-service] Peer set: ${peerId}`);
|
|
588
783
|
// 1. Sync generation state if generation is in progress
|
|
589
784
|
if (this.clark.context.lastGenerationState) {
|
|
590
785
|
this.getLogger().info(`[ai-service] Syncing generation state on reconnect: ${this.clark.context.lastGenerationState.state}`);
|
|
@@ -612,7 +807,6 @@ export class AiService extends TracedEventEmitter {
|
|
|
612
807
|
formattedInput: request.formattedInput ?? undefined,
|
|
613
808
|
rawInput: request.rawInput,
|
|
614
809
|
permissions: request.permissions ?? [],
|
|
615
|
-
toolCallId: request.toolCallId,
|
|
616
810
|
})
|
|
617
811
|
.catch((error) => {
|
|
618
812
|
this.getLogger().error(`[ai-service] Failed to resend tool permission request: ${error}`);
|
|
@@ -621,18 +815,19 @@ export class AiService extends TracedEventEmitter {
|
|
|
621
815
|
}
|
|
622
816
|
handleUserDisconnected(peerId) {
|
|
623
817
|
const currentPeerId = this.clark.context.peerId;
|
|
818
|
+
this.getLogger().info(`[ai-service] handleUserDisconnected: peerId=${peerId}`);
|
|
624
819
|
if (!currentPeerId) {
|
|
625
820
|
return;
|
|
626
821
|
}
|
|
627
822
|
if (currentPeerId !== peerId) {
|
|
628
|
-
this.getLogger().
|
|
629
|
-
|
|
630
|
-
else {
|
|
631
|
-
this.getLogger().info(`[ai-service] peer disconnecting: ${peerId}`);
|
|
823
|
+
this.getLogger().info(`[ai-service] Stale disconnect ignored: peer ${peerId} disconnecting but current peer is ${currentPeerId}`);
|
|
824
|
+
return; // Don't clear the current peer on stale disconnect
|
|
632
825
|
}
|
|
826
|
+
this.getLogger().info(`[ai-service] peer disconnecting: ${peerId}`);
|
|
633
827
|
this.clearPeerConnection();
|
|
634
828
|
}
|
|
635
829
|
clearPeerConnection() {
|
|
830
|
+
this.getLogger().info(`[ai-service] Clearing peer connection`);
|
|
636
831
|
this.clark.updateContext((context) => ({
|
|
637
832
|
...context,
|
|
638
833
|
peer: undefined,
|
|
@@ -871,18 +1066,59 @@ export class AiService extends TracedEventEmitter {
|
|
|
871
1066
|
this.getLogger().error("[ai-service] Failed to clear contexts on new chat", getErrorMeta(error));
|
|
872
1067
|
}
|
|
873
1068
|
}
|
|
874
|
-
async
|
|
875
|
-
//
|
|
1069
|
+
async handleRestoreToCommit(sinceTimestamp, commitId, applicationId, branchName) {
|
|
1070
|
+
// TODO: change this to truncate after commit once commit info is supported here, so we can truncate messages accurately.
|
|
1071
|
+
// 1. Truncate chat messages on server (always do this first)
|
|
876
1072
|
await this.chatSessionStore.truncateAfterTimestamp(sinceTimestamp);
|
|
877
|
-
//
|
|
1073
|
+
// Check JWT once at the beginning - needed for both restoration and truncation
|
|
1074
|
+
// Note: clark.context.jwt should be set by the socket handler (socket-manager.ts) before
|
|
1075
|
+
// this method is called. The socket handler updates it from peerAuthorization if missing.
|
|
1076
|
+
const jwt = this.clark?.context?.jwt;
|
|
1077
|
+
if (!jwt) {
|
|
1078
|
+
this.getLogger().warn(`[handleRestoreToCommit] No JWT available, cannot restore or truncate context`);
|
|
1079
|
+
return;
|
|
1080
|
+
}
|
|
1081
|
+
// 2. Try to restore context from checkpoint
|
|
1082
|
+
try {
|
|
1083
|
+
const contextId = getContextId(this.clark, this.config);
|
|
1084
|
+
const result = await restoreContextFromCheckpoint({
|
|
1085
|
+
applicationId,
|
|
1086
|
+
commitId,
|
|
1087
|
+
branchName,
|
|
1088
|
+
contextId,
|
|
1089
|
+
appRootDirPath: this.config.appRootDirPath,
|
|
1090
|
+
superblocksBaseUrl: this.config.superblocksBaseUrl,
|
|
1091
|
+
logger: this.getLogger(),
|
|
1092
|
+
jwt,
|
|
1093
|
+
contextManager: this.contextManager,
|
|
1094
|
+
});
|
|
1095
|
+
if (result.success) {
|
|
1096
|
+
this.getLogger().info(`[handleRestoreToCommit] Successfully restored main.json from checkpoint commitId=${commitId}, skipping truncation`);
|
|
1097
|
+
return; // Success - no need to truncate
|
|
1098
|
+
}
|
|
1099
|
+
else {
|
|
1100
|
+
// main.json not found or failed - fall through to truncation
|
|
1101
|
+
const reason = result.savedFiles.length > 0
|
|
1102
|
+
? "main.json not found in checkpoint"
|
|
1103
|
+
: "no file saved from checkpoint";
|
|
1104
|
+
this.getLogger().info(`[handleRestoreToCommit] Context restore failed: ${reason} for commitId=${commitId}, using truncation fallback`);
|
|
1105
|
+
}
|
|
1106
|
+
}
|
|
1107
|
+
catch (error) {
|
|
1108
|
+
// Error downloading - log and fall through to truncation
|
|
1109
|
+
this.getLogger().warn(`[handleRestoreToCommit] Error restoring context from checkpoint, using truncation fallback`, getErrorMeta(error));
|
|
1110
|
+
}
|
|
1111
|
+
// 3. Fallback: Truncate LLM context (restore failed)
|
|
878
1112
|
const contextId = getContextId(this.clark, this.config);
|
|
879
|
-
const ownerId = `
|
|
1113
|
+
const ownerId = `restore-handler-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
|
|
880
1114
|
const contextHandle = await this.contextManager.acquireContext(contextId, ownerId);
|
|
881
1115
|
try {
|
|
882
1116
|
contextHandle.context.truncateAfterTimestamp(sinceTimestamp);
|
|
1117
|
+
this.getLogger().info(`[handleRestoreToCommit] Context truncated after timestamp ${sinceTimestamp}`);
|
|
883
1118
|
}
|
|
884
1119
|
catch (error) {
|
|
885
1120
|
this.getLogger().error(`[ai-service] Failed to truncate context after timestamp ${sinceTimestamp}`, getErrorMeta(error));
|
|
1121
|
+
throw error;
|
|
886
1122
|
}
|
|
887
1123
|
finally {
|
|
888
1124
|
contextHandle.release();
|
|
@@ -908,6 +1144,9 @@ export class AiService extends TracedEventEmitter {
|
|
|
908
1144
|
this.clark.state !== ClarkStateNames.AwaitingUser &&
|
|
909
1145
|
this.clark.state !== ClarkStateNames.Dead);
|
|
910
1146
|
}
|
|
1147
|
+
isAwaitingUser() {
|
|
1148
|
+
return this.clark.state === ClarkStateNames.AwaitingUser;
|
|
1149
|
+
}
|
|
911
1150
|
/**
|
|
912
1151
|
* Check if Clark is currently generating code.
|
|
913
1152
|
* Used by lock-service to determine if lock should be held during generation.
|