@@ -34,7 +34,10 @@ import {
3434 updateWorkflowGroup ,
3535} from '@/lib/table/workflow-groups/service'
3636import { resolveActiveWorkflowApplicationContext } from '@/lib/workflows/application/context'
37- import type { ResolveWorkflowOutputsResult } from '@/lib/workflows/application/resolve-workflow-outputs'
37+ import type {
38+ ResolveDeployedWorkflowOutputsResult ,
39+ ResolveWorkflowOutputsResult ,
40+ } from '@/lib/workflows/application/resolve-workflow-outputs'
3841import { loadResolvedDeployedWorkflowOutputs } from '@/lib/workflows/application/resolve-workflow-outputs'
3942import { getEnrichment } from '@/enrichments/registry'
4043import type { EnrichmentConfig } from '@/enrichments/types'
@@ -59,7 +62,7 @@ function groupFromTable(table: TableDefinition, groupId: string): WorkflowGroup
5962async function resolveWorkflowForAuthorizedTableCommand (
6063 workflowId : string ,
6164 workspaceId : string
62- ) : Promise < ResolveWorkflowOutputsResult > {
65+ ) : Promise < ResolveDeployedWorkflowOutputsResult > {
6366 const workflowContext = await resolveActiveWorkflowApplicationContext ( {
6467 workflowId,
6568 assertedWorkspaceId : workspaceId ,
@@ -70,7 +73,7 @@ async function resolveWorkflowForAuthorizedTableCommand(
7073async function resolveRelatedWorkflowForTableRoute (
7174 workflowId : string ,
7275 workspaceId : string
73- ) : Promise < ResolveWorkflowOutputsResult > {
76+ ) : Promise < ResolveDeployedWorkflowOutputsResult > {
7477 try {
7578 return await resolveWorkflowForAuthorizedTableCommand ( workflowId , workspaceId )
7679 } catch ( error ) {
@@ -245,6 +248,7 @@ export const createTableGroupUseCase = defineAuthorizedTableUseCase({
245248 * with a backing workflow and workflow output coordinates, and only a group
246249 * with no workflow is filled from the enrichment registry.
247250 */
251+ let deploymentVersionId : string | undefined
248252 if ( input . group . workflowId ) {
249253 const resolvedWorkflow = await resolveRelatedWorkflowForTableRoute (
250254 input . group . workflowId ,
@@ -258,6 +262,7 @@ export const createTableGroupUseCase = defineAuthorizedTableUseCase({
258262 resolvedWorkflow ,
259263 input . group . workflowId
260264 )
265+ deploymentVersionId = resolvedWorkflow . deploymentVersionId
261266 } else if ( input . group . enrichmentId ) {
262267 requireKnownEnrichmentOutputIds (
263268 requireEnrichment ( input . group . enrichmentId ) ,
@@ -284,6 +289,7 @@ export const createTableGroupUseCase = defineAuthorizedTableUseCase({
284289 ...input . group ,
285290 id : groupId ,
286291 workflowId : input . group . workflowId ?? '' ,
292+ ...( deploymentVersionId ? { deploymentVersionId } : { } ) ,
287293 outputs : input . group . outputs . map ( ( output ) => ( {
288294 ...output ,
289295 blockId : output . blockId ?? '' ,
@@ -404,6 +410,7 @@ export const createWorkflowTableGroup = defineAuthorizedTableUseCase({
404410 const group : WorkflowGroup = {
405411 id : groupId ,
406412 workflowId : input . workflowId ,
413+ deploymentVersionId : resolvedWorkflow . deploymentVersionId ,
407414 ...( input . name ? { name : input . name } : { } ) ,
408415 ...( input . dependencies ? { dependencies : input . dependencies } : { } ) ,
409416 ...( input . deploymentMode ? { deploymentMode : input . deploymentMode } : { } ) ,
@@ -719,9 +726,10 @@ export const updateTableGroupUseCase = defineAuthorizedTableUseCase({
719726 const workflowMetadataRequired =
720727 input . workflowId !== undefined ||
721728 outputCoordinatesToValidate . length > 0 ||
722- ( input . mappingUpdates ?. length ?? 0 ) > 0
729+ ( input . mappingUpdates ?. length ?? 0 ) > 0 ||
730+ input . inputMappings !== undefined
723731 const targetWorkflowId = input . workflowId ?? previousGroup ?. workflowId
724- let resolvedWorkflow : ResolveWorkflowOutputsResult | undefined
732+ let resolvedWorkflow : ResolveDeployedWorkflowOutputsResult | undefined
725733 if ( workflowMetadataRequired ) {
726734 if ( ! targetWorkflowId ) {
727735 throw new OrchestrationError ( 'not_found' , 'Workflow not found' )
@@ -730,8 +738,19 @@ export const updateTableGroupUseCase = defineAuthorizedTableUseCase({
730738 targetWorkflowId ,
731739 context . workspaceId
732740 )
733- if ( outputCoordinatesToValidate . length > 0 ) {
734- validateRequestedOutputs ( outputCoordinatesToValidate , resolvedWorkflow , targetWorkflowId )
741+ const remappedPreviousOutputs = ( previousGroup ?. outputs ?? [ ] ) . map ( ( output ) => {
742+ const mapping = input . mappingUpdates ?. find (
743+ ( candidate ) => candidate . columnName === output . columnName
744+ )
745+ return mapping ? { ...output , blockId : mapping . blockId , path : mapping . path } : output
746+ } )
747+ const resultingOutputs = input . outputs ?? remappedPreviousOutputs
748+ const deploymentChanged =
749+ resolvedWorkflow . deploymentVersionId !== previousGroup ?. deploymentVersionId
750+ const coordinatesToValidate =
751+ workflowChanged || deploymentChanged ? resultingOutputs : outputCoordinatesToValidate
752+ if ( coordinatesToValidate . length > 0 ) {
753+ validateRequestedOutputs ( coordinatesToValidate , resolvedWorkflow , targetWorkflowId )
735754 }
736755 }
737756 const actorUserId = attributedUserId ( principal , context . billedAccountUserId )
@@ -779,6 +798,18 @@ export const updateTableGroupUseCase = defineAuthorizedTableUseCase({
779798 : { } ) ,
780799 ...( input . mappingUpdates !== undefined ? { mappingUpdates : input . mappingUpdates } : { } ) ,
781800 ...( resolvedMappingTypes ? { resolvedMappingTypes } : { } ) ,
801+ ...( resolvedWorkflow
802+ ? {
803+ resolvedDeployment : {
804+ workflowId : resolvedWorkflow . workflowId ,
805+ deploymentVersionId : resolvedWorkflow . deploymentVersionId ,
806+ validOutputCoordinates : ( resolvedWorkflow . outputs ?? [ ] ) . map ( ( output ) => ( {
807+ blockId : output . blockId ,
808+ path : output . path ,
809+ } ) ) ,
810+ } ,
811+ }
812+ : { } ) ,
782813 ...( input . inputMappings !== undefined ? { inputMappings : input . inputMappings } : { } ) ,
783814 ...( input . deploymentMode !== undefined ? { deploymentMode : input . deploymentMode } : { } ) ,
784815 ...( input . type !== undefined ? { type : input . type } : { } ) ,
@@ -870,10 +901,19 @@ export const updateWorkflowTableGroup = defineAuthorizedTableUseCase({
870901 const resolvedWorkflow = workflowMetadataRequired
871902 ? await resolveWorkflowForAuthorizedTableCommand ( targetWorkflowId , context . workspaceId )
872903 : undefined
873- if ( input . outputs && resolvedWorkflow ) {
874- validateRequestedOutputs ( input . outputs , resolvedWorkflow , targetWorkflowId )
875- } else if ( input . workflowId && resolvedWorkflow ) {
876- validateRequestedOutputs ( previousGroup . outputs , resolvedWorkflow , targetWorkflowId )
904+ if ( resolvedWorkflow ) {
905+ const remappedPreviousOutputs = previousGroup . outputs . map ( ( output ) => {
906+ const mapping = input . mappingUpdates ?. find (
907+ ( candidate ) => candidate . columnName === output . columnName
908+ )
909+ return mapping ? { ...output , blockId : mapping . blockId , path : mapping . path } : output
910+ } )
911+ const resultingOutputs = input . outputs ?? remappedPreviousOutputs
912+ const deploymentChanged =
913+ resolvedWorkflow . deploymentVersionId !== previousGroup . deploymentVersionId
914+ if ( input . outputs || input . workflowId || deploymentChanged ) {
915+ validateRequestedOutputs ( resultingOutputs , resolvedWorkflow , targetWorkflowId )
916+ }
877917 }
878918
879919 let outputs : WorkflowGroupOutput [ ] | undefined
@@ -970,6 +1010,18 @@ export const updateWorkflowTableGroup = defineAuthorizedTableUseCase({
9701010 ...( newOutputColumns !== undefined ? { newOutputColumns } : { } ) ,
9711011 ...( input . mappingUpdates !== undefined ? { mappingUpdates : input . mappingUpdates } : { } ) ,
9721012 ...( resolvedMappingTypes ? { resolvedMappingTypes } : { } ) ,
1013+ ...( resolvedWorkflow
1014+ ? {
1015+ resolvedDeployment : {
1016+ workflowId : resolvedWorkflow . workflowId ,
1017+ deploymentVersionId : resolvedWorkflow . deploymentVersionId ,
1018+ validOutputCoordinates : ( resolvedWorkflow . outputs ?? [ ] ) . map ( ( output ) => ( {
1019+ blockId : output . blockId ,
1020+ path : output . path ,
1021+ } ) ) ,
1022+ } ,
1023+ }
1024+ : { } ) ,
9731025 ...( input . deploymentMode !== undefined ? { deploymentMode : input . deploymentMode } : { } ) ,
9741026 ...( input . autoRun !== undefined ? { autoRun : input . autoRun } : { } ) ,
9751027 } ,
@@ -1079,6 +1131,11 @@ export const addWorkflowTableGroupOutput = defineAuthorizedTableUseCase({
10791131 context . workspaceId
10801132 )
10811133 const outputs = requireWorkflowOutputs ( resolvedWorkflow , group . workflowId )
1134+ validateRequestedOutputs (
1135+ [ ...group . outputs , { blockId : input . blockId , path : input . path } ] ,
1136+ resolvedWorkflow ,
1137+ group . workflowId
1138+ )
10821139 const output = outputs . find (
10831140 ( candidate ) => candidate . blockId === input . blockId && candidate . path === input . path
10841141 )
@@ -1101,6 +1158,7 @@ export const addWorkflowTableGroupOutput = defineAuthorizedTableUseCase({
11011158 } ) . attributedUserId ,
11021159 resolvedOutput : {
11031160 workflowId : resolvedWorkflow . workflowId ,
1161+ deploymentVersionId : resolvedWorkflow . deploymentVersionId ,
11041162 columnType : columnTypeForLeaf ( output . leafType ) ,
11051163 order : outputs . map ( ( candidate , discoveryIndex ) => {
11061164 const distance = resolvedWorkflow . executionOrderByBlockId [ candidate . blockId ]
0 commit comments