{"version":3,"file":"acorex-platform-workflow.mjs","sources":["../../../../libs/platform/workflow/src/lib/contracts/errors.types.ts","../../../../libs/platform/workflow/src/lib/workflow-event-dispatcher.service.ts","../../../../libs/platform/workflow/src/lib/contracts/workflow.types.ts","../../../../libs/platform/workflow/src/lib/contracts/index.ts","../../../../libs/platform/workflow/src/lib/workflow-registery.service.ts","../../../../libs/platform/workflow/src/lib/actions/decide.action.ts","../../../../libs/platform/workflow/src/lib/workflow.service.ts","../../../../libs/platform/workflow/src/lib/actions/start-workflow.action.ts","../../../../libs/platform/workflow/src/lib/engine/activity/activity-definition.provider.ts","../../../../libs/platform/workflow/src/lib/engine/activity/activity-definition.service.ts","../../../../libs/platform/workflow/src/lib/engine/runtime/workflow-engine.ts","../../../../libs/platform/workflow/src/lib/engine/runtime/workflow-engine.errors.ts","../../../../libs/platform/workflow/src/lib/engine/runtime/workflow-runtime.types.ts","../../../../libs/platform/workflow/src/lib/engine/runtime/workflow-expression-scope.service.ts","../../../../libs/platform/workflow/src/lib/engine/runtime/activity-executor.service.ts","../../../../libs/platform/workflow/src/lib/engine/runtime/workflow-continuation.hook.ts","../../../../libs/platform/workflow/src/lib/engine/runtime/workflow-continuation.policy.ts","../../../../libs/platform/workflow/src/lib/engine/runtime/workflow-manager.service.ts","../../../../libs/platform/workflow/src/lib/engine/workflow/workflow-definition.provider.ts","../../../../libs/platform/workflow/src/lib/engine/runtime/workflow-local-engine.ts","../../../../libs/platform/workflow/src/lib/engine/runtime/index.ts","../../../../libs/platform/workflow/src/lib/engine/workflow/workflow-definition.service.ts","../../../../libs/platform/workflow/src/lib/workflow.module.ts","../../../../libs/platform/workflow/src/acorex-platform-workflow.ts"],"sourcesContent":["export class AXPWorkflowError extends Error {\n    constructor(message: string, public inner: Error | null = null) {\n        super(message);\n        this.name = 'AXPWorkflowError';\n    }\n}","import { Injectable } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\nimport { AXPWorkflowEvent } from './contracts/workflow.types';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class AXPWorkflowEventService {\n  private eventSubject = new Subject<AXPWorkflowEvent>();\n\n  dispatch(event: AXPWorkflowEvent): void {\n    this.eventSubject.next(event);\n  }\n\n  get events$(): Observable<AXPWorkflowEvent> {\n    return this.eventSubject.asObservable();\n  }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { filter } from 'rxjs';\nimport { AXPWorkflowEventService } from '../workflow-event-dispatcher.service';\nimport { cloneDeep, get } from 'lodash-es';\nimport { setSmart } from '@acorex/platform/contracts';\n\nexport interface AXPWorkflow {\n  steps: { [stepName: string]: AXPWorkflowStep };\n  startStepId: string;\n}\n\nexport class AXPWorkflowContext {\n\n  constructor(initialData: any = {}) {\n    this.variables = cloneDeep(initialData);\n  }\n\n  private variables: any = {};\n  private stepOutputs: Map<string, any> = new Map();\n\n  setVariable(key: string, value: any): void {\n    setSmart(this.variables, key, value);\n  }\n\n  setVariables(context: any = {}) {\n    this.variables = { ...this.variables, ...context };\n  }\n\n  getVariable<T = any>(key?: string | null): T {\n    return !key ? this.variables : get(this.variables, key);\n  }\n\n  setOutput(key: string, output: any): void {\n    this.stepOutputs.set(key, output);\n  }\n\n  setOutputs(values: Map<string, any>): void {\n    this.stepOutputs = new Map([...this.stepOutputs, ...values])\n  }\n\n  getOutput<T = any>(key: string): T {\n    return this.stepOutputs.get(key);\n  }\n}\n\nexport type AXPWorkflowActionInput = any;\n\nexport type AXPWorkflowConditionType = 'AND' | 'OR' | 'SINGLE';\n\nexport interface AXPWorkflowCondition {\n  type: AXPWorkflowConditionType;\n  conditions?: AXPWorkflowCondition[]; // Nested conditions\n  expression?: string; // Used if type is 'SINGLE'\n}\n\nexport interface AXPWorkflowNextStep {\n  conditions: AXPWorkflowCondition[];\n  nextStepId: string;\n}\n\nexport interface AXPWorkflowStep {\n  id?: string;\n  action: AXPWorkflowAction | string;\n  input?: AXPWorkflowActionInput;\n  nextSteps?: AXPWorkflowNextStep[];\n  conditions?: AXPWorkflowCondition[];\n}\n@Injectable()\nexport abstract class AXPWorkflowAction {\n  private eventService = inject(AXPWorkflowEventService);\n\n  protected dispatch(event: AXPWorkflowEvent): void {\n    this.eventService.dispatch(event);\n  }\n\n  abstract execute(context: AXPWorkflowContext): Promise<void>;\n}\n\n@Injectable()\nexport abstract class AXPWorkflowFunction {\n  abstract execute(...args: any[]): Promise<any> | any;\n}\n\nexport interface AXPWorkflowEvent<T = any> {\n  type: string;\n  payload?: T;\n}\n\nexport function createWorkFlowEvent<T>(type: string) {\n  const eventCreator = (payload: T) => ({ type, payload });\n  eventCreator.type = type;\n  return eventCreator;\n}\n\nexport function ofType<T extends { type: string }>(...allowedTypes: Array<{ type: string }>) {\n  return filter((event: T) => allowedTypes.some((type) => event.type === type.type));\n}\n","//#region ---- Contracts barrel ----\n\nexport * from './errors.types';\nexport * from './workflow.types';\n\n//#endregion\n","import { Injectable, Type } from '@angular/core';\nimport { AXPWorkflow, AXPWorkflowAction, AXPWorkflowFunction, AXPWorkflowStep } from './contracts/workflow.types';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class AXPWorkflowRegistryService {\n  private functionsMap = new Map<string, Type<AXPWorkflowFunction>>();\n  private actionsMap = new Map<string, Type<AXPWorkflowAction>>();\n  private workflowsMap = new Map<string, AXPWorkflow>();\n\n  registerWorkflow(name: string, workflow: AXPWorkflow): void {\n    this.workflowsMap.set(name, workflow);\n  }\n\n  getWorkflow(name: string): AXPWorkflow | undefined {\n    return this.workflowsMap.get(name);\n  }\n\n  registerAction(name: string, action: Type<AXPWorkflowAction>): void {\n    this.actionsMap.set(name, action);\n  }\n\n  getAction(name: string): Type<AXPWorkflowAction> | undefined {\n    return this.actionsMap.get(name);\n  }\n\n  registerFunction(name: string, func: Type<AXPWorkflowFunction>): void {\n    this.functionsMap.set(name, func);\n  }\n\n  getFunction(name: string): Type<AXPWorkflowFunction> | undefined {\n    return this.functionsMap.get(name);\n  }\n\n  getFunctionNames(): string[] {\n    return Array.from(this.functionsMap.keys());\n  }\n\n  getStep(workflowName: string, stepName: string): AXPWorkflowStep | undefined {\n    const workflow = this.workflowsMap.get(workflowName);\n    if (workflow) {\n      const steps = workflow.steps as { [key: string]: AXPWorkflowStep };\n      return steps[stepName];\n    }\n    return undefined;\n  }\n\n  updateStepInWorkflow(workflowName: string, stepName: string, step: AXPWorkflowStep): void {\n    const workflow = this.workflowsMap.get(workflowName);\n    if (workflow) {\n      const steps = workflow.steps as { [key: string]: AXPWorkflowStep };\n      if (steps[stepName]) {\n        steps[stepName] = step;\n      } else {\n        throw new Error(`Step with name ${stepName} does not exist in workflow ${workflowName}.`);\n      }\n    } else {\n      throw new Error(`Workflow with name ${workflowName} does not exist.`);\n    }\n  }\n\n  addStepToWorkflow(workflowName: string, stepName: string, step: AXPWorkflowStep): void {\n    const workflow = this.workflowsMap.get(workflowName);\n    if (workflow) {\n      const steps = workflow.steps as { [key: string]: AXPWorkflowStep };\n      if (!steps[stepName]) {\n        steps[stepName] = step;\n      } else {\n        throw new Error(`Step with name ${stepName} already exists in workflow ${workflowName}.`);\n      }\n    } else {\n      throw new Error(`Workflow with name ${workflowName} does not exist.`);\n    }\n  }\n\n  addAfterStep(\n    workflowId: string,\n    stepId: string,\n    newStepId: string,\n    newStepAction: string,\n    conditionExpression: string\n  ): void {\n    const step = this.getStep(workflowId, stepId);\n    if (step != undefined) {\n      this.addStepToWorkflow(workflowId, newStepId, {\n        action: newStepAction,\n        nextSteps: step.nextSteps,\n      });\n\n      this.updateStepInWorkflow(workflowId, stepId, {\n        ...step,\n        nextSteps: [\n          {\n            conditions: [{ type: 'SINGLE', expression: conditionExpression }],\n            nextStepId: newStepId,\n          },\n        ],\n      });\n    }\n  }\n}\n","import { Injectable } from \"@angular/core\";\nimport { AXPWorkflowAction, AXPWorkflowContext } from \"../contracts/workflow.types\";\n\n@Injectable({\n    providedIn: 'root',\n})\nexport class AXPWorkflowDecideAction extends AXPWorkflowAction {\n    async execute(context: AXPWorkflowContext): Promise<void> {\n        // its a fake action\n    }\n}","import { Injectable, Injector, inject } from '@angular/core';\nimport { cloneDeep, set } from 'lodash-es';\nimport { Observable } from 'rxjs';\nimport { AXPWorkflowError } from './contracts/errors.types';\nimport { AXPWorkflowEventService } from './workflow-event-dispatcher.service';\nimport { AXPWorkflowRegistryService } from './workflow-registery.service';\nimport {\n  AXPWorkflow,\n  AXPWorkflowAction,\n  AXPWorkflowCondition,\n  AXPWorkflowContext,\n  AXPWorkflowEvent,\n  AXPWorkflowFunction,\n  AXPWorkflowNextStep,\n  AXPWorkflowStep,\n} from './contracts/workflow.types';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class AXPWorkflowService {\n  private eventService = inject(AXPWorkflowEventService);\n\n  get events$(): Observable<AXPWorkflowEvent> {\n    return this.eventService.events$;\n  }\n\n  constructor(private registryService: AXPWorkflowRegistryService, private injector: Injector) { }\n\n  exists(name: string): boolean {\n    return !!this.registryService.getWorkflow(name);\n  }\n\n  async execute(\n    workflow: AXPWorkflow | string,\n    initialContext: AXPWorkflowContext | any | null = null\n  ): Promise<AXPWorkflowContext> {\n    // Instantiate or retrieve the workflow\n    const wk = typeof workflow === 'string' ? this.getWorkflowInstance(workflow) : workflow;\n\n    let currentStepId = wk.startStepId;\n    const context =\n      initialContext instanceof AXPWorkflowContext\n        ? initialContext\n        : new AXPWorkflowContext(this.processData(initialContext) ?? {});\n    // Initialize context with initial variables\n\n    while (currentStepId) {\n      const currentStep = wk.steps[currentStepId];\n      if (!currentStep) {\n        throw new AXPWorkflowError(`Step '${currentStepId}' not found in the workflow steps.`);\n      }\n\n      // Instantiate or retrieve the action\n      const action =\n        typeof currentStep.action === 'string' ? this.getActionInstance(currentStep.action) : currentStep.action;\n      //\n      if (currentStep.input) {\n        let inputs: any = {};\n        await this.processInputs(cloneDeep(currentStep.input), inputs, '', context);\n        await new Promise((resolve) =>\n          setTimeout(async () => {\n            Object.assign(action, inputs);\n            resolve(0);\n          })\n        );\n      }\n      try {\n        await new Promise((resolve) =>\n          setTimeout(async () => {\n            await action.execute(context);\n            resolve(0);\n          }, 0)\n        );\n      } catch (error) {\n        console.error(error);\n        throw new AXPWorkflowError('Workflow Error', error as Error);\n      }\n      // Determine the next step based on the conditions\n      const nextStepInfo = await this.determineNextStep(currentStep, context);\n      if (nextStepInfo) {\n        currentStepId = nextStepInfo.nextStepId;\n      } else {\n        break; // Exit the loop if no next step is determined\n      }\n    }\n    return context;\n  }\n\n  private processData(initialContext: any): any {\n    //TODO: update values with expressions and return new object\n    return initialContext;\n  }\n\n  private getActionInstance(actionName: string): AXPWorkflowAction {\n    const actionType = this.registryService.getAction(actionName);\n    if (!actionType) {\n      throw new AXPWorkflowError(`Action type '${actionName}' not found in the registry.`);\n    }\n    return this.injector.get(actionType);\n  }\n\n  private getWorkflowInstance(workflowName: string): AXPWorkflow {\n    const workflowType = this.registryService.getWorkflow(workflowName);\n    if (!workflowType) {\n      throw new AXPWorkflowError(`Workflow type '${workflowName}' not found in the registry.`);\n    }\n    return workflowType;\n  }\n\n  private async determineNextStep(\n    currentStep: AXPWorkflowStep,\n    context: AXPWorkflowContext\n  ): Promise<AXPWorkflowNextStep | null> {\n    if (!currentStep.nextSteps) {\n      return null;\n    }\n    for (const nextStep of currentStep.nextSteps) {\n      if (await this.evaluateCondition(nextStep.conditions, context)) {\n        return nextStep;\n      }\n    }\n    return null;\n  }\n\n  private async evaluateCondition(conditions: AXPWorkflowCondition[], context: AXPWorkflowContext): Promise<boolean> {\n    if (!conditions || conditions.length === 0) {\n      return true; // If no conditions, the step proceeds\n    }\n\n    // Map each condition to a promise using evaluateSingleCondition\n    const conditionPromises = conditions.map((condition) => this.evaluateSingleCondition(condition, context));\n\n    // Wait for all promises to resolve\n    const results = await Promise.all(conditionPromises);\n\n    // Check if every condition is true\n    return results.every((result) => result);\n  }\n\n  private async evaluateSingleCondition(\n    condition: AXPWorkflowCondition,\n    context: AXPWorkflowContext\n  ): Promise<boolean> {\n    switch (condition.type) {\n      case 'SINGLE':\n        return (!condition.expression ? true : await this.evaluateExpression(condition.expression, context)) as boolean;\n      case 'AND':\n        // Evaluate all conditions with 'AND' logic\n        const andConditions = condition.conditions ?? [];\n        const andResults = await Promise.all(andConditions.map((cond) => this.evaluateSingleCondition(cond, context)));\n        return andResults.every((result) => result);\n\n      case 'OR':\n        // Evaluate all conditions with 'OR' logic\n        const orConditions = condition.conditions ?? [];\n        const orResults = await Promise.all(orConditions.map((cond) => this.evaluateSingleCondition(cond, context)));\n        return orResults.some((result) => result);\n\n      default:\n        throw new AXPWorkflowError(`Unsupported condition type: ${condition.type}`);\n    }\n  }\n\n  //TODO: return any and recursively update object, update scopes\n  private async evaluateExpression(templateExpression: string, context: AXPWorkflowContext): Promise<Boolean> {\n    try {\n      let expression = '';\n      if (typeof templateExpression === 'string' && templateExpression.trim().includes('{{')) {\n        const expressionMatch = templateExpression.match(/\\{\\{\\s*(.*?)\\s*\\}\\}/);\n        if (!expressionMatch) {\n          throw Error(`No valid expression found in \"${templateExpression}\"`);\n        }\n        expression = expressionMatch[1];\n      } else {\n        expression = templateExpression;\n      }\n      // Create a scope that includes context and registered functions\n      const scope = { context, ...this.createFunctionScope() };\n      // Evaluating the expression within the created scope\n      const sandbox = new Function('scope', `return (async function() { with (scope) { return ${expression}; } })();`);\n      const result = await sandbox(scope);\n      return result;\n    } catch (error) {\n      console.error('Error evaluating expression:', error);\n      return false;\n    }\n  }\n\n  private async processInputs(obj: any, inputs: any, pathPrefix: string = '', context: any = {}): Promise<void> {\n    if (!obj) {\n      return;\n    }\n\n    for await (const i of Object.entries(obj)) {\n      const key = i[0];\n      const value = i[1];\n      const currentPath = pathPrefix ? `${pathPrefix}.${key}` : key;\n      if (typeof value === 'string' && value.trim().includes('{{')) {\n        const expValue = await this.evaluateExpression(value, context);\n        set(inputs, currentPath, expValue);\n      } else if (\n        typeof value === 'object' &&\n        value !== null &&\n        (value.constructor === Object || Array.isArray(value))\n      ) {\n        // Recursively handle nested objects\n        this.processInputs(value, inputs, currentPath, context);\n      } else {\n        // Apply static values directly\n        set(inputs, currentPath, value);\n      }\n    }\n  }\n\n  private createFunctionScope(): any {\n    const scope: any = {};\n    this.registryService.getFunctionNames().forEach((name) => {\n      scope[name] = this.getFunctionInstance(name).execute;\n    });\n    return { methods: { scope } };\n  }\n\n  private getFunctionInstance(functionName: string): AXPWorkflowFunction {\n    const functionType = this.registryService.getFunction(functionName);\n    if (!functionType) {\n      throw new AXPWorkflowError(`Function type '${functionName}' not found in the registry.`);\n    }\n    return this.injector.get(functionType);\n  }\n}\n","import { inject, Injectable } from \"@angular/core\";\nimport { AXPWorkflowAction, AXPWorkflowContext } from \"../contracts/workflow.types\";\nimport { AXPWorkflowService } from \"../workflow.service\";\n\n@Injectable({\n    providedIn: 'root',\n})\nexport class AXPStartWorkflowAction extends AXPWorkflowAction {\n\n    private workflowService = inject(AXPWorkflowService)\n    private workflow: string;\n    private context: any;\n\n    async execute(context: AXPWorkflowContext): Promise<void> {\n        //console.log(\"start WK current context\", context);\n        //console.log(\"start WK input context\", this.context);\n        if (this.context)\n            context.setVariables(this.context)\n        //console.log(\"start WK merged context\", context);\n        try {\n            await this.workflowService.execute(this.workflow, context);\n        }\n        catch (e: unknown) {\n            throw e;\n        }\n\n    }\n}\n\n","import { InjectionToken } from '@angular/core';\nimport { AXPActivityCategory, AXPActivityDefinition } from '@acorex/platform/contracts';\n\nexport type AXPActivityProviderToken =\n    | AXPActivityProvider\n    | Promise<AXPActivityProvider>;\n\nexport const AXP_ACTIVITY_PROVIDER = new InjectionToken<AXPActivityProviderToken[]>('AXP_ACTIVITY_PROVIDER', {\n    factory: () => [],\n});\n\nexport interface AXPActivityProvider {\n    /**\n     * Get list of activity definitions for a category.\n     * @param categoryId - Category ID to filter activities\n     * @returns Promise of activity definitions array\n     */\n    getList(categoryId: string): Promise<AXPActivityDefinition[]>;\n    \n    /**\n     * Get activity definition by name (unique identifier).\n     * The name is used as the command key for execution.\n     * @param name - Activity name (unique identifier and command key)\n     * @returns Promise of activity definition or undefined if not found\n     */\n    getById(name: string): Promise<AXPActivityDefinition | undefined>;\n}\n\nexport type AXPActivityCategoryProviderToken =\n    | AXPActivityCategoryProvider\n    | Promise<AXPActivityCategoryProvider>;\n\nexport const AXP_ACTIVITY_CATEGORY_PROVIDER = new InjectionToken<AXPActivityCategoryProviderToken[]>('AXP_ACTIVITY_CATEGORY_PROVIDER', {\n    factory: () => [],\n});\n\nexport interface AXPActivityCategoryProvider {\n    getList(parentId?: string): Promise<AXPActivityCategory[]>;\n    getById(id: string): Promise<AXPActivityCategory | undefined>;\n}\n\n","//#region ----   Imports   ----\n\nimport { inject, Injectable } from '@angular/core';\nimport { AXPActivityCategory, AXPActivityDefinition } from '@acorex/platform/contracts';\nimport { AXP_ACTIVITY_CATEGORY_PROVIDER, AXP_ACTIVITY_PROVIDER } from './activity-definition.provider';\n\n//#endregion\n\n/**\n * Optimized Activity Definition Service\n * \n * Manages activity definitions (metadata) for UI and tooling.\n * Similar to AXPReportDefinitionService - only handles metadata, not execution.\n * \n * Performance optimizations:\n * 1. Uses childrenCount to determine if category has children (no query needed)\n * 2. Uses itemsCount to determine if category has activities (no query needed)\n * 3. Aggressive caching prevents duplicate API calls\n * 4. Single pending request per resource prevents race conditions\n * 5. Lazy loading - only loads data when needed\n */\n@Injectable({\n    providedIn: 'root',\n})\nexport class AXPActivityDefinitionService {\n    //#region ----   Providers & Caches   ----\n\n    private readonly categoryProviders = inject(AXP_ACTIVITY_CATEGORY_PROVIDER, { optional: true }) || [];\n    private readonly activityProviders = inject(AXP_ACTIVITY_PROVIDER, { optional: true }) || [];\n\n    //#endregion\n\n    //#region ----   Cache Storage   ----\n\n    /** Cache for categories by id - O(1) lookup */\n    private categoriesById = new Map<string, AXPActivityCategory>();\n\n    /** Cache for categories by parentId - O(1) lookup */\n    private categoriesByParentId = new Map<string | undefined, AXPActivityCategory[]>();\n\n    /** Cache for activity definitions by categoryId - O(1) lookup */\n    private activitiesByCategory = new Map<string, AXPActivityDefinition[]>();\n\n    /** Cache for individual activity definitions by name - O(1) lookup */\n    private activitiesByName = new Map<string, AXPActivityDefinition>();\n\n    /** Track which provider index owns each category (by category ID) */\n    private categoryOwnership = new Map<string, number>(); // Maps categoryId → provider index\n\n    /** Pending API requests to prevent duplicate calls */\n    private pendingCategoriesRequests = new Map<string | undefined, Promise<AXPActivityCategory[]>>();\n    private pendingActivitiesRequests = new Map<string, Promise<AXPActivityDefinition[]>>();\n    private pendingActivityRequests = new Map<string, Promise<AXPActivityDefinition | undefined>>();\n\n    //#endregion\n\n    //#region ----   Initialization   ----\n\n    //#endregion\n\n    //#region ----   Public API: Categories   ----\n\n    /**\n     * Get categories by parentId with aggressive caching\n     * \n     * Optimization: Returns cached result immediately if available,\n     * preventing unnecessary API calls during navigation\n     * \n     * @param parentId - Parent category ID (undefined = root categories)\n     * @returns Array of categories with count metadata (childrenCount, itemsCount)\n     */\n    async getCategories(parentId?: string): Promise<AXPActivityCategory[]> {\n        // ✅ Fast path: Return cached result\n        if (this.categoriesByParentId.has(parentId)) {\n            return this.categoriesByParentId.get(parentId)!;\n        }\n\n        // ✅ Prevent duplicate requests: Return pending promise\n        if (this.pendingCategoriesRequests.has(parentId)) {\n            return this.pendingCategoriesRequests.get(parentId)!;\n        }\n\n        // ✅ Create single request and cache it\n        const requestPromise = this.loadCategoriesFromProviders(parentId);\n        this.pendingCategoriesRequests.set(parentId, requestPromise);\n\n        return requestPromise;\n    }\n\n    /**\n     * Get single category by ID with O(1) lookup\n     * \n     * Optimization: Uses Map for instant retrieval, falls back to\n     * searching cache, then providers if not found\n     */\n    async getCategoryById(categoryId: string): Promise<AXPActivityCategory | undefined> {\n        // ✅ Fast path: O(1) lookup in cache\n        if (this.categoriesById.has(categoryId)) {\n            return this.categoriesById.get(categoryId);\n        }\n\n        // ✅ Search in cached parent-child lists\n        for (const categories of this.categoriesByParentId.values()) {\n            const found = categories.find(cat => cat.id === categoryId);\n            if (found) {\n                this.categoriesById.set(categoryId, found);\n                return found;\n            }\n        }\n\n        // ✅ Load root categories if not loaded\n        if (!this.categoriesByParentId.has(undefined)) {\n            await this.getCategories();\n            if (this.categoriesById.has(categoryId)) {\n                return this.categoriesById.get(categoryId);\n            }\n        }\n\n        // ✅ Breadth-first search through hierarchy\n        return this.searchCategoryInHierarchy(categoryId);\n    }\n\n    /**\n     * Get category path from root to specified category\n     * \n     * Optimization: Builds path using cached categories only\n     */\n    async getCategoriesPathById(categoryId: string): Promise<AXPActivityCategory[]> {\n        const path: AXPActivityCategory[] = [];\n        let currentCategoryId: string | undefined = categoryId;\n\n        while (currentCategoryId) {\n            const category = await this.getCategoryById(currentCategoryId);\n            if (!category) {\n                throw new Error(`Category '${currentCategoryId}' not found`);\n            }\n            path.unshift(category);\n            currentCategoryId = category.parentId;\n        }\n\n        return path;\n    }\n\n    //#endregion\n\n    //#region ----   Public API: Activity Definitions   ----\n\n    /**\n     * Get activity definitions for a category with smart caching\n     * \n     * Optimization: Checks itemsCount before querying\n     * - If itemsCount = 0, returns empty array (no API call)\n     * - If itemsCount > 0, loads and caches activity definitions\n     * - Returns cached result on subsequent calls\n     * \n     * @param categoryId - Category ID to get activity definitions from\n     * @returns Array of activity definitions\n     */\n    async getActivitiesByCategoryId(categoryId: string): Promise<AXPActivityDefinition[]> {\n        // ✅ Fast path: Return cached result\n        if (this.activitiesByCategory.has(categoryId)) {\n            return this.activitiesByCategory.get(categoryId)!;\n        }\n\n        // ✅ Smart optimization: Check itemsCount before querying\n        const category = await this.getCategoryById(categoryId);\n        if (category && category.itemsCount !== undefined && category.itemsCount === 0) {\n            // Category has no activities - cache empty array and skip API call\n            const emptyArray: AXPActivityDefinition[] = [];\n            this.activitiesByCategory.set(categoryId, emptyArray);\n            return emptyArray;\n        }\n\n        // ✅ Prevent duplicate requests\n        if (this.pendingActivitiesRequests.has(categoryId)) {\n            return this.pendingActivitiesRequests.get(categoryId)!;\n        }\n\n        // ✅ Load from providers\n        const requestPromise = this.loadActivitiesFromProviders(categoryId);\n        this.pendingActivitiesRequests.set(categoryId, requestPromise);\n\n        return requestPromise;\n    }\n\n    /**\n     * Get single activity definition by name with O(1) lookup\n     * \n     * Optimization: Uses Map for instant retrieval\n     * \n     * @param name - Activity name (unique identifier and command key)\n     * @returns Activity definition or undefined if not found\n     */\n    async getActivityByName(name: string): Promise<AXPActivityDefinition | undefined> {\n        // ✅ Fast path: O(1) lookup in cache\n        if (this.activitiesByName.has(name)) {\n            return this.activitiesByName.get(name);\n        }\n\n        // ✅ Prevent duplicate requests\n        if (this.pendingActivityRequests.has(name)) {\n            return this.pendingActivityRequests.get(name)!;\n        }\n\n        // ✅ Load from providers\n        const requestPromise = this.loadActivityFromProviders(name);\n        this.pendingActivityRequests.set(name, requestPromise);\n\n        return requestPromise;\n    }\n\n    /**\n     * Get all activity definitions (flat list) by loading root categories and their activities.\n     * Used by activity selector UIs (e.g. automation command configurator).\n     */\n    async getAllActivities(): Promise<AXPActivityDefinition[]> {\n        const categories = await this.getCategories(undefined);\n        const all: AXPActivityDefinition[] = [];\n        for (const cat of categories) {\n            const activities = await this.getActivitiesByCategoryId(cat.id);\n            all.push(...activities);\n        }\n        return all;\n    }\n\n    /**\n     * Get category ID containing a specific activity definition\n     * \n     * Optimization: Searches cache first, loads on-demand if needed\n     */\n    async getCategoryIdByActivityName(activityName: string): Promise<string | undefined> {\n        // ✅ Search in cached activity definitions\n        for (const [categoryId, definitions] of this.activitiesByCategory.entries()) {\n            if (definitions.some(def => def.name === activityName)) {\n                return categoryId;\n            }\n        }\n\n        // ✅ Try loading the activity definition to find its category\n        const definition = await this.getActivityByName(activityName);\n        if (definition && definition.category) {\n            // Try to find category by name/id\n            const categories = await this.getCategories();\n            const found = categories.find((cat) => cat.id === definition.category?.id);\n            if (found) {\n                return found.id;\n            }\n        }\n\n        return undefined;\n    }\n\n    /**\n     * Get category path for an activity\n     */\n    async getCategoriesPathByActivityName(activityName: string): Promise<AXPActivityCategory[]> {\n        const categoryId = await this.getCategoryIdByActivityName(activityName);\n        if (!categoryId) {\n            throw new Error(`Activity '${activityName}' not found in any category`);\n        }\n        return this.getCategoriesPathById(categoryId);\n    }\n\n    //#endregion\n\n    //#region ----   Private: Data Loading   ----\n\n    /**\n     * Load categories from providers and cache results\n     * \n     * Optimization: Tracks provider ownership to avoid unnecessary API calls\n     * - For root (parentId = undefined): Query ALL providers\n     * - For children: Only query the provider that owns the parent\n     */\n    private async loadCategoriesFromProviders(parentId?: string): Promise<AXPActivityCategory[]> {\n        try {\n            const resolvedProviders = await Promise.allSettled(this.categoryProviders);\n            const categories: AXPActivityCategory[] = [];\n\n            // Determine which provider(s) to query\n            const providerIndicesToQuery = parentId\n                ? this.getProviderIndexForCategory(parentId)\n                : null; // Root: query all providers\n\n            for (let i = 0; i < resolvedProviders.length; i++) {\n                const p = resolvedProviders[i];\n\n                // Skip if we have a specific provider index and this isn't it\n                if (providerIndicesToQuery !== null && !providerIndicesToQuery.includes(i)) {\n                    continue;\n                }\n\n                if (p.status === 'fulfilled' && p.value && typeof p.value.getList === 'function') {\n                    try {\n                        const cats = await p.value.getList(parentId);\n                        if (Array.isArray(cats) && cats.length > 0) {\n                            categories.push(...cats);\n\n                            // ✅ Track ownership: This provider INDEX owns these categories\n                            cats.forEach(cat => this.categoryOwnership.set(cat.id, i));\n                        }\n                    } catch {\n                        // Continue on error - try other providers\n                    }\n                }\n            }\n\n            // ✅ Cache results for fast subsequent access\n            this.categoriesByParentId.set(parentId, categories);\n            categories.forEach(cat => this.categoriesById.set(cat.id, cat));\n\n            return categories;\n        } finally {\n            this.pendingCategoriesRequests.delete(parentId);\n        }\n    }\n\n    /**\n     * Get the provider index that owns a specific category\n     * \n     * @returns Array with provider index, or null if ownership unknown (query all)\n     */\n    private getProviderIndexForCategory(categoryId: string): number[] | null {\n        const ownerIndex = this.categoryOwnership.get(categoryId);\n\n        if (ownerIndex !== undefined) {\n            return [ownerIndex];\n        }\n\n        // Ownership unknown - will query all providers (fallback)\n        return null;\n    }\n\n    /**\n     * Load activity definitions from providers and cache results\n     * \n     * Optimization: Only queries the provider that owns the category\n     * Uses provider INDEX to match category provider with activity provider\n     */\n    private async loadActivitiesFromProviders(categoryId: string): Promise<AXPActivityDefinition[]> {\n        try {\n            const resolvedProviders = await Promise.allSettled(this.activityProviders);\n            const definitions: AXPActivityDefinition[] = [];\n\n            // ✅ Smart routing: Get provider INDEX that owns this category\n            const ownerIndex = this.categoryOwnership.get(categoryId);\n            const providerIndicesToQuery = ownerIndex !== undefined ? [ownerIndex] : null;\n\n            for (let i = 0; i < resolvedProviders.length; i++) {\n                const p = resolvedProviders[i];\n\n                // Skip if we have a specific provider index and this isn't it\n                if (providerIndicesToQuery !== null && !providerIndicesToQuery.includes(i)) {\n                    continue;\n                }\n\n                if (p.status === 'fulfilled' && p.value && typeof p.value.getList === 'function') {\n                    try {\n                        const defs = await p.value.getList(categoryId);\n                        if (Array.isArray(defs)) {\n                            definitions.push(...defs);\n                        }\n                    } catch {\n                        // Continue on error - try other providers\n                    }\n                }\n            }\n\n            // ✅ Cache results for fast subsequent access\n            this.activitiesByCategory.set(categoryId, definitions);\n            definitions.forEach(def => {\n                if (def.name) {\n                    this.activitiesByName.set(def.name, def);\n                }\n            });\n\n            return definitions;\n        } finally {\n            this.pendingActivitiesRequests.delete(categoryId);\n        }\n    }\n\n    /**\n     * Load single activity definition from providers and cache result\n     */\n    private async loadActivityFromProviders(name: string): Promise<AXPActivityDefinition | undefined> {\n        try {\n            const resolvedProviders = await Promise.allSettled(this.activityProviders);\n\n            // Try providers first\n            for (const p of resolvedProviders) {\n                if (p.status === 'fulfilled' && p.value && typeof p.value.getById === 'function') {\n                    try {\n                        const result = await p.value.getById(name);\n                        if (result) {\n                            this.activitiesByName.set(name, result);\n                            return result;\n                        }\n                    } catch {\n                        // Continue on error\n                    }\n                }\n            }\n\n            // Fallback: Search in cached activity definitions\n            for (const definitions of this.activitiesByCategory.values()) {\n                const found = definitions.find(def => def.name === name);\n                if (found) {\n                    this.activitiesByName.set(name, found);\n                    return found;\n                }\n            }\n\n            return undefined;\n        } finally {\n            this.pendingActivityRequests.delete(name);\n        }\n    }\n\n    /**\n     * Breadth-first search through category hierarchy\n     */\n    private async searchCategoryInHierarchy(categoryId: string): Promise<AXPActivityCategory | undefined> {\n        const searchQueue: (string | undefined)[] = [undefined];\n        const searched = new Set<string | undefined>();\n\n        while (searchQueue.length > 0) {\n            const parentId = searchQueue.shift()!;\n            if (searched.has(parentId)) continue;\n            searched.add(parentId);\n\n            const categories = await this.getCategories(parentId);\n            const found = categories.find(cat => cat.id === categoryId);\n\n            if (found) {\n                return found;\n            }\n\n            // ✅ Optimization: Only search children if childrenCount > 0\n            for (const category of categories) {\n                if (category.childrenCount > 0 && !searched.has(category.id)) {\n                    searchQueue.push(category.id);\n                }\n            }\n        }\n\n        return undefined;\n    }\n\n    //#endregion\n\n    //#region ----   Cache Management   ----\n\n    /**\n     * Check if category has children (uses cached count)\n     */\n    categoryHasChildren(categoryId: string): boolean {\n        const category = this.categoriesById.get(categoryId);\n        return category ? category.childrenCount > 0 : false;\n    }\n\n    /**\n     * Check if category has activities (uses cached count)\n     */\n    categoryHasActivities(categoryId: string): boolean {\n        const category = this.categoriesById.get(categoryId);\n        return category ? (category.itemsCount ?? 0) > 0 : false;\n    }\n\n    /**\n     * Clear all caches\n     */\n    clearAllCache(): void {\n        this.categoriesById.clear();\n        this.categoriesByParentId.clear();\n        this.activitiesByCategory.clear();\n        this.activitiesByName.clear();\n        this.categoryOwnership.clear();\n        this.pendingCategoriesRequests.clear();\n        this.pendingActivitiesRequests.clear();\n        this.pendingActivityRequests.clear();\n    }\n\n    /**\n     * Clear categories cache only\n     */\n    clearCategoriesCache(): void {\n        this.categoriesById.clear();\n        this.categoriesByParentId.clear();\n        this.categoryOwnership.clear();\n        this.pendingCategoriesRequests.clear();\n    }\n\n    /**\n     * Clear activities cache only\n     */\n    clearActivitiesCache(): void {\n        this.activitiesByCategory.clear();\n        this.activitiesByName.clear();\n        this.pendingActivitiesRequests.clear();\n        this.pendingActivityRequests.clear();\n    }\n\n    //#endregion\n}\n\n","import { InjectionToken } from '@angular/core';\nimport {\n  AXPClaimWorkflowTaskRequest,\n  AXPClaimWorkflowTaskResponse,\n  AXPReassignWorkflowTaskToSelfRequest,\n  AXPReassignWorkflowTaskToSelfResponse,\n  AXPRevertResumeAfterDeclinedInteractiveContinuationRequest,\n  AXPRevertResumeAfterDeclinedInteractiveContinuationResponse,\n  AXPFrontActivityCompleteRequest,\n  AXPFrontActivityCompleteResponse,\n  AXPGetWorkflowStateRequest,\n  AXPResumeWorkflowRequest,\n  AXPResumeWorkflowResponse,\n  AXPStartWorkflowRequest,\n  AXPStartWorkflowResponse,\n  AXPWorkflowInstanceState,\n} from './workflow-runtime.types';\n\n/**\n * Interface for workflow engine operations.\n */\nexport interface AXPWorkflowEngine {\n  /**\n   * Start a new workflow instance.\n   *\n   * Creates a new workflow instance in backend and returns instance ID.\n   *\n   * @param request - Start workflow request\n   * @returns Response with instanceId and initial state\n   *\n   */\n  start(request: AXPStartWorkflowRequest): Promise<AXPStartWorkflowResponse>;\n\n  /**\n   * Resume a suspended workflow instance.\n   *\n   * Resumes workflow instance after user interaction (e.g., after show-dialog).\n   *\n   * @param request - Resume workflow request\n   * @returns Resume response with next step and updated state\n   *\n   */\n  resume(request: AXPResumeWorkflowRequest): Promise<AXPResumeWorkflowResponse>;\n\n  /**\n   * Get current workflow instance state.\n   *\n   * Retrieves current state of a workflow instance from backend.\n   *\n   * @param request - Get state request\n   * @returns Current workflow instance state\n   *\n   */\n  getState(request: AXPGetWorkflowStateRequest): Promise<AXPWorkflowInstanceState>;\n\n  frontActivtyComplete(request: AXPFrontActivityCompleteRequest): Promise<AXPFrontActivityCompleteResponse>;\n\n  /**\n   * Optional: claim a pooled task (e.g. cartable) without consuming the bookmark.\n   * Engines that do not support pooling should omit this method.\n   */\n  claimTask?(request: AXPClaimWorkflowTaskRequest): Promise<AXPClaimWorkflowTaskResponse>;\n\n  /**\n   * Optional: reassign a human-task bookmark to the current user (requires permission on the engine).\n   */\n  reassignTaskToSelf?(\n    request: AXPReassignWorkflowTaskToSelfRequest,\n  ): Promise<AXPReassignWorkflowTaskToSelfResponse>;\n\n  /**\n   * Optional: restore a suspended task-board step when the user declines a pre-interactive continuation prompt.\n   */\n  revertResumeAfterDeclinedInteractiveContinuation?(\n    request: AXPRevertResumeAfterDeclinedInteractiveContinuationRequest,\n  ): Promise<AXPRevertResumeAfterDeclinedInteractiveContinuationResponse>;\n\n  /**\n   * Optional: terminate a non-finished instance (e.g. superseded lifecycle run).\n   */\n  cancelInstance?(instanceId: string, reason?: string): Promise<void>;\n}\n\n/**\n * Injection token for workflow engine.\n * Default implementation is AXPWorkflowLocalEngine.\n */\nexport const AXP_WORKFLOW_ENGINE = new InjectionToken<AXPWorkflowEngine>('AXP_WORKFLOW_ENGINE');\n","//#region ----   Error Codes   ----\n\n/**\n * Stable workflow engine error codes for UI branching (toasts, take-over flow, etc.).\n */\nexport const AXP_WORKFLOW_ERROR_CODES = {\n  TASK_NOT_ASSIGNEE: 'WORKFLOW_TASK_NOT_ASSIGNEE',\n  CLAIM_REQUIRED: 'WORKFLOW_CLAIM_REQUIRED',\n  REASSIGN_NOT_ALLOWED: 'WORKFLOW_REASSIGN_NOT_ALLOWED',\n} as const;\n\nexport type AXPWorkflowErrorCode = (typeof AXP_WORKFLOW_ERROR_CODES)[keyof typeof AXP_WORKFLOW_ERROR_CODES];\n\n//#endregion\n\n//#region ----   Engine Error   ----\n\n/**\n * Business-rule failure from {@link AXPWorkflowEngine} (expected, user-facing).\n */\nexport class AXPWorkflowEngineError extends Error {\n  constructor(\n    message: string,\n    public readonly code: AXPWorkflowErrorCode,\n    public readonly details?: Record<string, unknown>,\n  ) {\n    super(message);\n    this.name = 'AXPWorkflowEngineError';\n  }\n}\n\n/**\n * Resolves a stable error code from an unknown thrown value.\n */\nexport function getWorkflowEngineErrorCode(error: unknown): AXPWorkflowErrorCode | undefined {\n  if (error instanceof AXPWorkflowEngineError) {\n    return error.code;\n  }\n  return undefined;\n}\n\n/**\n * Resolves a user-facing message and optional code from an unknown thrown value.\n */\nexport function getWorkflowEngineErrorInfo(error: unknown): { message: string; code?: AXPWorkflowErrorCode } {\n  if (error instanceof AXPWorkflowEngineError) {\n    return { message: error.message, code: error.code };\n  }\n  if (error instanceof Error) {\n    return { message: error.message };\n  }\n  return { message: 'An unexpected workflow error occurred' };\n}\n\n//#endregion\n","\nimport type { AXPWorkflowContinuationMetadata } from '@acorex/platform/contracts';\n\n/**\n * Represents a workflow task that needs to be executed.\n * Inspired by Temporal's Activity Tasks and Camunda's External Tasks.\n */\nexport interface AXPWorkflowTask {\n  /**\n   * Unique token for this task (used for completion/security).\n   */\n  taskToken: string;\n\n  /**\n   * Activity ID from workflow definition.\n   */\n  activityId: string;\n\n  /**\n   * Activity type (e.g., 'workflow-activity:show-toast').\n   */\n  activityType: string;\n\n  /**\n   * Human-readable activity name.\n   */\n  activityName?: string;\n\n  /**\n   * Where this task should be executed.\n   * - 'frontend': Execute in browser (UI activities, console, events)\n   * - 'backend': Execute in backend (business logic, API calls)\n   * - 'both': Execute in both frontend and backend (hybrid activities)\n   */\n  executionMode: 'frontend' | 'backend' | 'both';\n\n  /**\n   * Type of task for inbox handling.\n   */\n  taskType?: 'human-task' | 'ui-activity' | 'system-activity';\n\n  /**\n   * Input data for the activity (for frontend activities).\n   */\n  input?: Record<string, any>;\n\n  /**\n   * Configuration for the activity (for frontend activities).\n   */\n  config?: Record<string, any>;\n\n  /**\n   * Continuation UX copied from the activity definition at task creation time.\n   */\n  continuation?: AXPWorkflowContinuationMetadata;\n}\n\n/**\n * Request to start a workflow instance.\n */\nexport interface AXPStartWorkflowRequest {\n  /**\n   * Workflow ID to execute.\n   */\n  workflowId: string;\n\n  /**\n   * Initial input data for workflow.\n   */\n  input: Record<string, any>;\n}\n\n/**\n * Response after starting workflow instance.\n */\nexport interface AXPStartWorkflowResponse {\n  /**\n   * Unique instance ID for this workflow run.\n   */\n  instanceId: string;\n\n  /**\n   * Current workflow state.\n   */\n  state: AXPWorkflowInstanceState;\n\n  /**\n   * First task to execute (determined by backend).\n   * Client should execute this task based on executionMode.\n   */\n  pendingTask?: AXPWorkflowTask | null;\n\n  /**\n   * Activity outputs map (activityId -> output).\n   * Returned for expression evaluation in subsequent activities.\n   */\n  activityOutputs?: Record<string, any>;\n\n  /**\n   * Last activity output (convenience).\n   * Prefer using `activityOutputs[activityId]` when possible.\n   */\n  lastActivityOutput?: any;\n}\n\n/**\n * Request to resume a suspended workflow.\n */\nexport interface AXPResumeWorkflowRequest {\n  /**\n   * Instance ID.\n   */\n  instanceId: string;\n\n  /**\n   * Step ID that was waiting for user input.\n   */\n  stepId: string;\n\n  /**\n   * Secure task token issued with the pending task.\n   * Backend validates and resolves the step using this token.\n   */\n  taskToken: string;\n\n  /**\n   * User action outcome (e.g., 'Confirmed', 'Cancelled').\n   */\n  outcome?: string;\n\n  /**\n   * Optional user input data.\n   */\n  userInput?: any;\n}\n\n/**\n * Response after resuming workflow.\n */\nexport interface AXPResumeWorkflowResponse {\n  /**\n   * Activity execution output.\n   */\n  output: any;\n\n  /**\n   * Activity execution outcomes.\n   */\n  outcomes: Record<string, any>;\n\n  /**\n   * Next task to execute (if any).\n   */\n  nextTask?: AXPWorkflowTask | null;\n\n  /**\n   * Updated workflow state.\n   */\n  state: AXPWorkflowInstanceState;\n}\n\n/**\n * Request to get workflow instance state.\n */\nexport interface AXPGetWorkflowStateRequest {\n  /**\n   * Instance ID.\n   */\n  instanceId: string;\n}\n\n/**\n * Workflow instance state (managed by backend, cached in client).\n */\nexport interface AXPWorkflowInstanceState {\n  /**\n   * Unique instance ID.\n   */\n  instanceId: string;\n\n  /**\n   * Workflow ID.\n   */\n  workflowId: string;\n\n  /**\n   * Current instance status.\n   */\n  status: 'running' | 'completed' | 'suspended' | 'error';\n\n  /**\n   * Current step ID (if suspended or running).\n   */\n  currentStepId?: string;\n\n  /**\n   * Workflow variables (state).\n   */\n  variables: Record<string, any>;\n\n  /**\n   * Activity outputs map (activityId -> output).\n   * Used by expression evaluation scope as `outputs.activityId`.\n   */\n  activityOutputs?: Record<string, any>;\n\n  /**\n   * Last activity output (convenience).\n   * Useful when the next activity needs a quick access to the previous result.\n   */\n  lastActivityOutput?: any;\n\n  /**\n   * Initial input data.\n   */\n  input: Record<string, any>;\n\n  /**\n   * Final output data (if completed).\n   */\n  output?: Record<string, any>;\n\n  /**\n   * Last update timestamp.\n   */\n  lastUpdated: Date;\n}\n\n  export interface AXPFrontActivityCompleteRequest {\n    /**\n     * Instance ID.\n     */\n    instanceId: string;\n\n    activityNode : string;\n\n    output : Record<string,any>;\n\n    outcome ?: string;\n  }\n\nexport interface AXPFrontActivityCompleteResponse {\n  /**\n   * Activity execution output.\n   */\n  output?: any;\n\n  /**\n   * Activity execution outcomes.\n   */\n  outcomes?: Record<string, any>;\n\n  /**\n   * Next task to execute (if any).\n   */\n  nextTask?: AXPWorkflowTask | null;\n\n  /**\n   * Updated workflow state.\n   */\n  state?: AXPWorkflowInstanceState;\n}\n\n/**\n * Activity types that use the task board (suspend until user acts via inbox), not inline interactive execution.\n */\nexport const AXP_WORKFLOW_TASK_BOARD_ACTIVITY_TYPES: readonly string[] = [\n  'workflow-activity:human-task',\n  'workflow-activity:cartable',\n];\n\nexport function axpIsWorkflowTaskBoardActivityType(activityType: string | undefined | null): boolean {\n  return !!activityType && AXP_WORKFLOW_TASK_BOARD_ACTIVITY_TYPES.includes(activityType);\n}\n\n/**\n * Claim a pooled workflow task (updates bookmark assignee without resuming the workflow).\n */\nexport interface AXPClaimWorkflowTaskRequest {\n  instanceId: string;\n  bookmarkId: string;\n  stepId: string;\n}\n\nexport interface AXPClaimWorkflowTaskResponse {\n  success: boolean;\n  error?: string;\n  errorCode?: string;\n}\n\n/**\n * Reassign a human-task bookmark to the current user without resuming the workflow.\n */\nexport interface AXPReassignWorkflowTaskToSelfRequest {\n  instanceId: string;\n  bookmarkId: string;\n  stepId: string;\n}\n\nexport interface AXPReassignWorkflowTaskToSelfResponse {\n  success: boolean;\n  error?: string;\n  errorCode?: string;\n}\n\n/** Restore task-board visibility after the user declines a pre-interactive continuation prompt. */\nexport interface AXPRevertResumeAfterDeclinedInteractiveContinuationRequest {\n  instanceId: string;\n  /** Human-task / cartable step that was resumed from the task board. */\n  suspendedStepId: string;\n  /** Inline frontend step that was about to run when the user declined. */\n  abortedStepId?: string;\n  /** Bookmark id of the suspended step (when known). */\n  bookmarkId?: string;\n}\n\nexport interface AXPRevertResumeAfterDeclinedInteractiveContinuationResponse {\n  success: boolean;\n  state?: AXPWorkflowInstanceState;\n  error?: string;\n}\n\n","import { Injectable, inject } from '@angular/core';\nimport { AXPContextEvalFactory, AXPExpressionEvaluatorScope } from '@acorex/platform/core';\nimport { AXPWorkflowInstanceState } from './workflow-runtime.types';\n\n//#region ----   Types & Interfaces   ----\n\n/**\n * Workflow expression evaluation context.\n * Contains workflow state data needed for expression evaluation.\n */\nexport interface WorkflowExpressionContext {\n  /** Workflow input values */\n  inputs: Record<string, any>;\n  \n  /** Workflow state variables */\n  variables: Record<string, any>;\n  \n  /** Previous activity outputs (activityId -> output) */\n  outputs: Record<string, any>;\n}\n\n//#endregion\n\n/**\n * Workflow Expression Scope Service\n * \n * Shared service for building expression evaluation scope from workflow data.\n * Used by both Local Engine and Mock Runtime to manage workflow data (inputs, variables, outputs).\n * \n * Responsibilities:\n * - Build expression evaluation scope from workflow state\n * - Provide context.eval() function for accessing workflow data\n * - Manage workflow data structure (inputs, variables, outputs)\n * \n * This service does NOT:\n * - Execute activities\n * - Evaluate expressions (delegates to AXPExpressionEvaluatorService)\n * - Manage workflow state (handled by runtime)\n * \n * @example\n * ```typescript\n * const scopeService = inject(WorkflowExpressionScopeService);\n * \n * // Build scope from workflow state\n * const scope = scopeService.buildScope({\n *   inputs: state.input || {},\n *   variables: state.variables || {},\n *   outputs: activityOutputs\n * });\n * \n * // Or build from state directly\n * const scope = scopeService.buildScopeFromState(state, activityOutputs);\n * ```\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class WorkflowExpressionScopeService {\n  private readonly contextEvalFactory = inject(AXPContextEvalFactory);\n\n  //#region ----   Private Helpers (dot-notation input normalization) ----\n\n  /**\n   * Collect dot-notation key-value pairs from nested objects so that e.g.\n   * { metadata: { \"metadata.questionnaire.id\": \"x\" } } becomes { \"metadata.questionnaire.id\": \"x\" } at root.\n   * Top-level non-dot keys are kept as-is.\n   */\n  private flattenDotKeysFromTree(obj: Record<string, any>): Record<string, any> {\n    if (obj === null || typeof obj !== 'object') return obj;\n    const result: Record<string, any> = {};\n    for (const [key, value] of Object.entries(obj)) {\n      if (key.includes('.')) {\n        result[key] = value;\n      } else if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n        for (const [k, v] of Object.entries(value)) {\n          if (k.includes('.')) {\n            result[k] = v;\n          } else {\n            result[key + '.' + k] = v;\n          }\n        }\n      } else {\n        result[key] = value;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Expand flat keys with dots into nested objects.\n   * e.g. { \"metadata.questionnaire.id\": \"x\" } -> { metadata: { questionnaire: { id: \"x\" } } }.\n   */\n  private expandDotKeys(obj: Record<string, any>): Record<string, any> {\n    if (obj === null || typeof obj !== 'object') return obj;\n    const result: Record<string, any> = {};\n    const dotKeys: [string, any][] = [];\n    const simpleKeys: [string, any][] = [];\n    for (const [key, value] of Object.entries(obj)) {\n      if (key.includes('.')) {\n        dotKeys.push([key, value]);\n      } else {\n        simpleKeys.push([key, value]);\n      }\n    }\n    for (const [key, value] of dotKeys) {\n      const parts = key.split('.');\n      let current = result;\n      for (let i = 0; i < parts.length - 1; i++) {\n        const part = parts[i];\n        if (!(part in current) || typeof current[part] !== 'object' || current[part] === null) {\n          current[part] = {};\n        }\n        current = current[part];\n      }\n      current[parts[parts.length - 1]] = value;\n    }\n    for (const [key, value] of simpleKeys) {\n      result[key] = value;\n    }\n    return result;\n  }\n\n  /**\n   * Normalize workflow input so that flat dot-notation keys (e.g. from form schema\n   * \"metadata.questionnaire.id\") become nested for expression access (inputs.metadata.questionnaire.id).\n   */\n  private normalizeInputs(input: Record<string, any> | undefined): Record<string, any> {\n    if (!input || typeof input !== 'object') return {};\n    const flattened = this.flattenDotKeysFromTree(input);\n    return this.expandDotKeys(flattened);\n  }\n\n  //#endregion\n\n  //#region ----   Public Methods   ----\n\n  /**\n   * Build expression evaluation scope for workflow activities.\n   * \n   * Provides workflow-specific data (inputs, variables, outputs) and context.eval() function.\n   * Other data (session, current user, etc.) are provided by expression evaluator scope providers.\n   * \n   * Scope includes:\n   * - inputs: Workflow input values (accessible as inputs.propertyName)\n   * - variables: Workflow state variables (accessible as variables.propertyName or vars.propertyName)\n   * - outputs: Previous activity outputs (accessible as outputs.activityId)\n   * - context.eval(path): Function to access nested properties from workflow data\n   * \n   * Expressions can use:\n   * - {{inputs.userName}} - Direct access to workflow input\n   * - {{variables.someVar}} or {{vars.someVar}} - Direct access to workflow variable\n   * - {{outputs.activityId.property}} - Direct access to previous activity output\n   * - {{context.eval(\"inputs.userName\")}} - Access via context.eval (supports nested paths)\n   * - {{context.eval(\"variables.someVar\")}} - Access variables via context.eval\n   * - {{context.eval(\"outputs.activityId.property\")}} - Access outputs via context.eval\n   * - {{session.currentUser().name}} - Access current user via expression evaluator scope providers\n   * \n   * The context.eval() function provides a unified way to access all workflow data,\n   * similar to how entity-detail-list uses context.eval() to access parent data.\n   * \n   * @param context - Workflow expression context containing inputs, variables, and outputs\n   * @returns Expression evaluator scope with workflow data and context.eval() function\n   */\n  buildScope(context: WorkflowExpressionContext): AXPExpressionEvaluatorScope {\n    // Normalize inputs so flat dot-notation keys (e.g. metadata.questionnaire.id from forms) become nested for expressions\n    const inputs = this.normalizeInputs(context.inputs || {});\n\n    // Build merged workflow data object for context.eval()\n    // This allows expressions like: context.eval(\"inputs.userName\") or context.eval(\"variables.count\")\n    const workflowData = {\n      inputs,\n      variables: context.variables || {},\n      vars: context.variables || {}, // Alias for convenience\n      outputs: context.outputs || {},\n    };\n\n    // Build scope object with workflow-specific data and context.eval()\n    // Note: AXPExpressionEvaluatorScope type expects { [namespace]: { [name]: Function } }\n    // but evaluate() method actually accepts flat objects with values too\n    // We'll use 'any' to allow both values and functions\n    const scope: any = {\n      // Direct access to workflow data\n      inputs: workflowData.inputs,\n      variables: workflowData.variables,\n      vars: workflowData.vars,\n      outputs: workflowData.outputs,\n      \n      // Context object with eval function (similar to entity-detail-list pattern)\n      context: this.contextEvalFactory.createScope(workflowData),\n    };\n\n    return scope as AXPExpressionEvaluatorScope;\n  }\n\n  /**\n   * Build expression evaluation scope from workflow instance state.\n   * \n   * Convenience method that extracts data from AXPWorkflowInstanceState.\n   * \n   * @param state - Workflow instance state\n   * @param activityOutputs - Map of activity outputs (activityId -> output)\n   * @returns Expression evaluator scope with workflow data and context.eval() function\n   */\n  buildScopeFromState(\n    state: AXPWorkflowInstanceState,\n    activityOutputs?: Map<string, any> | Record<string, any>\n  ): AXPExpressionEvaluatorScope {\n    // Convert activity outputs to record format\n    const outputs: Record<string, any> = {};\n    if (activityOutputs) {\n      if (activityOutputs instanceof Map) {\n        activityOutputs.forEach((output, activityId) => {\n          outputs[activityId] = output;\n        });\n      } else {\n        Object.assign(outputs, activityOutputs);\n      }\n    }\n\n    // Convenience alias for the last activity output (if available).\n    // This allows expressions like: {{outputs.last.someField}}\n    if (outputs['last'] === undefined && state.lastActivityOutput !== undefined) {\n      outputs['last'] = state.lastActivityOutput;\n    }\n\n    return this.buildScope({\n      inputs: this.normalizeInputs((state.input || {}) as Record<string, any>),\n      variables: state.variables || {},\n      outputs: outputs,\n    });\n  }\n\n  //#endregion\n}\n\n","import { Injectable, inject } from '@angular/core';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXPCommandService } from '@acorex/platform/runtime';\nimport { AXPMultiLanguageString } from '@acorex/platform/contracts';\nimport { AXPExpressionEvaluatorService } from '@acorex/platform/core';\nimport { AXPWorkflowTask, AXPWorkflowInstanceState } from './workflow-runtime.types';\nimport { WorkflowExpressionScopeService } from './workflow-expression-scope.service';\n\n//#region ----   Constants   ----\n\n/**\n * Activity types handled internally by the workflow engine (e.g. mock backend).\n * When such an activity is not registered as Command on the client, we skip execution\n * without warning — the engine will run it when executing the workflow.\n */\nconst ENGINE_BUILTIN_ACTIVITY_TYPES = new Set<string>([\n  'workflow-activity:set-variable',\n  'workflow-activity:http-request',\n  'workflow-activity:resolve-employee-user-id',\n]);\n\n//#endregion\n\n//#region ----   Types & Interfaces   ----\n\n/**\n * Result of executing a workflow activity.\n */\nexport interface ActivityExecutionResult {\n  /**\n   * Activity execution output.\n   */\n  output: any;\n\n  /**\n   * Activity execution outcome (e.g., 'Done', 'Confirmed', 'Cancelled', 'Failed').\n   */\n  outcome: string;\n}\n\n//#endregion\n\n/**\n * Activity Executor Service\n * \n * Service for executing workflow activities via CommandBus.\n * Automatically evaluates expressions in activity inputs before execution.\n * \n * @example\n * ```typescript\n * const executor = inject(ActivityExecutor);\n * \n * // Execute activity with task and workflow state (expressions will be evaluated)\n * const result = await executor.execute(task, workflowState, activityOutputs);\n * ```\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class ActivityExecutor {\n  //#region ----   Services & Dependencies   ----\n\n  private readonly commandService = inject(AXPCommandService);\n  private readonly expressionEvaluator = inject(AXPExpressionEvaluatorService);\n  private readonly expressionScopeService = inject(WorkflowExpressionScopeService);\n  private readonly translateService = inject(AXTranslationService);\n\n  //#endregion\n\n  //#region ----   Public Methods   ----\n\n  /**\n   * Execute a workflow activity with expression evaluation.\n   * \n   * Evaluates expressions in activity inputs using workflow state,\n   * then executes the activity via CommandBus.\n   * \n   * @param task - Workflow task containing activity information\n   * @param workflowState - Current workflow instance state (for expression evaluation)\n   * @param activityOutputs - Map of previous activity outputs (for expression evaluation)\n   * @returns Execution result with output and outcome\n   */\n  async execute(\n    task: AXPWorkflowTask,\n    workflowState?: AXPWorkflowInstanceState,\n    activityOutputs?: Map<string, any> | Record<string, any>\n  ): Promise<ActivityExecutionResult> {\n    \n    try {\n      const activityName = task.activityType;\n\n      // Evaluate inputs if workflow state is provided\n      let evaluatedInputs = task.input || {};\n      if (workflowState) {\n        // Prefer explicit outputs, fallback to outputs stored in state\n        const outputsForScope =\n          activityOutputs ??\n          (workflowState.activityOutputs as Record<string, any> | undefined) ??\n          undefined;\n\n        // Build expression scope from workflow state\n        const scope = this.expressionScopeService.buildScopeFromState(workflowState, outputsForScope);\n        \n        // Evaluate all inputs recursively (handles nested objects and arrays)\n        evaluatedInputs = await this.expressionEvaluator.evaluate(task.input || {}, scope);\n      }\n\n      // Check if command exists\n      const commandExists = this.commandService.exists(activityName);\n\n      if (!commandExists) {\n        if (!ENGINE_BUILTIN_ACTIVITY_TYPES.has(activityName)) {\n          console.warn(\n            `[ActivityExecutor] ⚠️ Activity '${activityName}' is not registered as Command. ` +\n            `Skipping execution.`\n          );\n        }\n        return {\n          output: null,\n          outcome: 'Done'\n        };\n      }\n\n      // Flatten properties if nested (designer-style nested payload)\n      let commandInput = evaluatedInputs;\n      if (commandInput['properties'] && typeof commandInput['properties'] === 'object') {\n        // Flatten: {properties: {text: \"...\"}} -> {text: \"...\"}\n        commandInput = { ...commandInput['properties'] };\n      }\n\n      // Execute activity via CommandBus\n      // Activities (AXPActivity) return {output, outcome}; legacy may return {output, outcomes}\n      const result = await this.commandService.execute<Record<string, any>, {\n        output?: any;\n        outcome?: string;\n        outcomes?: Record<string, any>;\n      }>(activityName, commandInput);\n      \n      if (!result) {\n        return {\n          output: null,\n          outcome: 'Failed',\n        };\n      }\n\n      if (!result.success) {\n        return {\n          output: {\n            error: await this.resolveCommandMessageTextForError(result.message?.text),\n          },\n          outcome: 'Failed',\n        };\n      }\n\n      const commandResult = result.data as any;\n\n      // Prefer unified outcome in result.metadata; fall back to legacy data.outcome/outcomes.\n      const metadataOutcome = (result as any)?.metadata?.['outcome'];\n      let outcome = 'Done';\n      if (typeof metadataOutcome === 'string' && metadataOutcome.length > 0) {\n        outcome = metadataOutcome;\n      } else if (typeof commandResult?.outcome === 'string' && commandResult.outcome.length > 0) {\n        outcome = commandResult.outcome;\n      } else {\n        const outcomes = (commandResult?.outcomes ?? {}) as Record<string, any>;\n        if (outcomes && typeof outcomes === 'object' && Object.keys(outcomes).length > 0) {\n          outcome = outcomes['Done'] ? 'Done' : Object.keys(outcomes)[0] || 'Done';\n        }\n      }\n\n      // Prefer output wrapper when present; otherwise treat data itself as output.\n      const output =\n        commandResult && typeof commandResult === 'object' && 'output' in commandResult\n          ? commandResult.output\n          : commandResult;\n\n      return {\n        output: output ?? null,\n        outcome,\n      };\n    } catch (error: any) {\n      console.error(`[ActivityExecutor] ❌ Error evaluating expressions or executing activity:`, error);\n      return {\n        output: { error: error.message || 'Unknown error' },\n        outcome: 'Failed'\n      };\n    }\n  }\n\n  /**\n   * Resolves command failure message text for workflow output: `@` keys via translate, MLS maps via resolve.\n   */\n  private async resolveCommandMessageTextForError(\n    value: AXPMultiLanguageString | undefined | null,\n  ): Promise<string> {\n    if (value == null) {\n      return '';\n    }\n    if (typeof value === 'string') {\n      return value.startsWith('@') ? await this.translateService.translateAsync(value) : value;\n    }\n    return this.translateService.resolve(value);\n  }\n\n  //#endregion\n}\n\n","import { InjectionToken } from '@angular/core';\nimport type { AXPWorkflowTask } from './workflow-runtime.types';\n\n//#region ----   Types   ----\n\n/** Context passed after a workflow step completes (resume, start, or interactive chain). */\nexport interface AXPWorkflowContinuationStepContext {\n  instanceId: string;\n  /** Consumed bookmark id from the task board (when known). */\n  completedBookmarkId?: string;\n  /** Activity id that just completed (human-task or interactive step). */\n  completedActivityId?: string;\n  /** Resume outcome that completed the step (e.g. start-fill, Submitted, Saved). */\n  resumeOutcome?: string;\n  /** Next pending task returned by the engine / workflow manager (when known). */\n  pendingNextTask?: AXPWorkflowTask | null;\n}\n\n/**\n * Result of a continuation prompt in the current start/resume cycle.\n * Used by {@link AXPWorkflowManager} to avoid duplicate dialogs in the same cycle.\n */\nexport type AXPWorkflowContinuationOfferResult = 'not-offered' | 'confirmed' | 'declined';\n\n/**\n * Optional hook: offer the current user to continue to the next workflow step.\n * Implemented by workflow-management (task board UX); invoked from {@link AXPWorkflowManager}.\n */\nexport interface AXPWorkflowContinuationHook {\n  /**\n   * Before running an inline interactive activity chain (sign-off, forms, etc.).\n   * Return `declined` to skip executing that chain in this resume/start call.\n   */\n  offerBeforeInteractiveFlow?(\n    context: AXPWorkflowContinuationStepContext,\n  ): Promise<AXPWorkflowContinuationOfferResult>;\n\n  /** After resume/start when the next human-task is on the task board, or no before-offer ran. */\n  offerAfterWorkflowStep?(\n    context: AXPWorkflowContinuationStepContext,\n  ): Promise<AXPWorkflowContinuationOfferResult | void>;\n}\n\nexport const AXP_WORKFLOW_CONTINUATION_HOOK = new InjectionToken<AXPWorkflowContinuationHook>(\n  'AXP_WORKFLOW_CONTINUATION_HOOK',\n);\n\n/** When true on resume `userInput`, skips the post-step continuation dialog (auto-advance). */\nexport const AXP_WORKFLOW_SUPPRESS_CONTINUATION_INPUT_KEY = '_suppressWorkflowContinuation';\n\nexport function isWorkflowContinuationSuppressed(userInput: unknown): boolean {\n  if (userInput == null || typeof userInput !== 'object') {\n    return false;\n  }\n  return (userInput as Record<string, unknown>)[AXP_WORKFLOW_SUPPRESS_CONTINUATION_INPUT_KEY] === true;\n}\n\n//#endregion\n","import type { AXPWorkflowContinuationStepContext } from './workflow-continuation.hook';\nimport type { AXPWorkflowContinuationBeforeInteractive } from '@acorex/platform/contracts';\nimport {\n  axpIsWorkflowTaskBoardActivityType,\n  type AXPWorkflowTask,\n} from './workflow-runtime.types';\n\n//#region ----   Inline frontend classification   ----\n\n/**\n * Frontend step executed inline (dialog/popup), not suspended on the task board.\n * Derived from execution mode and task-board activity types — no per-activity hardcoding.\n */\nexport function axpIsWorkflowInlineFrontendTask(task: AXPWorkflowTask | null | undefined): boolean {\n  if (!task) {\n    return false;\n  }\n  if (axpIsWorkflowTaskBoardActivityType(task.activityType)) {\n    return false;\n  }\n  return task.executionMode === 'frontend' || task.executionMode === 'both';\n}\n\n/** @deprecated Use {@link axpIsWorkflowInlineFrontendTask}. */\nexport function axpIsWorkflowInteractiveFrontendTask(task: AXPWorkflowTask | null | undefined): boolean {\n  return axpIsWorkflowInlineFrontendTask(task);\n}\n\n//#endregion\n\n//#region ----   Continuation metadata on tasks   ----\n\n/** Resolved before-interactive behavior from task metadata (set by engine from activity definition). */\nexport function axpResolveWorkflowContinuationBeforeInteractive(\n  task: AXPWorkflowTask | null | undefined,\n): AXPWorkflowContinuationBeforeInteractive {\n  return task?.continuation?.beforeInteractive ?? 'default';\n}\n\n/**\n * Whether to skip the pre-interactive \"continue?\" prompt based on activity metadata.\n * Assignee-specific rules are applied in workflow-management (needs session).\n */\nexport function axpShouldSkipBeforeInteractiveFromMetadata(\n  behavior: AXPWorkflowContinuationBeforeInteractive,\n  completedWasHumanTask: boolean,\n): boolean {\n  return behavior === 'skip-when-chained-from-human-task' && completedWasHumanTask;\n}\n\n/**\n * Whether to show a \"continue?\" prompt before running inline frontend activities.\n * Skips when the user already resumed a task-board step (primary action / resume).\n */\nexport function axpShouldOfferBeforeInteractiveFlow(context: AXPWorkflowContinuationStepContext): boolean {\n  return !context.completedActivityId;\n}\n\n//#endregion\n\n//#region ----   Step advancement gate   ----\n\n/** Resume outcomes that do not advance the workflow graph (draft save, cancel, loop back). */\nconst NON_ADVANCING_RESUME_OUTCOMES = new Set(['saved', 'cancelled', 'cancel', 'save', 'draft']);\n\n/**\n * Whether the workflow advanced enough to consider a continuation prompt.\n * Includes pending interactive steps when inbox bookmarks are already consumed.\n */\nexport function axpShouldOfferWorkflowContinuationAfterStep(\n  context: AXPWorkflowContinuationStepContext,\n  activeBookmarkActivityIds: string[],\n): boolean {\n  const outcome = context.resumeOutcome?.trim().toLowerCase();\n  if (outcome && NON_ADVANCING_RESUME_OUTCOMES.has(outcome)) {\n    return false;\n  }\n\n  const pendingActivityId = context.pendingNextTask?.activityId;\n  const completedActivityId = context.completedActivityId;\n  if (pendingActivityId && completedActivityId && pendingActivityId === completedActivityId) {\n    return false;\n  }\n\n  if (activeBookmarkActivityIds.length === 0) {\n    const pending = context.pendingNextTask;\n    if (completedActivityId && pending && pending.activityId !== completedActivityId) {\n      if (\n        axpIsWorkflowInlineFrontendTask(pending) ||\n        axpIsWorkflowTaskBoardActivityType(pending.activityType)\n      ) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /** No continuation on bare workflow start (bookmarks exist before any step completes). */\n  if (!completedActivityId) {\n    return false;\n  }\n\n  return activeBookmarkActivityIds.some((id) => id !== completedActivityId);\n}\n\n//#endregion\n","import { Injectable, inject } from '@angular/core';\nimport { ActivityExecutionResult, ActivityExecutor } from './activity-executor.service';\nimport { AXP_WORKFLOW_ENGINE } from './workflow-engine';\nimport { getWorkflowEngineErrorInfo } from './workflow-engine.errors';\nimport {\n  AXP_WORKFLOW_CONTINUATION_HOOK,\n  isWorkflowContinuationSuppressed,\n  type AXPWorkflowContinuationOfferResult,\n  type AXPWorkflowContinuationStepContext,\n} from './workflow-continuation.hook';\nimport { axpIsWorkflowInlineFrontendTask, axpShouldOfferBeforeInteractiveFlow } from './workflow-continuation.policy';\nimport {\n  axpIsWorkflowTaskBoardActivityType,\n  AXPWorkflowInstanceState,\n  AXPWorkflowTask,\n} from './workflow-runtime.types';\n\n//#region ----   Types & Interfaces   ----\n\n/**\n * Result of starting a workflow.\n */\nexport interface WorkflowStartResult {\n  /**\n   * Whether the operation succeeded.\n   */\n  success: boolean;\n\n  /**\n   * Workflow instance ID.\n   */\n  instanceId?: string;\n\n  /**\n   * Initial workflow state.\n   */\n  state?: AXPWorkflowInstanceState;\n\n  /**\n   * First task to execute (if any).\n   */\n  nextTask?: AXPWorkflowTask | null;\n\n  /**\n   * Workflow output (if completed immediately).\n   */\n  output?: any;\n\n  /**\n   * Error message (if failed).\n   */\n  error?: string;\n}\n\n/**\n * Result of completing a task.\n */\nexport interface WorkflowCompleteResult {\n  /**\n   * Whether the operation succeeded.\n   */\n  success: boolean;\n\n  /**\n   * Workflow instance ID.\n   */\n  instanceId: string;\n\n  /**\n   * Updated workflow state.\n   */\n  state?: AXPWorkflowInstanceState;\n\n  /**\n   * Next task to execute (if any).\n   */\n  nextTask?: AXPWorkflowTask | null;\n\n  /**\n   * Workflow output (if completed).\n   */\n  output?: any;\n\n  /**\n   * Error message (if failed).\n   */\n  error?: string;\n}\n\n/**\n * Result of resuming a workflow.\n */\nexport interface WorkflowResumeResult {\n  /**\n   * Whether the operation succeeded.\n   */\n  success: boolean;\n\n  /**\n   * Workflow instance ID.\n   */\n  instanceId: string;\n\n  /**\n   * Updated workflow state.\n   */\n  state?: AXPWorkflowInstanceState;\n\n  /**\n   * Next task to execute (if any).\n   */\n  nextTask?: AXPWorkflowTask | null;\n\n  /**\n   * Workflow output (if completed).\n   */\n  output?: any;\n\n  /**\n   * Error message (if failed).\n   */\n  error?: string;\n\n  /**\n   * Stable engine error code when available (e.g. WORKFLOW_TASK_NOT_ASSIGNEE).\n   */\n  errorCode?: string;\n}\n\n/**\n * Result of claiming a pooled workflow task (cartable / candidate pool).\n */\nexport interface WorkflowClaimTaskResult {\n  success: boolean;\n  instanceId: string;\n  error?: string;\n  errorCode?: string;\n}\n\n/**\n * Result of reassigning a human-task bookmark to the current user.\n */\nexport interface WorkflowReassignTaskToSelfResult {\n  success: boolean;\n  instanceId: string;\n  error?: string;\n  errorCode?: string;\n}\n\n//#endregion\n\n/**\n * Workflow Manager - Facade for workflow lifecycle orchestration.\n *\n * This service is the ONLY interface the frontend uses to interact with workflows.\n * It follows Clean Architecture principles and does NOT contain execution or business logic.\n *\n * Responsibilities:\n * - Orchestrate workflow lifecycle (start, execute, complete, resume)\n * - Delegate execution to ActivityExecutor\n * - Cache workflow state in memory\n * - Expose a stable API for UI\n *\n * Rules:\n * - No HTTP calls (delegates to AXPWorkflowEngine)\n * - No CommandBus / Command execution (delegates to ActivityExecutor)\n * - No workflow branching logic (backend decides)\n * - No business validation (backend validates)\n * - No backend assumptions (uses abstract runtime service)\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class AXPWorkflowManager {\n  //#region ----   Services & Dependencies   ----\n\n  private readonly workflowEngine = inject(AXP_WORKFLOW_ENGINE);\n  private readonly activityExecutor = inject(ActivityExecutor);\n  private readonly continuationHook = inject(AXP_WORKFLOW_CONTINUATION_HOOK, { optional: true });\n\n  //#endregion\n\n  //#region ----   State Cache   ----\n\n  /**\n   * Cache workflow states in memory for quick access.\n   * Key: instanceId\n   * Value: AXPWorkflowInstanceState\n   */\n  private stateCache = new Map<string, AXPWorkflowInstanceState>();\n\n  /**\n   * Cache TTL in milliseconds (5 minutes).\n   */\n  private readonly CACHE_TTL = 5 * 60 * 1000;\n\n  //#endregion\n\n  //#region ----   Public Methods   ----\n\n  /**\n   * Execute frontend activities interactively until reaching workflow-activity:human-task or completion.\n   *\n   * Interactive = show form/popup immediately (user sees and acts). Only workflow-activity:human-task\n   * is not interactive (goes to task board). Other frontend activities (show-layout-popup, show-toast, etc.)\n   * even with taskType human-task in definition are executed here.\n   *\n   * @param instanceId - Workflow instance ID\n   * @param task - Current task to execute\n   * @param state - Current workflow state\n   * @param lastActivityOutput - Last activity output (for expression evaluation)\n   * @returns Final result with nextTask (if workflow-activity:human-task) or completion status\n   */\n  private async executeInteractiveFlow(\n    instanceId: string,\n    task: AXPWorkflowTask,\n    state: AXPWorkflowInstanceState,\n    activityOutputs?: Record<string, any>\n  ): Promise<{\n    nextTask: AXPWorkflowTask | null;\n    state: AXPWorkflowInstanceState;\n    output?: any;\n    boundaryContinuationOffer?: AXPWorkflowContinuationOfferResult;\n  }> {\n    let currentTask: AXPWorkflowTask | null = task;\n    let currentState = state;\n    let currentActivityOutputs: Record<string, any> = {\n      ...(currentState.activityOutputs || {}),\n      ...(activityOutputs || {}),\n    };\n    const maxIterations = 100; // Prevent infinite loops\n    let iterationCount = 0;\n\n    while (currentTask && iterationCount < maxIterations) {\n      iterationCount++;\n\n      // Interactive = frontend executionMode and NOT task-board activities (human-task, cartable)\n      const isInteractive =\n        (currentTask.executionMode === 'frontend' || currentTask.executionMode === 'both') &&\n        !axpIsWorkflowTaskBoardActivityType(currentTask.activityType);\n\n      if (isInteractive) {\n        // Execute frontend activity\n        const execResult = await this.activityExecutor.execute(\n          currentTask,\n          currentState,\n          currentActivityOutputs\n        );\n\n        // Track outputs locally (backend should also persist and return them)\n        currentActivityOutputs = {\n          ...currentActivityOutputs,\n          [currentTask.activityId]: execResult.output,\n        };\n\n        // Send result to backend\n        const completeResponse = await this.workflowEngine.frontActivtyComplete({\n          instanceId,\n          activityNode: currentTask.activityId,\n          output: execResult.output || {},\n          outcome: execResult.outcome,\n        });\n\n        // Update state cache\n        if (completeResponse.state) {\n          const normalizedState = { ...completeResponse.state };\n          if (normalizedState.lastUpdated && !(normalizedState.lastUpdated instanceof Date)) {\n            normalizedState.lastUpdated = new Date(normalizedState.lastUpdated);\n          }\n          currentState = normalizedState;\n          // Prefer outputs returned by backend; fallback to local cache\n          currentActivityOutputs = {\n            ...currentActivityOutputs,\n            ...(normalizedState.activityOutputs || {}),\n          };\n          this.stateCache.set(instanceId, normalizedState);\n        }\n\n        // Backend decides: if no nextTask, workflow is completed\n        if (!completeResponse.nextTask) {\n          return {\n            nextTask: null,\n            state: currentState,\n            output: completeResponse.output,\n          };\n        }\n\n        // Backend decides: if nextTask is task-board activity or not frontend, return it (task board or done)\n        const nextInteractive =\n          (completeResponse.nextTask.executionMode === 'frontend' || completeResponse.nextTask.executionMode === 'both') &&\n          !axpIsWorkflowTaskBoardActivityType(completeResponse.nextTask.activityType);\n        if (!nextInteractive) {\n          const humanTaskNext = completeResponse.nextTask;\n          let boundaryContinuationOffer: AXPWorkflowContinuationOfferResult | undefined;\n          if (\n            humanTaskNext &&\n            axpIsWorkflowTaskBoardActivityType(humanTaskNext.activityType)\n          ) {\n            boundaryContinuationOffer =\n              (await this.continuationHook?.offerAfterWorkflowStep?.({\n                instanceId,\n                completedActivityId: currentTask.activityId,\n                resumeOutcome: execResult.outcome,\n                pendingNextTask: humanTaskNext,\n              })) ?? 'not-offered';\n          }\n          return {\n            nextTask: humanTaskNext,\n            state: currentState,\n            boundaryContinuationOffer,\n          };\n        }\n\n        // Continue with next interactive frontend task\n        currentTask = completeResponse.nextTask;\n      } else {\n        // Not interactive (e.g. human-task / cartable) - return as-is for task board\n        return {\n          nextTask: currentTask,\n          state: currentState,\n        };\n      }\n    }\n\n    // Max iterations reached\n    if (iterationCount >= maxIterations) {\n      console.warn(`[AXPWorkflowManager] ⚠️ Maximum iterations (${maxIterations}) reached`);\n    }\n\n    return {\n      nextTask: currentTask,\n      state: currentState,\n    };\n  }\n\n  /**\n   * Runs inline interactive activities when allowed, with an optional pre-flow continuation prompt.\n   */\n  private async runInteractiveFlowWithContinuation(\n    instanceId: string,\n    pendingTask: AXPWorkflowTask,\n    state: AXPWorkflowInstanceState,\n    continuationContext: AXPWorkflowContinuationStepContext,\n    suppressContinuation: boolean,\n    activityOutputs?: Record<string, any>,\n  ): Promise<{\n    nextTask: AXPWorkflowTask | null;\n    state: AXPWorkflowInstanceState;\n    output?: unknown;\n    continuationOffer?: AXPWorkflowContinuationOfferResult;\n  }> {\n    let continuationOffer: AXPWorkflowContinuationOfferResult = 'not-offered';\n\n    if (\n      !suppressContinuation &&\n      axpShouldOfferBeforeInteractiveFlow(continuationContext) &&\n      axpIsWorkflowInlineFrontendTask(pendingTask) &&\n      this.continuationHook?.offerBeforeInteractiveFlow\n    ) {\n      continuationOffer =\n        (await this.continuationHook.offerBeforeInteractiveFlow({\n          ...continuationContext,\n          instanceId,\n          pendingNextTask: pendingTask,\n        })) ?? 'not-offered';\n\n      if (continuationOffer === 'declined') {\n        await this.revertResumeAfterDeclinedInteractiveContinuation(instanceId, continuationContext, pendingTask);\n        const revertedState = this.stateCache.get(instanceId) ?? state;\n        return { nextTask: null, state: revertedState, continuationOffer };\n      }\n    }\n\n    const interactiveResult = await this.executeInteractiveFlow(\n      instanceId,\n      pendingTask,\n      state,\n      activityOutputs as Record<string, unknown> | undefined,\n    );\n\n    const boundaryOffer = interactiveResult.boundaryContinuationOffer;\n    if (boundaryOffer && boundaryOffer !== 'not-offered') {\n      continuationOffer = boundaryOffer;\n    }\n\n    return { ...interactiveResult, continuationOffer };\n  }\n\n  private async invokeWorkflowContinuationAfterStep(\n    context: AXPWorkflowContinuationStepContext,\n    priorOffer?: AXPWorkflowContinuationOfferResult,\n    suppressContinuation = false,\n  ): Promise<void> {\n    if (suppressContinuation || priorOffer === 'declined') {\n      return;\n    }\n    if (priorOffer && priorOffer !== 'not-offered') {\n      return;\n    }\n    await this.continuationHook?.offerAfterWorkflowStep?.(context);\n  }\n\n  /**\n   * Restores the suspended task-board step when the user declines a pre-interactive continuation prompt.\n   */\n  private async revertResumeAfterDeclinedInteractiveContinuation(\n    instanceId: string,\n    context: AXPWorkflowContinuationStepContext,\n    abortedTask: AXPWorkflowTask,\n  ): Promise<void> {\n    const suspendedStepId = context.completedActivityId;\n    if (!suspendedStepId) {\n      return;\n    }\n\n    const revert = this.workflowEngine.revertResumeAfterDeclinedInteractiveContinuation?.bind(this.workflowEngine);\n    if (!revert) {\n      return;\n    }\n\n    const result = await revert({\n      instanceId,\n      suspendedStepId,\n      abortedStepId: abortedTask.activityId,\n      bookmarkId: context.completedBookmarkId,\n    });\n\n    if (result.success && result.state) {\n      let normalizedState = { ...result.state };\n      if (normalizedState.lastUpdated && !(normalizedState.lastUpdated instanceof Date)) {\n        normalizedState.lastUpdated = new Date(normalizedState.lastUpdated);\n      }\n      this.stateCache.set(instanceId, normalizedState);\n    }\n  }\n\n  /**\n   * Start a new workflow instance.\n   *\n   * Creates a new workflow instance in backend and returns instance ID.\n   * Backend decides what to do: returns pendingTask or indicates completion.\n   *\n   * @param workflowId - Workflow ID to start\n   * @param input - Initial input data (optional)\n   * @returns Start result with instanceId, state, and nextTask\n   *\n   * @example\n   * ```typescript\n   * const result = await workflowManager.start('my-workflow', { userId: '123' });\n   *\n   * if (result.success && result.nextTask) {\n   *   // Execute task if frontend\n   *   if (result.nextTask.executionMode === 'frontend') {\n   *     const execResult = await workflowManager.execute(result.nextTask);\n   *     await workflowManager.complete(result.instanceId!, result.nextTask, execResult.outcome, execResult.output);\n   *   }\n   * }\n   * ```\n   */\n  async start(workflowId: string, input: Record<string, any> = {}): Promise<WorkflowStartResult> {\n    try {\n      const response = await this.workflowEngine.start({\n        workflowId,\n        input,\n      });\n\n      // Cache state (normalize Date)\n      let startNormalizedState = { ...response.state };\n      if (startNormalizedState.lastUpdated && !(startNormalizedState.lastUpdated instanceof Date)) {\n        startNormalizedState.lastUpdated = new Date(startNormalizedState.lastUpdated);\n      }\n      this.stateCache.set(response.instanceId, startNormalizedState);\n\n      // 🎯 Interactive flow: Execute frontend activities that are NOT task-board types (those go to task board)\n      let finalNextTask = response.pendingTask || null;\n      let finalOutput = startNormalizedState.output;\n\n      const pendingTask = response.pendingTask;\n      if (\n        pendingTask &&\n        (pendingTask.executionMode === 'frontend' || pendingTask.executionMode === 'both') &&\n        !axpIsWorkflowTaskBoardActivityType(pendingTask.activityType)\n      ) {\n        const interactiveResult = await this.runInteractiveFlowWithContinuation(\n          response.instanceId,\n          pendingTask,\n          startNormalizedState,\n          { instanceId: response.instanceId, pendingNextTask: pendingTask },\n          isWorkflowContinuationSuppressed(input),\n          (response.activityOutputs ?? response.state.activityOutputs) as Record<string, any> | undefined,\n        );\n\n        finalNextTask = interactiveResult.nextTask;\n        startNormalizedState = interactiveResult.state;\n        if (interactiveResult.output != null) {\n          finalOutput = interactiveResult.output;\n        }\n\n        this.stateCache.set(response.instanceId, startNormalizedState);\n      }\n      // If backend returned null or non-executable task, return it as-is\n      // Backend already decided workflow status (suspended, completed, etc.)\n\n      return {\n        success: true as const,\n        instanceId: response.instanceId,\n        state: startNormalizedState,\n        nextTask: finalNextTask,\n        output: finalOutput,\n      };\n    } catch (error: any) {\n      console.error('[AXPWorkflowManager] ❌ Error starting workflow:', error);\n      return {\n        success: false,\n        error: error.message || 'Failed to start workflow',\n      };\n    }\n  }\n\n  /**\n   * Resume a suspended workflow (e.g., after user interaction).\n   *\n   * Backend determines nextStep based on outcome and outcomeConnections.\n   * Client only provides instanceId, stepId, outcome, and optional userInput.\n   *\n   * @param instanceId - Workflow instance ID\n   * @param stepId - Step ID that was waiting for user input\n   * @param outcome - User action outcome (e.g., 'Confirmed', 'Cancelled', 'Submitted')\n   * @param userInput - Optional user input data\n   * @param taskToken - Secure task token (required for secure resumption)\n   * @returns Resume result with next task (if any)\n   */\n  async resume(\n    instanceId: string,\n    stepId: string,\n    outcome: string,\n    userInput?: any,\n    taskToken?: string,\n  ): Promise<WorkflowResumeResult> {\n    try {\n      // Ensure taskToken is provided for secure resumption\n      if (!taskToken) {\n        throw new Error('Missing taskToken for resume operation');\n      }\n\n      // Backend handles everything: checks outcomeConnections and determines nextStep\n      const response = await this.workflowEngine.resume({\n        instanceId,\n        stepId,\n        taskToken,\n        outcome,\n        userInput,\n      });\n\n      // Update cache with state from backend\n      let normalizedState = response.state ? { ...response.state } : undefined;\n      if (normalizedState && normalizedState.lastUpdated && !(normalizedState.lastUpdated instanceof Date)) {\n        normalizedState.lastUpdated = new Date(normalizedState.lastUpdated);\n      }\n      \n      if (normalizedState) {\n        this.stateCache.set(instanceId, normalizedState);\n      }\n\n      // 🎯 Interactive flow: Execute frontend activities that are NOT task-board types (those go to task board)\n      let finalNextTask = response.nextTask || null;\n      let finalOutput = response.output;\n\n      const nextTask = response.nextTask;\n      let resumeContinuationOffer: AXPWorkflowContinuationOfferResult | undefined;\n      if (\n        nextTask &&\n        (nextTask.executionMode === 'frontend' || nextTask.executionMode === 'both') &&\n        !axpIsWorkflowTaskBoardActivityType(nextTask.activityType)\n      ) {\n        const completedBookmarkId =\n          typeof userInput === 'object' && userInput != null && 'bookmarkId' in userInput\n            ? String((userInput as { bookmarkId?: unknown }).bookmarkId ?? '')\n            : undefined;\n\n        const interactiveResult = await this.runInteractiveFlowWithContinuation(\n          instanceId,\n          nextTask,\n          normalizedState!,\n          {\n            instanceId,\n            completedActivityId: stepId,\n            completedBookmarkId: completedBookmarkId || undefined,\n            resumeOutcome: outcome,\n            pendingNextTask: nextTask,\n          },\n          isWorkflowContinuationSuppressed(userInput),\n          normalizedState?.activityOutputs as Record<string, any> | undefined,\n        );\n\n        finalNextTask = interactiveResult.nextTask;\n        normalizedState = interactiveResult.state;\n        resumeContinuationOffer = interactiveResult.continuationOffer;\n        if (interactiveResult.output != null) {\n          finalOutput = interactiveResult.output;\n        }\n\n        this.stateCache.set(instanceId, normalizedState);\n      }\n      // If backend returned null or non-executable task, return it as-is\n      // Backend already decided workflow status (suspended, completed, etc.)\n\n      const resumeResult = {\n        success: true as const,\n        instanceId,\n        state: normalizedState || response.state,\n        nextTask: finalNextTask,\n        output: finalOutput,\n      };\n\n      const completedBookmarkIdForContinuation =\n        typeof userInput === 'object' && userInput != null && 'bookmarkId' in userInput\n          ? String((userInput as { bookmarkId?: unknown }).bookmarkId ?? '')\n          : undefined;\n\n      await this.invokeWorkflowContinuationAfterStep(\n        {\n          instanceId,\n          completedActivityId: stepId,\n          completedBookmarkId: completedBookmarkIdForContinuation || undefined,\n          resumeOutcome: outcome,\n          pendingNextTask: finalNextTask,\n        },\n        resumeContinuationOffer,\n        isWorkflowContinuationSuppressed(userInput),\n      );\n\n      return resumeResult;\n    } catch (error: unknown) {\n      const { message, code } = getWorkflowEngineErrorInfo(error);\n      return {\n        success: false,\n        instanceId,\n        error: message,\n        errorCode: code,\n      };\n    }\n  }\n\n  /**\n   * Get workflow instance state.\n   *\n   * Retrieves state from cache (if valid) or from backend.\n   *\n   * @param instanceId - Workflow instance ID\n   * @returns Workflow instance state or null if not found\n   */\n  async getState(instanceId: string): Promise<AXPWorkflowInstanceState | null> {\n    // Check cache first\n    const cached = this.stateCache.get(instanceId);\n    if (cached) {\n      // Normalize lastUpdated to Date (for cache safety)\n      const normalizedCached = { ...cached };\n      if (normalizedCached.lastUpdated && !(normalizedCached.lastUpdated instanceof Date)) {\n        normalizedCached.lastUpdated = new Date(normalizedCached.lastUpdated);\n      }\n\n      // Validate cache age\n      const cacheAge = Date.now() - normalizedCached.lastUpdated.getTime();\n      if (cacheAge < this.CACHE_TTL) {\n        return normalizedCached;\n      }\n    }\n\n    // Fetch from backend\n    try {\n      const state = await this.workflowEngine.getState({\n        instanceId,\n      });\n\n      // Normalize lastUpdated to Date (for cache safety)\n      const normalizedState = { ...state };\n      if (normalizedState.lastUpdated && !(normalizedState.lastUpdated instanceof Date)) {\n        normalizedState.lastUpdated = new Date(normalizedState.lastUpdated);\n      }\n\n      // Update cache\n      this.stateCache.set(instanceId, normalizedState);\n\n      return normalizedState;\n    } catch (error: any) {\n      console.error('[AXPWorkflowManager] ❌ Error getting workflow state:', error);\n      return null;\n    }\n  }\n\n  /**\n   * Claim a pooled workflow task (assign current user on the bookmark without advancing the workflow).\n   * Supported only when the injected workflow engine implements {@link AXPWorkflowEngine.claimTask}.\n   */\n  async claimTask(instanceId: string, bookmarkId: string, stepId: string): Promise<WorkflowClaimTaskResult> {\n    const claim = this.workflowEngine.claimTask?.bind(this.workflowEngine);\n    if (!claim) {\n      return {\n        success: false,\n        instanceId,\n        error: 'Claim task is not supported by this workflow engine',\n      };\n    }\n    try {\n      const result = await claim({ instanceId, bookmarkId, stepId });\n      return {\n        success: result.success,\n        instanceId,\n        error: result.error,\n        errorCode: result.errorCode,\n      };\n    } catch (error: unknown) {\n      const { message, code } = getWorkflowEngineErrorInfo(error);\n      return {\n        success: false,\n        instanceId,\n        error: message,\n        errorCode: code,\n      };\n    }\n  }\n\n  /**\n   * Reassign a human-task bookmark to the current user without advancing the workflow.\n   * Supported only when the injected workflow engine implements {@link AXPWorkflowEngine.reassignTaskToSelf}.\n   */\n  async reassignTaskToSelf(\n    instanceId: string,\n    bookmarkId: string,\n    stepId: string,\n  ): Promise<WorkflowReassignTaskToSelfResult> {\n    const reassign = this.workflowEngine.reassignTaskToSelf?.bind(this.workflowEngine);\n    if (!reassign) {\n      return {\n        success: false,\n        instanceId,\n        error: 'Reassign task is not supported by this workflow engine',\n      };\n    }\n    try {\n      const result = await reassign({ instanceId, bookmarkId, stepId });\n      return {\n        success: result.success,\n        instanceId,\n        error: result.error,\n        errorCode: result.errorCode,\n      };\n    } catch (error: unknown) {\n      const { message, code } = getWorkflowEngineErrorInfo(error);\n      return {\n        success: false,\n        instanceId,\n        error: message,\n        errorCode: code,\n      };\n    }\n  }\n\n  //#endregion\n}\n","import { InjectionToken } from '@angular/core';\nimport { AXPWorkflowCategory, AXPWorkflowDefinition } from '@acorex/platform/contracts';\n\nexport type { AXPWorkflowCategory };\n\nexport type AXPWorkflowProviderToken =\n    | AXPWorkflowProvider\n    | Promise<AXPWorkflowProvider>;\n\nexport const AXP_WORKFLOW_PROVIDER = new InjectionToken<AXPWorkflowProviderToken[]>('AXP_WORKFLOW_PROVIDER', {\n    factory: () => [],\n});\n\nexport interface AXPWorkflowProvider {\n    /**\n     * Get list of workflow definitions for a category.\n     * @param categoryId - Category ID to filter workflows\n     * @returns Promise of workflow definition array\n     */\n    getList(categoryId: string): Promise<AXPWorkflowDefinition[]>;\n    \n    /**\n     * Get full workflow definition by name (unique identifier).\n     * Used by workflow engines for execution and UI for metadata.\n     * @param name - Workflow name (unique identifier)\n     * @returns Promise of full workflow definition or null if not found\n     */\n    getByName(name: string): Promise<AXPWorkflowDefinition | null>;\n}\n\nexport type AXPWorkflowCategoryProviderToken =\n    | AXPWorkflowCategoryProvider\n    | Promise<AXPWorkflowCategoryProvider>;\n\nexport const AXP_WORKFLOW_CATEGORY_PROVIDER = new InjectionToken<AXPWorkflowCategoryProviderToken[]>('AXP_WORKFLOW_CATEGORY_PROVIDER', {\n    factory: () => [],\n});\n\nexport interface AXPWorkflowCategoryProvider {\n    getList(parentId?: string): Promise<AXPWorkflowCategory[]>;\n    getById(id: string): Promise<AXPWorkflowCategory | undefined>;\n}\n","import { AXPConnection, AXPDataGenerator, AXPWorkflowActivityInstance, AXPWorkflowDefinition } from '@acorex/platform/contracts';\nimport { AXTranslationService } from '@acorex/core/translation';\n\nimport { inject, Injectable } from '@angular/core';\nimport { AXPActivityDefinitionService } from '../activity/activity-definition.service';\n\nimport { AXP_WORKFLOW_PROVIDER } from '../workflow/workflow-definition.provider';\nimport { AXPWorkflowEngine } from './workflow-engine';\nimport {\n  AXPFrontActivityCompleteRequest,\n  AXPFrontActivityCompleteResponse,\n  AXPGetWorkflowStateRequest,\n  AXPResumeWorkflowRequest,\n  AXPResumeWorkflowResponse,\n  AXPStartWorkflowRequest,\n  AXPStartWorkflowResponse,\n  AXPWorkflowInstanceState,\n  AXPWorkflowTask,\n} from './workflow-runtime.types';\n\n//#region ----   Types & Interfaces   ----\n\n/**\n * Internal workflow execution state.\n */\ninterface LocalWorkflowState {\n  instanceId: string;\n  workflowId: string;\n  definition: AXPWorkflowDefinition;\n  state: AXPWorkflowInstanceState;\n  currentActivityId?: string;\n  completedActivities: Set<string>;\n  activityResults: Map<string, { output: any; outcome?: string }>;\n}\n\n//#endregion\n\n/**\n * Local engine implementation that manages workflow progression and state.\n *\n * This engine:\n * - Returns frontend/both activities as pendingTask (does NOT execute them)\n * - Skips backend activities (does not error, continues execution)\n * - Maintains workflow state in memory\n * - Does not require backend API calls\n *\n * Execution of frontend tasks is handled by AXPWorkflowManager via ActivityExecutor.\n * This engine only manages workflow progression and state storage.\n *\n * This is the DEFAULT engine provider. Applications can override it with\n * an API-based engine implementation.\n */\n@Injectable()\nexport class AXPWorkflowLocalEngine implements AXPWorkflowEngine {\n  //#region ----   Services & Dependencies   ----\n\n  private readonly activityDefinitionService = inject(AXPActivityDefinitionService);\n  private readonly workflowProviders = inject(AXP_WORKFLOW_PROVIDER, { optional: true }) || [];\n  private readonly multiLanguageResolver = inject(AXTranslationService);\n\n  //#endregion\n\n  //#region ----   Instance Storage   ----\n\n  /**\n   * In-memory storage for workflow instances.\n   * Key: instanceId\n   * Value: LocalWorkflowState\n   */\n  private instances = new Map<string, LocalWorkflowState>();\n\n  /**\n   * Task token storage for secure resume operations.\n   * Key: taskToken\n   * Value: { instanceId, activityId }\n   */\n  private taskTokens = new Map<string, { instanceId: string; activityId: string }>();\n\n  //#endregion\n\n  //#region ----   Public Methods (AXPWorkflowEngine)   ----\n\n  /**\n   * Start a new workflow instance.\n   *\n   * Creates an in-memory workflow instance and progresses it.\n   * Frontend/both activities are returned as pendingTask for external execution.\n   * Backend activities are skipped.\n   */\n  async start(request: AXPStartWorkflowRequest): Promise<AXPStartWorkflowResponse> {\n    console.log(`[WorkflowLocalEngine] 🚀 Starting workflow: ${request.workflowId}`, request);\n\n    // Generate instance ID\n    const instanceId = AXPDataGenerator.uuid();\n    const now = new Date();\n\n    // Load workflow definition\n    console.log(`[WorkflowLocalEngine] 📥 Loading workflow definition: ${request.workflowId}`);\n    const definition = await this.getDefinition(request.workflowId);\n    if (!definition) {\n      console.error(`[WorkflowLocalEngine] ❌ Workflow definition not found: ${request.workflowId}`);\n      throw new Error(`Workflow definition not found: ${request.workflowId}`);\n    }\n\n    console.log(`[WorkflowLocalEngine] ✅ Definition loaded:`, {\n      name: definition.name,\n      activitiesCount: definition.graph?.activities?.length || 0,\n      connectionsCount: definition.graph?.connections?.length || 0,\n    });\n\n    // Initialize workflow state\n    const state: AXPWorkflowInstanceState = {\n      instanceId,\n      workflowId: request.workflowId,\n      status: 'running',\n      variables: {},\n      activityOutputs: {},\n      lastActivityOutput: undefined,\n      input: request.input || {},\n      output: undefined,\n      lastUpdated: now,\n    };\n\n    // Create local state\n    const localState: LocalWorkflowState = {\n      instanceId,\n      workflowId: request.workflowId,\n      definition,\n      state,\n      completedActivities: new Set(),\n      activityResults: new Map(),\n    };\n\n    // Store instance\n    this.instances.set(instanceId, localState);\n\n    // Execute workflow steps\n    console.log(`[WorkflowLocalEngine] ⚙️ Executing workflow steps...`);\n    const pendingTask = await this.executeWorkflowSteps(localState);\n\n    // Update state\n    localState.state.lastUpdated = new Date();\n\n    console.log(`[WorkflowLocalEngine] ✅ Workflow started:`, {\n      instanceId,\n      status: localState.state.status,\n      hasPendingTask: !!pendingTask,\n      pendingTaskType: pendingTask?.activityType,\n    });\n\n    return {\n      instanceId,\n      state: localState.state,\n      pendingTask: pendingTask || null,\n      activityOutputs: localState.state.activityOutputs,\n      lastActivityOutput: localState.state.lastActivityOutput,\n    };\n  }\n\n  /**\n   * Resume a suspended workflow instance.\n   *\n   * Validates task token, applies externally executed result,\n   * and continues progressing workflow steps.\n   */\n  async resume(request: AXPResumeWorkflowRequest): Promise<AXPResumeWorkflowResponse> {\n    // Validate task token\n    const tokenInfo = this.taskTokens.get(request.taskToken);\n    if (!tokenInfo || tokenInfo.instanceId !== request.instanceId || tokenInfo.activityId !== request.stepId) {\n      throw new Error('Invalid task token');\n    }\n\n    // Get instance\n    const localState = this.instances.get(request.instanceId);\n    if (!localState) {\n      throw new Error(`Workflow instance not found: ${request.instanceId}`);\n    }\n\n    // Store activity result (from external execution)\n    const outcome = request.outcome ?? 'Done';\n    localState.activityResults.set(request.stepId, {\n      output: request.userInput || {},\n      outcome,\n    });\n    localState.completedActivities.add(request.stepId);\n\n    // Store activity output for expression evaluation\n    localState.state.activityOutputs = {\n      ...(localState.state.activityOutputs || {}),\n      [request.stepId]: request.userInput || {},\n    };\n    localState.state.lastActivityOutput = request.userInput || {};\n\n    // Merge output/userInput into state variables\n    if (request.userInput) {\n      localState.state.variables = {\n        ...localState.state.variables,\n        ...(request.userInput || {}),\n      };\n    }\n    localState.state.variables = {\n      ...localState.state.variables,\n      [`${request.stepId}_outcome`]: outcome,\n      [`${request.stepId}_activityOutput`]: request.userInput || {},\n    };\n\n    // Mark activity as completed and continue progression\n    // Continue progressing workflow steps (skipping backend activities)\n    const nextTask = await this.executeWorkflowSteps(localState);\n\n    // Update state\n    localState.state.lastUpdated = new Date();\n\n    // Determine final status\n    if (!nextTask && localState.state.status === 'running') {\n      localState.state.status = 'completed';\n      localState.state.output = localState.state.variables;\n    }\n\n    return {\n      output: request.userInput || {},\n      outcomes: { [outcome]: true },\n      state: localState.state,\n      nextTask: nextTask || null,\n    };\n  }\n\n  /**\n   * Get current workflow instance state.\n   */\n  async getState(request: AXPGetWorkflowStateRequest): Promise<AXPWorkflowInstanceState> {\n    const localState = this.instances.get(request.instanceId);\n    if (!localState) {\n      throw new Error(`Workflow instance not found: ${request.instanceId}`);\n    }\n\n    // Normalize lastUpdated to Date (for cache safety)\n    const state = { ...localState.state };\n    if (state.lastUpdated && !(state.lastUpdated instanceof Date)) {\n      state.lastUpdated = new Date(state.lastUpdated);\n    }\n\n    return state;\n  }\n\n  //#endregion\n\n  //#region ----   Private Methods   ----\n\n  /**\n   * Get workflow definition from available providers.\n   */\n  private async getDefinition(workflowId: string): Promise<AXPWorkflowDefinition | null> {\n    // Try all providers in order\n    const resolvedProviders = await Promise.allSettled(this.workflowProviders);\n    for (const p of resolvedProviders) {\n      if (p.status === 'fulfilled' && p.value) {\n        const provider = p.value;\n        // Check if provider has getByName method\n        if (typeof provider.getByName === 'function') {\n          try {\n            const definition = await provider.getByName(workflowId);\n            if (definition) {\n              return definition;\n            }\n          } catch {\n            // Continue on error - try other providers\n          }\n        }\n      }\n    }\n\n    return null;\n  }\n\n  /**\n   * Progress workflow steps starting from the current position.\n   *\n   * For frontend/both activities: returns task immediately (suspends workflow).\n   * For backend activities: skips and continues.\n   *\n   * Returns the next pending task (if frontend activity found) or null (if completed).\n   */\n  private async executeWorkflowSteps(localState: LocalWorkflowState): Promise<AXPWorkflowTask | null> {\n    const graph = localState.definition.graph;\n    const activities = graph.activities || [];\n    const connections = graph.connections || [];\n\n    // Build activity map\n    const activityMap = new Map<string, AXPWorkflowActivityInstance>();\n    activities.forEach((activity) => {\n      activityMap.set(activity.id, activity);\n    });\n\n    // Build connection graph\n    const outgoingConnections = new Map<string, AXPConnection[]>();\n    const incomingConnections = new Map<string, AXPConnection[]>();\n\n    connections.forEach((conn) => {\n      const sourceId = conn.source.activtyName;\n      const targetId = conn.target.activtyName;\n\n      if (!outgoingConnections.has(sourceId)) {\n        outgoingConnections.set(sourceId, []);\n      }\n      outgoingConnections.get(sourceId)!.push(conn);\n\n      if (!incomingConnections.has(targetId)) {\n        incomingConnections.set(targetId, []);\n      }\n      incomingConnections.get(targetId)!.push(conn);\n    });\n\n    // Find starting activity (use startActivityId or no incoming connections, or first activity)\n    let currentActivityId = localState.currentActivityId;\n    if (!currentActivityId) {\n      // Use startActivityId if available\n      if (graph.startActivityId) {\n        currentActivityId = graph.startActivityId;\n      } else {\n        // Find root activity (no incoming connections)\n        for (const activity of activities) {\n          if (!incomingConnections.has(activity.id)) {\n            currentActivityId = activity.id;\n            break;\n          }\n        }\n        // If no root found, use first activity\n        if (!currentActivityId && activities.length > 0) {\n          currentActivityId = activities[0].id;\n        }\n      }\n    }\n\n    // Execute workflow steps\n    while (currentActivityId) {\n      const activity = activityMap.get(currentActivityId);\n      if (!activity) {\n        break;\n      }\n\n      // Skip if already completed\n      if (localState.completedActivities.has(currentActivityId)) {\n        // Move to next activity\n        const nextId = this.getNextActivityId(currentActivityId, outgoingConnections, localState.activityResults);\n        currentActivityId = nextId ?? undefined;\n        continue;\n      }\n\n      // Get activity definition to retrieve executionMode and title\n      console.log(`[WorkflowLocalEngine] 🔍 Getting activity definition for: ${activity.name}`);\n      const activityDefinition = await this.activityDefinitionService.getActivityByName(activity.name);\n      console.log(`[WorkflowLocalEngine] 📋 Activity definition:`, {\n        name: activityDefinition?.name,\n        type: activityDefinition?.type,\n        executionMode: activityDefinition?.executionMode,\n        title: activityDefinition?.title,\n        found: !!activityDefinition,\n      });\n\n      const executionMode = activityDefinition?.executionMode || 'frontend';\n      const activityTitle = this.multiLanguageResolver.resolve(activityDefinition?.title) || activityDefinition?.name;\n\n      // Handle backend activities: skip\n      if (executionMode === 'backend') {\n        console.log(`[WorkflowLocalEngine] ⏭️ Skipping backend activity: ${activity.name} (${activity.id})`);\n        localState.completedActivities.add(currentActivityId);\n        localState.activityResults.set(currentActivityId, {\n          output: null,\n          outcome: 'Done',\n        });\n\n        // Move to next activity\n        const nextId = this.getNextActivityId(currentActivityId, outgoingConnections, localState.activityResults);\n        currentActivityId = nextId ?? undefined;\n        continue;\n      }\n\n      // Handle frontend/both activities: return as pendingTask (do NOT execute)\n      if (executionMode === 'frontend' || executionMode === 'both') {\n        // Create task for external execution\n        // Note: Expression evaluation will be done by ActivityExecutor\n        const task: AXPWorkflowTask = {\n          taskToken: AXPDataGenerator.uuid(),\n          activityId: activity.id,\n          activityType: activity.name,\n          activityName: activityTitle || undefined,\n          executionMode: executionMode as 'frontend' | 'backend' | 'both',\n          input: activity.inputs || {}, // Pass raw inputs - executor will evaluate\n        };\n\n        // Store task token for secure resume\n        this.taskTokens.set(task.taskToken, {\n          instanceId: localState.instanceId,\n          activityId: activity.id,\n        });\n\n        // Update state to indicate suspension\n        localState.currentActivityId = currentActivityId;\n        localState.state.status = 'suspended';\n        localState.state.currentStepId = currentActivityId;\n\n        // Return task immediately - AXPWorkflowManager will execute it\n        return task;\n      }\n\n      // Move to next activity\n      const nextId = this.getNextActivityId(currentActivityId, outgoingConnections, localState.activityResults);\n      currentActivityId = nextId ?? undefined;\n    }\n\n    // Workflow completed\n    localState.state.status = 'completed';\n    localState.state.output = localState.state.variables;\n    localState.currentActivityId = undefined;\n\n    return null;\n  }\n\n  /**\n   * Get next activity ID based on connections and outcomes.\n   */\n  private getNextActivityId(\n    currentActivityId: string,\n    outgoingConnections: Map<string, AXPConnection[]>,\n    activityResults: Map<string, { output: any; outcome?: string }>,\n  ): string | null {\n    const connections = outgoingConnections.get(currentActivityId) || [];\n\n    if (connections.length === 0) {\n      return null; // No outgoing connections - workflow ends\n    }\n\n    // Get current activity result\n    const result = activityResults.get(currentActivityId);\n    const outcome = result?.outcome || 'Done';\n\n    // Find connection matching outcome\n    // Outcome matching is typically done via port name (e.g., \"Done\", \"Failed\")\n    for (const conn of connections) {\n      const sourcePort = conn.source.port || 'Done';\n      if (sourcePort === outcome) {\n        return conn.target.activtyName;\n      }\n    }\n\n    // If no matching outcome, use first connection (default path)\n    if (connections.length > 0) {\n      return connections[0].target.activtyName;\n    }\n\n    return null;\n  }\n\n  async frontActivtyComplete(request: AXPFrontActivityCompleteRequest): Promise<AXPFrontActivityCompleteResponse> {\n    const localState = this.instances.get(request.instanceId);\n    if (!localState) {\n      throw new Error(`Workflow instance not found: ${request.instanceId}`);\n    }\n\n    // Store activity result\n    const outcome = request.outcome ?? 'Done';\n    localState.activityResults.set(request.activityNode, {\n      output: request.output || {},\n      outcome,\n    });\n    localState.completedActivities.add(request.activityNode);\n\n    // Store outputs for expression evaluation\n    localState.state.activityOutputs = {\n      ...(localState.state.activityOutputs || {}),\n      [request.activityNode]: request.output || {},\n    };\n    localState.state.lastActivityOutput = request.output || {};\n\n    // Merge output into workflow variables\n    localState.state.variables = {\n      ...localState.state.variables,\n      ...(request.output || {}),\n    };\n\n    // Continue workflow progression\n    const nextTask = await this.executeWorkflowSteps(localState);\n\n    // Update state timestamp\n    localState.state.lastUpdated = new Date();\n\n    // Determine final status\n    if (!nextTask && localState.state.status === 'running') {\n      localState.state.status = 'completed';\n      localState.state.output = localState.state.variables;\n    }\n\n    return {\n      output: request.output || {},\n      outcomes: { [outcome]: true },\n      nextTask: nextTask || null,\n      state: localState.state,\n    };\n  }\n\n  //#endregion\n}\n","// Workflow Runtime Services\nexport * from './workflow-engine';\nexport * from './workflow-engine.errors';\nexport * from './workflow-runtime.types';\nexport * from './workflow-manager.service';\nexport * from './workflow-local-engine';\nexport * from './activity-executor.service';\nexport * from './workflow-expression-scope.service';\nexport * from './workflow-continuation.hook';\nexport * from './workflow-continuation.policy';\nexport * from './workflow-engine';","//#region ----   Imports   ----\n\nimport { inject, Injectable } from '@angular/core';\nimport { AXPWorkflowCategory, AXPWorkflowDefinition } from '@acorex/platform/contracts';\nimport { AXP_WORKFLOW_CATEGORY_PROVIDER, AXP_WORKFLOW_PROVIDER } from './workflow-definition.provider';\n\n//#endregion\n\n/**\n * Optimized Workflow Definition Service\n * \n * Manages workflow definitions (metadata) for UI and tooling.\n * Similar to AXPActivityDefinitionService - only handles metadata, not execution.\n * \n * Performance optimizations:\n * 1. Uses childrenCount to determine if category has children (no query needed)\n * 2. Uses itemsCount to determine if category has workflows (no query needed)\n * 3. Aggressive caching prevents duplicate API calls\n * 4. Single pending request per resource prevents race conditions\n * 5. Lazy loading - only loads data when needed\n */\n@Injectable({\n    providedIn: 'root',\n})\nexport class AXPWorkflowDefinitionService {\n    //#region ----   Providers & Caches   ----\n\n    private readonly categoryProviders = inject(AXP_WORKFLOW_CATEGORY_PROVIDER, { optional: true }) || [];\n    private readonly workflowProviders = inject(AXP_WORKFLOW_PROVIDER, { optional: true }) || [];\n\n    //#endregion\n\n    //#region ----   Cache Storage   ----\n\n    /** Cache for categories by id - O(1) lookup */\n    private categoriesById = new Map<string, AXPWorkflowCategory>();\n\n    /** Cache for categories by parentId - O(1) lookup */\n    private categoriesByParentId = new Map<string | undefined, AXPWorkflowCategory[]>();\n\n    /** Cache for workflow definitions by categoryId - O(1) lookup */\n    private workflowsByCategory = new Map<string, AXPWorkflowDefinition[]>();\n\n    /** Cache for individual workflow definitions by name - O(1) lookup */\n    private workflowsByName = new Map<string, AXPWorkflowDefinition>();\n\n    /** Track which provider index owns each category (by category ID) */\n    private categoryOwnership = new Map<string, number>(); // Maps categoryId → provider index\n\n    /** Pending API requests to prevent duplicate calls */\n    private pendingCategoriesRequests = new Map<string | undefined, Promise<AXPWorkflowCategory[]>>();\n    private pendingWorkflowsRequests = new Map<string, Promise<AXPWorkflowDefinition[]>>();\n    private pendingWorkflowRequests = new Map<string, Promise<AXPWorkflowDefinition | undefined>>();\n\n    //#endregion\n\n    //#region ----   Public API: Categories   ----\n\n    /**\n     * Get categories by parentId with aggressive caching\n     * \n     * Optimization: Returns cached result immediately if available,\n     * preventing unnecessary API calls during navigation\n     * \n     * @param parentId - Parent category ID (undefined = root categories)\n     * @returns Array of categories with count metadata (childrenCount, itemsCount)\n     */\n    async getCategories(parentId?: string): Promise<AXPWorkflowCategory[]> {\n        // ✅ Fast path: Return cached result\n        if (this.categoriesByParentId.has(parentId)) {\n            return this.categoriesByParentId.get(parentId)!;\n        }\n\n        // ✅ Prevent duplicate requests: Return pending promise\n        if (this.pendingCategoriesRequests.has(parentId)) {\n            return this.pendingCategoriesRequests.get(parentId)!;\n        }\n\n        // ✅ Create single request and cache it\n        const requestPromise = this.loadCategoriesFromProviders(parentId);\n        this.pendingCategoriesRequests.set(parentId, requestPromise);\n\n        return requestPromise;\n    }\n\n    /**\n     * Get single category by ID with O(1) lookup\n     * \n     * Optimization: Uses Map for instant retrieval, falls back to\n     * searching cache, then providers if not found\n     */\n    async getCategoryById(categoryId: string): Promise<AXPWorkflowCategory | undefined> {\n        // ✅ Fast path: O(1) lookup in cache\n        if (this.categoriesById.has(categoryId)) {\n            return this.categoriesById.get(categoryId);\n        }\n\n        // ✅ Search in cached parent-child lists\n        for (const categories of this.categoriesByParentId.values()) {\n            const found = categories.find(cat => cat.id === categoryId);\n            if (found) {\n                this.categoriesById.set(categoryId, found);\n                return found;\n            }\n        }\n\n        // ✅ Load root categories if not loaded\n        if (!this.categoriesByParentId.has(undefined)) {\n            await this.getCategories();\n            if (this.categoriesById.has(categoryId)) {\n                return this.categoriesById.get(categoryId);\n            }\n        }\n\n        // ✅ Breadth-first search through hierarchy\n        return this.searchCategoryInHierarchy(categoryId);\n    }\n\n    /**\n     * Get category path from root to specified category\n     * \n     * Optimization: Builds path using cached categories only\n     */\n    async getCategoriesPathById(categoryId: string): Promise<AXPWorkflowCategory[]> {\n        const path: AXPWorkflowCategory[] = [];\n        let currentCategoryId: string | undefined = categoryId;\n\n        while (currentCategoryId) {\n            const category = await this.getCategoryById(currentCategoryId);\n            if (!category) {\n                throw new Error(`Category '${currentCategoryId}' not found`);\n            }\n            path.unshift(category);\n            currentCategoryId = category.parentId;\n        }\n\n        return path;\n    }\n\n    //#endregion\n\n    //#region ----   Public API: Workflow Definitions   ----\n\n    /**\n     * Get workflow definitions for a category with smart caching\n     * \n     * Optimization: Checks itemsCount before querying\n     * - If itemsCount = 0, returns empty array (no API call)\n     * - If itemsCount > 0, loads and caches workflow definitions\n     * - Returns cached result on subsequent calls\n     * \n     * @param categoryId - Category ID to get workflow definitions from\n     * @returns Array of workflow definitions\n     */\n    async getWorkflowsByCategoryId(categoryId: string): Promise<AXPWorkflowDefinition[]> {\n        // ✅ Fast path: Return cached result\n        if (this.workflowsByCategory.has(categoryId)) {\n            return this.workflowsByCategory.get(categoryId)!;\n        }\n\n        // ✅ Smart optimization: Check itemsCount before querying\n        const category = await this.getCategoryById(categoryId);\n        if (category && category.itemsCount !== undefined && category.itemsCount === 0) {\n            // Category has no workflows - cache empty array and skip API call\n            const emptyArray: AXPWorkflowDefinition[] = [];\n            this.workflowsByCategory.set(categoryId, emptyArray);\n            return emptyArray;\n        }\n\n        // ✅ Prevent duplicate requests\n        if (this.pendingWorkflowsRequests.has(categoryId)) {\n            return this.pendingWorkflowsRequests.get(categoryId)!;\n        }\n\n        // ✅ Load from providers\n        const requestPromise = this.loadWorkflowsFromProviders(categoryId);\n        this.pendingWorkflowsRequests.set(categoryId, requestPromise);\n\n        return requestPromise;\n    }\n\n    /**\n     * Get single workflow definition by name with O(1) lookup\n     * \n     * Optimization: Uses Map for instant retrieval\n     * \n     * @param name - Workflow name (unique identifier)\n     * @returns Workflow definition or undefined if not found\n     */\n    async getWorkflowByName(name: string): Promise<AXPWorkflowDefinition | undefined> {\n        // ✅ Fast path: O(1) lookup in cache\n        if (this.workflowsByName.has(name)) {\n            return this.workflowsByName.get(name);\n        }\n\n        // ✅ Prevent duplicate requests\n        if (this.pendingWorkflowRequests.has(name)) {\n            return this.pendingWorkflowRequests.get(name)!;\n        }\n\n        // ✅ Load from providers\n        const requestPromise = this.loadWorkflowFromProviders(name);\n        this.pendingWorkflowRequests.set(name, requestPromise);\n\n        return requestPromise;\n    }\n\n    /**\n     * Get category ID containing a specific workflow definition\n     * \n     * Optimization: Searches cache first, loads on-demand if needed\n     */\n    async getCategoryIdByWorkflowName(workflowName: string): Promise<string | undefined> {\n        // ✅ Search in cached workflow definitions\n        for (const [categoryId, definitions] of this.workflowsByCategory.entries()) {\n            if (definitions.some(def => def.name === workflowName)) {\n                return categoryId;\n            }\n        }\n\n        // ✅ Try loading the workflow definition to find its category\n        // Note: AXPWorkflowDefinition doesn't have category field\n        // Category is managed separately through category providers\n        // This method searches through cached categories\n        const definition = await this.getWorkflowByName(workflowName);\n        if (definition) {\n            // Search through all categories to find which one contains this workflow\n            const categories = await this.getCategories();\n            for (const category of categories) {\n                const workflows = await this.getWorkflowsByCategoryId(category.id);\n                if (workflows.some(w => w.name === workflowName)) {\n                    return category.id;\n                }\n            }\n        }\n\n        return undefined;\n    }\n\n    /**\n     * Get category path for a workflow\n     */\n    async getCategoriesPathByWorkflowName(workflowName: string): Promise<AXPWorkflowCategory[]> {\n        const categoryId = await this.getCategoryIdByWorkflowName(workflowName);\n        if (!categoryId) {\n            throw new Error(`Workflow '${workflowName}' not found in any category`);\n        }\n        return this.getCategoriesPathById(categoryId);\n    }\n\n    //#endregion\n\n    //#region ----   Private: Data Loading   ----\n\n    /**\n     * Load categories from providers and cache results\n     * \n     * Optimization: Tracks provider ownership to avoid unnecessary API calls\n     * - For root (parentId = undefined): Query ALL providers\n     * - For children: Only query the provider that owns the parent\n     */\n    private async loadCategoriesFromProviders(parentId?: string): Promise<AXPWorkflowCategory[]> {\n        try {\n            const resolvedProviders = await Promise.allSettled(this.categoryProviders);\n            const categories: AXPWorkflowCategory[] = [];\n\n            // Determine which provider(s) to query\n            const providerIndicesToQuery = parentId\n                ? this.getProviderIndexForCategory(parentId)\n                : null; // Root: query all providers\n\n            for (let i = 0; i < resolvedProviders.length; i++) {\n                const p = resolvedProviders[i];\n\n                // Skip if we have a specific provider index and this isn't it\n                if (providerIndicesToQuery !== null && !providerIndicesToQuery.includes(i)) {\n                    continue;\n                }\n\n                if (p.status === 'fulfilled' && p.value && typeof p.value.getList === 'function') {\n                    try {\n                        const cats = await p.value.getList(parentId);\n                        if (Array.isArray(cats) && cats.length > 0) {\n                            categories.push(...cats);\n\n                            // ✅ Track ownership: This provider INDEX owns these categories\n                            cats.forEach(cat => this.categoryOwnership.set(cat.id, i));\n                        }\n                    } catch {\n                        // Continue on error - try other providers\n                    }\n                }\n            }\n\n            // ✅ Cache results for fast subsequent access\n            this.categoriesByParentId.set(parentId, categories);\n            categories.forEach(cat => this.categoriesById.set(cat.id, cat));\n\n            return categories;\n        } finally {\n            this.pendingCategoriesRequests.delete(parentId);\n        }\n    }\n\n    /**\n     * Get the provider index that owns a specific category\n     * \n     * @returns Array with provider index, or null if ownership unknown (query all)\n     */\n    private getProviderIndexForCategory(categoryId: string): number[] | null {\n        const ownerIndex = this.categoryOwnership.get(categoryId);\n\n        if (ownerIndex !== undefined) {\n            return [ownerIndex];\n        }\n\n        // Ownership unknown - will query all providers (fallback)\n        return null;\n    }\n\n    /**\n     * Load workflow definitions from providers and cache results\n     * \n     * Optimization: Only queries the provider that owns the category\n     * Uses provider INDEX to match category provider with workflow provider\n     */\n    private async loadWorkflowsFromProviders(categoryId: string): Promise<AXPWorkflowDefinition[]> {\n        try {\n            const resolvedProviders = await Promise.allSettled(this.workflowProviders);\n            const definitions: AXPWorkflowDefinition[] = [];\n\n            // ✅ Smart routing: Get provider INDEX that owns this category\n            const ownerIndex = this.categoryOwnership.get(categoryId);\n            const providerIndicesToQuery = ownerIndex !== undefined ? [ownerIndex] : null;\n\n            for (let i = 0; i < resolvedProviders.length; i++) {\n                const p = resolvedProviders[i];\n\n                // Skip if we have a specific provider index and this isn't it\n                if (providerIndicesToQuery !== null && !providerIndicesToQuery.includes(i)) {\n                    continue;\n                }\n\n                if (p.status === 'fulfilled' && p.value && typeof p.value.getList === 'function') {\n                    try {\n                        const defs = await p.value.getList(categoryId);\n                        if (Array.isArray(defs)) {\n                            definitions.push(...defs);\n                        }\n                    } catch {\n                        // Continue on error - try other providers\n                    }\n                }\n            }\n\n            // ✅ Cache results for fast subsequent access\n            this.workflowsByCategory.set(categoryId, definitions);\n            definitions.forEach(def => {\n                if (def.name) {\n                    this.workflowsByName.set(def.name, def);\n                }\n            });\n\n            return definitions;\n        } finally {\n            this.pendingWorkflowsRequests.delete(categoryId);\n        }\n    }\n\n    /**\n     * Load single workflow definition from providers and cache result\n     */\n    private async loadWorkflowFromProviders(name: string): Promise<AXPWorkflowDefinition | undefined> {\n        try {\n            const resolvedProviders = await Promise.allSettled(this.workflowProviders);\n\n            // Try providers first\n            for (const p of resolvedProviders) {\n                if (p.status === 'fulfilled' && p.value && typeof p.value.getByName === 'function') {\n                    try {\n                        const definition = await p.value.getByName(name);\n                        if (definition) {\n                            this.workflowsByName.set(name, definition);\n                            return definition;\n                        }\n                    } catch {\n                        // Continue on error\n                    }\n                }\n            }\n\n            // Fallback: Search in cached workflow definitions\n            for (const definitions of this.workflowsByCategory.values()) {\n                const found = definitions.find(def => def.name === name);\n                if (found) {\n                    this.workflowsByName.set(name, found);\n                    return found;\n                }\n            }\n\n            return undefined;\n        } finally {\n            this.pendingWorkflowRequests.delete(name);\n        }\n    }\n\n    /**\n     * Breadth-first search through category hierarchy\n     */\n    private async searchCategoryInHierarchy(categoryId: string): Promise<AXPWorkflowCategory | undefined> {\n        const searchQueue: (string | undefined)[] = [undefined];\n        const searched = new Set<string | undefined>();\n\n        while (searchQueue.length > 0) {\n            const parentId = searchQueue.shift()!;\n            if (searched.has(parentId)) continue;\n            searched.add(parentId);\n\n            const categories = await this.getCategories(parentId);\n            const found = categories.find(cat => cat.id === categoryId);\n\n            if (found) {\n                return found;\n            }\n\n            // ✅ Optimization: Only search children if childrenCount > 0\n            for (const category of categories) {\n                if (category.childrenCount > 0 && !searched.has(category.id)) {\n                    searchQueue.push(category.id);\n                }\n            }\n        }\n\n        return undefined;\n    }\n\n    //#endregion\n\n    //#region ----   Cache Management   ----\n\n    /**\n     * Check if category has children (uses cached count)\n     */\n    categoryHasChildren(categoryId: string): boolean {\n        const category = this.categoriesById.get(categoryId);\n        return category ? category.childrenCount > 0 : false;\n    }\n\n    /**\n     * Check if category has workflows (uses cached count)\n     */\n    categoryHasWorkflows(categoryId: string): boolean {\n        const category = this.categoriesById.get(categoryId);\n        return category ? (category.itemsCount ?? 0) > 0 : false;\n    }\n\n    /**\n     * Clear all caches\n     */\n    clearAllCache(): void {\n        this.categoriesById.clear();\n        this.categoriesByParentId.clear();\n        this.workflowsByCategory.clear();\n        this.workflowsByName.clear();\n        this.categoryOwnership.clear();\n        this.pendingCategoriesRequests.clear();\n        this.pendingWorkflowsRequests.clear();\n        this.pendingWorkflowRequests.clear();\n    }\n\n    /**\n     * Clear categories cache only\n     */\n    clearCategoriesCache(): void {\n        this.categoriesById.clear();\n        this.categoriesByParentId.clear();\n        this.categoryOwnership.clear();\n        this.pendingCategoriesRequests.clear();\n    }\n\n    /**\n     * Clear workflows cache only\n     */\n    clearWorkflowsCache(): void {\n        this.workflowsByCategory.clear();\n        this.workflowsByName.clear();\n        this.pendingWorkflowsRequests.clear();\n        this.pendingWorkflowRequests.clear();\n    }\n\n    //#endregion\n}\n\n","import { Inject, ModuleWithProviders, NgModule, Optional, Type, inject } from '@angular/core';\nimport { AXPWorkflowDecideAction } from './actions/decide.action';\nimport { AXPStartWorkflowAction } from './actions/start-workflow.action';\nimport { AXPWorkflowRegistryService } from './workflow-registery.service';\nimport { AXPWorkflow, AXPWorkflowAction, AXPWorkflowFunction } from './contracts/workflow.types';\nimport { AXP_WORKFLOW_ENGINE, AXPWorkflowLocalEngine } from './engine';\nimport { AXPWorkflowManager } from './engine/runtime/workflow-manager.service';\nexport interface AXPWorkflowModuleConfigs {\n  functions?: {\n    [name: string]: Type<AXPWorkflowFunction>;\n  };\n  actions?: {\n    [name: string]: Type<AXPWorkflowAction>;\n  };\n  workflows?: {\n    [name: string]: AXPWorkflow;\n  };\n}\n\n@NgModule({\n  imports: [],\n  exports: [],\n  declarations: [],\n  providers: [\n    AXPWorkflowLocalEngine,\n    {\n      provide: AXP_WORKFLOW_ENGINE,\n      useExisting: AXPWorkflowLocalEngine,\n    },\n    AXPWorkflowManager,\n  ],\n})\nexport class AXPWorkflowModule {\n\n  static forRoot(config?: AXPWorkflowModuleConfigs): ModuleWithProviders<AXPWorkflowModule> {\n    return {\n      ngModule: AXPWorkflowModule,\n      providers: [\n        {\n          provide: 'AXPWorkflowModuleFactory',\n          useFactory: (registry: AXPWorkflowRegistryService) => () => {\n            registry.registerAction('start-workflow', AXPStartWorkflowAction);\n            registry.registerAction('decide', AXPWorkflowDecideAction);\n            //\n            if (config?.functions) {\n              for (const [key, type] of Object.entries(config.functions)) {\n                registry.registerFunction(key, type);\n              }\n            }\n            //\n            if (config?.actions) {\n              for (const [key, type] of Object.entries(config.actions)) {\n                registry.registerAction(key, type);\n              }\n            }\n            //\n            if (config?.workflows) {\n              for (const [key, type] of Object.entries(config.workflows)) {\n                registry.registerWorkflow(key, type);\n              }\n            }\n          },\n          deps: [AXPWorkflowRegistryService],\n          multi: true,\n        },\n        ...Object.values(config?.actions ?? { AXPStartWorkflowAction }),\n        ...Object.values(config?.functions ?? {}),\n      ],\n    };\n  }\n\n  static forChild(config?: AXPWorkflowModuleConfigs): ModuleWithProviders<AXPWorkflowModule> {\n    return {\n      ngModule: AXPWorkflowModule,\n      providers: [\n        // Built-in activities are already registered in forRoot via @NgModule providers\n        // No need to register again in forChild\n        {\n          provide: 'AXPWorkflowModuleFactory',\n          useFactory: (registry: AXPWorkflowRegistryService) => () => {\n            registry.registerAction('start-workflow', AXPStartWorkflowAction);\n            registry.registerAction('decide', AXPWorkflowDecideAction);\n            //\n            if (config?.functions) {\n              for (const [key, type] of Object.entries(config.functions)) {\n                registry.registerFunction(key, type);\n              }\n            }\n            //\n            if (config?.actions) {\n              for (const [key, type] of Object.entries(config.actions)) {\n                registry.registerAction(key, type);\n              }\n            }\n            //\n            if (config?.workflows) {\n              for (const [key, type] of Object.entries(config.workflows)) {\n                registry.registerWorkflow(key, type);\n              }\n            }\n          },\n          deps: [AXPWorkflowRegistryService],\n          multi: true,\n        },\n        ...Object.values(config?.actions ?? {}),\n        ...Object.values(config?.functions ?? {}),\n      ],\n    };\n  }\n\n  /**\n   * @ignore\n   */\n  constructor(@Optional() @Inject('AXPWorkflowModuleFactory') instances: any[]) {\n    instances?.forEach((f) => {\n      f();\n    });\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.AXPWorkflowRegistryService"],"mappings":"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"}