@scenario-labs/sdk 3.2.0 → 3.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +36 -0
- package/client.d.mts +20 -5
- package/client.d.mts.map +1 -1
- package/client.d.ts +20 -5
- package/client.d.ts.map +1 -1
- package/client.js +9 -0
- package/client.js.map +1 -1
- package/client.mjs +9 -0
- package/client.mjs.map +1 -1
- package/core/pagination.d.mts +42 -0
- package/core/pagination.d.mts.map +1 -1
- package/core/pagination.d.ts +42 -0
- package/core/pagination.d.ts.map +1 -1
- package/core/pagination.js +79 -1
- package/core/pagination.js.map +1 -1
- package/core/pagination.mjs +75 -0
- package/core/pagination.mjs.map +1 -1
- package/internal/utils/values.d.mts +6 -0
- package/internal/utils/values.d.mts.map +1 -1
- package/internal/utils/values.d.ts +6 -0
- package/internal/utils/values.d.ts.map +1 -1
- package/internal/utils/values.js +11 -0
- package/internal/utils/values.js.map +1 -1
- package/internal/utils/values.mjs +10 -0
- package/internal/utils/values.mjs.map +1 -1
- package/lib/asset.d.mts +1 -1
- package/lib/asset.d.ts +1 -1
- package/lib/asset.js +1 -1
- package/lib/asset.mjs +1 -1
- package/lib/generate.js +7 -7
- package/lib/generate.js.map +1 -1
- package/lib/generate.mjs +7 -7
- package/lib/generate.mjs.map +1 -1
- package/lib/job.d.mts +1 -1
- package/lib/job.d.mts.map +1 -1
- package/lib/job.d.ts +1 -1
- package/lib/job.d.ts.map +1 -1
- package/lib/job.js +5 -6
- package/lib/job.js.map +1 -1
- package/lib/job.mjs +6 -7
- package/lib/job.mjs.map +1 -1
- package/lib/models.d.mts.map +1 -1
- package/lib/models.d.ts.map +1 -1
- package/lib/models.js +7 -5
- package/lib/models.js.map +1 -1
- package/lib/models.mjs +8 -6
- package/lib/models.mjs.map +1 -1
- package/lib/query.d.mts +21 -0
- package/lib/query.d.mts.map +1 -0
- package/lib/query.d.ts +21 -0
- package/lib/query.d.ts.map +1 -0
- package/lib/query.js +36 -0
- package/lib/query.js.map +1 -0
- package/lib/query.mjs +33 -0
- package/lib/query.mjs.map +1 -0
- package/lib/scenario.d.mts +3 -0
- package/lib/scenario.d.mts.map +1 -1
- package/lib/scenario.d.ts +3 -0
- package/lib/scenario.d.ts.map +1 -1
- package/lib/scenario.js +6 -0
- package/lib/scenario.js.map +1 -1
- package/lib/scenario.mjs +6 -0
- package/lib/scenario.mjs.map +1 -1
- package/lib/scope.d.mts +27 -7
- package/lib/scope.d.mts.map +1 -1
- package/lib/scope.d.ts +27 -7
- package/lib/scope.d.ts.map +1 -1
- package/lib/scope.js +40 -7
- package/lib/scope.js.map +1 -1
- package/lib/scope.mjs +37 -7
- package/lib/scope.mjs.map +1 -1
- package/lib/upload.d.mts +11 -6
- package/lib/upload.d.mts.map +1 -1
- package/lib/upload.d.ts +11 -6
- package/lib/upload.d.ts.map +1 -1
- package/lib/upload.js +6 -7
- package/lib/upload.js.map +1 -1
- package/lib/upload.mjs +7 -8
- package/lib/upload.mjs.map +1 -1
- package/lib/workflow.d.mts +4 -2
- package/lib/workflow.d.mts.map +1 -1
- package/lib/workflow.d.ts +4 -2
- package/lib/workflow.d.ts.map +1 -1
- package/lib/workflow.js +13 -7
- package/lib/workflow.js.map +1 -1
- package/lib/workflow.mjs +14 -8
- package/lib/workflow.mjs.map +1 -1
- package/lib/workflow_converter.d.mts.map +1 -1
- package/lib/workflow_converter.d.ts.map +1 -1
- package/lib/workflow_converter.js +1 -1
- package/lib/workflow_converter.js.map +1 -1
- package/lib/workflow_converter.mjs +1 -1
- package/lib/workflow_converter.mjs.map +1 -1
- package/lib/workflow_validator.d.mts +5 -0
- package/lib/workflow_validator.d.mts.map +1 -1
- package/lib/workflow_validator.d.ts +5 -0
- package/lib/workflow_validator.d.ts.map +1 -1
- package/lib/workflow_validator.js +113 -0
- package/lib/workflow_validator.js.map +1 -1
- package/lib/workflow_validator.mjs +113 -0
- package/lib/workflow_validator.mjs.map +1 -1
- package/package.json +1 -1
- package/resources/assets/assets.d.mts +130 -31
- package/resources/assets/assets.d.mts.map +1 -1
- package/resources/assets/assets.d.ts +130 -31
- package/resources/assets/assets.d.ts.map +1 -1
- package/resources/assets/assets.js +34 -11
- package/resources/assets/assets.js.map +1 -1
- package/resources/assets/assets.mjs +34 -11
- package/resources/assets/assets.mjs.map +1 -1
- package/resources/assets/download.d.mts +24 -5
- package/resources/assets/download.d.mts.map +1 -1
- package/resources/assets/download.d.ts +24 -5
- package/resources/assets/download.d.ts.map +1 -1
- package/resources/assets/download.js +15 -3
- package/resources/assets/download.js.map +1 -1
- package/resources/assets/download.mjs +15 -3
- package/resources/assets/download.mjs.map +1 -1
- package/resources/collections/assets.d.mts.map +1 -1
- package/resources/collections/assets.d.ts.map +1 -1
- package/resources/collections/assets.js +3 -2
- package/resources/collections/assets.js.map +1 -1
- package/resources/collections/assets.mjs +3 -2
- package/resources/collections/assets.mjs.map +1 -1
- package/resources/collections/collections.d.mts.map +1 -1
- package/resources/collections/collections.d.ts.map +1 -1
- package/resources/collections/collections.js +20 -5
- package/resources/collections/collections.js.map +1 -1
- package/resources/collections/collections.mjs +20 -5
- package/resources/collections/collections.mjs.map +1 -1
- package/resources/collections/models.d.mts.map +1 -1
- package/resources/collections/models.d.ts.map +1 -1
- package/resources/collections/models.js +3 -2
- package/resources/collections/models.js.map +1 -1
- package/resources/collections/models.mjs +3 -2
- package/resources/collections/models.mjs.map +1 -1
- package/resources/generate.d.mts +1719 -225
- package/resources/generate.d.mts.map +1 -1
- package/resources/generate.d.ts +1719 -225
- package/resources/generate.d.ts.map +1 -1
- package/resources/generate.js +65 -8
- package/resources/generate.js.map +1 -1
- package/resources/generate.mjs +65 -8
- package/resources/generate.mjs.map +1 -1
- package/resources/index.d.mts +5 -2
- package/resources/index.d.mts.map +1 -1
- package/resources/index.d.ts +5 -2
- package/resources/index.d.ts.map +1 -1
- package/resources/index.js +7 -1
- package/resources/index.js.map +1 -1
- package/resources/index.mjs +3 -0
- package/resources/index.mjs.map +1 -1
- package/resources/jobs.d.mts +176 -74
- package/resources/jobs.d.mts.map +1 -1
- package/resources/jobs.d.ts +176 -74
- package/resources/jobs.d.ts.map +1 -1
- package/resources/jobs.js +16 -4
- package/resources/jobs.js.map +1 -1
- package/resources/jobs.mjs +16 -4
- package/resources/jobs.mjs.map +1 -1
- package/resources/models/description.d.mts +2 -2
- package/resources/models/description.d.mts.map +1 -1
- package/resources/models/description.d.ts +2 -2
- package/resources/models/description.d.ts.map +1 -1
- package/resources/models/description.js +6 -2
- package/resources/models/description.js.map +1 -1
- package/resources/models/description.mjs +6 -2
- package/resources/models/description.mjs.map +1 -1
- package/resources/models/examples.d.mts +120 -48
- package/resources/models/examples.d.mts.map +1 -1
- package/resources/models/examples.d.ts +120 -48
- package/resources/models/examples.d.ts.map +1 -1
- package/resources/models/examples.js +6 -2
- package/resources/models/examples.js.map +1 -1
- package/resources/models/examples.mjs +6 -2
- package/resources/models/examples.mjs.map +1 -1
- package/resources/models/index.d.mts +3 -0
- package/resources/models/index.d.mts.map +1 -1
- package/resources/models/index.d.ts +3 -0
- package/resources/models/index.d.ts.map +1 -1
- package/resources/models/index.js +7 -1
- package/resources/models/index.js.map +1 -1
- package/resources/models/index.mjs +3 -0
- package/resources/models/index.mjs.map +1 -1
- package/resources/models/models.d.mts +215 -77
- package/resources/models/models.d.mts.map +1 -1
- package/resources/models/models.d.ts +215 -77
- package/resources/models/models.d.ts.map +1 -1
- package/resources/models/models.js +52 -11
- package/resources/models/models.js.map +1 -1
- package/resources/models/models.mjs +52 -11
- package/resources/models/models.mjs.map +1 -1
- package/resources/models/presets.d.mts +1016 -0
- package/resources/models/presets.d.mts.map +1 -0
- package/resources/models/presets.d.ts +1016 -0
- package/resources/models/presets.d.ts.map +1 -0
- package/resources/models/presets.js +52 -0
- package/resources/models/presets.js.map +1 -0
- package/resources/models/presets.mjs +48 -0
- package/resources/models/presets.mjs.map +1 -0
- package/resources/models/prompt-guide.d.mts +64 -0
- package/resources/models/prompt-guide.d.mts.map +1 -0
- package/resources/models/prompt-guide.d.ts +64 -0
- package/resources/models/prompt-guide.d.ts.map +1 -0
- package/resources/models/prompt-guide.js +31 -0
- package/resources/models/prompt-guide.js.map +1 -0
- package/resources/models/prompt-guide.mjs +27 -0
- package/resources/models/prompt-guide.mjs.map +1 -0
- package/resources/models/scores.d.mts +278 -0
- package/resources/models/scores.d.mts.map +1 -0
- package/resources/models/scores.d.ts +278 -0
- package/resources/models/scores.d.ts.map +1 -0
- package/resources/models/scores.js +29 -0
- package/resources/models/scores.js.map +1 -0
- package/resources/models/scores.mjs +25 -0
- package/resources/models/scores.mjs.map +1 -0
- package/resources/models/train.d.mts +108 -45
- package/resources/models/train.d.mts.map +1 -1
- package/resources/models/train.d.ts +108 -45
- package/resources/models/train.d.ts.map +1 -1
- package/resources/models/train.js +3 -2
- package/resources/models/train.js.map +1 -1
- package/resources/models/train.mjs +3 -2
- package/resources/models/train.mjs.map +1 -1
- package/resources/models/training-images.d.mts.map +1 -1
- package/resources/models/training-images.d.ts.map +1 -1
- package/resources/models/training-images.js +5 -4
- package/resources/models/training-images.js.map +1 -1
- package/resources/models/training-images.mjs +5 -4
- package/resources/models/training-images.mjs.map +1 -1
- package/resources/projects/api-keys.d.mts +54 -0
- package/resources/projects/api-keys.d.mts.map +1 -0
- package/resources/projects/api-keys.d.ts +54 -0
- package/resources/projects/api-keys.d.ts.map +1 -0
- package/resources/projects/api-keys.js +23 -0
- package/resources/projects/api-keys.js.map +1 -0
- package/resources/projects/api-keys.mjs +19 -0
- package/resources/projects/api-keys.mjs.map +1 -0
- package/resources/projects/brief.d.mts +149 -0
- package/resources/projects/brief.d.mts.map +1 -0
- package/resources/projects/brief.d.ts +149 -0
- package/resources/projects/brief.d.ts.map +1 -0
- package/resources/projects/brief.js +28 -0
- package/resources/projects/brief.js.map +1 -0
- package/resources/projects/brief.mjs +24 -0
- package/resources/projects/brief.mjs.map +1 -0
- package/resources/projects/index.d.mts +9 -0
- package/resources/projects/index.d.mts.map +1 -0
- package/resources/projects/index.d.ts +9 -0
- package/resources/projects/index.d.ts.map +1 -0
- package/resources/projects/index.js +21 -0
- package/resources/projects/index.js.map +1 -0
- package/resources/projects/index.mjs +10 -0
- package/resources/projects/index.mjs.map +1 -0
- package/resources/projects/instructions.d.mts +102 -0
- package/resources/projects/instructions.d.mts.map +1 -0
- package/resources/projects/instructions.d.ts +102 -0
- package/resources/projects/instructions.d.ts.map +1 -0
- package/resources/projects/instructions.js +24 -0
- package/resources/projects/instructions.js.map +1 -0
- package/resources/projects/instructions.mjs +20 -0
- package/resources/projects/instructions.mjs.map +1 -0
- package/resources/projects/members.d.mts +788 -0
- package/resources/projects/members.d.mts.map +1 -0
- package/resources/projects/members.d.ts +788 -0
- package/resources/projects/members.d.ts.map +1 -0
- package/resources/projects/members.js +30 -0
- package/resources/projects/members.js.map +1 -0
- package/resources/projects/members.mjs +26 -0
- package/resources/projects/members.mjs.map +1 -0
- package/resources/projects/memory.d.mts +102 -0
- package/resources/projects/memory.d.mts.map +1 -0
- package/resources/projects/memory.d.ts +102 -0
- package/resources/projects/memory.d.ts.map +1 -0
- package/resources/projects/memory.js +24 -0
- package/resources/projects/memory.js.map +1 -0
- package/resources/projects/memory.mjs +20 -0
- package/resources/projects/memory.mjs.map +1 -0
- package/resources/projects/projects.d.mts +1129 -0
- package/resources/projects/projects.d.mts.map +1 -0
- package/resources/projects/projects.d.ts +1129 -0
- package/resources/projects/projects.d.ts.map +1 -0
- package/resources/projects/projects.js +79 -0
- package/resources/projects/projects.js.map +1 -0
- package/resources/projects/projects.mjs +74 -0
- package/resources/projects/projects.mjs.map +1 -0
- package/resources/projects/watermark.d.mts +459 -0
- package/resources/projects/watermark.d.mts.map +1 -0
- package/resources/projects/watermark.d.ts +459 -0
- package/resources/projects/watermark.d.ts.map +1 -0
- package/resources/projects/watermark.js +46 -0
- package/resources/projects/watermark.js.map +1 -0
- package/resources/projects/watermark.mjs +42 -0
- package/resources/projects/watermark.mjs.map +1 -0
- package/resources/projects/webhook-endpoints/events.d.mts +87 -0
- package/resources/projects/webhook-endpoints/events.d.mts.map +1 -0
- package/resources/projects/webhook-endpoints/events.d.ts +87 -0
- package/resources/projects/webhook-endpoints/events.d.ts.map +1 -0
- package/resources/projects/webhook-endpoints/events.js +28 -0
- package/resources/projects/webhook-endpoints/events.js.map +1 -0
- package/resources/projects/webhook-endpoints/events.mjs +24 -0
- package/resources/projects/webhook-endpoints/events.mjs.map +1 -0
- package/resources/projects/webhook-endpoints/index.d.mts +3 -0
- package/resources/projects/webhook-endpoints/index.d.mts.map +1 -0
- package/resources/projects/webhook-endpoints/index.d.ts +3 -0
- package/resources/projects/webhook-endpoints/index.d.ts.map +1 -0
- package/resources/projects/webhook-endpoints/index.js +9 -0
- package/resources/projects/webhook-endpoints/index.js.map +1 -0
- package/resources/projects/webhook-endpoints/index.mjs +4 -0
- package/resources/projects/webhook-endpoints/index.mjs.map +1 -0
- package/resources/projects/webhook-endpoints/webhook-endpoints.d.mts +249 -0
- package/resources/projects/webhook-endpoints/webhook-endpoints.d.mts.map +1 -0
- package/resources/projects/webhook-endpoints/webhook-endpoints.d.ts +249 -0
- package/resources/projects/webhook-endpoints/webhook-endpoints.d.ts.map +1 -0
- package/resources/projects/webhook-endpoints/webhook-endpoints.js +44 -0
- package/resources/projects/webhook-endpoints/webhook-endpoints.js.map +1 -0
- package/resources/projects/webhook-endpoints/webhook-endpoints.mjs +39 -0
- package/resources/projects/webhook-endpoints/webhook-endpoints.mjs.map +1 -0
- package/resources/projects/webhook-endpoints.d.mts +2 -0
- package/resources/projects/webhook-endpoints.d.mts.map +1 -0
- package/resources/projects/webhook-endpoints.d.ts +2 -0
- package/resources/projects/webhook-endpoints.d.ts.map +1 -0
- package/resources/projects/webhook-endpoints.js +6 -0
- package/resources/projects/webhook-endpoints.js.map +1 -0
- package/resources/projects/webhook-endpoints.mjs +3 -0
- package/resources/projects/webhook-endpoints.mjs.map +1 -0
- package/resources/projects.d.mts +2 -0
- package/resources/projects.d.mts.map +1 -0
- package/resources/projects.d.ts +2 -0
- package/resources/projects.d.ts.map +1 -0
- package/resources/projects.js +6 -0
- package/resources/projects.js.map +1 -0
- package/resources/projects.mjs +3 -0
- package/resources/projects.mjs.map +1 -0
- package/resources/recommendations.d.mts +1107 -0
- package/resources/recommendations.d.mts.map +1 -0
- package/resources/recommendations.d.ts +1107 -0
- package/resources/recommendations.d.ts.map +1 -0
- package/resources/recommendations.js +17 -0
- package/resources/recommendations.js.map +1 -0
- package/resources/recommendations.mjs +13 -0
- package/resources/recommendations.mjs.map +1 -0
- package/resources/search.d.mts.map +1 -1
- package/resources/search.d.ts.map +1 -1
- package/resources/search.js +4 -3
- package/resources/search.js.map +1 -1
- package/resources/search.mjs +4 -3
- package/resources/search.mjs.map +1 -1
- package/resources/tags.d.mts.map +1 -1
- package/resources/tags.d.ts.map +1 -1
- package/resources/tags.js +5 -1
- package/resources/tags.js.map +1 -1
- package/resources/tags.mjs +5 -1
- package/resources/tags.mjs.map +1 -1
- package/resources/teams/brief.d.mts +149 -0
- package/resources/teams/brief.d.mts.map +1 -0
- package/resources/teams/brief.d.ts +149 -0
- package/resources/teams/brief.d.ts.map +1 -0
- package/resources/teams/brief.js +28 -0
- package/resources/teams/brief.js.map +1 -0
- package/resources/teams/brief.mjs +24 -0
- package/resources/teams/brief.mjs.map +1 -0
- package/resources/teams/index.d.mts +7 -0
- package/resources/teams/index.d.mts.map +1 -0
- package/resources/teams/index.d.ts +7 -0
- package/resources/teams/index.d.ts.map +1 -0
- package/resources/teams/index.js +17 -0
- package/resources/teams/index.js.map +1 -0
- package/resources/teams/index.mjs +8 -0
- package/resources/teams/index.mjs.map +1 -0
- package/resources/teams/ip-filters.d.mts +115 -0
- package/resources/teams/ip-filters.d.mts.map +1 -0
- package/resources/teams/ip-filters.d.ts +115 -0
- package/resources/teams/ip-filters.d.ts.map +1 -0
- package/resources/teams/ip-filters.js +45 -0
- package/resources/teams/ip-filters.js.map +1 -0
- package/resources/teams/ip-filters.mjs +41 -0
- package/resources/teams/ip-filters.mjs.map +1 -0
- package/resources/teams/members.d.mts +204 -0
- package/resources/teams/members.d.mts.map +1 -0
- package/resources/teams/members.d.ts +204 -0
- package/resources/teams/members.d.ts.map +1 -0
- package/resources/teams/members.js +30 -0
- package/resources/teams/members.js.map +1 -0
- package/resources/teams/members.mjs +26 -0
- package/resources/teams/members.mjs.map +1 -0
- package/resources/teams/teams.d.mts +878 -0
- package/resources/teams/teams.d.mts.map +1 -0
- package/resources/teams/teams.d.ts +878 -0
- package/resources/teams/teams.d.ts.map +1 -0
- package/resources/teams/teams.js +66 -0
- package/resources/teams/teams.js.map +1 -0
- package/resources/teams/teams.mjs +61 -0
- package/resources/teams/teams.mjs.map +1 -0
- package/resources/teams/watermark.d.mts +459 -0
- package/resources/teams/watermark.d.mts.map +1 -0
- package/resources/teams/watermark.d.ts +459 -0
- package/resources/teams/watermark.d.ts.map +1 -0
- package/resources/teams/watermark.js +46 -0
- package/resources/teams/watermark.js.map +1 -0
- package/resources/teams/watermark.mjs +42 -0
- package/resources/teams/watermark.mjs.map +1 -0
- package/resources/teams/webhook-endpoints/events.d.mts +87 -0
- package/resources/teams/webhook-endpoints/events.d.mts.map +1 -0
- package/resources/teams/webhook-endpoints/events.d.ts +87 -0
- package/resources/teams/webhook-endpoints/events.d.ts.map +1 -0
- package/resources/teams/webhook-endpoints/events.js +28 -0
- package/resources/teams/webhook-endpoints/events.js.map +1 -0
- package/resources/teams/webhook-endpoints/events.mjs +24 -0
- package/resources/teams/webhook-endpoints/events.mjs.map +1 -0
- package/resources/teams/webhook-endpoints/index.d.mts +3 -0
- package/resources/teams/webhook-endpoints/index.d.mts.map +1 -0
- package/resources/teams/webhook-endpoints/index.d.ts +3 -0
- package/resources/teams/webhook-endpoints/index.d.ts.map +1 -0
- package/resources/teams/webhook-endpoints/index.js +9 -0
- package/resources/teams/webhook-endpoints/index.js.map +1 -0
- package/resources/teams/webhook-endpoints/index.mjs +4 -0
- package/resources/teams/webhook-endpoints/index.mjs.map +1 -0
- package/resources/teams/webhook-endpoints/webhook-endpoints.d.mts +250 -0
- package/resources/teams/webhook-endpoints/webhook-endpoints.d.mts.map +1 -0
- package/resources/teams/webhook-endpoints/webhook-endpoints.d.ts +250 -0
- package/resources/teams/webhook-endpoints/webhook-endpoints.d.ts.map +1 -0
- package/resources/teams/webhook-endpoints/webhook-endpoints.js +45 -0
- package/resources/teams/webhook-endpoints/webhook-endpoints.js.map +1 -0
- package/resources/teams/webhook-endpoints/webhook-endpoints.mjs +40 -0
- package/resources/teams/webhook-endpoints/webhook-endpoints.mjs.map +1 -0
- package/resources/teams/webhook-endpoints.d.mts +2 -0
- package/resources/teams/webhook-endpoints.d.mts.map +1 -0
- package/resources/teams/webhook-endpoints.d.ts +2 -0
- package/resources/teams/webhook-endpoints.d.ts.map +1 -0
- package/resources/teams/webhook-endpoints.js +6 -0
- package/resources/teams/webhook-endpoints.js.map +1 -0
- package/resources/teams/webhook-endpoints.mjs +3 -0
- package/resources/teams/webhook-endpoints.mjs.map +1 -0
- package/resources/teams.d.mts +2 -0
- package/resources/teams.d.mts.map +1 -0
- package/resources/teams.d.ts +2 -0
- package/resources/teams.d.ts.map +1 -0
- package/resources/teams.js +6 -0
- package/resources/teams.js.map +1 -0
- package/resources/teams.mjs +3 -0
- package/resources/teams.mjs.map +1 -0
- package/resources/uploads.d.mts.map +1 -1
- package/resources/uploads.d.ts.map +1 -1
- package/resources/uploads.js +15 -3
- package/resources/uploads.js.map +1 -1
- package/resources/uploads.mjs +15 -3
- package/resources/uploads.mjs.map +1 -1
- package/resources/usages.d.mts +51 -24
- package/resources/usages.d.mts.map +1 -1
- package/resources/usages.d.ts +51 -24
- package/resources/usages.d.ts.map +1 -1
- package/resources/usages.js +2 -1
- package/resources/usages.js.map +1 -1
- package/resources/usages.mjs +2 -1
- package/resources/usages.mjs.map +1 -1
- package/resources/workflows.d.mts +1381 -280
- package/resources/workflows.d.mts.map +1 -1
- package/resources/workflows.d.ts +1381 -280
- package/resources/workflows.d.ts.map +1 -1
- package/resources/workflows.js +39 -8
- package/resources/workflows.js.map +1 -1
- package/resources/workflows.mjs +39 -8
- package/resources/workflows.mjs.map +1 -1
- package/src/client.ts +101 -0
- package/src/core/pagination.ts +144 -0
- package/src/internal/utils/values.ts +10 -0
- package/src/lib/asset.ts +1 -1
- package/src/lib/generate.ts +7 -7
- package/src/lib/job.ts +9 -7
- package/src/lib/models.ts +8 -6
- package/src/lib/query.ts +42 -0
- package/src/lib/scenario.ts +8 -0
- package/src/lib/scope.ts +42 -7
- package/src/lib/upload.ts +20 -13
- package/src/lib/workflow.ts +21 -8
- package/src/lib/workflow_converter.ts +4 -2
- package/src/lib/workflow_validator.ts +115 -0
- package/src/resources/assets/assets.ts +192 -33
- package/src/resources/assets/download.ts +43 -8
- package/src/resources/collections/assets.ts +3 -2
- package/src/resources/collections/collections.ts +20 -5
- package/src/resources/collections/models.ts +3 -2
- package/src/resources/generate.ts +2350 -186
- package/src/resources/index.ts +34 -0
- package/src/resources/jobs.ts +204 -74
- package/src/resources/models/description.ts +10 -2
- package/src/resources/models/examples.ts +140 -46
- package/src/resources/models/index.ts +25 -0
- package/src/resources/models/models.ts +326 -88
- package/src/resources/models/presets.ts +1335 -0
- package/src/resources/models/prompt-guide.ts +102 -0
- package/src/resources/models/scores.ts +383 -0
- package/src/resources/models/train.ts +121 -46
- package/src/resources/models/training-images.ts +5 -4
- package/src/resources/projects/api-keys.ts +86 -0
- package/src/resources/projects/brief.ts +197 -0
- package/src/resources/projects/index.ts +71 -0
- package/src/resources/projects/instructions.ts +134 -0
- package/src/resources/projects/members.ts +958 -0
- package/src/resources/projects/memory.ts +134 -0
- package/src/resources/projects/projects.ts +1478 -0
- package/src/resources/projects/watermark.ts +590 -0
- package/src/resources/projects/webhook-endpoints/events.ts +179 -0
- package/src/resources/projects/webhook-endpoints/index.ts +19 -0
- package/src/resources/projects/webhook-endpoints/webhook-endpoints.ts +452 -0
- package/src/resources/projects/webhook-endpoints.ts +3 -0
- package/src/resources/projects.ts +3 -0
- package/src/resources/recommendations.ts +1502 -0
- package/src/resources/search.ts +4 -3
- package/src/resources/tags.ts +5 -1
- package/src/resources/teams/brief.ts +193 -0
- package/src/resources/teams/index.ts +62 -0
- package/src/resources/teams/ip-filters.ts +177 -0
- package/src/resources/teams/members.ts +282 -0
- package/src/resources/teams/teams.ts +1255 -0
- package/src/resources/teams/watermark.ts +590 -0
- package/src/resources/teams/webhook-endpoints/events.ts +179 -0
- package/src/resources/teams/webhook-endpoints/index.ts +19 -0
- package/src/resources/teams/webhook-endpoints/webhook-endpoints.ts +453 -0
- package/src/resources/teams/webhook-endpoints.ts +3 -0
- package/src/resources/teams.ts +3 -0
- package/src/resources/uploads.ts +15 -3
- package/src/resources/usages.ts +58 -23
- package/src/resources/workflows.ts +1707 -241
- package/src/version.ts +1 -1
- package/version.d.mts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.mjs +1 -1
package/src/lib/query.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { FinalRequestOptions } from '../internal/request-options';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Keep unset query values from erasing the client's `defaultQuery`.
|
|
5
|
+
*
|
|
6
|
+
* Generated methods build their typed query with every key, set or not:
|
|
7
|
+
* `{ dryRun, projectId, ...options?.query }` yields `projectId: undefined` when
|
|
8
|
+
* the caller did not pass one. `buildURL` then spreads that object over the
|
|
9
|
+
* client's `defaultQuery`, so the unset key erases the client-level `projectId`
|
|
10
|
+
* and the request goes out unscoped — the API then falls back to the team's
|
|
11
|
+
* default project.
|
|
12
|
+
*
|
|
13
|
+
* So, on a new object (the query may be the caller's own params object):
|
|
14
|
+
* - `undefined` is dropped everywhere (the query serializer skips it anyway);
|
|
15
|
+
* - `null` and `''` are dropped only for keys `defaultQuery` provides, so the
|
|
16
|
+
* default applies. Elsewhere they keep their usual serialization (`key=`).
|
|
17
|
+
*
|
|
18
|
+
* Called from the enhanced client's `prepareOptions`, i.e. on every request
|
|
19
|
+
* (retries included — it is idempotent).
|
|
20
|
+
*/
|
|
21
|
+
export function normalizeQuery(
|
|
22
|
+
options: FinalRequestOptions,
|
|
23
|
+
defaultQuery: Record<string, unknown> | undefined,
|
|
24
|
+
): void {
|
|
25
|
+
const query = options.query;
|
|
26
|
+
// Only plain objects: rebuilding a URLSearchParams, a Map or a class instance
|
|
27
|
+
// from its own enumerable entries would silently empty it.
|
|
28
|
+
if (typeof query !== 'object' || query === null) return;
|
|
29
|
+
const proto = Object.getPrototypeOf(query);
|
|
30
|
+
if (proto !== Object.prototype && proto !== null) return;
|
|
31
|
+
options.query = Object.fromEntries(
|
|
32
|
+
Object.entries(query).filter(
|
|
33
|
+
([key, value]) =>
|
|
34
|
+
value !== undefined &&
|
|
35
|
+
!(
|
|
36
|
+
defaultQuery &&
|
|
37
|
+
Object.prototype.hasOwnProperty.call(defaultQuery, key) &&
|
|
38
|
+
(value === null || value === '')
|
|
39
|
+
),
|
|
40
|
+
),
|
|
41
|
+
);
|
|
42
|
+
}
|
package/src/lib/scenario.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { Scenario as BaseScenario, type ClientOptions as BaseClientOptions } from '../client';
|
|
2
|
+
import type { FinalRequestOptions } from '../internal/request-options';
|
|
2
3
|
import { EnhancedAssets } from './asset';
|
|
3
4
|
import { EnhancedGenerate } from './generate';
|
|
4
5
|
import { EnhancedJobs } from './job';
|
|
5
6
|
import { EnhancedModels } from './models';
|
|
7
|
+
import { normalizeQuery } from './query';
|
|
6
8
|
import { EnhancedUploads } from './upload';
|
|
7
9
|
import { EnhancedWorkflows } from './workflow';
|
|
8
10
|
|
|
@@ -82,6 +84,12 @@ export class Scenario extends BaseScenario {
|
|
|
82
84
|
} as BaseClientOptions);
|
|
83
85
|
this.projectId = projectId ?? null;
|
|
84
86
|
}
|
|
87
|
+
|
|
88
|
+
/** Keep unset query values from erasing the client's `defaultQuery` (see `./query`). */
|
|
89
|
+
protected override async prepareOptions(options: FinalRequestOptions): Promise<void> {
|
|
90
|
+
await super.prepareOptions(options);
|
|
91
|
+
normalizeQuery(options, this.defaultQuery());
|
|
92
|
+
}
|
|
85
93
|
}
|
|
86
94
|
|
|
87
95
|
function stripKey<T extends object>(obj: T | undefined, key: string): Partial<T> | undefined {
|
package/src/lib/scope.ts
CHANGED
|
@@ -26,15 +26,50 @@ export function extractScope(options?: RequestOptions): Scope | undefined {
|
|
|
26
26
|
return { projectId };
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
+
/** Read the typed `projectId` param of a call (`params`, `query` or `body`). Returns `undefined` if absent. */
|
|
30
|
+
export function paramsProjectId(params: unknown): string | undefined {
|
|
31
|
+
if (!params || typeof params !== 'object') return undefined;
|
|
32
|
+
const projectId = (params as Record<string, unknown>)['projectId'];
|
|
33
|
+
return typeof projectId === 'string' && projectId ? projectId : undefined;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* The project a request was actually sent to, read from its final options —
|
|
38
|
+
* the ones `APIResponseProps.options` carries, after the generated method
|
|
39
|
+
* merged typed params with `options.query` and `prepareOptions` normalized
|
|
40
|
+
* the query. Its `projectId` if it holds one, else the client default that
|
|
41
|
+
* `buildURL` merges in; `undefined` with neither (e.g. API-key auth with
|
|
42
|
+
* implicit scope).
|
|
43
|
+
*
|
|
44
|
+
* Reading the request instead of predicting it from params and options keeps
|
|
45
|
+
* this right whatever the generated merge does. Capture it on enhanced
|
|
46
|
+
* entities so that follow-up helper calls (`.wait()`, `entity.run()`, ...)
|
|
47
|
+
* stay in the project the originating request went to.
|
|
48
|
+
*/
|
|
49
|
+
export function sentScope(
|
|
50
|
+
finalOptions: RequestOptions,
|
|
51
|
+
clientDefault: string | null | undefined,
|
|
52
|
+
): Scope | undefined {
|
|
53
|
+
const projectId = extractScope(finalOptions)?.projectId ?? clientDefault;
|
|
54
|
+
return projectId ? { projectId } : undefined;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Whether a call names its project itself, with a non-empty `projectId` in
|
|
59
|
+
* its typed params or in `options.query`. Only then must a scope captured
|
|
60
|
+
* earlier not be replayed over it; an unset value (`undefined`, `null`, `''`,
|
|
61
|
+
* e.g. from an optional spread) leaves the captured scope in charge.
|
|
62
|
+
*/
|
|
63
|
+
export function hasExplicitProjectId(options: RequestOptions | undefined, params: unknown): boolean {
|
|
64
|
+
return paramsProjectId(params) !== undefined || extractScope(options) !== undefined;
|
|
65
|
+
}
|
|
66
|
+
|
|
29
67
|
/**
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* 2. Otherwise, fall back to the client's default `projectId`.
|
|
33
|
-
* 3. If neither is set (e.g. API-key auth with implicit scope), return `undefined`.
|
|
68
|
+
* Two-tier resolution (`options.query.projectId`, else a fallback) that
|
|
69
|
+
* ignores typed params.
|
|
34
70
|
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
* scope and stay in sync with the call that produced them.
|
|
71
|
+
* @deprecated Predicts the scope instead of reading it from the request.
|
|
72
|
+
* Use {@link sentScope} on the final request options.
|
|
38
73
|
*/
|
|
39
74
|
export function effectiveScope(
|
|
40
75
|
options: RequestOptions | undefined,
|
package/src/lib/upload.ts
CHANGED
|
@@ -11,21 +11,26 @@ import {
|
|
|
11
11
|
type UploadTriggerActionResponse,
|
|
12
12
|
} from '../resources/uploads';
|
|
13
13
|
import type { AssetRetrieveResponse } from '../resources/assets/assets';
|
|
14
|
-
import type {
|
|
15
|
-
import
|
|
14
|
+
import type { WithAsset } from './asset';
|
|
15
|
+
import type { EnhancedModelRetrieveResponse } from './models';
|
|
16
|
+
import { type Scope, clientProjectId, sentScope, withScope } from './scope';
|
|
16
17
|
|
|
17
18
|
type UploadKind = NonNullable<UploadCreateParams['kind']>;
|
|
18
19
|
|
|
19
|
-
/**
|
|
20
|
+
/**
|
|
21
|
+
* The resolved entity returned after a successful upload, narrowed by `kind`.
|
|
22
|
+
* It comes from the enhanced `retrieve()`, so a model has `.run()` and an asset
|
|
23
|
+
* has `.download()`.
|
|
24
|
+
*/
|
|
20
25
|
export type UploadResult<K extends UploadKind> =
|
|
21
|
-
K extends 'model' ?
|
|
26
|
+
K extends 'model' ? EnhancedModelRetrieveResponse : WithAsset<AssetRetrieveResponse>;
|
|
22
27
|
|
|
23
28
|
/**
|
|
24
29
|
* Accepted upload inputs.
|
|
25
30
|
* - `string` — a local file path, read from disk (Node only; throws in browsers).
|
|
26
31
|
* - `Uint8Array` — raw bytes. `Buffer` is a `Uint8Array` and works too.
|
|
27
|
-
* - `Blob` / `File` — browser-native, or Node
|
|
28
|
-
* constructors.
|
|
32
|
+
* - `Blob` / `File` — browser-native, or in Node.js via `fs.openAsBlob()` or
|
|
33
|
+
* the `Blob` / `File` constructors.
|
|
29
34
|
*/
|
|
30
35
|
export type UploadFileInput = string | Uint8Array | Blob;
|
|
31
36
|
|
|
@@ -149,12 +154,14 @@ export type WithUpload<T extends { upload: unknown }> = T & { upload: UploadMeth
|
|
|
149
154
|
export function enhanceUpload<T extends { upload: { id: string; status: string } }>(
|
|
150
155
|
client: Scenario,
|
|
151
156
|
promise: APIPromise<T>,
|
|
152
|
-
options?: RequestOptions,
|
|
153
157
|
): APIPromise<WithUpload<T>> {
|
|
154
|
-
|
|
155
|
-
return promise._thenUnwrap((data) => ({
|
|
158
|
+
return promise._thenUnwrap((data, props) => ({
|
|
156
159
|
...data,
|
|
157
|
-
upload: Upload.from(
|
|
160
|
+
upload: Upload.from(
|
|
161
|
+
client,
|
|
162
|
+
data.upload as UploadRetrieveResponse['upload'],
|
|
163
|
+
sentScope(props.options, clientProjectId(client)),
|
|
164
|
+
),
|
|
158
165
|
}));
|
|
159
166
|
}
|
|
160
167
|
|
|
@@ -170,7 +177,7 @@ export class EnhancedUploads extends Uploads {
|
|
|
170
177
|
body: UploadCreateParams,
|
|
171
178
|
options?: RequestOptions,
|
|
172
179
|
): APIPromise<WithUpload<UploadCreateResponse>> {
|
|
173
|
-
return enhanceUpload(this._client, super.create(body, options)
|
|
180
|
+
return enhanceUpload(this._client, super.create(body, options));
|
|
174
181
|
}
|
|
175
182
|
|
|
176
183
|
override retrieve(
|
|
@@ -178,7 +185,7 @@ export class EnhancedUploads extends Uploads {
|
|
|
178
185
|
query: UploadRetrieveParams | null | undefined = {},
|
|
179
186
|
options?: RequestOptions,
|
|
180
187
|
): APIPromise<WithUpload<UploadRetrieveResponse>> {
|
|
181
|
-
return enhanceUpload(this._client, super.retrieve(uploadID, query, options)
|
|
188
|
+
return enhanceUpload(this._client, super.retrieve(uploadID, query, options));
|
|
182
189
|
}
|
|
183
190
|
|
|
184
191
|
override triggerAction(
|
|
@@ -186,7 +193,7 @@ export class EnhancedUploads extends Uploads {
|
|
|
186
193
|
body: UploadTriggerActionParams,
|
|
187
194
|
options?: RequestOptions,
|
|
188
195
|
): APIPromise<WithUpload<UploadTriggerActionResponse>> {
|
|
189
|
-
return enhanceUpload(this._client, super.triggerAction(uploadID, body, options)
|
|
196
|
+
return enhanceUpload(this._client, super.triggerAction(uploadID, body, options));
|
|
190
197
|
}
|
|
191
198
|
|
|
192
199
|
/**
|
package/src/lib/workflow.ts
CHANGED
|
@@ -4,13 +4,15 @@ import {
|
|
|
4
4
|
Workflows,
|
|
5
5
|
WorkflowUserApprovalResponse,
|
|
6
6
|
type WorkflowApproveUserParams,
|
|
7
|
+
type WorkflowUserSelectionParams,
|
|
8
|
+
type WorkflowUserSelectionResponse,
|
|
7
9
|
type WorkflowRetrieveParams,
|
|
8
10
|
type WorkflowRetrieveResponse,
|
|
9
11
|
type WorkflowRunParams,
|
|
10
12
|
type WorkflowRunResponse,
|
|
11
13
|
} from '../resources/workflows';
|
|
12
14
|
import { type WithJob, enhanceJob } from './job';
|
|
13
|
-
import { type Scope,
|
|
15
|
+
import { type Scope, hasExplicitProjectId, sentScope, withScope } from './scope';
|
|
14
16
|
import { validateWorkflowFlow } from './workflow_validator';
|
|
15
17
|
// Type-only import to break the circular `scenario.ts` ↔ `workflow.ts` graph at runtime.
|
|
16
18
|
import type { Scenario } from './scenario';
|
|
@@ -72,7 +74,10 @@ export class WorkflowEntity {
|
|
|
72
74
|
params: WorkflowRunParams,
|
|
73
75
|
options?: RequestOptions,
|
|
74
76
|
): APIPromise<WithJob<WorkflowRunResponse>> {
|
|
75
|
-
|
|
77
|
+
// The captured scope is only a fallback: an explicit `params.projectId` or
|
|
78
|
+
// `options.query.projectId` on this call wins.
|
|
79
|
+
const scope = hasExplicitProjectId(options, params) ? undefined : this._scope;
|
|
80
|
+
return this._client.workflows.run(this.id, params, withScope(scope, options));
|
|
76
81
|
}
|
|
77
82
|
|
|
78
83
|
/** @internal Create a WorkflowEntity from raw workflow data, optionally remembering the originating scope. */
|
|
@@ -96,7 +101,7 @@ export type EnhancedWorkflowRetrieveResponse = Omit<WorkflowRetrieveResponse, 'w
|
|
|
96
101
|
/**
|
|
97
102
|
* Enhanced Workflows resource.
|
|
98
103
|
* Extends the generated {@link Workflows} — all original methods are inherited.
|
|
99
|
-
* Overrides `retrieve()`, `run()`, and `
|
|
104
|
+
* Overrides `retrieve()`, `run()`, `userApproval()` and `userSelection()` to return enriched response objects.
|
|
100
105
|
*/
|
|
101
106
|
export class EnhancedWorkflows extends Workflows {
|
|
102
107
|
/**
|
|
@@ -109,10 +114,9 @@ export class EnhancedWorkflows extends Workflows {
|
|
|
109
114
|
options?: RequestOptions,
|
|
110
115
|
): APIPromise<EnhancedWorkflowRetrieveResponse> {
|
|
111
116
|
const client = this._client as Scenario;
|
|
112
|
-
|
|
113
|
-
return super.retrieve(workflowID, query, options)._thenUnwrap((data) => ({
|
|
117
|
+
return super.retrieve(workflowID, query, options)._thenUnwrap((data, props) => ({
|
|
114
118
|
...data,
|
|
115
|
-
workflow: WorkflowEntity.from(client, data.workflow,
|
|
119
|
+
workflow: WorkflowEntity.from(client, data.workflow, sentScope(props.options, client.projectId)),
|
|
116
120
|
}));
|
|
117
121
|
}
|
|
118
122
|
|
|
@@ -122,7 +126,7 @@ export class EnhancedWorkflows extends Workflows {
|
|
|
122
126
|
params: WorkflowRunParams,
|
|
123
127
|
options?: RequestOptions,
|
|
124
128
|
): APIPromise<WithJob<WorkflowRunResponse>> {
|
|
125
|
-
return enhanceJob(this._client, super.run(workflowID, params, options)
|
|
129
|
+
return enhanceJob(this._client, super.run(workflowID, params, options));
|
|
126
130
|
}
|
|
127
131
|
|
|
128
132
|
/** Approve a user approval node. Returns an enhanced response where `job` has `.wait()`. */
|
|
@@ -131,6 +135,15 @@ export class EnhancedWorkflows extends Workflows {
|
|
|
131
135
|
body: WorkflowApproveUserParams,
|
|
132
136
|
options?: RequestOptions,
|
|
133
137
|
): APIPromise<WithJob<WorkflowUserApprovalResponse>> {
|
|
134
|
-
return enhanceJob(this._client, super.userApproval(workflowID, body, options)
|
|
138
|
+
return enhanceJob(this._client, super.userApproval(workflowID, body, options));
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** Answer a user selection node. Returns an enhanced response where `job` has `.wait()`. */
|
|
142
|
+
override userSelection(
|
|
143
|
+
workflowID: string,
|
|
144
|
+
params: WorkflowUserSelectionParams,
|
|
145
|
+
options?: RequestOptions,
|
|
146
|
+
): APIPromise<WithJob<WorkflowUserSelectionResponse>> {
|
|
147
|
+
return enhanceJob(this._client, super.userSelection(workflowID, params, options));
|
|
135
148
|
}
|
|
136
149
|
}
|
|
@@ -955,8 +955,10 @@ function addRandomizeClosureToBody(
|
|
|
955
955
|
): void {
|
|
956
956
|
const nodeById = new Map(nodes.map((n) => [n.id, n]));
|
|
957
957
|
const isUnlockedRandomize = (id: string): boolean => {
|
|
958
|
-
const data = nodeById.get(id)?.data as
|
|
959
|
-
|
|
958
|
+
const data = nodeById.get(id)?.data as
|
|
959
|
+
| { mode?: SliceAssetsMode; isRandomize?: boolean; isSeedLocked?: boolean }
|
|
960
|
+
| undefined;
|
|
961
|
+
return !!data && getSliceAssetsMode(data) === 'randomize' && data.isSeedLocked !== true;
|
|
960
962
|
};
|
|
961
963
|
// edge convention: `{ source: consumer, target: provider }` — an input handle
|
|
962
964
|
// on `source` reads an output handle on `target`.
|
|
@@ -18,6 +18,7 @@ const USER_SELECTION_INPUT_TYPES = new Set(['file_array', 'string_array']);
|
|
|
18
18
|
|
|
19
19
|
type RawRef = {
|
|
20
20
|
node?: unknown;
|
|
21
|
+
equal?: unknown;
|
|
21
22
|
conditional?: unknown;
|
|
22
23
|
};
|
|
23
24
|
|
|
@@ -63,6 +64,11 @@ type RawNode = {
|
|
|
63
64
|
* - input ref.node (excluding "workflow" which is a reserved keyword)
|
|
64
65
|
* - input ref.conditional entries
|
|
65
66
|
* - loopBodyNodeIds entries
|
|
67
|
+
* 6. A node an if-else branch can skip is read through a plain `ref.node` only by nodes
|
|
68
|
+
* gated by the same branch. A node is skippable when it has a `connection` input on that
|
|
69
|
+
* branch, or when every target of one of its `ref.conditional` inputs is skippable on it.
|
|
70
|
+
* Any other reader never resolves when the branch is not taken, and the workflow job
|
|
71
|
+
* never completes. A `ref.conditional` merge reads whichever branch ran, so it is allowed.
|
|
66
72
|
*/
|
|
67
73
|
export function validateWorkflowFlow(flow: unknown[]): void {
|
|
68
74
|
const nodeIds = new Set<string>();
|
|
@@ -143,6 +149,115 @@ export function validateWorkflowFlow(flow: unknown[]): void {
|
|
|
143
149
|
}
|
|
144
150
|
}
|
|
145
151
|
}
|
|
152
|
+
|
|
153
|
+
// Pass 3 — readers of branch-gated nodes must be gated by the same branch
|
|
154
|
+
const branchGates = collectBranchGates(flow as RawNode[]);
|
|
155
|
+
if (branchGates.size === 0) return;
|
|
156
|
+
|
|
157
|
+
for (const rawNode of flow) {
|
|
158
|
+
const node = rawNode as RawNode;
|
|
159
|
+
const nodeId = node.id as string;
|
|
160
|
+
if (!Array.isArray(node.inputs)) continue;
|
|
161
|
+
const readerGates = branchGates.get(nodeId);
|
|
162
|
+
|
|
163
|
+
for (const { inputName, refNode } of collectPlainRefs(node.inputs as RawInput[])) {
|
|
164
|
+
const producerGates = branchGates.get(refNode);
|
|
165
|
+
if (!producerGates) continue;
|
|
166
|
+
const missing = [...producerGates].find((gate) => !readerGates?.has(gate));
|
|
167
|
+
if (missing) {
|
|
168
|
+
throw new Error(
|
|
169
|
+
`Node "${nodeId}" input "${inputName}" reads node "${refNode}", which the if-else branch ${missing} can skip, ` +
|
|
170
|
+
`but "${nodeId}" is not gated by that branch, so it would never run and the workflow job would never complete. ` +
|
|
171
|
+
`Gate "${nodeId}" through the same branch, or merge the branches with a conditional ref.`,
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Maps each node an if-else branch can skip to its gates, formatted as `"<ifElseId>" == "<value>"`.
|
|
180
|
+
* Direct gates come from `connection` inputs. A `ref.conditional` input whose targets all share a
|
|
181
|
+
* gate is skipped with them, so its node inherits the shared gates, through chains too.
|
|
182
|
+
*/
|
|
183
|
+
function collectBranchGates(flow: RawNode[]): Map<string, Set<string>> {
|
|
184
|
+
const ifElseIds = new Set(
|
|
185
|
+
flow.filter((n) => n.type === 'logic' && n.logicType === 'if-else').map((n) => n.id as string),
|
|
186
|
+
);
|
|
187
|
+
const gates = new Map<string, Set<string>>();
|
|
188
|
+
if (ifElseIds.size === 0) return gates;
|
|
189
|
+
|
|
190
|
+
for (const node of flow) {
|
|
191
|
+
if (!Array.isArray(node.inputs)) continue;
|
|
192
|
+
for (const input of node.inputs as RawInput[]) {
|
|
193
|
+
const ref = input.ref;
|
|
194
|
+
if (input.type !== 'connection' || typeof ref?.node !== 'string' || !ifElseIds.has(ref.node)) continue;
|
|
195
|
+
const gate = `"${ref.node}" == "${String(ref.equal)}"`;
|
|
196
|
+
const nodeGates = gates.get(node.id as string) ?? new Set<string>();
|
|
197
|
+
nodeGates.add(gate);
|
|
198
|
+
gates.set(node.id as string, nodeGates);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
let changed = true;
|
|
203
|
+
while (changed) {
|
|
204
|
+
changed = false;
|
|
205
|
+
for (const node of flow) {
|
|
206
|
+
if (!Array.isArray(node.inputs)) continue;
|
|
207
|
+
for (const targets of collectConditionalRefs(node.inputs as RawInput[])) {
|
|
208
|
+
const targetGates = targets.map((id) => gates.get(id));
|
|
209
|
+
if (targetGates.length === 0 || targetGates.some((g) => !g)) continue;
|
|
210
|
+
const [first, ...rest] = targetGates as Set<string>[];
|
|
211
|
+
const shared = [...first!].filter((gate) => rest.every((g) => g.has(gate)));
|
|
212
|
+
const nodeGates = gates.get(node.id as string) ?? new Set<string>();
|
|
213
|
+
for (const gate of shared) {
|
|
214
|
+
if (!nodeGates.has(gate)) {
|
|
215
|
+
nodeGates.add(gate);
|
|
216
|
+
changed = true;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
if (nodeGates.size > 0) gates.set(node.id as string, nodeGates);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return gates;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/** Target lists of a node's `ref.conditional` inputs, INPUTS_ARRAY sub-inputs included. */
|
|
227
|
+
function collectConditionalRefs(inputs: RawInput[]): string[][] {
|
|
228
|
+
const lists: string[][] = [];
|
|
229
|
+
for (const input of inputs) {
|
|
230
|
+
const conditional = input.ref?.conditional;
|
|
231
|
+
if (Array.isArray(conditional)) {
|
|
232
|
+
lists.push(conditional.filter((id): id is string => typeof id === 'string'));
|
|
233
|
+
}
|
|
234
|
+
if (Array.isArray(input.items)) {
|
|
235
|
+
for (const item of input.items) {
|
|
236
|
+
if (Array.isArray(item)) lists.push(...collectConditionalRefs(item as RawInput[]));
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return lists;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/** Plain `ref.node` data refs of a node's inputs, INPUTS_ARRAY sub-inputs included; `connection` inputs excluded. */
|
|
244
|
+
function collectPlainRefs(inputs: RawInput[]): Array<{ inputName: string; refNode: string }> {
|
|
245
|
+
const refs: Array<{ inputName: string; refNode: string }> = [];
|
|
246
|
+
for (const input of inputs) {
|
|
247
|
+
const refNode = input.ref?.node;
|
|
248
|
+
if (input.type !== 'connection' && typeof refNode === 'string' && refNode !== 'workflow') {
|
|
249
|
+
refs.push({
|
|
250
|
+
inputName: typeof input.name === 'string' && input.name ? input.name : '(unnamed)',
|
|
251
|
+
refNode,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
if (Array.isArray(input.items)) {
|
|
255
|
+
for (const item of input.items) {
|
|
256
|
+
if (Array.isArray(item)) refs.push(...collectPlainRefs(item as RawInput[]));
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return refs;
|
|
146
261
|
}
|
|
147
262
|
|
|
148
263
|
function validateInputRefs(nodeId: string, input: RawInput, nodeIds: Set<string>): void {
|