@nodetool-ai/websocket 0.7.0-rc.23 → 0.8.2
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 +82 -14
- 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/error-traces.d.ts +56 -0
- package/dist/error-traces.d.ts.map +1 -0
- package/dist/error-traces.js +179 -0
- package/dist/error-traces.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/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 +307 -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 +219 -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 +628 -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 +10 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -3
- package/dist/index.js.map +1 -1
- package/dist/interrupted-jobs.d.ts +14 -0
- package/dist/interrupted-jobs.d.ts.map +1 -0
- package/dist/interrupted-jobs.js +28 -0
- package/dist/interrupted-jobs.js.map +1 -0
- 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-instances-service.d.ts +1284 -0
- package/dist/lib/app-instances-service.d.ts.map +1 -0
- package/dist/lib/app-instances-service.js +378 -0
- package/dist/lib/app-instances-service.js.map +1 -0
- package/dist/lib/app-run-cancellation.d.ts +4 -0
- package/dist/lib/app-run-cancellation.d.ts.map +1 -0
- package/dist/lib/app-run-cancellation.js +28 -0
- package/dist/lib/app-run-cancellation.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 +354 -0
- package/dist/lib/applications-service.d.ts.map +1 -0
- package/dist/lib/applications-service.js +507 -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 +49 -1
- package/dist/lib/asset-paths.d.ts.map +1 -1
- package/dist/lib/asset-paths.js +127 -31
- 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 +89 -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 +335 -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 +296 -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 +52 -0
- package/dist/lib/example-apps.d.ts.map +1 -0
- package/dist/lib/example-apps.js +192 -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/http-tracing.d.ts +12 -0
- package/dist/lib/http-tracing.d.ts.map +1 -0
- package/dist/lib/http-tracing.js +81 -0
- package/dist/lib/http-tracing.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 +33 -0
- package/dist/lib/media.d.ts.map +1 -0
- package/dist/lib/media.js +110 -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 +102 -0
- package/dist/lib/public-routes.d.ts.map +1 -0
- package/dist/lib/public-routes.js +168 -0
- package/dist/lib/public-routes.js.map +1 -0
- package/dist/lib/public-workflow-share.d.ts +20 -0
- package/dist/lib/public-workflow-share.d.ts.map +1 -0
- package/dist/lib/public-workflow-share.js +45 -0
- package/dist/lib/public-workflow-share.js.map +1 -0
- package/dist/lib/run-trace-live-delivery.d.ts +25 -0
- package/dist/lib/run-trace-live-delivery.d.ts.map +1 -0
- package/dist/lib/run-trace-live-delivery.js +91 -0
- package/dist/lib/run-trace-live-delivery.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/test-ui-run-routes.d.ts +8 -0
- package/dist/lib/test-ui-run-routes.d.ts.map +1 -0
- package/dist/lib/test-ui-run-routes.js +42 -0
- package/dist/lib/test-ui-run-routes.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 +305 -0
- package/dist/lib/thumbnail.js.map +1 -0
- package/dist/lib/timeline-bundle.d.ts +1821 -0
- package/dist/lib/timeline-bundle.d.ts.map +1 -0
- package/dist/lib/timeline-bundle.js +342 -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 +546 -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 +197 -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 +1147 -0
- package/dist/mcp-agent-tools.js.map +1 -0
- package/dist/mcp-client-config.d.ts +64 -0
- package/dist/mcp-client-config.d.ts.map +1 -0
- package/dist/mcp-client-config.js +353 -0
- package/dist/mcp-client-config.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 +61 -5
- package/dist/models-api.d.ts.map +1 -1
- package/dist/models-api.js +182 -689
- 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 +163 -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 +106 -297
- package/dist/plugins/websocket.js.map +1 -1
- package/dist/python-bridge-gate.d.ts +28 -0
- package/dist/python-bridge-gate.d.ts.map +1 -0
- package/dist/python-bridge-gate.js +36 -0
- package/dist/python-bridge-gate.js.map +1 -0
- 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/app-runs.d.ts +4 -0
- package/dist/routes/app-runs.d.ts.map +1 -0
- package/dist/routes/app-runs.js +173 -0
- package/dist/routes/app-runs.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 +32 -0
- package/dist/routes/js-scripts.d.ts.map +1 -0
- package/dist/routes/js-scripts.js +498 -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 +29 -51
- 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/public-shared-workflows.d.ts +16 -0
- package/dist/routes/public-shared-workflows.d.ts.map +1 -0
- package/dist/routes/public-shared-workflows.js +55 -0
- package/dist/routes/public-shared-workflows.js.map +1 -0
- package/dist/routes/run-spans.d.ts +4 -0
- package/dist/routes/run-spans.d.ts.map +1 -0
- package/dist/routes/run-spans.js +53 -0
- package/dist/routes/run-spans.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 +51 -0
- package/dist/routes/timeline-fonts.d.ts.map +1 -0
- package/dist/routes/timeline-fonts.js +195 -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 +950 -47
- 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 +277 -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 +1091 -206
- package/dist/server.js.map +1 -1
- package/dist/session/app-run-fold.d.ts +7 -0
- package/dist/session/app-run-fold.d.ts.map +1 -0
- package/dist/session/app-run-fold.js +45 -0
- package/dist/session/app-run-fold.js.map +1 -0
- 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 +502 -0
- package/dist/session/chat-prompt.js.map +1 -0
- package/dist/session/chat-turn.d.ts +337 -0
- package/dist/session/chat-turn.d.ts.map +1 -0
- package/dist/session/chat-turn.js +3612 -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 +784 -0
- package/dist/session/commands.js.map +1 -0
- package/dist/session/inference.d.ts +218 -0
- package/dist/session/inference.d.ts.map +1 -0
- package/dist/session/inference.js +1143 -0
- package/dist/session/inference.js.map +1 -0
- package/dist/session/job-execution.d.ts +484 -0
- package/dist/session/job-execution.d.ts.map +1 -0
- package/dist/session/job-execution.js +2379 -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 +28 -0
- package/dist/session/model-interfaces.d.ts.map +1 -0
- package/dist/session/model-interfaces.js +133 -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 +14 -0
- package/dist/storage-retention.d.ts.map +1 -0
- package/dist/storage-retention.js +95 -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 +207 -42
- package/dist/test-ui-server.js.map +1 -1
- package/dist/timeline-generation-recovery.d.ts +4 -0
- package/dist/timeline-generation-recovery.d.ts.map +1 -0
- package/dist/timeline-generation-recovery.js +72 -0
- package/dist/timeline-generation-recovery.js.map +1 -0
- 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 +24 -0
- package/dist/trpc/error-logging.d.ts.map +1 -0
- package/dist/trpc/error-logging.js +48 -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 +100 -2540
- package/dist/trpc/router.d.ts.map +1 -1
- package/dist/trpc/router.js +58 -6
- 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/app-instances.d.ts +2269 -0
- package/dist/trpc/routers/app-instances.d.ts.map +1 -0
- package/dist/trpc/routers/app-instances.js +52 -0
- package/dist/trpc/routers/app-instances.js.map +1 -0
- package/dist/trpc/routers/app-runs.d.ts +1092 -0
- package/dist/trpc/routers/app-runs.d.ts.map +1 -0
- package/dist/trpc/routers/app-runs.js +28 -0
- package/dist/trpc/routers/app-runs.js.map +1 -0
- package/dist/trpc/routers/applications.d.ts +2212 -0
- package/dist/trpc/routers/applications.d.ts.map +1 -0
- package/dist/trpc/routers/applications.js +221 -0
- package/dist/trpc/routers/applications.js.map +1 -0
- package/dist/trpc/routers/assets.d.ts +194 -42
- package/dist/trpc/routers/assets.d.ts.map +1 -1
- package/dist/trpc/routers/assets.js +503 -105
- package/dist/trpc/routers/assets.js.map +1 -1
- package/dist/trpc/routers/bug-reports.d.ts +33 -0
- package/dist/trpc/routers/bug-reports.d.ts.map +1 -0
- package/dist/trpc/routers/bug-reports.js +69 -0
- package/dist/trpc/routers/bug-reports.js.map +1 -0
- 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 +29 -0
- package/dist/trpc/routers/documents.js.map +1 -0
- package/dist/trpc/routers/error-traces.d.ts +132 -0
- package/dist/trpc/routers/error-traces.d.ts.map +1 -0
- package/dist/trpc/routers/error-traces.js +118 -0
- package/dist/trpc/routers/error-traces.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/gameDraftHistory.d.ts +8 -0
- package/dist/trpc/routers/gameDraftHistory.d.ts.map +1 -0
- package/dist/trpc/routers/gameDraftHistory.js +40 -0
- package/dist/trpc/routers/gameDraftHistory.js.map +1 -0
- package/dist/trpc/routers/games.d.ts +26502 -0
- package/dist/trpc/routers/games.d.ts.map +1 -0
- package/dist/trpc/routers/games.js +674 -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 +117 -21
- package/dist/trpc/routers/jobs.d.ts.map +1 -1
- package/dist/trpc/routers/jobs.js +191 -30
- 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 +4 -2
- package/dist/trpc/routers/mcp-config.d.ts.map +1 -1
- package/dist/trpc/routers/mcp-config.js +46 -206
- 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 +1544 -249
- package/dist/trpc/routers/models.d.ts.map +1 -1
- package/dist/trpc/routers/models.js +624 -318
- 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/runs.d.ts +472 -0
- package/dist/trpc/routers/runs.d.ts.map +1 -0
- package/dist/trpc/routers/runs.js +40 -0
- package/dist/trpc/routers/runs.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 +180 -10
- package/dist/trpc/routers/settings.d.ts.map +1 -1
- package/dist/trpc/routers/settings.js +125 -33
- package/dist/trpc/routers/settings.js.map +1 -1
- package/dist/trpc/routers/sketch.d.ts +868 -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 +6639 -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 +9085 -0
- package/dist/trpc/routers/timeline.d.ts.map +1 -0
- package/dist/trpc/routers/timeline.js +669 -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 +243 -0
- package/dist/trpc/routers/worker.d.ts.map +1 -0
- package/dist/trpc/routers/worker.js +221 -0
- package/dist/trpc/routers/worker.js.map +1 -0
- package/dist/trpc/routers/workflows.d.ts +428 -187
- package/dist/trpc/routers/workflows.d.ts.map +1 -1
- package/dist/trpc/routers/workflows.js +347 -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 +1139 -0
- package/dist/trpc/sandbox-coverage.js.map +1 -0
- package/dist/websocket-client-session.d.ts +322 -0
- package/dist/websocket-client-session.d.ts.map +1 -0
- package/dist/websocket-client-session.js +1267 -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 +97 -36
- 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
|
@@ -0,0 +1,1143 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { createLogger } from "@nodetool-ai/config";
|
|
3
|
+
import { getModelUnitPrice } from "@nodetool-ai/model-pricing";
|
|
4
|
+
import { Asset, Prediction, Project, TimelineSequence, findFinishResourceIds, assertStoryboardClipGenerationAllowed } from "@nodetool-ai/models";
|
|
5
|
+
import { extractPricingParams } from "@nodetool-ai/node-sdk/pricing-params";
|
|
6
|
+
import { resolveNodetoolDelegate } from "@nodetool-ai/protocol";
|
|
7
|
+
import { GenerationAlreadyAcceptedError } from "@nodetool-ai/runtime";
|
|
8
|
+
import { calculateChatCost, detectImageMime, expandEntitiesForGeneration, generateStructured, isToolCall, IMAGE_MIME_TO_EXT, messageText } from "@nodetool-ai/runtime";
|
|
9
|
+
import { linkGenerationAssets } from "@nodetool-ai/execution";
|
|
10
|
+
import { admitSpend, releaseSpend, reserveSpend } from "../credit-gate.js";
|
|
11
|
+
import { retrieveAssetBytes } from "../lib/asset-paths.js";
|
|
12
|
+
import { trimVideoWindow } from "../lib/media.js";
|
|
13
|
+
import { resolveImageSize } from "../lib/media-size.js";
|
|
14
|
+
import { getAssetAdapter } from "../lib/storage.js";
|
|
15
|
+
import { isFiniteNumber, isRecord, isString } from "../lib/wire-values.js";
|
|
16
|
+
import { createGenerationRun, generateSpeechBytes, generateMusicBytes } from "./media-generation.js";
|
|
17
|
+
const log = createLogger("nodetool.websocket.runner");
|
|
18
|
+
/**
|
|
19
|
+
* Strip sentence punctuation after an `entity://` id. A loop, not `/\.+$/`:
|
|
20
|
+
* the regex backtracks quadratically on a long dot run followed by another
|
|
21
|
+
* character, and the prompt is user input.
|
|
22
|
+
*/
|
|
23
|
+
function trimTrailingDots(value) {
|
|
24
|
+
let end = value.length;
|
|
25
|
+
while (end > 0 && value[end - 1] === ".")
|
|
26
|
+
end -= 1;
|
|
27
|
+
return value.slice(0, end);
|
|
28
|
+
}
|
|
29
|
+
async function resolveVideoEditReferenceIds(userId, req) {
|
|
30
|
+
const ownedResolver = entityRefResolver(userId);
|
|
31
|
+
const assets = new Map();
|
|
32
|
+
const requestedEntities = new Set([
|
|
33
|
+
...(req.entityIds ?? []),
|
|
34
|
+
...Array.from(req.prompt.matchAll(/entity:\/\/([A-Za-z0-9._~-]+)/g), (match) => trimTrailingDots(match[1]))
|
|
35
|
+
]);
|
|
36
|
+
const resolvedEntityIds = new Set();
|
|
37
|
+
const resolver = {
|
|
38
|
+
getAssetInfo: async (id) => {
|
|
39
|
+
let pending = assets.get(id);
|
|
40
|
+
if (!pending) {
|
|
41
|
+
pending = ownedResolver.getAssetInfo(id);
|
|
42
|
+
assets.set(id, pending);
|
|
43
|
+
}
|
|
44
|
+
const asset = await pending;
|
|
45
|
+
const marker = asset?.metadata?.nodetool_entity;
|
|
46
|
+
if (requestedEntities.has(id) && isRecord(marker) && isString(marker.name) && marker.name.trim()) {
|
|
47
|
+
resolvedEntityIds.add(id);
|
|
48
|
+
}
|
|
49
|
+
return asset;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
const entityIds = [...new Set(req.entityIds ?? [])];
|
|
53
|
+
const entityReferenceAssetIds = [];
|
|
54
|
+
for (const id of entityIds) {
|
|
55
|
+
const asset = await resolver.getAssetInfo(id);
|
|
56
|
+
const marker = asset?.metadata?.nodetool_entity;
|
|
57
|
+
if (!isRecord(marker) || !isString(marker.name) || !marker.name.trim()) {
|
|
58
|
+
throw new Error(`Entity reference ${id} was not found`);
|
|
59
|
+
}
|
|
60
|
+
const referenceAssetId = isString(marker.reference_asset_id)
|
|
61
|
+
? marker.reference_asset_id.trim()
|
|
62
|
+
: "";
|
|
63
|
+
entityReferenceAssetIds.push(referenceAssetId || id);
|
|
64
|
+
}
|
|
65
|
+
const expanded = await expandEntitiesForGeneration([req.prompt, ...entityIds.map((id) => `entity://${id}`)].join(" "), resolver);
|
|
66
|
+
const assetIds = [...new Set([
|
|
67
|
+
...(req.referenceAssetIds ?? []),
|
|
68
|
+
...(req.referenceImages ?? []).map((ref) => referenceAssetId(ref, "image")),
|
|
69
|
+
...entityReferenceAssetIds,
|
|
70
|
+
...expanded.referenceImages.map((ref) => ref.uri.slice("asset://".length, ref.uri.lastIndexOf(".")))
|
|
71
|
+
])];
|
|
72
|
+
return { prompt: expanded.prompt, assetIds, entityIds: [...resolvedEntityIds] };
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Chars per token for the up-front spend estimate. Deliberately low (real
|
|
76
|
+
* English averages nearer 4) so the estimate over-books rather than under.
|
|
77
|
+
*/
|
|
78
|
+
const ESTIMATE_CHARS_PER_TOKEN = 3;
|
|
79
|
+
/** Output budget assumed when a request names no `max_tokens`. */
|
|
80
|
+
const ESTIMATE_DEFAULT_OUTPUT_TOKENS = 4096;
|
|
81
|
+
/**
|
|
82
|
+
* What one image block is worth to the estimate. A reference image costs on
|
|
83
|
+
* the order of a thousand tokens across the providers that take them; the
|
|
84
|
+
* estimate only has to over-book, and the real token cost is recorded when the
|
|
85
|
+
* call returns.
|
|
86
|
+
*/
|
|
87
|
+
const IMAGE_ESTIMATE_CHARS = 4000;
|
|
88
|
+
/** Characters a message contributes to the estimate, text blocks included. */
|
|
89
|
+
function messageChars(content) {
|
|
90
|
+
if (typeof content === "string") {
|
|
91
|
+
return content.length;
|
|
92
|
+
}
|
|
93
|
+
// A block's shape is only checked as `{ type: string }` + passthrough on the
|
|
94
|
+
// wire, so a `{ type: "text" }` with no `text` reaches here. Reading `.length`
|
|
95
|
+
// off it threw before the spend estimate was taken — a crash on the admission
|
|
96
|
+
// path, not a refusal.
|
|
97
|
+
return content.reduce((sum, block) => sum +
|
|
98
|
+
(block.type === "text" && typeof block.text === "string"
|
|
99
|
+
? block.text.length
|
|
100
|
+
: IMAGE_ESTIMATE_CHARS), 0);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* A conservative up-front price for one text generation, in USD: every
|
|
104
|
+
* character the messages carry counted as input tokens, plus the request's
|
|
105
|
+
* whole output budget as output tokens, at the delegate model's rate.
|
|
106
|
+
*
|
|
107
|
+
* It over-estimates on purpose. The figure is what gets *reserved* for the
|
|
108
|
+
* duration of the call, and the real cost replaces it afterwards — an
|
|
109
|
+
* over-booking that is released beats letting concurrent calls each admit
|
|
110
|
+
* against a balance none of them has spent yet.
|
|
111
|
+
*/
|
|
112
|
+
export function estimateDirectTextSpend(req) {
|
|
113
|
+
const delegate = req.provider === "nodetool" ? resolveNodetoolDelegate(req.model) : null;
|
|
114
|
+
const modelId = delegate?.model ?? req.model;
|
|
115
|
+
const providerId = delegate?.provider ?? req.provider;
|
|
116
|
+
const chars = req.messages.reduce((sum, m) => sum + messageChars(m.content), 0);
|
|
117
|
+
const inputTokens = Math.ceil(chars / ESTIMATE_CHARS_PER_TOKEN);
|
|
118
|
+
const outputTokens = req.maxTokens ?? ESTIMATE_DEFAULT_OUTPUT_TOKENS;
|
|
119
|
+
try {
|
|
120
|
+
return calculateChatCost(modelId, inputTokens, outputTokens, 0, providerId);
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
// An unpriced model estimates at zero: the gate still admits against the
|
|
124
|
+
// balance, and the real cost is recorded when the call returns.
|
|
125
|
+
return 0;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Entity-mention resolver over the Asset model, scoped to one user. Backs
|
|
130
|
+
* `expandEntitiesForGeneration` on every direct-generation surface.
|
|
131
|
+
*/
|
|
132
|
+
export function entityRefResolver(userId) {
|
|
133
|
+
return {
|
|
134
|
+
getAssetInfo: async (assetId) => {
|
|
135
|
+
const asset = await Asset.find(userId, assetId);
|
|
136
|
+
if (!asset)
|
|
137
|
+
return null;
|
|
138
|
+
return {
|
|
139
|
+
id: asset.id,
|
|
140
|
+
content_type: asset.content_type,
|
|
141
|
+
name: asset.name,
|
|
142
|
+
metadata: asset.metadata ?? null
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Resolve entity-derived reference images to provider input bytes. A ref
|
|
149
|
+
* whose asset is gone (or reads back empty) contributes nothing — the same
|
|
150
|
+
* drop rule as an unresolvable mention.
|
|
151
|
+
*/
|
|
152
|
+
export async function resolveEntityReferenceImages(userId, refs) {
|
|
153
|
+
const out = [];
|
|
154
|
+
for (const ref of refs) {
|
|
155
|
+
const bare = ref.uri.slice("asset://".length);
|
|
156
|
+
const assetId = bare.slice(0, bare.lastIndexOf("."));
|
|
157
|
+
if (!assetId)
|
|
158
|
+
continue;
|
|
159
|
+
const asset = await Asset.find(userId, assetId);
|
|
160
|
+
if (!asset)
|
|
161
|
+
continue;
|
|
162
|
+
const bytes = await retrieveAssetBytes(getAssetAdapter(), userId, asset.id, asset.content_type);
|
|
163
|
+
if (!bytes || bytes.length === 0)
|
|
164
|
+
continue;
|
|
165
|
+
out.push(bytes);
|
|
166
|
+
}
|
|
167
|
+
return out;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Read one owned asset's bytes, with the descriptive errors the generation
|
|
171
|
+
* paths surface verbatim to callers.
|
|
172
|
+
*/
|
|
173
|
+
export async function retrieveSourceAssetBytes(userId, assetId) {
|
|
174
|
+
const asset = await Asset.find(userId, assetId);
|
|
175
|
+
if (!asset) {
|
|
176
|
+
throw new Error(`Source asset not found: ${assetId}`);
|
|
177
|
+
}
|
|
178
|
+
const bytes = await retrieveAssetBytes(getAssetAdapter(), userId, assetId, asset.content_type);
|
|
179
|
+
if (!bytes) {
|
|
180
|
+
throw new Error(`Source asset bytes not found: ${assetId}`);
|
|
181
|
+
}
|
|
182
|
+
return bytes;
|
|
183
|
+
}
|
|
184
|
+
async function resolveReferenceAssets(userId, refs, kind) {
|
|
185
|
+
const resolved = [];
|
|
186
|
+
for (const ref of refs) {
|
|
187
|
+
const assetId = referenceAssetId(ref, kind);
|
|
188
|
+
const asset = await Asset.find(userId, assetId);
|
|
189
|
+
if (!asset)
|
|
190
|
+
throw new Error(`Reference ${kind} asset ${assetId} was not found`);
|
|
191
|
+
if (!asset.content_type.startsWith(`${kind}/`)) {
|
|
192
|
+
throw new Error(`Reference ${kind} asset ${assetId} is not ${kind === "image" ? "an image" : "a video"}`);
|
|
193
|
+
}
|
|
194
|
+
const bytes = await retrieveAssetBytes(getAssetAdapter(), userId, asset.id, asset.content_type);
|
|
195
|
+
if (!bytes || bytes.length === 0) {
|
|
196
|
+
throw new Error(`Reference ${kind} asset ${assetId} is empty`);
|
|
197
|
+
}
|
|
198
|
+
resolved.push(bytes);
|
|
199
|
+
}
|
|
200
|
+
return resolved;
|
|
201
|
+
}
|
|
202
|
+
function referenceAssetId(ref, kind) {
|
|
203
|
+
if (!isRecord(ref) || (ref.type !== undefined && ref.type !== kind)) {
|
|
204
|
+
throw new Error(`Expected reference ${kind} objects`);
|
|
205
|
+
}
|
|
206
|
+
const assetId = isString(ref.asset_id) && ref.asset_id.length > 0
|
|
207
|
+
? ref.asset_id
|
|
208
|
+
: isString(ref.uri) && ref.uri.startsWith("asset://")
|
|
209
|
+
? ref.uri.slice("asset://".length).split(".")[0]
|
|
210
|
+
: "";
|
|
211
|
+
if (!assetId) {
|
|
212
|
+
throw new Error(`Reference ${kind} is missing an asset id`);
|
|
213
|
+
}
|
|
214
|
+
return assetId;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Refuse a bare prompt for a model the catalog lists as editing-only. Such a
|
|
218
|
+
* model needs an input image, and its provider rejects the request with an
|
|
219
|
+
* error that names neither the cause nor the fix (AtlasCloud's edit
|
|
220
|
+
* endpoints answer "index 0 out of range"). An unlisted model, or one with
|
|
221
|
+
* no declared tasks, is left to the provider.
|
|
222
|
+
*/
|
|
223
|
+
async function assertTextToImageModel(provider, modelId) {
|
|
224
|
+
if (typeof provider.getAvailableImageModels !== "function") {
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
const model = (await provider.getAvailableImageModels()).find((candidate) => candidate.id === modelId);
|
|
228
|
+
const tasks = model?.supportedTasks;
|
|
229
|
+
if (model && tasks?.length && !tasks.includes("text_to_image")) {
|
|
230
|
+
throw new Error(`${model.name || modelId} only edits images and needs an input image. ` +
|
|
231
|
+
"Choose a model that creates images from text.");
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* One-shot model calls that skip the chat thread and the workflow runner:
|
|
236
|
+
* the streamed `inference` command, and the direct text / media / speech
|
|
237
|
+
* generation the sketch, timeline and Studio surfaces drive over RPC.
|
|
238
|
+
*/
|
|
239
|
+
export class DirectInferenceHandler {
|
|
240
|
+
session;
|
|
241
|
+
deps;
|
|
242
|
+
constructor(session, deps) {
|
|
243
|
+
this.session = session;
|
|
244
|
+
this.deps = deps;
|
|
245
|
+
}
|
|
246
|
+
async handleInference(data, requestSeq, signal) {
|
|
247
|
+
const providerId = isString(data.provider)
|
|
248
|
+
? data.provider
|
|
249
|
+
: this.deps.defaults.provider;
|
|
250
|
+
const model = isString(data.model) ? data.model : this.deps.defaults.model;
|
|
251
|
+
const rawMessages = Array.isArray(data.messages) ? data.messages : [];
|
|
252
|
+
log.debug("Inference request", {
|
|
253
|
+
model,
|
|
254
|
+
provider: providerId,
|
|
255
|
+
messages: rawMessages.length
|
|
256
|
+
});
|
|
257
|
+
const messages = rawMessages.map((m) => {
|
|
258
|
+
const msg = m;
|
|
259
|
+
return {
|
|
260
|
+
role: (isString(msg.role)
|
|
261
|
+
? msg.role
|
|
262
|
+
: "user"),
|
|
263
|
+
content: isString(msg.content)
|
|
264
|
+
? msg.content
|
|
265
|
+
: Array.isArray(msg.content)
|
|
266
|
+
? msg.content
|
|
267
|
+
: "",
|
|
268
|
+
toolCallId: isString(msg.toolCallId) ? msg.toolCallId : null,
|
|
269
|
+
toolCalls: Array.isArray(msg.toolCalls)
|
|
270
|
+
? msg.toolCalls
|
|
271
|
+
: null,
|
|
272
|
+
threadId: null
|
|
273
|
+
};
|
|
274
|
+
});
|
|
275
|
+
if (!this.session.resolveProvider) {
|
|
276
|
+
await this.session.send({
|
|
277
|
+
type: "error",
|
|
278
|
+
message: "No provider resolver configured"
|
|
279
|
+
});
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
const rawTools = Array.isArray(data.tools) ? data.tools : [];
|
|
283
|
+
const tools = rawTools
|
|
284
|
+
.map((t) => {
|
|
285
|
+
const tool = t;
|
|
286
|
+
return {
|
|
287
|
+
name: isString(tool.name) ? tool.name : "",
|
|
288
|
+
description: isString(tool.description)
|
|
289
|
+
? tool.description
|
|
290
|
+
: undefined,
|
|
291
|
+
inputSchema: typeof tool.inputSchema === "object"
|
|
292
|
+
? tool.inputSchema
|
|
293
|
+
: undefined
|
|
294
|
+
};
|
|
295
|
+
})
|
|
296
|
+
.filter((t) => t.name.length > 0);
|
|
297
|
+
const provider = await this.session.resolveProvider(providerId, this.session.requireUserId());
|
|
298
|
+
for await (const item of provider.generateMessagesTraced({
|
|
299
|
+
messages,
|
|
300
|
+
model,
|
|
301
|
+
tools: tools.length > 0 ? tools : undefined,
|
|
302
|
+
signal
|
|
303
|
+
})) {
|
|
304
|
+
if (requestSeq !== this.deps.currentRequestSeq())
|
|
305
|
+
break; // cancelled
|
|
306
|
+
if (isToolCall(item)) {
|
|
307
|
+
log.info("Tool call", { tool: item.name, args: item.args });
|
|
308
|
+
await this.session.send({
|
|
309
|
+
type: "tool_call",
|
|
310
|
+
id: item.id,
|
|
311
|
+
name: item.name,
|
|
312
|
+
args: item.args,
|
|
313
|
+
seq: requestSeq
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
else if (item.type === "chunk") {
|
|
317
|
+
await this.session.send({ ...item, seq: requestSeq });
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
if (requestSeq === this.deps.currentRequestSeq()) {
|
|
321
|
+
log.debug("Inference complete");
|
|
322
|
+
await this.session.send({ type: "inference_done", seq: requestSeq });
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Run a one-shot text generation and return the answer — no chat thread, no
|
|
327
|
+
* job row, no workflow. The text twin of `runDirectMediaGeneration`, and
|
|
328
|
+
* what a surface calls when it needs a model to write or decide one thing.
|
|
329
|
+
*
|
|
330
|
+
* With a schema the call is structured output: the model is forced through
|
|
331
|
+
* one tool whose input schema is that shape, and the parsed object comes
|
|
332
|
+
* back in `data`. `generateStructured` owns that mechanism, shared with the
|
|
333
|
+
* Director node and the agent nodes, so a schema answered here and a schema
|
|
334
|
+
* answered in a workflow are answered the same way.
|
|
335
|
+
*/
|
|
336
|
+
async runDirectTextGeneration(req) {
|
|
337
|
+
if (!this.session.resolveProvider) {
|
|
338
|
+
throw new Error("No provider resolver configured");
|
|
339
|
+
}
|
|
340
|
+
if (!req.model) {
|
|
341
|
+
throw new Error("model is required");
|
|
342
|
+
}
|
|
343
|
+
if (req.messages.length === 0) {
|
|
344
|
+
throw new Error("prompt or messages is required");
|
|
345
|
+
}
|
|
346
|
+
const userId = this.session.requireUserId();
|
|
347
|
+
const provider = await this.session.resolveProvider(req.provider, userId);
|
|
348
|
+
if (req.provider !== "nodetool") {
|
|
349
|
+
// BYOK: the user's own keys, never metered.
|
|
350
|
+
return this.runDirectTextGenerationInner(req, provider);
|
|
351
|
+
}
|
|
352
|
+
// NodeTool's managed provider: admit against the balance (including
|
|
353
|
+
// in-flight reservations), hold the estimate for the duration of the call
|
|
354
|
+
// so concurrent requests admit against each other, and record the real
|
|
355
|
+
// token cost as a prediction row so the balance decrements.
|
|
356
|
+
const estimatedUsd = estimateDirectTextSpend(req);
|
|
357
|
+
const decision = await admitSpend(userId, estimatedUsd, [req.model]);
|
|
358
|
+
if (!decision.allowed) {
|
|
359
|
+
throw new Error(decision.reason);
|
|
360
|
+
}
|
|
361
|
+
const reservationKey = `text:${randomUUID()}`;
|
|
362
|
+
reserveSpend(userId, reservationKey, estimatedUsd);
|
|
363
|
+
try {
|
|
364
|
+
const result = await this.runDirectTextGenerationInner(req, provider);
|
|
365
|
+
// The estimate deliberately over-books, so the tracked token cost is
|
|
366
|
+
// the charge — never the reservation.
|
|
367
|
+
const cost = provider.getTotalCost();
|
|
368
|
+
if (cost > 0) {
|
|
369
|
+
try {
|
|
370
|
+
await Prediction.create({
|
|
371
|
+
user_id: userId,
|
|
372
|
+
provider: "nodetool",
|
|
373
|
+
model: req.model,
|
|
374
|
+
node_type: req.schema ? "direct.structured" : "direct.text",
|
|
375
|
+
cost,
|
|
376
|
+
currency: "USD",
|
|
377
|
+
billing_unit: "tokens",
|
|
378
|
+
quantity: 1,
|
|
379
|
+
workflow_id: null,
|
|
380
|
+
node_id: "",
|
|
381
|
+
status: "completed"
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
catch (err) {
|
|
385
|
+
this.session.logError("direct text cost persistence failed", err);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
return result;
|
|
389
|
+
}
|
|
390
|
+
finally {
|
|
391
|
+
releaseSpend(userId, reservationKey);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* The provider call itself. Runs under an abort signal registered on the
|
|
396
|
+
* connection, so a `stop` command or a dropped socket interrupts a model
|
|
397
|
+
* that is still generating instead of billing for an answer nobody reads.
|
|
398
|
+
*/
|
|
399
|
+
async runDirectTextGenerationInner(req, provider) {
|
|
400
|
+
const messages = req.messages.map((m) => ({
|
|
401
|
+
role: (m.role === "system" || m.role === "assistant" || m.role === "tool"
|
|
402
|
+
? m.role
|
|
403
|
+
: "user"),
|
|
404
|
+
content: m.content,
|
|
405
|
+
toolCallId: null,
|
|
406
|
+
toolCalls: null,
|
|
407
|
+
threadId: null
|
|
408
|
+
}));
|
|
409
|
+
const abort = new AbortController();
|
|
410
|
+
const deregister = this.deps.registerAbort(abort);
|
|
411
|
+
try {
|
|
412
|
+
if (req.schema) {
|
|
413
|
+
const data = await generateStructured(provider, {
|
|
414
|
+
messages,
|
|
415
|
+
model: req.model,
|
|
416
|
+
maxTokens: req.maxTokens,
|
|
417
|
+
toolName: req.schemaName,
|
|
418
|
+
toolDescription: req.schemaDescription,
|
|
419
|
+
schema: req.schema,
|
|
420
|
+
signal: abort.signal
|
|
421
|
+
});
|
|
422
|
+
return { text: "", data };
|
|
423
|
+
}
|
|
424
|
+
const result = await provider.generateMessageTraced({
|
|
425
|
+
messages,
|
|
426
|
+
model: req.model,
|
|
427
|
+
maxTokens: req.maxTokens,
|
|
428
|
+
signal: abort.signal
|
|
429
|
+
});
|
|
430
|
+
return { text: messageText(result.content), data: null };
|
|
431
|
+
}
|
|
432
|
+
finally {
|
|
433
|
+
deregister();
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Run a one-shot media-generation request (text-to-image, image-to-image,
|
|
438
|
+
* text-to-video, or text-to-audio) and return the produced asset ids.
|
|
439
|
+
* Mirrors the image / image_edit / video / audio branches of
|
|
440
|
+
* `handleMediaGenerationMessage` but skips the chat-thread machinery —
|
|
441
|
+
* the caller wants asset ids, not a streamed Message row.
|
|
442
|
+
*
|
|
443
|
+
* Used by the `generate_media` RPC for the sketch editor's direct-gen
|
|
444
|
+
* image layers and the timeline's direct-gen video / audio clips; the
|
|
445
|
+
* chat-path equivalents stay in `handleMediaGenerationMessage` for now.
|
|
446
|
+
*/
|
|
447
|
+
async runDirectMediaGeneration(req) {
|
|
448
|
+
if (!this.session.resolveProvider) {
|
|
449
|
+
throw new Error("No provider resolver configured");
|
|
450
|
+
}
|
|
451
|
+
if (!req.model) {
|
|
452
|
+
throw new Error("model is required");
|
|
453
|
+
}
|
|
454
|
+
if (!req.prompt || !req.prompt.trim()) {
|
|
455
|
+
throw new Error("prompt is required");
|
|
456
|
+
}
|
|
457
|
+
if (req.mode !== "video_edit" && (req.referenceAssetIds?.length || req.entityIds?.length)) {
|
|
458
|
+
throw new Error("Entity and reference asset ids require video_edit mode");
|
|
459
|
+
}
|
|
460
|
+
if (req.capability === "reference_to_video") {
|
|
461
|
+
if (req.mode !== "video") {
|
|
462
|
+
throw new Error("reference_to_video requires video mode");
|
|
463
|
+
}
|
|
464
|
+
if (req.sourceAssetId) {
|
|
465
|
+
throw new Error("reference_to_video uses reference_images and reference_videos, not source_asset_id");
|
|
466
|
+
}
|
|
467
|
+
if (!req.referenceImages?.length && !req.referenceVideos?.length) {
|
|
468
|
+
throw new Error("reference_to_video requires at least one reference image or video");
|
|
469
|
+
}
|
|
470
|
+
if (req.useReferenceVideoAudio && !req.referenceVideos?.length) {
|
|
471
|
+
throw new Error("Reference video audio requires at least one reference video");
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
else if ((req.referenceImages?.length && req.mode !== "video_edit") ||
|
|
475
|
+
req.referenceVideos?.length ||
|
|
476
|
+
req.useReferenceVideoAudio !== undefined) {
|
|
477
|
+
throw new Error("Reference inputs require the reference_to_video capability");
|
|
478
|
+
}
|
|
479
|
+
const userId = this.session.requireUserId();
|
|
480
|
+
if (req.projectId && req.projectId !== "default") {
|
|
481
|
+
await Project.requireOwned(userId, req.projectId);
|
|
482
|
+
}
|
|
483
|
+
await assertTimelineGenerationAllowed(userId, req);
|
|
484
|
+
const videoEditReferenceIds = req.mode === "video_edit"
|
|
485
|
+
? await resolveVideoEditReferenceIds(userId, req)
|
|
486
|
+
: undefined;
|
|
487
|
+
if (videoEditReferenceIds) {
|
|
488
|
+
await assertTimelineGenerationAllowed(userId, req, videoEditReferenceIds.assetIds);
|
|
489
|
+
}
|
|
490
|
+
const provider = await this.session.resolveProvider(req.provider, userId);
|
|
491
|
+
const videoEditReferences = videoEditReferenceIds ? {
|
|
492
|
+
...videoEditReferenceIds,
|
|
493
|
+
images: await resolveReferenceAssets(userId, videoEditReferenceIds.assetIds.map(asset_id => ({ asset_id })), "image")
|
|
494
|
+
} : undefined;
|
|
495
|
+
if (req.mode === "video_edit" || req.mode === "video_extend") {
|
|
496
|
+
const extension = req.mode === "video_extend";
|
|
497
|
+
const task = extension ? "extend_video" : "video_to_video";
|
|
498
|
+
const context = req.sourceContext;
|
|
499
|
+
if (!req.sourceAssetId) {
|
|
500
|
+
throw new Error(`source_asset_id is required for ${req.mode}`);
|
|
501
|
+
}
|
|
502
|
+
if (extension &&
|
|
503
|
+
(!context ||
|
|
504
|
+
(req.extensionMode !== "start" && req.extensionMode !== "end") ||
|
|
505
|
+
!Number.isFinite(req.durationSeconds) ||
|
|
506
|
+
(req.durationSeconds ?? 0) <= 0 ||
|
|
507
|
+
(req.variations !== undefined && req.variations !== 1))) {
|
|
508
|
+
throw new Error("video_extend requires source_context, start/end extension_mode, a positive duration and one variation");
|
|
509
|
+
}
|
|
510
|
+
if (context && context.sourceAssetId !== req.sourceAssetId) {
|
|
511
|
+
throw new Error("source_context does not match source_asset_id");
|
|
512
|
+
}
|
|
513
|
+
if (context &&
|
|
514
|
+
(!Number.isFinite(context.sourceStartMs) ||
|
|
515
|
+
!Number.isFinite(context.sourceEndMs) ||
|
|
516
|
+
context.sourceStartMs < 0 ||
|
|
517
|
+
context.sourceEndMs <= context.sourceStartMs ||
|
|
518
|
+
!Number.isFinite(context.timelineDurationMs) ||
|
|
519
|
+
context.timelineDurationMs <= 0 ||
|
|
520
|
+
!Number.isFinite(context.speedMultiplier) ||
|
|
521
|
+
context.speedMultiplier <= 0 ||
|
|
522
|
+
(!extension && context.speedMultiplier !== 1) ||
|
|
523
|
+
Math.abs(context.sourceEndMs -
|
|
524
|
+
(context.sourceStartMs +
|
|
525
|
+
context.timelineDurationMs * context.speedMultiplier)) > 0.5)) {
|
|
526
|
+
throw new Error("source_context contains an invalid constant-speed window");
|
|
527
|
+
}
|
|
528
|
+
if (typeof provider.getCapabilities === "function" &&
|
|
529
|
+
!provider.getCapabilities().includes(task)) {
|
|
530
|
+
throw new Error(`Provider ${req.provider} does not support the ${task} task`);
|
|
531
|
+
}
|
|
532
|
+
if (typeof provider.getAvailableVideoModels === "function") {
|
|
533
|
+
const model = (await provider.getAvailableVideoModels()).find((candidate) => candidate.id === req.model);
|
|
534
|
+
if (!model?.supportedTasks?.includes(task)) {
|
|
535
|
+
throw new Error(`Model ${req.model} does not support the ${task} task`);
|
|
536
|
+
}
|
|
537
|
+
if (videoEditReferences?.assetIds.length &&
|
|
538
|
+
!model.supportedTasks.includes("video_to_video_reference")) {
|
|
539
|
+
throw new Error(`Model ${req.model} does not support video edit reference images`);
|
|
540
|
+
}
|
|
541
|
+
if (extension &&
|
|
542
|
+
model.durations?.length &&
|
|
543
|
+
!model.durations.includes(req.durationSeconds ?? 0)) {
|
|
544
|
+
throw new Error("Choose a supported extension duration.");
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
else if (videoEditReferences?.assetIds.length) {
|
|
548
|
+
throw new Error(`Model ${req.model} has no video edit reference capabilities`);
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
if (req.provider !== "nodetool") {
|
|
552
|
+
// BYOK: the user's own keys, never metered.
|
|
553
|
+
try {
|
|
554
|
+
return await this.runDirectMediaGenerationInner(req, provider, undefined, videoEditReferences);
|
|
555
|
+
}
|
|
556
|
+
catch (error) {
|
|
557
|
+
if (error instanceof GenerationAlreadyAcceptedError) {
|
|
558
|
+
return {
|
|
559
|
+
asset_ids: [],
|
|
560
|
+
existing_generation_id: error.generationId
|
|
561
|
+
};
|
|
562
|
+
}
|
|
563
|
+
throw error;
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
// NodeTool's managed provider: admit against the balance (including
|
|
567
|
+
// in-flight reservations), reserve the unit-price estimate for the
|
|
568
|
+
// duration of the call, and record the spend as a prediction row so the
|
|
569
|
+
// balance actually decrements. Cost is the larger of the delegate's own
|
|
570
|
+
// tracked cost and the unit-price estimate — fal-style delegates bill
|
|
571
|
+
// per unit and track nothing themselves.
|
|
572
|
+
const variations = Math.max(1, Math.min(Number(req.variations ?? 1), 8));
|
|
573
|
+
const effectiveDurationSeconds = req.mode === "video_extend"
|
|
574
|
+
? req.durationSeconds
|
|
575
|
+
: req.sourceContext
|
|
576
|
+
? req.sourceContext.timelineDurationMs / 1000
|
|
577
|
+
: req.durationSeconds;
|
|
578
|
+
// What the request states about the job, in the vocabulary the catalogs
|
|
579
|
+
// bill in — a per-second video model prices the clip asked for, not one
|
|
580
|
+
// second of it.
|
|
581
|
+
const priceParams = extractPricingParams({
|
|
582
|
+
resolution: req.resolution,
|
|
583
|
+
duration_seconds: effectiveDurationSeconds,
|
|
584
|
+
width: req.width,
|
|
585
|
+
height: req.height
|
|
586
|
+
});
|
|
587
|
+
const unit = getModelUnitPrice({ id: req.model, provider: "nodetool" }, priceParams);
|
|
588
|
+
const unitPrice = unit && !unit.declined && isFiniteNumber(unit.unit_price)
|
|
589
|
+
? unit.unit_price
|
|
590
|
+
: 0;
|
|
591
|
+
const estimatedUsd = unitPrice * variations;
|
|
592
|
+
const decision = await admitSpend(userId, estimatedUsd, [req.model]);
|
|
593
|
+
if (!decision.allowed) {
|
|
594
|
+
throw new Error(decision.reason);
|
|
595
|
+
}
|
|
596
|
+
const reservationKey = `media:${randomUUID()}`;
|
|
597
|
+
reserveSpend(userId, reservationKey, estimatedUsd);
|
|
598
|
+
try {
|
|
599
|
+
// The generation seam writes the row (docs/media-generation-tracking-
|
|
600
|
+
// design.md § 8, S5). The managed provider's charge is the larger of the
|
|
601
|
+
// delegate's own tracked cost and the unit-price estimate — fal-style
|
|
602
|
+
// delegates bill per unit and track nothing themselves — and reaches the
|
|
603
|
+
// row as the receipt, which wins over the catalog.
|
|
604
|
+
const generationIds = [];
|
|
605
|
+
let result;
|
|
606
|
+
try {
|
|
607
|
+
result = await this.runDirectMediaGenerationInner(req, provider, {
|
|
608
|
+
generationIds,
|
|
609
|
+
statedCost: (tracked) => {
|
|
610
|
+
const cost = Math.max(tracked, estimatedUsd);
|
|
611
|
+
return cost > 0
|
|
612
|
+
? {
|
|
613
|
+
amount: cost,
|
|
614
|
+
currency: "USD",
|
|
615
|
+
billing_unit: unit?.billing_unit ?? null,
|
|
616
|
+
quantity: variations,
|
|
617
|
+
unit_price: cost / variations
|
|
618
|
+
}
|
|
619
|
+
: null;
|
|
620
|
+
}
|
|
621
|
+
}, videoEditReferences);
|
|
622
|
+
}
|
|
623
|
+
catch (error) {
|
|
624
|
+
if (error instanceof GenerationAlreadyAcceptedError) {
|
|
625
|
+
return {
|
|
626
|
+
asset_ids: [],
|
|
627
|
+
existing_generation_id: error.generationId
|
|
628
|
+
};
|
|
629
|
+
}
|
|
630
|
+
throw error;
|
|
631
|
+
}
|
|
632
|
+
// The tracker writes best-effort and says so in its own log; the
|
|
633
|
+
// managed path is the one that decrements a balance, so a row that did
|
|
634
|
+
// not land is reported on the session as well.
|
|
635
|
+
for (const id of generationIds) {
|
|
636
|
+
try {
|
|
637
|
+
const row = await Prediction.findForUser(userId, id);
|
|
638
|
+
if (!row || row.status !== "completed") {
|
|
639
|
+
throw new Error(`generation ${id} has no completed row`);
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
catch (err) {
|
|
643
|
+
this.session.logError("direct media cost persistence failed", err);
|
|
644
|
+
break;
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
return result;
|
|
648
|
+
}
|
|
649
|
+
finally {
|
|
650
|
+
releaseSpend(userId, reservationKey);
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
async runDirectMediaGenerationInner(req, provider, metering, videoEditReferences) {
|
|
654
|
+
const userId = this.session.requireUserId();
|
|
655
|
+
const variations = Math.max(1, Math.min(Number(req.variations ?? 1), 8));
|
|
656
|
+
const { generate, seamAssetId, storeAsset } = createGenerationRun({
|
|
657
|
+
userId,
|
|
658
|
+
providerId: req.provider,
|
|
659
|
+
modelId: req.model,
|
|
660
|
+
provider,
|
|
661
|
+
origin: { surface: "rpc", request_id: req.requestId ?? null },
|
|
662
|
+
workflowId: null,
|
|
663
|
+
projectId: req.projectId ?? null,
|
|
664
|
+
assetNamePrefix: req.mode,
|
|
665
|
+
destination: req.destination,
|
|
666
|
+
// The row names the RPC mode the way it always did.
|
|
667
|
+
nodeType: () => `direct.${req.mode}`,
|
|
668
|
+
// The delegate's running total, read once the assets are stored, as the
|
|
669
|
+
// row always recorded it: a fal-style delegate tracks nothing and the
|
|
670
|
+
// estimate wins. A test double may be a bare object; only a real
|
|
671
|
+
// provider tracks.
|
|
672
|
+
receiptAfterPersist: () => {
|
|
673
|
+
if (!metering)
|
|
674
|
+
return null;
|
|
675
|
+
const tracked = typeof provider.getTotalCost === "function"
|
|
676
|
+
? provider.getTotalCost()
|
|
677
|
+
: 0;
|
|
678
|
+
const stated = metering.statedCost(tracked);
|
|
679
|
+
return stated ? { cost: stated } : null;
|
|
680
|
+
},
|
|
681
|
+
onGenerationId: (id) => metering?.generationIds.push(id)
|
|
682
|
+
});
|
|
683
|
+
// Entity mentions in the prompt (`entity://<id>`, written by @-mention
|
|
684
|
+
// pickers) expand against the library here: name inline, descriptor into
|
|
685
|
+
// a Consistency references block, reference image routed into the
|
|
686
|
+
// generation inputs below — the same rule node prompts get through
|
|
687
|
+
// mapPromptAssetsToInputs. A mention that resolves to no entity drops.
|
|
688
|
+
const { prompt, referenceImages } = videoEditReferences
|
|
689
|
+
? { prompt: videoEditReferences.prompt, referenceImages: [] }
|
|
690
|
+
: await expandEntitiesForGeneration(req.prompt, entityRefResolver(userId));
|
|
691
|
+
const entityImageBytes = await resolveEntityReferenceImages(userId, referenceImages);
|
|
692
|
+
// Image modes are pixel-addressed on several providers (GPT Image's
|
|
693
|
+
// `size`): derive explicit dimensions from the resolution tier + aspect
|
|
694
|
+
// ratio when the caller sent none — the same numbers the generation nodes
|
|
695
|
+
// always computed. Caller-supplied pixels win.
|
|
696
|
+
const imageSize = req.mode === "image" || req.mode === "image_edit"
|
|
697
|
+
? (resolveImageSize(req.resolution, req.aspectRatio) ?? undefined)
|
|
698
|
+
: undefined;
|
|
699
|
+
const width = req.width ?? imageSize?.width;
|
|
700
|
+
const height = req.height ?? imageSize?.height;
|
|
701
|
+
if (req.mode === "video") {
|
|
702
|
+
const videoModel = {
|
|
703
|
+
id: req.model,
|
|
704
|
+
name: req.model,
|
|
705
|
+
provider: req.provider
|
|
706
|
+
};
|
|
707
|
+
const videoParams = {
|
|
708
|
+
prompt,
|
|
709
|
+
aspect_ratio: req.aspectRatio ?? null,
|
|
710
|
+
resolution: req.resolution ?? null,
|
|
711
|
+
duration_seconds: req.durationSeconds ?? null
|
|
712
|
+
};
|
|
713
|
+
let generated;
|
|
714
|
+
if (req.capability === "reference_to_video") {
|
|
715
|
+
const referenceImages = await resolveReferenceAssets(userId, req.referenceImages ?? [], "image");
|
|
716
|
+
const referenceVideos = await resolveReferenceAssets(userId, req.referenceVideos ?? [], "video");
|
|
717
|
+
generated = await generate("reference_to_video", {
|
|
718
|
+
...videoParams,
|
|
719
|
+
reference_images: referenceImages,
|
|
720
|
+
reference_videos: referenceVideos,
|
|
721
|
+
use_reference_video_audio: req.useReferenceVideoAudio
|
|
722
|
+
}, { mime: "video/mp4" }, (abort) => provider.referenceToVideo({ images: referenceImages, videos: referenceVideos }, {
|
|
723
|
+
model: videoModel,
|
|
724
|
+
prompt,
|
|
725
|
+
durationSeconds: req.durationSeconds ?? null,
|
|
726
|
+
aspectRatio: req.aspectRatio ?? null,
|
|
727
|
+
resolution: req.resolution ?? null,
|
|
728
|
+
useReferenceVideoAudio: req.useReferenceVideoAudio,
|
|
729
|
+
signal: abort
|
|
730
|
+
}));
|
|
731
|
+
}
|
|
732
|
+
else if (req.sourceAssetId) {
|
|
733
|
+
// A source image turns the request into image-to-video: the image is
|
|
734
|
+
// the frame the animation starts from.
|
|
735
|
+
const sourceBytes = await retrieveSourceAssetBytes(userId, req.sourceAssetId);
|
|
736
|
+
const i2vParams = {
|
|
737
|
+
model: videoModel,
|
|
738
|
+
prompt,
|
|
739
|
+
aspectRatio: req.aspectRatio ?? null,
|
|
740
|
+
resolution: req.resolution ?? null,
|
|
741
|
+
durationSeconds: req.durationSeconds ?? null
|
|
742
|
+
};
|
|
743
|
+
generated = await generate("image_to_video", { ...videoParams, images: [sourceBytes] }, { mime: "video/mp4" }, (abort) => provider.imageToVideo(sourceBytes, { ...i2vParams, signal: abort }));
|
|
744
|
+
}
|
|
745
|
+
else {
|
|
746
|
+
const params = {
|
|
747
|
+
model: videoModel,
|
|
748
|
+
prompt,
|
|
749
|
+
durationSeconds: req.durationSeconds ?? null
|
|
750
|
+
};
|
|
751
|
+
generated = await generate("text_to_video", videoParams, { mime: "video/mp4" }, (abort) => provider.textToVideo({ ...params, signal: abort }));
|
|
752
|
+
}
|
|
753
|
+
const assetId = seamAssetId(generated) ??
|
|
754
|
+
(await storeAsset(generated.output, "video/mp4", "mp4"));
|
|
755
|
+
return { asset_ids: [assetId] };
|
|
756
|
+
}
|
|
757
|
+
if (req.mode === "video_edit" || req.mode === "video_extend") {
|
|
758
|
+
if (!req.sourceAssetId) {
|
|
759
|
+
throw new Error(`source_asset_id is required for ${req.mode}`);
|
|
760
|
+
}
|
|
761
|
+
const sourceBytes = await retrieveSourceAssetBytes(userId, req.sourceAssetId);
|
|
762
|
+
const editSource = req.sourceContext
|
|
763
|
+
? await trimVideoWindow(sourceBytes, req.sourceContext.sourceStartMs, req.sourceContext.sourceEndMs)
|
|
764
|
+
: sourceBytes;
|
|
765
|
+
const videoModel = {
|
|
766
|
+
id: req.model,
|
|
767
|
+
name: req.model,
|
|
768
|
+
provider: req.provider
|
|
769
|
+
};
|
|
770
|
+
if (req.mode === "video_extend") {
|
|
771
|
+
if (!req.extensionMode || !req.durationSeconds) {
|
|
772
|
+
throw new Error("Extension mode and duration are required.");
|
|
773
|
+
}
|
|
774
|
+
const params = {
|
|
775
|
+
model: videoModel,
|
|
776
|
+
prompt,
|
|
777
|
+
mode: req.extensionMode,
|
|
778
|
+
durationSeconds: req.durationSeconds
|
|
779
|
+
};
|
|
780
|
+
const generated = await generate("extend_video", {
|
|
781
|
+
prompt,
|
|
782
|
+
video: editSource,
|
|
783
|
+
mode: params.mode,
|
|
784
|
+
duration_seconds: params.durationSeconds,
|
|
785
|
+
source_context: req.sourceContext
|
|
786
|
+
}, { mime: "video/mp4" }, () => provider.extendVideo(editSource, params));
|
|
787
|
+
const assetId = seamAssetId(generated) ??
|
|
788
|
+
(await storeAsset(generated.output, "video/mp4", "mp4"));
|
|
789
|
+
return { asset_ids: [assetId] };
|
|
790
|
+
}
|
|
791
|
+
const editParams = {
|
|
792
|
+
prompt,
|
|
793
|
+
strength: req.strength ?? null,
|
|
794
|
+
duration_seconds: req.sourceContext
|
|
795
|
+
? req.sourceContext.timelineDurationMs / 1000
|
|
796
|
+
: (req.durationSeconds ?? null),
|
|
797
|
+
resolution: req.resolution ?? null,
|
|
798
|
+
video: editSource
|
|
799
|
+
};
|
|
800
|
+
if (req.sourceContext) {
|
|
801
|
+
editParams.source_context = req.sourceContext;
|
|
802
|
+
}
|
|
803
|
+
const references = videoEditReferences?.assetIds.length
|
|
804
|
+
? {
|
|
805
|
+
referenceImages: videoEditReferences.images,
|
|
806
|
+
referenceAssetIds: videoEditReferences.assetIds
|
|
807
|
+
}
|
|
808
|
+
: {};
|
|
809
|
+
if (videoEditReferences?.assetIds.length) {
|
|
810
|
+
editParams.reference_images = videoEditReferences.images;
|
|
811
|
+
editParams.reference_asset_ids = videoEditReferences.assetIds;
|
|
812
|
+
}
|
|
813
|
+
const referenceProvenance = {
|
|
814
|
+
referenceAssetIds: videoEditReferences?.assetIds ?? [],
|
|
815
|
+
entityIds: videoEditReferences?.entityIds ?? []
|
|
816
|
+
};
|
|
817
|
+
editParams.entity_ids = referenceProvenance.entityIds;
|
|
818
|
+
editParams.media_edit_references = referenceProvenance;
|
|
819
|
+
const generated = await generate("video_to_video", editParams, { mime: "video/mp4" }, (signal) => provider.videoToVideo(editSource, {
|
|
820
|
+
...references,
|
|
821
|
+
signal,
|
|
822
|
+
model: videoModel,
|
|
823
|
+
prompt,
|
|
824
|
+
strength: req.strength ?? null,
|
|
825
|
+
durationSeconds: req.sourceContext
|
|
826
|
+
? req.sourceContext.timelineDurationMs / 1000
|
|
827
|
+
: (req.durationSeconds ?? null),
|
|
828
|
+
resolution: req.resolution ?? null
|
|
829
|
+
}));
|
|
830
|
+
const assetId = seamAssetId(generated) ??
|
|
831
|
+
(await storeAsset(generated.output, "video/mp4", "mp4"));
|
|
832
|
+
const result = { asset_ids: [assetId] };
|
|
833
|
+
if (referenceProvenance.referenceAssetIds.length || referenceProvenance.entityIds.length) {
|
|
834
|
+
result.media_edit_references = referenceProvenance;
|
|
835
|
+
}
|
|
836
|
+
return result;
|
|
837
|
+
}
|
|
838
|
+
if (req.mode === "audio" || req.mode === "music") {
|
|
839
|
+
const supportedFormats = new Set([
|
|
840
|
+
"mp3",
|
|
841
|
+
"wav",
|
|
842
|
+
"flac",
|
|
843
|
+
"ogg",
|
|
844
|
+
"aac",
|
|
845
|
+
"pcm"
|
|
846
|
+
]);
|
|
847
|
+
const requestedFormat = req.audioFormat && supportedFormats.has(req.audioFormat)
|
|
848
|
+
? req.audioFormat
|
|
849
|
+
: null;
|
|
850
|
+
const audioGenerationId = randomUUID();
|
|
851
|
+
const generated = await generate(req.mode === "music" ? "text_to_music" : "text_to_speech", req.mode === "music"
|
|
852
|
+
? { prompt, duration_seconds: req.durationSeconds }
|
|
853
|
+
: {
|
|
854
|
+
text: prompt,
|
|
855
|
+
voice: req.voice,
|
|
856
|
+
speed: req.speed,
|
|
857
|
+
language: req.language,
|
|
858
|
+
instructions: req.instructions,
|
|
859
|
+
audio_format: requestedFormat
|
|
860
|
+
}, null, async () => {
|
|
861
|
+
const speech = req.mode === "music"
|
|
862
|
+
? await generateMusicBytes(provider, {
|
|
863
|
+
model: {
|
|
864
|
+
id: req.model,
|
|
865
|
+
name: req.model,
|
|
866
|
+
provider: req.provider
|
|
867
|
+
},
|
|
868
|
+
prompt,
|
|
869
|
+
durationSeconds: req.durationSeconds
|
|
870
|
+
})
|
|
871
|
+
: await generateSpeechBytes(provider, {
|
|
872
|
+
text: prompt,
|
|
873
|
+
model: req.model,
|
|
874
|
+
voice: req.voice,
|
|
875
|
+
speed: req.speed,
|
|
876
|
+
language: req.language,
|
|
877
|
+
instructions: req.instructions,
|
|
878
|
+
audioFormat: requestedFormat
|
|
879
|
+
});
|
|
880
|
+
if (!speech)
|
|
881
|
+
throw new Error("Provider returned no audio data");
|
|
882
|
+
return storeAsset(speech.bytes, speech.mimeType, speech.ext);
|
|
883
|
+
}, audioGenerationId);
|
|
884
|
+
await linkGenerationAssets([audioGenerationId], [generated.output]);
|
|
885
|
+
return { asset_ids: [generated.output] };
|
|
886
|
+
}
|
|
887
|
+
const imageModel = {
|
|
888
|
+
id: req.model,
|
|
889
|
+
name: req.model,
|
|
890
|
+
provider: req.provider
|
|
891
|
+
};
|
|
892
|
+
let generated;
|
|
893
|
+
if (req.mode === "image" && entityImageBytes.length > 0) {
|
|
894
|
+
// A mentioned entity carries a reference image: the generation becomes
|
|
895
|
+
// an edit against those images, mirroring how node prompts with
|
|
896
|
+
// entity images route through ImageToImage. The provider throws when
|
|
897
|
+
// the chosen model cannot take input images.
|
|
898
|
+
const params = {
|
|
899
|
+
model: imageModel,
|
|
900
|
+
prompt,
|
|
901
|
+
targetWidth: width ?? null,
|
|
902
|
+
targetHeight: height ?? null,
|
|
903
|
+
aspectRatio: req.aspectRatio ?? null,
|
|
904
|
+
resolution: req.resolution ?? null,
|
|
905
|
+
strength: req.strength ?? null,
|
|
906
|
+
numInferenceSteps: req.numInferenceSteps ?? null
|
|
907
|
+
};
|
|
908
|
+
generated = await generate("image_to_image", {
|
|
909
|
+
prompt,
|
|
910
|
+
target_width: width ?? null,
|
|
911
|
+
target_height: height ?? null,
|
|
912
|
+
aspect_ratio: req.aspectRatio ?? null,
|
|
913
|
+
resolution: req.resolution ?? null,
|
|
914
|
+
strength: req.strength ?? null,
|
|
915
|
+
num_images: variations,
|
|
916
|
+
images: entityImageBytes
|
|
917
|
+
}, {}, (abort) => provider.imageToImages(entityImageBytes, { ...params, signal: abort }, variations));
|
|
918
|
+
}
|
|
919
|
+
else if (req.mode === "image") {
|
|
920
|
+
await assertTextToImageModel(provider, req.model);
|
|
921
|
+
const params = {
|
|
922
|
+
model: imageModel,
|
|
923
|
+
prompt,
|
|
924
|
+
width,
|
|
925
|
+
height,
|
|
926
|
+
aspectRatio: req.aspectRatio ?? null,
|
|
927
|
+
resolution: req.resolution ?? null,
|
|
928
|
+
seed: req.seed ?? null
|
|
929
|
+
};
|
|
930
|
+
generated = await generate("text_to_image", {
|
|
931
|
+
prompt,
|
|
932
|
+
width,
|
|
933
|
+
height,
|
|
934
|
+
aspect_ratio: req.aspectRatio ?? null,
|
|
935
|
+
resolution: req.resolution ?? null,
|
|
936
|
+
seed: req.seed ?? null,
|
|
937
|
+
num_images: variations
|
|
938
|
+
}, {}, (abort) => provider.textToImages({ ...params, signal: abort }, variations));
|
|
939
|
+
}
|
|
940
|
+
else if (req.mode === "inpaint") {
|
|
941
|
+
if (!req.sourceAssetId) {
|
|
942
|
+
throw new Error("source_asset_id is required for inpaint");
|
|
943
|
+
}
|
|
944
|
+
if (!req.maskAssetId) {
|
|
945
|
+
throw new Error("mask_asset_id is required for inpaint");
|
|
946
|
+
}
|
|
947
|
+
const adapter = getAssetAdapter();
|
|
948
|
+
const [sourceAsset, maskAsset] = await Promise.all([
|
|
949
|
+
Asset.find(userId, req.sourceAssetId),
|
|
950
|
+
Asset.find(userId, req.maskAssetId)
|
|
951
|
+
]);
|
|
952
|
+
if (!sourceAsset)
|
|
953
|
+
throw new Error(`Source asset not found: ${req.sourceAssetId}`);
|
|
954
|
+
if (!maskAsset)
|
|
955
|
+
throw new Error(`Mask asset not found: ${req.maskAssetId}`);
|
|
956
|
+
const [sourceBytes, maskBytes] = await Promise.all([
|
|
957
|
+
retrieveAssetBytes(adapter, userId, req.sourceAssetId, sourceAsset.content_type),
|
|
958
|
+
retrieveAssetBytes(adapter, userId, req.maskAssetId, maskAsset.content_type)
|
|
959
|
+
]);
|
|
960
|
+
if (!sourceBytes)
|
|
961
|
+
throw new Error(`Source asset bytes not found: ${req.sourceAssetId}`);
|
|
962
|
+
if (!maskBytes)
|
|
963
|
+
throw new Error(`Mask asset bytes not found: ${req.maskAssetId}`);
|
|
964
|
+
const params = {
|
|
965
|
+
model: imageModel,
|
|
966
|
+
prompt,
|
|
967
|
+
targetWidth: req.width ?? null,
|
|
968
|
+
targetHeight: req.height ?? null,
|
|
969
|
+
aspectRatio: req.aspectRatio ?? null,
|
|
970
|
+
resolution: req.resolution ?? null,
|
|
971
|
+
strength: req.strength ?? null,
|
|
972
|
+
numInferenceSteps: req.numInferenceSteps ?? null,
|
|
973
|
+
mask: maskBytes
|
|
974
|
+
};
|
|
975
|
+
generated = await generate("inpainting", {
|
|
976
|
+
prompt,
|
|
977
|
+
target_width: req.width ?? null,
|
|
978
|
+
target_height: req.height ?? null,
|
|
979
|
+
strength: req.strength ?? null,
|
|
980
|
+
num_images: variations,
|
|
981
|
+
images: [sourceBytes],
|
|
982
|
+
mask: maskBytes
|
|
983
|
+
}, {}, (abort) => provider.inpaintImages([sourceBytes], { ...params, signal: abort }, variations));
|
|
984
|
+
}
|
|
985
|
+
else {
|
|
986
|
+
if (!req.sourceAssetId) {
|
|
987
|
+
throw new Error("source_asset_id is required for image_edit");
|
|
988
|
+
}
|
|
989
|
+
const sourceAsset = await Asset.find(userId, req.sourceAssetId);
|
|
990
|
+
if (!sourceAsset) {
|
|
991
|
+
throw new Error(`Source asset not found: ${req.sourceAssetId}`);
|
|
992
|
+
}
|
|
993
|
+
const sourceBytes = await retrieveAssetBytes(getAssetAdapter(), userId, req.sourceAssetId, sourceAsset.content_type);
|
|
994
|
+
if (!sourceBytes) {
|
|
995
|
+
throw new Error(`Source asset bytes not found: ${req.sourceAssetId}`);
|
|
996
|
+
}
|
|
997
|
+
const params = {
|
|
998
|
+
model: imageModel,
|
|
999
|
+
prompt,
|
|
1000
|
+
targetWidth: width ?? null,
|
|
1001
|
+
targetHeight: height ?? null,
|
|
1002
|
+
aspectRatio: req.aspectRatio ?? null,
|
|
1003
|
+
resolution: req.resolution ?? null,
|
|
1004
|
+
strength: req.strength ?? null,
|
|
1005
|
+
numInferenceSteps: req.numInferenceSteps ?? null
|
|
1006
|
+
};
|
|
1007
|
+
generated = await generate("image_to_image", {
|
|
1008
|
+
prompt,
|
|
1009
|
+
target_width: width ?? null,
|
|
1010
|
+
target_height: height ?? null,
|
|
1011
|
+
aspect_ratio: req.aspectRatio ?? null,
|
|
1012
|
+
resolution: req.resolution ?? null,
|
|
1013
|
+
strength: req.strength ?? null,
|
|
1014
|
+
num_inference_steps: req.numInferenceSteps ?? null,
|
|
1015
|
+
num_images: variations,
|
|
1016
|
+
images: [sourceBytes, ...entityImageBytes]
|
|
1017
|
+
}, {}, (abort) => provider.imageToImages([sourceBytes, ...entityImageBytes], { ...params, signal: abort }, variations));
|
|
1018
|
+
}
|
|
1019
|
+
const assetIds = [];
|
|
1020
|
+
for (const [index, bytes] of generated.output.entries()) {
|
|
1021
|
+
const mimeType = detectImageMime(bytes);
|
|
1022
|
+
assetIds.push(seamAssetId(generated, index) ??
|
|
1023
|
+
(await storeAsset(bytes, mimeType, IMAGE_MIME_TO_EXT[mimeType] ?? "png")));
|
|
1024
|
+
}
|
|
1025
|
+
return { asset_ids: assetIds };
|
|
1026
|
+
}
|
|
1027
|
+
/**
|
|
1028
|
+
* Transcribe a stored audio asset to word-level caption timing. Mirrors the
|
|
1029
|
+
* provider path used by the ASR node but skips the workflow machinery — the
|
|
1030
|
+
* caller (Studio transcript beats) wants `{ word, startMs, endMs }[]` back in
|
|
1031
|
+
* one shot. Timestamps are returned in milliseconds relative to the start of
|
|
1032
|
+
* the audio.
|
|
1033
|
+
*/
|
|
1034
|
+
async runDirectTranscription(req) {
|
|
1035
|
+
if (!this.session.resolveProvider) {
|
|
1036
|
+
throw new Error("No provider resolver configured");
|
|
1037
|
+
}
|
|
1038
|
+
if (!req.model) {
|
|
1039
|
+
throw new Error("model is required");
|
|
1040
|
+
}
|
|
1041
|
+
if (!req.assetId) {
|
|
1042
|
+
throw new Error("asset_id is required");
|
|
1043
|
+
}
|
|
1044
|
+
const userId = this.session.requireUserId();
|
|
1045
|
+
if (req.provider === "nodetool") {
|
|
1046
|
+
const creditDecision = await admitSpend(userId, 0, [req.model]);
|
|
1047
|
+
if (!creditDecision.allowed) {
|
|
1048
|
+
throw new Error(creditDecision.reason);
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
1051
|
+
const asset = await Asset.find(userId, req.assetId);
|
|
1052
|
+
if (!asset) {
|
|
1053
|
+
throw new Error(`Audio asset not found: ${req.assetId}`);
|
|
1054
|
+
}
|
|
1055
|
+
const bytes = await retrieveAssetBytes(getAssetAdapter(), userId, req.assetId, asset.content_type);
|
|
1056
|
+
if (!bytes) {
|
|
1057
|
+
throw new Error(`Audio asset bytes not found: ${req.assetId}`);
|
|
1058
|
+
}
|
|
1059
|
+
const provider = await this.session.resolveProvider(req.provider, userId);
|
|
1060
|
+
const result = await provider.automaticSpeechRecognition({
|
|
1061
|
+
audio: bytes,
|
|
1062
|
+
model: req.model,
|
|
1063
|
+
language: req.language,
|
|
1064
|
+
word_timestamps: true
|
|
1065
|
+
});
|
|
1066
|
+
// Metered provider: record what the delegate tracked so the spend lands
|
|
1067
|
+
// in the ledger the balance is computed from. Best-effort, never throws.
|
|
1068
|
+
if (req.provider === "nodetool" && provider.getTotalCost() > 0) {
|
|
1069
|
+
try {
|
|
1070
|
+
await Prediction.create({
|
|
1071
|
+
user_id: userId,
|
|
1072
|
+
provider: "nodetool",
|
|
1073
|
+
model: req.model,
|
|
1074
|
+
node_type: "direct.transcription",
|
|
1075
|
+
cost: provider.getTotalCost(),
|
|
1076
|
+
currency: "USD",
|
|
1077
|
+
workflow_id: null,
|
|
1078
|
+
node_id: "",
|
|
1079
|
+
status: "completed"
|
|
1080
|
+
});
|
|
1081
|
+
}
|
|
1082
|
+
catch (err) {
|
|
1083
|
+
this.session.logError("direct transcription cost persistence failed", err);
|
|
1084
|
+
}
|
|
1085
|
+
}
|
|
1086
|
+
const words = (result.chunks ?? [])
|
|
1087
|
+
.map((chunk) => ({
|
|
1088
|
+
word: chunk.text.trim(),
|
|
1089
|
+
startMs: Math.round(chunk.timestamp[0] * 1000),
|
|
1090
|
+
endMs: Math.round(chunk.timestamp[1] * 1000)
|
|
1091
|
+
}))
|
|
1092
|
+
.filter((w) => w.word.length > 0);
|
|
1093
|
+
return { text: result.text, words };
|
|
1094
|
+
}
|
|
1095
|
+
}
|
|
1096
|
+
/** Resolve protection from authorized persisted documents, never client-reported policy. */
|
|
1097
|
+
async function assertTimelineGenerationAllowed(userId, req, resolvedReferenceIds = []) {
|
|
1098
|
+
const context = req.timelineContext ?? (req.sourceContext ? { sequenceId: req.sourceContext.sequenceId, sourceClipId: req.sourceContext.clipId } : undefined);
|
|
1099
|
+
if (!context) {
|
|
1100
|
+
return;
|
|
1101
|
+
}
|
|
1102
|
+
const sequenceIds = await findFinishResourceIds("timeline", context.sequenceId, userId, req.projectId ?? undefined);
|
|
1103
|
+
if (!req.timelineContext && sequenceIds.length === 0) {
|
|
1104
|
+
return;
|
|
1105
|
+
}
|
|
1106
|
+
if (sequenceIds.length !== 1) {
|
|
1107
|
+
throw new Error("Timeline generation context was not found uniquely in the caller's project.");
|
|
1108
|
+
}
|
|
1109
|
+
const sequence = await TimelineSequence.findById(sequenceIds[0]);
|
|
1110
|
+
if (!sequence || sequence.user_id !== userId || (req.projectId && req.projectId !== sequence.project_id)) {
|
|
1111
|
+
throw new Error("Timeline generation context was not found in the caller's project.");
|
|
1112
|
+
}
|
|
1113
|
+
const clips = sequence.toDocument().clips;
|
|
1114
|
+
const resolveClip = (id) => {
|
|
1115
|
+
const matches = clips.filter(clip => clip.id === id || (/^[a-f0-9]{12}$/.test(id) && clip.id.startsWith(id)));
|
|
1116
|
+
if (matches.length > 1) {
|
|
1117
|
+
throw new Error("Timeline generation clip prefix is ambiguous.");
|
|
1118
|
+
}
|
|
1119
|
+
return matches[0];
|
|
1120
|
+
};
|
|
1121
|
+
const source = context.sourceClipId ? resolveClip(context.sourceClipId) : undefined;
|
|
1122
|
+
if (context.sourceClipId && (!source || source.currentAssetId !== req.sourceAssetId)) {
|
|
1123
|
+
throw new Error("Timeline generation source changed or was not found. Save and retry.");
|
|
1124
|
+
}
|
|
1125
|
+
const target = context.targetClipId ? resolveClip(context.targetClipId) : undefined;
|
|
1126
|
+
const referencedAssets = new Set([
|
|
1127
|
+
...(req.referenceAssetIds ?? []),
|
|
1128
|
+
...resolvedReferenceIds,
|
|
1129
|
+
...(req.referenceImages ?? []).map(ref => referenceAssetId(ref, "image")),
|
|
1130
|
+
...(req.referenceVideos ?? []).map(ref => referenceAssetId(ref, "video"))
|
|
1131
|
+
]);
|
|
1132
|
+
const referencedClips = clips.filter(clip => clip.currentAssetId && referencedAssets.has(clip.currentAssetId));
|
|
1133
|
+
for (const clip of [source, target, ...referencedClips]) {
|
|
1134
|
+
if (!clip?.storyboardBoardId) {
|
|
1135
|
+
continue;
|
|
1136
|
+
}
|
|
1137
|
+
const capability = req.mode === "video" ? (req.capability ?? (req.sourceAssetId ? "image_to_video" : "text_to_video"))
|
|
1138
|
+
: req.mode === "video_edit" || req.mode === "video_extend" ? "video_to_video"
|
|
1139
|
+
: req.mode === "image_edit" || req.mode === "inpaint" ? "image_to_image" : "text_to_image";
|
|
1140
|
+
await assertStoryboardClipGenerationAllowed(userId, sequence.project_id, clip, capability);
|
|
1141
|
+
}
|
|
1142
|
+
}
|
|
1143
|
+
//# sourceMappingURL=inference.js.map
|