@datatechsolutions/ui 2.11.92 → 2.11.93
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -58
- package/dist/astrlabe/contracts.d.mts +14 -3
- package/dist/astrlabe/contracts.d.ts +14 -3
- package/dist/astrlabe/index.d.mts +9 -3
- package/dist/astrlabe/index.d.ts +9 -3
- package/dist/astrlabe/index.js +118 -114
- package/dist/astrlabe/index.mjs +4 -4
- package/dist/astrlabe/utils.d.mts +1 -1
- package/dist/astrlabe/utils.d.ts +1 -1
- package/dist/astrlabe/utils.js +9 -9
- package/dist/astrlabe/utils.mjs +2 -2
- package/dist/astrlabe/workflow-canvas.d.mts +1 -1
- package/dist/astrlabe/workflow-canvas.d.ts +1 -1
- package/dist/astrlabe/workflow-canvas.js +3 -3
- package/dist/astrlabe/workflow-canvas.mjs +2 -2
- package/dist/{chunk-FUVJHNNI.js → chunk-3Z366CVM.js} +29 -29
- package/dist/{chunk-FUVJHNNI.js.map → chunk-3Z366CVM.js.map} +1 -1
- package/dist/{chunk-WNCPAWLC.mjs → chunk-5W7L7BT7.mjs} +13 -2
- package/dist/chunk-5W7L7BT7.mjs.map +1 -0
- package/dist/{chunk-C7BI5LQ6.js → chunk-C3H4FM4A.js} +13 -2
- package/dist/chunk-C3H4FM4A.js.map +1 -0
- package/dist/{chunk-SFVSDGNF.js → chunk-FZTOP6EE.js} +113 -55
- package/dist/chunk-FZTOP6EE.js.map +1 -0
- package/dist/{chunk-WI663467.mjs → chunk-GMZ3PTNK.mjs} +5 -5
- package/dist/{chunk-WI663467.mjs.map → chunk-GMZ3PTNK.mjs.map} +1 -1
- package/dist/{chunk-3PKG4KFY.mjs → chunk-HUGHELRM.mjs} +64 -7
- package/dist/chunk-HUGHELRM.mjs.map +1 -0
- package/dist/{chunk-5UU3RQRB.js → chunk-NJS2YC3J.js} +15 -2
- package/dist/chunk-NJS2YC3J.js.map +1 -0
- package/dist/{chunk-XXYDLYIT.js → chunk-NYQAEPC7.js} +138 -12
- package/dist/chunk-NYQAEPC7.js.map +1 -0
- package/dist/{chunk-RELMVNNR.mjs → chunk-OLXOBT42.mjs} +3 -3
- package/dist/{chunk-RELMVNNR.mjs.map → chunk-OLXOBT42.mjs.map} +1 -1
- package/dist/{chunk-MZAS6TG4.mjs → chunk-RXFAQFE7.mjs} +3 -3
- package/dist/{chunk-MZAS6TG4.mjs.map → chunk-RXFAQFE7.mjs.map} +1 -1
- package/dist/{chunk-DADFESAQ.js → chunk-SMKN4ZVB.js} +4 -4
- package/dist/{chunk-DADFESAQ.js.map → chunk-SMKN4ZVB.js.map} +1 -1
- package/dist/{chunk-TBPWMPZU.js → chunk-ST3GH5OM.js} +4 -4
- package/dist/{chunk-TBPWMPZU.js.map → chunk-ST3GH5OM.js.map} +1 -1
- package/dist/{chunk-3SUFSAP6.mjs → chunk-TEQYIK2B.mjs} +125 -7
- package/dist/chunk-TEQYIK2B.mjs.map +1 -0
- package/dist/{chunk-53SRKVKQ.mjs → chunk-U7XM3N7F.mjs} +15 -2
- package/dist/chunk-U7XM3N7F.mjs.map +1 -0
- package/dist/{index-AioB90qq.d.mts → index-CoB18TbG.d.ts} +9 -2
- package/dist/{index-D5ai0cGZ.d.ts → index-VI9gyJXl.d.mts} +9 -2
- package/dist/platform/agents-workspace.js +6 -6
- package/dist/platform/agents-workspace.mjs +5 -5
- package/dist/platform/index.d.mts +1 -1
- package/dist/platform/index.d.ts +1 -1
- package/dist/platform/index.js +17 -17
- package/dist/platform/index.mjs +8 -8
- package/dist/platform/pages/index.d.mts +3 -3
- package/dist/platform/pages/index.d.ts +3 -3
- package/dist/platform/pages/index.js +12 -12
- package/dist/platform/pages/index.mjs +6 -6
- package/dist/platform/workflow-api-client.d.mts +2 -2
- package/dist/platform/workflow-api-client.d.ts +2 -2
- package/dist/platform/workflow-canvas-shell.js +4 -4
- package/dist/platform/workflow-canvas-shell.mjs +3 -3
- package/dist/{workflow-api-client-zVtc8FIl.d.ts → workflow-api-client-DVLhcpUj.d.ts} +1 -1
- package/dist/{workflow-api-client-wLoap-tt.d.mts → workflow-api-client-DpBxHTHr.d.mts} +1 -1
- package/package.json +1 -1
- package/dist/chunk-3PKG4KFY.mjs.map +0 -1
- package/dist/chunk-3SUFSAP6.mjs.map +0 -1
- package/dist/chunk-53SRKVKQ.mjs.map +0 -1
- package/dist/chunk-5UU3RQRB.js.map +0 -1
- package/dist/chunk-C7BI5LQ6.js.map +0 -1
- package/dist/chunk-SFVSDGNF.js.map +0 -1
- package/dist/chunk-WNCPAWLC.mjs.map +0 -1
- package/dist/chunk-XXYDLYIT.js.map +0 -1
|
@@ -30,6 +30,7 @@ var EN_MESSAGES = {
|
|
|
30
30
|
"node.providerIdentityRequired": "must set `connectionId`, `modelId`, or inline `provider` + `model`",
|
|
31
31
|
"node.inputOrInstructionsRequired": "is required (or `instructions`)",
|
|
32
32
|
"node.invalidExtractionMode": "must be one of: text | table | structured",
|
|
33
|
+
"node.s3WriteSourceOrBodyRequired": "Either Source URL or Body must be provided",
|
|
33
34
|
"node.unknownType": "unknown node type `{nodeType}`"
|
|
34
35
|
};
|
|
35
36
|
var PT_BR_MESSAGES = {
|
|
@@ -60,6 +61,7 @@ var PT_BR_MESSAGES = {
|
|
|
60
61
|
"node.providerIdentityRequired": "deve definir `connectionId`, `modelId` ou `provider` + `model` inline",
|
|
61
62
|
"node.inputOrInstructionsRequired": "\xE9 obrigat\xF3rio (ou `instructions`)",
|
|
62
63
|
"node.invalidExtractionMode": "deve ser um de: text | table | structured",
|
|
64
|
+
"node.s3WriteSourceOrBodyRequired": "Forne\xE7a Source URL ou Body",
|
|
63
65
|
"node.unknownType": "tipo de n\xF3 desconhecido `{nodeType}`"
|
|
64
66
|
};
|
|
65
67
|
var MESSAGE_CATALOG = {
|
|
@@ -320,6 +322,17 @@ function validateNodeConfig(node, options = {}) {
|
|
|
320
322
|
}
|
|
321
323
|
break;
|
|
322
324
|
}
|
|
325
|
+
case "s3_write": {
|
|
326
|
+
if (!hasNonEmptyString(config, "key")) {
|
|
327
|
+
pushNodeIssue(issues, node, locale, "node.required", "key");
|
|
328
|
+
}
|
|
329
|
+
const hasSource = hasNonEmptyString(config, "sourceUrl");
|
|
330
|
+
const hasBody = hasNonEmptyString(config, "body");
|
|
331
|
+
if (!hasSource && !hasBody) {
|
|
332
|
+
pushNodeIssue(issues, node, locale, "node.s3WriteSourceOrBodyRequired", "sourceUrl");
|
|
333
|
+
}
|
|
334
|
+
break;
|
|
335
|
+
}
|
|
323
336
|
case "rule":
|
|
324
337
|
break;
|
|
325
338
|
case "agent":
|
|
@@ -543,5 +556,5 @@ exports.topologicalSortAgents = topologicalSortAgents;
|
|
|
543
556
|
exports.validateGraphNodeConfigs = validateGraphNodeConfigs;
|
|
544
557
|
exports.validateNodeConfig = validateNodeConfig;
|
|
545
558
|
exports.validateWorkflowGraph = validateWorkflowGraph;
|
|
546
|
-
//# sourceMappingURL=chunk-
|
|
547
|
-
//# sourceMappingURL=chunk-
|
|
559
|
+
//# sourceMappingURL=chunk-NJS2YC3J.js.map
|
|
560
|
+
//# sourceMappingURL=chunk-NJS2YC3J.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/astrlabe/utils/workflow-validator.ts"],"names":[],"mappings":"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","file":"chunk-NJS2YC3J.js","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 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"]}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
var chunkZKUYNCAG_js = require('./chunk-ZKUYNCAG.js');
|
|
5
5
|
var chunkYXN2K77G_js = require('./chunk-YXN2K77G.js');
|
|
6
6
|
var chunkP4YYEM4B_js = require('./chunk-P4YYEM4B.js');
|
|
7
|
-
var
|
|
7
|
+
var chunkC3H4FM4A_js = require('./chunk-C3H4FM4A.js');
|
|
8
8
|
var react = require('react');
|
|
9
9
|
var react$1 = require('@xyflow/react');
|
|
10
10
|
require('@xyflow/react/dist/style.css');
|
|
@@ -355,6 +355,7 @@ var LOGIC_NODE_GRADIENTS = {
|
|
|
355
355
|
if_else: "from-amber-400 to-orange-500",
|
|
356
356
|
code: "from-cyan-400 to-sky-500",
|
|
357
357
|
http_request: "from-orange-400 to-amber-500",
|
|
358
|
+
s3_write: "from-cyan-400 to-cyan-500",
|
|
358
359
|
template_transform: "from-pink-400 to-rose-500",
|
|
359
360
|
iteration: "from-indigo-400 to-violet-500",
|
|
360
361
|
knowledge_base: "from-emerald-400 to-teal-500",
|
|
@@ -379,6 +380,7 @@ var LOGIC_NODE_BADGE_COLORS = {
|
|
|
379
380
|
if_else: "bg-amber-100 text-amber-700 dark:bg-amber-500/20 dark:text-amber-300",
|
|
380
381
|
code: "bg-cyan-100 text-cyan-700 dark:bg-cyan-500/20 dark:text-cyan-300",
|
|
381
382
|
http_request: "bg-orange-100 text-orange-700 dark:bg-orange-500/20 dark:text-orange-300",
|
|
383
|
+
s3_write: "bg-cyan-100 text-cyan-700 dark:bg-cyan-500/20 dark:text-cyan-300",
|
|
382
384
|
template_transform: "bg-pink-100 text-pink-700 dark:bg-pink-500/20 dark:text-pink-300",
|
|
383
385
|
iteration: "bg-indigo-100 text-indigo-700 dark:bg-indigo-500/20 dark:text-indigo-300",
|
|
384
386
|
knowledge_base: "bg-emerald-100 text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-300",
|
|
@@ -403,6 +405,7 @@ var LOGIC_NODE_BADGE_SOFT_COLORS = {
|
|
|
403
405
|
if_else: "bg-amber-50 text-amber-600 dark:bg-amber-500/20 dark:text-amber-400",
|
|
404
406
|
code: "bg-cyan-50 text-cyan-600 dark:bg-cyan-500/20 dark:text-cyan-400",
|
|
405
407
|
http_request: "bg-orange-50 text-orange-600 dark:bg-orange-500/20 dark:text-orange-400",
|
|
408
|
+
s3_write: "bg-cyan-50 text-cyan-600 dark:bg-cyan-500/20 dark:text-cyan-400",
|
|
406
409
|
template_transform: "bg-pink-50 text-pink-600 dark:bg-pink-500/20 dark:text-pink-400",
|
|
407
410
|
iteration: "bg-indigo-50 text-indigo-600 dark:bg-indigo-500/20 dark:text-indigo-400",
|
|
408
411
|
knowledge_base: "bg-emerald-50 text-emerald-600 dark:bg-emerald-500/20 dark:text-emerald-400",
|
|
@@ -427,6 +430,7 @@ var LOGIC_ICON_MAP = {
|
|
|
427
430
|
if_else: outline.ArrowsPointingOutIcon,
|
|
428
431
|
code: outline.CodeBracketIcon,
|
|
429
432
|
http_request: outline.GlobeAltIcon,
|
|
433
|
+
s3_write: outline.CloudArrowUpIcon,
|
|
430
434
|
template_transform: outline.DocumentTextIcon,
|
|
431
435
|
iteration: outline.ArrowPathIcon,
|
|
432
436
|
knowledge_base: outline.BookOpenIcon,
|
|
@@ -465,6 +469,7 @@ var NODE_BORDER_COLORS = {
|
|
|
465
469
|
if_else: "border-amber-300/50 dark:border-amber-600/50",
|
|
466
470
|
code: "border-cyan-300/50 dark:border-cyan-600/50",
|
|
467
471
|
http_request: "border-orange-300/50 dark:border-orange-600/50",
|
|
472
|
+
s3_write: "border-cyan-300/50 dark:border-cyan-600/50",
|
|
468
473
|
template_transform: "border-pink-300/50 dark:border-pink-600/50",
|
|
469
474
|
iteration: "border-indigo-300/50 dark:border-indigo-600/50",
|
|
470
475
|
iteration_start: "border-indigo-300/50 dark:border-indigo-600/50",
|
|
@@ -495,6 +500,7 @@ var MINIMAP_NODE_COLORS = {
|
|
|
495
500
|
if_else: "#f59e0b",
|
|
496
501
|
code: "#06b6d4",
|
|
497
502
|
http_request: "#f97316",
|
|
503
|
+
s3_write: "#06b6d4",
|
|
498
504
|
template_transform: "#ec4899",
|
|
499
505
|
iteration: "#818cf8",
|
|
500
506
|
knowledge_base: "#10b981",
|
|
@@ -536,6 +542,7 @@ var LOGIC_NODE_HANDLE_COLORS = {
|
|
|
536
542
|
if_else: "!bg-amber-500",
|
|
537
543
|
code: "!bg-cyan-500",
|
|
538
544
|
http_request: "!bg-orange-500",
|
|
545
|
+
s3_write: "!bg-cyan-500",
|
|
539
546
|
template_transform: "!bg-pink-500",
|
|
540
547
|
iteration: "!bg-indigo-500",
|
|
541
548
|
knowledge_base: "!bg-emerald-500",
|
|
@@ -2099,7 +2106,7 @@ var AgentFlowNode = react.memo(function AgentFlowNode2({ id, data, selected }) {
|
|
|
2099
2106
|
/* @__PURE__ */ jsxRuntime.jsx(NodeCardMeta, { compact: isCompact, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-1.5", children: [
|
|
2100
2107
|
/* @__PURE__ */ jsxRuntime.jsx(NodeCardBadge, { className: "rounded-full bg-indigo-100 px-2 py-0.5 text-[10px] font-semibold text-indigo-700 dark:bg-indigo-500/20 dark:text-indigo-300", children: "Agent" }),
|
|
2101
2108
|
(() => {
|
|
2102
|
-
const tier =
|
|
2109
|
+
const tier = chunkC3H4FM4A_js.getAgentTier(Number(data.agent.elo ?? 0));
|
|
2103
2110
|
return /* @__PURE__ */ jsxRuntime.jsx(NodeCardBadge, { className: `rounded-full px-2 py-0.5 text-[10px] font-bold ${tier.pillColor}`, children: tier.key });
|
|
2104
2111
|
})(),
|
|
2105
2112
|
/* @__PURE__ */ jsxRuntime.jsxs(NodeCardBadge, { className: `inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[10px] font-medium ${frameworkMeta.badgeColor}`, children: [
|
|
@@ -4569,6 +4576,112 @@ function HttpRequestNodeConfigForm({ config, onSave, onCancel }) {
|
|
|
4569
4576
|
)
|
|
4570
4577
|
] });
|
|
4571
4578
|
}
|
|
4579
|
+
function S3WriteNodeConfigForm({ config, onSave, onCancel }) {
|
|
4580
|
+
const t = chunkYXN2K77G_js.useTranslations("agents.workflow.s3WriteNodeConfig");
|
|
4581
|
+
const [bucket, setBucket] = react.useState(config.bucket ?? "");
|
|
4582
|
+
const [key, setKey] = react.useState(config.key ?? "");
|
|
4583
|
+
const [sourceUrl, setSourceUrl] = react.useState(config.sourceUrl ?? "");
|
|
4584
|
+
const [body, setBody] = react.useState(config.body ?? "");
|
|
4585
|
+
const [contentType, setContentType] = react.useState(config.contentType ?? "");
|
|
4586
|
+
const [timeoutMs, setTimeoutMs] = react.useState(config.timeoutMs ?? 3e5);
|
|
4587
|
+
const [connectionId, setConnectionId] = react.useState(config.connectionId ?? "");
|
|
4588
|
+
const handleSave = () => {
|
|
4589
|
+
onSave({
|
|
4590
|
+
...config,
|
|
4591
|
+
bucket,
|
|
4592
|
+
key,
|
|
4593
|
+
sourceUrl,
|
|
4594
|
+
body,
|
|
4595
|
+
contentType,
|
|
4596
|
+
timeoutMs,
|
|
4597
|
+
connectionId
|
|
4598
|
+
});
|
|
4599
|
+
};
|
|
4600
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
|
|
4601
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4602
|
+
chunkZKUYNCAG_js.FormInput,
|
|
4603
|
+
{
|
|
4604
|
+
type: "text",
|
|
4605
|
+
label: t("bucketLabel"),
|
|
4606
|
+
value: bucket,
|
|
4607
|
+
onValueChange: setBucket,
|
|
4608
|
+
placeholder: t("bucketPlaceholder")
|
|
4609
|
+
}
|
|
4610
|
+
),
|
|
4611
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4612
|
+
chunkZKUYNCAG_js.FormInput,
|
|
4613
|
+
{
|
|
4614
|
+
type: "text",
|
|
4615
|
+
label: t("keyLabel"),
|
|
4616
|
+
value: key,
|
|
4617
|
+
onValueChange: setKey,
|
|
4618
|
+
placeholder: t("keyPlaceholder")
|
|
4619
|
+
}
|
|
4620
|
+
),
|
|
4621
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-lg border border-cyan-200/40 bg-cyan-50/40 px-3 py-2 text-[11px] text-cyan-900 dark:border-cyan-500/30 dark:bg-cyan-500/10 dark:text-cyan-100", children: t("sourceOrBodyHint") }),
|
|
4622
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4623
|
+
chunkZKUYNCAG_js.FormInput,
|
|
4624
|
+
{
|
|
4625
|
+
type: "text",
|
|
4626
|
+
label: t("sourceUrlLabel"),
|
|
4627
|
+
value: sourceUrl,
|
|
4628
|
+
onValueChange: setSourceUrl,
|
|
4629
|
+
placeholder: t("sourceUrlPlaceholder")
|
|
4630
|
+
}
|
|
4631
|
+
),
|
|
4632
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4633
|
+
chunkZKUYNCAG_js.FormTextarea,
|
|
4634
|
+
{
|
|
4635
|
+
label: t("bodyLabel"),
|
|
4636
|
+
value: body,
|
|
4637
|
+
onValueChange: setBody,
|
|
4638
|
+
placeholder: t("bodyPlaceholder"),
|
|
4639
|
+
rows: 5,
|
|
4640
|
+
className: "font-mono text-xs"
|
|
4641
|
+
}
|
|
4642
|
+
),
|
|
4643
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4644
|
+
chunkZKUYNCAG_js.FormInput,
|
|
4645
|
+
{
|
|
4646
|
+
type: "text",
|
|
4647
|
+
label: t("contentTypeLabel"),
|
|
4648
|
+
value: contentType,
|
|
4649
|
+
onValueChange: setContentType,
|
|
4650
|
+
placeholder: "application/json"
|
|
4651
|
+
}
|
|
4652
|
+
),
|
|
4653
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4654
|
+
chunkZKUYNCAG_js.FormInput,
|
|
4655
|
+
{
|
|
4656
|
+
type: "number",
|
|
4657
|
+
label: t("timeoutLabel"),
|
|
4658
|
+
value: String(timeoutMs),
|
|
4659
|
+
onValueChange: (value) => setTimeoutMs(Number(value)),
|
|
4660
|
+
min: 1e3,
|
|
4661
|
+
step: 1e3
|
|
4662
|
+
}
|
|
4663
|
+
),
|
|
4664
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4665
|
+
chunkZKUYNCAG_js.FormInput,
|
|
4666
|
+
{
|
|
4667
|
+
type: "text",
|
|
4668
|
+
label: t("connectionIdLabel"),
|
|
4669
|
+
value: connectionId,
|
|
4670
|
+
onValueChange: setConnectionId,
|
|
4671
|
+
placeholder: t("connectionIdHelp")
|
|
4672
|
+
}
|
|
4673
|
+
),
|
|
4674
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4675
|
+
ConfigFormActions,
|
|
4676
|
+
{
|
|
4677
|
+
cancelLabel: t("cancel"),
|
|
4678
|
+
saveLabel: t("save"),
|
|
4679
|
+
onCancel,
|
|
4680
|
+
onSave: handleSave
|
|
4681
|
+
}
|
|
4682
|
+
)
|
|
4683
|
+
] });
|
|
4684
|
+
}
|
|
4572
4685
|
function TemplateTransformNodeConfigForm({ config, onSave, onCancel }) {
|
|
4573
4686
|
const t = chunkYXN2K77G_js.useTranslations("agents.workflow.templateTransformNodeConfig");
|
|
4574
4687
|
const [template, setTemplate] = react.useState(config.template);
|
|
@@ -6148,6 +6261,7 @@ var NODE_TITLE_KEYS = {
|
|
|
6148
6261
|
if_else: "ifElseNodeConfig",
|
|
6149
6262
|
code: "codeNodeConfig",
|
|
6150
6263
|
http_request: "httpRequestNodeConfig",
|
|
6264
|
+
s3_write: "s3WriteNodeConfig",
|
|
6151
6265
|
template_transform: "templateTransformNodeConfig",
|
|
6152
6266
|
iteration: "iterationNodeConfig",
|
|
6153
6267
|
knowledge_base: "knowledgeBaseNodeConfig",
|
|
@@ -6196,6 +6310,8 @@ function LogicNodeModal({ onSave, entities = [], datasources = [], onLoadTables,
|
|
|
6196
6310
|
return /* @__PURE__ */ jsxRuntime.jsx(CodeNodeConfigForm, { config, onSave: handleSave, onCancel: closeModal });
|
|
6197
6311
|
case "http_request":
|
|
6198
6312
|
return /* @__PURE__ */ jsxRuntime.jsx(HttpRequestNodeConfigForm, { config, onSave: handleSave, onCancel: closeModal });
|
|
6313
|
+
case "s3_write":
|
|
6314
|
+
return /* @__PURE__ */ jsxRuntime.jsx(S3WriteNodeConfigForm, { config, onSave: handleSave, onCancel: closeModal });
|
|
6199
6315
|
case "template_transform":
|
|
6200
6316
|
return /* @__PURE__ */ jsxRuntime.jsx(TemplateTransformNodeConfigForm, { config, onSave: handleSave, onCancel: closeModal });
|
|
6201
6317
|
case "iteration":
|
|
@@ -6249,8 +6365,10 @@ function LogicNodeModal({ onSave, entities = [], datasources = [], onLoadTables,
|
|
|
6249
6365
|
isExperimental && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-4 flex items-start gap-2 rounded-lg border border-amber-300/40 bg-amber-50/70 px-3 py-2 text-xs text-amber-900 dark:border-amber-500/30 dark:bg-amber-500/10 dark:text-amber-100", children: [
|
|
6250
6366
|
/* @__PURE__ */ jsxRuntime.jsx(outline.BeakerIcon, { className: "mt-0.5 h-4 w-4 shrink-0 text-amber-600 dark:text-amber-300", "aria-hidden": "true" }),
|
|
6251
6367
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1", children: [
|
|
6252
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "font-semibold", children: t("experimentalNode") }),
|
|
6253
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-amber-800/90 dark:text-amber-100/80", children: t("experimentalNodeWarning"
|
|
6368
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "font-semibold", children: t("experimentalNode", { _: "Experimental node" }) }),
|
|
6369
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-amber-800/90 dark:text-amber-100/80", children: t("experimentalNodeWarning", {
|
|
6370
|
+
_: "This node's executor is a stub today. The configuration is saved, but the node may pass through inputs unchanged at run-time until the executor lands."
|
|
6371
|
+
}) })
|
|
6254
6372
|
] })
|
|
6255
6373
|
] }),
|
|
6256
6374
|
renderForm()
|
|
@@ -6974,7 +7092,7 @@ function WorkflowCanvasInner({
|
|
|
6974
7092
|
};
|
|
6975
7093
|
}
|
|
6976
7094
|
if (isLogicNodeType(savedNode.type)) {
|
|
6977
|
-
const config = savedNode.data.config ??
|
|
7095
|
+
const config = savedNode.data.config ?? chunkC3H4FM4A_js.createDefaultLogicNodeConfig(savedNode.type);
|
|
6978
7096
|
if (config) {
|
|
6979
7097
|
const baseNode = {
|
|
6980
7098
|
id: savedNode.id,
|
|
@@ -7153,7 +7271,7 @@ function WorkflowCanvasInner({
|
|
|
7153
7271
|
}
|
|
7154
7272
|
storeTakeSnapshot();
|
|
7155
7273
|
const isTB = direction === "TB";
|
|
7156
|
-
const repositionedNodes =
|
|
7274
|
+
const repositionedNodes = chunkC3H4FM4A_js.applyDagreLayout(nodes, edges, direction).map((node) => ({
|
|
7157
7275
|
...node,
|
|
7158
7276
|
sourcePosition: isTB ? react$1.Position.Bottom : react$1.Position.Right,
|
|
7159
7277
|
targetPosition: isTB ? react$1.Position.Top : react$1.Position.Left
|
|
@@ -7282,7 +7400,7 @@ function WorkflowCanvasInner({
|
|
|
7282
7400
|
}, [storePaste]);
|
|
7283
7401
|
const contextMenuAddNote = react.useCallback((flowPosition) => {
|
|
7284
7402
|
storeTakeSnapshot();
|
|
7285
|
-
const noteConfig =
|
|
7403
|
+
const noteConfig = chunkC3H4FM4A_js.createDefaultLogicNodeConfig("note");
|
|
7286
7404
|
const noteNode = {
|
|
7287
7405
|
id: crypto.randomUUID(),
|
|
7288
7406
|
type: "note",
|
|
@@ -7793,7 +7911,7 @@ function WorkflowCanvasInner({
|
|
|
7793
7911
|
};
|
|
7794
7912
|
setNodes((currentNodes) => [...currentNodes, newNode]);
|
|
7795
7913
|
} else if (nodeType === "group") {
|
|
7796
|
-
const groupConfig = configRaw ? JSON.parse(configRaw) :
|
|
7914
|
+
const groupConfig = configRaw ? JSON.parse(configRaw) : chunkC3H4FM4A_js.createDefaultLogicNodeConfig("group");
|
|
7797
7915
|
if (!groupConfig) return;
|
|
7798
7916
|
const newNode = {
|
|
7799
7917
|
id: newNodeId,
|
|
@@ -7810,7 +7928,7 @@ function WorkflowCanvasInner({
|
|
|
7810
7928
|
};
|
|
7811
7929
|
setNodes((currentNodes) => [...currentNodes, newNode]);
|
|
7812
7930
|
} else if (isLogicNodeType(nodeType)) {
|
|
7813
|
-
const config = configRaw ? JSON.parse(configRaw) :
|
|
7931
|
+
const config = configRaw ? JSON.parse(configRaw) : chunkC3H4FM4A_js.createDefaultLogicNodeConfig(nodeType);
|
|
7814
7932
|
if (!config) return;
|
|
7815
7933
|
const newNode = {
|
|
7816
7934
|
id: newNodeId,
|
|
@@ -7948,7 +8066,7 @@ function WorkflowCanvasInner({
|
|
|
7948
8066
|
(edgeId, nodeType, position) => {
|
|
7949
8067
|
if (!isLogicNodeType(nodeType)) return;
|
|
7950
8068
|
storeTakeSnapshot();
|
|
7951
|
-
const config =
|
|
8069
|
+
const config = chunkC3H4FM4A_js.createDefaultLogicNodeConfig(nodeType);
|
|
7952
8070
|
if (!config) return;
|
|
7953
8071
|
const newNodeId = crypto.randomUUID();
|
|
7954
8072
|
const newNode = {
|
|
@@ -8415,7 +8533,14 @@ exports.MINIMAP_NODE_COLORS = MINIMAP_NODE_COLORS;
|
|
|
8415
8533
|
exports.ModelProviderFlowNode = ModelProviderFlowNode;
|
|
8416
8534
|
exports.NODE_EXECUTION_ACCENT_COLORS = NODE_EXECUTION_ACCENT_COLORS;
|
|
8417
8535
|
exports.NodeCard = NodeCard;
|
|
8536
|
+
exports.NodeCardBadge = NodeCardBadge;
|
|
8537
|
+
exports.NodeCardDeleteAction = NodeCardDeleteAction;
|
|
8538
|
+
exports.NodeCardHeader = NodeCardHeader;
|
|
8539
|
+
exports.NodeCardMeta = NodeCardMeta;
|
|
8418
8540
|
exports.NodeContextMenu = NodeContextMenu;
|
|
8541
|
+
exports.NodeIconBubble = NodeIconBubble;
|
|
8542
|
+
exports.NodeInteractiveCard = NodeInteractiveCard;
|
|
8543
|
+
exports.NodeRunningIndicator = NodeRunningIndicator;
|
|
8419
8544
|
exports.NoteFlowNode = NoteFlowNode;
|
|
8420
8545
|
exports.OpenAIIcon = OpenAIIcon;
|
|
8421
8546
|
exports.PanelContextMenu = PanelContextMenu;
|
|
@@ -8431,6 +8556,7 @@ exports.VariableAggregatorFlowNode = VariableAggregatorFlowNode;
|
|
|
8431
8556
|
exports.VariableAssignerFlowNode = VariableAssignerFlowNode;
|
|
8432
8557
|
exports.WorkflowBuilderProvider = WorkflowBuilderProvider;
|
|
8433
8558
|
exports.WorkflowCanvas = WorkflowCanvas;
|
|
8559
|
+
exports.WorkflowHandle = WorkflowHandle;
|
|
8434
8560
|
exports.Workspace = Workspace;
|
|
8435
8561
|
exports.getCompatibleModels = getCompatibleModels;
|
|
8436
8562
|
exports.getDefaultFrameworkForModel = getDefaultFrameworkForModel;
|
|
@@ -8448,5 +8574,5 @@ exports.useModalStore = useModalStore;
|
|
|
8448
8574
|
exports.useWorkflowBuilderClient = useWorkflowBuilderClient;
|
|
8449
8575
|
exports.useWorkflowBuilderClientOptional = useWorkflowBuilderClientOptional;
|
|
8450
8576
|
exports.useWorkflowStore = useWorkflowStore;
|
|
8451
|
-
//# sourceMappingURL=chunk-
|
|
8452
|
-
//# sourceMappingURL=chunk-
|
|
8577
|
+
//# sourceMappingURL=chunk-NYQAEPC7.js.map
|
|
8578
|
+
//# sourceMappingURL=chunk-NYQAEPC7.js.map
|