@superblocksteam/vite-plugin-file-sync 2.0.59-next.1 → 2.0.59-next.10
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.map +1 -1
- package/dist/ai-service/agent/prompts/build-base-system-prompt.js +25 -9
- package/dist/ai-service/agent/prompts/build-base-system-prompt.js.map +1 -1
- package/dist/ai-service/agent/subagents/apis/examples.d.ts.map +1 -1
- package/dist/ai-service/agent/subagents/apis/examples.js +137 -10
- package/dist/ai-service/agent/subagents/apis/examples.js.map +1 -1
- package/dist/ai-service/agent/subagents/apis/static-analysis.d.ts.map +1 -1
- package/dist/ai-service/agent/subagents/apis/static-analysis.js +14 -7
- package/dist/ai-service/agent/subagents/apis/static-analysis.js.map +1 -1
- package/dist/ai-service/agent/tool-message-utils.d.ts.map +1 -1
- package/dist/ai-service/agent/tool-message-utils.js +6 -2
- package/dist/ai-service/agent/tool-message-utils.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/analysis.d.ts +9 -0
- package/dist/ai-service/agent/tools/apis/analysis.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/apis/analysis.js +358 -0
- package/dist/ai-service/agent/tools/apis/analysis.js.map +1 -0
- package/dist/ai-service/agent/{subagents → tools}/apis/api-executor.d.ts +35 -10
- package/dist/ai-service/agent/tools/apis/api-executor.d.ts.map +1 -0
- package/dist/ai-service/agent/{subagents → tools}/apis/api-executor.js +179 -94
- package/dist/ai-service/agent/tools/apis/api-executor.js.map +1 -0
- package/dist/ai-service/agent/tools/apis/api-source.d.ts +19 -0
- package/dist/ai-service/agent/tools/apis/api-source.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/apis/api-source.js +73 -0
- package/dist/ai-service/agent/tools/apis/api-source.js.map +1 -0
- package/dist/ai-service/agent/tools/apis/api-validation-orchestrator.d.ts +51 -0
- package/dist/ai-service/agent/tools/apis/api-validation-orchestrator.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/apis/api-validation-orchestrator.js +510 -0
- package/dist/ai-service/agent/tools/apis/api-validation-orchestrator.js.map +1 -0
- package/dist/ai-service/agent/tools/apis/build-api-artifact.d.ts +32 -0
- package/dist/ai-service/agent/tools/apis/build-api-artifact.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/apis/build-api-artifact.js +313 -0
- package/dist/ai-service/agent/tools/apis/build-api-artifact.js.map +1 -0
- package/dist/ai-service/agent/tools/apis/build-api.d.ts +1 -10
- package/dist/ai-service/agent/tools/apis/build-api.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/build-api.js +26 -238
- package/dist/ai-service/agent/tools/apis/build-api.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/get-api-docs.d.ts +11 -0
- package/dist/ai-service/agent/tools/apis/get-api-docs.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/apis/get-api-docs.js +1841 -0
- package/dist/ai-service/agent/tools/apis/get-api-docs.js.map +1 -0
- package/dist/ai-service/agent/tools/apis/integration-types.d.ts +37 -0
- package/dist/ai-service/agent/tools/apis/integration-types.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/apis/integration-types.js +689 -0
- package/dist/ai-service/agent/tools/apis/integration-types.js.map +1 -0
- package/dist/ai-service/agent/tools/apis/test-api.d.ts +25 -0
- package/dist/ai-service/agent/tools/apis/test-api.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/apis/test-api.js +194 -0
- package/dist/ai-service/agent/tools/apis/test-api.js.map +1 -0
- package/dist/ai-service/agent/tools/apis/write-api.d.ts +11 -0
- package/dist/ai-service/agent/tools/apis/write-api.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/apis/write-api.js +41 -0
- package/dist/ai-service/agent/tools/apis/write-api.js.map +1 -0
- package/dist/ai-service/agent/tools/build-read-files.js +2 -2
- package/dist/ai-service/agent/tools/build-read-files.js.map +1 -1
- package/dist/ai-service/agent/tools.d.ts +2 -5
- package/dist/ai-service/agent/tools.d.ts.map +1 -1
- package/dist/ai-service/agent/tools.js +51 -22
- package/dist/ai-service/agent/tools.js.map +1 -1
- package/dist/ai-service/agent/tools2/access-control.d.ts +1 -0
- package/dist/ai-service/agent/tools2/access-control.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/access-control.js +15 -13
- package/dist/ai-service/agent/tools2/access-control.js.map +1 -1
- package/dist/ai-service/agent/tools2/registry.d.ts +2 -1
- package/dist/ai-service/agent/tools2/registry.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/registry.js +4 -3
- package/dist/ai-service/agent/tools2/registry.js.map +1 -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 +73 -127
- package/dist/ai-service/agent/tools2/tools/exit-plan-mode.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/grep-metadata.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/grep-metadata.js +25 -4
- package/dist/ai-service/agent/tools2/tools/grep-metadata.js.map +1 -1
- package/dist/ai-service/agent/tools2/types.d.ts +1 -1
- package/dist/ai-service/agent/tools2/types.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/types.js.map +1 -1
- package/dist/ai-service/agent/tools2/utils.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/utils.js +4 -1
- package/dist/ai-service/agent/tools2/utils.js.map +1 -1
- package/dist/ai-service/agent/utils.d.ts +1 -3
- package/dist/ai-service/agent/utils.d.ts.map +1 -1
- package/dist/ai-service/agent/utils.js +55 -13
- package/dist/ai-service/agent/utils.js.map +1 -1
- package/dist/ai-service/app-interface/shell.d.ts +5 -0
- package/dist/ai-service/app-interface/shell.d.ts.map +1 -1
- package/dist/ai-service/app-interface/shell.js +17 -2
- package/dist/ai-service/app-interface/shell.js.map +1 -1
- package/dist/ai-service/chat/chat-session-store.d.ts +7 -0
- package/dist/ai-service/chat/chat-session-store.d.ts.map +1 -1
- package/dist/ai-service/chat/chat-session-store.js +26 -0
- package/dist/ai-service/chat/chat-session-store.js.map +1 -1
- package/dist/ai-service/const.d.ts +3 -1
- package/dist/ai-service/const.d.ts.map +1 -1
- package/dist/ai-service/const.js +3 -0
- package/dist/ai-service/const.js.map +1 -1
- package/dist/ai-service/index.d.ts +5 -1
- package/dist/ai-service/index.d.ts.map +1 -1
- package/dist/ai-service/index.js +55 -7
- package/dist/ai-service/index.js.map +1 -1
- package/dist/ai-service/integrations/metadata-storage/index.d.ts +10 -0
- package/dist/ai-service/integrations/metadata-storage/index.d.ts.map +1 -1
- package/dist/ai-service/integrations/metadata-storage/local.d.ts +4 -2
- package/dist/ai-service/integrations/metadata-storage/local.d.ts.map +1 -1
- package/dist/ai-service/integrations/metadata-storage/local.js +35 -9
- package/dist/ai-service/integrations/metadata-storage/local.js.map +1 -1
- package/dist/ai-service/integrations/store.d.ts +27 -2
- package/dist/ai-service/integrations/store.d.ts.map +1 -1
- package/dist/ai-service/integrations/store.js +129 -62
- package/dist/ai-service/integrations/store.js.map +1 -1
- package/dist/ai-service/llm/client.d.ts +123 -0
- package/dist/ai-service/llm/client.d.ts.map +1 -0
- package/dist/ai-service/llm/client.js +168 -0
- package/dist/ai-service/llm/client.js.map +1 -0
- package/dist/ai-service/llm/context/context-handle.d.ts +4 -4
- package/dist/ai-service/llm/context/context-handle.d.ts.map +1 -1
- package/dist/ai-service/llm/context/context-handle.js +7 -3
- package/dist/ai-service/llm/context/context-handle.js.map +1 -1
- package/dist/ai-service/llm/context/context.d.ts +28 -0
- package/dist/ai-service/llm/context/context.d.ts.map +1 -1
- package/dist/ai-service/llm/context/context.js +119 -0
- package/dist/ai-service/llm/context/context.js.map +1 -1
- package/dist/ai-service/llm/context/manager.d.ts +22 -2
- package/dist/ai-service/llm/context/manager.d.ts.map +1 -1
- package/dist/ai-service/llm/context/manager.js +86 -13
- package/dist/ai-service/llm/context/manager.js.map +1 -1
- package/dist/ai-service/llm/context/storage/index.d.ts +1 -0
- package/dist/ai-service/llm/context/storage/index.d.ts.map +1 -1
- package/dist/ai-service/llm/context/storage/local.d.ts +1 -0
- package/dist/ai-service/llm/context/storage/local.d.ts.map +1 -1
- package/dist/ai-service/llm/context/storage/local.js +13 -1
- package/dist/ai-service/llm/context/storage/local.js.map +1 -1
- package/dist/ai-service/llm/context/utils/message-utils.d.ts.map +1 -1
- package/dist/ai-service/llm/context/utils/message-utils.js +6 -2
- package/dist/ai-service/llm/context/utils/message-utils.js.map +1 -1
- package/dist/ai-service/llm/error.d.ts +14 -4
- package/dist/ai-service/llm/error.d.ts.map +1 -1
- package/dist/ai-service/llm/error.js +49 -4
- package/dist/ai-service/llm/error.js.map +1 -1
- package/dist/ai-service/llm/interaction/adapters/vercel.d.ts +67 -0
- package/dist/ai-service/llm/interaction/adapters/vercel.d.ts.map +1 -0
- package/dist/ai-service/llm/interaction/adapters/vercel.js +111 -0
- package/dist/ai-service/llm/interaction/adapters/vercel.js.map +1 -0
- package/dist/ai-service/llm/interaction/compose.d.ts +71 -0
- package/dist/ai-service/llm/interaction/compose.d.ts.map +1 -0
- package/dist/ai-service/llm/interaction/compose.js +88 -0
- package/dist/ai-service/llm/interaction/compose.js.map +1 -0
- package/dist/ai-service/llm/interaction/index.d.ts +68 -0
- package/dist/ai-service/llm/interaction/index.d.ts.map +1 -0
- package/dist/ai-service/llm/interaction/index.js +70 -0
- package/dist/ai-service/llm/interaction/index.js.map +1 -0
- package/dist/ai-service/llm/interaction/middleware.d.ts +52 -0
- package/dist/ai-service/llm/interaction/middleware.d.ts.map +1 -0
- package/dist/ai-service/llm/interaction/middleware.js +17 -0
- package/dist/ai-service/llm/interaction/middleware.js.map +1 -0
- package/dist/ai-service/llm/interaction/middlewares/llmobs.d.ts +45 -0
- package/dist/ai-service/llm/interaction/middlewares/llmobs.d.ts.map +1 -0
- package/dist/ai-service/llm/interaction/middlewares/llmobs.js +85 -0
- package/dist/ai-service/llm/interaction/middlewares/llmobs.js.map +1 -0
- package/dist/ai-service/llm/interaction/middlewares/logging.d.ts +88 -0
- package/dist/ai-service/llm/interaction/middlewares/logging.d.ts.map +1 -0
- package/dist/ai-service/llm/interaction/middlewares/logging.js +238 -0
- package/dist/ai-service/llm/interaction/middlewares/logging.js.map +1 -0
- package/dist/ai-service/llm/interaction/middlewares/profiler.d.ts +47 -0
- package/dist/ai-service/llm/interaction/middlewares/profiler.d.ts.map +1 -0
- package/dist/ai-service/llm/interaction/middlewares/profiler.js +183 -0
- package/dist/ai-service/llm/interaction/middlewares/profiler.js.map +1 -0
- package/dist/ai-service/llm/interaction/middlewares/stream-retry.d.ts +121 -0
- package/dist/ai-service/llm/interaction/middlewares/stream-retry.d.ts.map +1 -0
- package/dist/ai-service/llm/interaction/middlewares/stream-retry.js +291 -0
- package/dist/ai-service/llm/interaction/middlewares/stream-retry.js.map +1 -0
- package/dist/ai-service/llm/interaction/provider.d.ts +173 -0
- package/dist/ai-service/llm/interaction/provider.d.ts.map +1 -0
- package/dist/ai-service/llm/interaction/provider.js +15 -0
- package/dist/ai-service/llm/interaction/provider.js.map +1 -0
- package/dist/ai-service/llm/interaction/result-utils.d.ts +43 -0
- package/dist/ai-service/llm/interaction/result-utils.d.ts.map +1 -0
- package/dist/ai-service/llm/interaction/result-utils.js +49 -0
- package/dist/ai-service/llm/interaction/result-utils.js.map +1 -0
- package/dist/ai-service/llm/interaction/stream-lifecycle.d.ts +48 -0
- package/dist/ai-service/llm/interaction/stream-lifecycle.d.ts.map +1 -0
- package/dist/ai-service/llm/interaction/stream-lifecycle.js +129 -0
- package/dist/ai-service/llm/interaction/stream-lifecycle.js.map +1 -0
- package/dist/ai-service/llm/provider.d.ts +1 -2
- package/dist/ai-service/llm/provider.d.ts.map +1 -1
- package/dist/ai-service/llm/provider.js +3 -6
- package/dist/ai-service/llm/provider.js.map +1 -1
- package/dist/ai-service/llmobs/helpers.d.ts +7 -8
- package/dist/ai-service/llmobs/helpers.d.ts.map +1 -1
- package/dist/ai-service/llmobs/helpers.js +8 -48
- package/dist/ai-service/llmobs/helpers.js.map +1 -1
- package/dist/ai-service/llmobs/middleware/stream-text.d.ts +19 -21
- package/dist/ai-service/llmobs/middleware/stream-text.d.ts.map +1 -1
- package/dist/ai-service/llmobs/middleware/stream-text.js +98 -106
- package/dist/ai-service/llmobs/middleware/stream-text.js.map +1 -1
- package/dist/ai-service/llmobs/types.d.ts +14 -1
- package/dist/ai-service/llmobs/types.d.ts.map +1 -1
- package/dist/ai-service/state-machine/clark-fsm.d.ts +75 -5
- package/dist/ai-service/state-machine/clark-fsm.d.ts.map +1 -1
- package/dist/ai-service/state-machine/clark-fsm.js +100 -0
- package/dist/ai-service/state-machine/clark-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 +4 -0
- 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 +91 -456
- package/dist/ai-service/state-machine/handlers/llm-generating.js.map +1 -1
- package/dist/ai-service/state-machine/handlers/runtime-reviewing.js +1 -1
- package/dist/ai-service/state-machine/handlers/runtime-reviewing.js.map +1 -1
- package/dist/ai-service/state-machine/helpers/peer.d.ts.map +1 -1
- package/dist/ai-service/state-machine/helpers/peer.js +15 -0
- 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 +1 -0
- package/dist/ai-service/state-machine/mocks.js.map +1 -1
- package/dist/ai-service/template-renderer.js +1 -1
- package/dist/ai-service/template-renderer.js.map +1 -1
- package/dist/ai-service/types.d.ts +30 -0
- package/dist/ai-service/types.d.ts.map +1 -1
- package/dist/binding-extraction/extract-identifiers.d.ts +14 -0
- package/dist/binding-extraction/extract-identifiers.d.ts.map +1 -1
- package/dist/binding-extraction/extract-identifiers.js +46 -1
- package/dist/binding-extraction/extract-identifiers.js.map +1 -1
- package/dist/binding-extraction/js-identifiers.d.ts +14 -0
- package/dist/binding-extraction/js-identifiers.d.ts.map +1 -1
- package/dist/binding-extraction/js-identifiers.js +168 -0
- package/dist/binding-extraction/js-identifiers.js.map +1 -1
- package/dist/binding-extraction/python-identifiers.d.ts +5 -0
- package/dist/binding-extraction/python-identifiers.d.ts.map +1 -1
- package/dist/binding-extraction/python-identifiers.js +76 -7
- package/dist/binding-extraction/python-identifiers.js.map +1 -1
- package/dist/file-sync-vite-plugin.d.ts.map +1 -1
- package/dist/file-sync-vite-plugin.js +73 -3
- package/dist/file-sync-vite-plugin.js.map +1 -1
- package/dist/file-system-manager.d.ts.map +1 -1
- package/dist/file-system-manager.js +6 -4
- package/dist/file-system-manager.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lock-service/activity-tracker.d.ts +14 -2
- package/dist/lock-service/activity-tracker.d.ts.map +1 -1
- package/dist/lock-service/activity-tracker.js +43 -6
- package/dist/lock-service/activity-tracker.js.map +1 -1
- package/dist/lock-service/index.d.ts +13 -2
- package/dist/lock-service/index.d.ts.map +1 -1
- package/dist/lock-service/index.js +130 -44
- package/dist/lock-service/index.js.map +1 -1
- package/dist/parsing/jsx.d.ts.map +1 -1
- package/dist/parsing/jsx.js +78 -66
- package/dist/parsing/jsx.js.map +1 -1
- package/dist/socket-manager.js +1 -1
- package/dist/socket-manager.js.map +1 -1
- package/dist/sync-service/list-dir.d.ts.map +1 -1
- package/dist/sync-service/list-dir.js +41 -18
- package/dist/sync-service/list-dir.js.map +1 -1
- package/dist/vite-plugin-yaml-types.d.ts.map +1 -1
- package/dist/vite-plugin-yaml-types.js +2 -4
- package/dist/vite-plugin-yaml-types.js.map +1 -1
- package/package.json +7 -7
- package/dist/ai-service/agent/subagents/apis/api-executor.d.ts.map +0 -1
- package/dist/ai-service/agent/subagents/apis/api-executor.js.map +0 -1
- package/dist/ai-service/agent/subagents/apis/context.d.ts +0 -12
- package/dist/ai-service/agent/subagents/apis/context.d.ts.map +0 -1
- package/dist/ai-service/agent/subagents/apis/context.js +0 -18
- package/dist/ai-service/agent/subagents/apis/context.js.map +0 -1
- package/dist/ai-service/agent/subagents/apis/generate-api-source.d.ts +0 -40
- package/dist/ai-service/agent/subagents/apis/generate-api-source.d.ts.map +0 -1
- package/dist/ai-service/agent/subagents/apis/generate-api-source.js +0 -516
- package/dist/ai-service/agent/subagents/apis/generate-api-source.js.map +0 -1
- package/dist/ai-service/agent/subagents/apis/state.d.ts +0 -49
- package/dist/ai-service/agent/subagents/apis/state.d.ts.map +0 -1
- package/dist/ai-service/agent/subagents/apis/state.js +0 -25
- package/dist/ai-service/agent/subagents/apis/state.js.map +0 -1
- package/dist/ai-service/agent/subagents/apis/system-prompt.d.ts +0 -3
- package/dist/ai-service/agent/subagents/apis/system-prompt.d.ts.map +0 -1
- package/dist/ai-service/agent/subagents/apis/system-prompt.js +0 -1704
- package/dist/ai-service/agent/subagents/apis/system-prompt.js.map +0 -1
- package/dist/ai-service/agent/tools/apis/finalize-api.d.ts +0 -11
- package/dist/ai-service/agent/tools/apis/finalize-api.d.ts.map +0 -1
- package/dist/ai-service/agent/tools/apis/finalize-api.js +0 -133
- package/dist/ai-service/agent/tools/apis/finalize-api.js.map +0 -1
- package/dist/ai-service/llm/middleware/retry.d.ts +0 -112
- package/dist/ai-service/llm/middleware/retry.d.ts.map +0 -1
- package/dist/ai-service/llm/middleware/retry.js +0 -239
- package/dist/ai-service/llm/middleware/retry.js.map +0 -1
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import yaml from "yaml";
|
|
2
|
+
import { extractInputsWithTypesFromApi, } from "../../../../binding-extraction/extract-identifiers.js";
|
|
3
|
+
import { getErrorMeta, getLogger, getPrefixedLogger, } from "../../../../util/logger.js";
|
|
4
|
+
import { Paths } from "../../../const.js";
|
|
5
|
+
import { ApiBuilderTypeScriptError } from "../../../transform/api-builder/shared.js";
|
|
6
|
+
import { ApiBuilderToYamlTransformer } from "../../../transform/api-builder/to-yaml-transformer.js";
|
|
7
|
+
import { applyFileTransformations, renderPath, } from "../../../transform/shared.js";
|
|
8
|
+
import { safeJsonStringify } from "../../../util/safe-stringify.js";
|
|
9
|
+
import { apiStaticAnalysis } from "../../subagents/apis/static-analysis.js";
|
|
10
|
+
import { readApiSource } from "./api-source.js";
|
|
11
|
+
/**
|
|
12
|
+
* Integration output type definitions.
|
|
13
|
+
* Source of truth for what each integration returns.
|
|
14
|
+
*/
|
|
15
|
+
const INTEGRATION_OUTPUT_TYPES = {
|
|
16
|
+
// SQL Databases - return arrays of rows directly
|
|
17
|
+
postgres: "any[]",
|
|
18
|
+
postgresql: "any[]",
|
|
19
|
+
mysql: "any[]",
|
|
20
|
+
mariadb: "any[]",
|
|
21
|
+
mssql: "any[]",
|
|
22
|
+
snowflake: "any[]",
|
|
23
|
+
redshift: "any[]",
|
|
24
|
+
bigquery: "any[]",
|
|
25
|
+
databricks: "any[]",
|
|
26
|
+
athena: "any[]",
|
|
27
|
+
// NoSQL Databases
|
|
28
|
+
mongodb: "any[]",
|
|
29
|
+
dynamodb: "{ Items?: any[]; Count?: number; ScannedCount?: number }",
|
|
30
|
+
cosmosdb: "{ resources: any[]; headers: Record<string, string> }",
|
|
31
|
+
// REST APIs
|
|
32
|
+
restapiintegration: "{ data: any; status: number; headers: Record<string, string> }",
|
|
33
|
+
openapi: "{ data: any; status: number; headers: Record<string, string> }",
|
|
34
|
+
// GraphQL
|
|
35
|
+
graphql: "{ data: any; errors?: any[] }",
|
|
36
|
+
// JavaScript/Python
|
|
37
|
+
javascript: "any",
|
|
38
|
+
python: "any",
|
|
39
|
+
// Messaging
|
|
40
|
+
kafka: "{ success: boolean; partition?: number; offset?: string }",
|
|
41
|
+
email: "{ success: boolean; messageId?: string }",
|
|
42
|
+
// Other
|
|
43
|
+
redis: "any",
|
|
44
|
+
s3: "{ ETag?: string; Location?: string; Key?: string; Bucket?: string }",
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Get the output type for a specific block.
|
|
48
|
+
* Control flow blocks return their last child's output.
|
|
49
|
+
*/
|
|
50
|
+
function getBlockOutputType(block) {
|
|
51
|
+
// Handle control flow blocks
|
|
52
|
+
if (block.condition) {
|
|
53
|
+
// Conditional returns the output of whichever branch executes
|
|
54
|
+
// For type purposes, we need to handle all possible branches
|
|
55
|
+
const types = [];
|
|
56
|
+
if (block.condition.if?.blocks?.length > 0) {
|
|
57
|
+
const lastIfBlock = block.condition.if.blocks[block.condition.if.blocks.length - 1];
|
|
58
|
+
types.push(getBlockOutputType(lastIfBlock));
|
|
59
|
+
}
|
|
60
|
+
block.condition.elif?.forEach((elif) => {
|
|
61
|
+
if (elif.blocks?.length > 0) {
|
|
62
|
+
const lastElifBlock = elif.blocks[elif.blocks.length - 1];
|
|
63
|
+
types.push(getBlockOutputType(lastElifBlock));
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
if (block.condition.else?.blocks?.length > 0) {
|
|
67
|
+
const lastElseBlock = block.condition.else.blocks[block.condition.else.blocks.length - 1];
|
|
68
|
+
types.push(getBlockOutputType(lastElseBlock));
|
|
69
|
+
}
|
|
70
|
+
// If all branches have the same type, use that; otherwise union
|
|
71
|
+
const uniqueTypes = [...new Set(types)];
|
|
72
|
+
if (uniqueTypes.length === 0)
|
|
73
|
+
return "void";
|
|
74
|
+
if (uniqueTypes.length === 1)
|
|
75
|
+
return uniqueTypes[0] || "void";
|
|
76
|
+
return uniqueTypes.join(" | ");
|
|
77
|
+
}
|
|
78
|
+
if (block.loop) {
|
|
79
|
+
// Loop returns array of outputs from last block in loop body
|
|
80
|
+
if (block.loop.blocks?.length > 0) {
|
|
81
|
+
const lastLoopBlock = block.loop.blocks[block.loop.blocks.length - 1];
|
|
82
|
+
const itemType = getBlockOutputType(lastLoopBlock);
|
|
83
|
+
return `Array<${itemType}>`;
|
|
84
|
+
}
|
|
85
|
+
return "any[]";
|
|
86
|
+
}
|
|
87
|
+
if (block.trycatch) {
|
|
88
|
+
// TryCatch returns output of try block (or catch if try fails)
|
|
89
|
+
const types = [];
|
|
90
|
+
if (block.trycatch.try?.blocks?.length > 0) {
|
|
91
|
+
const lastTryBlock = block.trycatch.try.blocks[block.trycatch.try.blocks.length - 1];
|
|
92
|
+
types.push(getBlockOutputType(lastTryBlock));
|
|
93
|
+
}
|
|
94
|
+
if (block.trycatch.catch?.blocks?.length > 0) {
|
|
95
|
+
const lastCatchBlock = block.trycatch.catch.blocks[block.trycatch.catch.blocks.length - 1];
|
|
96
|
+
types.push(getBlockOutputType(lastCatchBlock));
|
|
97
|
+
}
|
|
98
|
+
const uniqueTypes = [...new Set(types)];
|
|
99
|
+
if (uniqueTypes.length === 0)
|
|
100
|
+
return "void";
|
|
101
|
+
if (uniqueTypes.length === 1)
|
|
102
|
+
return uniqueTypes[0] || "void";
|
|
103
|
+
return uniqueTypes.join(" | ");
|
|
104
|
+
}
|
|
105
|
+
// Handle step blocks (integrations)
|
|
106
|
+
if (block.step) {
|
|
107
|
+
const integration = block.step.integration;
|
|
108
|
+
// Map integration ID to type
|
|
109
|
+
if (integration === "javascript" || integration === "python") {
|
|
110
|
+
// For code blocks, try to infer from return statement if possible
|
|
111
|
+
// For now, default to any
|
|
112
|
+
return "any";
|
|
113
|
+
}
|
|
114
|
+
// Check if it's a database integration ID (UUID format)
|
|
115
|
+
if (/^[0-9a-f-]{36}$/i.test(integration)) {
|
|
116
|
+
// This is likely a database integration
|
|
117
|
+
// We need to check what type it is from the block config
|
|
118
|
+
if (block.step.postgres || block.step.postgresql) {
|
|
119
|
+
return INTEGRATION_OUTPUT_TYPES.postgresql || "any[]";
|
|
120
|
+
}
|
|
121
|
+
if (block.step.mysql) {
|
|
122
|
+
return INTEGRATION_OUTPUT_TYPES.mysql || "any[]";
|
|
123
|
+
}
|
|
124
|
+
if (block.step.snowflake) {
|
|
125
|
+
return INTEGRATION_OUTPUT_TYPES.snowflake || "any[]";
|
|
126
|
+
}
|
|
127
|
+
// Default for unknown database - returns array of rows
|
|
128
|
+
return "any[]";
|
|
129
|
+
}
|
|
130
|
+
// Look up in our type map
|
|
131
|
+
return INTEGRATION_OUTPUT_TYPES[integration.toLowerCase()] || "any";
|
|
132
|
+
}
|
|
133
|
+
// Handle other block types
|
|
134
|
+
if (block.return) {
|
|
135
|
+
return "any"; // Return block output is whatever data it returns
|
|
136
|
+
}
|
|
137
|
+
if (block.throw) {
|
|
138
|
+
return "never"; // Throw block never returns normally
|
|
139
|
+
}
|
|
140
|
+
return "void";
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Determine the output type of an API based on its last block.
|
|
144
|
+
* The API response is always the output of the last block executed.
|
|
145
|
+
*/
|
|
146
|
+
function determineApiOutputType(apiJson) {
|
|
147
|
+
if (!apiJson.blocks || apiJson.blocks.length === 0) {
|
|
148
|
+
return "void";
|
|
149
|
+
}
|
|
150
|
+
// Get the last block
|
|
151
|
+
const lastBlock = apiJson.blocks[apiJson.blocks.length - 1];
|
|
152
|
+
return getBlockOutputType(lastBlock);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Generate TypeScript interface for API inputs with proper types.
|
|
156
|
+
*/
|
|
157
|
+
function generateInputInterface(apiName, inputs) {
|
|
158
|
+
const capitalizedName = apiName.charAt(0).toUpperCase() + apiName.slice(1);
|
|
159
|
+
if (inputs.length === 0) {
|
|
160
|
+
return `export interface ${capitalizedName}Input {}`;
|
|
161
|
+
}
|
|
162
|
+
const properties = inputs
|
|
163
|
+
.map((input) => {
|
|
164
|
+
const optionalMarker = input.optional ? "?" : "";
|
|
165
|
+
return ` ${input.name}${optionalMarker}: ${input.type};`;
|
|
166
|
+
})
|
|
167
|
+
.join("\n");
|
|
168
|
+
return `export interface ${capitalizedName}Input {\n${properties}\n}`;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Generate TypeScript type for API response.
|
|
172
|
+
*/
|
|
173
|
+
function generateResponseType(apiName, outputType) {
|
|
174
|
+
const capitalizedName = apiName.charAt(0).toUpperCase() + apiName.slice(1);
|
|
175
|
+
return `export type ${capitalizedName}Response = ${outputType};`;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Generate complete types.d.ts file content.
|
|
179
|
+
*/
|
|
180
|
+
function generateTypesFile(apiName, inputs, outputType) {
|
|
181
|
+
return `// Auto-generated by Superblocks
|
|
182
|
+
// Input/output types for ${apiName}
|
|
183
|
+
|
|
184
|
+
${generateInputInterface(apiName, inputs)}
|
|
185
|
+
|
|
186
|
+
${generateResponseType(apiName, outputType)}
|
|
187
|
+
`;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Compile an API source file, validate it, and persist the generated YAML artifact.
|
|
191
|
+
*
|
|
192
|
+
* @param params - Build parameters including identifiers and shared services.
|
|
193
|
+
* @returns The generated API YAML artifact and whether the API is newly created.
|
|
194
|
+
* @throws Error when the API source is missing, compilation fails, or persistence is not possible.
|
|
195
|
+
*/
|
|
196
|
+
export const buildApiArtifact = async (params) => {
|
|
197
|
+
const { apiName, services, scopeUpdateQueue } = params;
|
|
198
|
+
const logger = params.logger ?? getPrefixedLogger(`[buildApiArtifact-${apiName}]`);
|
|
199
|
+
const apiSource = await readApiSource(services, apiName);
|
|
200
|
+
if (apiSource === undefined) {
|
|
201
|
+
throw new Error(`API source for ${apiName} not found. Ensure the API has been created and source code is available.`);
|
|
202
|
+
}
|
|
203
|
+
const isNewApi = !(await services.appShell.pathExists(renderPath(Paths.ApiYamls, { apiName })));
|
|
204
|
+
let apiYaml;
|
|
205
|
+
try {
|
|
206
|
+
[apiYaml] = await applyFileTransformations([apiSource], [
|
|
207
|
+
new ApiBuilderToYamlTransformer({
|
|
208
|
+
templateRenderer: services.templateRenderer,
|
|
209
|
+
skipCleanup: true,
|
|
210
|
+
}),
|
|
211
|
+
]);
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
if (error instanceof ApiBuilderTypeScriptError) {
|
|
215
|
+
logger.error(`TypeScript compilation failed: `, safeJsonStringify({
|
|
216
|
+
error: error.message,
|
|
217
|
+
apiSource: apiSource.content.slice(0, 500),
|
|
218
|
+
}));
|
|
219
|
+
throw new Error(`Unable to generate valid API code. This usually means there are syntax errors or issues with integration types. Review the API structure and ensure correct usage of integration methods. Consider checking integration metadata if you haven't already. Error: TypeScript compilation failed with message: ${error.message}`);
|
|
220
|
+
}
|
|
221
|
+
throw error;
|
|
222
|
+
}
|
|
223
|
+
const analysisWarnings = apiStaticAnalysis(apiSource.content);
|
|
224
|
+
if (analysisWarnings.length > 0) {
|
|
225
|
+
logger.warn("Static analysis warnings", {
|
|
226
|
+
warnings: analysisWarnings,
|
|
227
|
+
apiSource: apiSource.content.slice(0, 300),
|
|
228
|
+
});
|
|
229
|
+
throw new Error(`The API code has semantic issues that need to be fixed:\n\n${analysisWarnings.join("\n\n")}`);
|
|
230
|
+
}
|
|
231
|
+
if (apiYaml === undefined) {
|
|
232
|
+
throw new Error("Failed to generate API YAML. Try again.");
|
|
233
|
+
}
|
|
234
|
+
// Parse the YAML to extract inputs and generate types
|
|
235
|
+
let inputInterface;
|
|
236
|
+
let responseType;
|
|
237
|
+
try {
|
|
238
|
+
// Parse the YAML content
|
|
239
|
+
const apiData = yaml.parse(apiYaml.content);
|
|
240
|
+
// Validate that step blocks use the right plugin for the integration
|
|
241
|
+
validateBlockFieldNames(apiData, services.integrationStore);
|
|
242
|
+
// Convert to format expected by extractInputsWithTypesFromApi
|
|
243
|
+
const apiPb = { apiPb: apiData };
|
|
244
|
+
// Extract inputs with type information using the robust AST-based function
|
|
245
|
+
// Pass the original TypeScript source so it can extract type annotations
|
|
246
|
+
const inputs = await extractInputsWithTypesFromApi(apiPb, apiSource.content);
|
|
247
|
+
// Determine output type
|
|
248
|
+
const outputType = determineApiOutputType(apiData);
|
|
249
|
+
// Generate TypeScript interface strings
|
|
250
|
+
inputInterface = generateInputInterface(apiName, inputs);
|
|
251
|
+
responseType = generateResponseType(apiName, outputType);
|
|
252
|
+
// Generate complete types.d.ts content
|
|
253
|
+
const typesContent = generateTypesFile(apiName, inputs, outputType);
|
|
254
|
+
// Save files
|
|
255
|
+
await scopeUpdateQueue.enqueue(async () => {
|
|
256
|
+
// Save the API YAML
|
|
257
|
+
await services.draftInterface.createDraftFile(apiYaml.filePath, apiYaml.content);
|
|
258
|
+
// Save the types.d.ts file in the location expected by vite-plugin-yaml-types
|
|
259
|
+
const typesPath = renderPath(Paths.ApiYamls, { apiName }).replace("api.yaml", "types.d.ts");
|
|
260
|
+
await services.draftInterface.createDraftFile(typesPath, typesContent);
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
catch (error) {
|
|
264
|
+
logger.error("Failed to build API or generate types", getErrorMeta(error));
|
|
265
|
+
throw new Error(`Failed to build API: ${error instanceof Error ? error.message : String(error)}`);
|
|
266
|
+
}
|
|
267
|
+
return {
|
|
268
|
+
apiYaml,
|
|
269
|
+
isNewApi,
|
|
270
|
+
inputInterface,
|
|
271
|
+
responseType,
|
|
272
|
+
};
|
|
273
|
+
};
|
|
274
|
+
/**
|
|
275
|
+
* Validate that blocks use the correct plugin field name matching the integration's plugin.id.
|
|
276
|
+
*/
|
|
277
|
+
export function validateBlockFieldNames(api, integrationStore) {
|
|
278
|
+
const logger = getLogger();
|
|
279
|
+
for (const block of api.blocks || []) {
|
|
280
|
+
if (!block.step)
|
|
281
|
+
continue;
|
|
282
|
+
const integrationId = block.step.integration;
|
|
283
|
+
if (!integrationId)
|
|
284
|
+
continue;
|
|
285
|
+
// Skip built-in plugins that don't have integrations in the store
|
|
286
|
+
if (integrationId === "javascript" || integrationId === "python") {
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
// Get the integration header to find the actual plugin type
|
|
290
|
+
const integrationHeader = integrationStore.getHeader(integrationId);
|
|
291
|
+
if (!integrationHeader) {
|
|
292
|
+
logger.warn(`Integration "${integrationId}" not found in store for block "${block.name}"`);
|
|
293
|
+
continue;
|
|
294
|
+
}
|
|
295
|
+
const expectedPluginId = integrationHeader.plugin.id;
|
|
296
|
+
// Check if the correct field name is used
|
|
297
|
+
if (!(expectedPluginId in block.step)) {
|
|
298
|
+
// Find what field they're actually using
|
|
299
|
+
const usedFields = Object.keys(block.step).filter((key) => key !== "integration" && typeof block.step[key] === "object");
|
|
300
|
+
throw new Error(`Block "${block.name}" uses incorrect field name. ` +
|
|
301
|
+
`The field name must match the integration's plugin ID.\n\n` +
|
|
302
|
+
`Expected field name: "${expectedPluginId}"\n` +
|
|
303
|
+
(usedFields.length > 0
|
|
304
|
+
? `Used field name: "${usedFields[0]}"\n\n`
|
|
305
|
+
: `No plugin configuration field found\n\n`) +
|
|
306
|
+
`The integration "${integrationId}" is of type "${expectedPluginId}", ` +
|
|
307
|
+
`so your step configuration must use:\n` +
|
|
308
|
+
`${expectedPluginId}: { ... }\n\n` +
|
|
309
|
+
`This ensures proper routing and validation of your API calls.`);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
//# sourceMappingURL=build-api-artifact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-api-artifact.js","sourceRoot":"","sources":["../../../../../src/ai-service/agent/tools/apis/build-api-artifact.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,9 @@
|
|
|
1
1
|
export declare const extractIntegrationIdsFromSource: (source: string) => string[];
|
|
2
2
|
export declare const buildApiToolFactory: import("../../tools2/types.js").ToolFactory<import("../../tools2/types.js").Tool<{
|
|
3
|
-
description: string;
|
|
4
3
|
apiName: string;
|
|
5
|
-
apiSource: string;
|
|
6
|
-
inputs?: Record<string, any> | undefined;
|
|
7
4
|
}, {
|
|
8
5
|
message: string;
|
|
9
6
|
apiName: string;
|
|
10
|
-
|
|
11
|
-
execution: {
|
|
12
|
-
message: string;
|
|
13
|
-
outputs: string;
|
|
14
|
-
};
|
|
15
|
-
message: string;
|
|
16
|
-
apiName: string;
|
|
7
|
+
isNewApi: boolean;
|
|
17
8
|
}>>;
|
|
18
9
|
//# sourceMappingURL=build-api.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-api.d.ts","sourceRoot":"","sources":["../../../../../src/ai-service/agent/tools/apis/build-api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"build-api.d.ts","sourceRoot":"","sources":["../../../../../src/ai-service/agent/tools/apis/build-api.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,+BAA+B,GAAI,QAAQ,MAAM,KAAG,MAAM,EAWtE,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;;;;GA+C/B,CAAC"}
|
|
@@ -1,18 +1,7 @@
|
|
|
1
|
-
import { AiEntityType } from "@superblocksteam/library-shared/types";
|
|
2
|
-
import yaml from "yaml";
|
|
3
1
|
import { z } from "zod";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { ApiBuilderToYamlTransformer } from "../../../transform/api-builder/to-yaml-transformer.js";
|
|
8
|
-
import { applyFileTransformations, renderPath, } from "../../../transform/shared.js";
|
|
9
|
-
import { safeJsonStringify } from "../../../util/safe-stringify.js";
|
|
10
|
-
import { ApiExecutor } from "../../subagents/apis/api-executor.js";
|
|
11
|
-
import { ApiGenerationContext } from "../../subagents/apis/context.js";
|
|
12
|
-
import { apiStaticAnalysis } from "../../subagents/apis/static-analysis.js";
|
|
13
|
-
import { createToolFactory, ToolCategory, } from "../../tools2/types.js";
|
|
14
|
-
const MAX_BUILD_ATTEMPTS = 10;
|
|
15
|
-
const MAX_OUTPUT_SAMPLE_LENGTH = 500;
|
|
2
|
+
import { getPrefixedLogger } from "../../../../util/logger.js";
|
|
3
|
+
import { createToolFactory, ToolCategory } from "../../tools2/types.js";
|
|
4
|
+
import { buildApiArtifact } from "./build-api-artifact.js";
|
|
16
5
|
const integrationConstructorRegex = /new\s+[\w$.]+\s*\(\s*(["'`])(?:\\.|(?!\1).)*?\1\s*,\s*(["'`])((?:\\.|(?!\2).)*?)\2/g;
|
|
17
6
|
export const extractIntegrationIdsFromSource = (source) => {
|
|
18
7
|
integrationConstructorRegex.lastIndex = 0;
|
|
@@ -26,241 +15,40 @@ export const extractIntegrationIdsFromSource = (source) => {
|
|
|
26
15
|
}
|
|
27
16
|
return Array.from(ids);
|
|
28
17
|
};
|
|
29
|
-
export const buildApiToolFactory = createToolFactory("buildApi", (
|
|
18
|
+
export const buildApiToolFactory = createToolFactory("buildApi", (_clark, services, scopeUpdateQueue) => {
|
|
30
19
|
return {
|
|
31
20
|
category: ToolCategory.API,
|
|
32
21
|
description: `
|
|
33
|
-
Compile
|
|
22
|
+
Compile, validate, and save the API. This tool performs the following steps:
|
|
23
|
+
1. Reads the API source from file
|
|
24
|
+
2. Compiles to Superblocks API YAML and validates syntax
|
|
25
|
+
3. Performs static analysis to catch common mistakes
|
|
26
|
+
4. Validates proto compatibility
|
|
34
27
|
|
|
35
28
|
IMPORTANT Before using an integration, you MUST call the grepMetadata tool to get the correct schema/table structure. Do NOT make up column names or table structures.
|
|
36
29
|
`,
|
|
37
30
|
inputSchema: z.object({
|
|
38
|
-
apiSource: z.string().describe("The source code of the API"),
|
|
39
31
|
apiName: z.string().describe("The name of the API"),
|
|
40
|
-
description: z
|
|
41
|
-
.string()
|
|
42
|
-
.min(1)
|
|
43
|
-
.describe(`
|
|
44
|
-
A concise plain-English description of what the API does, framed as a request for permission.
|
|
45
|
-
|
|
46
|
-
Always include the API name and the names of integrations used. Focus on the domain names for resources.
|
|
47
|
-
|
|
48
|
-
DO NOT explain why or include context.
|
|
49
|
-
|
|
50
|
-
Examples: "Create getRecentCommitsApi to retrieve recent commits from GitHub?", "Create getJiraIssuesApi to pull issues from Jira?", "Create updateOrdersApi to update the Orders table in DemoOrders?".`),
|
|
51
|
-
inputs: z
|
|
52
|
-
.record(z.string(), z.any())
|
|
53
|
-
.optional()
|
|
54
|
-
.describe("Test API inputs. Must be provided if the API uses bindings."),
|
|
55
32
|
}),
|
|
56
|
-
|
|
57
|
-
const integrationIds = extractIntegrationIdsFromSource(input.apiSource);
|
|
58
|
-
return integrationIds.map((integrationId) => ({
|
|
59
|
-
type: AiEntityType.INTEGRATION,
|
|
60
|
-
id: integrationId,
|
|
61
|
-
}));
|
|
62
|
-
},
|
|
63
|
-
formatInput: (input) => {
|
|
64
|
-
const integrationIds = extractIntegrationIdsFromSource(input.apiSource);
|
|
65
|
-
const targets = integrationIds.map((id) => services.integrationStore.getEntityTag(id) ?? id);
|
|
66
|
-
return {
|
|
67
|
-
targets,
|
|
68
|
-
summary: input.description,
|
|
69
|
-
};
|
|
70
|
-
},
|
|
71
|
-
execute: async ({ apiSource, apiName, inputs }, options) => {
|
|
72
|
-
const context = ApiGenerationContext.from(options?.experimental_context);
|
|
73
|
-
let id = apiName;
|
|
74
|
-
if (context && context.id) {
|
|
75
|
-
id = context.id;
|
|
76
|
-
}
|
|
33
|
+
execute: async ({ apiName }) => {
|
|
77
34
|
const logger = getPrefixedLogger(`[buildApi-${apiName}]`);
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
else if (state.status === "building") {
|
|
95
|
-
state.attempts++;
|
|
96
|
-
}
|
|
97
|
-
else if (state.status === "built") {
|
|
98
|
-
throw new Error(`API ${apiName} is already built. Must call finalizeApi.`);
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
throw new Error(`API ${apiName} is in unexpected state: ${state.status}.`);
|
|
102
|
-
}
|
|
103
|
-
if (state.attempts > MAX_BUILD_ATTEMPTS) {
|
|
104
|
-
const error = new Error("Unable to build the API after multiple attempts. The API structure may be fundamentally incompatible with the requirements. Consider simplifying the approach or checking if all required integrations are properly configured.");
|
|
105
|
-
const currentState = stateMap.get(id);
|
|
106
|
-
state = {
|
|
107
|
-
...state,
|
|
108
|
-
status: "failed",
|
|
109
|
-
error: state.lastError || error,
|
|
110
|
-
errorContext: {
|
|
111
|
-
phase: "building",
|
|
112
|
-
attemptNumber: state.attempts,
|
|
113
|
-
lastToolCalled: currentState?.status === "building"
|
|
114
|
-
? currentState.lastToolCalled
|
|
115
|
-
: undefined,
|
|
116
|
-
lastToolError: currentState?.status === "building"
|
|
117
|
-
? currentState.lastToolError
|
|
118
|
-
: undefined,
|
|
119
|
-
suggestion: "Try a simpler API structure or verify integration configurations",
|
|
120
|
-
},
|
|
121
|
-
};
|
|
122
|
-
stateMap.set(id, state);
|
|
123
|
-
throw error;
|
|
124
|
-
}
|
|
125
|
-
const processApiSource = async () => {
|
|
126
|
-
const generatedArtifact = {
|
|
127
|
-
type: "file",
|
|
128
|
-
filePath: renderPath(Paths.GeneratedApis, {
|
|
129
|
-
apiName,
|
|
130
|
-
}) + ".ts",
|
|
131
|
-
content: apiSource,
|
|
132
|
-
};
|
|
133
|
-
const success = {
|
|
134
|
-
message: "API compiled successfully",
|
|
135
|
-
apiName,
|
|
136
|
-
};
|
|
137
|
-
let apiYaml;
|
|
138
|
-
try {
|
|
139
|
-
[apiYaml] = await applyFileTransformations([generatedArtifact], [
|
|
140
|
-
new ApiBuilderToYamlTransformer({
|
|
141
|
-
templateRenderer: services.templateRenderer,
|
|
142
|
-
skipCleanup: true,
|
|
143
|
-
}),
|
|
144
|
-
]);
|
|
145
|
-
}
|
|
146
|
-
catch (error) {
|
|
147
|
-
if (error instanceof ApiBuilderTypeScriptError) {
|
|
148
|
-
// Log technical details for debugging
|
|
149
|
-
logger.error("TypeScript compilation failed", {
|
|
150
|
-
error: error.message,
|
|
151
|
-
apiSource: apiSource.slice(0, 500),
|
|
152
|
-
});
|
|
153
|
-
// Return user-friendly error for the subagent LLM
|
|
154
|
-
throw new Error(`Unable to generate valid API code. This usually means there are syntax errors or issues with integration types. Review the API structure and ensure correct usage of integration methods. Consider checking integration metadata if you haven't already. Error: Typescript compilation failed with message: ${error.message}`);
|
|
155
|
-
}
|
|
156
|
-
throw error;
|
|
157
|
-
}
|
|
158
|
-
// At this point we know the apiSource is valid TypeScript.
|
|
159
|
-
// Now do some static analysis to ensure it's semantically valid
|
|
160
|
-
// We do this against the TS source instead of the YAML because
|
|
161
|
-
// it's easier to provide better errors to the LLM, which is dealing in TS
|
|
162
|
-
const analysisWarnings = apiStaticAnalysis(apiSource);
|
|
163
|
-
if (analysisWarnings.length > 0) {
|
|
164
|
-
// Log detailed warnings
|
|
165
|
-
logger.warn("Static analysis warnings", {
|
|
166
|
-
warnings: analysisWarnings,
|
|
167
|
-
apiSource: apiSource.slice(0, 300),
|
|
168
|
-
});
|
|
169
|
-
throw new Error(`The API code has semantic issues that need to be fixed:\n\n${analysisWarnings.join("\n\n")}`);
|
|
170
|
-
}
|
|
171
|
-
if (apiYaml === undefined) {
|
|
172
|
-
throw new Error("Failed to generate API YAML. Try again.");
|
|
173
|
-
}
|
|
174
|
-
const successState = {
|
|
175
|
-
...state,
|
|
176
|
-
status: "built",
|
|
177
|
-
apiYaml,
|
|
178
|
-
};
|
|
179
|
-
if (!clark.context.llmConfig?.customerDataAccessEnabled) {
|
|
180
|
-
logger.info("Customer data access is disabled, skipping API execution validation");
|
|
181
|
-
stateMap.set(id, successState);
|
|
182
|
-
return success;
|
|
183
|
-
}
|
|
184
|
-
const editorClient = clark.context.peer;
|
|
185
|
-
if (!editorClient) {
|
|
186
|
-
logger.warn("No editor client available, skipping API execution validation");
|
|
187
|
-
stateMap.set(id, successState);
|
|
188
|
-
return success;
|
|
189
|
-
}
|
|
190
|
-
let parsedApi;
|
|
191
|
-
try {
|
|
192
|
-
// Parse with a reviver to clean up backticks from all strings
|
|
193
|
-
parsedApi = yaml.parse(apiYaml.content, (_key, value) => {
|
|
194
|
-
if (typeof value === "string" &&
|
|
195
|
-
value.startsWith("`") &&
|
|
196
|
-
value.endsWith("`")) {
|
|
197
|
-
return value.slice(1, -1);
|
|
198
|
-
}
|
|
199
|
-
return value;
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
catch (error) {
|
|
203
|
-
logger.error("Parsing failed", getErrorMeta(error));
|
|
204
|
-
throw new Error(`Failed to parse generated API YAML: ${error instanceof Error ? error.message : String(error)}`);
|
|
205
|
-
}
|
|
206
|
-
logger.info("Parsed API", safeJsonStringify(parsedApi, 2));
|
|
207
|
-
const executor = new ApiExecutor(editorClient, services.integrationStore);
|
|
208
|
-
const result = await executor.execute(parsedApi, inputs);
|
|
209
|
-
if (!result.success) {
|
|
210
|
-
// Log technical error details
|
|
211
|
-
logger.error("API execution failed", {
|
|
212
|
-
error: result.error,
|
|
213
|
-
errorDetails: result.errorDetails,
|
|
214
|
-
});
|
|
215
|
-
// Return user-friendly error for the subagent LLM
|
|
216
|
-
const { errorDetails } = result;
|
|
217
|
-
let friendlyMessage = `The API failed during execution: ${result.error ?? ""} ${safeJsonStringify(result.errorDetails)} `;
|
|
218
|
-
if (errorDetails) {
|
|
219
|
-
switch (errorDetails.type) {
|
|
220
|
-
case "validation":
|
|
221
|
-
friendlyMessage += `There's a validation error - check that all required parameters are provided and data types are correct.`;
|
|
222
|
-
break;
|
|
223
|
-
case "execution":
|
|
224
|
-
friendlyMessage += `The integration returned an error. This might be due to incorrect query syntax, missing permissions, or invalid data references.`;
|
|
225
|
-
break;
|
|
226
|
-
case "proto":
|
|
227
|
-
friendlyMessage += `There's an incompatibility with the API structure. Try simplifying the API or checking the integration configuration.`;
|
|
228
|
-
break;
|
|
229
|
-
default:
|
|
230
|
-
friendlyMessage += `${result.error}`;
|
|
231
|
-
}
|
|
232
|
-
if (errorDetails.suggestion) {
|
|
233
|
-
friendlyMessage += `\n\nSuggestion: ${errorDetails.suggestion}`;
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
throw new Error(friendlyMessage);
|
|
237
|
-
}
|
|
238
|
-
const { outputs } = result;
|
|
239
|
-
if (!outputs) {
|
|
240
|
-
throw new Error(`Execution failed: no outputs in response`);
|
|
241
|
-
}
|
|
242
|
-
// take a small sample of outputs, don't want to blow up context
|
|
243
|
-
const sample = safeJsonStringify(outputs).slice(0, MAX_OUTPUT_SAMPLE_LENGTH) +
|
|
244
|
-
"...[TRUNCATED]";
|
|
245
|
-
stateMap.set(id, successState);
|
|
246
|
-
return {
|
|
247
|
-
...success,
|
|
248
|
-
execution: {
|
|
249
|
-
message: "Verify the output sample matches your expectations; if not, there may be a bug",
|
|
250
|
-
outputs: sample,
|
|
251
|
-
},
|
|
252
|
-
};
|
|
35
|
+
const { isNewApi, inputInterface, responseType } = await buildApiArtifact({
|
|
36
|
+
apiName,
|
|
37
|
+
services,
|
|
38
|
+
scopeUpdateQueue,
|
|
39
|
+
logger,
|
|
40
|
+
});
|
|
41
|
+
let message = `API ${apiName} has been successfully compiled, validated, and saved.`;
|
|
42
|
+
message += `\n\nGenerated TypeScript types:`;
|
|
43
|
+
message += `\n${inputInterface}`;
|
|
44
|
+
message += `\n${responseType}`;
|
|
45
|
+
message += `\n\nTypes saved to apis/${apiName}.d.ts`;
|
|
46
|
+
message += `\n\nThe API is now available in the application. You MUST call testApi to execute and verify the API behavior before moving on to other work`;
|
|
47
|
+
return {
|
|
48
|
+
message,
|
|
49
|
+
apiName,
|
|
50
|
+
isNewApi,
|
|
253
51
|
};
|
|
254
|
-
try {
|
|
255
|
-
return await processApiSource();
|
|
256
|
-
}
|
|
257
|
-
catch (error) {
|
|
258
|
-
stateMap.set(id, {
|
|
259
|
-
...state,
|
|
260
|
-
lastError: error,
|
|
261
|
-
});
|
|
262
|
-
throw error;
|
|
263
|
-
}
|
|
264
52
|
},
|
|
265
53
|
};
|
|
266
54
|
});
|