@open-mercato/core 0.10.1-develop.7816.1.6c959754cf → 0.10.1-develop.7821.1.e5115777cb

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.
Files changed (40) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/modules/communication_channels/workers/poll-channel.js +44 -16
  3. package/dist/modules/communication_channels/workers/poll-channel.js.map +2 -2
  4. package/dist/modules/sales/commands/documents.js +1 -1
  5. package/dist/modules/sales/commands/documents.js.map +2 -2
  6. package/dist/modules/workflows/api/definitions/[id]/route.js +15 -0
  7. package/dist/modules/workflows/api/definitions/[id]/route.js.map +2 -2
  8. package/dist/modules/workflows/api/definitions/generate/route.js +3 -1
  9. package/dist/modules/workflows/api/definitions/generate/route.js.map +2 -2
  10. package/dist/modules/workflows/api/definitions/route.js +15 -0
  11. package/dist/modules/workflows/api/definitions/route.js.map +2 -2
  12. package/dist/modules/workflows/lib/agent-result-mapping.js +3 -14
  13. package/dist/modules/workflows/lib/agent-result-mapping.js.map +2 -2
  14. package/dist/modules/workflows/lib/definition-evaluation.js +16 -2
  15. package/dist/modules/workflows/lib/definition-evaluation.js.map +2 -2
  16. package/dist/modules/workflows/lib/mapping-target-validation.js +85 -0
  17. package/dist/modules/workflows/lib/mapping-target-validation.js.map +7 -0
  18. package/dist/modules/workflows/lib/parallel-handler.js +10 -8
  19. package/dist/modules/workflows/lib/parallel-handler.js.map +2 -2
  20. package/dist/modules/workflows/lib/safe-mapping-path.js +38 -0
  21. package/dist/modules/workflows/lib/safe-mapping-path.js.map +7 -0
  22. package/dist/modules/workflows/lib/step-handler.js +5 -16
  23. package/dist/modules/workflows/lib/step-handler.js.map +2 -2
  24. package/package.json +8 -8
  25. package/src/modules/communication_channels/workers/poll-channel.ts +34 -5
  26. package/src/modules/sales/commands/documents.ts +3 -1
  27. package/src/modules/workflows/api/definitions/[id]/route.ts +17 -0
  28. package/src/modules/workflows/api/definitions/generate/route.ts +3 -1
  29. package/src/modules/workflows/api/definitions/route.ts +15 -0
  30. package/src/modules/workflows/i18n/de.json +1 -0
  31. package/src/modules/workflows/i18n/en.json +1 -0
  32. package/src/modules/workflows/i18n/es.json +1 -0
  33. package/src/modules/workflows/i18n/ko.json +1 -0
  34. package/src/modules/workflows/i18n/pl.json +1 -0
  35. package/src/modules/workflows/lib/agent-result-mapping.ts +3 -16
  36. package/src/modules/workflows/lib/definition-evaluation.ts +19 -2
  37. package/src/modules/workflows/lib/mapping-target-validation.ts +113 -0
  38. package/src/modules/workflows/lib/parallel-handler.ts +13 -9
  39. package/src/modules/workflows/lib/safe-mapping-path.ts +44 -0
  40. package/src/modules/workflows/lib/step-handler.ts +5 -32
@@ -18,6 +18,12 @@ import {
18
18
  } from "../../openapi.js";
19
19
  import { invalidateTriggerCache } from "../../../lib/event-trigger-service.js";
20
20
  import { normalizeDefinitionValidationIssues } from "../../../lib/definition-error-body.js";
21
+ import { resolveTranslations } from "@open-mercato/shared/lib/i18n/server";
22
+ import {
23
+ mappingTargetIssuesForApi,
24
+ UNSAFE_MAPPING_TARGET_MESSAGE,
25
+ UNSAFE_MAPPING_TARGET_MESSAGE_KEY
26
+ } from "../../../lib/mapping-target-validation.js";
21
27
  import { getCodeWorkflow, getAllCodeWorkflows } from "../../../lib/code-registry.js";
22
28
  import { codeWorkflowUuid } from "../../../lib/find-definition.js";
23
29
  import {
@@ -143,6 +149,15 @@ async function PUT(request, context) {
143
149
  );
144
150
  }
145
151
  const input = validation.data;
