@superblocksteam/vite-plugin-file-sync 2.0.83 → 2.0.84-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai-service/agent/middleware.d.ts +36 -0
- package/dist/ai-service/agent/middleware.d.ts.map +1 -1
- package/dist/ai-service/agent/middleware.js +65 -1
- package/dist/ai-service/agent/middleware.js.map +1 -1
- package/dist/ai-service/agent/prompts/build-base-system-prompt.d.ts +1 -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 +101 -57
- package/dist/ai-service/agent/prompts/build-base-system-prompt.js.map +1 -1
- package/dist/ai-service/agent/tool-message-utils.js +1 -1
- package/dist/ai-service/agent/tool-message-utils.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/api-executor.js +1 -1
- package/dist/ai-service/agent/tools/apis/api-executor.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/api-validation-orchestrator.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/api-validation-orchestrator.js +1 -1
- package/dist/ai-service/agent/tools/apis/api-validation-orchestrator.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/build-api-artifact.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/build-api-artifact.js +23 -7
- package/dist/ai-service/agent/tools/apis/build-api-artifact.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/build-api.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/build-api.js +36 -19
- 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 +1 -1
- package/dist/ai-service/agent/tools/apis/sample-json.js +1 -1
- package/dist/ai-service/agent/tools/apis/sample-json.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/test-api.d.ts +11 -1
- package/dist/ai-service/agent/tools/apis/test-api.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/test-api.js +95 -54
- package/dist/ai-service/agent/tools/apis/test-api.js.map +1 -1
- package/dist/ai-service/agent/tools/build-capture-screenshot.d.ts +6 -1
- package/dist/ai-service/agent/tools/build-capture-screenshot.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-capture-screenshot.js +26 -12
- package/dist/ai-service/agent/tools/build-capture-screenshot.js.map +1 -1
- package/dist/ai-service/agent/tools/build-debug.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-debug.js +30 -10
- package/dist/ai-service/agent/tools/build-debug.js.map +1 -1
- package/dist/ai-service/agent/tools/build-delete-file.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-delete-file.js +6 -2
- package/dist/ai-service/agent/tools/build-delete-file.js.map +1 -1
- package/dist/ai-service/agent/tools/build-edit-file.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-edit-file.js +20 -5
- package/dist/ai-service/agent/tools/build-edit-file.js.map +1 -1
- package/dist/ai-service/agent/tools/build-finalize.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-finalize.js +30 -4
- package/dist/ai-service/agent/tools/build-finalize.js.map +1 -1
- package/dist/ai-service/agent/tools/build-manage-checklist.d.ts +1 -1
- package/dist/ai-service/agent/tools/build-multi-edit-file.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-multi-edit-file.js +14 -4
- package/dist/ai-service/agent/tools/build-multi-edit-file.js.map +1 -1
- package/dist/ai-service/agent/tools/build-read-file.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-read-file.js +23 -11
- package/dist/ai-service/agent/tools/build-read-file.js.map +1 -1
- package/dist/ai-service/agent/tools/debug-cache.js +1 -1
- package/dist/ai-service/agent/tools/debug-cache.js.map +1 -1
- package/dist/ai-service/agent/tools/get-logs.d.ts +72 -0
- package/dist/ai-service/agent/tools/get-logs.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/get-logs.js +343 -0
- package/dist/ai-service/agent/tools/get-logs.js.map +1 -0
- package/dist/ai-service/agent/tools/index.d.ts +1 -1
- package/dist/ai-service/agent/tools/index.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/index.js +1 -1
- package/dist/ai-service/agent/tools/index.js.map +1 -1
- package/dist/ai-service/agent/tools/integrations/errors.d.ts +9 -0
- package/dist/ai-service/agent/tools/integrations/errors.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/integrations/errors.js +35 -0
- package/dist/ai-service/agent/tools/integrations/errors.js.map +1 -0
- package/dist/ai-service/agent/tools/integrations/execute-request.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/integrations/execute-request.js +20 -5
- package/dist/ai-service/agent/tools/integrations/execute-request.js.map +1 -1
- package/dist/ai-service/agent/tools/integrations/internal.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/integrations/internal.js +12 -3
- 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 +19 -28
- package/dist/ai-service/agent/tools.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 -15
- package/dist/ai-service/agent/tools2/registry.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/bash.d.ts +1 -1
- package/dist/ai-service/agent/tools2/tools/edit.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/edit.js +9 -4
- package/dist/ai-service/agent/tools2/tools/edit.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/grep.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/grep.js +73 -7
- package/dist/ai-service/agent/tools2/tools/grep.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/read.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/read.js +9 -4
- package/dist/ai-service/agent/tools2/tools/read.js.map +1 -1
- package/dist/ai-service/agent/tools2/types.d.ts +40 -8
- package/dist/ai-service/agent/tools2/types.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/types.js +41 -3
- package/dist/ai-service/agent/tools2/types.js.map +1 -1
- package/dist/ai-service/app-interface/filesystem/handlers/skill-handler.d.ts +0 -1
- package/dist/ai-service/app-interface/filesystem/handlers/skill-handler.d.ts.map +1 -1
- package/dist/ai-service/app-interface/filesystem/handlers/skill-handler.js +60 -54
- package/dist/ai-service/app-interface/filesystem/handlers/skill-handler.js.map +1 -1
- package/dist/ai-service/chat/chat-session-store.d.ts +6 -0
- package/dist/ai-service/chat/chat-session-store.d.ts.map +1 -1
- package/dist/ai-service/chat/chat-session-store.js +44 -0
- package/dist/ai-service/chat/chat-session-store.js.map +1 -1
- package/dist/ai-service/facts/helpers.d.ts +9 -0
- package/dist/ai-service/facts/helpers.d.ts.map +1 -0
- package/dist/ai-service/facts/helpers.js +72 -0
- package/dist/ai-service/facts/helpers.js.map +1 -0
- package/dist/ai-service/facts/index.d.ts +4 -0
- package/dist/ai-service/facts/index.d.ts.map +1 -0
- package/dist/ai-service/facts/index.js +3 -0
- package/dist/ai-service/facts/index.js.map +1 -0
- package/dist/ai-service/facts/knowledge-manager.d.ts +50 -0
- package/dist/ai-service/facts/knowledge-manager.d.ts.map +1 -0
- package/dist/ai-service/facts/knowledge-manager.js +195 -0
- package/dist/ai-service/facts/knowledge-manager.js.map +1 -0
- package/dist/ai-service/features.d.ts +8 -0
- package/dist/ai-service/features.d.ts.map +1 -1
- package/dist/ai-service/features.js +8 -0
- package/dist/ai-service/features.js.map +1 -1
- package/dist/ai-service/index.d.ts +34 -2
- package/dist/ai-service/index.d.ts.map +1 -1
- package/dist/ai-service/index.js +112 -18
- package/dist/ai-service/index.js.map +1 -1
- package/dist/ai-service/integrations/metadata-storage/local.d.ts.map +1 -1
- package/dist/ai-service/integrations/metadata-storage/local.js +4 -2
- package/dist/ai-service/integrations/metadata-storage/local.js.map +1 -1
- package/dist/ai-service/integrations/store.d.ts +6 -3
- package/dist/ai-service/integrations/store.d.ts.map +1 -1
- package/dist/ai-service/integrations/store.js +96 -6
- package/dist/ai-service/integrations/store.js.map +1 -1
- package/dist/ai-service/judge/judge-executor.js +1 -1
- package/dist/ai-service/judge/judge-executor.js.map +1 -1
- package/dist/ai-service/judge/tools/playwright-action.d.ts +1 -1
- package/dist/ai-service/llm/client.d.ts.map +1 -1
- package/dist/ai-service/llm/client.js +26 -13
- package/dist/ai-service/llm/client.js.map +1 -1
- package/dist/ai-service/llm/context-v2/adapter.d.ts +2 -0
- package/dist/ai-service/llm/context-v2/adapter.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/adapter.js +6 -0
- package/dist/ai-service/llm/context-v2/adapter.js.map +1 -1
- package/dist/ai-service/llm/context-v2/context.d.ts +19 -0
- package/dist/ai-service/llm/context-v2/context.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/context.js +64 -1
- package/dist/ai-service/llm/context-v2/context.js.map +1 -1
- package/dist/ai-service/llm/context-v2/conversation-context.d.ts +11 -1
- package/dist/ai-service/llm/context-v2/conversation-context.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/manager.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/manager.js +5 -0
- package/dist/ai-service/llm/context-v2/manager.js.map +1 -1
- package/dist/ai-service/llm/context-v2/phase1-tool-summarizer.d.ts +1 -1
- package/dist/ai-service/llm/context-v2/phase1-tool-summarizer.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/phase1-tool-summarizer.js +42 -6
- package/dist/ai-service/llm/context-v2/phase1-tool-summarizer.js.map +1 -1
- package/dist/ai-service/llm/context-v2/types.d.ts +4 -0
- package/dist/ai-service/llm/context-v2/types.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/types.js.map +1 -1
- package/dist/ai-service/llm/error.js +1 -1
- package/dist/ai-service/llm/error.js.map +1 -1
- package/dist/ai-service/llm/interaction/adapters/vercel.js +5 -5
- package/dist/ai-service/llm/stream/config.d.ts +1 -1
- package/dist/ai-service/llm/stream/config.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/config.js.map +1 -1
- package/dist/ai-service/llm/stream/observers/llmobs.js +1 -1
- package/dist/ai-service/llm/stream/observers/llmobs.js.map +1 -1
- package/dist/ai-service/llm/stream/observers/logging.d.ts +20 -0
- package/dist/ai-service/llm/stream/observers/logging.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/observers/logging.js +115 -18
- package/dist/ai-service/llm/stream/observers/logging.js.map +1 -1
- package/dist/ai-service/llm/stream/observers/retry-notification.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/observers/retry-notification.js +2 -1
- package/dist/ai-service/llm/stream/observers/retry-notification.js.map +1 -1
- package/dist/ai-service/llm/stream/orchestrator.js +4 -4
- package/dist/ai-service/llm/stream/orchestrator.js.map +1 -1
- package/dist/ai-service/llm/stream/retry-engine.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/retry-engine.js +1 -1
- package/dist/ai-service/llm/stream/retry-engine.js.map +1 -1
- package/dist/ai-service/llmobs/otel-exporter.d.ts +111 -14
- package/dist/ai-service/llmobs/otel-exporter.d.ts.map +1 -1
- package/dist/ai-service/llmobs/otel-exporter.js +441 -66
- package/dist/ai-service/llmobs/otel-exporter.js.map +1 -1
- package/dist/ai-service/llmobs/tracer.d.ts.map +1 -1
- package/dist/ai-service/llmobs/tracer.js +40 -4
- package/dist/ai-service/llmobs/tracer.js.map +1 -1
- package/dist/ai-service/mcp/playwright-server.d.ts.map +1 -1
- package/dist/ai-service/mcp/playwright-server.js +11 -2
- package/dist/ai-service/mcp/playwright-server.js.map +1 -1
- package/dist/ai-service/recording/index.d.ts +25 -0
- package/dist/ai-service/recording/index.d.ts.map +1 -0
- package/dist/ai-service/recording/index.js +27 -0
- package/dist/ai-service/recording/index.js.map +1 -0
- package/dist/ai-service/recording/recorders/llm-recorder.d.ts +35 -0
- package/dist/ai-service/recording/recorders/llm-recorder.d.ts.map +1 -0
- package/dist/ai-service/recording/recorders/llm-recorder.js +221 -0
- package/dist/ai-service/recording/recorders/llm-recorder.js.map +1 -0
- package/dist/ai-service/recording/recorders/socket-recorder.d.ts +38 -0
- package/dist/ai-service/recording/recorders/socket-recorder.d.ts.map +1 -0
- package/dist/ai-service/recording/recorders/socket-recorder.js +44 -0
- package/dist/ai-service/recording/recorders/socket-recorder.js.map +1 -0
- package/dist/ai-service/recording/recorders/tool-recorder.d.ts +25 -0
- package/dist/ai-service/recording/recorders/tool-recorder.d.ts.map +1 -0
- package/dist/ai-service/recording/recorders/tool-recorder.js +58 -0
- package/dist/ai-service/recording/recorders/tool-recorder.js.map +1 -0
- package/dist/ai-service/recording/recording-manager.d.ts +104 -0
- package/dist/ai-service/recording/recording-manager.d.ts.map +1 -0
- package/dist/ai-service/recording/recording-manager.js +308 -0
- package/dist/ai-service/recording/recording-manager.js.map +1 -0
- package/dist/ai-service/recording/storage/session-recording-storage.d.ts +143 -0
- package/dist/ai-service/recording/storage/session-recording-storage.d.ts.map +1 -0
- package/dist/ai-service/recording/storage/session-recording-storage.js +374 -0
- package/dist/ai-service/recording/storage/session-recording-storage.js.map +1 -0
- package/dist/ai-service/recording/types.d.ts +148 -0
- package/dist/ai-service/recording/types.d.ts.map +1 -0
- package/dist/ai-service/recording/types.js +8 -0
- package/dist/ai-service/recording/types.js.map +1 -0
- package/dist/ai-service/security/safety-classifier.d.ts.map +1 -1
- package/dist/ai-service/security/safety-classifier.js +9 -3
- package/dist/ai-service/security/safety-classifier.js.map +1 -1
- package/dist/ai-service/skills/index.d.ts +23 -11
- package/dist/ai-service/skills/index.d.ts.map +1 -1
- package/dist/ai-service/skills/index.js +86 -21
- package/dist/ai-service/skills/index.js.map +1 -1
- package/dist/ai-service/skills/system/_registry.generated.d.ts +6 -0
- package/dist/ai-service/skills/system/_registry.generated.d.ts.map +1 -0
- package/dist/ai-service/skills/system/_registry.generated.js +24 -0
- package/dist/ai-service/skills/system/_registry.generated.js.map +1 -0
- package/dist/ai-service/skills/system/superblocks-api/references/code-blocks.generated.d.ts +1 -1
- package/dist/ai-service/skills/system/superblocks-api/references/code-blocks.generated.d.ts.map +1 -1
- package/dist/ai-service/skills/system/superblocks-api/references/code-blocks.generated.js +56 -0
- package/dist/ai-service/skills/system/superblocks-api/references/code-blocks.generated.js.map +1 -1
- package/dist/ai-service/skills/system/superblocks-api/references/sql-databases.generated.d.ts +1 -1
- package/dist/ai-service/skills/system/superblocks-api/references/sql-databases.generated.d.ts.map +1 -1
- package/dist/ai-service/skills/system/superblocks-api/references/sql-databases.generated.js +143 -11
- package/dist/ai-service/skills/system/superblocks-api/references/sql-databases.generated.js.map +1 -1
- package/dist/ai-service/skills/system/superblocks-api/skill.generated.d.ts +1 -1
- package/dist/ai-service/skills/system/superblocks-api/skill.generated.d.ts.map +1 -1
- package/dist/ai-service/skills/system/superblocks-api/skill.generated.js +130 -3
- package/dist/ai-service/skills/system/superblocks-api/skill.generated.js.map +1 -1
- package/dist/ai-service/skills/system/superblocks-frontend/references/embedding.generated.d.ts +2 -0
- package/dist/ai-service/skills/system/superblocks-frontend/references/embedding.generated.d.ts.map +1 -0
- package/dist/ai-service/skills/system/superblocks-frontend/references/embedding.generated.js +155 -0
- package/dist/ai-service/skills/system/superblocks-frontend/references/embedding.generated.js.map +1 -0
- package/dist/ai-service/skills/system/superblocks-frontend/skill.generated.d.ts +1 -1
- package/dist/ai-service/skills/system/superblocks-frontend/skill.generated.d.ts.map +1 -1
- package/dist/ai-service/skills/system/superblocks-frontend/skill.generated.js +97 -17
- package/dist/ai-service/skills/system/superblocks-frontend/skill.generated.js.map +1 -1
- package/dist/ai-service/skills/types.d.ts +24 -0
- package/dist/ai-service/skills/types.d.ts.map +1 -1
- package/dist/ai-service/skills/types.js +45 -0
- package/dist/ai-service/skills/types.js.map +1 -1
- package/dist/ai-service/state-machine/clark-fsm.d.ts +33 -2
- package/dist/ai-service/state-machine/clark-fsm.d.ts.map +1 -1
- package/dist/ai-service/state-machine/clark-fsm.js +6 -1
- 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 +24 -21
- 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 +120 -5
- package/dist/ai-service/state-machine/handlers/llm-generating.js.map +1 -1
- package/dist/ai-service/state-machine/mocks.d.ts.map +1 -1
- package/dist/ai-service/state-machine/mocks.js +23 -0
- package/dist/ai-service/state-machine/mocks.js.map +1 -1
- package/dist/ai-service/state-machine/traced-fsm.d.ts.map +1 -1
- package/dist/ai-service/state-machine/traced-fsm.js +1 -1
- package/dist/ai-service/state-machine/traced-fsm.js.map +1 -1
- package/dist/file-sync-vite-plugin.d.ts.map +1 -1
- package/dist/file-sync-vite-plugin.js +52 -22
- package/dist/file-sync-vite-plugin.js.map +1 -1
- package/dist/ids.d.ts +1 -0
- package/dist/ids.d.ts.map +1 -1
- package/dist/ids.js +3 -0
- package/dist/ids.js.map +1 -1
- package/dist/refactor/entities.d.ts.map +1 -1
- package/dist/refactor/entities.js +0 -1
- package/dist/refactor/entities.js.map +1 -1
- package/dist/socket-manager.d.ts.map +1 -1
- package/dist/socket-manager.js +26 -4
- package/dist/socket-manager.js.map +1 -1
- package/dist/sync-service/index.d.ts +4 -0
- package/dist/sync-service/index.d.ts.map +1 -1
- package/dist/sync-service/index.js +6 -0
- package/dist/sync-service/index.js.map +1 -1
- package/dist/util/log-sanitizer.d.ts +42 -0
- package/dist/util/log-sanitizer.d.ts.map +1 -0
- package/dist/util/log-sanitizer.js +177 -0
- package/dist/util/log-sanitizer.js.map +1 -0
- package/dist/util/logger.d.ts +4 -0
- package/dist/util/logger.d.ts.map +1 -1
- package/dist/util/logger.js +77 -19
- package/dist/util/logger.js.map +1 -1
- package/package.json +17 -14
- package/dist/ai-service/agent/tools/get-console-logs.d.ts +0 -29
- package/dist/ai-service/agent/tools/get-console-logs.d.ts.map +0 -1
- package/dist/ai-service/agent/tools/get-console-logs.js +0 -171
- package/dist/ai-service/agent/tools/get-console-logs.js.map +0 -1
- package/dist/ai-service/test-utils/anthropic-service-mock.d.ts +0 -2
- package/dist/ai-service/test-utils/anthropic-service-mock.d.ts.map +0 -1
- package/dist/ai-service/test-utils/anthropic-service-mock.js +0 -91
- package/dist/ai-service/test-utils/anthropic-service-mock.js.map +0 -1
- package/dist/ai-service/test-utils/app-generation-mocks/orders-app.d.ts +0 -3
- package/dist/ai-service/test-utils/app-generation-mocks/orders-app.d.ts.map +0 -1
- package/dist/ai-service/test-utils/app-generation-mocks/orders-app.js +0 -886
- package/dist/ai-service/test-utils/app-generation-mocks/orders-app.js.map +0 -1
- package/dist/ai-service/test-utils/app-generation-mocks/reprompt.d.ts +0 -3
- package/dist/ai-service/test-utils/app-generation-mocks/reprompt.d.ts.map +0 -1
- package/dist/ai-service/test-utils/app-generation-mocks/reprompt.js +0 -70
- package/dist/ai-service/test-utils/app-generation-mocks/reprompt.js.map +0 -1
- package/dist/ai-service/test-utils/app-generation-mocks/smoketest.d.ts +0 -3
- package/dist/ai-service/test-utils/app-generation-mocks/smoketest.d.ts.map +0 -1
- package/dist/ai-service/test-utils/app-generation-mocks/smoketest.js +0 -109
- package/dist/ai-service/test-utils/app-generation-mocks/smoketest.js.map +0 -1
- package/dist/ai-service/test-utils/mock-utils.d.ts +0 -12
- package/dist/ai-service/test-utils/mock-utils.d.ts.map +0 -1
- package/dist/ai-service/test-utils/mock-utils.js +0 -70
- package/dist/ai-service/test-utils/mock-utils.js.map +0 -1
- package/dist/ai-service/util/safe-stringify.d.ts +0 -2
- package/dist/ai-service/util/safe-stringify.d.ts.map +0 -1
- package/dist/ai-service/util/safe-stringify.js +0 -75
- package/dist/ai-service/util/safe-stringify.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ai-service/skills/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ai-service/skills/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,cAAc,YAAY,CAAC;AAI3B;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AA0BD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,GACnB,MAAM,GAAG,SAAS,CAEpB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,aAAa,EAAE,CA+BzD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAkBjD"}
|
|
@@ -1,36 +1,101 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Skills module - provides skill discovery and path utilities.
|
|
3
3
|
*
|
|
4
|
-
* System skills are
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* System skills are stored as .md files and converted to TypeScript
|
|
5
|
+
* during build by the generate-skills script. This avoids runtime
|
|
6
|
+
* file I/O and path resolution issues.
|
|
7
7
|
*/
|
|
8
|
-
import
|
|
9
|
-
import {
|
|
8
|
+
import { parse as parseYaml } from "yaml";
|
|
9
|
+
import { getErrorMeta, getPrefixedLogger } from "../../util/logger.js";
|
|
10
|
+
import { SYSTEM_SKILLS } from "./system/_registry.generated.js";
|
|
10
11
|
export * from "./types.js";
|
|
12
|
+
const logger = getPrefixedLogger("[Skills]");
|
|
11
13
|
/**
|
|
12
|
-
*
|
|
14
|
+
* Parse YAML frontmatter from markdown content.
|
|
13
15
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
+
* @param content - The markdown content to parse
|
|
17
|
+
* @param sourcePath - Path to the source file (for error logging)
|
|
18
|
+
*/
|
|
19
|
+
function parseFrontmatter(content, sourcePath) {
|
|
20
|
+
const match = content.match(/^---\n([\s\S]*?)\n---/);
|
|
21
|
+
if (!match?.[1])
|
|
22
|
+
return null;
|
|
23
|
+
try {
|
|
24
|
+
return parseYaml(match[1]);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
logger.error(`Failed to parse YAML frontmatter${sourcePath ? ` in ${sourcePath}` : ""}`, getErrorMeta(error));
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get content of a system skill by its relative path.
|
|
33
|
+
*
|
|
34
|
+
* @param relativePath - Path relative to skills/system/ (e.g., "superblocks-frontend/SKILL.md")
|
|
35
|
+
* @returns Skill content or undefined if not found
|
|
36
|
+
*/
|
|
37
|
+
export function getSystemSkillContent(relativePath) {
|
|
38
|
+
return SYSTEM_SKILLS[relativePath];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get all available system skills with their metadata.
|
|
16
42
|
*
|
|
17
|
-
* @returns
|
|
43
|
+
* @returns Array of skill metadata
|
|
18
44
|
*/
|
|
19
|
-
export function
|
|
20
|
-
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
45
|
+
export function getSystemSkillsMetadata() {
|
|
46
|
+
const skills = [];
|
|
47
|
+
for (const [relativePath, content] of Object.entries(SYSTEM_SKILLS)) {
|
|
48
|
+
// Only process SKILL.md files for metadata
|
|
49
|
+
if (!relativePath.endsWith("SKILL.md")) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const skillPath = `skills/system/${relativePath}`;
|
|
53
|
+
const frontmatter = parseFrontmatter(content, skillPath);
|
|
54
|
+
if (!frontmatter) {
|
|
55
|
+
logger.warn(`Skill ${skillPath} has no valid frontmatter, skipping`);
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
const skillDir = relativePath.replace(/\/SKILL\.md$/, "");
|
|
59
|
+
const name = frontmatter.name || skillDir;
|
|
60
|
+
let description = frontmatter.description || "";
|
|
61
|
+
// Clean up multiline description
|
|
62
|
+
description = description.trim().replace(/\s+/g, " ");
|
|
63
|
+
skills.push({
|
|
64
|
+
name,
|
|
65
|
+
description,
|
|
66
|
+
location: `skills/system/${relativePath}`,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return skills;
|
|
27
70
|
}
|
|
28
71
|
/**
|
|
29
|
-
*
|
|
72
|
+
* Generate XML representation of available skills for the system prompt.
|
|
30
73
|
*
|
|
31
|
-
* @returns
|
|
74
|
+
* @returns XML string listing all available skills, or null if no skills available
|
|
75
|
+
*/
|
|
76
|
+
export function generateSkillsXml() {
|
|
77
|
+
const skills = getSystemSkillsMetadata();
|
|
78
|
+
if (skills.length === 0) {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
const skillEntries = skills
|
|
82
|
+
.map((skill) => ` <skill>
|
|
83
|
+
<name>${escapeXml(skill.name)}</name>
|
|
84
|
+
<description>${escapeXml(skill.description)}</description>
|
|
85
|
+
<location>${escapeXml(skill.location)}</location>
|
|
86
|
+
</skill>`)
|
|
87
|
+
.join("\n");
|
|
88
|
+
return `<available_skills>\n${skillEntries}\n</available_skills>`;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Escape special XML characters.
|
|
32
92
|
*/
|
|
33
|
-
|
|
34
|
-
return
|
|
93
|
+
function escapeXml(str) {
|
|
94
|
+
return str
|
|
95
|
+
.replace(/&/g, "&")
|
|
96
|
+
.replace(/</g, "<")
|
|
97
|
+
.replace(/>/g, ">")
|
|
98
|
+
.replace(/"/g, """)
|
|
99
|
+
.replace(/'/g, "'");
|
|
35
100
|
}
|
|
36
101
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ai-service/skills/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ai-service/skills/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAEhE,cAAc,YAAY,CAAC;AAE3B,MAAM,MAAM,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;AAW7C;;;;;GAKG;AACH,SAAS,gBAAgB,CACvB,OAAe,EACf,UAAmB;IAEnB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACrD,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAE7B,IAAI,CAAC;QACH,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAA4B,CAAC;IACxD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CACV,mCAAmC,UAAU,CAAC,CAAC,CAAC,OAAO,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAC1E,YAAY,CAAC,KAAK,CAAC,CACpB,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,YAAoB;IAEpB,OAAO,aAAa,CAAC,YAAY,CAAC,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB;IACrC,MAAM,MAAM,GAAoB,EAAE,CAAC;IAEnC,KAAK,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QACpE,2CAA2C;QAC3C,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACvC,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,iBAAiB,YAAY,EAAE,CAAC;QAClD,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAiB,EAAE,SAAS,CAAC,CAAC;QACnE,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,SAAS,SAAS,qCAAqC,CAAC,CAAC;YACrE,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QAC1D,MAAM,IAAI,GAAI,WAAW,CAAC,IAAe,IAAI,QAAQ,CAAC;QACtD,IAAI,WAAW,GAAI,WAAW,CAAC,WAAsB,IAAI,EAAE,CAAC;QAE5D,iCAAiC;QACjC,WAAW,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAEtD,MAAM,CAAC,IAAI,CAAC;YACV,IAAI;YACJ,WAAW;YACX,QAAQ,EAAE,iBAAiB,YAAY,EAAE;SAC1C,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,MAAM,GAAG,uBAAuB,EAAE,CAAC;IAEzC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,YAAY,GAAG,MAAM;SACxB,GAAG,CACF,CAAC,KAAK,EAAE,EAAE,CAAC;YACL,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;mBACd,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC;gBAC/B,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC;WAC9B,CACN;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,uBAAuB,YAAY,uBAAuB,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO,GAAG;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_registry.generated.d.ts","sourceRoot":"","sources":["../../../../src/ai-service/skills/system/_registry.generated.ts"],"names":[],"mappings":"AAYA;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAQhD,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// Auto-generated skills registry
|
|
2
|
+
// Do not edit directly - run npm run generate-skills
|
|
3
|
+
/* eslint-disable prettier/prettier */
|
|
4
|
+
import { content as superblocks_api_references_code_blocks } from "./superblocks-api/references/code-blocks.generated.js";
|
|
5
|
+
import { content as superblocks_api_references_graphql } from "./superblocks-api/references/graphql.generated.js";
|
|
6
|
+
import { content as superblocks_api_references_rest_apis } from "./superblocks-api/references/rest-apis.generated.js";
|
|
7
|
+
import { content as superblocks_api_references_sql_databases } from "./superblocks-api/references/sql-databases.generated.js";
|
|
8
|
+
import { content as superblocks_api_skill } from "./superblocks-api/skill.generated.js";
|
|
9
|
+
import { content as superblocks_frontend_references_embedding } from "./superblocks-frontend/references/embedding.generated.js";
|
|
10
|
+
import { content as superblocks_frontend_skill } from "./superblocks-frontend/skill.generated.js";
|
|
11
|
+
/**
|
|
12
|
+
* Map of skill file paths to their content.
|
|
13
|
+
* Keys are relative paths from skills/system/ (e.g., "superblocks-frontend/SKILL.md")
|
|
14
|
+
*/
|
|
15
|
+
export const SYSTEM_SKILLS = {
|
|
16
|
+
"superblocks-api/SKILL.md": superblocks_api_skill,
|
|
17
|
+
"superblocks-api/references/code-blocks.md": superblocks_api_references_code_blocks,
|
|
18
|
+
"superblocks-api/references/graphql.md": superblocks_api_references_graphql,
|
|
19
|
+
"superblocks-api/references/rest-apis.md": superblocks_api_references_rest_apis,
|
|
20
|
+
"superblocks-api/references/sql-databases.md": superblocks_api_references_sql_databases,
|
|
21
|
+
"superblocks-frontend/SKILL.md": superblocks_frontend_skill,
|
|
22
|
+
"superblocks-frontend/references/embedding.md": superblocks_frontend_references_embedding,
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=_registry.generated.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_registry.generated.js","sourceRoot":"","sources":["../../../../src/ai-service/skills/system/_registry.generated.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,qDAAqD;AACrD,sCAAsC;AAEtC,OAAO,EAAE,OAAO,IAAI,sCAAsC,EAAE,MAAM,uDAAuD,CAAC;AAC1H,OAAO,EAAE,OAAO,IAAI,kCAAkC,EAAE,MAAM,mDAAmD,CAAC;AAClH,OAAO,EAAE,OAAO,IAAI,oCAAoC,EAAE,MAAM,qDAAqD,CAAC;AACtH,OAAO,EAAE,OAAO,IAAI,wCAAwC,EAAE,MAAM,yDAAyD,CAAC;AAC9H,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AACxF,OAAO,EAAE,OAAO,IAAI,yCAAyC,EAAE,MAAM,0DAA0D,CAAC;AAChI,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,2CAA2C,CAAC;AAElG;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAA2B;IACnD,0BAA0B,EAAE,qBAAqB;IACjD,2CAA2C,EAAE,sCAAsC;IACnF,uCAAuC,EAAE,kCAAkC;IAC3E,yCAAyC,EAAE,oCAAoC;IAC/E,6CAA6C,EAAE,wCAAwC;IACvF,+BAA+B,EAAE,0BAA0B;IAC3D,8CAA8C,EAAE,yCAAyC;CAC1F,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const content = "# JavaScript and Python Code Blocks\n\nReference documentation for working with JavaScript and Python code blocks in Superblocks APIs.\n\n## JavaScript Block\n\n```typescript\nimport { JavaScript } from \"@superblocksteam/library\";\n\nnew JavaScript(\"process_data\", {\n fn: ({ input }: { input: any }) => {\n // Your JavaScript code here\n return processedResult;\n }\n})\n```\n\n### Key Features\n\n- Full ES2020+ syntax support\n- Access to previous block outputs\n- Can return any JSON-serializable value\n- Runs in Node.js environment\n\n### Common Patterns\n\n```typescript\n// Data transformation\nnew JavaScript(\"transform\", {\n fn: ({ users }) => users.output.map((user: any) => ({\n id: user.id,\n displayName: `${user.firstName} ${user.lastName}`,\n email: user.email.toLowerCase()\n }))\n})\n\n// Conditional logic\nnew JavaScript(\"validate\", {\n fn: ({ data }: { data: any }) => {\n if (!data.email || !data.email.includes(\"@\")) {\n throw new Error(\"Invalid email address\");\n }\n return { valid: true, data };\n }\n})\n\n// Aggregation\nnew JavaScript(\"aggregate\", {\n fn: ({ orders }) => {\n const output = orders.output;\n return {\n totalOrders: output.length,\n totalRevenue: output.reduce((sum: number, o: any) => sum + o.amount, 0),\n averageOrder: output.reduce((sum: number, o: any) => sum + o.amount, 0) / output.length\n };\n }\n})\n\n// Working with Variables block\nnew JavaScript(\"update_state\", {\n fn: ({ counter, items, newItem }) => {\n // Variables use .value for reading and .set() for writing\n const currentCount = counter.value;\n const currentItems = items.value;\n \n items.set([...currentItems, newItem]);\n counter.set(currentCount + 1);\n \n return { added: newItem, newCount: currentCount + 1 };\n }\n})\n```\n\n### Available Globals\n\n```typescript\nnew JavaScript(\"with_globals\", {\n fn: ({ Global }) => {\n // Global object contains user/org context\n const userId = Global.user.id;\n const userEmail = Global.user.email;\n const userGroups = Global.groups;\n \n return { userId, userEmail, isAdmin: userGroups.some(g => g.name === \"Admin\") };\n }\n})\n```\n\n## Python Block\n\n```typescript\nimport { Python } from \"@superblocksteam/library\";\n\nnew Python(\"python_transform\", {\n code: `\nimport json\n\n# Access inputs directly\nresult = {\n \"processed\": True,\n \"count\": len(data)\n}\n\n# Return must be JSON serializable\nreturn result\n `\n})\n```\n\n### Key Features\n\n- Python 3.x runtime\n- Common libraries available (pandas, numpy, etc.)\n- Access inputs as Python variables\n- Return value must be JSON serializable\n\n### Common Patterns\n\n```python\n# Data processing with pandas\nimport pandas as pd\n\ndf = pd.DataFrame(users_data)\nfiltered = df[df['status'] == 'active']\nresult = filtered.to_dict(orient='records')\nreturn result\n```\n\n```python\n# Statistical analysis\nimport numpy as np\n\nvalues = [item['amount'] for item in orders_data]\nreturn {\n 'mean': float(np.mean(values)),\n 'median': float(np.median(values)),\n 'std': float(np.std(values))\n}\n```\n\n### Python Variable Access\n\n```python\n# Inputs are available as Python variables\n# Previous block outputs are also available\n\n# Access input parameter\nemail = input_email # Direct variable access\n\n# Access previous block output\nusers = fetch_users # Output from previous block named 'fetch_users'\n```\n\n## Choosing JavaScript vs Python\n\n**Use JavaScript when:**\n- Simple data transformations\n- JSON manipulation\n- Working with Superblocks Variables\n- Need to use `.set()` for state updates\n\n**Use Python when:**\n- Complex data analysis (pandas)\n- Statistical computations (numpy/scipy)\n- Machine learning operations\n- Heavy numerical processing\n\n## Error Handling\n\nBoth languages throw errors that can be caught with TryCatch:\n\n```typescript\nnew TryCatch(\"safe_process\", {\n try: [\n new JavaScript(\"risky_operation\", {\n fn: ({ data }) => {\n if (!data) throw new Error(\"Data is required\");\n return processData(data);\n }\n })\n ],\n catch: [\n new JavaScript(\"handle_error\", {\n fn: ({ processError }) => ({\n success: false,\n error: processError.value.message\n })\n })\n ],\n variables: { error: \"processError\" }\n})\n```\n\n## Best Practices\n\n1. **Keep blocks focused** - One logical operation per block\n2. **Use descriptive names** - `calculate_shipping_cost` not `calc`\n3. **Type your inputs** - `({ userId }: { userId: string })` not `({ userId })`\n4. **Handle edge cases** - Check for null/undefined/empty arrays\n5. **Return clean data** - Only return what's needed downstream\n";
|
|
1
|
+
export declare const content = "# JavaScript and Python Code Blocks\n\nReference documentation for working with JavaScript and Python code blocks in Superblocks APIs.\n\n## JavaScript Block\n\n```typescript\nimport { JavaScript } from \"@superblocksteam/library\";\n\nnew JavaScript(\"process_data\", {\n fn: ({ input }: { input: any }) => {\n // Your JavaScript code here\n return processedResult;\n }\n})\n```\n\n### Key Features\n\n- Full ES2020+ syntax support\n- Access to previous block outputs\n- Can return any JSON-serializable value\n- Runs in Node.js environment\n\n### Common Patterns\n\n```typescript\n// Data transformation\nnew JavaScript(\"transform\", {\n fn: ({ users }) => users.output.map((user: any) => ({\n id: user.id,\n displayName: `${user.firstName} ${user.lastName}`,\n email: user.email.toLowerCase()\n }))\n})\n\n// Conditional logic\nnew JavaScript(\"validate\", {\n fn: ({ data }: { data: any }) => {\n if (!data.email || !data.email.includes(\"@\")) {\n throw new Error(\"Invalid email address\");\n }\n return { valid: true, data };\n }\n})\n\n// Aggregation\nnew JavaScript(\"aggregate\", {\n fn: ({ orders }) => {\n const output = orders.output;\n return {\n totalOrders: output.length,\n totalRevenue: output.reduce((sum: number, o: any) => sum + o.amount, 0),\n averageOrder: output.reduce((sum: number, o: any) => sum + o.amount, 0) / output.length\n };\n }\n})\n\n// Working with Variables block\nnew JavaScript(\"update_state\", {\n fn: ({ counter, items, newItem }) => {\n // Variables use .value for reading and .set() for writing\n const currentCount = counter.value;\n const currentItems = items.value;\n \n items.set([...currentItems, newItem]);\n counter.set(currentCount + 1);\n \n return { added: newItem, newCount: currentCount + 1 };\n }\n})\n```\n\n### Available Globals\n\n```typescript\nnew JavaScript(\"with_globals\", {\n fn: ({ Global }) => {\n // Global object contains user/org context\n const userId = Global.user.id;\n const userEmail = Global.user.email;\n const userGroups = Global.groups;\n \n return { userId, userEmail, isAdmin: userGroups.some(g => g.name === \"Admin\") };\n }\n})\n```\n\n## Python Block\n\n```typescript\nimport { Python } from \"@superblocksteam/library\";\n\nnew Python(\"python_transform\", {\n code: `\nimport json\n\n# Access inputs directly\nresult = {\n \"processed\": True,\n \"count\": len(data)\n}\n\n# Return must be JSON serializable\nreturn result\n `\n})\n```\n\n### Key Features\n\n- Python 3.x runtime\n- Common libraries available (pandas, numpy, etc.)\n- Access inputs as Python variables\n- Return value must be JSON serializable\n\n### Common Patterns\n\n```python\n# Data processing with pandas\nimport pandas as pd\n\ndf = pd.DataFrame(users_data)\nfiltered = df[df['status'] == 'active']\nresult = filtered.to_dict(orient='records')\nreturn result\n```\n\n```python\n# Statistical analysis\nimport numpy as np\n\nvalues = [item['amount'] for item in orders_data]\nreturn {\n 'mean': float(np.mean(values)),\n 'median': float(np.median(values)),\n 'std': float(np.std(values))\n}\n```\n\n### Python Variable Access\n\n```python\n# Inputs are available as Python variables\n# Previous block outputs are also available\n\n# Access input parameter\nemail = input_email # Direct variable access\n\n# Access previous block output\nusers = fetch_users # Output from previous block named 'fetch_users'\n```\n\n## Choosing JavaScript vs Python\n\n**Use JavaScript when:**\n- Simple data transformations\n- JSON manipulation\n- Working with Superblocks Variables\n- Need to use `.set()` for state updates\n\n**Use Python when:**\n- Complex data analysis (pandas)\n- Statistical computations (numpy/scipy)\n- Machine learning operations\n- Heavy numerical processing\n\n## Error Handling\n\nBoth languages throw errors that can be caught with TryCatch:\n\n```typescript\nnew TryCatch(\"safe_process\", {\n try: [\n new JavaScript(\"risky_operation\", {\n fn: ({ data }) => {\n if (!data) throw new Error(\"Data is required\");\n return processData(data);\n }\n })\n ],\n catch: [\n new JavaScript(\"handle_error\", {\n fn: ({ processError }) => ({\n success: false,\n error: processError.value.message\n })\n })\n ],\n variables: { error: \"processError\" }\n})\n```\n\n## Processing File Content\n\nWhen you need to read and process file content (parse CSV, extract text, validate, etc.):\n\nFilePicker files are stored on the orchestrator's file server.\n\n### Methods\n- `readContents(mode?)` - Synchronous\n- `readContentsAsync(mode?)` - Asynchronous\n\n### Mode Parameter\n- (none) - auto-detects: returns base64 string for binary files, UTF-8 string for text\n- `'raw'` - returns Buffer in JavaScript, bytes in Python (for direct byte access)\n- `'text'` - returns UTF-8 string\n- `'binary'` - returns base64 string\n\n### JavaScript - use await directly\n\n```typescript\nnew JavaScript(\"parse_csv\", {\n fn: async ({ csvFile }) => {\n const file = csvFile.files[0];\n const content = await file.readContentsAsync();\n const headers = content.split(\"\\n\")[0].split(\",\").map(h => h.trim());\n return { fileName: file.name, headers };\n }\n})\n\n// Binary file - use 'raw' mode for byte access\nnew JavaScript(\"check_jpeg\", {\n fn: async ({ imageFile }) => {\n const buf = await imageFile.files[0].readContentsAsync('raw'); // Buffer\n const isJPEG = buf[0] === 0xFF && buf[1] === 0xD8 && buf[2] === 0xFF;\n return { isJPEG };\n }\n})\n```\n\n### Python - use sync for single file, async for parallel\n\n```python\n# Single file - use sync (simpler)\ncontent = file.readContents()\nrows = content.split('\\n')\n\n# Check file type by magic bytes\nraw = file.readContents('raw')\nis_pdf = raw[:4] == b'%PDF'\n\n# Multiple files in parallel - use async\nimport asyncio\nasync def fetch_all(files):\n return await asyncio.gather(*[f.readContentsAsync() for f in files])\ncontents = asyncio.run(fetch_all(files))\n```\n\n## Best Practices\n\n1. **Keep blocks focused** - One logical operation per block\n2. **Use descriptive names** - `calculate_shipping_cost` not `calc`\n3. **Type your inputs** - `({ userId }: { userId: string })` not `({ userId })`\n4. **Handle edge cases** - Check for null/undefined/empty arrays\n5. **Return clean data** - Only return what's needed downstream\n";
|
|
2
2
|
//# sourceMappingURL=code-blocks.generated.d.ts.map
|
package/dist/ai-service/skills/system/superblocks-api/references/code-blocks.generated.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-blocks.generated.d.ts","sourceRoot":"","sources":["../../../../../../src/ai-service/skills/system/superblocks-api/references/code-blocks.generated.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"code-blocks.generated.d.ts","sourceRoot":"","sources":["../../../../../../src/ai-service/skills/system/superblocks-api/references/code-blocks.generated.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,OAAO,k1MAgQnB,CAAC"}
|
|
@@ -193,6 +193,62 @@ new TryCatch("safe_process", {
|
|
|
193
193
|
})
|
|
194
194
|
\`\`\`
|
|
195
195
|
|
|
196
|
+
## Processing File Content
|
|
197
|
+
|
|
198
|
+
When you need to read and process file content (parse CSV, extract text, validate, etc.):
|
|
199
|
+
|
|
200
|
+
FilePicker files are stored on the orchestrator's file server.
|
|
201
|
+
|
|
202
|
+
### Methods
|
|
203
|
+
- \`readContents(mode?)\` - Synchronous
|
|
204
|
+
- \`readContentsAsync(mode?)\` - Asynchronous
|
|
205
|
+
|
|
206
|
+
### Mode Parameter
|
|
207
|
+
- (none) - auto-detects: returns base64 string for binary files, UTF-8 string for text
|
|
208
|
+
- \`'raw'\` - returns Buffer in JavaScript, bytes in Python (for direct byte access)
|
|
209
|
+
- \`'text'\` - returns UTF-8 string
|
|
210
|
+
- \`'binary'\` - returns base64 string
|
|
211
|
+
|
|
212
|
+
### JavaScript - use await directly
|
|
213
|
+
|
|
214
|
+
\`\`\`typescript
|
|
215
|
+
new JavaScript("parse_csv", {
|
|
216
|
+
fn: async ({ csvFile }) => {
|
|
217
|
+
const file = csvFile.files[0];
|
|
218
|
+
const content = await file.readContentsAsync();
|
|
219
|
+
const headers = content.split("\\n")[0].split(",").map(h => h.trim());
|
|
220
|
+
return { fileName: file.name, headers };
|
|
221
|
+
}
|
|
222
|
+
})
|
|
223
|
+
|
|
224
|
+
// Binary file - use 'raw' mode for byte access
|
|
225
|
+
new JavaScript("check_jpeg", {
|
|
226
|
+
fn: async ({ imageFile }) => {
|
|
227
|
+
const buf = await imageFile.files[0].readContentsAsync('raw'); // Buffer
|
|
228
|
+
const isJPEG = buf[0] === 0xFF && buf[1] === 0xD8 && buf[2] === 0xFF;
|
|
229
|
+
return { isJPEG };
|
|
230
|
+
}
|
|
231
|
+
})
|
|
232
|
+
\`\`\`
|
|
233
|
+
|
|
234
|
+
### Python - use sync for single file, async for parallel
|
|
235
|
+
|
|
236
|
+
\`\`\`python
|
|
237
|
+
# Single file - use sync (simpler)
|
|
238
|
+
content = file.readContents()
|
|
239
|
+
rows = content.split('\\n')
|
|
240
|
+
|
|
241
|
+
# Check file type by magic bytes
|
|
242
|
+
raw = file.readContents('raw')
|
|
243
|
+
is_pdf = raw[:4] == b'%PDF'
|
|
244
|
+
|
|
245
|
+
# Multiple files in parallel - use async
|
|
246
|
+
import asyncio
|
|
247
|
+
async def fetch_all(files):
|
|
248
|
+
return await asyncio.gather(*[f.readContentsAsync() for f in files])
|
|
249
|
+
contents = asyncio.run(fetch_all(files))
|
|
250
|
+
\`\`\`
|
|
251
|
+
|
|
196
252
|
## Best Practices
|
|
197
253
|
|
|
198
254
|
1. **Keep blocks focused** - One logical operation per block
|
package/dist/ai-service/skills/system/superblocks-api/references/code-blocks.generated.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-blocks.generated.js","sourceRoot":"","sources":["../../../../../../src/ai-service/skills/system/superblocks-api/references/code-blocks.generated.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,mDAAmD;AAEnD,MAAM,CAAC,MAAM,OAAO,GAAG
|
|
1
|
+
{"version":3,"file":"code-blocks.generated.js","sourceRoot":"","sources":["../../../../../../src/ai-service/skills/system/superblocks-api/references/code-blocks.generated.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,mDAAmD;AAEnD,MAAM,CAAC,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgQtB,CAAC"}
|
package/dist/ai-service/skills/system/superblocks-api/references/sql-databases.generated.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const content = "# SQL Database Integrations\n\nReference documentation for working with SQL databases in Superblocks APIs.\n\n## Supported Databases\n\n- PostgreSQL, MySQL, MariaDB, MSSQL\n- Snowflake, Redshift, BigQuery\n- Databricks, SingleStore\n- CockroachDB, YugabyteDB\n\n## SQL Block Classes\n\n```typescript\n// Available SQL integrations\nimport {\n PostgreSQL,\n MySQL,\n MariaDB,\n MSSQL,\n Snowflake,\n Redshift,\n BigQuery,\n Databricks,\n SingleStore,\n} from \"@superblocksteam/library\";\n```\n\n## Basic Usage\n\n```typescript\nnew PostgreSQL(\"get_users\", \"postgres-integration-id\", {\n statement: \"SELECT * FROM users WHERE active = true LIMIT 100\"\n})\n```\n\n## Parameterized Queries\n\n**ALWAYS use parameterized queries for user input:**\n\n```typescript\n// \u2705 CORRECT - String interpolation for WHERE clauses\nnew PostgreSQL(\"search\", \"postgres-id\", {\n statement: ({ searchTerm, limit }: { searchTerm: string; limit: number }) =>\n `SELECT * FROM users WHERE name ILIKE '%${searchTerm}%' LIMIT ${limit}`\n})\n\n// \u2705 CORRECT - For INSERT statements\nnew PostgreSQL(\"insert_user\", \"postgres-id\", {\n statement: ({ name, email }: { name: string; email: string }) =>\n `INSERT INTO users (name, email) VALUES ('${name}', '${email}') RETURNING *`\n})\n```\n\n## Best Practices\n\n### 1. Use Meaningful Block Names\n\n```typescript\n// \u2705 GOOD\nnew PostgreSQL(\"fetch_active_users\", \"pg-id\", { ... })\nnew PostgreSQL(\"insert_order_item\", \"pg-id\", { ... })\n\n// \u274C BAD\nnew PostgreSQL(\"query1\", \"pg-id\", { ... })\nnew PostgreSQL(\"sql\", \"pg-id\", { ... })\n```\n\n### 2. Always Specify Columns\n\n```typescript\n// \u2705 PREFERRED - Explicit columns\nSELECT id, name, email, created_at FROM users\n\n// \u26A0\uFE0F AVOID - Select all\nSELECT * FROM users\n```\n\n### 3. Use LIMIT for Safety\n\n```typescript\n// \u2705 Always include LIMIT for queries that could return many rows\nSELECT * FROM orders LIMIT 1000\n```\n\n### 4. Handle NULL Values\n\n```typescript\n// \u2705 Use COALESCE for default values\nSELECT COALESCE(description, 'No description') as description FROM products\n\n// \u2705 Use IS NULL / IS NOT NULL\nSELECT * FROM users WHERE deleted_at IS NULL\n```\n\n## Database-Specific Notes\n\n### PostgreSQL\n\n```typescript\n// Array operations\nnew PostgreSQL(\"array_query\", \"pg-id\", {\n statement: ({ tags }: { tags: string[] }) =>\n `SELECT * FROM posts WHERE tags && ARRAY[${tags.map(t => `'${t}'`).join(',')}]`\n})\n\n// JSON operations\nnew PostgreSQL(\"json_query\", \"pg-id\", {\n statement: \"SELECT data->>'name' as name FROM json_data\"\n})\n```\n\n### Snowflake\n\n```typescript\n// Use QUALIFY for window function filtering\nnew Snowflake(\"ranked_query\", \"snowflake-id\", {\n statement: `\n SELECT *, ROW_NUMBER() OVER (PARTITION BY category ORDER BY sales DESC) as rank\n FROM products\n QUALIFY rank <= 3\n `\n})\n```\n\n### BigQuery\n\n```typescript\n// Use backticks for table names\nnew BigQuery(\"query\", \"bq-id\", {\n statement: \"SELECT * FROM \\`project.dataset.table\\` LIMIT 100\"\n})\n```\n\n## Common Patterns\n\n### Pagination\n\n```typescript\nnew PostgreSQL(\"paginated_fetch\", \"pg-id\", {\n statement: ({ page, pageSize }: { page: number; pageSize: number }) =>\n `SELECT * FROM orders ORDER BY created_at DESC LIMIT ${pageSize} OFFSET ${(page - 1) * pageSize}`\n})\n```\n\n### Search with Multiple Conditions\n\n```typescript\nnew PostgreSQL(\"advanced_search\", \"pg-id\", {\n statement: ({ name, status, minAmount }: { name?: string; status?: string; minAmount?: number }) => {\n const conditions = [\"1=1\"];\n if (name) conditions.push(`name ILIKE '%${name}%'`);\n if (status) conditions.push(`status = '${status}'`);\n if (minAmount !== undefined) conditions.push(`amount >= ${minAmount}`);\n return `SELECT * FROM orders WHERE ${conditions.join(\" AND \")} LIMIT 100`;\n }\n})\n```\n\n### Batch Insert\n\n```typescript\nnew PostgreSQL(\"batch_insert\", \"pg-id\", {\n statement: ({ items }: { items: Array<{ name: string; value: number }> }) => {\n const values = items\n .map(item => `('${item.name}', ${item.value})`)\n .join(\", \");\n return `INSERT INTO items (name, value) VALUES ${values} RETURNING *`;\n }\n})\n```\n\n### Upsert (Insert or Update)\n\n```typescript\n// PostgreSQL\nnew PostgreSQL(\"upsert_user\", \"pg-id\", {\n statement: ({ id, name, email }: { id: string; name: string; email: string }) =>\n `INSERT INTO users (id, name, email) \n VALUES ('${id}', '${name}', '${email}')\n ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name, email = EXCLUDED.email\n RETURNING *`\n})\n```\n\n## Error Handling\n\nSQL errors are returned in the block's output. Common errors:\n- Syntax errors in SQL\n- Table/column doesn't exist\n- Constraint violations\n- Connection timeouts\n\nFor critical operations, wrap in TryCatch:\n\n```typescript\nnew TryCatch(\"safe_delete\", {\n try: [\n new PostgreSQL(\"delete_record\", \"pg-id\", {\n statement: ({ id }: { id: string }) => `DELETE FROM sensitive_data WHERE id = '${id}'`\n })\n ],\n catch: [\n new JavaScript(\"log_error\", {\n fn: ({ deleteError }) => ({\n success: false,\n error: deleteError.value.message\n })\n })\n ],\n variables: { error: \"deleteError\" }\n})\n```\n";
|
|
1
|
+
export declare const content = "# SQL Database Integrations\n\nReference documentation for working with SQL databases in Superblocks APIs.\n\n## Supported Databases\n\n- PostgreSQL, MySQL, MariaDB, MSSQL\n- Snowflake, Redshift, BigQuery, Athena\n- Databricks, SingleStore, Lakebase\n- CockroachDB, YugabyteDB, OracleDB\n\n## SQL Block Classes\n\n```typescript\n// Available SQL integrations\nimport {\n PostgreSQL,\n MySQL,\n MariaDB,\n MSSQL,\n Snowflake,\n Redshift,\n BigQuery,\n Athena,\n Databricks,\n SingleStore,\n OracleDB,\n} from \"@superblocksteam/library\";\n```\n\n## Basic Usage\n\n```typescript\nnew PostgreSQL(\"get_users\", \"postgres-integration-id\", {\n statement: \"SELECT * FROM users WHERE active = true LIMIT 100\"\n})\n```\n\n## Parameterized Queries\n\n### SQL Security Priority\n\n**ALWAYS prefer parameterized queries over string interpolation for user input values.**\n\nUse `parameters: \"[var1, var2]\"` with the database-specific SQL placeholders:\n\n| Database | Placeholder Syntax | Example |\n|----------|-------------------|---------|\n| PostgreSQL, Redshift, CockroachDB | `$1`, `$2`, `$3` | `WHERE id = $1 AND status = $2` |\n| MySQL, MariaDB, Snowflake, BigQuery, Athena | `?`, `?`, `?` | `WHERE id = ? AND status = ?` |\n| MSSQL | `@PARAM_1`, `@PARAM_2` | `WHERE id = @PARAM_1 AND status = @PARAM_2` |\n| Databricks | `:PARAM_1`, `:PARAM_2` | `WHERE id = :PARAM_1 AND status = :PARAM_2` |\n| OracleDB | `:1`, `:2`, `:3` | `WHERE id = :1 AND status = :2` |\n\nOnly use binding functions for truly dynamic SQL elements like table/column names.\n\n### Parameters Syntax vs Statement Syntax\n\n**Important:** `parameters` is a JavaScript expression string that gets evaluated directly. Do NOT use `${}` interpolation or binding functions.\n\n```typescript\n// \u274C WRONG - Don't use ${} interpolation in parameters\nparameters: \"[${build_query.output.userId}, ${searchTerm}]\"\n\n// \u274C WRONG - Don't use binding functions for parameters \nparameters: ({ build_query }) => JSON.stringify(build_query.output.params)\n\n// \u2705 CORRECT - Write expressions directly (they get evaluated as JS)\nparameters: \"[build_query.output.userId, searchTerm, limit]\"\n\n// \u2705 CORRECT - Reference block output array directly\nparameters: \"build_query.output.params\"\n```\n\nThis is different from `statement`, where binding functions with `${}` ARE used to interpolate values into SQL.\n\n### String Interpolation (Alternative)\n\nFor simpler cases, string interpolation also works:\n\n```typescript\n// \u2705 CORRECT - String interpolation for WHERE clauses\nnew PostgreSQL(\"search\", \"postgres-id\", {\n statement: ({ searchTerm, limit }: { searchTerm: string; limit: number }) =>\n `SELECT * FROM users WHERE name ILIKE '%${searchTerm}%' LIMIT ${limit}`\n})\n\n// \u2705 CORRECT - For INSERT statements\nnew PostgreSQL(\"insert_user\", \"postgres-id\", {\n statement: ({ name, email }: { name: string; email: string }) =>\n `INSERT INTO users (name, email) VALUES ('${name}', '${email}') RETURNING *`\n})\n```\n\n### Dynamic SQL with Optional Filters\n\nUse the `parameters` array with the \"OR NULL\" pattern for optional filters:\n- `WHERE (column = $1 OR $1::type IS NULL)` makes the condition a no-op when parameter is null\n- Cast parameters to their type when checking for NULL (PostgreSQL can't infer types from NULL values)\n- Always pass all parameters, using null for unused filters\n- NEVER interpolate user values directly into SQL strings\n\n## Best Practices\n\n### 1. ONE Query Per Block Rule\n\nEach SQL block (PostgreSQL, Snowflake, MySQL, MicrosoftSql, Databricks) can execute **ONLY ONE SQL query**.\n\n\u274C **WRONG - Multiple queries in one block:**\n```sql\nUPDATE users SET status = 'active';\nDELETE FROM logs WHERE created < '2023-01-01';\nINSERT INTO audit VALUES ('done');\n```\n\n\u2705 **CORRECT - One query per block:**\n```typescript\nnew PostgreSQL(\"update_status\", \"postgres-id\", {\n statement: \"UPDATE users SET status = 'active'\"\n}),\nnew PostgreSQL(\"clean_logs\", \"postgres-id\", {\n statement: \"DELETE FROM logs WHERE created < '2023-01-01'\"\n})\n```\n\n### 2. Use Meaningful Block Names\n\n```typescript\n// \u2705 GOOD\nnew PostgreSQL(\"fetch_active_users\", \"pg-id\", { ... })\nnew PostgreSQL(\"insert_order_item\", \"pg-id\", { ... })\n\n// \u274C BAD\nnew PostgreSQL(\"query1\", \"pg-id\", { ... })\nnew PostgreSQL(\"sql\", \"pg-id\", { ... })\n```\n\n### 3. Always Specify Columns\n\n```typescript\n// \u2705 PREFERRED - Explicit columns\nSELECT id, name, email, created_at FROM users\n\n// \u26A0\uFE0F AVOID - Select all\nSELECT * FROM users\n```\n\n### 4. Always Add Defensive Row Limits\n\nAlways include a row limit clause to prevent runaway queries. Use 100 as the default unless user specifies otherwise.\n\nDifferent SQL dialects have different syntax:\n- **MySQL/PostgreSQL/SQLite**: `LIMIT N`\n- **SQL Server**: `SELECT TOP N`\n- **ANSI SQL (SQL Server, Oracle, DB2)**: `OFFSET 0 ROWS FETCH NEXT N ROWS ONLY`\n\n```sql\n-- \u2705 PostgreSQL/MySQL\nSELECT * FROM orders ORDER BY created_at DESC LIMIT 100;\n\n-- \u2705 SQL Server\nSELECT TOP 100 * FROM orders ORDER BY created_at DESC;\n\n-- \u2705 ANSI SQL (SQL Server with ORDER BY)\nSELECT * FROM orders ORDER BY created_at DESC OFFSET 0 ROWS FETCH NEXT 100 ROWS ONLY;\n\n-- \u274C Avoid unlimited queries\nSELECT * FROM orders ORDER BY created_at DESC; -- Can timeout or crash\n```\n\n### 5. Sort, Don't Filter by Date (Default)\n\nDo NOT add automatic date filters (e.g., \"last 90 days\") unless the user explicitly requests them. This is a common cause of unexpected empty SQL results.\n\n```sql\n-- \u2705 Default approach\nSELECT * FROM orders ORDER BY created_at DESC LIMIT 100;\n\n-- \u274C Avoid automatic filtering\nSELECT * FROM orders WHERE created_at >= CURRENT_DATE - INTERVAL '90 days'; -- Can return empty results\n```\n\nOnly add date WHERE clauses when users explicitly ask for time-based filtering.\n\n### 6. Handle NULL Values\n\n```typescript\n// \u2705 Use COALESCE for default values\nSELECT COALESCE(description, 'No description') as description FROM products\n\n// \u2705 Use IS NULL / IS NOT NULL\nSELECT * FROM users WHERE deleted_at IS NULL\n```\n\n## Database-Specific Notes\n\n### PostgreSQL\n\n```typescript\n// Array operations\nnew PostgreSQL(\"array_query\", \"pg-id\", {\n statement: ({ tags }: { tags: string[] }) =>\n `SELECT * FROM posts WHERE tags && ARRAY[${tags.map(t => `'${t}'`).join(',')}]`\n})\n\n// JSON operations\nnew PostgreSQL(\"json_query\", \"pg-id\", {\n statement: \"SELECT data->>'name' as name FROM json_data\"\n})\n```\n\n- Use schema-qualified names: `schema.table` or `\"schema\".\"table\"`\n- Case sensitivity: Unquoted identifiers are lowercase\n- Use `::type` for type casting\n\n### Snowflake\n\n```typescript\n// Use QUALIFY for window function filtering\nnew Snowflake(\"ranked_query\", \"snowflake-id\", {\n statement: `\n SELECT *, ROW_NUMBER() OVER (PARTITION BY category ORDER BY sales DESC) as rank\n FROM products\n QUALIFY rank <= 3\n `\n})\n```\n\n**Snowflake Two-Part Naming:** Snowflake uses `schema.table`\n\nWhen you see Snowflake metadata where tables have a `schema` property, **you MUST qualify table names**:\n\n```sql\n-- If table has schema property \"MASTERDATA\"\nSELECT * FROM MASTERDATA.PRODUCTLINE -- \u2705 Fully qualified\nSELECT * FROM PRODUCTLINE -- \u274C Will fail if no default schema\n```\n\n**Rule**: If a table object has a non-empty `schema` property, use `{schema}.{name}` format in your SQL queries.\n\n### Databricks\n\n**Databricks Three-Part Naming:** Databricks uses `catalog.schema.table`\n\nWhen you see Databricks metadata like:\n- `uber.default.orders` - Use the FULL path: `uber.default.orders`\n- `production.analytics.users` - Use: `production.analytics.users`\n\n```sql\n-- Metadata shows: uber.default.orders\nSELECT * FROM uber.default.orders -- \u2705 Full path\nSELECT * FROM uber.orders -- \u274C Missing schema part\nSELECT * FROM orders -- \u274C Missing catalog and schema\n```\n\n**Note:** The word \"default\" in Databricks paths is NOT optional - it's the actual schema name. Always include all three parts exactly as shown in the metadata.\n\n### BigQuery\n\n```typescript\n// Use backticks for table names\nnew BigQuery(\"query\", \"bq-id\", {\n statement: \"SELECT * FROM \\`project.dataset.table\\` LIMIT 100\"\n})\n```\n\n## Common Patterns\n\n### Pagination\n\n```typescript\nnew PostgreSQL(\"paginated_fetch\", \"pg-id\", {\n statement: ({ page, pageSize }: { page: number; pageSize: number }) =>\n `SELECT * FROM orders ORDER BY created_at DESC LIMIT ${pageSize} OFFSET ${(page - 1) * pageSize}`\n})\n```\n\n### Search with Multiple Conditions\n\n```typescript\nnew PostgreSQL(\"advanced_search\", \"pg-id\", {\n statement: ({ name, status, minAmount }: { name?: string; status?: string; minAmount?: number }) => {\n const conditions = [\"1=1\"];\n if (name) conditions.push(`name ILIKE '%${name}%'`);\n if (status) conditions.push(`status = '${status}'`);\n if (minAmount !== undefined) conditions.push(`amount >= ${minAmount}`);\n return `SELECT * FROM orders WHERE ${conditions.join(\" AND \")} LIMIT 100`;\n }\n})\n```\n\n### Batch Insert\n\n```typescript\nnew PostgreSQL(\"batch_insert\", \"pg-id\", {\n statement: ({ items }: { items: Array<{ name: string; value: number }> }) => {\n const values = items\n .map(item => `('${item.name}', ${item.value})`)\n .join(\", \");\n return `INSERT INTO items (name, value) VALUES ${values} RETURNING *`;\n }\n})\n```\n\n### Upsert (Insert or Update)\n\n```typescript\n// PostgreSQL\nnew PostgreSQL(\"upsert_user\", \"pg-id\", {\n statement: ({ id, name, email }: { id: string; name: string; email: string }) =>\n `INSERT INTO users (id, name, email) \n VALUES ('${id}', '${name}', '${email}')\n ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name, email = EXCLUDED.email\n RETURNING *`\n})\n```\n\n## Error Handling\n\nSQL errors are returned in the block's output. Common errors:\n- Syntax errors in SQL\n- Table/column doesn't exist\n- Constraint violations\n- Connection timeouts\n\nFor critical operations, wrap in TryCatch:\n\n```typescript\nnew TryCatch(\"safe_delete\", {\n try: [\n new PostgreSQL(\"delete_record\", \"pg-id\", {\n statement: ({ id }: { id: string }) => `DELETE FROM sensitive_data WHERE id = '${id}'`\n })\n ],\n catch: [\n new JavaScript(\"log_error\", {\n fn: ({ deleteError }) => ({\n success: false,\n error: deleteError.value.message\n })\n })\n ],\n variables: { error: \"deleteError\" }\n})\n```\n";
|
|
2
2
|
//# sourceMappingURL=sql-databases.generated.d.ts.map
|
package/dist/ai-service/skills/system/superblocks-api/references/sql-databases.generated.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-databases.generated.d.ts","sourceRoot":"","sources":["../../../../../../src/ai-service/skills/system/superblocks-api/references/sql-databases.generated.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"sql-databases.generated.d.ts","sourceRoot":"","sources":["../../../../../../src/ai-service/skills/system/superblocks-api/references/sql-databases.generated.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,OAAO,w+UAyVnB,CAAC"}
|
|
@@ -7,9 +7,9 @@ Reference documentation for working with SQL databases in Superblocks APIs.
|
|
|
7
7
|
## Supported Databases
|
|
8
8
|
|
|
9
9
|
- PostgreSQL, MySQL, MariaDB, MSSQL
|
|
10
|
-
- Snowflake, Redshift, BigQuery
|
|
11
|
-
- Databricks, SingleStore
|
|
12
|
-
- CockroachDB, YugabyteDB
|
|
10
|
+
- Snowflake, Redshift, BigQuery, Athena
|
|
11
|
+
- Databricks, SingleStore, Lakebase
|
|
12
|
+
- CockroachDB, YugabyteDB, OracleDB
|
|
13
13
|
|
|
14
14
|
## SQL Block Classes
|
|
15
15
|
|
|
@@ -23,8 +23,10 @@ import {
|
|
|
23
23
|
Snowflake,
|
|
24
24
|
Redshift,
|
|
25
25
|
BigQuery,
|
|
26
|
+
Athena,
|
|
26
27
|
Databricks,
|
|
27
28
|
SingleStore,
|
|
29
|
+
OracleDB,
|
|
28
30
|
} from "@superblocksteam/library";
|
|
29
31
|
\`\`\`
|
|
30
32
|
|
|
@@ -38,7 +40,45 @@ new PostgreSQL("get_users", "postgres-integration-id", {
|
|
|
38
40
|
|
|
39
41
|
## Parameterized Queries
|
|
40
42
|
|
|
41
|
-
|
|
43
|
+
### SQL Security Priority
|
|
44
|
+
|
|
45
|
+
**ALWAYS prefer parameterized queries over string interpolation for user input values.**
|
|
46
|
+
|
|
47
|
+
Use \`parameters: "[var1, var2]"\` with the database-specific SQL placeholders:
|
|
48
|
+
|
|
49
|
+
| Database | Placeholder Syntax | Example |
|
|
50
|
+
|----------|-------------------|---------|
|
|
51
|
+
| PostgreSQL, Redshift, CockroachDB | \`$1\`, \`$2\`, \`$3\` | \`WHERE id = $1 AND status = $2\` |
|
|
52
|
+
| MySQL, MariaDB, Snowflake, BigQuery, Athena | \`?\`, \`?\`, \`?\` | \`WHERE id = ? AND status = ?\` |
|
|
53
|
+
| MSSQL | \`@PARAM_1\`, \`@PARAM_2\` | \`WHERE id = @PARAM_1 AND status = @PARAM_2\` |
|
|
54
|
+
| Databricks | \`:PARAM_1\`, \`:PARAM_2\` | \`WHERE id = :PARAM_1 AND status = :PARAM_2\` |
|
|
55
|
+
| OracleDB | \`:1\`, \`:2\`, \`:3\` | \`WHERE id = :1 AND status = :2\` |
|
|
56
|
+
|
|
57
|
+
Only use binding functions for truly dynamic SQL elements like table/column names.
|
|
58
|
+
|
|
59
|
+
### Parameters Syntax vs Statement Syntax
|
|
60
|
+
|
|
61
|
+
**Important:** \`parameters\` is a JavaScript expression string that gets evaluated directly. Do NOT use \`\${}\` interpolation or binding functions.
|
|
62
|
+
|
|
63
|
+
\`\`\`typescript
|
|
64
|
+
// ❌ WRONG - Don't use \${} interpolation in parameters
|
|
65
|
+
parameters: "[\${build_query.output.userId}, \${searchTerm}]"
|
|
66
|
+
|
|
67
|
+
// ❌ WRONG - Don't use binding functions for parameters
|
|
68
|
+
parameters: ({ build_query }) => JSON.stringify(build_query.output.params)
|
|
69
|
+
|
|
70
|
+
// ✅ CORRECT - Write expressions directly (they get evaluated as JS)
|
|
71
|
+
parameters: "[build_query.output.userId, searchTerm, limit]"
|
|
72
|
+
|
|
73
|
+
// ✅ CORRECT - Reference block output array directly
|
|
74
|
+
parameters: "build_query.output.params"
|
|
75
|
+
\`\`\`
|
|
76
|
+
|
|
77
|
+
This is different from \`statement\`, where binding functions with \`\${}\` ARE used to interpolate values into SQL.
|
|
78
|
+
|
|
79
|
+
### String Interpolation (Alternative)
|
|
80
|
+
|
|
81
|
+
For simpler cases, string interpolation also works:
|
|
42
82
|
|
|
43
83
|
\`\`\`typescript
|
|
44
84
|
// ✅ CORRECT - String interpolation for WHERE clauses
|
|
@@ -54,9 +94,38 @@ new PostgreSQL("insert_user", "postgres-id", {
|
|
|
54
94
|
})
|
|
55
95
|
\`\`\`
|
|
56
96
|
|
|
97
|
+
### Dynamic SQL with Optional Filters
|
|
98
|
+
|
|
99
|
+
Use the \`parameters\` array with the "OR NULL" pattern for optional filters:
|
|
100
|
+
- \`WHERE (column = $1 OR $1::type IS NULL)\` makes the condition a no-op when parameter is null
|
|
101
|
+
- Cast parameters to their type when checking for NULL (PostgreSQL can't infer types from NULL values)
|
|
102
|
+
- Always pass all parameters, using null for unused filters
|
|
103
|
+
- NEVER interpolate user values directly into SQL strings
|
|
104
|
+
|
|
57
105
|
## Best Practices
|
|
58
106
|
|
|
59
|
-
### 1.
|
|
107
|
+
### 1. ONE Query Per Block Rule
|
|
108
|
+
|
|
109
|
+
Each SQL block (PostgreSQL, Snowflake, MySQL, MicrosoftSql, Databricks) can execute **ONLY ONE SQL query**.
|
|
110
|
+
|
|
111
|
+
❌ **WRONG - Multiple queries in one block:**
|
|
112
|
+
\`\`\`sql
|
|
113
|
+
UPDATE users SET status = 'active';
|
|
114
|
+
DELETE FROM logs WHERE created < '2023-01-01';
|
|
115
|
+
INSERT INTO audit VALUES ('done');
|
|
116
|
+
\`\`\`
|
|
117
|
+
|
|
118
|
+
✅ **CORRECT - One query per block:**
|
|
119
|
+
\`\`\`typescript
|
|
120
|
+
new PostgreSQL("update_status", "postgres-id", {
|
|
121
|
+
statement: "UPDATE users SET status = 'active'"
|
|
122
|
+
}),
|
|
123
|
+
new PostgreSQL("clean_logs", "postgres-id", {
|
|
124
|
+
statement: "DELETE FROM logs WHERE created < '2023-01-01'"
|
|
125
|
+
})
|
|
126
|
+
\`\`\`
|
|
127
|
+
|
|
128
|
+
### 2. Use Meaningful Block Names
|
|
60
129
|
|
|
61
130
|
\`\`\`typescript
|
|
62
131
|
// ✅ GOOD
|
|
@@ -68,7 +137,7 @@ new PostgreSQL("query1", "pg-id", { ... })
|
|
|
68
137
|
new PostgreSQL("sql", "pg-id", { ... })
|
|
69
138
|
\`\`\`
|
|
70
139
|
|
|
71
|
-
###
|
|
140
|
+
### 3. Always Specify Columns
|
|
72
141
|
|
|
73
142
|
\`\`\`typescript
|
|
74
143
|
// ✅ PREFERRED - Explicit columns
|
|
@@ -78,14 +147,44 @@ SELECT id, name, email, created_at FROM users
|
|
|
78
147
|
SELECT * FROM users
|
|
79
148
|
\`\`\`
|
|
80
149
|
|
|
81
|
-
###
|
|
150
|
+
### 4. Always Add Defensive Row Limits
|
|
82
151
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
152
|
+
Always include a row limit clause to prevent runaway queries. Use 100 as the default unless user specifies otherwise.
|
|
153
|
+
|
|
154
|
+
Different SQL dialects have different syntax:
|
|
155
|
+
- **MySQL/PostgreSQL/SQLite**: \`LIMIT N\`
|
|
156
|
+
- **SQL Server**: \`SELECT TOP N\`
|
|
157
|
+
- **ANSI SQL (SQL Server, Oracle, DB2)**: \`OFFSET 0 ROWS FETCH NEXT N ROWS ONLY\`
|
|
158
|
+
|
|
159
|
+
\`\`\`sql
|
|
160
|
+
-- ✅ PostgreSQL/MySQL
|
|
161
|
+
SELECT * FROM orders ORDER BY created_at DESC LIMIT 100;
|
|
162
|
+
|
|
163
|
+
-- ✅ SQL Server
|
|
164
|
+
SELECT TOP 100 * FROM orders ORDER BY created_at DESC;
|
|
165
|
+
|
|
166
|
+
-- ✅ ANSI SQL (SQL Server with ORDER BY)
|
|
167
|
+
SELECT * FROM orders ORDER BY created_at DESC OFFSET 0 ROWS FETCH NEXT 100 ROWS ONLY;
|
|
168
|
+
|
|
169
|
+
-- ❌ Avoid unlimited queries
|
|
170
|
+
SELECT * FROM orders ORDER BY created_at DESC; -- Can timeout or crash
|
|
86
171
|
\`\`\`
|
|
87
172
|
|
|
88
|
-
###
|
|
173
|
+
### 5. Sort, Don't Filter by Date (Default)
|
|
174
|
+
|
|
175
|
+
Do NOT add automatic date filters (e.g., "last 90 days") unless the user explicitly requests them. This is a common cause of unexpected empty SQL results.
|
|
176
|
+
|
|
177
|
+
\`\`\`sql
|
|
178
|
+
-- ✅ Default approach
|
|
179
|
+
SELECT * FROM orders ORDER BY created_at DESC LIMIT 100;
|
|
180
|
+
|
|
181
|
+
-- ❌ Avoid automatic filtering
|
|
182
|
+
SELECT * FROM orders WHERE created_at >= CURRENT_DATE - INTERVAL '90 days'; -- Can return empty results
|
|
183
|
+
\`\`\`
|
|
184
|
+
|
|
185
|
+
Only add date WHERE clauses when users explicitly ask for time-based filtering.
|
|
186
|
+
|
|
187
|
+
### 6. Handle NULL Values
|
|
89
188
|
|
|
90
189
|
\`\`\`typescript
|
|
91
190
|
// ✅ Use COALESCE for default values
|
|
@@ -112,6 +211,10 @@ new PostgreSQL("json_query", "pg-id", {
|
|
|
112
211
|
})
|
|
113
212
|
\`\`\`
|
|
114
213
|
|
|
214
|
+
- Use schema-qualified names: \`schema.table\` or \`"schema"."table"\`
|
|
215
|
+
- Case sensitivity: Unquoted identifiers are lowercase
|
|
216
|
+
- Use \`::type\` for type casting
|
|
217
|
+
|
|
115
218
|
### Snowflake
|
|
116
219
|
|
|
117
220
|
\`\`\`typescript
|
|
@@ -125,6 +228,35 @@ new Snowflake("ranked_query", "snowflake-id", {
|
|
|
125
228
|
})
|
|
126
229
|
\`\`\`
|
|
127
230
|
|
|
231
|
+
**Snowflake Two-Part Naming:** Snowflake uses \`schema.table\`
|
|
232
|
+
|
|
233
|
+
When you see Snowflake metadata where tables have a \`schema\` property, **you MUST qualify table names**:
|
|
234
|
+
|
|
235
|
+
\`\`\`sql
|
|
236
|
+
-- If table has schema property "MASTERDATA"
|
|
237
|
+
SELECT * FROM MASTERDATA.PRODUCTLINE -- ✅ Fully qualified
|
|
238
|
+
SELECT * FROM PRODUCTLINE -- ❌ Will fail if no default schema
|
|
239
|
+
\`\`\`
|
|
240
|
+
|
|
241
|
+
**Rule**: If a table object has a non-empty \`schema\` property, use \`{schema}.{name}\` format in your SQL queries.
|
|
242
|
+
|
|
243
|
+
### Databricks
|
|
244
|
+
|
|
245
|
+
**Databricks Three-Part Naming:** Databricks uses \`catalog.schema.table\`
|
|
246
|
+
|
|
247
|
+
When you see Databricks metadata like:
|
|
248
|
+
- \`uber.default.orders\` - Use the FULL path: \`uber.default.orders\`
|
|
249
|
+
- \`production.analytics.users\` - Use: \`production.analytics.users\`
|
|
250
|
+
|
|
251
|
+
\`\`\`sql
|
|
252
|
+
-- Metadata shows: uber.default.orders
|
|
253
|
+
SELECT * FROM uber.default.orders -- ✅ Full path
|
|
254
|
+
SELECT * FROM uber.orders -- ❌ Missing schema part
|
|
255
|
+
SELECT * FROM orders -- ❌ Missing catalog and schema
|
|
256
|
+
\`\`\`
|
|
257
|
+
|
|
258
|
+
**Note:** The word "default" in Databricks paths is NOT optional - it's the actual schema name. Always include all three parts exactly as shown in the metadata.
|
|
259
|
+
|
|
128
260
|
### BigQuery
|
|
129
261
|
|
|
130
262
|
\`\`\`typescript
|
package/dist/ai-service/skills/system/superblocks-api/references/sql-databases.generated.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-databases.generated.js","sourceRoot":"","sources":["../../../../../../src/ai-service/skills/system/superblocks-api/references/sql-databases.generated.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,mDAAmD;AAEnD,MAAM,CAAC,MAAM,OAAO,GAAG
|
|
1
|
+
{"version":3,"file":"sql-databases.generated.js","sourceRoot":"","sources":["../../../../../../src/ai-service/skills/system/superblocks-api/references/sql-databases.generated.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,mDAAmD;AAEnD,MAAM,CAAC,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyVtB,CAAC"}
|