@datatechsolutions/ui 3.2.0 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/astrlabe/contracts.d.mts +31 -3
  2. package/dist/astrlabe/contracts.d.ts +31 -3
  3. package/dist/astrlabe/index.js +115 -115
  4. package/dist/astrlabe/index.mjs +4 -4
  5. package/dist/astrlabe/utils.js +9 -9
  6. package/dist/astrlabe/utils.mjs +2 -2
  7. package/dist/astrlabe/workflow-canvas.js +3 -3
  8. package/dist/astrlabe/workflow-canvas.mjs +2 -2
  9. package/dist/{chunk-QYA53LUF.mjs → chunk-2WXRRQM3.mjs} +21 -4
  10. package/dist/chunk-2WXRRQM3.mjs.map +1 -0
  11. package/dist/{chunk-C3H4FM4A.js → chunk-72SWXOD5.js} +15 -2
  12. package/dist/chunk-72SWXOD5.js.map +1 -0
  13. package/dist/{chunk-H2D2CRTD.mjs → chunk-BR2GAZKG.mjs} +5 -5
  14. package/dist/{chunk-H2D2CRTD.mjs.map → chunk-BR2GAZKG.mjs.map} +1 -1
  15. package/dist/{chunk-NJS2YC3J.js → chunk-DJDZIRM6.js} +12 -2
  16. package/dist/chunk-DJDZIRM6.js.map +1 -0
  17. package/dist/{chunk-5W7L7BT7.mjs → chunk-G7JQ4OCE.mjs} +15 -2
  18. package/dist/chunk-G7JQ4OCE.mjs.map +1 -0
  19. package/dist/{chunk-YIB2YAM5.mjs → chunk-GIQXB3BG.mjs} +3 -3
  20. package/dist/{chunk-YIB2YAM5.mjs.map → chunk-GIQXB3BG.mjs.map} +1 -1
  21. package/dist/{chunk-RL35XATZ.js → chunk-IJAKZHXX.js} +82 -65
  22. package/dist/chunk-IJAKZHXX.js.map +1 -0
  23. package/dist/{chunk-U7XM3N7F.mjs → chunk-LEXBTVGM.mjs} +12 -2
  24. package/dist/chunk-LEXBTVGM.mjs.map +1 -0
  25. package/dist/{chunk-SU3YPWFW.js → chunk-MWPTSBAI.js} +4 -4
  26. package/dist/{chunk-SU3YPWFW.js.map → chunk-MWPTSBAI.js.map} +1 -1
  27. package/dist/{chunk-EFOXN3LC.js → chunk-NJFRJ6YD.js} +279 -19
  28. package/dist/chunk-NJFRJ6YD.js.map +1 -0
  29. package/dist/{chunk-YV72JM4B.mjs → chunk-O6M3KDGT.mjs} +3 -3
  30. package/dist/{chunk-YV72JM4B.mjs.map → chunk-O6M3KDGT.mjs.map} +1 -1
  31. package/dist/{chunk-RGI74SQH.js → chunk-OCELRSLO.js} +4 -4
  32. package/dist/{chunk-RGI74SQH.js.map → chunk-OCELRSLO.js.map} +1 -1
  33. package/dist/{chunk-IRT4T3CU.mjs → chunk-PCYL4MII.mjs} +274 -14
  34. package/dist/chunk-PCYL4MII.mjs.map +1 -0
  35. package/dist/{chunk-Y6AEE56Q.js → chunk-ZL6C2ZAF.js} +29 -29
  36. package/dist/{chunk-Y6AEE56Q.js.map → chunk-ZL6C2ZAF.js.map} +1 -1
  37. package/dist/platform/agents-workspace.js +6 -6
  38. package/dist/platform/agents-workspace.mjs +5 -5
  39. package/dist/platform/index.js +17 -17
  40. package/dist/platform/index.mjs +8 -8
  41. package/dist/platform/pages/index.js +12 -12
  42. package/dist/platform/pages/index.mjs +6 -6
  43. package/dist/platform/telemetry/index.js +9 -0
  44. package/dist/platform/telemetry/index.js.map +1 -1
  45. package/dist/platform/telemetry/index.mjs +9 -0
  46. package/dist/platform/telemetry/index.mjs.map +1 -1
  47. package/dist/platform/workflow-canvas-shell.js +4 -4
  48. package/dist/platform/workflow-canvas-shell.mjs +3 -3
  49. package/package.json +1 -1
  50. package/dist/chunk-5W7L7BT7.mjs.map +0 -1
  51. package/dist/chunk-C3H4FM4A.js.map +0 -1
  52. package/dist/chunk-EFOXN3LC.js.map +0 -1
  53. package/dist/chunk-IRT4T3CU.mjs.map +0 -1
  54. package/dist/chunk-NJS2YC3J.js.map +0 -1
  55. package/dist/chunk-QYA53LUF.mjs.map +0 -1
  56. package/dist/chunk-RL35XATZ.js.map +0 -1
  57. package/dist/chunk-U7XM3N7F.mjs.map +0 -1
@@ -394,6 +394,16 @@ function validateNodeConfig(node, options = {}) {
394
394
  }
395
395
  break;
396
396
  }
397
+ case "audio_input":
398
+ if (!hasNonEmptyString(config, "url")) {
399
+ pushNodeIssue(issues, node, locale, "node.required", "url");
400
+ }
401
+ break;
402
+ case "speech_transcriber":
403
+ if (!hasNonEmptyString(config, "audioUrl")) {
404
+ pushNodeIssue(issues, node, locale, "node.required", "audioUrl");
405
+ }
406
+ break;
397
407
  default:
398
408
  pushNodeIssue(issues, node, locale, "node.unknownType", void 0, { nodeType });
399
409
  break;
@@ -551,5 +561,5 @@ function detectCycle(agentNodes, edges, nodeMap, locale) {
551
561
  }
552
562
 
553
563
  export { topologicalSortAgents, validateGraphNodeConfigs, validateNodeConfig, validateWorkflowGraph };