152
+ const { translate } = await resolveTranslations();
153
+ const mappingMessage = translate(UNSAFE_MAPPING_TARGET_MESSAGE_KEY, UNSAFE_MAPPING_TARGET_MESSAGE);
154
+ const mappingIssues = input.definition ? mappingTargetIssuesForApi(input.definition, ["definition"], mappingMessage) : [];
155
+ if (mappingIssues.length > 0) {
156
+ return NextResponse.json(
157
+ { error: "Validation failed", details: mappingIssues },
158
+ { status: 400 }
159
+ );
160
+ }
146
161
  const guardResult = await validateCrudMutationGuard(container, {
147
162
  tenantId: tenantId ?? "",
148
163
  organizationId: organizationId ?? null,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/modules/workflows/api/definitions/%5Bid%5D/route.ts"],
4
- "sourcesContent": ["/**\n * Workflow Definition Detail API\n *\n * Endpoints:\n * - GET /api/workflows/definitions/[id] - Get workflow definition\n * - PUT /api/workflows/definitions/[id] - Update workflow definition\n * - DELETE /api/workflows/definitions/[id] - Delete workflow definition (soft delete)\n */\n\nimport { NextRequest, NextResponse } from 'next/server'\nimport { z } from 'zod'\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'\nimport { resolveOrganizationScopeForRequest } from '@open-mercato/core/modules/directory/utils/organizationScope'\nimport { resolveOrganizationScopeFilter, resolveSingleOrganizationIdOrDeny } from '@open-mercato/core/modules/directory/utils/organizationScopeFilter'\nimport { WorkflowDefinition, WorkflowInstance } from '../../../data/entities'\nimport {\n updateWorkflowDefinitionInputSchema,\n updateWorkflowDefinitionInputCheckedSchema,\n type UpdateWorkflowDefinitionApiInput,\n} from '../../../data/validators'\nimport { serializeWorkflowDefinition, serializeCodeWorkflowDefinition } from '../serialize'\nimport {\n workflowDefinitionDetailResponseSchema,\n workflowDefinitionMutationResponseSchema,\n workflowDefinitionDeleteResponseSchema,\n workflowErrorSchema,\n} from '../../openapi'\nimport { invalidateTriggerCache } from '../../../lib/event-trigger-service'\nimport { normalizeDefinitionValidationIssues } from '../../../lib/definition-error-body'\nimport { getCodeWorkflow, getAllCodeWorkflows } from '../../../lib/code-registry'\nimport { codeWorkflowUuid } from '../../../lib/find-definition'\nimport {\n ACTIVE_WORKFLOW_INSTANCE_STATUSES,\n buildStructuralEditConflictBody,\n diffDefinitionStructure,\n} from '../../../lib/definition-edit-safety'\nimport {\n authorizeWorkflowGrantChange,\n normalizeGrantedFeatures,\n syncWorkflowDefinitionPrincipal,\n} from '../../../lib/definition-grant'\nimport { createGenericOptimisticLockReader } from '@open-mercato/shared/lib/crud/optimistic-lock'\nimport { registerOptimisticLockReaderIfAbsent } from '@open-mercato/shared/lib/crud/optimistic-lock-store'\nimport { validateCrudMutationGuard, runCrudMutationGuardAfterSuccess } from '@open-mercato/shared/lib/crud/mutation-guard'\nimport { enforceCommandOptimisticLockWithGuards } from '@open-mercato/shared/lib/crud/optimistic-lock-command'\nimport { isCrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\n\nconst logger = createLogger('workflows')\n\nregisterOptimisticLockReaderIfAbsent({\n 'workflows.definition': createGenericOptimisticLockReader({\n entity: WorkflowDefinition,\n idField: 'id',\n tenantField: 'tenantId',\n orgField: 'organizationId',\n softDeleteField: 'deletedAt',\n }),\n})\n\nexport const metadata = {\n requireAuth: true,\n requireFeatures: ['workflows.definitions.view'],\n}\n\ninterface RouteContext {\n params: Promise<{\n id: string\n }>\n}\n\n/**\n * GET /api/workflows/definitions/[id]\n *\n * Get a single workflow definition by ID\n */\nexport async function GET(\n request: NextRequest,\n context: RouteContext\n) {\n try {\n const params = await context.params\n const container = await createRequestContainer()\n const em = container.resolve('em')\n const auth = await getAuthFromRequest(request)\n\n if (!auth) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n const scope = await resolveOrganizationScopeForRequest({ container, auth, request })\n const tenantId = auth.tenantId\n const orgFilter = resolveOrganizationScopeFilter(scope, auth)\n\n // Handle code-based workflow definitions (code:<workflowId>)\n if (params.id.startsWith('code:')) {\n const workflowId = params.id.slice(5)\n const codeDef = getCodeWorkflow(workflowId)\n if (!codeDef) {\n return NextResponse.json(\n { error: 'Workflow definition not found' },\n { status: 404 }\n )\n }\n return NextResponse.json({\n data: serializeCodeWorkflowDefinition(codeDef, params.id),\n })\n }\n\n const definition = await em.findOne(WorkflowDefinition, {\n id: params.id,\n tenantId,\n ...orgFilter.where,\n deletedAt: null,\n })\n\n if (!definition) {\n // Instances started from an unpersisted code definition store the\n // deterministic codeWorkflowUuid(workflowId) as their definitionId\n // (see lib/find-definition.ts). Resolve that synthetic UUID back to\n // the code registry so lookups by instance.definitionId succeed.\n const codeDef = getAllCodeWorkflows().find(\n (workflow) => codeWorkflowUuid(workflow.workflowId) === params.id\n )\n if (codeDef) {\n return NextResponse.json({\n data: serializeCodeWorkflowDefinition(codeDef, `code:${codeDef.workflowId}`),\n })\n }\n return NextResponse.json(\n { error: 'Workflow definition not found' },\n { status: 404 }\n )\n }\n\n return NextResponse.json({ data: serializeWorkflowDefinition(definition) })\n } catch (error) {\n logger.error('Error getting workflow definition', { err: error })\n return NextResponse.json(\n { error: 'Failed to get workflow definition' },\n { status: 500 }\n )\n }\n}\n\n/**\n * PUT /api/workflows/definitions/[id]\n *\n * Update a workflow definition\n */\nexport async function PUT(\n request: NextRequest,\n context: RouteContext\n) {\n try {\n const params = await context.params\n const container = await createRequestContainer()\n const em = container.resolve('em')\n const auth = await getAuthFromRequest(request)\n\n if (!auth) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n const scope = await resolveOrganizationScopeForRequest({ container, auth, request })\n const tenantId = auth.tenantId\n const organizationId = resolveSingleOrganizationIdOrDeny(scope, auth)\n\n // Check edit permission\n const rbacService = container.resolve('rbacService')\n const hasPermission = await rbacService.userHasAllFeatures(\n auth.sub,\n ['workflows.definitions.edit'],\n {\n tenantId,\n organizationId,\n }\n )\n\n if (!hasPermission) {\n return NextResponse.json(\n { error: 'Insufficient permissions' },\n { status: 403 }\n )\n }\n\n const body = await request.json()\n\n // Validate input\n const validation = updateWorkflowDefinitionInputCheckedSchema.safeParse(body)\n if (!validation.success) {\n return NextResponse.json(\n {\n error: 'Validation failed',\n details: normalizeDefinitionValidationIssues(validation.error),\n },\n { status: 400 }\n )\n }\n\n const input: UpdateWorkflowDefinitionApiInput = validation.data\n const guardResult = await validateCrudMutationGuard(container, {\n tenantId: tenantId ?? '',\n organizationId: organizationId ?? null,\n userId: auth.sub ?? '',\n resourceKind: 'workflows.definition',\n resourceId: params.id,\n operation: 'update',\n requestMethod: 'PUT',\n requestHeaders: request.headers,\n mutationPayload: input as Record<string, unknown>,\n })\n if (guardResult && !guardResult.ok) {\n return NextResponse.json(guardResult.body, { status: guardResult.status })\n }\n\n // Handle customizing a code-based workflow definition\n if (params.id.startsWith('code:')) {\n const workflowId = params.id.slice(5)\n const codeDef = getCodeWorkflow(workflowId)\n if (!codeDef) {\n return NextResponse.json(\n { error: 'Workflow definition not found' },\n { status: 404 }\n )\n }\n\n // Check if an override already exists. Pin to the latest version so the\n // override update targets a deterministic row now that versions coexist.\n const existingOverride = await em.findOne(WorkflowDefinition, {\n workflowId: codeDef.workflowId,\n tenantId,\n }, { orderBy: { version: 'DESC' } })\n\n let savedOverride: WorkflowDefinition\n if (existingOverride) {\n try {\n await enforceCommandOptimisticLockWithGuards(container, {\n resourceKind: 'workflows.definition',\n resourceId: existingOverride.id,\n current: existingOverride.updatedAt ?? null,\n request,\n })\n } catch (lockError) {\n if (isCrudHttpError(lockError)) {\n return NextResponse.json(lockError.body, { status: lockError.status })\n }\n throw lockError\n }\n // Revive if soft-deleted, then apply updates\n existingOverride.deletedAt = null\n existingOverride.workflowName = codeDef.workflowName\n existingOverride.description = codeDef.description\n existingOverride.version = codeDef.version\n existingOverride.definition = input.definition ?? codeDef.definition\n existingOverride.metadata = codeDef.metadata ?? null\n existingOverride.enabled = input.enabled ?? codeDef.enabled\n existingOverride.codeWorkflowId = codeDef.workflowId\n existingOverride.updatedBy = auth.sub\n existingOverride.updatedAt = new Date()\n await em.flush()\n savedOverride = existingOverride\n } else {\n // Create DB override row from code definition + user changes\n const override = em.create(WorkflowDefinition, {\n workflowId: codeDef.workflowId,\n workflowName: codeDef.workflowName,\n description: codeDef.description,\n version: codeDef.version,\n definition: input.definition ?? codeDef.definition,\n metadata: codeDef.metadata,\n enabled: input.enabled ?? codeDef.enabled,\n codeWorkflowId: codeDef.workflowId,\n tenantId,\n organizationId,\n createdBy: auth.sub,\n updatedBy: auth.sub,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n\n em.persist(override)\n await em.flush()\n savedOverride = override\n }\n\n try {\n const eventBus = container.resolve('eventBus') as\n | { emitEvent(event: string, payload: unknown, options?: unknown): Promise<void> }\n | undefined\n if (eventBus && typeof eventBus.emitEvent === 'function') {\n await eventBus.emitEvent(\n 'workflows.definition.customized',\n {\n id: savedOverride.id,\n workflowId: savedOverride.workflowId,\n codeWorkflowId: savedOverride.codeWorkflowId ?? null,\n tenantId: savedOverride.tenantId,\n organizationId: savedOverride.organizationId,\n userId: auth.sub ?? null,\n },\n { tenantId: savedOverride.tenantId, organizationId: savedOverride.organizationId, persistent: true },\n )\n }\n } catch (eventError) {\n logger.error('Failed to emit workflows.definition.customized event', { err: eventError })\n }\n\n if (guardResult?.shouldRunAfterSuccess) {\n await runCrudMutationGuardAfterSuccess(container, {\n tenantId: tenantId ?? '',\n organizationId: organizationId ?? null,\n userId: auth.sub ?? '',\n resourceKind: 'workflows.definition',\n resourceId: String(savedOverride.id),\n operation: 'update',\n requestMethod: 'PUT',\n requestHeaders: request.headers,\n metadata: guardResult.metadata,\n })\n }\n\n return NextResponse.json({\n data: serializeWorkflowDefinition(savedOverride),\n message: 'Workflow definition customized successfully',\n })\n }\n\n // Find existing definition\n const definition = await em.findOne(WorkflowDefinition, {\n id: params.id,\n tenantId,\n organizationId,\n deletedAt: null,\n })\n\n if (!definition) {\n return NextResponse.json(\n { error: 'Workflow definition not found' },\n { status: 404 }\n )\n }\n\n try {\n await enforceCommandOptimisticLockWithGuards(container, {\n resourceKind: 'workflows.definition',\n resourceId: definition.id,\n current: definition.updatedAt ?? null,\n request,\n })\n } catch (lockError) {\n if (isCrudHttpError(lockError)) {\n return NextResponse.json(lockError.body, { status: lockError.status })\n }\n throw lockError\n }\n\n // Edit-safety rule (spec 4.1). Instances pin this row and the engine\n // re-reads it on every advance, so a topology rewrite would re-point routes\n // under a running instance. Structural changes are refused while instances\n // are still executing; the structured body offers the new-version remedy.\n // Cosmetic, config and metadata edits stay in-place, and the per-user draft\n // layer (a separate route) is untouched so work-in-progress stays saveable.\n if (input.definition !== undefined) {\n const structuralChanges = diffDefinitionStructure(definition.definition, input.definition)\n if (structuralChanges.length > 0) {\n const activeInstanceCount = await em.count(WorkflowInstance, {\n definitionId: definition.id,\n status: { $in: [...ACTIVE_WORKFLOW_INSTANCE_STATUSES] },\n tenantId,\n organizationId,\n deletedAt: null,\n })\n if (activeInstanceCount > 0) {\n return NextResponse.json(\n buildStructuralEditConflictBody({\n definitionId: definition.id,\n activeInstanceCount,\n changes: structuralChanges,\n }),\n { status: 409 },\n )\n }\n }\n }\n\n // Update fields. workflowId is intentionally ignored \u2014 it identifies the\n // row and renaming would break references. Version is user-managed and\n // applied when supplied so the edit form can bump it explicitly.\n if (input.workflowName !== undefined) {\n definition.workflowName = input.workflowName\n }\n if (input.description !== undefined) {\n definition.description = input.description\n }\n if (input.version !== undefined) {\n definition.version = input.version\n }\n if (input.definition !== undefined) {\n definition.definition = input.definition\n }\n if (input.metadata !== undefined) {\n definition.metadata = input.metadata\n }\n if (input.enabled !== undefined) {\n definition.enabled = input.enabled\n }\n if (input.effectiveFrom !== undefined) {\n definition.effectiveFrom = input.effectiveFrom\n }\n if (input.effectiveTo !== undefined) {\n definition.effectiveTo = input.effectiveTo\n }\n\n // Execution identity. Absent leaves the stored grant untouched; an explicit\n // value is authorised against the SAVING user's own current features (never\n // the original author's) and the principal is re-scoped before the row is\n // flushed, so the column and the role ACL can never disagree.\n if (input.grantedFeatures !== undefined) {\n const requestedGrant = normalizeGrantedFeatures(input.grantedFeatures)\n const previousGrant = normalizeGrantedFeatures(definition.grantedFeatures)\n const grantFailure = await authorizeWorkflowGrantChange(rbacService, {\n userId: auth.sub,\n scope: { tenantId, organizationId },\n requested: requestedGrant,\n current: previousGrant,\n })\n if (grantFailure) {\n return NextResponse.json(grantFailure.body, { status: grantFailure.status })\n }\n definition.grantedFeatures = requestedGrant.length ? requestedGrant : null\n // Clearing a grant re-scopes the existing principal to no features rather\n // than leaving its old ACL behind.\n await syncWorkflowDefinitionPrincipal(container, definition, { previousFeatures: previousGrant })\n }\n\n definition.updatedBy = auth.sub\n definition.updatedAt = new Date()\n\n await em.flush()\n\n if (guardResult?.shouldRunAfterSuccess) {\n await runCrudMutationGuardAfterSuccess(container, {\n tenantId: tenantId ?? '',\n organizationId: organizationId ?? null,\n userId: auth.sub ?? '',\n resourceKind: 'workflows.definition',\n resourceId: String(definition.id),\n operation: 'update',\n requestMethod: 'PUT',\n requestHeaders: request.headers,\n metadata: guardResult.metadata,\n })\n }\n\n // Embedded triggers may have changed; invalidate the in-memory cache so\n // the wildcard event subscriber reloads them on the next event.\n if (tenantId) invalidateTriggerCache(tenantId, organizationId ?? undefined)\n\n return NextResponse.json({\n data: serializeWorkflowDefinition(definition),\n message: 'Workflow definition updated successfully',\n })\n } catch (error) {\n if (isCrudHttpError(error)) return NextResponse.json(error.body, { status: error.status })\n logger.error('Error updating workflow definition', { err: error })\n return NextResponse.json(\n { error: 'Failed to update workflow definition' },\n { status: 500 }\n )\n }\n}\n\n/**\n * DELETE /api/workflows/definitions/[id]\n *\n * Soft delete a workflow definition\n */\nexport async function DELETE(\n request: NextRequest,\n context: RouteContext\n) {\n try {\n const params = await context.params\n const container = await createRequestContainer()\n const em = container.resolve('em')\n const auth = await getAuthFromRequest(request)\n\n if (!auth) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n const scope = await resolveOrganizationScopeForRequest({ container, auth, request })\n const tenantId = auth.tenantId\n const organizationId = resolveSingleOrganizationIdOrDeny(scope, auth)\n\n // Check delete permission\n const rbacService = container.resolve('rbacService')\n const hasPermission = await rbacService.userHasAllFeatures(\n auth.sub,\n ['workflows.definitions.delete'],\n {\n tenantId,\n organizationId,\n }\n )\n\n if (!hasPermission) {\n return NextResponse.json(\n { error: 'Insufficient permissions' },\n { status: 403 }\n )\n }\n\n // Find existing definition\n const definition = await em.findOne(WorkflowDefinition, {\n id: params.id,\n tenantId,\n organizationId,\n deletedAt: null,\n })\n\n if (!definition) {\n return NextResponse.json(\n { error: 'Workflow definition not found' },\n { status: 404 }\n )\n }\n\n const guardResult = await validateCrudMutationGuard(container, {\n tenantId: tenantId ?? '',\n organizationId: organizationId ?? null,\n userId: auth.sub ?? '',\n resourceKind: 'workflows.definition',\n resourceId: params.id,\n operation: 'delete',\n requestMethod: 'DELETE',\n requestHeaders: request.headers,\n })\n if (guardResult && !guardResult.ok) {\n return NextResponse.json(guardResult.body, { status: guardResult.status })\n }\n\n // Check if there are active workflow instances using this definition\n const { WorkflowInstance } = await import('../../../data/entities')\n const activeInstances = await em.count(WorkflowInstance, {\n definitionId: definition.id,\n status: { $in: ['RUNNING', 'WAITING'] },\n })\n\n if (activeInstances > 0) {\n return NextResponse.json(\n {\n error: `Cannot delete workflow definition with ${activeInstances} active instance(s)`,\n },\n { status: 409 }\n )\n }\n\n // Soft delete\n definition.deletedAt = new Date()\n definition.updatedAt = new Date()\n\n await em.flush()\n\n if (guardResult?.shouldRunAfterSuccess) {\n await runCrudMutationGuardAfterSuccess(container, {\n tenantId: tenantId ?? '',\n organizationId: organizationId ?? null,\n userId: auth.sub ?? '',\n resourceKind: 'workflows.definition',\n resourceId: String(definition.id),\n operation: 'delete',\n requestMethod: 'DELETE',\n requestHeaders: request.headers,\n metadata: guardResult.metadata,\n })\n }\n\n if (tenantId) invalidateTriggerCache(tenantId, organizationId ?? undefined)\n\n return NextResponse.json({\n message: 'Workflow definition deleted successfully',\n })\n } catch (error) {\n if (isCrudHttpError(error)) return NextResponse.json(error.body, { status: error.status })\n logger.error('Error deleting workflow definition', { err: error })\n return NextResponse.json(\n { error: 'Failed to delete workflow definition' },\n { status: 500 }\n )\n }\n}\n\nexport const openApi = {\n methods: {\n GET: {\n summary: 'Get workflow definition',\n description: 'Get a single workflow definition by ID. Returns the complete workflow structure including steps and transitions (with embedded activities).',\n tags: ['Workflows'],\n pathParams: z.object({\n id: z.string().describe('UUID for DB definitions, or \"code:<workflowId>\" for code-based definitions'),\n }),\n responses: [\n {\n status: 200,\n description: 'Workflow definition found',\n schema: workflowDefinitionDetailResponseSchema,\n example: {\n data: {\n id: '123e4567-e89b-12d3-a456-426614174000',\n workflowId: 'checkout-flow',\n workflowName: 'Checkout Flow',\n description: 'Complete checkout workflow for processing orders',\n version: 1,\n definition: {\n steps: [\n {\n stepId: 'start',\n stepName: 'Start',\n stepType: 'START',\n },\n {\n stepId: 'validate-cart',\n stepName: 'Validate Cart',\n stepType: 'AUTOMATED',\n description: 'Validate cart items and check inventory',\n },\n {\n stepId: 'payment',\n stepName: 'Process Payment',\n stepType: 'AUTOMATED',\n description: 'Charge payment method',\n retryPolicy: {\n maxAttempts: 3,\n backoffMs: 1000,\n },\n },\n {\n stepId: 'end',\n stepName: 'End',\n stepType: 'END',\n },\n ],\n transitions: [\n {\n transitionId: 'start-to-validate',\n fromStepId: 'start',\n toStepId: 'validate-cart',\n trigger: 'auto',\n },\n {\n transitionId: 'validate-to-payment',\n fromStepId: 'validate-cart',\n toStepId: 'payment',\n trigger: 'auto',\n },\n {\n transitionId: 'payment-to-end',\n fromStepId: 'payment',\n toStepId: 'end',\n trigger: 'auto',\n activities: [\n {\n activityName: 'Send Order Confirmation',\n activityType: 'SEND_EMAIL',\n config: {\n to: '{{context.customerEmail}}',\n subject: 'Order Confirmation #{{context.orderId}}',\n template: 'order_confirmation',\n },\n },\n ],\n },\n ],\n },\n enabled: true,\n tenantId: '123e4567-e89b-12d3-a456-426614174001',\n organizationId: '123e4567-e89b-12d3-a456-426614174002',\n createdAt: '2025-12-08T10:00:00.000Z',\n updatedAt: '2025-12-08T10:00:00.000Z',\n },\n },\n },\n {\n status: 404,\n description: 'Workflow definition not found',\n schema: workflowErrorSchema,\n example: {\n error: 'Workflow definition not found',\n },\n },\n ],\n },\n PUT: {\n summary: 'Update workflow definition',\n description: 'Update an existing workflow definition. Supports partial updates - only provided fields will be updated.',\n tags: ['Workflows'],\n pathParams: z.object({\n id: z.string().uuid(),\n }),\n requestBody: {\n schema: updateWorkflowDefinitionInputSchema,\n example: {\n definition: {\n steps: [\n {\n stepId: 'start',\n stepName: 'Start',\n stepType: 'START',\n },\n {\n stepId: 'validate-cart',\n stepName: 'Validate Cart',\n stepType: 'AUTOMATED',\n },\n {\n stepId: 'payment',\n stepName: 'Process Payment',\n stepType: 'AUTOMATED',\n },\n {\n stepId: 'confirmation',\n stepName: 'Order Confirmation',\n stepType: 'AUTOMATED',\n },\n {\n stepId: 'end',\n stepName: 'End',\n stepType: 'END',\n },\n ],\n transitions: [\n {\n transitionId: 'start-to-validate',\n fromStepId: 'start',\n toStepId: 'validate-cart',\n trigger: 'auto',\n },\n {\n transitionId: 'validate-to-payment',\n fromStepId: 'validate-cart',\n toStepId: 'payment',\n trigger: 'auto',\n },\n {\n transitionId: 'payment-to-confirmation',\n fromStepId: 'payment',\n toStepId: 'confirmation',\n trigger: 'auto',\n },\n {\n transitionId: 'confirmation-to-end',\n fromStepId: 'confirmation',\n toStepId: 'end',\n trigger: 'auto',\n },\n ],\n },\n enabled: true,\n },\n },\n responses: [\n {\n status: 200,\n description: 'Workflow definition updated successfully',\n schema: workflowDefinitionMutationResponseSchema,\n example: {\n data: {\n id: '123e4567-e89b-12d3-a456-426614174000',\n workflowId: 'checkout-flow',\n workflowName: 'Checkout Flow',\n description: 'Complete checkout workflow for processing orders',\n version: 1,\n definition: {\n steps: [\n { stepId: 'start', stepName: 'Start', stepType: 'START' },\n {\n stepId: 'validate-cart',\n stepName: 'Validate Cart',\n stepType: 'AUTOMATED',\n },\n {\n stepId: 'payment',\n stepName: 'Process Payment',\n stepType: 'AUTOMATED',\n },\n {\n stepId: 'confirmation',\n stepName: 'Order Confirmation',\n stepType: 'AUTOMATED',\n },\n { stepId: 'end', stepName: 'End', stepType: 'END' },\n ],\n transitions: [\n {\n transitionId: 'start-to-validate',\n fromStepId: 'start',\n toStepId: 'validate-cart',\n trigger: 'auto',\n },\n {\n transitionId: 'validate-to-payment',\n fromStepId: 'validate-cart',\n toStepId: 'payment',\n trigger: 'auto',\n },\n {\n transitionId: 'payment-to-confirmation',\n fromStepId: 'payment',\n toStepId: 'confirmation',\n trigger: 'auto',\n },\n {\n transitionId: 'confirmation-to-end',\n fromStepId: 'confirmation',\n toStepId: 'end',\n trigger: 'auto',\n },\n ],\n },\n enabled: true,\n tenantId: '123e4567-e89b-12d3-a456-426614174001',\n organizationId: '123e4567-e89b-12d3-a456-426614174002',\n createdAt: '2025-12-08T10:00:00.000Z',\n updatedAt: '2025-12-08T11:30:00.000Z',\n },\n message: 'Workflow definition updated successfully',\n },\n },\n {\n status: 400,\n description: 'Validation error',\n schema: workflowErrorSchema,\n example: {\n error: 'Validation failed',\n details: [\n {\n path: ['definition'],\n code: 'invalid_type',\n message: 'Invalid input: expected object, received string',\n expected: 'object',\n got: 'string',\n },\n ],\n },\n },\n {\n status: 404,\n description: 'Workflow definition not found',\n schema: workflowErrorSchema,\n example: {\n error: 'Workflow definition not found',\n },\n },\n {\n status: 409,\n description:\n 'Structural change refused while instances are still running (or optimistic-lock conflict). Publish a new version and apply the change there.',\n schema: workflowErrorSchema,\n example: {\n error: 'Structural changes require a new version while instances are still running',\n code: 'WORKFLOW_STRUCTURAL_EDIT_REQUIRES_NEW_VERSION',\n definitionId: '123e4567-e89b-12d3-a456-426614174000',\n activeInstanceCount: 3,\n activeStatuses: ['RUNNING', 'PAUSED', 'WAITING_FOR_ACTIVITIES', 'FORKED', 'COMPENSATING'],\n changes: [{ kind: 'transitionRetargeted', id: 't_lz3k9_ab12cd34e' }],\n remedy: {\n action: 'createVersion',\n method: 'POST',\n endpoint: '/api/workflows/definitions/123e4567-e89b-12d3-a456-426614174000/publish',\n },\n },\n },\n ],\n },\n DELETE: {\n summary: 'Delete workflow definition',\n description: 'Soft delete a workflow definition. Cannot be deleted if there are active workflow instances (RUNNING or WAITING status) using this definition.',\n tags: ['Workflows'],\n pathParams: z.object({\n id: z.string().uuid(),\n }),\n responses: [\n {\n status: 200,\n description: 'Workflow definition deleted successfully',\n schema: workflowDefinitionDeleteResponseSchema,\n example: {\n message: 'Workflow definition deleted successfully',\n },\n },\n {\n status: 404,\n description: 'Workflow definition not found',\n schema: workflowErrorSchema,\n example: {\n error: 'Workflow definition not found',\n },\n },\n {\n status: 409,\n description: 'Cannot delete - active workflow instances exist',\n schema: workflowErrorSchema,\n example: {\n error: 'Cannot delete workflow definition with 3 active instance(s)',\n },\n },\n ],\n },\n },\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Workflow Definition Detail API\n *\n * Endpoints:\n * - GET /api/workflows/definitions/[id] - Get workflow definition\n * - PUT /api/workflows/definitions/[id] - Update workflow definition\n * - DELETE /api/workflows/definitions/[id] - Delete workflow definition (soft delete)\n */\n\nimport { NextRequest, NextResponse } from 'next/server'\nimport { z } from 'zod'\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'\nimport { resolveOrganizationScopeForRequest } from '@open-mercato/core/modules/directory/utils/organizationScope'\nimport { resolveOrganizationScopeFilter, resolveSingleOrganizationIdOrDeny } from '@open-mercato/core/modules/directory/utils/organizationScopeFilter'\nimport { WorkflowDefinition, WorkflowInstance } from '../../../data/entities'\nimport {\n updateWorkflowDefinitionInputSchema,\n updateWorkflowDefinitionInputCheckedSchema,\n type UpdateWorkflowDefinitionApiInput,\n} from '../../../data/validators'\nimport { serializeWorkflowDefinition, serializeCodeWorkflowDefinition } from '../serialize'\nimport {\n workflowDefinitionDetailResponseSchema,\n workflowDefinitionMutationResponseSchema,\n workflowDefinitionDeleteResponseSchema,\n workflowErrorSchema,\n} from '../../openapi'\nimport { invalidateTriggerCache } from '../../../lib/event-trigger-service'\nimport { normalizeDefinitionValidationIssues } from '../../../lib/definition-error-body'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport {\n mappingTargetIssuesForApi,\n UNSAFE_MAPPING_TARGET_MESSAGE,\n UNSAFE_MAPPING_TARGET_MESSAGE_KEY,\n} from '../../../lib/mapping-target-validation'\nimport { getCodeWorkflow, getAllCodeWorkflows } from '../../../lib/code-registry'\nimport { codeWorkflowUuid } from '../../../lib/find-definition'\nimport {\n ACTIVE_WORKFLOW_INSTANCE_STATUSES,\n buildStructuralEditConflictBody,\n diffDefinitionStructure,\n} from '../../../lib/definition-edit-safety'\nimport {\n authorizeWorkflowGrantChange,\n normalizeGrantedFeatures,\n syncWorkflowDefinitionPrincipal,\n} from '../../../lib/definition-grant'\nimport { createGenericOptimisticLockReader } from '@open-mercato/shared/lib/crud/optimistic-lock'\nimport { registerOptimisticLockReaderIfAbsent } from '@open-mercato/shared/lib/crud/optimistic-lock-store'\nimport { validateCrudMutationGuard, runCrudMutationGuardAfterSuccess } from '@open-mercato/shared/lib/crud/mutation-guard'\nimport { enforceCommandOptimisticLockWithGuards } from '@open-mercato/shared/lib/crud/optimistic-lock-command'\nimport { isCrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\n\nconst logger = createLogger('workflows')\n\nregisterOptimisticLockReaderIfAbsent({\n 'workflows.definition': createGenericOptimisticLockReader({\n entity: WorkflowDefinition,\n idField: 'id',\n tenantField: 'tenantId',\n orgField: 'organizationId',\n softDeleteField: 'deletedAt',\n }),\n})\n\nexport const metadata = {\n requireAuth: true,\n requireFeatures: ['workflows.definitions.view'],\n}\n\ninterface RouteContext {\n params: Promise<{\n id: string\n }>\n}\n\n/**\n * GET /api/workflows/definitions/[id]\n *\n * Get a single workflow definition by ID\n */\nexport async function GET(\n request: NextRequest,\n context: RouteContext\n) {\n try {\n const params = await context.params\n const container = await createRequestContainer()\n const em = container.resolve('em')\n const auth = await getAuthFromRequest(request)\n\n if (!auth) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n const scope = await resolveOrganizationScopeForRequest({ container, auth, request })\n const tenantId = auth.tenantId\n const orgFilter = resolveOrganizationScopeFilter(scope, auth)\n\n // Handle code-based workflow definitions (code:<workflowId>)\n if (params.id.startsWith('code:')) {\n const workflowId = params.id.slice(5)\n const codeDef = getCodeWorkflow(workflowId)\n if (!codeDef) {\n return NextResponse.json(\n { error: 'Workflow definition not found' },\n { status: 404 }\n )\n }\n return NextResponse.json({\n data: serializeCodeWorkflowDefinition(codeDef, params.id),\n })\n }\n\n const definition = await em.findOne(WorkflowDefinition, {\n id: params.id,\n tenantId,\n ...orgFilter.where,\n deletedAt: null,\n })\n\n if (!definition) {\n // Instances started from an unpersisted code definition store the\n // deterministic codeWorkflowUuid(workflowId) as their definitionId\n // (see lib/find-definition.ts). Resolve that synthetic UUID back to\n // the code registry so lookups by instance.definitionId succeed.\n const codeDef = getAllCodeWorkflows().find(\n (workflow) => codeWorkflowUuid(workflow.workflowId) === params.id\n )\n if (codeDef) {\n return NextResponse.json({\n data: serializeCodeWorkflowDefinition(codeDef, `code:${codeDef.workflowId}`),\n })\n }\n return NextResponse.json(\n { error: 'Workflow definition not found' },\n { status: 404 }\n )\n }\n\n return NextResponse.json({ data: serializeWorkflowDefinition(definition) })\n } catch (error) {\n logger.error('Error getting workflow definition', { err: error })\n return NextResponse.json(\n { error: 'Failed to get workflow definition' },\n { status: 500 }\n )\n }\n}\n\n/**\n * PUT /api/workflows/definitions/[id]\n *\n * Update a workflow definition\n */\nexport async function PUT(\n request: NextRequest,\n context: RouteContext\n) {\n try {\n const params = await context.params\n const container = await createRequestContainer()\n const em = container.resolve('em')\n const auth = await getAuthFromRequest(request)\n\n if (!auth) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n const scope = await resolveOrganizationScopeForRequest({ container, auth, request })\n const tenantId = auth.tenantId\n const organizationId = resolveSingleOrganizationIdOrDeny(scope, auth)\n\n // Check edit permission\n const rbacService = container.resolve('rbacService')\n const hasPermission = await rbacService.userHasAllFeatures(\n auth.sub,\n ['workflows.definitions.edit'],\n {\n tenantId,\n organizationId,\n }\n )\n\n if (!hasPermission) {\n return NextResponse.json(\n { error: 'Insufficient permissions' },\n { status: 403 }\n )\n }\n\n const body = await request.json()\n\n // Validate input\n const validation = updateWorkflowDefinitionInputCheckedSchema.safeParse(body)\n if (!validation.success) {\n return NextResponse.json(\n {\n error: 'Validation failed',\n details: normalizeDefinitionValidationIssues(validation.error),\n },\n { status: 400 }\n )\n }\n\n const input: UpdateWorkflowDefinitionApiInput = validation.data\n const { translate } = await resolveTranslations()\n const mappingMessage = translate(UNSAFE_MAPPING_TARGET_MESSAGE_KEY, UNSAFE_MAPPING_TARGET_MESSAGE)\n const mappingIssues = input.definition\n ? mappingTargetIssuesForApi(input.definition, ['definition'], mappingMessage)\n : []\n if (mappingIssues.length > 0) {\n return NextResponse.json(\n { error: 'Validation failed', details: mappingIssues },\n { status: 400 }\n )\n }\n const guardResult = await validateCrudMutationGuard(container, {\n tenantId: tenantId ?? '',\n organizationId: organizationId ?? null,\n userId: auth.sub ?? '',\n resourceKind: 'workflows.definition',\n resourceId: params.id,\n operation: 'update',\n requestMethod: 'PUT',\n requestHeaders: request.headers,\n mutationPayload: input as Record<string, unknown>,\n })\n if (guardResult && !guardResult.ok) {\n return NextResponse.json(guardResult.body, { status: guardResult.status })\n }\n\n // Handle customizing a code-based workflow definition\n if (params.id.startsWith('code:')) {\n const workflowId = params.id.slice(5)\n const codeDef = getCodeWorkflow(workflowId)\n if (!codeDef) {\n return NextResponse.json(\n { error: 'Workflow definition not found' },\n { status: 404 }\n )\n }\n\n // Check if an override already exists. Pin to the latest version so the\n // override update targets a deterministic row now that versions coexist.\n const existingOverride = await em.findOne(WorkflowDefinition, {\n workflowId: codeDef.workflowId,\n tenantId,\n }, { orderBy: { version: 'DESC' } })\n\n let savedOverride: WorkflowDefinition\n if (existingOverride) {\n try {\n await enforceCommandOptimisticLockWithGuards(container, {\n resourceKind: 'workflows.definition',\n resourceId: existingOverride.id,\n current: existingOverride.updatedAt ?? null,\n request,\n })\n } catch (lockError) {\n if (isCrudHttpError(lockError)) {\n return NextResponse.json(lockError.body, { status: lockError.status })\n }\n throw lockError\n }\n // Revive if soft-deleted, then apply updates\n existingOverride.deletedAt = null\n existingOverride.workflowName = codeDef.workflowName\n existingOverride.description = codeDef.description\n existingOverride.version = codeDef.version\n existingOverride.definition = input.definition ?? codeDef.definition\n existingOverride.metadata = codeDef.metadata ?? null\n existingOverride.enabled = input.enabled ?? codeDef.enabled\n existingOverride.codeWorkflowId = codeDef.workflowId\n existingOverride.updatedBy = auth.sub\n existingOverride.updatedAt = new Date()\n await em.flush()\n savedOverride = existingOverride\n } else {\n // Create DB override row from code definition + user changes\n const override = em.create(WorkflowDefinition, {\n workflowId: codeDef.workflowId,\n workflowName: codeDef.workflowName,\n description: codeDef.description,\n version: codeDef.version,\n definition: input.definition ?? codeDef.definition,\n metadata: codeDef.metadata,\n enabled: input.enabled ?? codeDef.enabled,\n codeWorkflowId: codeDef.workflowId,\n tenantId,\n organizationId,\n createdBy: auth.sub,\n updatedBy: auth.sub,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n\n em.persist(override)\n await em.flush()\n savedOverride = override\n }\n\n try {\n const eventBus = container.resolve('eventBus') as\n | { emitEvent(event: string, payload: unknown, options?: unknown): Promise<void> }\n | undefined\n if (eventBus && typeof eventBus.emitEvent === 'function') {\n await eventBus.emitEvent(\n 'workflows.definition.customized',\n {\n id: savedOverride.id,\n workflowId: savedOverride.workflowId,\n codeWorkflowId: savedOverride.codeWorkflowId ?? null,\n tenantId: savedOverride.tenantId,\n organizationId: savedOverride.organizationId,\n userId: auth.sub ?? null,\n },\n { tenantId: savedOverride.tenantId, organizationId: savedOverride.organizationId, persistent: true },\n )\n }\n } catch (eventError) {\n logger.error('Failed to emit workflows.definition.customized event', { err: eventError })\n }\n\n if (guardResult?.shouldRunAfterSuccess) {\n await runCrudMutationGuardAfterSuccess(container, {\n tenantId: tenantId ?? '',\n organizationId: organizationId ?? null,\n userId: auth.sub ?? '',\n resourceKind: 'workflows.definition',\n resourceId: String(savedOverride.id),\n operation: 'update',\n requestMethod: 'PUT',\n requestHeaders: request.headers,\n metadata: guardResult.metadata,\n })\n }\n\n return NextResponse.json({\n data: serializeWorkflowDefinition(savedOverride),\n message: 'Workflow definition customized successfully',\n })\n }\n\n // Find existing definition\n const definition = await em.findOne(WorkflowDefinition, {\n id: params.id,\n tenantId,\n organizationId,\n deletedAt: null,\n })\n\n if (!definition) {\n return NextResponse.json(\n { error: 'Workflow definition not found' },\n { status: 404 }\n )\n }\n\n try {\n await enforceCommandOptimisticLockWithGuards(container, {\n resourceKind: 'workflows.definition',\n resourceId: definition.id,\n current: definition.updatedAt ?? null,\n request,\n })\n } catch (lockError) {\n if (isCrudHttpError(lockError)) {\n return NextResponse.json(lockError.body, { status: lockError.status })\n }\n throw lockError\n }\n\n // Edit-safety rule (spec 4.1). Instances pin this row and the engine\n // re-reads it on every advance, so a topology rewrite would re-point routes\n // under a running instance. Structural changes are refused while instances\n // are still executing; the structured body offers the new-version remedy.\n // Cosmetic, config and metadata edits stay in-place, and the per-user draft\n // layer (a separate route) is untouched so work-in-progress stays saveable.\n if (input.definition !== undefined) {\n const structuralChanges = diffDefinitionStructure(definition.definition, input.definition)\n if (structuralChanges.length > 0) {\n const activeInstanceCount = await em.count(WorkflowInstance, {\n definitionId: definition.id,\n status: { $in: [...ACTIVE_WORKFLOW_INSTANCE_STATUSES] },\n tenantId,\n organizationId,\n deletedAt: null,\n })\n if (activeInstanceCount > 0) {\n return NextResponse.json(\n buildStructuralEditConflictBody({\n definitionId: definition.id,\n activeInstanceCount,\n changes: structuralChanges,\n }),\n { status: 409 },\n )\n }\n }\n }\n\n // Update fields. workflowId is intentionally ignored \u2014 it identifies the\n // row and renaming would break references. Version is user-managed and\n // applied when supplied so the edit form can bump it explicitly.\n if (input.workflowName !== undefined) {\n definition.workflowName = input.workflowName\n }\n if (input.description !== undefined) {\n definition.description = input.description\n }\n if (input.version !== undefined) {\n definition.version = input.version\n }\n if (input.definition !== undefined) {\n definition.definition = input.definition\n }\n if (input.metadata !== undefined) {\n definition.metadata = input.metadata\n }\n if (input.enabled !== undefined) {\n definition.enabled = input.enabled\n }\n if (input.effectiveFrom !== undefined) {\n definition.effectiveFrom = input.effectiveFrom\n }\n if (input.effectiveTo !== undefined) {\n definition.effectiveTo = input.effectiveTo\n }\n\n // Execution identity. Absent leaves the stored grant untouched; an explicit\n // value is authorised against the SAVING user's own current features (never\n // the original author's) and the principal is re-scoped before the row is\n // flushed, so the column and the role ACL can never disagree.\n if (input.grantedFeatures !== undefined) {\n const requestedGrant = normalizeGrantedFeatures(input.grantedFeatures)\n const previousGrant = normalizeGrantedFeatures(definition.grantedFeatures)\n const grantFailure = await authorizeWorkflowGrantChange(rbacService, {\n userId: auth.sub,\n scope: { tenantId, organizationId },\n requested: requestedGrant,\n current: previousGrant,\n })\n if (grantFailure) {\n return NextResponse.json(grantFailure.body, { status: grantFailure.status })\n }\n definition.grantedFeatures = requestedGrant.length ? requestedGrant : null\n // Clearing a grant re-scopes the existing principal to no features rather\n // than leaving its old ACL behind.\n await syncWorkflowDefinitionPrincipal(container, definition, { previousFeatures: previousGrant })\n }\n\n definition.updatedBy = auth.sub\n definition.updatedAt = new Date()\n\n await em.flush()\n\n if (guardResult?.shouldRunAfterSuccess) {\n await runCrudMutationGuardAfterSuccess(container, {\n tenantId: tenantId ?? '',\n organizationId: organizationId ?? null,\n userId: auth.sub ?? '',\n resourceKind: 'workflows.definition',\n resourceId: String(definition.id),\n operation: 'update',\n requestMethod: 'PUT',\n requestHeaders: request.headers,\n metadata: guardResult.metadata,\n })\n }\n\n // Embedded triggers may have changed; invalidate the in-memory cache so\n // the wildcard event subscriber reloads them on the next event.\n if (tenantId) invalidateTriggerCache(tenantId, organizationId ?? undefined)\n\n return NextResponse.json({\n data: serializeWorkflowDefinition(definition),\n message: 'Workflow definition updated successfully',\n })\n } catch (error) {\n if (isCrudHttpError(error)) return NextResponse.json(error.body, { status: error.status })\n logger.error('Error updating workflow definition', { err: error })\n return NextResponse.json(\n { error: 'Failed to update workflow definition' },\n { status: 500 }\n )\n }\n}\n\n/**\n * DELETE /api/workflows/definitions/[id]\n *\n * Soft delete a workflow definition\n */\nexport async function DELETE(\n request: NextRequest,\n context: RouteContext\n) {\n try {\n const params = await context.params\n const container = await createRequestContainer()\n const em = container.resolve('em')\n const auth = await getAuthFromRequest(request)\n\n if (!auth) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n const scope = await resolveOrganizationScopeForRequest({ container, auth, request })\n const tenantId = auth.tenantId\n const organizationId = resolveSingleOrganizationIdOrDeny(scope, auth)\n\n // Check delete permission\n const rbacService = container.resolve('rbacService')\n const hasPermission = await rbacService.userHasAllFeatures(\n auth.sub,\n ['workflows.definitions.delete'],\n {\n tenantId,\n organizationId,\n }\n )\n\n if (!hasPermission) {\n return NextResponse.json(\n { error: 'Insufficient permissions' },\n { status: 403 }\n )\n }\n\n // Find existing definition\n const definition = await em.findOne(WorkflowDefinition, {\n id: params.id,\n tenantId,\n organizationId,\n deletedAt: null,\n })\n\n if (!definition) {\n return NextResponse.json(\n { error: 'Workflow definition not found' },\n { status: 404 }\n )\n }\n\n const guardResult = await validateCrudMutationGuard(container, {\n tenantId: tenantId ?? '',\n organizationId: organizationId ?? null,\n userId: auth.sub ?? '',\n resourceKind: 'workflows.definition',\n resourceId: params.id,\n operation: 'delete',\n requestMethod: 'DELETE',\n requestHeaders: request.headers,\n })\n if (guardResult && !guardResult.ok) {\n return NextResponse.json(guardResult.body, { status: guardResult.status })\n }\n\n // Check if there are active workflow instances using this definition\n const { WorkflowInstance } = await import('../../../data/entities')\n const activeInstances = await em.count(WorkflowInstance, {\n definitionId: definition.id,\n status: { $in: ['RUNNING', 'WAITING'] },\n })\n\n if (activeInstances > 0) {\n return NextResponse.json(\n {\n error: `Cannot delete workflow definition with ${activeInstances} active instance(s)`,\n },\n { status: 409 }\n )\n }\n\n // Soft delete\n definition.deletedAt = new Date()\n definition.updatedAt = new Date()\n\n await em.flush()\n\n if (guardResult?.shouldRunAfterSuccess) {\n await runCrudMutationGuardAfterSuccess(container, {\n tenantId: tenantId ?? '',\n organizationId: organizationId ?? null,\n userId: auth.sub ?? '',\n resourceKind: 'workflows.definition',\n resourceId: String(definition.id),\n operation: 'delete',\n requestMethod: 'DELETE',\n requestHeaders: request.headers,\n metadata: guardResult.metadata,\n })\n }\n\n if (tenantId) invalidateTriggerCache(tenantId, organizationId ?? undefined)\n\n return NextResponse.json({\n message: 'Workflow definition deleted successfully',\n })\n } catch (error) {\n if (isCrudHttpError(error)) return NextResponse.json(error.body, { status: error.status })\n logger.error('Error deleting workflow definition', { err: error })\n return NextResponse.json(\n { error: 'Failed to delete workflow definition' },\n { status: 500 }\n )\n }\n}\n\nexport const openApi = {\n methods: {\n GET: {\n summary: 'Get workflow definition',\n description: 'Get a single workflow definition by ID. Returns the complete workflow structure including steps and transitions (with embedded activities).',\n tags: ['Workflows'],\n pathParams: z.object({\n id: z.string().describe('UUID for DB definitions, or \"code:<workflowId>\" for code-based definitions'),\n }),\n responses: [\n {\n status: 200,\n description: 'Workflow definition found',\n schema: workflowDefinitionDetailResponseSchema,\n example: {\n data: {\n id: '123e4567-e89b-12d3-a456-426614174000',\n workflowId: 'checkout-flow',\n workflowName: 'Checkout Flow',\n description: 'Complete checkout workflow for processing orders',\n version: 1,\n definition: {\n steps: [\n {\n stepId: 'start',\n stepName: 'Start',\n stepType: 'START',\n },\n {\n stepId: 'validate-cart',\n stepName: 'Validate Cart',\n stepType: 'AUTOMATED',\n description: 'Validate cart items and check inventory',\n },\n {\n stepId: 'payment',\n stepName: 'Process Payment',\n stepType: 'AUTOMATED',\n description: 'Charge payment method',\n retryPolicy: {\n maxAttempts: 3,\n backoffMs: 1000,\n },\n },\n {\n stepId: 'end',\n stepName: 'End',\n stepType: 'END',\n },\n ],\n transitions: [\n {\n transitionId: 'start-to-validate',\n fromStepId: 'start',\n toStepId: 'validate-cart',\n trigger: 'auto',\n },\n {\n transitionId: 'validate-to-payment',\n fromStepId: 'validate-cart',\n toStepId: 'payment',\n trigger: 'auto',\n },\n {\n transitionId: 'payment-to-end',\n fromStepId: 'payment',\n toStepId: 'end',\n trigger: 'auto',\n activities: [\n {\n activityName: 'Send Order Confirmation',\n activityType: 'SEND_EMAIL',\n config: {\n to: '{{context.customerEmail}}',\n subject: 'Order Confirmation #{{context.orderId}}',\n template: 'order_confirmation',\n },\n },\n ],\n },\n ],\n },\n enabled: true,\n tenantId: '123e4567-e89b-12d3-a456-426614174001',\n organizationId: '123e4567-e89b-12d3-a456-426614174002',\n createdAt: '2025-12-08T10:00:00.000Z',\n updatedAt: '2025-12-08T10:00:00.000Z',\n },\n },\n },\n {\n status: 404,\n description: 'Workflow definition not found',\n schema: workflowErrorSchema,\n example: {\n error: 'Workflow definition not found',\n },\n },\n ],\n },\n PUT: {\n summary: 'Update workflow definition',\n description: 'Update an existing workflow definition. Supports partial updates - only provided fields will be updated.',\n tags: ['Workflows'],\n pathParams: z.object({\n id: z.string().uuid(),\n }),\n requestBody: {\n schema: updateWorkflowDefinitionInputSchema,\n example: {\n definition: {\n steps: [\n {\n stepId: 'start',\n stepName: 'Start',\n stepType: 'START',\n },\n {\n stepId: 'validate-cart',\n stepName: 'Validate Cart',\n stepType: 'AUTOMATED',\n },\n {\n stepId: 'payment',\n stepName: 'Process Payment',\n stepType: 'AUTOMATED',\n },\n {\n stepId: 'confirmation',\n stepName: 'Order Confirmation',\n stepType: 'AUTOMATED',\n },\n {\n stepId: 'end',\n stepName: 'End',\n stepType: 'END',\n },\n ],\n transitions: [\n {\n transitionId: 'start-to-validate',\n fromStepId: 'start',\n toStepId: 'validate-cart',\n trigger: 'auto',\n },\n {\n transitionId: 'validate-to-payment',\n fromStepId: 'validate-cart',\n toStepId: 'payment',\n trigger: 'auto',\n },\n {\n transitionId: 'payment-to-confirmation',\n fromStepId: 'payment',\n toStepId: 'confirmation',\n trigger: 'auto',\n },\n {\n transitionId: 'confirmation-to-end',\n fromStepId: 'confirmation',\n toStepId: 'end',\n trigger: 'auto',\n },\n ],\n },\n enabled: true,\n },\n },\n responses: [\n {\n status: 200,\n description: 'Workflow definition updated successfully',\n schema: workflowDefinitionMutationResponseSchema,\n example: {\n data: {\n id: '123e4567-e89b-12d3-a456-426614174000',\n workflowId: 'checkout-flow',\n workflowName: 'Checkout Flow',\n description: 'Complete checkout workflow for processing orders',\n version: 1,\n definition: {\n steps: [\n { stepId: 'start', stepName: 'Start', stepType: 'START' },\n {\n stepId: 'validate-cart',\n stepName: 'Validate Cart',\n stepType: 'AUTOMATED',\n },\n {\n stepId: 'payment',\n stepName: 'Process Payment',\n stepType: 'AUTOMATED',\n },\n {\n stepId: 'confirmation',\n stepName: 'Order Confirmation',\n stepType: 'AUTOMATED',\n },\n { stepId: 'end', stepName: 'End', stepType: 'END' },\n ],\n transitions: [\n {\n transitionId: 'start-to-validate',\n fromStepId: 'start',\n toStepId: 'validate-cart',\n trigger: 'auto',\n },\n {\n transitionId: 'validate-to-payment',\n fromStepId: 'validate-cart',\n toStepId: 'payment',\n trigger: 'auto',\n },\n {\n transitionId: 'payment-to-confirmation',\n fromStepId: 'payment',\n toStepId: 'confirmation',\n trigger: 'auto',\n },\n {\n transitionId: 'confirmation-to-end',\n fromStepId: 'confirmation',\n toStepId: 'end',\n trigger: 'auto',\n },\n ],\n },\n enabled: true,\n tenantId: '123e4567-e89b-12d3-a456-426614174001',\n organizationId: '123e4567-e89b-12d3-a456-426614174002',\n createdAt: '2025-12-08T10:00:00.000Z',\n updatedAt: '2025-12-08T11:30:00.000Z',\n },\n message: 'Workflow definition updated successfully',\n },\n },\n {\n status: 400,\n description: 'Validation error',\n schema: workflowErrorSchema,\n example: {\n error: 'Validation failed',\n details: [\n {\n path: ['definition'],\n code: 'invalid_type',\n message: 'Invalid input: expected object, received string',\n expected: 'object',\n got: 'string',\n },\n ],\n },\n },\n {\n status: 404,\n description: 'Workflow definition not found',\n schema: workflowErrorSchema,\n example: {\n error: 'Workflow definition not found',\n },\n },\n {\n status: 409,\n description:\n 'Structural change refused while instances are still running (or optimistic-lock conflict). Publish a new version and apply the change there.',\n schema: workflowErrorSchema,\n example: {\n error: 'Structural changes require a new version while instances are still running',\n code: 'WORKFLOW_STRUCTURAL_EDIT_REQUIRES_NEW_VERSION',\n definitionId: '123e4567-e89b-12d3-a456-426614174000',\n activeInstanceCount: 3,\n activeStatuses: ['RUNNING', 'PAUSED', 'WAITING_FOR_ACTIVITIES', 'FORKED', 'COMPENSATING'],\n changes: [{ kind: 'transitionRetargeted', id: 't_lz3k9_ab12cd34e' }],\n remedy: {\n action: 'createVersion',\n method: 'POST',\n endpoint: '/api/workflows/definitions/123e4567-e89b-12d3-a456-426614174000/publish',\n },\n },\n },\n ],\n },\n DELETE: {\n summary: 'Delete workflow definition',\n description: 'Soft delete a workflow definition. Cannot be deleted if there are active workflow instances (RUNNING or WAITING status) using this definition.',\n tags: ['Workflows'],\n pathParams: z.object({\n id: z.string().uuid(),\n }),\n responses: [\n {\n status: 200,\n description: 'Workflow definition deleted successfully',\n schema: workflowDefinitionDeleteResponseSchema,\n example: {\n message: 'Workflow definition deleted successfully',\n },\n },\n {\n status: 404,\n description: 'Workflow definition not found',\n schema: workflowErrorSchema,\n example: {\n error: 'Workflow definition not found',\n },\n },\n {\n status: 409,\n description: 'Cannot delete - active workflow instances exist',\n schema: workflowErrorSchema,\n example: {\n error: 'Cannot delete workflow definition with 3 active instance(s)',\n },\n },\n ],\n },\n },\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["WorkflowInstance"]
7
7
  }
@@ -30,6 +30,7 @@ import {
30
30
  computeDefinitionContextLedger,
31
31
  warmContextLedgerResolvers
32
32
  } from "../../../lib/definition-context-schema.js";
33
+ import { resolveTranslations } from "@open-mercato/shared/lib/i18n/server";
33
34
  import { evaluateWorkflowDefinition } from "../../../lib/definition-evaluation.js";
34
35
  import { listWorkflowFunctions } from "../../../lib/workflow-function-registry.js";
35
36
  import { listWorkflowSafeCommands } from "../../../lib/workflow-safe-commands.js";
@@ -191,7 +192,8 @@ async function POST(request) {
191
192
  });
192
193
  }
