@nodetool-ai/websocket 0.7.0-rc.23 → 0.8.1
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/README.md +50 -0
- package/dist/.nodetool-build-stamp +1 -0
- package/dist/agent/run-node-tool.d.ts +39 -0
- package/dist/agent/run-node-tool.d.ts.map +1 -0
- package/dist/agent/run-node-tool.js +55 -0
- package/dist/agent/run-node-tool.js.map +1 -0
- package/dist/chat-prediction-forwarder.d.ts +13 -0
- package/dist/chat-prediction-forwarder.d.ts.map +1 -0
- package/dist/chat-prediction-forwarder.js +22 -0
- package/dist/chat-prediction-forwarder.js.map +1 -0
- package/dist/chat-tool-call-repair.d.ts +45 -0
- package/dist/chat-tool-call-repair.d.ts.map +1 -0
- package/dist/chat-tool-call-repair.js +100 -0
- package/dist/chat-tool-call-repair.js.map +1 -0
- package/dist/chat-turn-registry.d.ts +169 -0
- package/dist/chat-turn-registry.d.ts.map +1 -0
- package/dist/chat-turn-registry.js +326 -0
- package/dist/chat-turn-registry.js.map +1 -0
- package/dist/collection-api.d.ts +2 -2
- package/dist/collection-api.d.ts.map +1 -1
- package/dist/collection-api.js +44 -13
- package/dist/collection-api.js.map +1 -1
- package/dist/configured-providers.d.ts +52 -0
- package/dist/configured-providers.d.ts.map +1 -0
- package/dist/configured-providers.js +85 -0
- package/dist/configured-providers.js.map +1 -0
- package/dist/cors.d.ts +22 -0
- package/dist/cors.d.ts.map +1 -0
- package/dist/cors.js +91 -0
- package/dist/cors.js.map +1 -0
- package/dist/credit-gate.d.ts +36 -0
- package/dist/credit-gate.d.ts.map +1 -0
- package/dist/credit-gate.js +76 -0
- package/dist/credit-gate.js.map +1 -0
- package/dist/custom-providers.d.ts +40 -0
- package/dist/custom-providers.d.ts.map +1 -0
- package/dist/custom-providers.js +134 -0
- package/dist/custom-providers.js.map +1 -0
- package/dist/debug-sessions.d.ts +10 -0
- package/dist/debug-sessions.d.ts.map +1 -0
- package/dist/debug-sessions.js +9 -0
- package/dist/debug-sessions.js.map +1 -0
- package/dist/drain.d.ts +34 -0
- package/dist/drain.d.ts.map +1 -0
- package/dist/drain.js +68 -0
- package/dist/drain.js.map +1 -0
- package/dist/e2e-server.d.ts +30 -0
- package/dist/e2e-server.d.ts.map +1 -0
- package/dist/e2e-server.js +111 -0
- package/dist/e2e-server.js.map +1 -0
- package/dist/example-workflows.d.ts +20 -0
- package/dist/example-workflows.d.ts.map +1 -0
- package/dist/example-workflows.js +123 -0
- package/dist/example-workflows.js.map +1 -0
- package/dist/extension-cdp-bridge.d.ts +85 -0
- package/dist/extension-cdp-bridge.d.ts.map +1 -0
- package/dist/extension-cdp-bridge.js +163 -0
- package/dist/extension-cdp-bridge.js.map +1 -0
- package/dist/external-mcp.d.ts +58 -0
- package/dist/external-mcp.d.ts.map +1 -0
- package/dist/external-mcp.js +288 -0
- package/dist/external-mcp.js.map +1 -0
- package/dist/fake-runtime.d.ts +114 -0
- package/dist/fake-runtime.d.ts.map +1 -0
- package/dist/fake-runtime.js +270 -0
- package/dist/fake-runtime.js.map +1 -0
- package/dist/file-api.d.ts +4 -7
- package/dist/file-api.d.ts.map +1 -1
- package/dist/file-api.js +122 -39
- package/dist/file-api.js.map +1 -1
- package/dist/frontend-renderer-registry.d.ts +75 -0
- package/dist/frontend-renderer-registry.d.ts.map +1 -0
- package/dist/frontend-renderer-registry.js +111 -0
- package/dist/frontend-renderer-registry.js.map +1 -0
- package/dist/generation-recovery.d.ts +13 -0
- package/dist/generation-recovery.d.ts.map +1 -0
- package/dist/generation-recovery.js +197 -0
- package/dist/generation-recovery.js.map +1 -0
- package/dist/headless-job-runner.d.ts +71 -0
- package/dist/headless-job-runner.d.ts.map +1 -0
- package/dist/headless-job-runner.js +198 -0
- package/dist/headless-job-runner.js.map +1 -0
- package/dist/http-api.d.ts +157 -24
- package/dist/http-api.d.ts.map +1 -1
- package/dist/http-api.js +613 -646
- package/dist/http-api.js.map +1 -1
- package/dist/http-body-schemas.d.ts +109 -0
- package/dist/http-body-schemas.d.ts.map +1 -0
- package/dist/http-body-schemas.js +146 -0
- package/dist/http-body-schemas.js.map +1 -0
- package/dist/index.d.ts +11 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -3
- package/dist/index.js.map +1 -1
- package/dist/job-control.d.ts +57 -0
- package/dist/job-control.d.ts.map +1 -0
- package/dist/job-control.js +134 -0
- package/dist/job-control.js.map +1 -0
- package/dist/job-queue.d.ts +47 -0
- package/dist/job-queue.d.ts.map +1 -0
- package/dist/job-queue.js +52 -0
- package/dist/job-queue.js.map +1 -0
- package/dist/job-run-registry.d.ts +176 -0
- package/dist/job-run-registry.d.ts.map +1 -0
- package/dist/job-run-registry.js +312 -0
- package/dist/job-run-registry.js.map +1 -0
- package/dist/lib/app-build-service.d.ts +16 -0
- package/dist/lib/app-build-service.d.ts.map +1 -0
- package/dist/lib/app-build-service.js +39 -0
- package/dist/lib/app-build-service.js.map +1 -0
- package/dist/lib/app-debug-service.d.ts +16 -0
- package/dist/lib/app-debug-service.d.ts.map +1 -0
- package/dist/lib/app-debug-service.js +48 -0
- package/dist/lib/app-debug-service.js.map +1 -0
- package/dist/lib/app-deployment-service.d.ts +82 -0
- package/dist/lib/app-deployment-service.d.ts.map +1 -0
- package/dist/lib/app-deployment-service.js +282 -0
- package/dist/lib/app-deployment-service.js.map +1 -0
- package/dist/lib/app-run-server.d.ts +7 -0
- package/dist/lib/app-run-server.d.ts.map +1 -0
- package/dist/lib/app-run-server.js +6 -0
- package/dist/lib/app-run-server.js.map +1 -0
- package/dist/lib/app-session-scope.d.ts +91 -0
- package/dist/lib/app-session-scope.d.ts.map +1 -0
- package/dist/lib/app-session-scope.js +91 -0
- package/dist/lib/app-session-scope.js.map +1 -0
- package/dist/lib/applications-service.d.ts +173 -0
- package/dist/lib/applications-service.d.ts.map +1 -0
- package/dist/lib/applications-service.js +491 -0
- package/dist/lib/applications-service.js.map +1 -0
- package/dist/lib/asset-duration.d.ts +7 -0
- package/dist/lib/asset-duration.d.ts.map +1 -0
- package/dist/lib/asset-duration.js +24 -0
- package/dist/lib/asset-duration.js.map +1 -0
- package/dist/lib/asset-export.d.ts +34 -0
- package/dist/lib/asset-export.d.ts.map +1 -0
- package/dist/lib/asset-export.js +113 -0
- package/dist/lib/asset-export.js.map +1 -0
- package/dist/lib/asset-model-interface.d.ts +41 -0
- package/dist/lib/asset-model-interface.d.ts.map +1 -0
- package/dist/lib/asset-model-interface.js +74 -0
- package/dist/lib/asset-model-interface.js.map +1 -0
- package/dist/lib/asset-paths.d.ts +52 -0
- package/dist/lib/asset-paths.d.ts.map +1 -1
- package/dist/lib/asset-paths.js +145 -1
- package/dist/lib/asset-paths.js.map +1 -1
- package/dist/lib/asset-response.d.ts +12 -0
- package/dist/lib/asset-response.d.ts.map +1 -0
- package/dist/lib/asset-response.js +88 -0
- package/dist/lib/asset-response.js.map +1 -0
- package/dist/lib/audio-peaks.d.ts +23 -0
- package/dist/lib/audio-peaks.d.ts.map +1 -0
- package/dist/lib/audio-peaks.js +331 -0
- package/dist/lib/audio-peaks.js.map +1 -0
- package/dist/lib/bridge.d.ts +9 -1
- package/dist/lib/bridge.d.ts.map +1 -1
- package/dist/lib/bridge.js +27 -4
- package/dist/lib/bridge.js.map +1 -1
- package/dist/lib/compression.d.ts +3 -0
- package/dist/lib/compression.d.ts.map +1 -0
- package/dist/lib/compression.js +3 -0
- package/dist/lib/compression.js.map +1 -0
- package/dist/lib/document-model-interfaces.d.ts +30 -0
- package/dist/lib/document-model-interfaces.d.ts.map +1 -0
- package/dist/lib/document-model-interfaces.js +295 -0
- package/dist/lib/document-model-interfaces.js.map +1 -0
- package/dist/lib/env-config.d.ts +9 -0
- package/dist/lib/env-config.d.ts.map +1 -0
- package/dist/lib/env-config.js +18 -0
- package/dist/lib/env-config.js.map +1 -0
- package/dist/lib/example-apps.d.ts +43 -0
- package/dist/lib/example-apps.d.ts.map +1 -0
- package/dist/lib/example-apps.js +145 -0
- package/dist/lib/example-apps.js.map +1 -0
- package/dist/lib/example-games.d.ts +5 -0
- package/dist/lib/example-games.d.ts.map +1 -0
- package/dist/lib/example-games.js +13 -0
- package/dist/lib/example-games.js.map +1 -0
- package/dist/lib/example-recipes.d.ts +33 -0
- package/dist/lib/example-recipes.d.ts.map +1 -0
- package/dist/lib/example-recipes.js +213 -0
- package/dist/lib/example-recipes.js.map +1 -0
- package/dist/lib/example-storyboards.d.ts +40 -0
- package/dist/lib/example-storyboards.d.ts.map +1 -0
- package/dist/lib/example-storyboards.js +131 -0
- package/dist/lib/example-storyboards.js.map +1 -0
- package/dist/lib/example-thumbnail.d.ts +21 -0
- package/dist/lib/example-thumbnail.d.ts.map +1 -0
- package/dist/lib/example-thumbnail.js +50 -0
- package/dist/lib/example-thumbnail.js.map +1 -0
- package/dist/lib/example-timelines.d.ts +9 -0
- package/dist/lib/example-timelines.d.ts.map +1 -0
- package/dist/lib/example-timelines.js +25 -0
- package/dist/lib/example-timelines.js.map +1 -0
- package/dist/lib/extension-dist.d.ts +24 -0
- package/dist/lib/extension-dist.d.ts.map +1 -0
- package/dist/lib/extension-dist.js +67 -0
- package/dist/lib/extension-dist.js.map +1 -0
- package/dist/lib/external-asset-lookup.d.ts +30 -0
- package/dist/lib/external-asset-lookup.d.ts.map +1 -0
- package/dist/lib/external-asset-lookup.js +99 -0
- package/dist/lib/external-asset-lookup.js.map +1 -0
- package/dist/lib/external-assets.d.ts +13 -0
- package/dist/lib/external-assets.d.ts.map +1 -0
- package/dist/lib/external-assets.js +46 -0
- package/dist/lib/external-assets.js.map +1 -0
- package/dist/lib/fly-replay.d.ts +34 -0
- package/dist/lib/fly-replay.d.ts.map +1 -0
- package/dist/lib/fly-replay.js +111 -0
- package/dist/lib/fly-replay.js.map +1 -0
- package/dist/lib/http-rate-limit.d.ts +32 -0
- package/dist/lib/http-rate-limit.d.ts.map +1 -0
- package/dist/lib/http-rate-limit.js +47 -0
- package/dist/lib/http-rate-limit.js.map +1 -0
- package/dist/lib/instance-id.d.ts +25 -0
- package/dist/lib/instance-id.d.ts.map +1 -0
- package/dist/lib/instance-id.js +44 -0
- package/dist/lib/instance-id.js.map +1 -0
- package/dist/lib/link-codes.d.ts +82 -0
- package/dist/lib/link-codes.d.ts.map +1 -0
- package/dist/lib/link-codes.js +100 -0
- package/dist/lib/link-codes.js.map +1 -0
- package/dist/lib/local-asset-upload.d.ts +5 -0
- package/dist/lib/local-asset-upload.d.ts.map +1 -0
- package/dist/lib/local-asset-upload.js +69 -0
- package/dist/lib/local-asset-upload.js.map +1 -0
- package/dist/lib/local-file-access.d.ts +31 -0
- package/dist/lib/local-file-access.d.ts.map +1 -0
- package/dist/lib/local-file-access.js +169 -0
- package/dist/lib/local-file-access.js.map +1 -0
- package/dist/lib/localhost-trust.d.ts +59 -0
- package/dist/lib/localhost-trust.d.ts.map +1 -0
- package/dist/lib/localhost-trust.js +139 -0
- package/dist/lib/localhost-trust.js.map +1 -0
- package/dist/lib/mcp-mount.d.ts +25 -0
- package/dist/lib/mcp-mount.d.ts.map +1 -0
- package/dist/lib/mcp-mount.js +32 -0
- package/dist/lib/mcp-mount.js.map +1 -0
- package/dist/lib/media-size.d.ts +21 -0
- package/dist/lib/media-size.d.ts.map +1 -0
- package/dist/lib/media-size.js +48 -0
- package/dist/lib/media-size.js.map +1 -0
- package/dist/lib/media.d.ts +38 -0
- package/dist/lib/media.d.ts.map +1 -0
- package/dist/lib/media.js +146 -0
- package/dist/lib/media.js.map +1 -0
- package/dist/lib/package-asset-export.d.ts +83 -0
- package/dist/lib/package-asset-export.d.ts.map +1 -0
- package/dist/lib/package-asset-export.js +212 -0
- package/dist/lib/package-asset-export.js.map +1 -0
- package/dist/lib/package-assets.d.ts +41 -0
- package/dist/lib/package-assets.d.ts.map +1 -0
- package/dist/lib/package-assets.js +155 -0
- package/dist/lib/package-assets.js.map +1 -0
- package/dist/lib/project-delete.d.ts +11 -0
- package/dist/lib/project-delete.d.ts.map +1 -0
- package/dist/lib/project-delete.js +67 -0
- package/dist/lib/project-delete.js.map +1 -0
- package/dist/lib/project-document-copy.d.ts +31 -0
- package/dist/lib/project-document-copy.d.ts.map +1 -0
- package/dist/lib/project-document-copy.js +473 -0
- package/dist/lib/project-document-copy.js.map +1 -0
- package/dist/lib/public-app-assets.d.ts +8 -0
- package/dist/lib/public-app-assets.d.ts.map +1 -0
- package/dist/lib/public-app-assets.js +77 -0
- package/dist/lib/public-app-assets.js.map +1 -0
- package/dist/lib/public-routes.d.ts +95 -0
- package/dist/lib/public-routes.d.ts.map +1 -0
- package/dist/lib/public-routes.js +154 -0
- package/dist/lib/public-routes.js.map +1 -0
- package/dist/lib/runtime-detection.d.ts +17 -0
- package/dist/lib/runtime-detection.d.ts.map +1 -0
- package/dist/lib/runtime-detection.js +90 -0
- package/dist/lib/runtime-detection.js.map +1 -0
- package/dist/lib/storage-access.d.ts +21 -0
- package/dist/lib/storage-access.d.ts.map +1 -0
- package/dist/lib/storage-access.js +74 -0
- package/dist/lib/storage-access.js.map +1 -0
- package/dist/lib/storage.d.ts +9 -0
- package/dist/lib/storage.d.ts.map +1 -0
- package/dist/lib/storage.js +28 -0
- package/dist/lib/storage.js.map +1 -0
- package/dist/lib/storyboard-export.d.ts +64 -0
- package/dist/lib/storyboard-export.d.ts.map +1 -0
- package/dist/lib/storyboard-export.js +183 -0
- package/dist/lib/storyboard-export.js.map +1 -0
- package/dist/lib/style-presets.d.ts +34 -0
- package/dist/lib/style-presets.d.ts.map +1 -0
- package/dist/lib/style-presets.js +62 -0
- package/dist/lib/style-presets.js.map +1 -0
- package/dist/lib/temp-url-resolver.d.ts +35 -0
- package/dist/lib/temp-url-resolver.d.ts.map +1 -0
- package/dist/lib/temp-url-resolver.js +88 -0
- package/dist/lib/temp-url-resolver.js.map +1 -0
- package/dist/lib/thumbnail.d.ts +74 -0
- package/dist/lib/thumbnail.d.ts.map +1 -0
- package/dist/lib/thumbnail.js +302 -0
- package/dist/lib/thumbnail.js.map +1 -0
- package/dist/lib/timeline-bundle.d.ts +1689 -0
- package/dist/lib/timeline-bundle.d.ts.map +1 -0
- package/dist/lib/timeline-bundle.js +330 -0
- package/dist/lib/timeline-bundle.js.map +1 -0
- package/dist/lib/video-proxy.d.ts +114 -0
- package/dist/lib/video-proxy.d.ts.map +1 -0
- package/dist/lib/video-proxy.js +545 -0
- package/dist/lib/video-proxy.js.map +1 -0
- package/dist/lib/wire-values.d.ts +31 -0
- package/dist/lib/wire-values.d.ts.map +1 -0
- package/dist/lib/wire-values.js +49 -0
- package/dist/lib/wire-values.js.map +1 -0
- package/dist/lib/workflow-bundle.d.ts +102 -0
- package/dist/lib/workflow-bundle.d.ts.map +1 -0
- package/dist/lib/workflow-bundle.js +306 -0
- package/dist/lib/workflow-bundle.js.map +1 -0
- package/dist/lib/workflow-service.d.ts +82 -0
- package/dist/lib/workflow-service.d.ts.map +1 -0
- package/dist/lib/workflow-service.js +194 -0
- package/dist/lib/workflow-service.js.map +1 -0
- package/dist/lib/workflow-workspace.d.ts +20 -0
- package/dist/lib/workflow-workspace.d.ts.map +1 -0
- package/dist/lib/workflow-workspace.js +65 -0
- package/dist/lib/workflow-workspace.js.map +1 -0
- package/dist/lib/ws-connection-health.d.ts +10 -0
- package/dist/lib/ws-connection-health.d.ts.map +1 -0
- package/dist/lib/ws-connection-health.js +38 -0
- package/dist/lib/ws-connection-health.js.map +1 -0
- package/dist/lib/ws-rate-limit.d.ts +22 -0
- package/dist/lib/ws-rate-limit.d.ts.map +1 -0
- package/dist/lib/ws-rate-limit.js +45 -0
- package/dist/lib/ws-rate-limit.js.map +1 -0
- package/dist/lib/ws-upgrade.d.ts +40 -0
- package/dist/lib/ws-upgrade.d.ts.map +1 -0
- package/dist/lib/ws-upgrade.js +66 -0
- package/dist/lib/ws-upgrade.js.map +1 -0
- package/dist/lib/zip-stream.d.ts +46 -0
- package/dist/lib/zip-stream.d.ts.map +1 -0
- package/dist/lib/zip-stream.js +140 -0
- package/dist/lib/zip-stream.js.map +1 -0
- package/dist/mcp-agent-tools.d.ts +56 -0
- package/dist/mcp-agent-tools.d.ts.map +1 -0
- package/dist/mcp-agent-tools.js +1216 -0
- package/dist/mcp-agent-tools.js.map +1 -0
- package/dist/mcp-server.d.ts +56 -7
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +255 -762
- package/dist/mcp-server.js.map +1 -1
- package/dist/mcp-tool-deps.d.ts +20 -0
- package/dist/mcp-tool-deps.d.ts.map +1 -0
- package/dist/mcp-tool-deps.js +61 -0
- package/dist/mcp-tool-deps.js.map +1 -0
- package/dist/messagepack.d.ts +7 -0
- package/dist/messagepack.d.ts.map +1 -0
- package/dist/messagepack.js +19 -0
- package/dist/messagepack.js.map +1 -0
- package/dist/model-download-runtime.d.ts +9 -0
- package/dist/model-download-runtime.d.ts.map +1 -0
- package/dist/model-download-runtime.js +77 -0
- package/dist/model-download-runtime.js.map +1 -0
- package/dist/model-execution-availability.d.ts +14 -0
- package/dist/model-execution-availability.d.ts.map +1 -0
- package/dist/model-execution-availability.js +161 -0
- package/dist/model-execution-availability.js.map +1 -0
- package/dist/models-api.d.ts +51 -5
- package/dist/models-api.d.ts.map +1 -1
- package/dist/models-api.js +160 -690
- package/dist/models-api.js.map +1 -1
- package/dist/node-registry-setup.d.ts +84 -0
- package/dist/node-registry-setup.d.ts.map +1 -0
- package/dist/node-registry-setup.js +256 -0
- package/dist/node-registry-setup.js.map +1 -0
- package/dist/oauth/cimd.d.ts +28 -0
- package/dist/oauth/cimd.d.ts.map +1 -0
- package/dist/oauth/cimd.js +177 -0
- package/dist/oauth/cimd.js.map +1 -0
- package/dist/oauth/gate.d.ts +38 -0
- package/dist/oauth/gate.d.ts.map +1 -0
- package/dist/oauth/gate.js +77 -0
- package/dist/oauth/gate.js.map +1 -0
- package/dist/oauth/metadata.d.ts +35 -0
- package/dist/oauth/metadata.d.ts.map +1 -0
- package/dist/oauth/metadata.js +56 -0
- package/dist/oauth/metadata.js.map +1 -0
- package/dist/oauth/pending-store.d.ts +79 -0
- package/dist/oauth/pending-store.d.ts.map +1 -0
- package/dist/oauth/pending-store.js +133 -0
- package/dist/oauth/pending-store.js.map +1 -0
- package/dist/oauth/pkce.d.ts +16 -0
- package/dist/oauth/pkce.d.ts.map +1 -0
- package/dist/oauth/pkce.js +29 -0
- package/dist/oauth/pkce.js.map +1 -0
- package/dist/oauth/validate.d.ts +25 -0
- package/dist/oauth/validate.d.ts.map +1 -0
- package/dist/oauth/validate.js +62 -0
- package/dist/oauth/validate.js.map +1 -0
- package/dist/oauth/www-authenticate.d.ts +9 -0
- package/dist/oauth/www-authenticate.d.ts.map +1 -0
- package/dist/oauth/www-authenticate.js +33 -0
- package/dist/oauth/www-authenticate.js.map +1 -0
- package/dist/oauth-api.d.ts +19 -0
- package/dist/oauth-api.d.ts.map +1 -1
- package/dist/oauth-api.js +531 -12
- package/dist/oauth-api.js.map +1 -1
- package/dist/openai-api.d.ts.map +1 -1
- package/dist/openai-api.js +4 -9
- package/dist/openai-api.js.map +1 -1
- package/dist/pack-snapshot.d.ts +24 -0
- package/dist/pack-snapshot.d.ts.map +1 -0
- package/dist/pack-snapshot.js +35 -0
- package/dist/pack-snapshot.js.map +1 -0
- package/dist/plugins/websocket.d.ts +21 -4
- package/dist/plugins/websocket.d.ts.map +1 -1
- package/dist/plugins/websocket.js +136 -290
- package/dist/plugins/websocket.js.map +1 -1
- package/dist/resolve-media-urls.d.ts +17 -3
- package/dist/resolve-media-urls.d.ts.map +1 -1
- package/dist/resolve-media-urls.js +117 -31
- package/dist/resolve-media-urls.js.map +1 -1
- package/dist/resource-events.d.ts +28 -0
- package/dist/resource-events.d.ts.map +1 -0
- package/dist/resource-events.js +20 -0
- package/dist/resource-events.js.map +1 -0
- package/dist/routes/account.d.ts +100 -0
- package/dist/routes/account.d.ts.map +1 -0
- package/dist/routes/account.js +197 -0
- package/dist/routes/account.js.map +1 -0
- package/dist/routes/applications.d.ts +36 -0
- package/dist/routes/applications.d.ts.map +1 -0
- package/dist/routes/applications.js +183 -0
- package/dist/routes/applications.js.map +1 -0
- package/dist/routes/assets.d.ts +3 -3
- package/dist/routes/assets.d.ts.map +1 -1
- package/dist/routes/assets.js +78 -44
- package/dist/routes/assets.js.map +1 -1
- package/dist/routes/atlascloud-webhook.d.ts +93 -0
- package/dist/routes/atlascloud-webhook.d.ts.map +1 -0
- package/dist/routes/atlascloud-webhook.js +369 -0
- package/dist/routes/atlascloud-webhook.js.map +1 -0
- package/dist/routes/collections.d.ts.map +1 -1
- package/dist/routes/config.d.ts +26 -0
- package/dist/routes/config.d.ts.map +1 -0
- package/dist/routes/config.js +64 -0
- package/dist/routes/config.js.map +1 -0
- package/dist/routes/documents.d.ts +27 -0
- package/dist/routes/documents.d.ts.map +1 -0
- package/dist/routes/documents.js +155 -0
- package/dist/routes/documents.js.map +1 -0
- package/dist/routes/fal-credits.d.ts +4 -0
- package/dist/routes/fal-credits.d.ts.map +1 -0
- package/dist/routes/fal-credits.js +101 -0
- package/dist/routes/fal-credits.js.map +1 -0
- package/dist/routes/fal-pricing-estimate.d.ts +4 -0
- package/dist/routes/fal-pricing-estimate.d.ts.map +1 -0
- package/dist/routes/fal-pricing-estimate.js +114 -0
- package/dist/routes/fal-pricing-estimate.js.map +1 -0
- package/dist/routes/fal-pricing.d.ts +4 -0
- package/dist/routes/fal-pricing.d.ts.map +1 -0
- package/dist/routes/fal-pricing.js +93 -0
- package/dist/routes/fal-pricing.js.map +1 -0
- package/dist/routes/fal-webhook.d.ts +102 -0
- package/dist/routes/fal-webhook.d.ts.map +1 -0
- package/dist/routes/fal-webhook.js +379 -0
- package/dist/routes/fal-webhook.js.map +1 -0
- package/dist/routes/files.d.ts.map +1 -1
- package/dist/routes/files.js +4 -3
- package/dist/routes/files.js.map +1 -1
- package/dist/routes/health.d.ts +1 -0
- package/dist/routes/health.d.ts.map +1 -1
- package/dist/routes/health.js +41 -7
- package/dist/routes/health.js.map +1 -1
- package/dist/routes/integrations.d.ts +39 -0
- package/dist/routes/integrations.d.ts.map +1 -0
- package/dist/routes/integrations.js +211 -0
- package/dist/routes/integrations.js.map +1 -0
- package/dist/routes/js-scripts.d.ts +26 -0
- package/dist/routes/js-scripts.d.ts.map +1 -0
- package/dist/routes/js-scripts.js +116 -0
- package/dist/routes/js-scripts.js.map +1 -0
- package/dist/routes/kie-credits.d.ts +4 -0
- package/dist/routes/kie-credits.d.ts.map +1 -0
- package/dist/routes/kie-credits.js +93 -0
- package/dist/routes/kie-credits.js.map +1 -0
- package/dist/routes/kie-pricing.d.ts +4 -0
- package/dist/routes/kie-pricing.d.ts.map +1 -0
- package/dist/routes/kie-pricing.js +45 -0
- package/dist/routes/kie-pricing.js.map +1 -0
- package/dist/routes/kie-webhook.d.ts +4 -0
- package/dist/routes/kie-webhook.d.ts.map +1 -0
- package/dist/routes/kie-webhook.js +70 -0
- package/dist/routes/kie-webhook.js.map +1 -0
- package/dist/routes/nodes.d.ts.map +1 -1
- package/dist/routes/nodes.js +6 -59
- package/dist/routes/nodes.js.map +1 -1
- package/dist/routes/oauth-as.d.ts +30 -0
- package/dist/routes/oauth-as.d.ts.map +1 -0
- package/dist/routes/oauth-as.js +412 -0
- package/dist/routes/oauth-as.js.map +1 -0
- package/dist/routes/oauth.d.ts.map +1 -1
- package/dist/routes/openai.d.ts.map +1 -1
- package/dist/routes/public-apps.d.ts +27 -0
- package/dist/routes/public-apps.d.ts.map +1 -0
- package/dist/routes/public-apps.js +99 -0
- package/dist/routes/public-apps.js.map +1 -0
- package/dist/routes/sandbox-modules.d.ts +17 -0
- package/dist/routes/sandbox-modules.d.ts.map +1 -0
- package/dist/routes/sandbox-modules.js +85 -0
- package/dist/routes/sandbox-modules.js.map +1 -0
- package/dist/routes/sdk-v1.d.ts +24 -0
- package/dist/routes/sdk-v1.d.ts.map +1 -0
- package/dist/routes/sdk-v1.js +320 -0
- package/dist/routes/sdk-v1.js.map +1 -0
- package/dist/routes/storage.d.ts.map +1 -1
- package/dist/routes/storyboards.d.ts +16 -0
- package/dist/routes/storyboards.d.ts.map +1 -0
- package/dist/routes/storyboards.js +97 -0
- package/dist/routes/storyboards.js.map +1 -0
- package/dist/routes/timeline-animations.d.ts +23 -0
- package/dist/routes/timeline-animations.d.ts.map +1 -0
- package/dist/routes/timeline-animations.js +99 -0
- package/dist/routes/timeline-animations.js.map +1 -0
- package/dist/routes/timeline-audio-bake.d.ts +51 -0
- package/dist/routes/timeline-audio-bake.d.ts.map +1 -0
- package/dist/routes/timeline-audio-bake.js +110 -0
- package/dist/routes/timeline-audio-bake.js.map +1 -0
- package/dist/routes/timeline-fonts.d.ts +29 -0
- package/dist/routes/timeline-fonts.d.ts.map +1 -0
- package/dist/routes/timeline-fonts.js +64 -0
- package/dist/routes/timeline-fonts.js.map +1 -0
- package/dist/routes/timeline-isolate-subject.d.ts +55 -0
- package/dist/routes/timeline-isolate-subject.d.ts.map +1 -0
- package/dist/routes/timeline-isolate-subject.js +128 -0
- package/dist/routes/timeline-isolate-subject.js.map +1 -0
- package/dist/routes/timeline-track-object.d.ts +39 -0
- package/dist/routes/timeline-track-object.d.ts.map +1 -0
- package/dist/routes/timeline-track-object.js +97 -0
- package/dist/routes/timeline-track-object.js.map +1 -0
- package/dist/routes/timelines.d.ts +18 -0
- package/dist/routes/timelines.d.ts.map +1 -0
- package/dist/routes/timelines.js +191 -0
- package/dist/routes/timelines.js.map +1 -0
- package/dist/routes/workflows.d.ts +6 -9
- package/dist/routes/workflows.d.ts.map +1 -1
- package/dist/routes/workflows.js +100 -11
- package/dist/routes/workflows.js.map +1 -1
- package/dist/routes/workspace.d.ts.map +1 -1
- package/dist/run-supervisor.d.ts +30 -0
- package/dist/run-supervisor.d.ts.map +1 -0
- package/dist/run-supervisor.js +86 -0
- package/dist/run-supervisor.js.map +1 -0
- package/dist/sandbox-catalog.d.ts +28 -0
- package/dist/sandbox-catalog.d.ts.map +1 -0
- package/dist/sandbox-catalog.js +74 -0
- package/dist/sandbox-catalog.js.map +1 -0
- package/dist/screenshot-projects.d.ts +27 -0
- package/dist/screenshot-projects.d.ts.map +1 -0
- package/dist/screenshot-projects.js +880 -0
- package/dist/screenshot-projects.js.map +1 -0
- package/dist/screenshot-server.js +947 -43
- package/dist/screenshot-server.js.map +1 -1
- package/dist/sdk/sdk-cached-model-inventory.d.ts +21 -0
- package/dist/sdk/sdk-cached-model-inventory.d.ts.map +1 -0
- package/dist/sdk/sdk-cached-model-inventory.js +51 -0
- package/dist/sdk/sdk-cached-model-inventory.js.map +1 -0
- package/dist/sdk/sdk-capabilities-service.d.ts +32 -0
- package/dist/sdk/sdk-capabilities-service.d.ts.map +1 -0
- package/dist/sdk/sdk-capabilities-service.js +47 -0
- package/dist/sdk/sdk-capabilities-service.js.map +1 -0
- package/dist/sdk/sdk-execution-readiness-probe.d.ts +19 -0
- package/dist/sdk/sdk-execution-readiness-probe.d.ts.map +1 -0
- package/dist/sdk/sdk-execution-readiness-probe.js +90 -0
- package/dist/sdk/sdk-execution-readiness-probe.js.map +1 -0
- package/dist/sdk/sdk-execution-target-readiness.d.ts +15 -0
- package/dist/sdk/sdk-execution-target-readiness.d.ts.map +1 -0
- package/dist/sdk/sdk-execution-target-readiness.js +50 -0
- package/dist/sdk/sdk-execution-target-readiness.js.map +1 -0
- package/dist/sdk/sdk-feature-flags.d.ts +18 -0
- package/dist/sdk/sdk-feature-flags.d.ts.map +1 -0
- package/dist/sdk/sdk-feature-flags.js +30 -0
- package/dist/sdk/sdk-feature-flags.js.map +1 -0
- package/dist/sdk/sdk-huggingface-download-state.d.ts +15 -0
- package/dist/sdk/sdk-huggingface-download-state.d.ts.map +1 -0
- package/dist/sdk/sdk-huggingface-download-state.js +25 -0
- package/dist/sdk/sdk-huggingface-download-state.js.map +1 -0
- package/dist/sdk/sdk-live-runner-registry.d.ts +21 -0
- package/dist/sdk/sdk-live-runner-registry.d.ts.map +1 -0
- package/dist/sdk/sdk-live-runner-registry.js +26 -0
- package/dist/sdk/sdk-live-runner-registry.js.map +1 -0
- package/dist/sdk/sdk-model-catalog-service.d.ts +20 -0
- package/dist/sdk/sdk-model-catalog-service.d.ts.map +1 -0
- package/dist/sdk/sdk-model-catalog-service.js +219 -0
- package/dist/sdk/sdk-model-catalog-service.js.map +1 -0
- package/dist/sdk/sdk-model-download-service.d.ts +39 -0
- package/dist/sdk/sdk-model-download-service.d.ts.map +1 -0
- package/dist/sdk/sdk-model-download-service.js +274 -0
- package/dist/sdk/sdk-model-download-service.js.map +1 -0
- package/dist/sdk/sdk-model-requirement-probe.d.ts +30 -0
- package/dist/sdk/sdk-model-requirement-probe.d.ts.map +1 -0
- package/dist/sdk/sdk-model-requirement-probe.js +120 -0
- package/dist/sdk/sdk-model-requirement-probe.js.map +1 -0
- package/dist/sdk/sdk-node-package-requirement-probe.d.ts +20 -0
- package/dist/sdk/sdk-node-package-requirement-probe.d.ts.map +1 -0
- package/dist/sdk/sdk-node-package-requirement-probe.js +44 -0
- package/dist/sdk/sdk-node-package-requirement-probe.js.map +1 -0
- package/dist/sdk/sdk-node-type-inventory-service.d.ts +11 -0
- package/dist/sdk/sdk-node-type-inventory-service.d.ts.map +1 -0
- package/dist/sdk/sdk-node-type-inventory-service.js +36 -0
- package/dist/sdk/sdk-node-type-inventory-service.js.map +1 -0
- package/dist/sdk/sdk-preflight-orchestrator.d.ts +54 -0
- package/dist/sdk/sdk-preflight-orchestrator.d.ts.map +1 -0
- package/dist/sdk/sdk-preflight-orchestrator.js +63 -0
- package/dist/sdk/sdk-preflight-orchestrator.js.map +1 -0
- package/dist/sdk/sdk-preflight-requirement-resolver.d.ts +35 -0
- package/dist/sdk/sdk-preflight-requirement-resolver.d.ts.map +1 -0
- package/dist/sdk/sdk-preflight-requirement-resolver.js +67 -0
- package/dist/sdk/sdk-preflight-requirement-resolver.js.map +1 -0
- package/dist/sdk/sdk-preflight-service.d.ts +61 -0
- package/dist/sdk/sdk-preflight-service.d.ts.map +1 -0
- package/dist/sdk/sdk-preflight-service.js +104 -0
- package/dist/sdk/sdk-preflight-service.js.map +1 -0
- package/dist/sdk/sdk-preflight-workflow-source.d.ts +18 -0
- package/dist/sdk/sdk-preflight-workflow-source.d.ts.map +1 -0
- package/dist/sdk/sdk-preflight-workflow-source.js +42 -0
- package/dist/sdk/sdk-preflight-workflow-source.js.map +1 -0
- package/dist/sdk/sdk-route-policy.d.ts +3 -0
- package/dist/sdk/sdk-route-policy.d.ts.map +1 -0
- package/dist/sdk/sdk-route-policy.js +18 -0
- package/dist/sdk/sdk-route-policy.js.map +1 -0
- package/dist/sdk/sdk-runtime-capabilities-service.d.ts +60 -0
- package/dist/sdk/sdk-runtime-capabilities-service.d.ts.map +1 -0
- package/dist/sdk/sdk-runtime-capabilities-service.js +30 -0
- package/dist/sdk/sdk-runtime-capabilities-service.js.map +1 -0
- package/dist/sdk/sdk-runtime-requirement-probe.d.ts +13 -0
- package/dist/sdk/sdk-runtime-requirement-probe.d.ts.map +1 -0
- package/dist/sdk/sdk-runtime-requirement-probe.js +55 -0
- package/dist/sdk/sdk-runtime-requirement-probe.js.map +1 -0
- package/dist/sdk/sdk-static-preflight-service.d.ts +66 -0
- package/dist/sdk/sdk-static-preflight-service.d.ts.map +1 -0
- package/dist/sdk/sdk-static-preflight-service.js +492 -0
- package/dist/sdk/sdk-static-preflight-service.js.map +1 -0
- package/dist/sdk/sdk-temporary-asset-service.d.ts +18 -0
- package/dist/sdk/sdk-temporary-asset-service.d.ts.map +1 -0
- package/dist/sdk/sdk-temporary-asset-service.js +33 -0
- package/dist/sdk/sdk-temporary-asset-service.js.map +1 -0
- package/dist/sdk/sdk-temporary-asset-upload-http-handler.d.ts +9 -0
- package/dist/sdk/sdk-temporary-asset-upload-http-handler.d.ts.map +1 -0
- package/dist/sdk/sdk-temporary-asset-upload-http-handler.js +65 -0
- package/dist/sdk/sdk-temporary-asset-upload-http-handler.js.map +1 -0
- package/dist/sdk/sdk-v1-handler-map.d.ts +44 -0
- package/dist/sdk/sdk-v1-handler-map.d.ts.map +1 -0
- package/dist/sdk/sdk-v1-handler-map.js +37 -0
- package/dist/sdk/sdk-v1-handler-map.js.map +1 -0
- package/dist/sdk/sdk-v1-service-error.d.ts +21 -0
- package/dist/sdk/sdk-v1-service-error.d.ts.map +1 -0
- package/dist/sdk/sdk-v1-service-error.js +62 -0
- package/dist/sdk/sdk-v1-service-error.js.map +1 -0
- package/dist/sdk/sdk-v1-service.d.ts +74 -0
- package/dist/sdk/sdk-v1-service.d.ts.map +1 -0
- package/dist/sdk/sdk-v1-service.js +219 -0
- package/dist/sdk/sdk-v1-service.js.map +1 -0
- package/dist/sdk/sdk-worker-readiness-adapter.d.ts +22 -0
- package/dist/sdk/sdk-worker-readiness-adapter.d.ts.map +1 -0
- package/dist/sdk/sdk-worker-readiness-adapter.js +29 -0
- package/dist/sdk/sdk-worker-readiness-adapter.js.map +1 -0
- package/dist/server.js +1019 -201
- package/dist/server.js.map +1 -1
- package/dist/session/asset-autosave.d.ts +80 -0
- package/dist/session/asset-autosave.d.ts.map +1 -0
- package/dist/session/asset-autosave.js +456 -0
- package/dist/session/asset-autosave.js.map +1 -0
- package/dist/session/chat-compaction.d.ts +107 -0
- package/dist/session/chat-compaction.d.ts.map +1 -0
- package/dist/session/chat-compaction.js +191 -0
- package/dist/session/chat-compaction.js.map +1 -0
- package/dist/session/chat-history.d.ts +75 -0
- package/dist/session/chat-history.d.ts.map +1 -0
- package/dist/session/chat-history.js +194 -0
- package/dist/session/chat-history.js.map +1 -0
- package/dist/session/chat-prompt.d.ts +45 -0
- package/dist/session/chat-prompt.d.ts.map +1 -0
- package/dist/session/chat-prompt.js +480 -0
- package/dist/session/chat-prompt.js.map +1 -0
- package/dist/session/chat-turn.d.ts +336 -0
- package/dist/session/chat-turn.d.ts.map +1 -0
- package/dist/session/chat-turn.js +3516 -0
- package/dist/session/chat-turn.js.map +1 -0
- package/dist/session/client-session.d.ts +59 -0
- package/dist/session/client-session.d.ts.map +1 -0
- package/dist/session/client-session.js +2 -0
- package/dist/session/client-session.js.map +1 -0
- package/dist/session/commands.d.ts +133 -0
- package/dist/session/commands.d.ts.map +1 -0
- package/dist/session/commands.js +778 -0
- package/dist/session/commands.js.map +1 -0
- package/dist/session/inference.d.ts +213 -0
- package/dist/session/inference.d.ts.map +1 -0
- package/dist/session/inference.js +1072 -0
- package/dist/session/inference.js.map +1 -0
- package/dist/session/job-execution.d.ts +477 -0
- package/dist/session/job-execution.d.ts.map +1 -0
- package/dist/session/job-execution.js +2089 -0
- package/dist/session/job-execution.js.map +1 -0
- package/dist/session/media-generation.d.ts +94 -0
- package/dist/session/media-generation.d.ts.map +1 -0
- package/dist/session/media-generation.js +234 -0
- package/dist/session/media-generation.js.map +1 -0
- package/dist/session/model-interfaces.d.ts +27 -0
- package/dist/session/model-interfaces.d.ts.map +1 -0
- package/dist/session/model-interfaces.js +132 -0
- package/dist/session/model-interfaces.js.map +1 -0
- package/dist/session/sanitize.d.ts +7 -0
- package/dist/session/sanitize.d.ts.map +1 -0
- package/dist/session/sanitize.js +64 -0
- package/dist/session/sanitize.js.map +1 -0
- package/dist/settings-registry.d.ts +6 -15
- package/dist/settings-registry.d.ts.map +1 -1
- package/dist/settings-registry.js +6 -103
- package/dist/settings-registry.js.map +1 -1
- package/dist/storage-api.d.ts +20 -0
- package/dist/storage-api.d.ts.map +1 -1
- package/dist/storage-api.js +260 -77
- package/dist/storage-api.js.map +1 -1
- package/dist/storage-retention.d.ts +9 -0
- package/dist/storage-retention.d.ts.map +1 -0
- package/dist/storage-retention.js +74 -0
- package/dist/storage-retention.js.map +1 -0
- package/dist/system-stats.d.ts +52 -0
- package/dist/system-stats.d.ts.map +1 -0
- package/dist/system-stats.js +134 -0
- package/dist/system-stats.js.map +1 -0
- package/dist/test-ui-server.d.ts +46 -0
- package/dist/test-ui-server.d.ts.map +1 -1
- package/dist/test-ui-server.js +188 -41
- package/dist/test-ui-server.js.map +1 -1
- package/dist/triggers/boot.d.ts +73 -0
- package/dist/triggers/boot.d.ts.map +1 -0
- package/dist/triggers/boot.js +149 -0
- package/dist/triggers/boot.js.map +1 -0
- package/dist/triggers/dispatcher.d.ts +234 -0
- package/dist/triggers/dispatcher.d.ts.map +1 -0
- package/dist/triggers/dispatcher.js +525 -0
- package/dist/triggers/dispatcher.js.map +1 -0
- package/dist/triggers/file-watch.d.ts +90 -0
- package/dist/triggers/file-watch.d.ts.map +1 -0
- package/dist/triggers/file-watch.js +405 -0
- package/dist/triggers/file-watch.js.map +1 -0
- package/dist/triggers/registration-sync.d.ts +34 -0
- package/dist/triggers/registration-sync.d.ts.map +1 -0
- package/dist/triggers/registration-sync.js +162 -0
- package/dist/triggers/registration-sync.js.map +1 -0
- package/dist/triggers/schedule-timing.d.ts +52 -0
- package/dist/triggers/schedule-timing.d.ts.map +1 -0
- package/dist/triggers/schedule-timing.js +90 -0
- package/dist/triggers/schedule-timing.js.map +1 -0
- package/dist/triggers/scheduler.d.ts +55 -0
- package/dist/triggers/scheduler.d.ts.map +1 -0
- package/dist/triggers/scheduler.js +122 -0
- package/dist/triggers/scheduler.js.map +1 -0
- package/dist/triggers/settle.d.ts +66 -0
- package/dist/triggers/settle.d.ts.map +1 -0
- package/dist/triggers/settle.js +99 -0
- package/dist/triggers/settle.js.map +1 -0
- package/dist/triggers/stores.d.ts +38 -0
- package/dist/triggers/stores.d.ts.map +1 -0
- package/dist/triggers/stores.js +168 -0
- package/dist/triggers/stores.js.map +1 -0
- package/dist/triggers/webhook-route.d.ts +49 -0
- package/dist/triggers/webhook-route.d.ts.map +1 -0
- package/dist/triggers/webhook-route.js +148 -0
- package/dist/triggers/webhook-route.js.map +1 -0
- package/dist/trpc/context.d.ts +52 -5
- package/dist/trpc/context.d.ts.map +1 -1
- package/dist/trpc/context.js +4 -1
- package/dist/trpc/context.js.map +1 -1
- package/dist/trpc/error-formatter.d.ts.map +1 -1
- package/dist/trpc/error-formatter.js +23 -2
- package/dist/trpc/error-formatter.js.map +1 -1
- package/dist/trpc/error-logging.d.ts +14 -0
- package/dist/trpc/error-logging.d.ts.map +1 -0
- package/dist/trpc/error-logging.js +27 -0
- package/dist/trpc/error-logging.js.map +1 -0
- package/dist/trpc/index.d.ts +2 -2
- package/dist/trpc/index.d.ts.map +1 -1
- package/dist/trpc/index.js +0 -2
- package/dist/trpc/index.js.map +1 -1
- package/dist/trpc/middleware.d.ts +6 -3
- package/dist/trpc/middleware.d.ts.map +1 -1
- package/dist/trpc/router.d.ts +29791 -1303
- package/dist/trpc/router.d.ts.map +1 -1
- package/dist/trpc/router.js +46 -3
- package/dist/trpc/router.js.map +1 -1
- package/dist/trpc/routers/agent-access.d.ts +149 -0
- package/dist/trpc/routers/agent-access.d.ts.map +1 -0
- package/dist/trpc/routers/agent-access.js +224 -0
- package/dist/trpc/routers/agent-access.js.map +1 -0
- package/dist/trpc/routers/applications.d.ts +1117 -0
- package/dist/trpc/routers/applications.d.ts.map +1 -0
- package/dist/trpc/routers/applications.js +218 -0
- package/dist/trpc/routers/applications.js.map +1 -0
- package/dist/trpc/routers/assets.d.ts +184 -42
- package/dist/trpc/routers/assets.d.ts.map +1 -1
- package/dist/trpc/routers/assets.js +499 -105
- package/dist/trpc/routers/assets.js.map +1 -1
- package/dist/trpc/routers/code-gen.d.ts +99 -0
- package/dist/trpc/routers/code-gen.d.ts.map +1 -0
- package/dist/trpc/routers/code-gen.js +164 -0
- package/dist/trpc/routers/code-gen.js.map +1 -0
- package/dist/trpc/routers/collections.d.ts +1 -26
- package/dist/trpc/routers/collections.d.ts.map +1 -1
- package/dist/trpc/routers/collections.js +145 -78
- package/dist/trpc/routers/collections.js.map +1 -1
- package/dist/trpc/routers/costs.d.ts +40 -96
- package/dist/trpc/routers/costs.d.ts.map +1 -1
- package/dist/trpc/routers/costs.js +14 -89
- package/dist/trpc/routers/costs.js.map +1 -1
- package/dist/trpc/routers/credits.d.ts +110 -0
- package/dist/trpc/routers/credits.d.ts.map +1 -0
- package/dist/trpc/routers/credits.js +69 -0
- package/dist/trpc/routers/credits.js.map +1 -0
- package/dist/trpc/routers/custom-providers.d.ts +88 -0
- package/dist/trpc/routers/custom-providers.d.ts.map +1 -0
- package/dist/trpc/routers/custom-providers.js +140 -0
- package/dist/trpc/routers/custom-providers.js.map +1 -0
- package/dist/trpc/routers/documents.d.ts +61 -0
- package/dist/trpc/routers/documents.d.ts.map +1 -0
- package/dist/trpc/routers/documents.js +23 -0
- package/dist/trpc/routers/documents.js.map +1 -0
- package/dist/trpc/routers/extension.d.ts +24 -0
- package/dist/trpc/routers/extension.d.ts.map +1 -0
- package/dist/trpc/routers/extension.js +28 -0
- package/dist/trpc/routers/extension.js.map +1 -0
- package/dist/trpc/routers/external-mcp.d.ts +108 -0
- package/dist/trpc/routers/external-mcp.d.ts.map +1 -0
- package/dist/trpc/routers/external-mcp.js +70 -0
- package/dist/trpc/routers/external-mcp.js.map +1 -0
- package/dist/trpc/routers/files.d.ts +9 -2
- package/dist/trpc/routers/files.d.ts.map +1 -1
- package/dist/trpc/routers/files.js +67 -37
- package/dist/trpc/routers/files.js.map +1 -1
- package/dist/trpc/routers/fonts.d.ts +30 -0
- package/dist/trpc/routers/fonts.d.ts.map +1 -0
- package/dist/trpc/routers/fonts.js +112 -0
- package/dist/trpc/routers/fonts.js.map +1 -0
- package/dist/trpc/routers/games.d.ts +7610 -0
- package/dist/trpc/routers/games.d.ts.map +1 -0
- package/dist/trpc/routers/games.js +456 -0
- package/dist/trpc/routers/games.js.map +1 -0
- package/dist/trpc/routers/integrations.d.ts +86 -0
- package/dist/trpc/routers/integrations.d.ts.map +1 -0
- package/dist/trpc/routers/integrations.js +129 -0
- package/dist/trpc/routers/integrations.js.map +1 -0
- package/dist/trpc/routers/jobs.d.ts +88 -27
- package/dist/trpc/routers/jobs.d.ts.map +1 -1
- package/dist/trpc/routers/jobs.js +113 -35
- package/dist/trpc/routers/jobs.js.map +1 -1
- package/dist/trpc/routers/js-scripts.d.ts +410 -0
- package/dist/trpc/routers/js-scripts.d.ts.map +1 -0
- package/dist/trpc/routers/js-scripts.js +303 -0
- package/dist/trpc/routers/js-scripts.js.map +1 -0
- package/dist/trpc/routers/mcp-config.d.ts +1 -1
- package/dist/trpc/routers/mcp-config.js +5 -3
- package/dist/trpc/routers/mcp-config.js.map +1 -1
- package/dist/trpc/routers/memories.d.ts +79 -0
- package/dist/trpc/routers/memories.d.ts.map +1 -0
- package/dist/trpc/routers/memories.js +66 -0
- package/dist/trpc/routers/memories.js.map +1 -0
- package/dist/trpc/routers/messages.d.ts +4 -77
- package/dist/trpc/routers/messages.d.ts.map +1 -1
- package/dist/trpc/routers/messages.js +9 -58
- package/dist/trpc/routers/messages.js.map +1 -1
- package/dist/trpc/routers/models.d.ts +1403 -238
- package/dist/trpc/routers/models.d.ts.map +1 -1
- package/dist/trpc/routers/models.js +532 -294
- package/dist/trpc/routers/models.js.map +1 -1
- package/dist/trpc/routers/nodes.d.ts +32 -16
- package/dist/trpc/routers/nodes.d.ts.map +1 -1
- package/dist/trpc/routers/nodes.js +70 -31
- package/dist/trpc/routers/nodes.js.map +1 -1
- package/dist/trpc/routers/packs.d.ts +184 -0
- package/dist/trpc/routers/packs.d.ts.map +1 -0
- package/dist/trpc/routers/packs.js +259 -0
- package/dist/trpc/routers/packs.js.map +1 -0
- package/dist/trpc/routers/projects.d.ts +422 -0
- package/dist/trpc/routers/projects.d.ts.map +1 -0
- package/dist/trpc/routers/projects.js +373 -0
- package/dist/trpc/routers/projects.js.map +1 -0
- package/dist/trpc/routers/resources.d.ts +120 -0
- package/dist/trpc/routers/resources.d.ts.map +1 -0
- package/dist/trpc/routers/resources.js +212 -0
- package/dist/trpc/routers/resources.js.map +1 -0
- package/dist/trpc/routers/scripts.d.ts +1116 -0
- package/dist/trpc/routers/scripts.d.ts.map +1 -0
- package/dist/trpc/routers/scripts.js +131 -0
- package/dist/trpc/routers/scripts.js.map +1 -0
- package/dist/trpc/routers/segmentation.d.ts +62 -0
- package/dist/trpc/routers/segmentation.d.ts.map +1 -0
- package/dist/trpc/routers/segmentation.js +146 -0
- package/dist/trpc/routers/segmentation.js.map +1 -0
- package/dist/trpc/routers/settings.d.ts +177 -10
- package/dist/trpc/routers/settings.d.ts.map +1 -1
- package/dist/trpc/routers/settings.js +123 -33
- package/dist/trpc/routers/settings.js.map +1 -1
- package/dist/trpc/routers/sketch.d.ts +854 -0
- package/dist/trpc/routers/sketch.d.ts.map +1 -0
- package/dist/trpc/routers/sketch.js +617 -0
- package/dist/trpc/routers/sketch.js.map +1 -0
- package/dist/trpc/routers/skills.d.ts +76 -22
- package/dist/trpc/routers/skills.d.ts.map +1 -1
- package/dist/trpc/routers/skills.js +195 -170
- package/dist/trpc/routers/skills.js.map +1 -1
- package/dist/trpc/routers/storage.d.ts +3 -30
- package/dist/trpc/routers/storage.d.ts.map +1 -1
- package/dist/trpc/routers/storage.js +60 -117
- package/dist/trpc/routers/storage.js.map +1 -1
- package/dist/trpc/routers/storyboards.d.ts +5907 -0
- package/dist/trpc/routers/storyboards.d.ts.map +1 -0
- package/dist/trpc/routers/storyboards.js +156 -0
- package/dist/trpc/routers/storyboards.js.map +1 -0
- package/dist/trpc/routers/threads.d.ts +33 -21
- package/dist/trpc/routers/threads.d.ts.map +1 -1
- package/dist/trpc/routers/threads.js +36 -30
- package/dist/trpc/routers/threads.js.map +1 -1
- package/dist/trpc/routers/timeline.d.ts +8516 -0
- package/dist/trpc/routers/timeline.d.ts.map +1 -0
- package/dist/trpc/routers/timeline.js +493 -0
- package/dist/trpc/routers/timeline.js.map +1 -0
- package/dist/trpc/routers/triggers.d.ts +46 -0
- package/dist/trpc/routers/triggers.d.ts.map +1 -0
- package/dist/trpc/routers/triggers.js +117 -0
- package/dist/trpc/routers/triggers.js.map +1 -0
- package/dist/trpc/routers/users.d.ts +1 -14
- package/dist/trpc/routers/users.d.ts.map +1 -1
- package/dist/trpc/routers/users.js +1 -12
- package/dist/trpc/routers/users.js.map +1 -1
- package/dist/trpc/routers/worker.d.ts +242 -0
- package/dist/trpc/routers/worker.d.ts.map +1 -0
- package/dist/trpc/routers/worker.js +220 -0
- package/dist/trpc/routers/worker.js.map +1 -0
- package/dist/trpc/routers/workflows.d.ts +385 -197
- package/dist/trpc/routers/workflows.d.ts.map +1 -1
- package/dist/trpc/routers/workflows.js +326 -345
- package/dist/trpc/routers/workflows.js.map +1 -1
- package/dist/trpc/routers/workspace.d.ts +59 -33
- package/dist/trpc/routers/workspace.d.ts.map +1 -1
- package/dist/trpc/routers/workspace.js +230 -93
- package/dist/trpc/routers/workspace.js.map +1 -1
- package/dist/trpc/sandbox-coverage.d.ts +64 -0
- package/dist/trpc/sandbox-coverage.d.ts.map +1 -0
- package/dist/trpc/sandbox-coverage.js +1049 -0
- package/dist/trpc/sandbox-coverage.js.map +1 -0
- package/dist/websocket-client-session.d.ts +320 -0
- package/dist/websocket-client-session.d.ts.map +1 -0
- package/dist/websocket-client-session.js +1253 -0
- package/dist/websocket-client-session.js.map +1 -0
- package/dist/workflow-interface-service.d.ts +87 -0
- package/dist/workflow-interface-service.d.ts.map +1 -0
- package/dist/workflow-interface-service.js +131 -0
- package/dist/workflow-interface-service.js.map +1 -0
- package/dist/workspace-api.d.ts.map +1 -1
- package/dist/workspace-api.js +33 -23
- package/dist/workspace-api.js.map +1 -1
- package/dist/ws-adapter.d.ts +46 -3
- package/dist/ws-adapter.d.ts.map +1 -1
- package/dist/ws-adapter.js +164 -26
- package/dist/ws-adapter.js.map +1 -1
- package/package.json +81 -35
- package/dist/agent/agent-runtime.d.ts +0 -47
- package/dist/agent/agent-runtime.d.ts.map +0 -1
- package/dist/agent/agent-runtime.js +0 -579
- package/dist/agent/agent-runtime.js.map +0 -1
- package/dist/agent/codex-agent.d.ts +0 -41
- package/dist/agent/codex-agent.d.ts.map +0 -1
- package/dist/agent/codex-agent.js +0 -334
- package/dist/agent/codex-agent.js.map +0 -1
- package/dist/agent/index.d.ts +0 -6
- package/dist/agent/index.d.ts.map +0 -1
- package/dist/agent/index.js +0 -4
- package/dist/agent/index.js.map +0 -1
- package/dist/agent/llm-agent.d.ts +0 -51
- package/dist/agent/llm-agent.d.ts.map +0 -1
- package/dist/agent/llm-agent.js +0 -526
- package/dist/agent/llm-agent.js.map +0 -1
- package/dist/agent/mcp-tool-server.d.ts +0 -33
- package/dist/agent/mcp-tool-server.d.ts.map +0 -1
- package/dist/agent/mcp-tool-server.js +0 -292
- package/dist/agent/mcp-tool-server.js.map +0 -1
- package/dist/agent/opencode-agent.d.ts +0 -32
- package/dist/agent/opencode-agent.d.ts.map +0 -1
- package/dist/agent/opencode-agent.js +0 -332
- package/dist/agent/opencode-agent.js.map +0 -1
- package/dist/agent/pi-agent.d.ts +0 -42
- package/dist/agent/pi-agent.d.ts.map +0 -1
- package/dist/agent/pi-agent.js +0 -429
- package/dist/agent/pi-agent.js.map +0 -1
- package/dist/agent/sdk-provider.d.ts +0 -46
- package/dist/agent/sdk-provider.d.ts.map +0 -1
- package/dist/agent/sdk-provider.js +0 -50
- package/dist/agent/sdk-provider.js.map +0 -1
- package/dist/agent/socket-route.d.ts +0 -11
- package/dist/agent/socket-route.d.ts.map +0 -1
- package/dist/agent/socket-route.js +0 -262
- package/dist/agent/socket-route.js.map +0 -1
- package/dist/agent/transport.d.ts +0 -39
- package/dist/agent/transport.d.ts.map +0 -1
- package/dist/agent/transport.js +0 -17
- package/dist/agent/transport.js.map +0 -1
- package/dist/agent/types.d.ts +0 -11
- package/dist/agent/types.d.ts.map +0 -1
- package/dist/agent/types.js +0 -10
- package/dist/agent/types.js.map +0 -1
- package/dist/routes/jobs.d.ts +0 -16
- package/dist/routes/jobs.d.ts.map +0 -1
- package/dist/routes/jobs.js +0 -25
- package/dist/routes/jobs.js.map +0 -1
- package/dist/trpc/routers/sandboxes.d.ts +0 -64
- package/dist/trpc/routers/sandboxes.d.ts.map +0 -1
- package/dist/trpc/routers/sandboxes.js +0 -327
- package/dist/trpc/routers/sandboxes.js.map +0 -1
- package/dist/unified-websocket-runner.d.ts +0 -280
- package/dist/unified-websocket-runner.d.ts.map +0 -1
- package/dist/unified-websocket-runner.js +0 -3840
- package/dist/unified-websocket-runner.js.map +0 -1
|
@@ -3,16 +3,14 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Retained on REST (file downloads):
|
|
5
5
|
* - GET /api/workflows/:id/dsl-export (text/plain file download)
|
|
6
|
-
* - POST /api/workflows/:id/gradio-export (501 stub, kept for API compat)
|
|
7
6
|
*
|
|
8
7
|
* Everything else is served via tRPC:
|
|
9
|
-
* - list,
|
|
10
|
-
* -
|
|
11
|
-
* -
|
|
8
|
+
* - list, get, create, update, delete
|
|
9
|
+
* - autosave
|
|
10
|
+
* - examples (list + search)
|
|
11
|
+
* - recipes (shipped chains of examples)
|
|
12
12
|
* - public (list + get) — publicProcedure (no auth required)
|
|
13
|
-
* -
|
|
14
|
-
* - generateName
|
|
15
|
-
* - versions (list, create, get, restore, delete)
|
|
13
|
+
* - versions (list, create, restore, delete)
|
|
16
14
|
*
|
|
17
15
|
* Auth note:
|
|
18
16
|
* - `public.*` endpoints use publicProcedure — no auth required, matches
|
|
@@ -21,17 +19,58 @@
|
|
|
21
19
|
*/
|
|
22
20
|
import { existsSync, readFileSync, readdirSync } from "node:fs";
|
|
23
21
|
import nodePath from "node:path";
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
22
|
+
import { z } from "zod";
|
|
23
|
+
import { withCacheBuster } from "../../lib/example-thumbnail.js";
|
|
24
|
+
import { Workflow, WorkflowVersion, WorkflowCollaborator, WorkflowShare } from "@nodetool-ai/models";
|
|
27
25
|
import { loadPythonPackageMetadata } from "@nodetool-ai/node-sdk";
|
|
28
26
|
import { createLogger } from "@nodetool-ai/config";
|
|
27
|
+
import { deriveExampleAssetsDir } from "../../example-workflows.js";
|
|
28
|
+
import { exampleRecipeSummary } from "@nodetool-ai/protocol/api-schemas/recipes.js";
|
|
29
|
+
import { listExampleRecipes } from "../../lib/example-recipes.js";
|
|
29
30
|
import { ApiErrorCode } from "../../error-codes.js";
|
|
30
31
|
import { router, publicProcedure } from "../index.js";
|
|
31
32
|
import { protectedProcedure } from "../middleware.js";
|
|
32
33
|
import { throwApiError } from "../error-formatter.js";
|
|
33
|
-
import {
|
|
34
|
+
import { createWorkflow, deleteWorkflow, syncTriggerRegistrations, updateWorkflow, WorkflowServiceError } from "../../lib/workflow-service.js";
|
|
35
|
+
import { listInput, listOutput, getInput, createInput, updateInput, deleteInput, deleteOutput, autosaveInput, autosaveOutput, examplesInput, examplesOutput, publicListInput, publicListOutput, publicGetInput, versionsListInput, versionsListOutput, versionCreateInput, versionResponse, versionRestoreInput, versionDeleteInput, versionDeleteOutput, terminalOutputsInput, terminalOutputsOutput, workflowResponse, graph as graphSchema, sharingGetInput, sharingGetOutput, sharingCreateLinkInput, sharingRevokeLinkInput, sharingSetRoleInput, sharingRemoveCollaboratorInput, sharingOkOutput, sharingAcceptInput, sharingAcceptOutput, shareItem, collaboratorItem, sharedWithMeInput, sharedWithMeOutput } from "@nodetool-ai/protocol/api-schemas/workflows.js";
|
|
36
|
+
import { isString } from "../../lib/wire-values.js";
|
|
37
|
+
import { getStorageRetentionSettings } from "../../storage-retention.js";
|
|
34
38
|
const log = createLogger("nodetool.websocket.trpc.workflows");
|
|
39
|
+
/** Map a `workflow-service` failure onto this router's tRPC error shape. */
|
|
40
|
+
async function runWorkflowService(run) {
|
|
41
|
+
try {
|
|
42
|
+
return await run();
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
if (error instanceof WorkflowServiceError) {
|
|
46
|
+
throwApiError(error.code, error.message);
|
|
47
|
+
}
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async function resolveWorkflowRole(workflow, userId) {
|
|
52
|
+
if (workflow.user_id === userId)
|
|
53
|
+
return "owner";
|
|
54
|
+
const grant = await WorkflowCollaborator.findFor(workflow.id, userId);
|
|
55
|
+
if (grant)
|
|
56
|
+
return grant.role;
|
|
57
|
+
if (workflow.access === "public")
|
|
58
|
+
return "viewer";
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
/** Load a workflow and require at least `minimum` access, else 404. */
|
|
62
|
+
async function requireWorkflowRole(workflowId, userId, minimum) {
|
|
63
|
+
const workflow = (await Workflow.get(workflowId));
|
|
64
|
+
if (!workflow) {
|
|
65
|
+
throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
|
|
66
|
+
}
|
|
67
|
+
const role = await resolveWorkflowRole(workflow, userId);
|
|
68
|
+
const rank = { viewer: 1, editor: 2, owner: 3 };
|
|
69
|
+
if (!role || rank[role] < rank[minimum]) {
|
|
70
|
+
throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
|
|
71
|
+
}
|
|
72
|
+
return { workflow, role };
|
|
73
|
+
}
|
|
35
74
|
/**
|
|
36
75
|
* Validate a workflow graph against the wire schema. Returns the graph if it
|
|
37
76
|
* passes, or null if invalid — so list endpoints can still return the rest of
|
|
@@ -57,9 +96,43 @@ function safeGraph(workflowId, raw) {
|
|
|
57
96
|
log.warn(`Workflow ${workflowId} has an invalid graph; returning null: ${summarizeGraphIssues(parsed.error.issues)}`);
|
|
58
97
|
return null;
|
|
59
98
|
}
|
|
99
|
+
const OUTPUT_NODE_MEDIA_TYPES = {
|
|
100
|
+
"nodetool.output.ImageOutput": "image",
|
|
101
|
+
"nodetool.output.VideoOutput": "video",
|
|
102
|
+
"nodetool.output.AudioOutput": "audio"
|
|
103
|
+
};
|
|
104
|
+
function findTerminalMediaOutputNodes(workflow) {
|
|
105
|
+
const graph = safeGraph(workflow.id, workflow.graph);
|
|
106
|
+
const nodes = (graph?.nodes ?? []);
|
|
107
|
+
const edges = (graph?.edges ?? []);
|
|
108
|
+
const terminalOutputNodeIds = new Set(nodes
|
|
109
|
+
.filter((n) => Object.hasOwn(OUTPUT_NODE_MEDIA_TYPES, n.type))
|
|
110
|
+
.map((n) => n.id));
|
|
111
|
+
for (const edge of edges) {
|
|
112
|
+
const sourceId = edge.source;
|
|
113
|
+
if (sourceId && terminalOutputNodeIds.has(sourceId)) {
|
|
114
|
+
terminalOutputNodeIds.delete(sourceId);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return nodes.filter((n) => terminalOutputNodeIds.has(n.id));
|
|
118
|
+
}
|
|
119
|
+
function hasTerminalMediaOutput(workflow) {
|
|
120
|
+
return findTerminalMediaOutputNodes(workflow).length > 0;
|
|
121
|
+
}
|
|
60
122
|
// ── Rate-limit tracking for autosave ───────────────────────────────────────
|
|
61
123
|
const lastAutosaveTime = new Map();
|
|
62
124
|
const AUTOSAVE_RATE_LIMIT_MS = 30_000;
|
|
125
|
+
// Entries older than the rate-limit window can never rate-limit again, so drop
|
|
126
|
+
// them. Without this the map grows one permanent entry per workflow ever
|
|
127
|
+
// autosaved (including deleted ones) for the lifetime of the process.
|
|
128
|
+
function recordAutosave(workflowId, now) {
|
|
129
|
+
for (const [id, ts] of lastAutosaveTime) {
|
|
130
|
+
if (now - ts >= AUTOSAVE_RATE_LIMIT_MS) {
|
|
131
|
+
lastAutosaveTime.delete(id);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
lastAutosaveTime.set(workflowId, now);
|
|
135
|
+
}
|
|
63
136
|
// ── toWorkflowResponse ─────────────────────────────────────────────────────
|
|
64
137
|
function toWorkflowResponse(workflow) {
|
|
65
138
|
return {
|
|
@@ -81,9 +154,11 @@ function toWorkflowResponse(workflow) {
|
|
|
81
154
|
path: workflow.path ?? null,
|
|
82
155
|
run_mode: workflow.run_mode ?? null,
|
|
83
156
|
workspace_id: workflow.workspace_id ?? null,
|
|
157
|
+
project_id: workflow.project_id,
|
|
84
158
|
required_providers: null,
|
|
85
159
|
required_models: null,
|
|
86
160
|
html_app: workflow.html_app ?? null,
|
|
161
|
+
app_doc: workflow.app_doc ?? null,
|
|
87
162
|
etag: workflow.getEtag() ?? null
|
|
88
163
|
};
|
|
89
164
|
}
|
|
@@ -102,15 +177,31 @@ function toVersionResponse(v) {
|
|
|
102
177
|
created_at: v.created_at ?? null
|
|
103
178
|
};
|
|
104
179
|
}
|
|
180
|
+
function toCollaboratorItem(grant) {
|
|
181
|
+
return {
|
|
182
|
+
workflow_id: grant.workflow_id,
|
|
183
|
+
user_id: grant.user_id,
|
|
184
|
+
role: grant.role,
|
|
185
|
+
invited_by: grant.invited_by,
|
|
186
|
+
created_at: grant.created_at ?? null
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
function toShareItem(share) {
|
|
190
|
+
return {
|
|
191
|
+
id: share.id,
|
|
192
|
+
workflow_id: share.workflow_id,
|
|
193
|
+
token: share.token,
|
|
194
|
+
role: share.role,
|
|
195
|
+
created_at: share.created_at ?? null,
|
|
196
|
+
revoked_at: share.revoked_at ?? null
|
|
197
|
+
};
|
|
198
|
+
}
|
|
105
199
|
// ── Example workflow helpers ────────────────────────────────────────────────
|
|
106
200
|
const EXAMPLES_THUMBNAILS_PREFIX = "/api/workflows/examples/thumbnails/";
|
|
107
|
-
function
|
|
108
|
-
return nodePath.join(nodePath.dirname(nodePath.dirname(examplesDir)), "assets", nodePath.basename(examplesDir));
|
|
109
|
-
}
|
|
110
|
-
function buildExamplesFromDir(examplesDir) {
|
|
201
|
+
function buildExamplesFromDir(examplesDir, examplesAssetsFallbackDir) {
|
|
111
202
|
if (!existsSync(examplesDir))
|
|
112
203
|
return [];
|
|
113
|
-
const assetsDir =
|
|
204
|
+
const assetsDir = deriveExampleAssetsDir(examplesDir, examplesAssetsFallbackDir);
|
|
114
205
|
const now = new Date().toISOString();
|
|
115
206
|
const workflows = [];
|
|
116
207
|
let files;
|
|
@@ -126,12 +217,15 @@ function buildExamplesFromDir(examplesDir) {
|
|
|
126
217
|
try {
|
|
127
218
|
const raw = readFileSync(nodePath.join(examplesDir, file), "utf8");
|
|
128
219
|
const parsed = JSON.parse(raw);
|
|
129
|
-
const name =
|
|
220
|
+
const name = isString(parsed.name)
|
|
130
221
|
? parsed.name
|
|
131
222
|
: file.replace(/\.json$/i, "");
|
|
223
|
+
// Append ?v=<md5-8> via withCacheBuster so the browser invalidates
|
|
224
|
+
// its cached thumbnail whenever the JPG is regenerated on disk.
|
|
132
225
|
const jpgFile = `${name}.jpg`;
|
|
133
|
-
const
|
|
134
|
-
|
|
226
|
+
const jpgPath = nodePath.join(assetsDir, jpgFile);
|
|
227
|
+
const thumbnailUrl = existsSync(jpgPath)
|
|
228
|
+
? withCacheBuster(`${EXAMPLES_THUMBNAILS_PREFIX}${encodeURIComponent(jpgFile)}`, jpgPath)
|
|
135
229
|
: null;
|
|
136
230
|
workflows.push({
|
|
137
231
|
id: file,
|
|
@@ -140,9 +234,9 @@ function buildExamplesFromDir(examplesDir) {
|
|
|
140
234
|
updated_at: now,
|
|
141
235
|
name,
|
|
142
236
|
tool_name: null,
|
|
143
|
-
description:
|
|
237
|
+
description: isString(parsed.description) ? parsed.description : "",
|
|
144
238
|
tags: Array.isArray(parsed.tags)
|
|
145
|
-
? parsed.tags.filter((t) =>
|
|
239
|
+
? parsed.tags.filter((t) => isString(t))
|
|
146
240
|
: [],
|
|
147
241
|
thumbnail: thumbnailUrl ? jpgFile : null,
|
|
148
242
|
thumbnail_url: thumbnailUrl,
|
|
@@ -150,13 +244,16 @@ function buildExamplesFromDir(examplesDir) {
|
|
|
150
244
|
input_schema: null,
|
|
151
245
|
output_schema: null,
|
|
152
246
|
settings: null,
|
|
153
|
-
package_name:
|
|
247
|
+
package_name: isString(parsed.package_name)
|
|
248
|
+
? parsed.package_name
|
|
249
|
+
: null,
|
|
154
250
|
path: null,
|
|
155
251
|
run_mode: null,
|
|
156
252
|
workspace_id: null,
|
|
157
253
|
required_providers: null,
|
|
158
254
|
required_models: null,
|
|
159
255
|
html_app: null,
|
|
256
|
+
app_doc: null,
|
|
160
257
|
etag: null
|
|
161
258
|
});
|
|
162
259
|
}
|
|
@@ -168,7 +265,7 @@ function buildExamplesFromDir(examplesDir) {
|
|
|
168
265
|
}
|
|
169
266
|
function buildExampleWorkflows(apiOptions) {
|
|
170
267
|
if (apiOptions.examplesDir) {
|
|
171
|
-
return buildExamplesFromDir(apiOptions.examplesDir);
|
|
268
|
+
return buildExamplesFromDir(apiOptions.examplesDir, apiOptions.examplesAssetsFallbackDir);
|
|
172
269
|
}
|
|
173
270
|
const loaded = loadPythonPackageMetadata({
|
|
174
271
|
roots: apiOptions.metadataRoots,
|
|
@@ -203,54 +300,13 @@ function buildExampleWorkflows(apiOptions) {
|
|
|
203
300
|
required_providers: null,
|
|
204
301
|
required_models: null,
|
|
205
302
|
html_app: null,
|
|
303
|
+
app_doc: null,
|
|
206
304
|
etag: null
|
|
207
305
|
});
|
|
208
306
|
}
|
|
209
307
|
}
|
|
210
308
|
return workflows;
|
|
211
309
|
}
|
|
212
|
-
function loadExampleGraph(packageName, exampleName, apiOptions) {
|
|
213
|
-
const loaded = loadPythonPackageMetadata({
|
|
214
|
-
roots: apiOptions.metadataRoots,
|
|
215
|
-
maxDepth: apiOptions.metadataMaxDepth
|
|
216
|
-
});
|
|
217
|
-
const pkg = loaded.packages.find((p) => p.name === packageName);
|
|
218
|
-
if (!pkg?.sourceFolder)
|
|
219
|
-
return null;
|
|
220
|
-
const examplePath = nodePath.join(pkg.sourceFolder, "nodetool", "examples", packageName, `${exampleName}.json`);
|
|
221
|
-
try {
|
|
222
|
-
const raw = readFileSync(examplePath, "utf8");
|
|
223
|
-
return JSON.parse(raw);
|
|
224
|
-
}
|
|
225
|
-
catch {
|
|
226
|
-
return null;
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
// ── deriveWorkflowName ─────────────────────────────────────────────────────
|
|
230
|
-
function deriveWorkflowName(workflow) {
|
|
231
|
-
const graph = workflow.graph;
|
|
232
|
-
const nodes = graph?.nodes ?? [];
|
|
233
|
-
if (nodes.length === 0) {
|
|
234
|
-
return workflow.name || "Untitled Workflow";
|
|
235
|
-
}
|
|
236
|
-
const categories = new Set();
|
|
237
|
-
for (const n of nodes) {
|
|
238
|
-
if (typeof n.type === "string") {
|
|
239
|
-
const parts = n.type.split(".");
|
|
240
|
-
if (parts.length >= 2 && parts[1]) {
|
|
241
|
-
categories.add(parts[1]);
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
const segments = Array.from(categories).slice(0, 3);
|
|
246
|
-
if (segments.length === 0) {
|
|
247
|
-
return workflow.name || "Untitled Workflow";
|
|
248
|
-
}
|
|
249
|
-
const label = segments
|
|
250
|
-
.map((s) => s.charAt(0).toUpperCase() + s.slice(1))
|
|
251
|
-
.join(" + ");
|
|
252
|
-
return `${label} Workflow`;
|
|
253
|
-
}
|
|
254
310
|
// ── Router ─────────────────────────────────────────────────────────────────
|
|
255
311
|
export const workflowsRouter = router({
|
|
256
312
|
// ── list (GET /api/workflows) ─────────────────────────────────────────────
|
|
@@ -260,34 +316,28 @@ export const workflowsRouter = router({
|
|
|
260
316
|
.query(async ({ ctx, input }) => {
|
|
261
317
|
const [workflows, cursor] = await Workflow.paginate(ctx.userId, {
|
|
262
318
|
limit: input.limit,
|
|
263
|
-
runMode: input.run_mode
|
|
319
|
+
runMode: input.run_mode,
|
|
320
|
+
tag: input.tag,
|
|
321
|
+
projectId: input.project_id,
|
|
322
|
+
startKey: input.cursor
|
|
264
323
|
});
|
|
324
|
+
let filtered = workflows;
|
|
325
|
+
if (input.mediaOutput) {
|
|
326
|
+
filtered = filtered.filter((w) => hasTerminalMediaOutput(w));
|
|
327
|
+
}
|
|
265
328
|
return {
|
|
266
|
-
workflows:
|
|
267
|
-
|
|
329
|
+
workflows: filtered.map((w) => toWorkflowResponse(w)),
|
|
330
|
+
// mediaOutput filtering happens in memory after DB pagination, so cursor
|
|
331
|
+
// pagination is intentionally disabled for this mode.
|
|
332
|
+
next: input.mediaOutput ? null : cursor || null
|
|
268
333
|
};
|
|
269
334
|
}),
|
|
270
|
-
// ── names (GET /api/workflows/names) ─────────────────────────────────────
|
|
271
|
-
names: protectedProcedure
|
|
272
|
-
.output(namesOutput)
|
|
273
|
-
.query(async ({ ctx }) => {
|
|
274
|
-
const [workflows] = await Workflow.paginate(ctx.userId, { limit: 1000 });
|
|
275
|
-
const names = {};
|
|
276
|
-
for (const wf of workflows)
|
|
277
|
-
names[wf.id] = wf.name;
|
|
278
|
-
return names;
|
|
279
|
-
}),
|
|
280
335
|
// ── get (GET /api/workflows/:id) ─────────────────────────────────────────
|
|
281
336
|
get: protectedProcedure
|
|
282
337
|
.input(getInput)
|
|
283
338
|
.output(workflowResponse)
|
|
284
339
|
.query(async ({ ctx, input }) => {
|
|
285
|
-
const workflow =
|
|
286
|
-
if (!workflow)
|
|
287
|
-
throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
|
|
288
|
-
if (workflow.access !== "public" && workflow.user_id !== ctx.userId) {
|
|
289
|
-
throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
|
|
290
|
-
}
|
|
340
|
+
const { workflow } = await requireWorkflowRole(input.id, ctx.userId, "viewer");
|
|
291
341
|
return toWorkflowResponse(workflow);
|
|
292
342
|
}),
|
|
293
343
|
// ── create (POST /api/workflows) ─────────────────────────────────────────
|
|
@@ -295,36 +345,13 @@ export const workflowsRouter = router({
|
|
|
295
345
|
.input(createInput)
|
|
296
346
|
.output(workflowResponse)
|
|
297
347
|
.mutation(async ({ ctx, input }) => {
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
if (input.from_example_package &&
|
|
304
|
-
input.from_example_name &&
|
|
305
|
-
(!graph || graph.nodes?.length === 0)) {
|
|
306
|
-
const example = loadExampleGraph(input.from_example_package, input.from_example_name, ctx.apiOptions);
|
|
307
|
-
if (example?.graph) {
|
|
308
|
-
graph = example.graph;
|
|
348
|
+
const workflow = await runWorkflowService(() => createWorkflow(ctx.userId, input, input.from_example_name
|
|
349
|
+
? {
|
|
350
|
+
packageName: input.from_example_package ?? undefined,
|
|
351
|
+
exampleName: input.from_example_name,
|
|
352
|
+
apiOptions: ctx.apiOptions
|
|
309
353
|
}
|
|
310
|
-
|
|
311
|
-
const workflow = (await Workflow.create({
|
|
312
|
-
user_id: ctx.userId,
|
|
313
|
-
name: input.name,
|
|
314
|
-
tool_name: input.tool_name ?? null,
|
|
315
|
-
package_name: input.package_name ?? null,
|
|
316
|
-
path: input.path ?? null,
|
|
317
|
-
tags: input.tags ?? [],
|
|
318
|
-
description: input.description ?? "",
|
|
319
|
-
thumbnail: input.thumbnail ?? null,
|
|
320
|
-
thumbnail_url: input.thumbnail_url ?? null,
|
|
321
|
-
access: input.access === "public" ? "public" : "private",
|
|
322
|
-
graph,
|
|
323
|
-
settings: input.settings ?? null,
|
|
324
|
-
run_mode: input.run_mode ?? "workflow",
|
|
325
|
-
workspace_id: input.workspace_id ?? null,
|
|
326
|
-
html_app: input.html_app ?? null
|
|
327
|
-
}));
|
|
354
|
+
: undefined));
|
|
328
355
|
return toWorkflowResponse(workflow);
|
|
329
356
|
}),
|
|
330
357
|
// ── update (PUT /api/workflows/:id) ──────────────────────────────────────
|
|
@@ -332,51 +359,7 @@ export const workflowsRouter = router({
|
|
|
332
359
|
.input(updateInput)
|
|
333
360
|
.output(workflowResponse)
|
|
334
361
|
.mutation(async ({ ctx, input }) => {
|
|
335
|
-
|
|
336
|
-
throwApiError(ApiErrorCode.INVALID_INPUT, "graph is required and must have nodes and edges arrays");
|
|
337
|
-
}
|
|
338
|
-
const graph = input.graph;
|
|
339
|
-
const existing = (await Workflow.get(input.id));
|
|
340
|
-
if (existing && existing.user_id !== ctx.userId) {
|
|
341
|
-
throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
|
|
342
|
-
}
|
|
343
|
-
if (existing) {
|
|
344
|
-
existing.name = input.name;
|
|
345
|
-
existing.tool_name = input.tool_name ?? null;
|
|
346
|
-
existing.description = input.description ?? "";
|
|
347
|
-
existing.tags = input.tags ?? [];
|
|
348
|
-
existing.package_name = input.package_name ?? null;
|
|
349
|
-
if (input.thumbnail !== undefined)
|
|
350
|
-
existing.thumbnail = input.thumbnail;
|
|
351
|
-
existing.access = input.access === "public" ? "public" : "private";
|
|
352
|
-
existing.graph = graph;
|
|
353
|
-
existing.settings = input.settings ?? null;
|
|
354
|
-
if (input.run_mode !== undefined && input.run_mode !== null)
|
|
355
|
-
existing.run_mode = input.run_mode;
|
|
356
|
-
existing.workspace_id = input.workspace_id ?? null;
|
|
357
|
-
existing.html_app = input.html_app ?? null;
|
|
358
|
-
await existing.save();
|
|
359
|
-
return toWorkflowResponse(existing);
|
|
360
|
-
}
|
|
361
|
-
// Upsert: create if doesn't exist
|
|
362
|
-
const workflow = (await Workflow.create({
|
|
363
|
-
id: input.id,
|
|
364
|
-
user_id: ctx.userId,
|
|
365
|
-
name: input.name,
|
|
366
|
-
tool_name: input.tool_name ?? null,
|
|
367
|
-
package_name: input.package_name ?? null,
|
|
368
|
-
path: input.path ?? null,
|
|
369
|
-
tags: input.tags ?? [],
|
|
370
|
-
description: input.description ?? "",
|
|
371
|
-
thumbnail: input.thumbnail ?? null,
|
|
372
|
-
thumbnail_url: input.thumbnail_url ?? null,
|
|
373
|
-
access: input.access === "public" ? "public" : "private",
|
|
374
|
-
graph,
|
|
375
|
-
settings: input.settings ?? null,
|
|
376
|
-
run_mode: input.run_mode ?? "workflow",
|
|
377
|
-
workspace_id: input.workspace_id ?? null,
|
|
378
|
-
html_app: input.html_app ?? null
|
|
379
|
-
}));
|
|
362
|
+
const workflow = await runWorkflowService(() => updateWorkflow(ctx.userId, input.id, input));
|
|
380
363
|
return toWorkflowResponse(workflow);
|
|
381
364
|
}),
|
|
382
365
|
// ── delete (DELETE /api/workflows/:id) ───────────────────────────────────
|
|
@@ -384,123 +367,19 @@ export const workflowsRouter = router({
|
|
|
384
367
|
.input(deleteInput)
|
|
385
368
|
.output(deleteOutput)
|
|
386
369
|
.mutation(async ({ ctx, input }) => {
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
|
|
390
|
-
if (workflow.user_id !== ctx.userId) {
|
|
391
|
-
throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
|
|
392
|
-
}
|
|
393
|
-
await workflow.delete();
|
|
370
|
+
await runWorkflowService(() => deleteWorkflow(ctx.userId, input.id));
|
|
371
|
+
lastAutosaveTime.delete(input.id);
|
|
394
372
|
return { ok: true };
|
|
395
373
|
}),
|
|
396
|
-
// ── run (POST /api/workflows/:id/run) ────────────────────────────────────
|
|
397
|
-
run: protectedProcedure
|
|
398
|
-
.input(runInput)
|
|
399
|
-
.output(runOutput)
|
|
400
|
-
.mutation(async ({ ctx, input }) => {
|
|
401
|
-
const workflow = await Workflow.find(ctx.userId, input.id);
|
|
402
|
-
if (!workflow)
|
|
403
|
-
throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
|
|
404
|
-
const runMode = workflow.run_mode ?? "workflow";
|
|
405
|
-
if (runMode !== "workflow") {
|
|
406
|
-
throwApiError(ApiErrorCode.INVALID_INPUT, `Workflow run mode "${runMode}" is not supported by the standalone backend`);
|
|
407
|
-
}
|
|
408
|
-
const params = input.params ?? {};
|
|
409
|
-
const graph = workflow.getGraph();
|
|
410
|
-
const runnableGraph = {
|
|
411
|
-
nodes: graph.nodes.map((node) => {
|
|
412
|
-
const record = node;
|
|
413
|
-
return {
|
|
414
|
-
...record,
|
|
415
|
-
id: String(record.id ?? ""),
|
|
416
|
-
type: String(record.type ?? ""),
|
|
417
|
-
properties: (record.properties ?? record.data ?? {})
|
|
418
|
-
};
|
|
419
|
-
}),
|
|
420
|
-
edges: graph.edges.map((edge) => {
|
|
421
|
-
const record = edge;
|
|
422
|
-
return {
|
|
423
|
-
...record,
|
|
424
|
-
id: typeof record.id === "string" || record.id == null
|
|
425
|
-
? record.id
|
|
426
|
-
: String(record.id),
|
|
427
|
-
source: String(record.source ?? ""),
|
|
428
|
-
target: String(record.target ?? ""),
|
|
429
|
-
sourceHandle: String(record.sourceHandle ?? ""),
|
|
430
|
-
targetHandle: String(record.targetHandle ?? ""),
|
|
431
|
-
edge_type: record.edge_type === "control" ? "control" : "data"
|
|
432
|
-
};
|
|
433
|
-
})
|
|
434
|
-
};
|
|
435
|
-
const registry = ctx.registry;
|
|
436
|
-
const pythonBridge = ctx.pythonBridge;
|
|
437
|
-
const getPythonBridgeReady = ctx.getPythonBridgeReady;
|
|
438
|
-
const hasPythonNode = runnableGraph.nodes.some((node) => {
|
|
439
|
-
const nodeType = typeof node.type === "string" ? node.type : "";
|
|
440
|
-
return (nodeType !== "" &&
|
|
441
|
-
Boolean(registry.getMetadata(nodeType)) &&
|
|
442
|
-
!registry.has(nodeType));
|
|
443
|
-
});
|
|
444
|
-
if (hasPythonNode) {
|
|
445
|
-
if (!getPythonBridgeReady()) {
|
|
446
|
-
await pythonBridge.ensureConnected();
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
const resolveExecutor = (node) => {
|
|
450
|
-
if (registry.has(node.type)) {
|
|
451
|
-
return registry.resolve(node);
|
|
452
|
-
}
|
|
453
|
-
if (getPythonBridgeReady() && pythonBridge.hasNodeType(node.type)) {
|
|
454
|
-
const meta = pythonBridge
|
|
455
|
-
.getNodeMetadata()
|
|
456
|
-
.find((n) => n.node_type === node.type);
|
|
457
|
-
const props = (node.properties ?? {});
|
|
458
|
-
return new PythonNodeExecutor(pythonBridge, node.type, props, Object.fromEntries((meta?.outputs ?? []).map((o) => [o.name, o.type.type])), meta?.required_settings ?? []);
|
|
459
|
-
}
|
|
460
|
-
return registry.resolve(node);
|
|
461
|
-
};
|
|
462
|
-
const job = await Job.create({
|
|
463
|
-
workflow_id: input.id,
|
|
464
|
-
user_id: ctx.userId,
|
|
465
|
-
status: "running",
|
|
466
|
-
params,
|
|
467
|
-
graph: runnableGraph
|
|
468
|
-
});
|
|
469
|
-
const runner = new WorkflowRunner(job.id, { resolveExecutor });
|
|
470
|
-
const result = await runner.run({ job_id: job.id, workflow_id: input.id, params }, runnableGraph);
|
|
471
|
-
if (result.status === "completed") {
|
|
472
|
-
job.markCompleted();
|
|
473
|
-
}
|
|
474
|
-
else if (result.status === "cancelled") {
|
|
475
|
-
job.markCancelled();
|
|
476
|
-
}
|
|
477
|
-
else {
|
|
478
|
-
job.markFailed(result.error ?? "Workflow run failed");
|
|
479
|
-
}
|
|
480
|
-
await job.save();
|
|
481
|
-
return {
|
|
482
|
-
job_id: job.id,
|
|
483
|
-
workflow_id: input.id,
|
|
484
|
-
status: result.status,
|
|
485
|
-
outputs: result.outputs ?? null,
|
|
486
|
-
error: result.error ?? null,
|
|
487
|
-
message_count: result.messages.length,
|
|
488
|
-
background: input.background ?? false
|
|
489
|
-
};
|
|
490
|
-
}),
|
|
491
374
|
// ── autosave (POST/PUT /api/workflows/:id/autosave) ───────────────────────
|
|
492
375
|
autosave: protectedProcedure
|
|
493
376
|
.input(autosaveInput)
|
|
494
377
|
.output(autosaveOutput)
|
|
495
378
|
.mutation(async ({ ctx, input }) => {
|
|
496
|
-
const workflow =
|
|
497
|
-
if (!workflow)
|
|
498
|
-
throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
|
|
499
|
-
if (workflow.user_id !== ctx.userId) {
|
|
500
|
-
throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
|
|
501
|
-
}
|
|
379
|
+
const { workflow, role } = await requireWorkflowRole(input.id, ctx.userId, "editor");
|
|
502
380
|
const force = input.force === true;
|
|
503
|
-
const
|
|
381
|
+
const { policy: retentionPolicy } = await getStorageRetentionSettings(ctx.userId);
|
|
382
|
+
const maxVersions = retentionPolicy.maxAutosavesPerWorkflow;
|
|
504
383
|
// Rate-limit
|
|
505
384
|
if (!force) {
|
|
506
385
|
const last = lastAutosaveTime.get(input.id);
|
|
@@ -508,19 +387,28 @@ export const workflowsRouter = router({
|
|
|
508
387
|
return {
|
|
509
388
|
version: null,
|
|
510
389
|
message: "Autosave skipped (rate limited)",
|
|
511
|
-
skipped: true
|
|
390
|
+
skipped: true,
|
|
391
|
+
updated_at: workflow.updated_at ?? null
|
|
512
392
|
};
|
|
513
393
|
}
|
|
514
394
|
}
|
|
515
|
-
|
|
395
|
+
const fields = {
|
|
396
|
+
graph: input.graph
|
|
397
|
+
};
|
|
516
398
|
if (input.name !== undefined)
|
|
517
|
-
|
|
399
|
+
fields.name = input.name;
|
|
518
400
|
if (input.description !== undefined)
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
401
|
+
fields.description = input.description;
|
|
402
|
+
// Only the owner can change visibility; editors keep it as-is.
|
|
403
|
+
if (role === "owner" &&
|
|
404
|
+
(input.access === "public" || input.access === "private"))
|
|
405
|
+
fields.access = input.access;
|
|
406
|
+
const savedWorkflow = await Workflow.updateFieldsIfUnchanged(input.id, input.expected_updated_at ?? workflow.updated_at, fields);
|
|
407
|
+
if (!savedWorkflow) {
|
|
408
|
+
throwApiError(ApiErrorCode.ALREADY_EXISTS, "Workflow was modified since last read (optimistic concurrency conflict)");
|
|
409
|
+
}
|
|
410
|
+
await syncTriggerRegistrations(savedWorkflow);
|
|
411
|
+
recordAutosave(input.id, Date.now());
|
|
524
412
|
let version = null;
|
|
525
413
|
try {
|
|
526
414
|
const nextVer = await WorkflowVersion.nextVersion(input.id);
|
|
@@ -530,8 +418,8 @@ export const workflowsRouter = router({
|
|
|
530
418
|
graph: input.graph,
|
|
531
419
|
version: nextVer,
|
|
532
420
|
save_type: "autosave",
|
|
533
|
-
name:
|
|
534
|
-
description:
|
|
421
|
+
name: savedWorkflow.name,
|
|
422
|
+
description: savedWorkflow.description
|
|
535
423
|
});
|
|
536
424
|
await wv.save();
|
|
537
425
|
version = {
|
|
@@ -541,7 +429,7 @@ export const workflowsRouter = router({
|
|
|
541
429
|
save_type: wv.save_type ?? "autosave",
|
|
542
430
|
created_at: wv.created_at ?? null
|
|
543
431
|
};
|
|
544
|
-
await WorkflowVersion.
|
|
432
|
+
await WorkflowVersion.pruneOldAutosaves(input.id, maxVersions);
|
|
545
433
|
}
|
|
546
434
|
catch {
|
|
547
435
|
// non-fatal — version table may not exist
|
|
@@ -549,24 +437,8 @@ export const workflowsRouter = router({
|
|
|
549
437
|
return {
|
|
550
438
|
version,
|
|
551
439
|
message: "Autosaved successfully",
|
|
552
|
-
skipped: false
|
|
553
|
-
|
|
554
|
-
}),
|
|
555
|
-
// ── tools (GET /api/workflows/tools) ─────────────────────────────────────
|
|
556
|
-
tools: protectedProcedure
|
|
557
|
-
.input(toolsInput)
|
|
558
|
-
.output(toolsOutput)
|
|
559
|
-
.query(async ({ ctx, input }) => {
|
|
560
|
-
const [workflows] = await Workflow.paginateTools(ctx.userId, {
|
|
561
|
-
limit: input.limit
|
|
562
|
-
});
|
|
563
|
-
return {
|
|
564
|
-
workflows: workflows.map((w) => ({
|
|
565
|
-
name: w.name,
|
|
566
|
-
tool_name: w.tool_name ?? null,
|
|
567
|
-
description: w.description ?? null
|
|
568
|
-
})),
|
|
569
|
-
next: null
|
|
440
|
+
skipped: false,
|
|
441
|
+
updated_at: savedWorkflow.updated_at ?? null
|
|
570
442
|
};
|
|
571
443
|
}),
|
|
572
444
|
// ── examples (GET /api/workflows/examples) ────────────────────────────────
|
|
@@ -589,13 +461,21 @@ export const workflowsRouter = router({
|
|
|
589
461
|
: workflows;
|
|
590
462
|
return { workflows: filtered, next: null };
|
|
591
463
|
}),
|
|
464
|
+
// ── recipes (shipped chains of example workflows) ─────────────────────────
|
|
465
|
+
// Manifest files on disk, like the examples they order: no user, no database,
|
|
466
|
+
// and each step resolved against the examples this install actually ships.
|
|
467
|
+
recipes: protectedProcedure
|
|
468
|
+
.output(z.array(exampleRecipeSummary))
|
|
469
|
+
.query(({ ctx }) => listExampleRecipes(ctx.apiOptions)),
|
|
592
470
|
// ── public workflows ──────────────────────────────────────────────────────
|
|
593
471
|
public: router({
|
|
594
472
|
list: publicProcedure
|
|
595
473
|
.input(publicListInput)
|
|
596
474
|
.output(publicListOutput)
|
|
597
475
|
.query(async ({ input }) => {
|
|
598
|
-
const [workflows] = await Workflow.paginatePublic({
|
|
476
|
+
const [workflows] = await Workflow.paginatePublic({
|
|
477
|
+
limit: input.limit
|
|
478
|
+
});
|
|
599
479
|
return {
|
|
600
480
|
workflows: workflows.map((w) => toWorkflowResponse(w)),
|
|
601
481
|
next: null
|
|
@@ -612,30 +492,26 @@ export const workflowsRouter = router({
|
|
|
612
492
|
return toWorkflowResponse(workflow);
|
|
613
493
|
})
|
|
614
494
|
}),
|
|
615
|
-
// ──
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
495
|
+
// ── terminalOutputs (GET /api/workflows/:id/terminal-outputs) ─────────────
|
|
496
|
+
// Returns the terminal media-output nodes of a workflow for the multi-output
|
|
497
|
+
// selection prompt in AddClipMenu.
|
|
498
|
+
terminalOutputs: protectedProcedure
|
|
499
|
+
.input(terminalOutputsInput)
|
|
500
|
+
.output(terminalOutputsOutput)
|
|
619
501
|
.query(async ({ ctx, input }) => {
|
|
620
|
-
const baseUrl = input.baseUrl ?? ctx.apiOptions.baseUrl ?? "http://127.0.0.1:7777";
|
|
621
|
-
return {
|
|
622
|
-
workflow_id: input.id,
|
|
623
|
-
api_url: baseUrl
|
|
624
|
-
};
|
|
625
|
-
}),
|
|
626
|
-
// ── generateName (POST /api/workflows/:id/generate-name) ─────────────────
|
|
627
|
-
generateName: protectedProcedure
|
|
628
|
-
.input(generateNameInput)
|
|
629
|
-
.output(generateNameOutput)
|
|
630
|
-
.mutation(async ({ ctx, input }) => {
|
|
631
502
|
const workflow = (await Workflow.get(input.id));
|
|
632
503
|
if (!workflow)
|
|
633
504
|
throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
|
|
634
|
-
if (workflow.user_id !== ctx.userId) {
|
|
505
|
+
if (workflow.access !== "public" && workflow.user_id !== ctx.userId) {
|
|
635
506
|
throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
|
|
636
507
|
}
|
|
637
|
-
const
|
|
638
|
-
|
|
508
|
+
const outputs = findTerminalMediaOutputNodes(workflow).map((n) => ({
|
|
509
|
+
id: n.id,
|
|
510
|
+
type: n.type,
|
|
511
|
+
mediaType: OUTPUT_NODE_MEDIA_TYPES[n.type],
|
|
512
|
+
name: n.data?.name ?? ""
|
|
513
|
+
}));
|
|
514
|
+
return { outputs };
|
|
639
515
|
}),
|
|
640
516
|
// ── versions ──────────────────────────────────────────────────────────────
|
|
641
517
|
versions: router({
|
|
@@ -644,11 +520,8 @@ export const workflowsRouter = router({
|
|
|
644
520
|
.input(versionsListInput)
|
|
645
521
|
.output(versionsListOutput)
|
|
646
522
|
.query(async ({ ctx, input }) => {
|
|
647
|
-
//
|
|
648
|
-
|
|
649
|
-
if (!workflow || workflow.user_id !== ctx.userId) {
|
|
650
|
-
throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
|
|
651
|
-
}
|
|
523
|
+
// Owners and editors see version history
|
|
524
|
+
await requireWorkflowRole(input.id, ctx.userId, "editor");
|
|
652
525
|
const versions = await WorkflowVersion.listForWorkflow(input.id, {
|
|
653
526
|
limit: input.limit
|
|
654
527
|
});
|
|
@@ -659,12 +532,7 @@ export const workflowsRouter = router({
|
|
|
659
532
|
.input(versionCreateInput)
|
|
660
533
|
.output(versionResponse)
|
|
661
534
|
.mutation(async ({ ctx, input }) => {
|
|
662
|
-
const workflow =
|
|
663
|
-
if (!workflow)
|
|
664
|
-
throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
|
|
665
|
-
if (workflow.user_id !== ctx.userId) {
|
|
666
|
-
throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
|
|
667
|
-
}
|
|
535
|
+
const { workflow } = await requireWorkflowRole(input.id, ctx.userId, "editor");
|
|
668
536
|
const nextVer = await WorkflowVersion.nextVersion(input.id);
|
|
669
537
|
const version = (await WorkflowVersion.create({
|
|
670
538
|
workflow_id: input.id,
|
|
@@ -676,29 +544,12 @@ export const workflowsRouter = router({
|
|
|
676
544
|
}));
|
|
677
545
|
return toVersionResponse(version);
|
|
678
546
|
}),
|
|
679
|
-
// GET /api/workflows/:id/versions/:version
|
|
680
|
-
get: protectedProcedure
|
|
681
|
-
.input(versionGetInput)
|
|
682
|
-
.output(versionResponse)
|
|
683
|
-
.query(async ({ ctx, input }) => {
|
|
684
|
-
const workflow = (await Workflow.get(input.id));
|
|
685
|
-
if (!workflow || workflow.user_id !== ctx.userId) {
|
|
686
|
-
throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
|
|
687
|
-
}
|
|
688
|
-
const version = await WorkflowVersion.findByVersion(input.id, input.version);
|
|
689
|
-
if (!version)
|
|
690
|
-
throwApiError(ApiErrorCode.NOT_FOUND, "Version not found");
|
|
691
|
-
return toVersionResponse(version);
|
|
692
|
-
}),
|
|
693
547
|
// POST /api/workflows/:id/versions/:version/restore
|
|
694
548
|
restore: protectedProcedure
|
|
695
549
|
.input(versionRestoreInput)
|
|
696
550
|
.output(workflowResponse)
|
|
697
551
|
.mutation(async ({ ctx, input }) => {
|
|
698
|
-
const workflow =
|
|
699
|
-
if (!workflow || workflow.user_id !== ctx.userId) {
|
|
700
|
-
throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
|
|
701
|
-
}
|
|
552
|
+
const { workflow } = await requireWorkflowRole(input.id, ctx.userId, "editor");
|
|
702
553
|
const version = await WorkflowVersion.findByVersion(input.id, input.version);
|
|
703
554
|
if (!version)
|
|
704
555
|
throwApiError(ApiErrorCode.NOT_FOUND, "Version not found");
|
|
@@ -715,11 +566,141 @@ export const workflowsRouter = router({
|
|
|
715
566
|
if (!version)
|
|
716
567
|
throwApiError(ApiErrorCode.NOT_FOUND, "Version not found");
|
|
717
568
|
if (version.user_id !== ctx.userId) {
|
|
718
|
-
|
|
569
|
+
// The workflow owner may prune versions saved by collaborators.
|
|
570
|
+
const parent = (await Workflow.get(version.workflow_id));
|
|
571
|
+
if (!parent || parent.user_id !== ctx.userId) {
|
|
572
|
+
throwApiError(ApiErrorCode.NOT_FOUND, "Version not found");
|
|
573
|
+
}
|
|
719
574
|
}
|
|
720
575
|
await version.delete();
|
|
721
576
|
return { ok: true };
|
|
722
577
|
})
|
|
578
|
+
}),
|
|
579
|
+
// ── sharing ────────────────────────────────────────────────────────────────
|
|
580
|
+
// Private sharing via role-scoped links: the owner mints a link, any
|
|
581
|
+
// authenticated user who redeems it becomes a collaborator (viewer/editor).
|
|
582
|
+
sharing: router({
|
|
583
|
+
// Collaborators + share links for the dialog. Owner only.
|
|
584
|
+
get: protectedProcedure
|
|
585
|
+
.input(sharingGetInput)
|
|
586
|
+
.output(sharingGetOutput)
|
|
587
|
+
.query(async ({ ctx, input }) => {
|
|
588
|
+
await requireWorkflowRole(input.id, ctx.userId, "owner");
|
|
589
|
+
const [collaborators, shares] = await Promise.all([
|
|
590
|
+
WorkflowCollaborator.listForWorkflow(input.id),
|
|
591
|
+
WorkflowShare.listForWorkflow(input.id)
|
|
592
|
+
]);
|
|
593
|
+
return {
|
|
594
|
+
collaborators: collaborators.map(toCollaboratorItem),
|
|
595
|
+
shares: shares.map(toShareItem)
|
|
596
|
+
};
|
|
597
|
+
}),
|
|
598
|
+
// Mint (or return the existing active) share link for a role.
|
|
599
|
+
createLink: protectedProcedure
|
|
600
|
+
.input(sharingCreateLinkInput)
|
|
601
|
+
.output(shareItem)
|
|
602
|
+
.mutation(async ({ ctx, input }) => {
|
|
603
|
+
await requireWorkflowRole(input.id, ctx.userId, "owner");
|
|
604
|
+
const share = await WorkflowShare.ensure({
|
|
605
|
+
workflowId: input.id,
|
|
606
|
+
role: input.role,
|
|
607
|
+
createdBy: ctx.userId
|
|
608
|
+
});
|
|
609
|
+
return toShareItem(share);
|
|
610
|
+
}),
|
|
611
|
+
// Stop new redemptions of a link. Existing collaborators keep access.
|
|
612
|
+
revokeLink: protectedProcedure
|
|
613
|
+
.input(sharingRevokeLinkInput)
|
|
614
|
+
.output(sharingOkOutput)
|
|
615
|
+
.mutation(async ({ ctx, input }) => {
|
|
616
|
+
await requireWorkflowRole(input.id, ctx.userId, "owner");
|
|
617
|
+
const share = (await WorkflowShare.get(input.share_id));
|
|
618
|
+
if (!share || share.workflow_id !== input.id) {
|
|
619
|
+
throwApiError(ApiErrorCode.NOT_FOUND, "Share not found");
|
|
620
|
+
}
|
|
621
|
+
if (!share.isRevoked)
|
|
622
|
+
await share.revoke();
|
|
623
|
+
return { ok: true };
|
|
624
|
+
}),
|
|
625
|
+
// Change a collaborator's role. Owner only.
|
|
626
|
+
setRole: protectedProcedure
|
|
627
|
+
.input(sharingSetRoleInput)
|
|
628
|
+
.output(collaboratorItem)
|
|
629
|
+
.mutation(async ({ ctx, input }) => {
|
|
630
|
+
await requireWorkflowRole(input.id, ctx.userId, "owner");
|
|
631
|
+
const grant = await WorkflowCollaborator.findFor(input.id, input.user_id);
|
|
632
|
+
if (!grant) {
|
|
633
|
+
throwApiError(ApiErrorCode.NOT_FOUND, "Collaborator not found");
|
|
634
|
+
}
|
|
635
|
+
if (grant.role !== input.role) {
|
|
636
|
+
grant.role = input.role;
|
|
637
|
+
await grant.save();
|
|
638
|
+
}
|
|
639
|
+
return toCollaboratorItem(grant);
|
|
640
|
+
}),
|
|
641
|
+
// Remove a collaborator. Owner removes anyone; a collaborator may
|
|
642
|
+
// remove themself ("leave").
|
|
643
|
+
removeCollaborator: protectedProcedure
|
|
644
|
+
.input(sharingRemoveCollaboratorInput)
|
|
645
|
+
.output(sharingOkOutput)
|
|
646
|
+
.mutation(async ({ ctx, input }) => {
|
|
647
|
+
if (input.user_id !== ctx.userId) {
|
|
648
|
+
await requireWorkflowRole(input.id, ctx.userId, "owner");
|
|
649
|
+
}
|
|
650
|
+
const removed = await WorkflowCollaborator.remove(input.id, input.user_id);
|
|
651
|
+
if (!removed) {
|
|
652
|
+
throwApiError(ApiErrorCode.NOT_FOUND, "Collaborator not found");
|
|
653
|
+
}
|
|
654
|
+
return { ok: true };
|
|
655
|
+
}),
|
|
656
|
+
// Redeem a share link: the caller becomes a collaborator with the
|
|
657
|
+
// link's role and gets the workflow back for navigation.
|
|
658
|
+
accept: protectedProcedure
|
|
659
|
+
.input(sharingAcceptInput)
|
|
660
|
+
.output(sharingAcceptOutput)
|
|
661
|
+
.mutation(async ({ ctx, input }) => {
|
|
662
|
+
const share = await WorkflowShare.findByToken(input.token);
|
|
663
|
+
if (!share || share.isRevoked) {
|
|
664
|
+
throwApiError(ApiErrorCode.NOT_FOUND, "Share link is invalid or revoked");
|
|
665
|
+
}
|
|
666
|
+
const workflow = (await Workflow.get(share.workflow_id));
|
|
667
|
+
if (!workflow) {
|
|
668
|
+
throwApiError(ApiErrorCode.WORKFLOW_NOT_FOUND, "Workflow not found");
|
|
669
|
+
}
|
|
670
|
+
// The owner opening their own link is a no-op, not a grant.
|
|
671
|
+
if (workflow.user_id !== ctx.userId) {
|
|
672
|
+
await WorkflowCollaborator.upsert({
|
|
673
|
+
workflowId: workflow.id,
|
|
674
|
+
userId: ctx.userId,
|
|
675
|
+
role: share.role,
|
|
676
|
+
invitedBy: share.created_by
|
|
677
|
+
});
|
|
678
|
+
}
|
|
679
|
+
return { workflow: toWorkflowResponse(workflow), role: share.role };
|
|
680
|
+
}),
|
|
681
|
+
// Workflows shared with the caller, with their role on each.
|
|
682
|
+
sharedWithMe: protectedProcedure
|
|
683
|
+
.input(sharedWithMeInput)
|
|
684
|
+
.output(sharedWithMeOutput)
|
|
685
|
+
.query(async ({ ctx, input }) => {
|
|
686
|
+
const grants = await WorkflowCollaborator.listForUser(ctx.userId);
|
|
687
|
+
const limited = grants.slice(0, input.limit);
|
|
688
|
+
const loaded = await Promise.all(limited.map(async (grant) => ({
|
|
689
|
+
grant,
|
|
690
|
+
workflow: (await Workflow.get(grant.workflow_id))
|
|
691
|
+
})));
|
|
692
|
+
const workflows = [];
|
|
693
|
+
for (const { grant, workflow } of loaded) {
|
|
694
|
+
// Skip grants pointing at deleted workflows.
|
|
695
|
+
if (!workflow)
|
|
696
|
+
continue;
|
|
697
|
+
workflows.push({
|
|
698
|
+
...toWorkflowResponse(workflow),
|
|
699
|
+
shared_role: grant.role
|
|
700
|
+
});
|
|
701
|
+
}
|
|
702
|
+
return { workflows };
|
|
703
|
+
})
|
|
723
704
|
})
|
|
724
705
|
});
|
|
725
706
|
//# sourceMappingURL=workflows.js.map
|