554
- //# sourceMappingURL=chunk-U7XM3N7F.mjs.map
555
- //# sourceMappingURL=chunk-U7XM3N7F.mjs.map
564
+ //# sourceMappingURL=chunk-LEXBTVGM.mjs.map
565
+ //# sourceMappingURL=chunk-LEXBTVGM.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/astrlabe/utils/workflow-validator.ts"],"names":[],"mappings":"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","file":"chunk-LEXBTVGM.mjs","sourcesContent":["/**\n * Workflow Validator\n * =================\n * Localizes validation output inside the UI package while keeping issue codes\n * stable enough for future contract tests against the backend validator.\n */\n\nimport type { WorkflowEdge, WorkflowGraph, WorkflowNode } from '../contracts'\n\ntype JsonRecord = Record<string, unknown>\n\ntype SupportedLocale = 'en' | 'pt-BR' | 'es' | 'fr' | 'de' | 'it'\n\ntype ValidationMessageKey =\n | 'graph.noAgents'\n | 'graph.missingSource'\n | 'graph.missingTarget'\n | 'graph.orphanNode'\n | 'graph.toolToNonAgent'\n | 'graph.ruleNoAgent'\n | 'graph.cycleDetected'\n | 'graph.multipleStartNodes'\n | 'graph.multipleEndNodes'\n | 'graph.startHasIncoming'\n | 'graph.endHasOutgoing'\n | 'graph.iterationNoOutgoing'\n | 'node.required'\n | 'node.requiredWhenLanguageSet'\n | 'node.codeShapeRequired'\n | 'node.mustBeArray'\n | 'node.mustBeReferenceArray'\n | 'node.mustBeNonEmptyReferenceArray'\n | 'node.assignmentNeedsSourceOrValue'\n | 'node.invalidAggregationMode'\n | 'node.invalidListOperation'\n | 'node.invalidLogicalOperator'\n | 'node.mustBeNumber'\n | 'node.invalidHttpMethod'\n | 'node.providerIdentityRequired'\n | 'node.inputOrInstructionsRequired'\n | 'node.invalidExtractionMode'\n | 'node.s3WriteSourceOrBodyRequired'\n | 'node.unknownType'\n\ntype ValidationParams = Record<string, string | number | undefined>\n\ntype ValidationMessageCatalog = Record<ValidationMessageKey, string>\n\nconst EN_MESSAGES: ValidationMessageCatalog = {\n 'graph.noAgents': 'At least one agent node is required',\n 'graph.missingSource': 'Edge \"{edgeId}\" references non-existent source node \"{source}\"',\n 'graph.missingTarget': 'Edge \"{edgeId}\" references non-existent target node \"{target}\"',\n 'graph.orphanNode': 'Node \"{label}\" ({nodeType}) is not connected to any other node',\n 'graph.toolToNonAgent': 'Tool \"{label}\" can only connect to agent nodes, not {targetType} nodes',\n 'graph.ruleNoAgent': 'Rule \"{label}\" must have an incoming connection from an agent',\n 'graph.cycleDetected': 'Agent nodes form a cycle; workflows must be a DAG',\n 'graph.multipleStartNodes': 'Only one Start node is allowed',\n 'graph.multipleEndNodes': 'Only one End node is allowed',\n 'graph.startHasIncoming': 'Start node cannot have incoming connections',\n 'graph.endHasOutgoing': 'End node cannot have outgoing connections',\n 'graph.iterationNoOutgoing': 'Iteration node must have at least one outgoing connection',\n 'node.required': 'is required',\n 'node.requiredWhenLanguageSet': 'is required when language is set',\n 'node.codeShapeRequired': 'either {language, code} (UI) or {operation, ...} (engine) must be set',\n 'node.mustBeArray': 'must be an array',\n 'node.mustBeReferenceArray': 'must be an array of reference strings',\n 'node.mustBeNonEmptyReferenceArray': 'must be a non-empty array of reference strings',\n 'node.assignmentNeedsSourceOrValue': 'must set either `source` or `value`',\n 'node.invalidAggregationMode': 'must be one of: array | object | concatenate',\n 'node.invalidListOperation': 'must be one of: filter | map | sort | limit | deduplicate | flatten | count | sum | avg',\n 'node.invalidLogicalOperator': 'must be `and` or `or`',\n 'node.mustBeNumber': 'must be a number',\n 'node.invalidHttpMethod': 'must be one of: GET | POST | PUT | PATCH | DELETE',\n 'node.providerIdentityRequired': 'must set `connectionId`, `modelId`, or inline `provider` + `model`',\n 'node.inputOrInstructionsRequired': 'is required (or `instructions`)',\n 'node.invalidExtractionMode': 'must be one of: text | table | structured',\n 'node.s3WriteSourceOrBodyRequired': 'Either Source URL or Body must be provided',\n 'node.unknownType': 'unknown node type `{nodeType}`',\n}\n\nconst PT_BR_MESSAGES: ValidationMessageCatalog = {\n 'graph.noAgents': 'Pelo menos um nó de agente é necessário',\n 'graph.missingSource': 'A aresta \"{edgeId}\" referencia um nó de origem inexistente \"{source}\"',\n 'graph.missingTarget': 'A aresta \"{edgeId}\" referencia um nó de destino inexistente \"{target}\"',\n 'graph.orphanNode': 'O nó \"{label}\" ({nodeType}) não está conectado a nenhum outro nó',\n 'graph.toolToNonAgent': 'A ferramenta \"{label}\" só pode se conectar a nós de agente, não a nós {targetType}',\n 'graph.ruleNoAgent': 'A regra \"{label}\" deve ter uma conexão de entrada vinda de um agente',\n 'graph.cycleDetected': 'Os nós de agente formam um ciclo; workflows devem ser um DAG',\n 'graph.multipleStartNodes': 'Apenas um nó Start é permitido',\n 'graph.multipleEndNodes': 'Apenas um nó End é permitido',\n 'graph.startHasIncoming': 'O nó Start não pode ter conexões de entrada',\n 'graph.endHasOutgoing': 'O nó End não pode ter conexões de saída',\n 'graph.iterationNoOutgoing': 'O nó Iteration deve ter pelo menos uma conexão de saída',\n 'node.required': 'é obrigatório',\n 'node.requiredWhenLanguageSet': 'é obrigatório quando language está definido',\n 'node.codeShapeRequired': 'é necessário definir {language, code} (UI) ou {operation, ...} (engine)',\n 'node.mustBeArray': 'deve ser um array',\n 'node.mustBeReferenceArray': 'deve ser um array de strings de referência',\n 'node.mustBeNonEmptyReferenceArray': 'deve ser um array não vazio de strings de referência',\n 'node.assignmentNeedsSourceOrValue': 'deve definir `source` ou `value`',\n 'node.invalidAggregationMode': 'deve ser um de: array | object | concatenate',\n 'node.invalidListOperation': 'deve ser um de: filter | map | sort | limit | deduplicate | flatten | count | sum | avg',\n 'node.invalidLogicalOperator': 'deve ser `and` ou `or`',\n 'node.mustBeNumber': 'deve ser um número',\n 'node.invalidHttpMethod': 'deve ser um de: GET | POST | PUT | PATCH | DELETE',\n 'node.providerIdentityRequired': 'deve definir `connectionId`, `modelId` ou `provider` + `model` inline',\n 'node.inputOrInstructionsRequired': 'é obrigatório (ou `instructions`)',\n 'node.invalidExtractionMode': 'deve ser um de: text | table | structured',\n 'node.s3WriteSourceOrBodyRequired': 'Forneça Source URL ou Body',\n 'node.unknownType': 'tipo de nó desconhecido `{nodeType}`',\n}\n\nconst MESSAGE_CATALOG: Record<SupportedLocale, ValidationMessageCatalog> = {\n en: EN_MESSAGES,\n 'pt-BR': PT_BR_MESSAGES,\n es: EN_MESSAGES,\n fr: EN_MESSAGES,\n de: EN_MESSAGES,\n it: EN_MESSAGES,\n}\n\nexport type ValidationLocale = SupportedLocale | string\n\nexport type ValidationIssueCode =\n | 'graph.noAgents'\n | 'graph.missingSource'\n | 'graph.missingTarget'\n | 'graph.orphanNode'\n | 'graph.toolToNonAgent'\n | 'graph.ruleNoAgent'\n | 'graph.cycleDetected'\n | 'graph.multipleStartNodes'\n | 'graph.multipleEndNodes'\n | 'graph.startHasIncoming'\n | 'graph.endHasOutgoing'\n | 'graph.iterationNoOutgoing'\n | 'node.required'\n | 'node.requiredWhenLanguageSet'\n | 'node.codeShapeRequired'\n | 'node.mustBeArray'\n | 'node.mustBeReferenceArray'\n | 'node.mustBeNonEmptyReferenceArray'\n | 'node.assignmentNeedsSourceOrValue'\n | 'node.invalidAggregationMode'\n | 'node.invalidListOperation'\n | 'node.invalidLogicalOperator'\n | 'node.mustBeNumber'\n | 'node.invalidHttpMethod'\n | 'node.providerIdentityRequired'\n | 'node.inputOrInstructionsRequired'\n | 'node.invalidExtractionMode'\n | 'node.s3WriteSourceOrBodyRequired'\n | 'node.unknownType'\n\nexport type ValidationIssue = {\n code: ValidationIssueCode\n message: string\n params?: ValidationParams\n}\n\nexport type NodeValidationIssue = ValidationIssue & {\n nodeId: string\n nodeType: string\n field?: string\n}\n\nexport type ValidationResult = {\n valid: boolean\n errors: string[]\n issues: ValidationIssue[]\n nodeIssues: NodeValidationIssue[]\n}\n\nexport type ValidationOptions = {\n locale?: ValidationLocale\n}\n\nfunction normalizeLocale(locale?: ValidationLocale): SupportedLocale {\n if (!locale) {\n return 'en'\n }\n\n if (locale in MESSAGE_CATALOG) {\n return locale as SupportedLocale\n }\n\n const lowercase = locale.toLowerCase()\n if (lowercase.startsWith('pt')) {\n return 'pt-BR'\n }\n\n if (lowercase.startsWith('es')) {\n return 'es'\n }\n\n if (lowercase.startsWith('fr')) {\n return 'fr'\n }\n\n if (lowercase.startsWith('de')) {\n return 'de'\n }\n\n if (lowercase.startsWith('it')) {\n return 'it'\n }\n\n return 'en'\n}\n\nfunction template(messageKey: ValidationMessageKey, params?: ValidationParams, locale?: ValidationLocale): string {\n const catalog = MESSAGE_CATALOG[normalizeLocale(locale)] ?? EN_MESSAGES\n const message = catalog[messageKey] ?? EN_MESSAGES[messageKey]\n return message.replace(/\\{([^}]+)\\}/g, (_, key: string) => String(params?.[key] ?? ''))\n}\n\nfunction isRecord(value: unknown): value is JsonRecord {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction getConfig(node: WorkflowNode): JsonRecord {\n return isRecord(node.data.config) ? node.data.config : {}\n}\n\nfunction getString(config: JsonRecord, field: string): string | undefined {\n const value = config[field]\n return typeof value === 'string' ? value : undefined\n}\n\nfunction hasNonEmptyString(config: JsonRecord, field: string): boolean {\n const value = getString(config, field)\n return typeof value === 'string' && value.trim().length > 0\n}\n\nfunction getArray(config: JsonRecord, field: string): unknown[] | undefined {\n const value = config[field]\n return Array.isArray(value) ? value : undefined\n}\n\nfunction getNumber(config: JsonRecord, field: string): number | undefined {\n const value = config[field]\n return typeof value === 'number' ? value : undefined\n}\n\nfunction pushNodeIssue(\n issues: NodeValidationIssue[],\n node: WorkflowNode,\n locale: ValidationLocale | undefined,\n code: ValidationIssueCode,\n field?: string,\n params?: ValidationParams,\n) {\n issues.push({\n nodeId: node.id,\n nodeType: node.type,\n field,\n code,\n params,\n message: template(code, params, locale),\n })\n}\n\nfunction pushIssue(\n issues: ValidationIssue[],\n locale: ValidationLocale | undefined,\n code: ValidationIssueCode,\n params?: ValidationParams,\n) {\n issues.push({\n code,\n params,\n message: template(code, params, locale),\n })\n}\n\nfunction ensureProviderIdentifiable(\n node: WorkflowNode,\n config: JsonRecord,\n issues: NodeValidationIssue[],\n locale?: ValidationLocale,\n) {\n const hasConnection = hasNonEmptyString(config, 'connectionId')\n const hasModelId = hasNonEmptyString(config, 'modelId')\n const hasInline = hasNonEmptyString(config, 'provider') && hasNonEmptyString(config, 'model')\n if (!hasConnection && !hasModelId && !hasInline) {\n pushNodeIssue(issues, node, locale, 'node.providerIdentityRequired', 'provider')\n }\n}\n\nfunction formatNodeIssue(issue: NodeValidationIssue, nodeMap: Map<string, WorkflowNode>): string {\n const label = nodeMap.get(issue.nodeId)?.data.label ?? issue.nodeId\n const fieldRef = issue.field ? ` (${issue.field})` : ''\n return `Node \"${label}\" [${issue.nodeType}]${fieldRef}: ${issue.message}`\n}\n\nexport function validateNodeConfig(node: WorkflowNode, options: ValidationOptions = {}): NodeValidationIssue[] {\n const locale = options.locale\n const config = getConfig(node)\n const issues: NodeValidationIssue[] = []\n const nodeType = node.type as string\n\n switch (nodeType) {\n case 'start':\n case 'note':\n case 'group':\n case 'dashboard_output':\n break\n\n case 'end': {\n if ('outputVariables' in config && !Array.isArray(config.outputVariables)) {\n pushNodeIssue(issues, node, locale, 'node.mustBeReferenceArray', 'outputVariables')\n } else if (Array.isArray(config.outputs)) {\n config.outputs.forEach((entry, index) => {\n if (!isRecord(entry) || typeof entry.key !== 'string' || entry.key.trim().length === 0) {\n pushNodeIssue(issues, node, locale, 'node.required', `outputs[${index}].key`)\n }\n if (!isRecord(entry) || typeof entry.from !== 'string' || entry.from.trim().length === 0) {\n pushNodeIssue(issues, node, locale, 'node.required', `outputs[${index}].from`)\n }\n })\n }\n break\n }\n\n case 'code': {\n const hasLanguage = 'language' in config\n const hasOperation = 'operation' in config\n if (hasLanguage) {\n if (!hasNonEmptyString(config, 'code')) {\n pushNodeIssue(issues, node, locale, 'node.requiredWhenLanguageSet', 'code')\n }\n } else if (!hasOperation) {\n pushNodeIssue(issues, node, locale, 'node.codeShapeRequired', 'operation')\n }\n break\n }\n\n case 'iteration_start': {\n for (const field of ['iteratorVariable', 'itemVariable', 'indexVariable']) {\n if (!hasNonEmptyString(config, field)) {\n pushNodeIssue(issues, node, locale, 'node.required', field)\n }\n }\n break\n }\n\n case 'entity':\n if (!hasNonEmptyString(config, 'entityMasterId')) {\n pushNodeIssue(issues, node, locale, 'node.required', 'entityMasterId')\n }\n break\n\n case 'datasource':\n if (!hasNonEmptyString(config, 'datasourceId')) {\n pushNodeIssue(issues, node, locale, 'node.required', 'datasourceId')\n }\n break\n\n case 'model_provider':\n if (!hasNonEmptyString(config, 'providerType')) {\n pushNodeIssue(issues, node, locale, 'node.required', 'providerType')\n }\n break\n\n case 'variable_assigner': {\n const assignments = getArray(config, 'assignments')\n if (!assignments) {\n pushNodeIssue(issues, node, locale, 'node.mustBeArray', 'assignments')\n return issues\n }\n\n assignments.forEach((entry, index) => {\n const record = isRecord(entry) ? entry : {}\n const target = typeof record.target === 'string' && record.target.trim().length > 0\n const legacyTarget = typeof record.key === 'string' && record.key.trim().length > 0\n if (!target && !legacyTarget) {\n pushNodeIssue(issues, node, locale, 'node.required', `assignments[${index}].target`)\n }\n\n const source = typeof record.source === 'string' && record.source.trim().length > 0\n const legacySource = typeof record.from === 'string' && record.from.trim().length > 0\n const hasValue = 'value' in record\n if (!source && !legacySource && !hasValue) {\n pushNodeIssue(issues, node, locale, 'node.assignmentNeedsSourceOrValue', `assignments[${index}]`)\n }\n })\n break\n }\n\n case 'variable_aggregator': {\n if ('inputVariables' in config) {\n const inputVariables = getArray(config, 'inputVariables')\n if (!inputVariables || inputVariables.length === 0) {\n pushNodeIssue(issues, node, locale, 'node.mustBeNonEmptyReferenceArray', 'inputVariables')\n }\n if (!hasNonEmptyString(config, 'outputVariable')) {\n pushNodeIssue(issues, node, locale, 'node.required', 'outputVariable')\n }\n const aggregationMode = getString(config, 'aggregationMode')\n if (aggregationMode && !['array', 'object', 'concatenate'].includes(aggregationMode)) {\n pushNodeIssue(issues, node, locale, 'node.invalidAggregationMode', 'aggregationMode')\n }\n }\n break\n }\n\n case 'list_operator': {\n const operation = getString(config, 'operation') ?? ''\n if (!operation) {\n pushNodeIssue(issues, node, locale, 'node.required', 'operation')\n } else if (!['filter', 'map', 'sort', 'limit', 'deduplicate', 'flatten', 'count', 'sum', 'avg'].includes(operation)) {\n pushNodeIssue(issues, node, locale, 'node.invalidListOperation', 'operation')\n }\n\n const inputVariable = getString(config, 'inputVariable')\n const legacySource = getString(config, 'source')\n if (!(inputVariable && inputVariable.trim()) && !(legacySource && legacySource.trim())) {\n pushNodeIssue(issues, node, locale, 'node.required', 'inputVariable')\n }\n break\n }\n\n case 'template_transform':\n if (!hasNonEmptyString(config, 'template')) {\n pushNodeIssue(issues, node, locale, 'node.required', 'template')\n }\n break\n\n case 'answer': {\n const outputTemplate = getString(config, 'outputTemplate')\n const legacyAnswer = getString(config, 'answer')\n if (!(outputTemplate && outputTemplate.trim()) && !(legacyAnswer && legacyAnswer.trim())) {\n pushNodeIssue(issues, node, locale, 'node.required', 'outputTemplate')\n }\n break\n }\n\n case 'if_else': {\n const conditions = getArray(config, 'conditions')\n if (!conditions || conditions.length === 0) {\n pushNodeIssue(issues, node, locale, 'node.mustBeArray', 'conditions')\n } else {\n conditions.forEach((condition, index) => {\n const record = isRecord(condition) ? condition : {}\n if (typeof record.variable !== 'string' || record.variable.trim().length === 0) {\n pushNodeIssue(issues, node, locale, 'node.required', `conditions[${index}].variable`)\n }\n if (typeof record.operator !== 'string' || record.operator.trim().length === 0) {\n pushNodeIssue(issues, node, locale, 'node.required', `conditions[${index}].operator`)\n }\n })\n }\n\n const logicalOperator = getString(config, 'logicalOperator')\n if (logicalOperator && !['and', 'or'].includes(logicalOperator)) {\n pushNodeIssue(issues, node, locale, 'node.invalidLogicalOperator', 'logicalOperator')\n }\n break\n }\n\n case 'iteration': {\n const iteratorVariable = getString(config, 'iteratorVariable')\n const legacySource = getString(config, 'source')\n if (!(iteratorVariable && iteratorVariable.trim()) && !(legacySource && legacySource.trim())) {\n pushNodeIssue(issues, node, locale, 'node.required', 'iteratorVariable')\n }\n if ('maxIterations' in config && getNumber(config, 'maxIterations') === undefined) {\n pushNodeIssue(issues, node, locale, 'node.mustBeNumber', 'maxIterations')\n }\n break\n }\n\n case 'http_request': {\n const method = (getString(config, 'method') ?? '').toUpperCase()\n if (!['GET', 'POST', 'PUT', 'PATCH', 'DELETE'].includes(method)) {\n pushNodeIssue(issues, node, locale, 'node.invalidHttpMethod', 'method')\n }\n if (!hasNonEmptyString(config, 'url')) {\n pushNodeIssue(issues, node, locale, 'node.required', 'url')\n }\n break\n }\n\n case 's3_write': {\n // Mirrors the Rust `s3_write` arm in\n // `lambda-rs/crates/platform-workflow-handlers/src/engine/validation.rs`.\n // `key` is required; either `sourceUrl` or `body` must be present.\n if (!hasNonEmptyString(config, 'key')) {\n pushNodeIssue(issues, node, locale, 'node.required', 'key')\n }\n const hasSource = hasNonEmptyString(config, 'sourceUrl')\n const hasBody = hasNonEmptyString(config, 'body')\n if (!hasSource && !hasBody) {\n pushNodeIssue(issues, node, locale, 'node.s3WriteSourceOrBodyRequired', 'sourceUrl')\n }\n break\n }\n\n case 'rule':\n break\n\n case 'agent':\n if (!hasNonEmptyString(config, 'userPrompt')) {\n pushNodeIssue(issues, node, locale, 'node.required', 'userPrompt')\n }\n ensureProviderIdentifiable(node, config, issues, locale)\n break\n\n case 'question_classifier': {\n ensureProviderIdentifiable(node, config, issues, locale)\n const input = getString(config, 'input')\n const instructions = getString(config, 'instructions')\n if (!(input && input.trim()) && !(instructions && instructions.trim())) {\n pushNodeIssue(issues, node, locale, 'node.inputOrInstructionsRequired', 'input')\n }\n\n const categories = getArray(config, 'categories') ?? getArray(config, 'classes')\n if (!categories || categories.length === 0) {\n pushNodeIssue(issues, node, locale, 'node.mustBeArray', 'categories')\n }\n break\n }\n\n case 'parameter_extractor': {\n ensureProviderIdentifiable(node, config, issues, locale)\n if (!hasNonEmptyString(config, 'input')) {\n pushNodeIssue(issues, node, locale, 'node.required', 'input')\n }\n const parameters = getArray(config, 'parameters')\n if (!parameters || parameters.length === 0) {\n pushNodeIssue(issues, node, locale, 'node.mustBeArray', 'parameters')\n }\n break\n }\n\n case 'tool':\n if (!hasNonEmptyString(config, 'toolId')) {\n pushNodeIssue(issues, node, locale, 'node.required', 'toolId')\n }\n break\n\n case 'agent_tool':\n if (!hasNonEmptyString(config, 'agentId')) {\n pushNodeIssue(issues, node, locale, 'node.required', 'agentId')\n }\n if (!hasNonEmptyString(config, 'toolId')) {\n pushNodeIssue(issues, node, locale, 'node.required', 'toolId')\n }\n break\n\n case 'knowledge_base':\n if (!hasNonEmptyString(config, 'sourceId')) {\n pushNodeIssue(issues, node, locale, 'node.required', 'sourceId')\n }\n if ('topK' in config && getNumber(config, 'topK') === undefined) {\n pushNodeIssue(issues, node, locale, 'node.mustBeNumber', 'topK')\n }\n if ('similarityThreshold' in config && getNumber(config, 'similarityThreshold') === undefined) {\n pushNodeIssue(issues, node, locale, 'node.mustBeNumber', 'similarityThreshold')\n }\n break\n\n case 'document_extractor': {\n const extractionMode = getString(config, 'extractionMode')\n if (extractionMode && !['text', 'table', 'structured'].includes(extractionMode)) {\n pushNodeIssue(issues, node, locale, 'node.invalidExtractionMode', 'extractionMode')\n }\n break\n }\n\n case 'audio_input':\n if (!hasNonEmptyString(config, 'url')) {\n pushNodeIssue(issues, node, locale, 'node.required', 'url')\n }\n break\n\n case 'speech_transcriber':\n // The responseFormat enum is enforced by the Rust validator at publish\n // time — keeping this arm field-level only to stay in sync with the\n // \"Rust is the single source of truth for runtime checks\" rule.\n if (!hasNonEmptyString(config, 'audioUrl')) {\n pushNodeIssue(issues, node, locale, 'node.required', 'audioUrl')\n }\n break\n\n default:\n pushNodeIssue(issues, node, locale, 'node.unknownType', undefined, { nodeType })\n break\n }\n\n return issues\n}\n\nexport function validateGraphNodeConfigs(graph: WorkflowGraph, options: ValidationOptions = {}): NodeValidationIssue[] {\n return graph.nodes.flatMap((node) => validateNodeConfig(node, options))\n}\n\nexport function validateWorkflowGraph(graph: WorkflowGraph, options: ValidationOptions = {}): ValidationResult {\n const locale = options.locale\n const issues: ValidationIssue[] = []\n const nodeMap = new Map<string, WorkflowNode>()\n\n for (const node of graph.nodes) {\n nodeMap.set(node.id, node)\n }\n\n const agentNodes = graph.nodes.filter((node) => node.type === 'agent')\n if (agentNodes.length === 0) {\n pushIssue(issues, locale, 'graph.noAgents')\n }\n\n for (const edge of graph.edges) {\n if (!nodeMap.has(edge.source)) {\n pushIssue(issues, locale, 'graph.missingSource', { edgeId: edge.id, source: edge.source })\n }\n if (!nodeMap.has(edge.target)) {\n pushIssue(issues, locale, 'graph.missingTarget', { edgeId: edge.id, target: edge.target })\n }\n }\n\n const connectedNodeIds = new Set<string>()\n for (const edge of graph.edges) {\n connectedNodeIds.add(edge.source)\n connectedNodeIds.add(edge.target)\n }\n\n for (const node of graph.nodes) {\n if (node.type === 'note') continue\n if (!connectedNodeIds.has(node.id)) {\n pushIssue(issues, locale, 'graph.orphanNode', {\n label: node.data.label ?? node.id,\n nodeType: node.type,\n })\n }\n }\n\n for (const edge of graph.edges) {\n const sourceNode = nodeMap.get(edge.source)\n const targetNode = nodeMap.get(edge.target)\n if (!sourceNode || !targetNode) continue\n\n if (sourceNode.type === 'tool' && targetNode.type !== 'agent') {\n pushIssue(issues, locale, 'graph.toolToNonAgent', {\n label: sourceNode.data.label ?? sourceNode.id,\n targetType: targetNode.type,\n })\n }\n }\n\n const ruleNodes = graph.nodes.filter((node) => node.type === 'rule')\n for (const ruleNode of ruleNodes) {\n const incomingEdges = graph.edges.filter((edge) => edge.target === ruleNode.id)\n const hasAgentSource = incomingEdges.some((edge) => nodeMap.get(edge.source)?.type === 'agent')\n if (incomingEdges.length === 0 || !hasAgentSource) {\n pushIssue(issues, locale, 'graph.ruleNoAgent', {\n label: ruleNode.data.label ?? ruleNode.id,\n })\n }\n }\n\n if (agentNodes.length > 1) {\n const cycleIssue = detectCycle(agentNodes, graph.edges, nodeMap, locale)\n if (cycleIssue) {\n issues.push(cycleIssue)\n }\n }\n\n const startNodes = graph.nodes.filter((node) => node.type === 'start')\n if (startNodes.length > 1) {\n pushIssue(issues, locale, 'graph.multipleStartNodes')\n }\n\n const endNodes = graph.nodes.filter((node) => node.type === 'end')\n if (endNodes.length > 1) {\n pushIssue(issues, locale, 'graph.multipleEndNodes')\n }\n\n for (const startNode of startNodes) {\n const incomingEdges = graph.edges.filter((edge) => edge.target === startNode.id)\n if (incomingEdges.length > 0) {\n pushIssue(issues, locale, 'graph.startHasIncoming')\n }\n }\n\n for (const endNode of endNodes) {\n const outgoingEdges = graph.edges.filter((edge) => edge.source === endNode.id)\n if (outgoingEdges.length > 0) {\n pushIssue(issues, locale, 'graph.endHasOutgoing')\n }\n }\n\n const iterationNodes = graph.nodes.filter((node) => node.type === 'iteration')\n for (const iterationNode of iterationNodes) {\n const outgoingEdges = graph.edges.filter((edge) => edge.source === iterationNode.id)\n if (outgoingEdges.length === 0) {\n pushIssue(issues, locale, 'graph.iterationNoOutgoing')\n }\n }\n\n const nodeIssues = validateGraphNodeConfigs(graph, options)\n const errors = [\n ...issues.map((issue) => issue.message),\n ...nodeIssues.map((issue) => formatNodeIssue(issue, nodeMap)),\n ]\n\n return {\n valid: errors.length === 0,\n errors,\n issues,\n nodeIssues,\n }\n}\n\nexport function topologicalSortAgents(\n agentNodes: WorkflowNode[],\n edges: WorkflowEdge[],\n nodeMap: Map<string, WorkflowNode>,\n): WorkflowNode[] {\n const adjacency = new Map<string, string[]>()\n const inDegree = new Map<string, number>()\n\n for (const node of agentNodes) {\n adjacency.set(node.id, [])\n inDegree.set(node.id, 0)\n }\n\n for (const edge of edges) {\n const sourceNode = nodeMap.get(edge.source)\n const targetNode = nodeMap.get(edge.target)\n if (!sourceNode || !targetNode) continue\n\n if (sourceNode.type === 'agent' && targetNode.type === 'agent') {\n adjacency.get(edge.source)?.push(edge.target)\n inDegree.set(edge.target, (inDegree.get(edge.target) ?? 0) + 1)\n }\n }\n\n const queue = agentNodes\n .filter((node) => (inDegree.get(node.id) ?? 0) === 0)\n .map((node) => node.id)\n\n const sortedIds: string[] = []\n\n while (queue.length > 0) {\n const nodeId = queue.shift()\n if (!nodeId) break\n sortedIds.push(nodeId)\n\n const neighbors = adjacency.get(nodeId) ?? []\n for (const neighborId of neighbors) {\n const newInDegree = (inDegree.get(neighborId) ?? 1) - 1\n inDegree.set(neighborId, newInDegree)\n if (newInDegree === 0) {\n queue.push(neighborId)\n }\n }\n }\n\n if (sortedIds.length !== agentNodes.length) {\n throw new Error('Cycle detected in agent graph')\n }\n\n return sortedIds.map((nodeId) => nodeMap.get(nodeId)).filter((node): node is WorkflowNode => Boolean(node))\n}\n\nfunction detectCycle(\n agentNodes: WorkflowNode[],\n edges: WorkflowEdge[],\n nodeMap: Map<string, WorkflowNode>,\n locale?: ValidationLocale,\n): ValidationIssue | null {\n try {\n topologicalSortAgents(agentNodes, edges, nodeMap)\n return null\n } catch {\n return {\n code: 'graph.cycleDetected',\n message: template('graph.cycleDetected', undefined, locale),\n }\n }\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkEFOXN3LC_js = require('./chunk-EFOXN3LC.js');
4
+ var chunkNJFRJ6YD_js = require('./chunk-NJFRJ6YD.js');
5
5
  var chunkI2NZGVBG_js = require('./chunk-I2NZGVBG.js');
6
6
  var chunkYXN2K77G_js = require('./chunk-YXN2K77G.js');
7
7
  var react = require('react');
@@ -204,11 +204,11 @@ function RolesPageView({
204
204
  }
205
205
  function WorkflowWorkspace({ graph }) {
206
206
  const locale = chunkYXN2K77G_js.useLocale();
207
- return /* @__PURE__ */ jsxRuntime.jsx(chunkEFOXN3LC_js.Workspace, { initialGraph: graph, locale });
207
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkNJFRJ6YD_js.Workspace, { initialGraph: graph, locale });
208
208
  }
209
209
 
210
210
  exports.RolesPageView = RolesPageView;
211
211
  exports.UsersPageView = UsersPageView;
212
212
  exports.WorkflowWorkspace = WorkflowWorkspace;
213
- //# sourceMappingURL=chunk-SU3YPWFW.js.map
214
- //# sourceMappingURL=chunk-SU3YPWFW.js.map
213
+ //# sourceMappingURL=chunk-MWPTSBAI.js.map
214
+ //# sourceMappingURL=chunk-MWPTSBAI.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/platform/pages/users-page-view.tsx","../src/platform/pages/roles-page-view.tsx","../src/platform/workflow-workspace.tsx"],"names":["useState","jsxs","jsx","HeroSection","UserGroupIcon","CreateActionButton","EntityCard","InlineForm","FormSelect","Button","GlassModal","FormGrid","FormInput","ShieldCheckIcon","useLocale","Workspace"],"mappings":"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","file":"chunk-SU3YPWFW.js","sourcesContent":["import { useState, type FormEvent } from 'react'\nimport { UserGroupIcon } from '@heroicons/react/24/outline'\nimport {\n Button,\n CreateActionButton,\n EntityCard,\n FormGrid,\n FormInput,\n GlassModal,\n FormSelect,\n HeroSection,\n InlineForm,\n} from '@ui/index'\nimport type { UserRole, ManagedUser, UsersPageViewProps } from '@datatechsolutions/shared-domain/common'\n\nconst ROLE_OPTIONS: Array<{ value: UserRole; label: string }> = [\n { value: 'admin', label: 'Admin' },\n { value: 'manager', label: 'Manager' },\n { value: 'analyst', label: 'Analyst' },\n { value: 'viewer', label: 'Viewer' },\n]\n\nexport function UsersPageView({ labels, users, onCreateUser, onUpdateRole }: UsersPageViewProps) {\n const [createOpen, setCreateOpen] = useState(false)\n\n return (\n <div className=\"space-y-4\">\n <HeroSection\n icon={<UserGroupIcon className=\"h-5 w-5\" />}\n label={labels.title}\n title={labels.title}\n subtitle={labels.subtitle}\n gradient=\"from-violet-500 to-indigo-600\"\n toolbar={(\n <CreateActionButton\n mode=\"desktop\"\n label={labels.create}\n onClick={() => setCreateOpen(true)}\n accent=\"violet\"\n />\n )}\n />\n\n <CreateActionButton\n mode=\"mobile\"\n label={labels.create}\n onClick={() => setCreateOpen(true)}\n accent=\"violet\"\n />\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold text-slate-900 dark:text-slate-100\">{labels.list}</h3>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {users.map((user: ManagedUser) => (\n <EntityCard\n key={user.email}\n accentGradient=\"from-violet-500 to-indigo-700\"\n icon={(\n <div className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-violet-500/10 text-violet-600 dark:bg-violet-500/20 dark:text-violet-400\">\n <UserGroupIcon className=\"h-6 w-6\" />\n </div>\n )}\n title={user.name}\n subtitle={user.email}\n status={(\n <span\n className={`shrink-0 rounded-full px-2 py-0.5 text-[10px] font-semibold ${\n user.active\n ? 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-300'\n : 'bg-slate-100 text-slate-700 dark:bg-slate-800 dark:text-slate-300'\n }`}\n >\n {user.active ? labels.statusActive : labels.statusInactive}\n </span>\n )}\n footer={(\n <form\n onSubmit={(event) => {\n event.preventDefault()\n const formData = new FormData(event.currentTarget)\n const role = String(formData.get('role') ?? 'viewer') as UserRole\n onUpdateRole({ email: user.email, role })\n }}\n >\n <InlineForm>\n <FormSelect name=\"role\" options={ROLE_OPTIONS} defaultValue={user.role} />\n <Button type=\"submit\" outline size=\"sm\">{labels.save}</Button>\n </InlineForm>\n </form>\n )}\n />\n ))}\n </div>\n </section>\n\n <GlassModal\n open={createOpen}\n onClose={() => setCreateOpen(false)}\n title={labels.create}\n maxWidth=\"lg\"\n showFormFooter\n cancelLabel={labels.list}\n submitLabel={labels.add}\n onSubmit={(event: FormEvent) => {\n const formData = new FormData(event.currentTarget as HTMLFormElement)\n const name = String(formData.get('name') ?? '').trim()\n const email = String(formData.get('email') ?? '').trim().toLowerCase()\n const role = String(formData.get('role') ?? 'viewer') as UserRole\n if (!name || !email) return\n onCreateUser({ name, email, role })\n setCreateOpen(false)\n }}\n >\n <FormGrid>\n <FormInput name=\"name\" label={labels.name} placeholder={labels.userNamePlaceholder} required />\n <FormInput name=\"email\" label={labels.email} placeholder={labels.userEmailPlaceholder} required type=\"email\" />\n <FormSelect name=\"role\" label={labels.role} options={ROLE_OPTIONS} />\n </FormGrid>\n </GlassModal>\n </div>\n )\n}\n","import { useState, type FormEvent } from 'react'\nimport { ShieldCheckIcon } from '@heroicons/react/24/outline'\nimport {\n CreateActionButton,\n EntityCard,\n FormGrid,\n FormInput,\n GlassModal,\n FormSelect,\n HeroSection,\n} from '@ui/index'\nimport type { UserRole, RolesPageViewProps } from '@datatechsolutions/shared-domain/common'\nimport type { PlatformRoleDefinition } from '../rbac'\n\nexport type RolesPageViewExtraProps = {\n /**\n * App-defined role definitions, e.g. `{ admin: { id, label, description }, ... }`.\n * Each app passes the output of its own `createPlatformRbac()` call.\n */\n roleDefinitions: Record<string, PlatformRoleDefinition<string>>\n /**\n * Display options surfaced in the role-assignment modal select. Each\n * entry is `{ value: roleId, label: localizedLabel }`.\n */\n roleOptions: Array<{ value: string; label: string }>\n}\n\nexport function RolesPageView({\n labels,\n users,\n onAssignRole,\n roleDefinitions,\n roleOptions,\n}: RolesPageViewProps & RolesPageViewExtraProps) {\n const [assignOpen, setAssignOpen] = useState(false)\n\n return (\n <div className=\"space-y-4\">\n <HeroSection\n icon={<ShieldCheckIcon className=\"h-5 w-5\" />}\n label={labels.title}\n title={labels.title}\n subtitle={labels.subtitle}\n gradient=\"from-emerald-500 to-teal-600\"\n toolbar={(\n <CreateActionButton\n mode=\"desktop\"\n label={labels.assign}\n onClick={() => setAssignOpen(true)}\n accent=\"emerald\"\n />\n )}\n />\n\n <CreateActionButton\n mode=\"mobile\"\n label={labels.assign}\n onClick={() => setAssignOpen(true)}\n accent=\"emerald\"\n />\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold text-slate-900 dark:text-slate-100\">{labels.definitions}</h3>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n {Object.values(roleDefinitions).map((role) => (\n <EntityCard\n key={role.id}\n accentGradient=\"from-emerald-500 to-teal-700\"\n icon={(\n <div className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-emerald-500/10 text-emerald-600 dark:bg-emerald-500/20 dark:text-emerald-400\">\n <ShieldCheckIcon className=\"h-6 w-6\" />\n </div>\n )}\n title={role.label}\n subtitle={role.id}\n >\n <p className=\"text-xs text-slate-500 dark:text-slate-400\">{role.description}</p>\n <p className=\"mt-2 text-xs font-medium text-slate-600 dark:text-slate-300\">\n {labels.permissionsEnabled}\n </p>\n </EntityCard>\n ))}\n </div>\n </section>\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold text-slate-900 dark:text-slate-100\">{labels.current}</h3>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {users.map((user) => (\n <EntityCard\n key={user.email}\n accentGradient=\"from-violet-500 to-indigo-700\"\n icon={(\n <div className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-violet-500/10 text-violet-600 dark:bg-violet-500/20 dark:text-violet-400\">\n <ShieldCheckIcon className=\"h-6 w-6\" />\n </div>\n )}\n title={user.name}\n subtitle={user.email}\n status={(\n <span className=\"shrink-0 rounded-full bg-violet-100 px-2 py-0.5 text-[10px] font-semibold text-violet-700 dark:bg-violet-900/30 dark:text-violet-300\">\n {user.role}\n </span>\n )}\n />\n ))}\n </div>\n </section>\n\n <GlassModal\n open={assignOpen}\n onClose={() => setAssignOpen(false)}\n title={labels.assign}\n maxWidth=\"lg\"\n showFormFooter\n cancelLabel={labels.current}\n submitLabel={labels.apply}\n onSubmit={(event: FormEvent) => {\n const formData = new FormData(event.currentTarget as HTMLFormElement)\n const email = String(formData.get('email') ?? '').trim().toLowerCase()\n const role = String(formData.get('role') ?? 'viewer') as UserRole\n if (!email) return\n onAssignRole({ email, role })\n setAssignOpen(false)\n }}\n >\n <FormGrid>\n <FormInput name=\"email\" label={labels.userEmail} placeholder=\"user@company.com\" required />\n <FormSelect name=\"role\" label={labels.role} options={roleOptions} />\n </FormGrid>\n </GlassModal>\n </div>\n )\n}\n","import { Workspace } from '@ui/astrlabe/workflow-canvas'\nimport type { WorkflowGraph as UiWorkflowGraph } from '@ui/astrlabe/contracts'\nimport type { WorkflowWorkspaceProps } from '@datatechsolutions/shared-domain/common'\nimport { useLocale } from '@ui/lib/i18n-context'\n\n/**\n * Thin wrapper that forwards a workflow graph into the visual canvas while\n * threading the active locale from the i18n context. The graph type from\n * `shared-domain` is structurally identical to ui's contract type — the\n * cast keeps callers from having to import both.\n */\nexport function WorkflowWorkspace({ graph }: WorkflowWorkspaceProps) {\n const locale = useLocale()\n return <Workspace initialGraph={graph as unknown as UiWorkflowGraph} locale={locale} />\n}\n"]}
1
+ {"version":3,"sources":["../src/platform/pages/users-page-view.tsx","../src/platform/pages/roles-page-view.tsx","../src/platform/workflow-workspace.tsx"],"names":["useState","jsxs","jsx","HeroSection","UserGroupIcon","CreateActionButton","EntityCard","InlineForm","FormSelect","Button","GlassModal","FormGrid","FormInput","ShieldCheckIcon","useLocale","Workspace"],"mappings":"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","file":"chunk-MWPTSBAI.js","sourcesContent":["import { useState, type FormEvent } from 'react'\nimport { UserGroupIcon } from '@heroicons/react/24/outline'\nimport {\n Button,\n CreateActionButton,\n EntityCard,\n FormGrid,\n FormInput,\n GlassModal,\n FormSelect,\n HeroSection,\n InlineForm,\n} from '@ui/index'\nimport type { UserRole, ManagedUser, UsersPageViewProps } from '@datatechsolutions/shared-domain/common'\n\nconst ROLE_OPTIONS: Array<{ value: UserRole; label: string }> = [\n { value: 'admin', label: 'Admin' },\n { value: 'manager', label: 'Manager' },\n { value: 'analyst', label: 'Analyst' },\n { value: 'viewer', label: 'Viewer' },\n]\n\nexport function UsersPageView({ labels, users, onCreateUser, onUpdateRole }: UsersPageViewProps) {\n const [createOpen, setCreateOpen] = useState(false)\n\n return (\n <div className=\"space-y-4\">\n <HeroSection\n icon={<UserGroupIcon className=\"h-5 w-5\" />}\n label={labels.title}\n title={labels.title}\n subtitle={labels.subtitle}\n gradient=\"from-violet-500 to-indigo-600\"\n toolbar={(\n <CreateActionButton\n mode=\"desktop\"\n label={labels.create}\n onClick={() => setCreateOpen(true)}\n accent=\"violet\"\n />\n )}\n />\n\n <CreateActionButton\n mode=\"mobile\"\n label={labels.create}\n onClick={() => setCreateOpen(true)}\n accent=\"violet\"\n />\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold text-slate-900 dark:text-slate-100\">{labels.list}</h3>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {users.map((user: ManagedUser) => (\n <EntityCard\n key={user.email}\n accentGradient=\"from-violet-500 to-indigo-700\"\n icon={(\n <div className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-violet-500/10 text-violet-600 dark:bg-violet-500/20 dark:text-violet-400\">\n <UserGroupIcon className=\"h-6 w-6\" />\n </div>\n )}\n title={user.name}\n subtitle={user.email}\n status={(\n <span\n className={`shrink-0 rounded-full px-2 py-0.5 text-[10px] font-semibold ${\n user.active\n ? 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-300'\n : 'bg-slate-100 text-slate-700 dark:bg-slate-800 dark:text-slate-300'\n }`}\n >\n {user.active ? labels.statusActive : labels.statusInactive}\n </span>\n )}\n footer={(\n <form\n onSubmit={(event) => {\n event.preventDefault()\n const formData = new FormData(event.currentTarget)\n const role = String(formData.get('role') ?? 'viewer') as UserRole\n onUpdateRole({ email: user.email, role })\n }}\n >\n <InlineForm>\n <FormSelect name=\"role\" options={ROLE_OPTIONS} defaultValue={user.role} />\n <Button type=\"submit\" outline size=\"sm\">{labels.save}</Button>\n </InlineForm>\n </form>\n )}\n />\n ))}\n </div>\n </section>\n\n <GlassModal\n open={createOpen}\n onClose={() => setCreateOpen(false)}\n title={labels.create}\n maxWidth=\"lg\"\n showFormFooter\n cancelLabel={labels.list}\n submitLabel={labels.add}\n onSubmit={(event: FormEvent) => {\n const formData = new FormData(event.currentTarget as HTMLFormElement)\n const name = String(formData.get('name') ?? '').trim()\n const email = String(formData.get('email') ?? '').trim().toLowerCase()\n const role = String(formData.get('role') ?? 'viewer') as UserRole\n if (!name || !email) return\n onCreateUser({ name, email, role })\n setCreateOpen(false)\n }}\n >\n <FormGrid>\n <FormInput name=\"name\" label={labels.name} placeholder={labels.userNamePlaceholder} required />\n <FormInput name=\"email\" label={labels.email} placeholder={labels.userEmailPlaceholder} required type=\"email\" />\n <FormSelect name=\"role\" label={labels.role} options={ROLE_OPTIONS} />\n </FormGrid>\n </GlassModal>\n </div>\n )\n}\n","import { useState, type FormEvent } from 'react'\nimport { ShieldCheckIcon } from '@heroicons/react/24/outline'\nimport {\n CreateActionButton,\n EntityCard,\n FormGrid,\n FormInput,\n GlassModal,\n FormSelect,\n HeroSection,\n} from '@ui/index'\nimport type { UserRole, RolesPageViewProps } from '@datatechsolutions/shared-domain/common'\nimport type { PlatformRoleDefinition } from '../rbac'\n\nexport type RolesPageViewExtraProps = {\n /**\n * App-defined role definitions, e.g. `{ admin: { id, label, description }, ... }`.\n * Each app passes the output of its own `createPlatformRbac()` call.\n */\n roleDefinitions: Record<string, PlatformRoleDefinition<string>>\n /**\n * Display options surfaced in the role-assignment modal select. Each\n * entry is `{ value: roleId, label: localizedLabel }`.\n */\n roleOptions: Array<{ value: string; label: string }>\n}\n\nexport function RolesPageView({\n labels,\n users,\n onAssignRole,\n roleDefinitions,\n roleOptions,\n}: RolesPageViewProps & RolesPageViewExtraProps) {\n const [assignOpen, setAssignOpen] = useState(false)\n\n return (\n <div className=\"space-y-4\">\n <HeroSection\n icon={<ShieldCheckIcon className=\"h-5 w-5\" />}\n label={labels.title}\n title={labels.title}\n subtitle={labels.subtitle}\n gradient=\"from-emerald-500 to-teal-600\"\n toolbar={(\n <CreateActionButton\n mode=\"desktop\"\n label={labels.assign}\n onClick={() => setAssignOpen(true)}\n accent=\"emerald\"\n />\n )}\n />\n\n <CreateActionButton\n mode=\"mobile\"\n label={labels.assign}\n onClick={() => setAssignOpen(true)}\n accent=\"emerald\"\n />\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold text-slate-900 dark:text-slate-100\">{labels.definitions}</h3>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n {Object.values(roleDefinitions).map((role) => (\n <EntityCard\n key={role.id}\n accentGradient=\"from-emerald-500 to-teal-700\"\n icon={(\n <div className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-emerald-500/10 text-emerald-600 dark:bg-emerald-500/20 dark:text-emerald-400\">\n <ShieldCheckIcon className=\"h-6 w-6\" />\n </div>\n )}\n title={role.label}\n subtitle={role.id}\n >\n <p className=\"text-xs text-slate-500 dark:text-slate-400\">{role.description}</p>\n <p className=\"mt-2 text-xs font-medium text-slate-600 dark:text-slate-300\">\n {labels.permissionsEnabled}\n </p>\n </EntityCard>\n ))}\n </div>\n </section>\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold text-slate-900 dark:text-slate-100\">{labels.current}</h3>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {users.map((user) => (\n <EntityCard\n key={user.email}\n accentGradient=\"from-violet-500 to-indigo-700\"\n icon={(\n <div className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-violet-500/10 text-violet-600 dark:bg-violet-500/20 dark:text-violet-400\">\n <ShieldCheckIcon className=\"h-6 w-6\" />\n </div>\n )}\n title={user.name}\n subtitle={user.email}\n status={(\n <span className=\"shrink-0 rounded-full bg-violet-100 px-2 py-0.5 text-[10px] font-semibold text-violet-700 dark:bg-violet-900/30 dark:text-violet-300\">\n {user.role}\n </span>\n )}\n />\n ))}\n </div>\n </section>\n\n <GlassModal\n open={assignOpen}\n onClose={() => setAssignOpen(false)}\n title={labels.assign}\n maxWidth=\"lg\"\n showFormFooter\n cancelLabel={labels.current}\n submitLabel={labels.apply}\n onSubmit={(event: FormEvent) => {\n const formData = new FormData(event.currentTarget as HTMLFormElement)\n const email = String(formData.get('email') ?? '').trim().toLowerCase()\n const role = String(formData.get('role') ?? 'viewer') as UserRole\n if (!email) return\n onAssignRole({ email, role })\n setAssignOpen(false)\n }}\n >\n <FormGrid>\n <FormInput name=\"email\" label={labels.userEmail} placeholder=\"user@company.com\" required />\n <FormSelect name=\"role\" label={labels.role} options={roleOptions} />\n </FormGrid>\n </GlassModal>\n </div>\n )\n}\n","import { Workspace } from '@ui/astrlabe/workflow-canvas'\nimport type { WorkflowGraph as UiWorkflowGraph } from '@ui/astrlabe/contracts'\nimport type { WorkflowWorkspaceProps } from '@datatechsolutions/shared-domain/common'\nimport { useLocale } from '@ui/lib/i18n-context'\n\n/**\n * Thin wrapper that forwards a workflow graph into the visual canvas while\n * threading the active locale from the i18n context. The graph type from\n * `shared-domain` is structurally identical to ui's contract type — the\n * cast keeps callers from having to import both.\n */\nexport function WorkflowWorkspace({ graph }: WorkflowWorkspaceProps) {\n const locale = useLocale()\n return <Workspace initialGraph={graph as unknown as UiWorkflowGraph} locale={locale} />\n}\n"]}