193
194
  const ledger = await tryComputeLedger(container, interpreted.definition);
194
- const evaluation = evaluateWorkflowDefinition(interpreted.definition, { ledger });
195
+ const { translate } = await resolveTranslations();
196
+ const evaluation = evaluateWorkflowDefinition(interpreted.definition, { ledger, translate });
195
197
  return NextResponse.json({
196
198
  ok: true,
197
199
  summary: interpreted.summary,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/modules/workflows/api/definitions/generate/route.ts"],
4
- "sourcesContent": ["/**\n * Prompt-to-draft API (spec \u00A79, \"AI-assisted authoring\")\n *\n * Endpoint:\n * - POST /api/workflows/definitions/generate \u2014 natural language \u2192 draft definition\n *\n * ## This route PERSISTS NOTHING\n *\n * That is the whole trust model, and it is stronger than the `enabled: false`\n * row `workflows.create_definition` writes for external agents. There is no\n * `em.persist` on any path here: the generated definition is returned to the\n * Studio, the author reviews it on the canvas, and the ordinary Save + Enable\n * path \u2014 with its optimistic lock, its structural-edit guard and its publish\n * step \u2014 is the only way it ever becomes something the engine can run.\n *\n * ## Refusals are 200s\n *\n * \"No AI provider configured\", \"the model call failed\", \"the model produced\n * something that is not a workflow\" are all NORMAL authoring outcomes the\n * editor renders, exactly like the sibling test-step route's `{ refused: true }`\n * body. They respond 200 with a structured `{ ok: false, reason }` so the\n * surface can say what happened instead of showing a stack trace \u2014 this\n * module's recurring bug class is shipped behaviour that silently does nothing,\n * and a bare 500 is that bug wearing a status code.\n *\n * ## One evaluator\n *\n * The Problems pass is `evaluateWorkflowDefinition` \u2014 the same composer the\n * Studio's Problems panel and the definition API's 400 body come through. The\n * response carries its `problems`, `errorCount` and `warningCount` so the\n * author sees what is wrong with a draft BEFORE deciding to put it on a canvas.\n */\n\nimport { NextRequest, NextResponse } from 'next/server'\nimport { z } from 'zod'\nimport type { OpenApiRouteDoc } from '@open-mercato/shared/lib/openapi'\nimport { zodToJsonSchema } from '@open-mercato/shared/lib/openapi'\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'\nimport { getDeclaredEvents } from '@open-mercato/shared/modules/events'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\nimport { resolveOrganizationScopeForRequest } from '@open-mercato/core/modules/directory/utils/organizationScope'\nimport { resolveSingleOrganizationIdOrDeny } from '@open-mercato/core/modules/directory/utils/organizationScopeFilter'\nimport type { WorkflowDefinitionData } from '../../../data/entities'\nimport {\n transitionTriggerSchema,\n workflowDefinitionDataSchema,\n workflowStepTypeSchema,\n} from '../../../data/validators'\nimport { listActivityTypes } from '../../../lib/activity-registry'\nimport '../../../lib/activity-registry-bootstrap'\nimport {\n WORKFLOW_DRAFT_AGENT_ID,\n WORKFLOW_DRAFT_MAX_REPAIR_ATTEMPTS,\n WORKFLOW_DRAFT_PROMPT_MAX_LENGTH,\n buildWorkflowDraftCatalog,\n buildWorkflowDraftPrompt,\n buildWorkflowDraftRepairPrompt,\n classifyWorkflowDraftFailure,\n interpretWorkflowDraftObject,\n workflowDraftGenerationSchema,\n type WorkflowDraftInterpretation,\n} from '../../../lib/ai-authoring'\nimport { resolveWorkflowDraftRunner } from '../../../lib/ai-draft-runner'\nimport {\n computeDefinitionContextLedger,\n warmContextLedgerResolvers,\n} from '../../../lib/definition-context-schema'\nimport { evaluateWorkflowDefinition } from '../../../lib/definition-evaluation'\nimport { listWorkflowFunctions } from '../../../lib/workflow-function-registry'\nimport { listWorkflowSafeCommands } from '../../../lib/workflow-safe-commands'\nimport { workflowsTag, workflowErrorSchema } from '../../openapi'\nimport { isCrudHttpError } from '@open-mercato/shared/lib/crud/errors'\n\nconst logger = createLogger('workflows')\n\nconst DEFINITIONS_CREATE = 'workflows.definitions.create'\n\nexport const metadata = {\n requireAuth: true,\n requireFeatures: [DEFINITIONS_CREATE],\n}\n\nconst generateDefinitionRequestSchema = z.object({\n prompt: z.string().trim().min(1).max(WORKFLOW_DRAFT_PROMPT_MAX_LENGTH),\n})\n\nconst generateDefinitionResponseSchema = z.object({\n ok: z.boolean(),\n reason: z.enum(['unavailable', 'failed', 'malformedResponse', 'schemaError']).optional(),\n message: z.string().optional(),\n messages: z.array(z.string()).optional(),\n summary: z.string().optional(),\n definition: z.record(z.string(), z.unknown()).optional(),\n problems: z.array(z.record(z.string(), z.unknown())).optional(),\n errorCount: z.number().int().nonnegative().optional(),\n warningCount: z.number().int().nonnegative().optional(),\n})\n\ntype DraftAgentBridgeLike = {\n listAgentOutcomeContracts?: () => Promise<Array<{ agentId?: unknown }>>\n}\n\n/**\n * The agents an `INVOKE_AGENT` draft may target, from the OPTIONAL\n * `agent_orchestrator` peer. Absent peer, missing method, or any failure \u21D2 an\n * empty list, which makes the catalog fail-closed: `buildWorkflowDraftPrompt`\n * then forbids `INVOKE_AGENT` outright rather than letting the model author an\n * agent step with no agent to run.\n */\nasync function resolveDraftAgents(\n container: Awaited<ReturnType<typeof createRequestContainer>>,\n): Promise<{ id: string }[]> {\n let bridge: DraftAgentBridgeLike | undefined\n try {\n bridge = container.resolve<DraftAgentBridgeLike>('agentWorkflowBridge')\n } catch {\n return []\n }\n if (!bridge || typeof bridge.listAgentOutcomeContracts !== 'function') return []\n try {\n const snapshots = await bridge.listAgentOutcomeContracts()\n return snapshots\n .map((snapshot) => (typeof snapshot.agentId === 'string' ? { id: snapshot.agentId } : null))\n .filter((entry): entry is { id: string } => entry !== null)\n } catch {\n return []\n }\n}\n\n/** Compute the ledger for the generated definition, tolerating a broken graph. */\nasync function tryComputeLedger(\n container: Awaited<ReturnType<typeof createRequestContainer>>,\n definition: WorkflowDefinitionData,\n) {\n try {\n await warmContextLedgerResolvers(container)\n return computeDefinitionContextLedger(definition)\n } catch {\n return null\n }\n}\n\nexport async function POST(request: NextRequest) {\n try {\n const container = await createRequestContainer()\n const auth = await getAuthFromRequest(request)\n\n if (!auth || !auth.sub) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n const scope = await resolveOrganizationScopeForRequest({ container, auth, request })\n const tenantId = auth.tenantId\n const organizationId = resolveSingleOrganizationIdOrDeny(scope, auth) ?? null\n\n if (!tenantId) {\n return NextResponse.json({ error: 'Missing tenant context' }, { status: 400 })\n }\n\n const rbacService = container.resolve('rbacService') as {\n userHasAllFeatures: (\n userId: string,\n features: string[],\n scope: { tenantId: string | null; organizationId: string | null },\n ) => Promise<boolean>\n loadAcl?: (\n userId: string,\n scope: { tenantId: string | null; organizationId: string | null },\n ) => Promise<{ features: string[]; isSuperAdmin: boolean }>\n }\n\n const hasPermission = await rbacService.userHasAllFeatures(auth.sub, [DEFINITIONS_CREATE], {\n tenantId,\n organizationId,\n })\n if (!hasPermission) {\n return NextResponse.json({ error: 'Insufficient permissions' }, { status: 403 })\n }\n\n const body = await request.json()\n const validation = generateDefinitionRequestSchema.safeParse(body)\n if (!validation.success) {\n return NextResponse.json(\n { error: 'Validation failed', details: validation.error.issues },\n { status: 400 },\n )\n }\n\n const runner = await resolveWorkflowDraftRunner()\n if (!runner) {\n return NextResponse.json({ ok: false, reason: 'unavailable' })\n }\n\n // The catalogs the draft is authored against: the platform's own\n // registries, never a hand-maintained list that could drift from them.\n const catalog = buildWorkflowDraftCatalog({\n stepTypes: workflowStepTypeSchema.options,\n transitionTriggers: transitionTriggerSchema.options,\n activityTypes: listActivityTypes().map((entry) => ({\n id: entry.id,\n configSchema: zodToJsonSchema(entry.configSchema) ?? undefined,\n })),\n commands: listWorkflowSafeCommands().map((entry) => ({ id: entry.commandId })),\n functions: listWorkflowFunctions().map((entry) => ({\n name: entry.name,\n ...(entry.description ? { label: entry.description } : {}),\n })),\n events: getDeclaredEvents()\n .filter((event) => !event.excludeFromTriggers)\n .map((event) => ({ id: event.id })),\n agents: await resolveDraftAgents(container),\n })\n\n const acl = (await rbacService.loadAcl?.(auth.sub, { tenantId, organizationId })) ?? null\n\n const authContext = {\n tenantId,\n organizationId,\n userId: auth.sub,\n features: acl?.features ?? [],\n isSuperAdmin: acl?.isSuperAdmin ?? false,\n }\n const parseDefinition = (value: unknown) => {\n const parsed = workflowDefinitionDataSchema.safeParse(value)\n if (parsed.success) return { ok: true as const, definition: parsed.data as WorkflowDefinitionData }\n return {\n ok: false as const,\n messages: parsed.error.issues.map(\n (issue) => `${issue.path.join('.') || '(root)'}: ${issue.message}`,\n ),\n }\n }\n\n // Bounded validate-and-repair. The validator's messages are precise enough\n // to act on, so a rejected draft goes BACK to the model with them rather\n // than to the human as a dead end. Bounded because an unbounded loop\n // against a model that cannot fix its own output is just a slower dead end\n // that costs tokens; after the last attempt the surface reports the final\n // errors exactly as it always did.\n let prompt = buildWorkflowDraftPrompt({ prompt: validation.data.prompt, catalog })\n let interpreted: WorkflowDraftInterpretation<WorkflowDefinitionData> | null = null\n let repairAttempts = 0\n\n for (let attempt = 0; attempt <= WORKFLOW_DRAFT_MAX_REPAIR_ATTEMPTS; attempt += 1) {\n let raw: unknown\n try {\n raw = await runner({\n agentId: WORKFLOW_DRAFT_AGENT_ID,\n prompt,\n schemaName: 'WorkflowDraft',\n schema: workflowDraftGenerationSchema,\n authContext,\n container,\n })\n } catch (error) {\n const kind = classifyWorkflowDraftFailure(error)\n logger.warn('Workflow draft generation failed', { err: error, kind, attempt })\n return NextResponse.json({\n ok: false,\n reason: kind,\n ...(kind === 'failed'\n ? { message: error instanceof Error ? error.message : String(error) }\n : {}),\n })\n }\n\n interpreted = interpretWorkflowDraftObject<WorkflowDefinitionData>({ raw, parseDefinition })\n if (interpreted.ok) break\n if (attempt === WORKFLOW_DRAFT_MAX_REPAIR_ATTEMPTS) break\n\n repairAttempts += 1\n logger.info('Workflow draft rejected; asking the model to repair it', {\n reason: interpreted.reason,\n messageCount: interpreted.messages.length,\n attempt: repairAttempts,\n })\n prompt = buildWorkflowDraftRepairPrompt({\n previousPrompt: prompt,\n rejectedDraft: raw,\n messages: interpreted.messages,\n })\n }\n\n if (!interpreted || !interpreted.ok) {\n return NextResponse.json({\n ok: false,\n reason: interpreted?.reason ?? 'malformedResponse',\n messages: interpreted?.messages ?? [],\n repairAttempts,\n })\n }\n\n const ledger = await tryComputeLedger(container, interpreted.definition)\n const evaluation = evaluateWorkflowDefinition(interpreted.definition, { ledger })\n\n // Nothing above wrote a row, and nothing below does either \u2014 this route\n // never resolves an EntityManager, so a future write would be an obvious\n // diff rather than a quiet line inside an existing block.\n return NextResponse.json({\n ok: true,\n summary: interpreted.summary,\n definition: interpreted.definition,\n problems: evaluation.problems,\n errorCount: evaluation.errorCount,\n warningCount: evaluation.warningCount,\n })\n } catch (error) {\n if (isCrudHttpError(error)) return NextResponse.json(error.body, { status: error.status })\n logger.error('Error generating workflow definition draft', { err: error })\n return NextResponse.json({ error: 'Failed to generate workflow draft' }, { status: 500 })\n }\n}\n\nexport const openApi: OpenApiRouteDoc = {\n tag: workflowsTag,\n summary: 'Generate a draft workflow definition from a prompt',\n methods: {\n POST: {\n summary: 'Author a draft workflow definition from natural language',\n description:\n 'Runs the propose-only workflows.workflow_author agent against this installation\\'s activity, command, function and event catalogs and returns a draft definition plus the Problems-panel evaluation for it. Persists nothing: the draft is returned to the Studio for a human to apply, save and enable. Refusals (\"unavailable\" when no AI provider or agent registry is present, \"failed\" when the model call errored, \"malformedResponse\"/\"schemaError\" when the output is not a workflow definition) respond 200 with a structured body.',\n requestBody: { schema: generateDefinitionRequestSchema },\n responses: [\n {\n status: 200,\n description:\n 'The generated draft with its Problems-panel evaluation, or a structured refusal',\n schema: generateDefinitionResponseSchema,\n },\n { status: 400, description: 'Invalid request body', schema: workflowErrorSchema },\n { status: 401, description: 'Unauthorized', schema: workflowErrorSchema },\n { status: 403, description: 'Insufficient permissions', schema: workflowErrorSchema },\n { status: 500, description: 'Generation failed unexpectedly', schema: workflowErrorSchema },\n ],\n },\n },\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Prompt-to-draft API (spec \u00A79, \"AI-assisted authoring\")\n *\n * Endpoint:\n * - POST /api/workflows/definitions/generate \u2014 natural language \u2192 draft definition\n *\n * ## This route PERSISTS NOTHING\n *\n * That is the whole trust model, and it is stronger than the `enabled: false`\n * row `workflows.create_definition` writes for external agents. There is no\n * `em.persist` on any path here: the generated definition is returned to the\n * Studio, the author reviews it on the canvas, and the ordinary Save + Enable\n * path \u2014 with its optimistic lock, its structural-edit guard and its publish\n * step \u2014 is the only way it ever becomes something the engine can run.\n *\n * ## Refusals are 200s\n *\n * \"No AI provider configured\", \"the model call failed\", \"the model produced\n * something that is not a workflow\" are all NORMAL authoring outcomes the\n * editor renders, exactly like the sibling test-step route's `{ refused: true }`\n * body. They respond 200 with a structured `{ ok: false, reason }` so the\n * surface can say what happened instead of showing a stack trace \u2014 this\n * module's recurring bug class is shipped behaviour that silently does nothing,\n * and a bare 500 is that bug wearing a status code.\n *\n * ## One evaluator\n *\n * The Problems pass is `evaluateWorkflowDefinition` \u2014 the same composer the\n * Studio's Problems panel and the definition API's 400 body come through. The\n * response carries its `problems`, `errorCount` and `warningCount` so the\n * author sees what is wrong with a draft BEFORE deciding to put it on a canvas.\n */\n\nimport { NextRequest, NextResponse } from 'next/server'\nimport { z } from 'zod'\nimport type { OpenApiRouteDoc } from '@open-mercato/shared/lib/openapi'\nimport { zodToJsonSchema } from '@open-mercato/shared/lib/openapi'\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'\nimport { getDeclaredEvents } from '@open-mercato/shared/modules/events'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\nimport { resolveOrganizationScopeForRequest } from '@open-mercato/core/modules/directory/utils/organizationScope'\nimport { resolveSingleOrganizationIdOrDeny } from '@open-mercato/core/modules/directory/utils/organizationScopeFilter'\nimport type { WorkflowDefinitionData } from '../../../data/entities'\nimport {\n transitionTriggerSchema,\n workflowDefinitionDataSchema,\n workflowStepTypeSchema,\n} from '../../../data/validators'\nimport { listActivityTypes } from '../../../lib/activity-registry'\nimport '../../../lib/activity-registry-bootstrap'\nimport {\n WORKFLOW_DRAFT_AGENT_ID,\n WORKFLOW_DRAFT_MAX_REPAIR_ATTEMPTS,\n WORKFLOW_DRAFT_PROMPT_MAX_LENGTH,\n buildWorkflowDraftCatalog,\n buildWorkflowDraftPrompt,\n buildWorkflowDraftRepairPrompt,\n classifyWorkflowDraftFailure,\n interpretWorkflowDraftObject,\n workflowDraftGenerationSchema,\n type WorkflowDraftInterpretation,\n} from '../../../lib/ai-authoring'\nimport { resolveWorkflowDraftRunner } from '../../../lib/ai-draft-runner'\nimport {\n computeDefinitionContextLedger,\n warmContextLedgerResolvers,\n} from '../../../lib/definition-context-schema'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { evaluateWorkflowDefinition } from '../../../lib/definition-evaluation'\nimport { listWorkflowFunctions } from '../../../lib/workflow-function-registry'\nimport { listWorkflowSafeCommands } from '../../../lib/workflow-safe-commands'\nimport { workflowsTag, workflowErrorSchema } from '../../openapi'\nimport { isCrudHttpError } from '@open-mercato/shared/lib/crud/errors'\n\nconst logger = createLogger('workflows')\n\nconst DEFINITIONS_CREATE = 'workflows.definitions.create'\n\nexport const metadata = {\n requireAuth: true,\n requireFeatures: [DEFINITIONS_CREATE],\n}\n\nconst generateDefinitionRequestSchema = z.object({\n prompt: z.string().trim().min(1).max(WORKFLOW_DRAFT_PROMPT_MAX_LENGTH),\n})\n\nconst generateDefinitionResponseSchema = z.object({\n ok: z.boolean(),\n reason: z.enum(['unavailable', 'failed', 'malformedResponse', 'schemaError']).optional(),\n message: z.string().optional(),\n messages: z.array(z.string()).optional(),\n summary: z.string().optional(),\n definition: z.record(z.string(), z.unknown()).optional(),\n problems: z.array(z.record(z.string(), z.unknown())).optional(),\n errorCount: z.number().int().nonnegative().optional(),\n warningCount: z.number().int().nonnegative().optional(),\n})\n\ntype DraftAgentBridgeLike = {\n listAgentOutcomeContracts?: () => Promise<Array<{ agentId?: unknown }>>\n}\n\n/**\n * The agents an `INVOKE_AGENT` draft may target, from the OPTIONAL\n * `agent_orchestrator` peer. Absent peer, missing method, or any failure \u21D2 an\n * empty list, which makes the catalog fail-closed: `buildWorkflowDraftPrompt`\n * then forbids `INVOKE_AGENT` outright rather than letting the model author an\n * agent step with no agent to run.\n */\nasync function resolveDraftAgents(\n container: Awaited<ReturnType<typeof createRequestContainer>>,\n): Promise<{ id: string }[]> {\n let bridge: DraftAgentBridgeLike | undefined\n try {\n bridge = container.resolve<DraftAgentBridgeLike>('agentWorkflowBridge')\n } catch {\n return []\n }\n if (!bridge || typeof bridge.listAgentOutcomeContracts !== 'function') return []\n try {\n const snapshots = await bridge.listAgentOutcomeContracts()\n return snapshots\n .map((snapshot) => (typeof snapshot.agentId === 'string' ? { id: snapshot.agentId } : null))\n .filter((entry): entry is { id: string } => entry !== null)\n } catch {\n return []\n }\n}\n\n/** Compute the ledger for the generated definition, tolerating a broken graph. */\nasync function tryComputeLedger(\n container: Awaited<ReturnType<typeof createRequestContainer>>,\n definition: WorkflowDefinitionData,\n) {\n try {\n await warmContextLedgerResolvers(container)\n return computeDefinitionContextLedger(definition)\n } catch {\n return null\n }\n}\n\nexport async function POST(request: NextRequest) {\n try {\n const container = await createRequestContainer()\n const auth = await getAuthFromRequest(request)\n\n if (!auth || !auth.sub) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n const scope = await resolveOrganizationScopeForRequest({ container, auth, request })\n const tenantId = auth.tenantId\n const organizationId = resolveSingleOrganizationIdOrDeny(scope, auth) ?? null\n\n if (!tenantId) {\n return NextResponse.json({ error: 'Missing tenant context' }, { status: 400 })\n }\n\n const rbacService = container.resolve('rbacService') as {\n userHasAllFeatures: (\n userId: string,\n features: string[],\n scope: { tenantId: string | null; organizationId: string | null },\n ) => Promise<boolean>\n loadAcl?: (\n userId: string,\n scope: { tenantId: string | null; organizationId: string | null },\n ) => Promise<{ features: string[]; isSuperAdmin: boolean }>\n }\n\n const hasPermission = await rbacService.userHasAllFeatures(auth.sub, [DEFINITIONS_CREATE], {\n tenantId,\n organizationId,\n })\n if (!hasPermission) {\n return NextResponse.json({ error: 'Insufficient permissions' }, { status: 403 })\n }\n\n const body = await request.json()\n const validation = generateDefinitionRequestSchema.safeParse(body)\n if (!validation.success) {\n return NextResponse.json(\n { error: 'Validation failed', details: validation.error.issues },\n { status: 400 },\n )\n }\n\n const runner = await resolveWorkflowDraftRunner()\n if (!runner) {\n return NextResponse.json({ ok: false, reason: 'unavailable' })\n }\n\n // The catalogs the draft is authored against: the platform's own\n // registries, never a hand-maintained list that could drift from them.\n const catalog = buildWorkflowDraftCatalog({\n stepTypes: workflowStepTypeSchema.options,\n transitionTriggers: transitionTriggerSchema.options,\n activityTypes: listActivityTypes().map((entry) => ({\n id: entry.id,\n configSchema: zodToJsonSchema(entry.configSchema) ?? undefined,\n })),\n commands: listWorkflowSafeCommands().map((entry) => ({ id: entry.commandId })),\n functions: listWorkflowFunctions().map((entry) => ({\n name: entry.name,\n ...(entry.description ? { label: entry.description } : {}),\n })),\n events: getDeclaredEvents()\n .filter((event) => !event.excludeFromTriggers)\n .map((event) => ({ id: event.id })),\n agents: await resolveDraftAgents(container),\n })\n\n const acl = (await rbacService.loadAcl?.(auth.sub, { tenantId, organizationId })) ?? null\n\n const authContext = {\n tenantId,\n organizationId,\n userId: auth.sub,\n features: acl?.features ?? [],\n isSuperAdmin: acl?.isSuperAdmin ?? false,\n }\n const parseDefinition = (value: unknown) => {\n const parsed = workflowDefinitionDataSchema.safeParse(value)\n if (parsed.success) return { ok: true as const, definition: parsed.data as WorkflowDefinitionData }\n return {\n ok: false as const,\n messages: parsed.error.issues.map(\n (issue) => `${issue.path.join('.') || '(root)'}: ${issue.message}`,\n ),\n }\n }\n\n // Bounded validate-and-repair. The validator's messages are precise enough\n // to act on, so a rejected draft goes BACK to the model with them rather\n // than to the human as a dead end. Bounded because an unbounded loop\n // against a model that cannot fix its own output is just a slower dead end\n // that costs tokens; after the last attempt the surface reports the final\n // errors exactly as it always did.\n let prompt = buildWorkflowDraftPrompt({ prompt: validation.data.prompt, catalog })\n let interpreted: WorkflowDraftInterpretation<WorkflowDefinitionData> | null = null\n let repairAttempts = 0\n\n for (let attempt = 0; attempt <= WORKFLOW_DRAFT_MAX_REPAIR_ATTEMPTS; attempt += 1) {\n let raw: unknown\n try {\n raw = await runner({\n agentId: WORKFLOW_DRAFT_AGENT_ID,\n prompt,\n schemaName: 'WorkflowDraft',\n schema: workflowDraftGenerationSchema,\n authContext,\n container,\n })\n } catch (error) {\n const kind = classifyWorkflowDraftFailure(error)\n logger.warn('Workflow draft generation failed', { err: error, kind, attempt })\n return NextResponse.json({\n ok: false,\n reason: kind,\n ...(kind === 'failed'\n ? { message: error instanceof Error ? error.message : String(error) }\n : {}),\n })\n }\n\n interpreted = interpretWorkflowDraftObject<WorkflowDefinitionData>({ raw, parseDefinition })\n if (interpreted.ok) break\n if (attempt === WORKFLOW_DRAFT_MAX_REPAIR_ATTEMPTS) break\n\n repairAttempts += 1\n logger.info('Workflow draft rejected; asking the model to repair it', {\n reason: interpreted.reason,\n messageCount: interpreted.messages.length,\n attempt: repairAttempts,\n })\n prompt = buildWorkflowDraftRepairPrompt({\n previousPrompt: prompt,\n rejectedDraft: raw,\n messages: interpreted.messages,\n })\n }\n\n if (!interpreted || !interpreted.ok) {\n return NextResponse.json({\n ok: false,\n reason: interpreted?.reason ?? 'malformedResponse',\n messages: interpreted?.messages ?? [],\n repairAttempts,\n })\n }\n\n const ledger = await tryComputeLedger(container, interpreted.definition)\n const { translate } = await resolveTranslations()\n const evaluation = evaluateWorkflowDefinition(interpreted.definition, { ledger, translate })\n\n // Nothing above wrote a row, and nothing below does either \u2014 this route\n // never resolves an EntityManager, so a future write would be an obvious\n // diff rather than a quiet line inside an existing block.\n return NextResponse.json({\n ok: true,\n summary: interpreted.summary,\n definition: interpreted.definition,\n problems: evaluation.problems,\n errorCount: evaluation.errorCount,\n warningCount: evaluation.warningCount,\n })\n } catch (error) {\n if (isCrudHttpError(error)) return NextResponse.json(error.body, { status: error.status })\n logger.error('Error generating workflow definition draft', { err: error })\n return NextResponse.json({ error: 'Failed to generate workflow draft' }, { status: 500 })\n }\n}\n\nexport const openApi: OpenApiRouteDoc = {\n tag: workflowsTag,\n summary: 'Generate a draft workflow definition from a prompt',\n methods: {\n POST: {\n summary: 'Author a draft workflow definition from natural language',\n description:\n 'Runs the propose-only workflows.workflow_author agent against this installation\\'s activity, command, function and event catalogs and returns a draft definition plus the Problems-panel evaluation for it. Persists nothing: the draft is returned to the Studio for a human to apply, save and enable. Refusals (\"unavailable\" when no AI provider or agent registry is present, \"failed\" when the model call errored, \"malformedResponse\"/\"schemaError\" when the output is not a workflow definition) respond 200 with a structured body.',\n requestBody: { schema: generateDefinitionRequestSchema },\n responses: [\n {\n status: 200,\n description:\n 'The generated draft with its Problems-panel evaluation, or a structured refusal',\n schema: generateDefinitionResponseSchema,\n },\n { status: 400, description: 'Invalid request body', schema: workflowErrorSchema },\n { status: 401, description: 'Unauthorized', schema: workflowErrorSchema },\n { status: 403, description: 'Insufficient permissions', schema: workflowErrorSchema },\n { status: 500, description: 'Generation failed unexpectedly', schema: workflowErrorSchema },\n ],\n },\n },\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -19,6 +19,12 @@ import {
19
19
  } from "../openapi.js";
20
20
  import { invalidateTriggerCache } from "../../lib/event-trigger-service.js";
21
21
  import { normalizeDefinitionValidationIssues } from "../../lib/definition-error-body.js";
22
+ import { resolveTranslations } from "@open-mercato/shared/lib/i18n/server";
23
+ import {
24
+ mappingTargetIssuesForApi,
25
+ UNSAFE_MAPPING_TARGET_MESSAGE,
26
+ UNSAFE_MAPPING_TARGET_MESSAGE_KEY
27
+ } from "../../lib/mapping-target-validation.js";
22
28
  import { getAllCodeWorkflows } from "../../lib/code-registry.js";
23
29
  import {
24
30
  authorizeWorkflowGrantChange,
@@ -187,6 +193,15 @@ async function POST(request) {
187
193
  );
188
194
  }
189
195
  const input = validation.data;
196
+ const { translate } = await resolveTranslations();
197
+ const mappingMessage = translate(UNSAFE_MAPPING_TARGET_MESSAGE_KEY, UNSAFE_MAPPING_TARGET_MESSAGE);
198
+ const mappingIssues = mappingTargetIssuesForApi(input.definition, ["definition"], mappingMessage);
199
+ if (mappingIssues.length > 0) {
200
+ return NextResponse.json(
201
+ { error: "Validation failed", details: mappingIssues },
202
+ { status: 400 }
203
+ );
204
+ }
190
205
  const definitionData = input.definition.interpolation ? input.definition : { ...input.definition, interpolation: "strict" };
191
206
  const existing = await em.findOne(WorkflowDefinition, {
192
207
  workflowId: input.workflowId,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/modules/workflows/api/definitions/route.ts"],
4
- "sourcesContent": ["/**\n * Workflow Definitions API\n *\n * Endpoints:\n * - GET /api/workflows/definitions - List workflow definitions\n * - POST /api/workflows/definitions - Create workflow definition\n */\n\nimport { randomUUID } from 'node:crypto'\nimport { NextRequest, NextResponse } from 'next/server'\nimport { z } from 'zod'\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport { escapeLikePattern } from '@open-mercato/shared/lib/db/escapeLikePattern'\nimport { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'\nimport { resolveOrganizationScopeForRequest } from '@open-mercato/core/modules/directory/utils/organizationScope'\nimport { resolveOrganizationScopeFilter, resolveSingleOrganizationIdOrDeny } from '@open-mercato/core/modules/directory/utils/organizationScopeFilter'\nimport { WorkflowDefinition } from '../../data/entities'\nimport {\n createWorkflowDefinitionInputSchema,\n createWorkflowDefinitionInputCheckedSchema,\n type CreateWorkflowDefinitionApiInput,\n} from '../../data/validators'\nimport { serializeWorkflowDefinition, serializeCodeWorkflowDefinition } from './serialize'\nimport {\n workflowDefinitionListResponseSchema,\n workflowDefinitionMutationResponseSchema,\n workflowErrorSchema,\n} from '../openapi'\nimport { invalidateTriggerCache } from '../../lib/event-trigger-service'\nimport { normalizeDefinitionValidationIssues } from '../../lib/definition-error-body'\nimport { getAllCodeWorkflows } from '../../lib/code-registry'\nimport {\n authorizeWorkflowGrantChange,\n normalizeGrantedFeatures,\n syncWorkflowDefinitionPrincipal,\n} from '../../lib/definition-grant'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\nimport { isCrudHttpError } from '@open-mercato/shared/lib/crud/errors'\n\nconst logger = createLogger('workflows')\n\nexport const metadata = {\n requireAuth: true,\n requireFeatures: ['workflows.definitions.view'],\n}\n\n// Post-versioning the unique constraint is (workflow_id, version, tenant_id);\n// the legacy name is still matched so the check survives a partially-migrated DB.\nconst WORKFLOW_ID_TENANT_UNIQUE_CONSTRAINT = 'workflow_definitions_workflow_id_tenant_id_unique'\nconst WORKFLOW_ID_VERSION_TENANT_UNIQUE_CONSTRAINT = 'workflow_definitions_workflow_id_version_tenant_id_unique'\n\nfunction isWorkflowIdUniqueConstraintError(error: unknown): boolean {\n if (!error || typeof error !== 'object') {\n return false\n }\n\n const value = error as Record<string, unknown>\n const constraint = value.constraint\n const code = value.code\n const message = typeof value.message === 'string' ? value.message : ''\n const detail = typeof value.detail === 'string' ? value.detail : ''\n\n if (constraint === WORKFLOW_ID_TENANT_UNIQUE_CONSTRAINT || constraint === WORKFLOW_ID_VERSION_TENANT_UNIQUE_CONSTRAINT) {\n return true\n }\n\n if (code === '23505' && (detail.includes('(workflow_id, tenant_id)') || detail.includes('(workflow_id, version, tenant_id)'))) {\n return true\n }\n\n return message.includes(WORKFLOW_ID_TENANT_UNIQUE_CONSTRAINT) || message.includes(WORKFLOW_ID_VERSION_TENANT_UNIQUE_CONSTRAINT)\n}\n\n/**\n * GET /api/workflows/definitions\n *\n * List workflow definitions with optional filters\n */\nexport async function GET(request: NextRequest) {\n try {\n const container = await createRequestContainer()\n const em = container.resolve('em')\n const auth = await getAuthFromRequest(request)\n\n if (!auth) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n const scope = await resolveOrganizationScopeForRequest({ container, auth, request })\n const tenantId = auth.tenantId\n const orgFilter = resolveOrganizationScopeFilter(scope, auth)\n\n const { searchParams } = new URL(request.url)\n const enabled = searchParams.get('enabled')\n const workflowId = searchParams.get('workflowId')\n const search = searchParams.get('search')\n const kind = searchParams.get('kind')\n const lifecycle = searchParams.get('lifecycle')\n const versionParam = searchParams.get('version')\n const version = versionParam !== null && /^\\d+$/.test(versionParam) ? parseInt(versionParam, 10) : null\n const limit = parseInt(searchParams.get('limit') || '50')\n const offset = parseInt(searchParams.get('offset') || '0')\n\n // Build where clause with tenant scoping\n const where: any = {\n tenantId,\n ...orgFilter.where,\n deletedAt: null,\n }\n\n if (enabled !== null) {\n where.enabled = enabled === 'true'\n }\n\n if (workflowId) {\n where.workflowId = workflowId\n }\n\n if (kind) {\n where.kind = kind\n }\n\n if (lifecycle) {\n where.lifecycle = lifecycle\n }\n\n if (version !== null) {\n where.version = version\n }\n\n if (search) {\n where.$or = [\n { workflowId: { $ilike: `%${escapeLikePattern(search)}%` } },\n { workflowName: { $ilike: `%${escapeLikePattern(search)}%` } },\n ]\n }\n\n // Determine which code workflows are shadowed by a DB row (so we can\n // exclude them from the code-only list) without loading all DB rows.\n const enabledFilter = enabled !== null ? enabled === 'true' : null\n const searchLower = search ? search.toLowerCase() : null\n const allCodeIds = getAllCodeWorkflows().map((cw) => cw.workflowId)\n const shadowed = allCodeIds.length > 0\n ? new Set(\n (\n await em.find(\n WorkflowDefinition,\n { ...where, workflowId: { $in: allCodeIds } },\n { fields: ['workflowId'] as const },\n )\n ).map((d: WorkflowDefinition) => d.workflowId),\n )\n : new Set<string>()\n\n const codeOnly = getAllCodeWorkflows()\n .filter((cw) => !shadowed.has(cw.workflowId))\n .filter((cw) => {\n // Code-based definitions are always kind=workflow / lifecycle=published.\n if (kind && kind !== 'workflow') return false\n if (lifecycle && lifecycle !== 'published') return false\n if (version !== null && cw.version !== version) return false\n if (searchLower) {\n const matches =\n cw.workflowId.toLowerCase().includes(searchLower) ||\n cw.workflowName.toLowerCase().includes(searchLower)\n if (!matches) return false\n }\n if (enabledFilter !== null && cw.enabled !== enabledFilter) return false\n if (workflowId && cw.workflowId !== workflowId) return false\n return true\n })\n .map((cw) => serializeCodeWorkflowDefinition(cw, `code:${cw.workflowId}`))\n\n const dbCount = await em.count(WorkflowDefinition, where)\n const total = dbCount + codeOnly.length\n\n // Fetch only the prefix of DB rows we might need to fill the requested\n // page after merging with the (already-filtered) code-only list.\n const dbWindowLimit = offset + limit\n const dbWindow = dbWindowLimit > 0\n ? await em.find(WorkflowDefinition, where, {\n orderBy: { workflowName: 'ASC' },\n limit: dbWindowLimit,\n })\n : []\n\n const serializedDb = dbWindow.map(serializeWorkflowDefinition)\n\n const merged = [...serializedDb, ...codeOnly].sort((a, b) =>\n a.workflowName.localeCompare(b.workflowName),\n )\n\n const paginated = merged.slice(offset, offset + limit)\n\n return NextResponse.json({\n data: paginated,\n pagination: {\n total,\n limit,\n offset,\n hasMore: offset + limit < total,\n },\n })\n } catch (error) {\n logger.error('Error listing workflow definitions', { err: error })\n return NextResponse.json(\n { error: 'Failed to list workflow definitions' },\n { status: 500 }\n )\n }\n}\n\n/**\n * POST /api/workflows/definitions\n *\n * Create a new workflow definition\n */\nexport async function POST(request: NextRequest) {\n try {\n const container = await createRequestContainer()\n const em = container.resolve('em')\n const auth = await getAuthFromRequest(request)\n\n if (!auth) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n const scope = await resolveOrganizationScopeForRequest({ container, auth, request })\n const tenantId = auth.tenantId\n const organizationId = resolveSingleOrganizationIdOrDeny(scope, auth)\n\n // Check create permission\n const rbacService = container.resolve('rbacService')\n const hasPermission = await rbacService.userHasAllFeatures(\n auth.sub,\n ['workflows.definitions.create'],\n {\n tenantId,\n organizationId,\n }\n )\n\n if (!hasPermission) {\n return NextResponse.json(\n { error: 'Insufficient permissions' },\n { status: 403 }\n )\n }\n\n const body = await request.json()\n\n // Validate input\n const validation = createWorkflowDefinitionInputCheckedSchema.safeParse(body)\n if (!validation.success) {\n return NextResponse.json(\n {\n error: 'Validation failed',\n details: normalizeDefinitionValidationIssues(validation.error),\n },\n { status: 400 }\n )\n }\n\n const input: CreateWorkflowDefinitionApiInput = validation.data\n\n // New definitions default to strict interpolation (spec \u00A73.6). The default\n // lives on the create path only \u2014 a schema-level default would flip\n // existing lenient definitions on their next full-body update.\n const definitionData = input.definition.interpolation\n ? input.definition\n : { ...input.definition, interpolation: 'strict' as const }\n\n // Create always mints version 1. A workflowId that already exists (any\n // version) is a conflict \u2014 new versions are produced via the publish flow,\n // not by re-creating. orderBy keeps the existence check deterministic now\n // that multiple versions can coexist.\n const existing = await em.findOne(WorkflowDefinition, {\n workflowId: input.workflowId,\n tenantId,\n }, { orderBy: { version: 'DESC' } })\n\n if (existing) {\n return NextResponse.json(\n {\n error: `Workflow definition with ID \"${input.workflowId}\" already exists`,\n },\n { status: 409 }\n )\n }\n\n const grantedFeatures = normalizeGrantedFeatures(input.grantedFeatures)\n const grantFailure = await authorizeWorkflowGrantChange(rbacService, {\n userId: auth.sub,\n scope: { tenantId, organizationId },\n requested: grantedFeatures,\n current: [],\n })\n if (grantFailure) {\n return NextResponse.json(grantFailure.body, { status: grantFailure.status })\n }\n\n // Create workflow definition.\n //\n // The PK is minted up front (MikroORM does not generate UUIDs client-side)\n // so the execution principal \u2014 whose identity key is the definition id \u2014 can\n // be provisioned BEFORE the row claiming the grant is persisted. A failed\n // provisioning then leaves no definition pointing at a principal that does\n // not exist.\n //\n // `createdBy` is recorded here for the first time. It was never set on this\n // path, which silently disabled the definition-author fallback CALL_API and\n // INVOKE_AGENT rely on for event-triggered runs.\n const definition = em.create(WorkflowDefinition, {\n id: randomUUID(),\n workflowId: input.workflowId,\n workflowName: input.workflowName,\n description: input.description,\n version: input.version,\n definition: definitionData,\n metadata: input.metadata,\n enabled: input.enabled ?? true,\n grantedFeatures: grantedFeatures.length ? grantedFeatures : null,\n tenantId,\n organizationId,\n createdBy: auth.sub,\n updatedBy: auth.sub,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n\n await syncWorkflowDefinitionPrincipal(container, definition)\n\n await em.persist(definition).flush()\n\n // Newly-created embedded triggers must be visible to the wildcard event\n // subscriber immediately; invalidate the in-memory trigger cache so the\n // next event reload picks up this definition.\n if (tenantId) invalidateTriggerCache(tenantId, organizationId ?? undefined)\n\n return NextResponse.json(\n {\n data: serializeWorkflowDefinition(definition),\n message: 'Workflow definition created successfully',\n },\n { status: 201 }\n )\n } catch (error) {\n if (isCrudHttpError(error)) return NextResponse.json(error.body, { status: error.status })\n if (isWorkflowIdUniqueConstraintError(error)) {\n return NextResponse.json(\n { error: 'Workflow definition with this ID already exists' },\n { status: 409 }\n )\n }\n\n logger.error('Error creating workflow definition', { err: error })\n return NextResponse.json(\n { error: 'Failed to create workflow definition' },\n { status: 500 }\n )\n }\n}\n\nexport const openApi = {\n methods: {\n GET: {\n summary: 'List workflow definitions',\n description: 'Get a list of workflow definitions with optional filters. Supports pagination and search.',\n tags: ['Workflows'],\n query: createWorkflowDefinitionInputSchema.pick({ workflowId: true }).extend({\n enabled: z.boolean().optional(),\n search: z.string().optional(),\n limit: z.number().int().positive().default(50).optional(),\n offset: z.number().int().min(0).default(0).optional(),\n }),\n responses: [\n {\n status: 200,\n description: 'List of workflow definitions with pagination',\n schema: workflowDefinitionListResponseSchema,\n example: {\n data: [\n {\n id: '123e4567-e89b-12d3-a456-426614174000',\n workflowId: 'checkout-flow',\n workflowName: 'Checkout Flow',\n description: 'Complete checkout workflow for processing orders',\n version: 1,\n definition: {\n steps: [\n {\n stepId: 'start',\n stepName: 'Start',\n stepType: 'START',\n },\n {\n stepId: 'validate-cart',\n stepName: 'Validate Cart',\n stepType: 'AUTOMATED',\n },\n {\n stepId: 'end',\n stepName: 'End',\n stepType: 'END',\n },\n ],\n transitions: [\n {\n transitionId: 'start-to-validate',\n fromStepId: 'start',\n toStepId: 'validate-cart',\n trigger: 'auto',\n },\n {\n transitionId: 'validate-to-end',\n fromStepId: 'validate-cart',\n toStepId: 'end',\n trigger: 'auto',\n },\n ],\n },\n enabled: true,\n tenantId: '123e4567-e89b-12d3-a456-426614174001',\n organizationId: '123e4567-e89b-12d3-a456-426614174002',\n createdAt: '2025-12-08T10:00:00.000Z',\n updatedAt: '2025-12-08T10:00:00.000Z',\n },\n ],\n pagination: {\n total: 1,\n limit: 50,\n offset: 0,\n hasMore: false,\n },\n },\n },\n ],\n },\n POST: {\n summary: 'Create workflow definition',\n description: 'Create a new workflow definition. The definition must include at least START and END steps with at least one transition connecting them.',\n tags: ['Workflows'],\n requestBody: {\n schema: createWorkflowDefinitionInputSchema,\n example: {\n workflowId: 'checkout-flow',\n workflowName: 'Checkout Flow',\n description: 'Complete checkout workflow for processing orders',\n version: 1,\n definition: {\n steps: [\n {\n stepId: 'start',\n stepName: 'Start',\n stepType: 'START',\n },\n {\n stepId: 'validate-cart',\n stepName: 'Validate Cart',\n stepType: 'AUTOMATED',\n description: 'Validate cart items and check inventory',\n },\n {\n stepId: 'payment',\n stepName: 'Process Payment',\n stepType: 'AUTOMATED',\n description: 'Charge payment method',\n retryPolicy: {\n maxAttempts: 3,\n backoffMs: 1000,\n },\n },\n {\n stepId: 'end',\n stepName: 'End',\n stepType: 'END',\n },\n ],\n transitions: [\n {\n transitionId: 'start-to-validate',\n fromStepId: 'start',\n toStepId: 'validate-cart',\n trigger: 'auto',\n },\n {\n transitionId: 'validate-to-payment',\n fromStepId: 'validate-cart',\n toStepId: 'payment',\n trigger: 'auto',\n },\n {\n transitionId: 'payment-to-end',\n fromStepId: 'payment',\n toStepId: 'end',\n trigger: 'auto',\n activities: [\n {\n activityName: 'Send Order Confirmation',\n activityType: 'SEND_EMAIL',\n config: {\n to: '{{context.customerEmail}}',\n subject: 'Order Confirmation #{{context.orderId}}',\n template: 'order_confirmation',\n },\n },\n ],\n },\n ],\n },\n enabled: true,\n },\n },\n responses: [\n {\n status: 201,\n description: 'Workflow definition created successfully',\n schema: workflowDefinitionMutationResponseSchema,\n example: {\n data: {\n id: '123e4567-e89b-12d3-a456-426614174000',\n workflowId: 'checkout-flow',\n workflowName: 'Checkout Flow',\n description: 'Complete checkout workflow for processing orders',\n version: 1,\n definition: {\n steps: [\n { stepId: 'start', stepName: 'Start', stepType: 'START' },\n {\n stepId: 'validate-cart',\n stepName: 'Validate Cart',\n stepType: 'AUTOMATED',\n },\n {\n stepId: 'payment',\n stepName: 'Process Payment',\n stepType: 'AUTOMATED',\n },\n { stepId: 'end', stepName: 'End', stepType: 'END' },\n ],\n transitions: [\n {\n transitionId: 'start-to-validate',\n fromStepId: 'start',\n toStepId: 'validate-cart',\n trigger: 'auto',\n },\n {\n transitionId: 'validate-to-payment',\n fromStepId: 'validate-cart',\n toStepId: 'payment',\n trigger: 'auto',\n },\n {\n transitionId: 'payment-to-end',\n fromStepId: 'payment',\n toStepId: 'end',\n trigger: 'auto',\n },\n ],\n },\n enabled: true,\n tenantId: '123e4567-e89b-12d3-a456-426614174001',\n organizationId: '123e4567-e89b-12d3-a456-426614174002',\n createdAt: '2025-12-08T10:00:00.000Z',\n updatedAt: '2025-12-08T10:00:00.000Z',\n },\n message: 'Workflow definition created successfully',\n },\n },\n {\n status: 400,\n description: 'Validation error - invalid workflow structure',\n schema: workflowErrorSchema,\n example: {\n error: 'Validation failed',\n details: [\n {\n path: ['definition', 'steps'],\n code: 'custom',\n message: 'Workflow must have at least START and END steps',\n },\n ],\n },\n },\n {\n status: 409,\n description: 'Conflict - workflow with same ID and version already exists',\n schema: workflowErrorSchema,\n example: {\n error: 'Workflow definition with ID \"checkout-flow\" and version 1 already exists',\n },\n },\n ],\n },\n },\n}\n\n"],
5
- "mappings": "AAQA,SAAS,kBAAkB;AAC3B,SAAsB,oBAAoB;AAC1C,SAAS,SAAS;AAClB,SAAS,8BAA8B;AACvC,SAAS,yBAAyB;AAClC,SAAS,0BAA0B;AACnC,SAAS,0CAA0C;AACnD,SAAS,gCAAgC,yCAAyC;AAClF,SAAS,0BAA0B;AACnC;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AACP,SAAS,6BAA6B,uCAAuC;AAC7E;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,8BAA8B;AACvC,SAAS,2CAA2C;AACpD,SAAS,2BAA2B;AACpC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,oBAAoB;AAC7B,SAAS,uBAAuB;AAEhC,MAAM,SAAS,aAAa,WAAW;AAEhC,MAAM,WAAW;AAAA,EACtB,aAAa;AAAA,EACb,iBAAiB,CAAC,4BAA4B;AAChD;AAIA,MAAM,uCAAuC;AAC7C,MAAM,+CAA+C;AAErD,SAAS,kCAAkC,OAAyB;AAClE,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ;AACd,QAAM,aAAa,MAAM;AACzB,QAAM,OAAO,MAAM;AACnB,QAAM,UAAU,OAAO,MAAM,YAAY,WAAW,MAAM,UAAU;AACpE,QAAM,SAAS,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS;AAEjE,MAAI,eAAe,wCAAwC,eAAe,8CAA8C;AACtH,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,YAAY,OAAO,SAAS,0BAA0B,KAAK,OAAO,SAAS,mCAAmC,IAAI;AAC7H,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,SAAS,oCAAoC,KAAK,QAAQ,SAAS,4CAA4C;AAChI;AAOA,eAAsB,IAAI,SAAsB;AAC9C,MAAI;AACF,UAAM,YAAY,MAAM,uBAAuB;AAC/C,UAAM,KAAK,UAAU,QAAQ,IAAI;AACjC,UAAM,OAAO,MAAM,mBAAmB,OAAO;AAE7C,QAAI,CAAC,MAAM;AACT,aAAO,aAAa,KAAK,EAAE,OAAO,eAAe,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,IACrE;AAEA,UAAM,QAAQ,MAAM,mCAAmC,EAAE,WAAW,MAAM,QAAQ,CAAC;AACnF,UAAM,WAAW,KAAK;AACtB,UAAM,YAAY,+BAA+B,OAAO,IAAI;AAE5D,UAAM,EAAE,aAAa,IAAI,IAAI,IAAI,QAAQ,GAAG;AAC5C,UAAM,UAAU,aAAa,IAAI,SAAS;AAC1C,UAAM,aAAa,aAAa,IAAI,YAAY;AAChD,UAAM,SAAS,aAAa,IAAI,QAAQ;AACxC,UAAM,OAAO,aAAa,IAAI,MAAM;AACpC,UAAM,YAAY,aAAa,IAAI,WAAW;AAC9C,UAAM,eAAe,aAAa,IAAI,SAAS;AAC/C,UAAM,UAAU,iBAAiB,QAAQ,QAAQ,KAAK,YAAY,IAAI,SAAS,cAAc,EAAE,IAAI;AACnG,UAAM,QAAQ,SAAS,aAAa,IAAI,OAAO,KAAK,IAAI;AACxD,UAAM,SAAS,SAAS,aAAa,IAAI,QAAQ,KAAK,GAAG;AAGzD,UAAM,QAAa;AAAA,MACjB;AAAA,MACA,GAAG,UAAU;AAAA,MACb,WAAW;AAAA,IACb;AAEA,QAAI,YAAY,MAAM;AACpB,YAAM,UAAU,YAAY;AAAA,IAC9B;AAEA,QAAI,YAAY;AACd,YAAM,aAAa;AAAA,IACrB;AAEA,QAAI,MAAM;AACR,YAAM,OAAO;AAAA,IACf;AAEA,QAAI,WAAW;AACb,YAAM,YAAY;AAAA,IACpB;AAEA,QAAI,YAAY,MAAM;AACpB,YAAM,UAAU;AAAA,IAClB;AAEA,QAAI,QAAQ;AACV,YAAM,MAAM;AAAA,QACV,EAAE,YAAY,EAAE,QAAQ,IAAI,kBAAkB,MAAM,CAAC,IAAI,EAAE;AAAA,QAC3D,EAAE,cAAc,EAAE,QAAQ,IAAI,kBAAkB,MAAM,CAAC,IAAI,EAAE;AAAA,MAC/D;AAAA,IACF;AAIA,UAAM,gBAAgB,YAAY,OAAO,YAAY,SAAS;AAC9D,UAAM,cAAc,SAAS,OAAO,YAAY,IAAI;AACpD,UAAM,aAAa,oBAAoB,EAAE,IAAI,CAAC,OAAO,GAAG,UAAU;AAClE,UAAM,WAAW,WAAW,SAAS,IACjC,IAAI;AAAA,OAEA,MAAM,GAAG;AAAA,QACP;AAAA,QACA,EAAE,GAAG,OAAO,YAAY,EAAE,KAAK,WAAW,EAAE;AAAA,QAC5C,EAAE,QAAQ,CAAC,YAAY,EAAW;AAAA,MACpC,GACA,IAAI,CAAC,MAA0B,EAAE,UAAU;AAAA,IAC/C,IACA,oBAAI,IAAY;AAEpB,UAAM,WAAW,oBAAoB,EAClC,OAAO,CAAC,OAAO,CAAC,SAAS,IAAI,GAAG,UAAU,CAAC,EAC3C,OAAO,CAAC,OAAO;AAEd,UAAI,QAAQ,SAAS,WAAY,QAAO;AACxC,UAAI,aAAa,cAAc,YAAa,QAAO;AACnD,UAAI,YAAY,QAAQ,GAAG,YAAY,QAAS,QAAO;AACvD,UAAI,aAAa;AACf,cAAM,UACJ,GAAG,WAAW,YAAY,EAAE,SAAS,WAAW,KAChD,GAAG,aAAa,YAAY,EAAE,SAAS,WAAW;AACpD,YAAI,CAAC,QAAS,QAAO;AAAA,MACvB;AACA,UAAI,kBAAkB,QAAQ,GAAG,YAAY,cAAe,QAAO;AACnE,UAAI,cAAc,GAAG,eAAe,WAAY,QAAO;AACvD,aAAO;AAAA,IACT,CAAC,EACA,IAAI,CAAC,OAAO,gCAAgC,IAAI,QAAQ,GAAG,UAAU,EAAE,CAAC;AAE3E,UAAM,UAAU,MAAM,GAAG,MAAM,oBAAoB,KAAK;AACxD,UAAM,QAAQ,UAAU,SAAS;AAIjC,UAAM,gBAAgB,SAAS;AAC/B,UAAM,WAAW,gBAAgB,IAC7B,MAAM,GAAG,KAAK,oBAAoB,OAAO;AAAA,MACvC,SAAS,EAAE,cAAc,MAAM;AAAA,MAC/B,OAAO;AAAA,IACT,CAAC,IACD,CAAC;AAEL,UAAM,eAAe,SAAS,IAAI,2BAA2B;AAE7D,UAAM,SAAS,CAAC,GAAG,cAAc,GAAG,QAAQ,EAAE;AAAA,MAAK,CAAC,GAAG,MACrD,EAAE,aAAa,cAAc,EAAE,YAAY;AAAA,IAC7C;AAEA,UAAM,YAAY,OAAO,MAAM,QAAQ,SAAS,KAAK;AAErD,WAAO,aAAa,KAAK;AAAA,MACvB,MAAM;AAAA,MACN,YAAY;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,SAAS,QAAQ;AAAA,MAC5B;AAAA,IACF,CAAC;AAAA,EACH,SAAS,OAAO;AACd,WAAO,MAAM,sCAAsC,EAAE,KAAK,MAAM,CAAC;AACjE,WAAO,aAAa;AAAA,MAClB,EAAE,OAAO,sCAAsC;AAAA,MAC/C,EAAE,QAAQ,IAAI;AAAA,IAChB;AAAA,EACF;AACF;AAOA,eAAsB,KAAK,SAAsB;AAC/C,MAAI;AACF,UAAM,YAAY,MAAM,uBAAuB;AAC/C,UAAM,KAAK,UAAU,QAAQ,IAAI;AACjC,UAAM,OAAO,MAAM,mBAAmB,OAAO;AAE7C,QAAI,CAAC,MAAM;AACT,aAAO,aAAa,KAAK,EAAE,OAAO,eAAe,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,IACrE;AAEA,UAAM,QAAQ,MAAM,mCAAmC,EAAE,WAAW,MAAM,QAAQ,CAAC;AACnF,UAAM,WAAW,KAAK;AACtB,UAAM,iBAAiB,kCAAkC,OAAO,IAAI;AAGpE,UAAM,cAAc,UAAU,QAAQ,aAAa;AACnD,UAAM,gBAAgB,MAAM,YAAY;AAAA,MACtC,KAAK;AAAA,MACL,CAAC,8BAA8B;AAAA,MAC/B;AAAA,QACE;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,eAAe;AAClB,aAAO,aAAa;AAAA,QAClB,EAAE,OAAO,2BAA2B;AAAA,QACpC,EAAE,QAAQ,IAAI;AAAA,MAChB;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,QAAQ,KAAK;AAGhC,UAAM,aAAa,2CAA2C,UAAU,IAAI;AAC5E,QAAI,CAAC,WAAW,SAAS;AACvB,aAAO,aAAa;AAAA,QAClB;AAAA,UACE,OAAO;AAAA,UACP,SAAS,oCAAoC,WAAW,KAAK;AAAA,QAC/D;AAAA,QACA,EAAE,QAAQ,IAAI;AAAA,MAChB;AAAA,IACF;AAEA,UAAM,QAA0C,WAAW;AAK3D,UAAM,iBAAiB,MAAM,WAAW,gBACpC,MAAM,aACN,EAAE,GAAG,MAAM,YAAY,eAAe,SAAkB;AAM5D,UAAM,WAAW,MAAM,GAAG,QAAQ,oBAAoB;AAAA,MACpD,YAAY,MAAM;AAAA,MAClB;AAAA,IACF,GAAG,EAAE,SAAS,EAAE,SAAS,OAAO,EAAE,CAAC;AAEnC,QAAI,UAAU;AACZ,aAAO,aAAa;AAAA,QAClB;AAAA,UACE,OAAO,gCAAgC,MAAM,UAAU;AAAA,QACzD;AAAA,QACA,EAAE,QAAQ,IAAI;AAAA,MAChB;AAAA,IACF;AAEA,UAAM,kBAAkB,yBAAyB,MAAM,eAAe;AACtE,UAAM,eAAe,MAAM,6BAA6B,aAAa;AAAA,MACnE,QAAQ,KAAK;AAAA,MACb,OAAO,EAAE,UAAU,eAAe;AAAA,MAClC,WAAW;AAAA,MACX,SAAS,CAAC;AAAA,IACZ,CAAC;AACD,QAAI,cAAc;AAChB,aAAO,aAAa,KAAK,aAAa,MAAM,EAAE,QAAQ,aAAa,OAAO,CAAC;AAAA,IAC7E;AAaA,UAAM,aAAa,GAAG,OAAO,oBAAoB;AAAA,MAC/C,IAAI,WAAW;AAAA,MACf,YAAY,MAAM;AAAA,MAClB,cAAc,MAAM;AAAA,MACpB,aAAa,MAAM;AAAA,MACnB,SAAS,MAAM;AAAA,MACf,YAAY;AAAA,MACZ,UAAU,MAAM;AAAA,MAChB,SAAS,MAAM,WAAW;AAAA,MAC1B,iBAAiB,gBAAgB,SAAS,kBAAkB;AAAA,MAC5D;AAAA,MACA;AAAA,MACA,WAAW,KAAK;AAAA,MAChB,WAAW,KAAK;AAAA,MAChB,WAAW,oBAAI,KAAK;AAAA,MACpB,WAAW,oBAAI,KAAK;AAAA,IACtB,CAAC;AAED,UAAM,gCAAgC,WAAW,UAAU;AAE3D,UAAM,GAAG,QAAQ,UAAU,EAAE,MAAM;AAKnC,QAAI,SAAU,wBAAuB,UAAU,kBAAkB,MAAS;AAE1E,WAAO,aAAa;AAAA,MAClB;AAAA,QACE,MAAM,4BAA4B,UAAU;AAAA,QAC5C,SAAS;AAAA,MACX;AAAA,MACA,EAAE,QAAQ,IAAI;AAAA,IAChB;AAAA,EACF,SAAS,OAAO;AACd,QAAI,gBAAgB,KAAK,EAAG,QAAO,aAAa,KAAK,MAAM,MAAM,EAAE,QAAQ,MAAM,OAAO,CAAC;AACzF,QAAI,kCAAkC,KAAK,GAAG;AAC5C,aAAO,aAAa;AAAA,QAClB,EAAE,OAAO,kDAAkD;AAAA,QAC3D,EAAE,QAAQ,IAAI;AAAA,MAChB;AAAA,IACF;AAEA,WAAO,MAAM,sCAAsC,EAAE,KAAK,MAAM,CAAC;AACjE,WAAO,aAAa;AAAA,MAClB,EAAE,OAAO,uCAAuC;AAAA,MAChD,EAAE,QAAQ,IAAI;AAAA,IAChB;AAAA,EACF;AACF;AAEO,MAAM,UAAU;AAAA,EACrB,SAAS;AAAA,IACP,KAAK;AAAA,MACH,SAAS;AAAA,MACT,aAAa;AAAA,MACb,MAAM,CAAC,WAAW;AAAA,MAClB,OAAO,oCAAoC,KAAK,EAAE,YAAY,KAAK,CAAC,EAAE,OAAO;AAAA,QAC3E,SAAS,EAAE,QAAQ,EAAE,SAAS;AAAA,QAC9B,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,QAC5B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,SAAS;AAAA,QACxD,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,MACtD,CAAC;AAAA,MACD,WAAW;AAAA,QACT;AAAA,UACE,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,MAAM;AAAA,cACJ;AAAA,gBACE,IAAI;AAAA,gBACJ,YAAY;AAAA,gBACZ,cAAc;AAAA,gBACd,aAAa;AAAA,gBACb,SAAS;AAAA,gBACT,YAAY;AAAA,kBACV,OAAO;AAAA,oBACL;AAAA,sBACE,QAAQ;AAAA,sBACR,UAAU;AAAA,sBACV,UAAU;AAAA,oBACZ;AAAA,oBACA;AAAA,sBACE,QAAQ;AAAA,sBACR,UAAU;AAAA,sBACV,UAAU;AAAA,oBACZ;AAAA,oBACA;AAAA,sBACE,QAAQ;AAAA,sBACR,UAAU;AAAA,sBACV,UAAU;AAAA,oBACZ;AAAA,kBACF;AAAA,kBACA,aAAa;AAAA,oBACX;AAAA,sBACE,cAAc;AAAA,sBACd,YAAY;AAAA,sBACZ,UAAU;AAAA,sBACV,SAAS;AAAA,oBACX;AAAA,oBACA;AAAA,sBACE,cAAc;AAAA,sBACd,YAAY;AAAA,sBACZ,UAAU;AAAA,sBACV,SAAS;AAAA,oBACX;AAAA,kBACF;AAAA,gBACF;AAAA,gBACA,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,gBAAgB;AAAA,gBAChB,WAAW;AAAA,gBACX,WAAW;AAAA,cACb;AAAA,YACF;AAAA,YACA,YAAY;AAAA,cACV,OAAO;AAAA,cACP,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,SAAS;AAAA,YACX;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,aAAa;AAAA,MACb,MAAM,CAAC,WAAW;AAAA,MAClB,aAAa;AAAA,QACX,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,YAAY;AAAA,UACZ,cAAc;AAAA,UACd,aAAa;AAAA,UACb,SAAS;AAAA,UACT,YAAY;AAAA,YACV,OAAO;AAAA,cACL;AAAA,gBACE,QAAQ;AAAA,gBACR,UAAU;AAAA,gBACV,UAAU;AAAA,cACZ;AAAA,cACA;AAAA,gBACE,QAAQ;AAAA,gBACR,UAAU;AAAA,gBACV,UAAU;AAAA,gBACV,aAAa;AAAA,cACf;AAAA,cACA;AAAA,gBACE,QAAQ;AAAA,gBACR,UAAU;AAAA,gBACV,UAAU;AAAA,gBACV,aAAa;AAAA,gBACb,aAAa;AAAA,kBACX,aAAa;AAAA,kBACb,WAAW;AAAA,gBACb;AAAA,cACF;AAAA,cACA;AAAA,gBACE,QAAQ;AAAA,gBACR,UAAU;AAAA,gBACV,UAAU;AAAA,cACZ;AAAA,YACF;AAAA,YACA,aAAa;AAAA,cACX;AAAA,gBACE,cAAc;AAAA,gBACd,YAAY;AAAA,gBACZ,UAAU;AAAA,gBACV,SAAS;AAAA,cACX;AAAA,cACA;AAAA,gBACE,cAAc;AAAA,gBACd,YAAY;AAAA,gBACZ,UAAU;AAAA,gBACV,SAAS;AAAA,cACX;AAAA,cACA;AAAA,gBACE,cAAc;AAAA,gBACd,YAAY;AAAA,gBACZ,UAAU;AAAA,gBACV,SAAS;AAAA,gBACT,YAAY;AAAA,kBACV;AAAA,oBACE,cAAc;AAAA,oBACd,cAAc;AAAA,oBACd,QAAQ;AAAA,sBACN,IAAI;AAAA,sBACJ,SAAS;AAAA,sBACT,UAAU;AAAA,oBACZ;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,WAAW;AAAA,QACT;AAAA,UACE,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,MAAM;AAAA,cACJ,IAAI;AAAA,cACJ,YAAY;AAAA,cACZ,cAAc;AAAA,cACd,aAAa;AAAA,cACb,SAAS;AAAA,cACT,YAAY;AAAA,gBACV,OAAO;AAAA,kBACL,EAAE,QAAQ,SAAS,UAAU,SAAS,UAAU,QAAQ;AAAA,kBACxD;AAAA,oBACE,QAAQ;AAAA,oBACR,UAAU;AAAA,oBACV,UAAU;AAAA,kBACZ;AAAA,kBACA;AAAA,oBACE,QAAQ;AAAA,oBACR,UAAU;AAAA,oBACV,UAAU;AAAA,kBACZ;AAAA,kBACA,EAAE,QAAQ,OAAO,UAAU,OAAO,UAAU,MAAM;AAAA,gBACpD;AAAA,gBACA,aAAa;AAAA,kBACX;AAAA,oBACE,cAAc;AAAA,oBACd,YAAY;AAAA,oBACZ,UAAU;AAAA,oBACV,SAAS;AAAA,kBACX;AAAA,kBACA;AAAA,oBACE,cAAc;AAAA,oBACd,YAAY;AAAA,oBACZ,UAAU;AAAA,oBACV,SAAS;AAAA,kBACX;AAAA,kBACA;AAAA,oBACE,cAAc;AAAA,oBACd,YAAY;AAAA,oBACZ,UAAU;AAAA,oBACV,SAAS;AAAA,kBACX;AAAA,gBACF;AAAA,cACF;AAAA,cACA,SAAS;AAAA,cACT,UAAU;AAAA,cACV,gBAAgB;AAAA,cAChB,WAAW;AAAA,cACX,WAAW;AAAA,YACb;AAAA,YACA,SAAS;AAAA,UACX;AAAA,QACF;AAAA,QACA;AAAA,UACE,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,OAAO;AAAA,YACP,SAAS;AAAA,cACP;AAAA,gBACE,MAAM,CAAC,cAAc,OAAO;AAAA,gBAC5B,MAAM;AAAA,gBACN,SAAS;AAAA,cACX;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,OAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["/**\n * Workflow Definitions API\n *\n * Endpoints:\n * - GET /api/workflows/definitions - List workflow definitions\n * - POST /api/workflows/definitions - Create workflow definition\n */\n\nimport { randomUUID } from 'node:crypto'\nimport { NextRequest, NextResponse } from 'next/server'\nimport { z } from 'zod'\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport { escapeLikePattern } from '@open-mercato/shared/lib/db/escapeLikePattern'\nimport { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'\nimport { resolveOrganizationScopeForRequest } from '@open-mercato/core/modules/directory/utils/organizationScope'\nimport { resolveOrganizationScopeFilter, resolveSingleOrganizationIdOrDeny } from '@open-mercato/core/modules/directory/utils/organizationScopeFilter'\nimport { WorkflowDefinition } from '../../data/entities'\nimport {\n createWorkflowDefinitionInputSchema,\n createWorkflowDefinitionInputCheckedSchema,\n type CreateWorkflowDefinitionApiInput,\n} from '../../data/validators'\nimport { serializeWorkflowDefinition, serializeCodeWorkflowDefinition } from './serialize'\nimport {\n workflowDefinitionListResponseSchema,\n workflowDefinitionMutationResponseSchema,\n workflowErrorSchema,\n} from '../openapi'\nimport { invalidateTriggerCache } from '../../lib/event-trigger-service'\nimport { normalizeDefinitionValidationIssues } from '../../lib/definition-error-body'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport {\n mappingTargetIssuesForApi,\n UNSAFE_MAPPING_TARGET_MESSAGE,\n UNSAFE_MAPPING_TARGET_MESSAGE_KEY,\n} from '../../lib/mapping-target-validation'\nimport { getAllCodeWorkflows } from '../../lib/code-registry'\nimport {\n authorizeWorkflowGrantChange,\n normalizeGrantedFeatures,\n syncWorkflowDefinitionPrincipal,\n} from '../../lib/definition-grant'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\nimport { isCrudHttpError } from '@open-mercato/shared/lib/crud/errors'\n\nconst logger = createLogger('workflows')\n\nexport const metadata = {\n requireAuth: true,\n requireFeatures: ['workflows.definitions.view'],\n}\n\n// Post-versioning the unique constraint is (workflow_id, version, tenant_id);\n// the legacy name is still matched so the check survives a partially-migrated DB.\nconst WORKFLOW_ID_TENANT_UNIQUE_CONSTRAINT = 'workflow_definitions_workflow_id_tenant_id_unique'\nconst WORKFLOW_ID_VERSION_TENANT_UNIQUE_CONSTRAINT = 'workflow_definitions_workflow_id_version_tenant_id_unique'\n\nfunction isWorkflowIdUniqueConstraintError(error: unknown): boolean {\n if (!error || typeof error !== 'object') {\n return false\n }\n\n const value = error as Record<string, unknown>\n const constraint = value.constraint\n const code = value.code\n const message = typeof value.message === 'string' ? value.message : ''\n const detail = typeof value.detail === 'string' ? value.detail : ''\n\n if (constraint === WORKFLOW_ID_TENANT_UNIQUE_CONSTRAINT || constraint === WORKFLOW_ID_VERSION_TENANT_UNIQUE_CONSTRAINT) {\n return true\n }\n\n if (code === '23505' && (detail.includes('(workflow_id, tenant_id)') || detail.includes('(workflow_id, version, tenant_id)'))) {\n return true\n }\n\n return message.includes(WORKFLOW_ID_TENANT_UNIQUE_CONSTRAINT) || message.includes(WORKFLOW_ID_VERSION_TENANT_UNIQUE_CONSTRAINT)\n}\n\n/**\n * GET /api/workflows/definitions\n *\n * List workflow definitions with optional filters\n */\nexport async function GET(request: NextRequest) {\n try {\n const container = await createRequestContainer()\n const em = container.resolve('em')\n const auth = await getAuthFromRequest(request)\n\n if (!auth) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n const scope = await resolveOrganizationScopeForRequest({ container, auth, request })\n const tenantId = auth.tenantId\n const orgFilter = resolveOrganizationScopeFilter(scope, auth)\n\n const { searchParams } = new URL(request.url)\n const enabled = searchParams.get('enabled')\n const workflowId = searchParams.get('workflowId')\n const search = searchParams.get('search')\n const kind = searchParams.get('kind')\n const lifecycle = searchParams.get('lifecycle')\n const versionParam = searchParams.get('version')\n const version = versionParam !== null && /^\\d+$/.test(versionParam) ? parseInt(versionParam, 10) : null\n const limit = parseInt(searchParams.get('limit') || '50')\n const offset = parseInt(searchParams.get('offset') || '0')\n\n // Build where clause with tenant scoping\n const where: any = {\n tenantId,\n ...orgFilter.where,\n deletedAt: null,\n }\n\n if (enabled !== null) {\n where.enabled = enabled === 'true'\n }\n\n if (workflowId) {\n where.workflowId = workflowId\n }\n\n if (kind) {\n where.kind = kind\n }\n\n if (lifecycle) {\n where.lifecycle = lifecycle\n }\n\n if (version !== null) {\n where.version = version\n }\n\n if (search) {\n where.$or = [\n { workflowId: { $ilike: `%${escapeLikePattern(search)}%` } },\n { workflowName: { $ilike: `%${escapeLikePattern(search)}%` } },\n ]\n }\n\n // Determine which code workflows are shadowed by a DB row (so we can\n // exclude them from the code-only list) without loading all DB rows.\n const enabledFilter = enabled !== null ? enabled === 'true' : null\n const searchLower = search ? search.toLowerCase() : null\n const allCodeIds = getAllCodeWorkflows().map((cw) => cw.workflowId)\n const shadowed = allCodeIds.length > 0\n ? new Set(\n (\n await em.find(\n WorkflowDefinition,\n { ...where, workflowId: { $in: allCodeIds } },\n { fields: ['workflowId'] as const },\n )\n ).map((d: WorkflowDefinition) => d.workflowId),\n )\n : new Set<string>()\n\n const codeOnly = getAllCodeWorkflows()\n .filter((cw) => !shadowed.has(cw.workflowId))\n .filter((cw) => {\n // Code-based definitions are always kind=workflow / lifecycle=published.\n if (kind && kind !== 'workflow') return false\n if (lifecycle && lifecycle !== 'published') return false\n if (version !== null && cw.version !== version) return false\n if (searchLower) {\n const matches =\n cw.workflowId.toLowerCase().includes(searchLower) ||\n cw.workflowName.toLowerCase().includes(searchLower)\n if (!matches) return false\n }\n if (enabledFilter !== null && cw.enabled !== enabledFilter) return false\n if (workflowId && cw.workflowId !== workflowId) return false\n return true\n })\n .map((cw) => serializeCodeWorkflowDefinition(cw, `code:${cw.workflowId}`))\n\n const dbCount = await em.count(WorkflowDefinition, where)\n const total = dbCount + codeOnly.length\n\n // Fetch only the prefix of DB rows we might need to fill the requested\n // page after merging with the (already-filtered) code-only list.\n const dbWindowLimit = offset + limit\n const dbWindow = dbWindowLimit > 0\n ? await em.find(WorkflowDefinition, where, {\n orderBy: { workflowName: 'ASC' },\n limit: dbWindowLimit,\n })\n : []\n\n const serializedDb = dbWindow.map(serializeWorkflowDefinition)\n\n const merged = [...serializedDb, ...codeOnly].sort((a, b) =>\n a.workflowName.localeCompare(b.workflowName),\n )\n\n const paginated = merged.slice(offset, offset + limit)\n\n return NextResponse.json({\n data: paginated,\n pagination: {\n total,\n limit,\n offset,\n hasMore: offset + limit < total,\n },\n })\n } catch (error) {\n logger.error('Error listing workflow definitions', { err: error })\n return NextResponse.json(\n { error: 'Failed to list workflow definitions' },\n { status: 500 }\n )\n }\n}\n\n/**\n * POST /api/workflows/definitions\n *\n * Create a new workflow definition\n */\nexport async function POST(request: NextRequest) {\n try {\n const container = await createRequestContainer()\n const em = container.resolve('em')\n const auth = await getAuthFromRequest(request)\n\n if (!auth) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n const scope = await resolveOrganizationScopeForRequest({ container, auth, request })\n const tenantId = auth.tenantId\n const organizationId = resolveSingleOrganizationIdOrDeny(scope, auth)\n\n // Check create permission\n const rbacService = container.resolve('rbacService')\n const hasPermission = await rbacService.userHasAllFeatures(\n auth.sub,\n ['workflows.definitions.create'],\n {\n tenantId,\n organizationId,\n }\n )\n\n if (!hasPermission) {\n return NextResponse.json(\n { error: 'Insufficient permissions' },\n { status: 403 }\n )\n }\n\n const body = await request.json()\n\n // Validate input\n const validation = createWorkflowDefinitionInputCheckedSchema.safeParse(body)\n if (!validation.success) {\n return NextResponse.json(\n {\n error: 'Validation failed',\n details: normalizeDefinitionValidationIssues(validation.error),\n },\n { status: 400 }\n )\n }\n\n const input: CreateWorkflowDefinitionApiInput = validation.data\n const { translate } = await resolveTranslations()\n const mappingMessage = translate(UNSAFE_MAPPING_TARGET_MESSAGE_KEY, UNSAFE_MAPPING_TARGET_MESSAGE)\n const mappingIssues = mappingTargetIssuesForApi(input.definition, ['definition'], mappingMessage)\n if (mappingIssues.length > 0) {\n return NextResponse.json(\n { error: 'Validation failed', details: mappingIssues },\n { status: 400 }\n )\n }\n\n // New definitions default to strict interpolation (spec \u00A73.6). The default\n // lives on the create path only \u2014 a schema-level default would flip\n // existing lenient definitions on their next full-body update.\n const definitionData = input.definition.interpolation\n ? input.definition\n : { ...input.definition, interpolation: 'strict' as const }\n\n // Create always mints version 1. A workflowId that already exists (any\n // version) is a conflict \u2014 new versions are produced via the publish flow,\n // not by re-creating. orderBy keeps the existence check deterministic now\n // that multiple versions can coexist.\n const existing = await em.findOne(WorkflowDefinition, {\n workflowId: input.workflowId,\n tenantId,\n }, { orderBy: { version: 'DESC' } })\n\n if (existing) {\n return NextResponse.json(\n {\n error: `Workflow definition with ID \"${input.workflowId}\" already exists`,\n },\n { status: 409 }\n )\n }\n\n const grantedFeatures = normalizeGrantedFeatures(input.grantedFeatures)\n const grantFailure = await authorizeWorkflowGrantChange(rbacService, {\n userId: auth.sub,\n scope: { tenantId, organizationId },\n requested: grantedFeatures,\n current: [],\n })\n if (grantFailure) {\n return NextResponse.json(grantFailure.body, { status: grantFailure.status })\n }\n\n // Create workflow definition.\n //\n // The PK is minted up front (MikroORM does not generate UUIDs client-side)\n // so the execution principal \u2014 whose identity key is the definition id \u2014 can\n // be provisioned BEFORE the row claiming the grant is persisted. A failed\n // provisioning then leaves no definition pointing at a principal that does\n // not exist.\n //\n // `createdBy` is recorded here for the first time. It was never set on this\n // path, which silently disabled the definition-author fallback CALL_API and\n // INVOKE_AGENT rely on for event-triggered runs.\n const definition = em.create(WorkflowDefinition, {\n id: randomUUID(),\n workflowId: input.workflowId,\n workflowName: input.workflowName,\n description: input.description,\n version: input.version,\n definition: definitionData,\n metadata: input.metadata,\n enabled: input.enabled ?? true,\n grantedFeatures: grantedFeatures.length ? grantedFeatures : null,\n tenantId,\n organizationId,\n createdBy: auth.sub,\n updatedBy: auth.sub,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n\n await syncWorkflowDefinitionPrincipal(container, definition)\n\n await em.persist(definition).flush()\n\n // Newly-created embedded triggers must be visible to the wildcard event\n // subscriber immediately; invalidate the in-memory trigger cache so the\n // next event reload picks up this definition.\n if (tenantId) invalidateTriggerCache(tenantId, organizationId ?? undefined)\n\n return NextResponse.json(\n {\n data: serializeWorkflowDefinition(definition),\n message: 'Workflow definition created successfully',\n },\n { status: 201 }\n )\n } catch (error) {\n if (isCrudHttpError(error)) return NextResponse.json(error.body, { status: error.status })\n if (isWorkflowIdUniqueConstraintError(error)) {\n return NextResponse.json(\n { error: 'Workflow definition with this ID already exists' },\n { status: 409 }\n )\n }\n\n logger.error('Error creating workflow definition', { err: error })\n return NextResponse.json(\n { error: 'Failed to create workflow definition' },\n { status: 500 }\n )\n }\n}\n\nexport const openApi = {\n methods: {\n GET: {\n summary: 'List workflow definitions',\n description: 'Get a list of workflow definitions with optional filters. Supports pagination and search.',\n tags: ['Workflows'],\n query: createWorkflowDefinitionInputSchema.pick({ workflowId: true }).extend({\n enabled: z.boolean().optional(),\n search: z.string().optional(),\n limit: z.number().int().positive().default(50).optional(),\n offset: z.number().int().min(0).default(0).optional(),\n }),\n responses: [\n {\n status: 200,\n description: 'List of workflow definitions with pagination',\n schema: workflowDefinitionListResponseSchema,\n example: {\n data: [\n {\n id: '123e4567-e89b-12d3-a456-426614174000',\n workflowId: 'checkout-flow',\n workflowName: 'Checkout Flow',\n description: 'Complete checkout workflow for processing orders',\n version: 1,\n definition: {\n steps: [\n {\n stepId: 'start',\n stepName: 'Start',\n stepType: 'START',\n },\n {\n stepId: 'validate-cart',\n stepName: 'Validate Cart',\n stepType: 'AUTOMATED',\n },\n {\n stepId: 'end',\n stepName: 'End',\n stepType: 'END',\n },\n ],\n transitions: [\n {\n transitionId: 'start-to-validate',\n fromStepId: 'start',\n toStepId: 'validate-cart',\n trigger: 'auto',\n },\n {\n transitionId: 'validate-to-end',\n fromStepId: 'validate-cart',\n toStepId: 'end',\n trigger: 'auto',\n },\n ],\n },\n enabled: true,\n tenantId: '123e4567-e89b-12d3-a456-426614174001',\n organizationId: '123e4567-e89b-12d3-a456-426614174002',\n createdAt: '2025-12-08T10:00:00.000Z',\n updatedAt: '2025-12-08T10:00:00.000Z',\n },\n ],\n pagination: {\n total: 1,\n limit: 50,\n offset: 0,\n hasMore: false,\n },\n },\n },\n ],\n },\n POST: {\n summary: 'Create workflow definition',\n description: 'Create a new workflow definition. The definition must include at least START and END steps with at least one transition connecting them.',\n tags: ['Workflows'],\n requestBody: {\n schema: createWorkflowDefinitionInputSchema,\n example: {\n workflowId: 'checkout-flow',\n workflowName: 'Checkout Flow',\n description: 'Complete checkout workflow for processing orders',\n version: 1,\n definition: {\n steps: [\n {\n stepId: 'start',\n stepName: 'Start',\n stepType: 'START',\n },\n {\n stepId: 'validate-cart',\n stepName: 'Validate Cart',\n stepType: 'AUTOMATED',\n description: 'Validate cart items and check inventory',\n },\n {\n stepId: 'payment',\n stepName: 'Process Payment',\n stepType: 'AUTOMATED',\n description: 'Charge payment method',\n retryPolicy: {\n maxAttempts: 3,\n backoffMs: 1000,\n },\n },\n {\n stepId: 'end',\n stepName: 'End',\n stepType: 'END',\n },\n ],\n transitions: [\n {\n transitionId: 'start-to-validate',\n fromStepId: 'start',\n toStepId: 'validate-cart',\n trigger: 'auto',\n },\n {\n transitionId: 'validate-to-payment',\n fromStepId: 'validate-cart',\n toStepId: 'payment',\n trigger: 'auto',\n },\n {\n transitionId: 'payment-to-end',\n fromStepId: 'payment',\n toStepId: 'end',\n trigger: 'auto',\n activities: [\n {\n activityName: 'Send Order Confirmation',\n activityType: 'SEND_EMAIL',\n config: {\n to: '{{context.customerEmail}}',\n subject: 'Order Confirmation #{{context.orderId}}',\n template: 'order_confirmation',\n },\n },\n ],\n },\n ],\n },\n enabled: true,\n },\n },\n responses: [\n {\n status: 201,\n description: 'Workflow definition created successfully',\n schema: workflowDefinitionMutationResponseSchema,\n example: {\n data: {\n id: '123e4567-e89b-12d3-a456-426614174000',\n workflowId: 'checkout-flow',\n workflowName: 'Checkout Flow',\n description: 'Complete checkout workflow for processing orders',\n version: 1,\n definition: {\n steps: [\n { stepId: 'start', stepName: 'Start', stepType: 'START' },\n {\n stepId: 'validate-cart',\n stepName: 'Validate Cart',\n stepType: 'AUTOMATED',\n },\n {\n stepId: 'payment',\n stepName: 'Process Payment',\n stepType: 'AUTOMATED',\n },\n { stepId: 'end', stepName: 'End', stepType: 'END' },\n ],\n transitions: [\n {\n transitionId: 'start-to-validate',\n fromStepId: 'start',\n toStepId: 'validate-cart',\n trigger: 'auto',\n },\n {\n transitionId: 'validate-to-payment',\n fromStepId: 'validate-cart',\n toStepId: 'payment',\n trigger: 'auto',\n },\n {\n transitionId: 'payment-to-end',\n fromStepId: 'payment',\n toStepId: 'end',\n trigger: 'auto',\n },\n ],\n },\n enabled: true,\n tenantId: '123e4567-e89b-12d3-a456-426614174001',\n organizationId: '123e4567-e89b-12d3-a456-426614174002',\n createdAt: '2025-12-08T10:00:00.000Z',\n updatedAt: '2025-12-08T10:00:00.000Z',\n },\n message: 'Workflow definition created successfully',\n },\n },\n {\n status: 400,\n description: 'Validation error - invalid workflow structure',\n schema: workflowErrorSchema,\n example: {\n error: 'Validation failed',\n details: [\n {\n path: ['definition', 'steps'],\n code: 'custom',\n message: 'Workflow must have at least START and END steps',\n },\n ],\n },\n },\n {\n status: 409,\n description: 'Conflict - workflow with same ID and version already exists',\n schema: workflowErrorSchema,\n example: {\n error: 'Workflow definition with ID \"checkout-flow\" and version 1 already exists',\n },\n },\n ],\n },\n },\n}\n\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }