@datatechsolutions/ui 3.2.1 → 3.4.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.
- package/dist/astrlabe/contracts.d.mts +31 -3
- package/dist/astrlabe/contracts.d.ts +31 -3
- package/dist/astrlabe/index.d.mts +22 -30
- package/dist/astrlabe/index.d.ts +22 -30
- package/dist/astrlabe/index.js +121 -121
- package/dist/astrlabe/index.mjs +7 -7
- package/dist/astrlabe/utils.js +9 -9
- package/dist/astrlabe/utils.mjs +2 -2
- package/dist/astrlabe/workflow-canvas.d.mts +6 -69
- package/dist/astrlabe/workflow-canvas.d.ts +6 -69
- package/dist/astrlabe/workflow-canvas.js +6 -6
- package/dist/astrlabe/workflow-canvas.mjs +5 -5
- package/dist/brand/index.d.mts +1 -15
- package/dist/brand/index.d.ts +1 -15
- package/dist/brand/index.js +0 -14
- package/dist/brand/index.js.map +1 -1
- package/dist/brand/index.mjs +0 -14
- package/dist/brand/index.mjs.map +1 -1
- package/dist/{chunk-FAGDZEKM.js → chunk-2OZZH2IO.js} +2 -2
- package/dist/chunk-2OZZH2IO.js.map +1 -0
- package/dist/{chunk-SYNVNTLJ.mjs → chunk-3AY5HIQ6.mjs} +2 -2
- package/dist/chunk-3AY5HIQ6.mjs.map +1 -0
- package/dist/{chunk-JSNRCYSO.js → chunk-45QAUEYT.js} +4 -4
- package/dist/{chunk-JSNRCYSO.js.map → chunk-45QAUEYT.js.map} +1 -1
- package/dist/{chunk-B67DP7MI.mjs → chunk-4GDWGWHY.mjs} +4 -4
- package/dist/{chunk-B67DP7MI.mjs.map → chunk-4GDWGWHY.mjs.map} +1 -1
- package/dist/{chunk-KR2X2WHJ.js → chunk-4ICEQJH4.js} +53 -53
- package/dist/{chunk-KR2X2WHJ.js.map → chunk-4ICEQJH4.js.map} +1 -1
- package/dist/{chunk-RXZNACMI.js → chunk-6MBWKOPF.js} +33 -33
- package/dist/{chunk-RXZNACMI.js.map → chunk-6MBWKOPF.js.map} +1 -1
- package/dist/{chunk-C3H4FM4A.js → chunk-72SWXOD5.js} +15 -2
- package/dist/chunk-72SWXOD5.js.map +1 -0
- package/dist/{chunk-JN6IL6OH.mjs → chunk-AGGOHPMZ.mjs} +1054 -5229
- package/dist/chunk-AGGOHPMZ.mjs.map +1 -0
- package/dist/{chunk-5GDKCFM5.mjs → chunk-AL73YAV4.mjs} +3 -3
- package/dist/{chunk-5GDKCFM5.mjs.map → chunk-AL73YAV4.mjs.map} +1 -1
- package/dist/{chunk-ZJPNP2YW.mjs → chunk-BUDZNAKL.mjs} +2 -2
- package/dist/chunk-BUDZNAKL.mjs.map +1 -0
- package/dist/{chunk-OL73LBX5.mjs → chunk-BW67WFHT.mjs} +3 -4
- package/dist/chunk-BW67WFHT.mjs.map +1 -0
- package/dist/{chunk-W5OEBO6E.js → chunk-CF7GOUBQ.js} +13 -14
- package/dist/chunk-CF7GOUBQ.js.map +1 -0
- package/dist/{chunk-IRPS5UCS.mjs → chunk-CUWPLPVY.mjs} +3 -3
- package/dist/{chunk-IRPS5UCS.mjs.map → chunk-CUWPLPVY.mjs.map} +1 -1
- package/dist/{chunk-NJS2YC3J.js → chunk-DJDZIRM6.js} +12 -2
- package/dist/chunk-DJDZIRM6.js.map +1 -0
- package/dist/{chunk-RL35XATZ.js → chunk-ERCDMBRT.js} +702 -647
- package/dist/chunk-ERCDMBRT.js.map +1 -0
- package/dist/{chunk-I2NZGVBG.js → chunk-FSBR4RCK.js} +1101 -5313
- package/dist/chunk-FSBR4RCK.js.map +1 -0
- package/dist/{chunk-5W7L7BT7.mjs → chunk-G7JQ4OCE.mjs} +15 -2
- package/dist/chunk-G7JQ4OCE.mjs.map +1 -0
- package/dist/{chunk-5RM6NGZ6.mjs → chunk-IDEM3DYF.mjs} +3 -3
- package/dist/{chunk-5RM6NGZ6.mjs.map → chunk-IDEM3DYF.mjs.map} +1 -1
- package/dist/{chunk-U7XM3N7F.mjs → chunk-LEXBTVGM.mjs} +12 -2
- package/dist/chunk-LEXBTVGM.mjs.map +1 -0
- package/dist/{chunk-EFOXN3LC.js → chunk-M7KSEUZR.js} +490 -389
- package/dist/chunk-M7KSEUZR.js.map +1 -0
- package/dist/{chunk-AOUUZ52N.js → chunk-MO5FBVV3.js} +85 -86
- package/dist/chunk-MO5FBVV3.js.map +1 -0
- package/dist/{chunk-H2D2CRTD.mjs → chunk-NAFWHJCM.mjs} +8 -8
- package/dist/{chunk-H2D2CRTD.mjs.map → chunk-NAFWHJCM.mjs.map} +1 -1
- package/dist/{chunk-3JJWPOK6.js → chunk-NCLZKVJK.js} +9 -10
- package/dist/chunk-NCLZKVJK.js.map +1 -0
- package/dist/{chunk-R4TQWXNG.mjs → chunk-NVQWHJQH.mjs} +6 -5
- package/dist/chunk-NVQWHJQH.mjs.map +1 -0
- package/dist/{chunk-Y6AEE56Q.js → chunk-PGVZKMOA.js} +69 -69
- package/dist/{chunk-Y6AEE56Q.js.map → chunk-PGVZKMOA.js.map} +1 -1
- package/dist/{chunk-UDDZTTLO.mjs → chunk-QBFE7ABE.mjs} +6 -7
- package/dist/chunk-QBFE7ABE.mjs.map +1 -0
- package/dist/{chunk-3ZUMJTDT.mjs → chunk-RFRXS4PC.mjs} +3 -4
- package/dist/{chunk-3JJWPOK6.js.map → chunk-RFRXS4PC.mjs.map} +1 -1
- package/dist/{chunk-ZV5EZXXO.mjs → chunk-RHRJXK5R.mjs} +3 -3
- package/dist/{chunk-ZV5EZXXO.mjs.map → chunk-RHRJXK5R.mjs.map} +1 -1
- package/dist/{chunk-SU3YPWFW.js → chunk-RLLP7VQJ.js} +26 -26
- package/dist/{chunk-SU3YPWFW.js.map → chunk-RLLP7VQJ.js.map} +1 -1
- package/dist/{chunk-YIB2YAM5.mjs → chunk-RLVOG5OQ.mjs} +3 -3
- package/dist/{chunk-YIB2YAM5.mjs.map → chunk-RLVOG5OQ.mjs.map} +1 -1
- package/dist/{chunk-QYA53LUF.mjs → chunk-SEYUYGER.mjs} +571 -517
- package/dist/chunk-SEYUYGER.mjs.map +1 -0
- package/dist/{chunk-YV72JM4B.mjs → chunk-SQ4KGLBZ.mjs} +4 -4
- package/dist/{chunk-YV72JM4B.mjs.map → chunk-SQ4KGLBZ.mjs.map} +1 -1
- package/dist/{chunk-F54Q2YJY.js → chunk-SY4MUT5V.js} +7 -7
- package/dist/{chunk-F54Q2YJY.js.map → chunk-SY4MUT5V.js.map} +1 -1
- package/dist/{chunk-ZM5MVWIT.js → chunk-TUQLZ4QD.js} +5 -6
- package/dist/chunk-TUQLZ4QD.js.map +1 -0
- package/dist/{chunk-TVMLV675.js → chunk-UE2RDQIK.js} +98 -95
- package/dist/chunk-UE2RDQIK.js.map +1 -0
- package/dist/{chunk-HDCUWUNH.js → chunk-UJVDI66K.js} +28 -27
- package/dist/chunk-UJVDI66K.js.map +1 -0
- package/dist/{chunk-IRT4T3CU.mjs → chunk-VV6SYMPM.mjs} +423 -321
- package/dist/chunk-VV6SYMPM.mjs.map +1 -0
- package/dist/{chunk-HZ4LOVHM.js → chunk-VY52Y5GC.js} +2 -2
- package/dist/chunk-VY52Y5GC.js.map +1 -0
- package/dist/{chunk-LEKZUS6N.mjs → chunk-X3GW7UPN.mjs} +4 -5
- package/dist/chunk-X3GW7UPN.mjs.map +1 -0
- package/dist/{chunk-RGI74SQH.js → chunk-Y2AYFG4E.js} +4 -4
- package/dist/{chunk-RGI74SQH.js.map → chunk-Y2AYFG4E.js.map} +1 -1
- package/dist/{chunk-TIJJHW2Z.js → chunk-YV7F7IXG.js} +36 -36
- package/dist/{chunk-TIJJHW2Z.js.map → chunk-YV7F7IXG.js.map} +1 -1
- package/dist/{chunk-MVBIAXVN.mjs → chunk-ZKSDDFHG.mjs} +14 -11
- package/dist/chunk-ZKSDDFHG.mjs.map +1 -0
- package/dist/{index-VI9gyJXl.d.mts → index-BNRGVAS5.d.mts} +9 -2
- package/dist/index-BoebbJ44.d.mts +49 -0
- package/dist/index-BoebbJ44.d.ts +49 -0
- package/dist/{index-CoB18TbG.d.ts → index-CnCY-b5V.d.ts} +9 -2
- package/dist/index.d.mts +399 -548
- package/dist/index.d.ts +399 -548
- package/dist/index.js +727 -887
- package/dist/index.mjs +3 -3
- package/dist/platform/admin/index.js +12 -12
- package/dist/platform/admin/index.mjs +6 -6
- package/dist/platform/agents-workspace.js +10 -10
- package/dist/platform/agents-workspace.mjs +9 -9
- package/dist/platform/app-shell.js +5 -5
- package/dist/platform/app-shell.mjs +4 -4
- package/dist/platform/auth/index.js +29 -29
- package/dist/platform/auth/index.mjs +6 -6
- package/dist/platform/billing/index.js +5 -5
- package/dist/platform/billing/index.mjs +4 -4
- package/dist/platform/impersonation/index.js +5 -5
- package/dist/platform/impersonation/index.mjs +4 -4
- package/dist/platform/index.d.mts +3 -39
- package/dist/platform/index.d.ts +3 -39
- package/dist/platform/index.js +102 -4812
- package/dist/platform/index.js.map +1 -1
- package/dist/platform/index.mjs +25 -4730
- package/dist/platform/index.mjs.map +1 -1
- package/dist/platform/pages/index.d.mts +4 -4
- package/dist/platform/pages/index.d.ts +4 -4
- package/dist/platform/pages/index.js +199 -199
- package/dist/platform/pages/index.mjs +11 -11
- package/dist/platform/rbac.d.mts +2 -1
- package/dist/platform/rbac.d.ts +2 -1
- package/dist/platform/rbac.js +2 -2
- package/dist/platform/rbac.mjs +1 -1
- package/dist/platform/settings/index.js +9 -9
- package/dist/platform/settings/index.mjs +8 -8
- package/dist/platform/utils/index.js +3 -3
- package/dist/platform/utils/index.js.map +1 -1
- package/dist/platform/utils/index.mjs +1 -1
- package/dist/platform/utils/index.mjs.map +1 -1
- package/dist/platform/workflow-api-client.d.mts +2 -2
- package/dist/platform/workflow-api-client.d.ts +2 -2
- package/dist/platform/workflow-api-client.js +62 -62
- package/dist/platform/workflow-api-client.mjs +2 -2
- package/dist/platform/workflow-canvas-shell.js +7 -7
- package/dist/platform/workflow-canvas-shell.mjs +6 -6
- package/dist/{workflow-api-client-DoYj7nHz.d.mts → workflow-api-client-CpFl3WcG.d.mts} +1 -1
- package/dist/{workflow-api-client-BKD8OfP_.d.ts → workflow-api-client-uLICOanv.d.ts} +1 -1
- package/dist/workflow-canvas--qaYKuMm.d.ts +113 -0
- package/dist/workflow-canvas-B80fmD_n.d.mts +113 -0
- package/package.json +15 -5
- package/src/styles/liquid-glass.css +283 -2
- package/dist/chunk-3ZUMJTDT.mjs.map +0 -1
- package/dist/chunk-5W7L7BT7.mjs.map +0 -1
- package/dist/chunk-AOUUZ52N.js.map +0 -1
- package/dist/chunk-C3H4FM4A.js.map +0 -1
- package/dist/chunk-EFOXN3LC.js.map +0 -1
- package/dist/chunk-FAGDZEKM.js.map +0 -1
- package/dist/chunk-HDCUWUNH.js.map +0 -1
- package/dist/chunk-HZ4LOVHM.js.map +0 -1
- package/dist/chunk-I2NZGVBG.js.map +0 -1
- package/dist/chunk-IRT4T3CU.mjs.map +0 -1
- package/dist/chunk-JN6IL6OH.mjs.map +0 -1
- package/dist/chunk-LEKZUS6N.mjs.map +0 -1
- package/dist/chunk-MVBIAXVN.mjs.map +0 -1
- package/dist/chunk-NJS2YC3J.js.map +0 -1
- package/dist/chunk-OL73LBX5.mjs.map +0 -1
- package/dist/chunk-QYA53LUF.mjs.map +0 -1
- package/dist/chunk-R4TQWXNG.mjs.map +0 -1
- package/dist/chunk-RL35XATZ.js.map +0 -1
- package/dist/chunk-SYNVNTLJ.mjs.map +0 -1
- package/dist/chunk-TVMLV675.js.map +0 -1
- package/dist/chunk-U7XM3N7F.mjs.map +0 -1
- package/dist/chunk-UDDZTTLO.mjs.map +0 -1
- package/dist/chunk-W5OEBO6E.js.map +0 -1
- package/dist/chunk-ZJPNP2YW.mjs.map +0 -1
- package/dist/chunk-ZM5MVWIT.js.map +0 -1
- package/src/brand/logos/kori-icon.svg +0 -45
- package/src/brand/logos/kori-logo-dark.svg +0 -40
- package/src/brand/logos/kori-logo.svg +0 -43
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/astrlabe/utils/workflow-validator.ts"],"names":[],"mappings":";;;AAgDA,IAAM,WAAA,GAAwC;AAAA,EAC5C,gBAAA,EAAkB,qCAAA;AAAA,EAClB,qBAAA,EAAuB,gEAAA;AAAA,EACvB,qBAAA,EAAuB,gEAAA;AAAA,EACvB,kBAAA,EAAoB,gEAAA;AAAA,EACpB,sBAAA,EAAwB,wEAAA;AAAA,EACxB,mBAAA,EAAqB,+DAAA;AAAA,EACrB,qBAAA,EAAuB,mDAAA;AAAA,EACvB,0BAAA,EAA4B,gCAAA;AAAA,EAC5B,wBAAA,EAA0B,8BAAA;AAAA,EAC1B,wBAAA,EAA0B,6CAAA;AAAA,EAC1B,sBAAA,EAAwB,2CAAA;AAAA,EACxB,2BAAA,EAA6B,2DAAA;AAAA,EAC7B,eAAA,EAAiB,aAAA;AAAA,EACjB,8BAAA,EAAgC,kCAAA;AAAA,EAChC,wBAAA,EAA0B,uEAAA;AAAA,EAC1B,kBAAA,EAAoB,kBAAA;AAAA,EACpB,2BAAA,EAA6B,uCAAA;AAAA,EAC7B,mCAAA,EAAqC,gDAAA;AAAA,EACrC,mCAAA,EAAqC,qCAAA;AAAA,EACrC,6BAAA,EAA+B,8CAAA;AAAA,EAC/B,2BAAA,EAA6B,yFAAA;AAAA,EAC7B,6BAAA,EAA+B,uBAAA;AAAA,EAC/B,mBAAA,EAAqB,kBAAA;AAAA,EACrB,wBAAA,EAA0B,mDAAA;AAAA,EAC1B,+BAAA,EAAiC,oEAAA;AAAA,EACjC,kCAAA,EAAoC,iCAAA;AAAA,EACpC,4BAAA,EAA8B,2CAAA;AAAA,EAC9B,kCAAA,EAAoC,4CAAA;AAAA,EACpC,kBAAA,EAAoB;AACtB,CAAA;AAEA,IAAM,cAAA,GAA2C;AAAA,EAC/C,gBAAA,EAAkB,kDAAA;AAAA,EAClB,qBAAA,EAAuB,0EAAA;AAAA,EACvB,qBAAA,EAAuB,2EAAA;AAAA,EACvB,kBAAA,EAAoB,8EAAA;AAAA,EACpB,sBAAA,EAAwB,gGAAA;AAAA,EACxB,mBAAA,EAAqB,yEAAA;AAAA,EACrB,qBAAA,EAAuB,iEAAA;AAAA,EACvB,0BAAA,EAA4B,sCAAA;AAAA,EAC5B,wBAAA,EAA0B,oCAAA;AAAA,EAC1B,wBAAA,EAA0B,sDAAA;AAAA,EAC1B,sBAAA,EAAwB,qDAAA;AAAA,EACxB,2BAAA,EAA6B,kEAAA;AAAA,EAC7B,eAAA,EAAiB,qBAAA;AAAA,EACjB,8BAAA,EAAgC,sDAAA;AAAA,EAChC,wBAAA,EAA0B,+EAAA;AAAA,EAC1B,kBAAA,EAAoB,mBAAA;AAAA,EACpB,2BAAA,EAA6B,+CAAA;AAAA,EAC7B,mCAAA,EAAqC,4DAAA;AAAA,EACrC,mCAAA,EAAqC,kCAAA;AAAA,EACrC,6BAAA,EAA+B,8CAAA;AAAA,EAC/B,2BAAA,EAA6B,yFAAA;AAAA,EAC7B,6BAAA,EAA+B,wBAAA;AAAA,EAC/B,mBAAA,EAAqB,uBAAA;AAAA,EACrB,wBAAA,EAA0B,mDAAA;AAAA,EAC1B,+BAAA,EAAiC,uEAAA;AAAA,EACjC,kCAAA,EAAoC,yCAAA;AAAA,EACpC,4BAAA,EAA8B,2CAAA;AAAA,EAC9B,kCAAA,EAAoC,+BAAA;AAAA,EACpC,kBAAA,EAAoB;AACtB,CAAA;AAEA,IAAM,eAAA,GAAqE;AAAA,EACzE,EAAA,EAAI,WAAA;AAAA,EACJ,OAAA,EAAS,cAAA;AAAA,EACT,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AA0DA,SAAS,gBAAgB,MAAA,EAA4C;AACnE,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,UAAU,eAAA,EAAiB;AAC7B,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAA,GAAY,OAAO,WAAA,EAAY;AACrC,EAAA,IAAI,SAAA,CAAU,UAAA,CAAW,IAAI,CAAA,EAAG;AAC9B,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,IAAI,SAAA,CAAU,UAAA,CAAW,IAAI,CAAA,EAAG;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,SAAA,CAAU,UAAA,CAAW,IAAI,CAAA,EAAG;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,SAAA,CAAU,UAAA,CAAW,IAAI,CAAA,EAAG;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,SAAA,CAAU,UAAA,CAAW,IAAI,CAAA,EAAG;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,QAAA,CAAS,UAAA,EAAkC,MAAA,EAA2B,MAAA,EAAmC;AAChH,EAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,eAAA,CAAgB,MAAM,CAAC,CAAA,IAAK,WAAA;AAC5D,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,UAAU,CAAA,IAAK,YAAY,UAAU,CAAA;AAC7D,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,cAAA,EAAgB,CAAC,CAAA,EAAG,GAAA,KAAgB,MAAA,CAAO,MAAA,GAAS,GAAG,CAAA,IAAK,EAAE,CAAC,CAAA;AACxF;AAEA,SAAS,SAAS,KAAA,EAAqC;AACrD,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAEA,SAAS,UAAU,IAAA,EAAgC;AACjD,EAAA,OAAO,QAAA,CAAS,KAAK,IAAA,CAAK,MAAM,IAAI,IAAA,CAAK,IAAA,CAAK,SAAS,EAAC;AAC1D;AAEA,SAAS,SAAA,CAAU,QAAoB,KAAA,EAAmC;AACxE,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAK,CAAA;AAC1B,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA;AAC7C;AAEA,SAAS,iBAAA,CAAkB,QAAoB,KAAA,EAAwB;AACrE,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,MAAA,EAAQ,KAAK,CAAA;AACrC,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,IAAA,GAAO,MAAA,GAAS,CAAA;AAC5D;AAEA,SAAS,QAAA,CAAS,QAAoB,KAAA,EAAsC;AAC1E,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAK,CAAA;AAC1B,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,MAAA;AACxC;AAEA,SAAS,SAAA,CAAU,QAAoB,KAAA,EAAmC;AACxE,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAK,CAAA;AAC1B,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA;AAC7C;AAEA,SAAS,cACP,MAAA,EACA,IAAA,EACA,MAAA,EACA,IAAA,EACA,OACA,MAAA,EACA;AACA,EAAA,MAAA,CAAO,IAAA,CAAK;AAAA,IACV,QAAQ,IAAA,CAAK,EAAA;AAAA,IACb,UAAU,IAAA,CAAK,IAAA;AAAA,IACf,KAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA,EAAS,QAAA,CAAS,IAAA,EAAM,MAAA,EAAQ,MAAM;AAAA,GACvC,CAAA;AACH;AAEA,SAAS,SAAA,CACP,MAAA,EACA,MAAA,EACA,IAAA,EACA,MAAA,EACA;AACA,EAAA,MAAA,CAAO,IAAA,CAAK;AAAA,IACV,IAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA,EAAS,QAAA,CAAS,IAAA,EAAM,MAAA,EAAQ,MAAM;AAAA,GACvC,CAAA;AACH;AAEA,SAAS,0BAAA,CACP,IAAA,EACA,MAAA,EACA,MAAA,EACA,MAAA,EACA;AACA,EAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,MAAA,EAAQ,cAAc,CAAA;AAC9D,EAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,MAAA,EAAQ,SAAS,CAAA;AACtD,EAAA,MAAM,YAAY,iBAAA,CAAkB,MAAA,EAAQ,UAAU,CAAA,IAAK,iBAAA,CAAkB,QAAQ,OAAO,CAAA;AAC5F,EAAA,IAAI,CAAC,aAAA,IAAiB,CAAC,UAAA,IAAc,CAAC,SAAA,EAAW;AAC/C,IAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,+BAAA,EAAiC,UAAU,CAAA;AAAA,EACjF;AACF;AAEA,SAAS,eAAA,CAAgB,OAA4B,OAAA,EAA4C;AAC/F,EAAA,MAAM,KAAA,GAAQ,QAAQ,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,EAAG,IAAA,CAAK,SAAS,KAAA,CAAM,MAAA;AAC7D,EAAA,MAAM,WAAW,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAA,EAAK,KAAA,CAAM,KAAK,CAAA,CAAA,CAAA,GAAM,EAAA;AACrD,EAAA,OAAO,CAAA,MAAA,EAAS,KAAK,CAAA,GAAA,EAAM,KAAA,CAAM,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAA;AACzE;AAEO,SAAS,kBAAA,CAAmB,IAAA,EAAoB,OAAA,GAA6B,EAAC,EAA0B;AAC7G,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AACvB,EAAA,MAAM,MAAA,GAAS,UAAU,IAAI,CAAA;AAC7B,EAAA,MAAM,SAAgC,EAAC;AACvC,EAAA,MAAM,WAAW,IAAA,CAAK,IAAA;AAEtB,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,OAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,kBAAA;AACH,MAAA;AAAA,IAEF,KAAK,KAAA,EAAO;AACV,MAAA,IAAI,qBAAqB,MAAA,IAAU,CAAC,MAAM,OAAA,CAAQ,MAAA,CAAO,eAAe,CAAA,EAAG;AACzE,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,2BAAA,EAA6B,iBAAiB,CAAA;AAAA,MACpF,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,EAAG;AACxC,QAAA,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAA,KAAU;AACvC,UAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,IAAK,OAAO,KAAA,CAAM,GAAA,KAAQ,QAAA,IAAY,KAAA,CAAM,GAAA,CAAI,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AACtF,YAAA,aAAA,CAAc,QAAQ,IAAA,EAAM,MAAA,EAAQ,eAAA,EAAiB,CAAA,QAAA,EAAW,KAAK,CAAA,KAAA,CAAO,CAAA;AAAA,UAC9E;AACA,UAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,IAAK,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,IAAY,KAAA,CAAM,IAAA,CAAK,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AACxF,YAAA,aAAA,CAAc,QAAQ,IAAA,EAAM,MAAA,EAAQ,eAAA,EAAiB,CAAA,QAAA,EAAW,KAAK,CAAA,MAAA,CAAQ,CAAA;AAAA,UAC/E;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AACA,MAAA;AAAA,IACF;AAAA,IAEA,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,cAAc,UAAA,IAAc,MAAA;AAClC,MAAA,MAAM,eAAe,WAAA,IAAe,MAAA;AACpC,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,IAAI,CAAC,iBAAA,CAAkB,MAAA,EAAQ,MAAM,CAAA,EAAG;AACtC,UAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,8BAAA,EAAgC,MAAM,CAAA;AAAA,QAC5E;AAAA,MACF,CAAA,MAAA,IAAW,CAAC,YAAA,EAAc;AACxB,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,wBAAA,EAA0B,WAAW,CAAA;AAAA,MAC3E;AACA,MAAA;AAAA,IACF;AAAA,IAEA,KAAK,iBAAA,EAAmB;AACtB,MAAA,KAAA,MAAW,KAAA,IAAS,CAAC,kBAAA,EAAoB,cAAA,EAAgB,eAAe,CAAA,EAAG;AACzE,QAAA,IAAI,CAAC,iBAAA,CAAkB,MAAA,EAAQ,KAAK,CAAA,EAAG;AACrC,UAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,eAAA,EAAiB,KAAK,CAAA;AAAA,QAC5D;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAAA,IAEA,KAAK,QAAA;AACH,MAAA,IAAI,CAAC,iBAAA,CAAkB,MAAA,EAAQ,gBAAgB,CAAA,EAAG;AAChD,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,eAAA,EAAiB,gBAAgB,CAAA;AAAA,MACvE;AACA,MAAA;AAAA,IAEF,KAAK,YAAA;AACH,MAAA,IAAI,CAAC,iBAAA,CAAkB,MAAA,EAAQ,cAAc,CAAA,EAAG;AAC9C,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,eAAA,EAAiB,cAAc,CAAA;AAAA,MACrE;AACA,MAAA;AAAA,IAEF,KAAK,gBAAA;AACH,MAAA,IAAI,CAAC,iBAAA,CAAkB,MAAA,EAAQ,cAAc,CAAA,EAAG;AAC9C,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,eAAA,EAAiB,cAAc,CAAA;AAAA,MACrE;AACA,MAAA;AAAA,IAEF,KAAK,mBAAA,EAAqB;AACxB,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,MAAA,EAAQ,aAAa,CAAA;AAClD,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,kBAAA,EAAoB,aAAa,CAAA;AACrE,QAAA,OAAO,MAAA;AAAA,MACT;AAEA,MAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAA,KAAU;AACpC,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAK,CAAA,GAAI,QAAQ,EAAC;AAC1C,QAAA,MAAM,MAAA,GAAS,OAAO,MAAA,CAAO,MAAA,KAAW,YAAY,MAAA,CAAO,MAAA,CAAO,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA;AAClF,QAAA,MAAM,YAAA,GAAe,OAAO,MAAA,CAAO,GAAA,KAAQ,YAAY,MAAA,CAAO,GAAA,CAAI,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA;AAClF,QAAA,IAAI,CAAC,MAAA,IAAU,CAAC,YAAA,EAAc;AAC5B,UAAA,aAAA,CAAc,QAAQ,IAAA,EAAM,MAAA,EAAQ,eAAA,EAAiB,CAAA,YAAA,EAAe,KAAK,CAAA,QAAA,CAAU,CAAA;AAAA,QACrF;AAEA,QAAA,MAAM,MAAA,GAAS,OAAO,MAAA,CAAO,MAAA,KAAW,YAAY,MAAA,CAAO,MAAA,CAAO,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA;AAClF,QAAA,MAAM,YAAA,GAAe,OAAO,MAAA,CAAO,IAAA,KAAS,YAAY,MAAA,CAAO,IAAA,CAAK,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA;AACpF,QAAA,MAAM,WAAW,OAAA,IAAW,MAAA;AAC5B,QAAA,IAAI,CAAC,MAAA,IAAU,CAAC,YAAA,IAAgB,CAAC,QAAA,EAAU;AACzC,UAAA,aAAA,CAAc,QAAQ,IAAA,EAAM,MAAA,EAAQ,mCAAA,EAAqC,CAAA,YAAA,EAAe,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,QAClG;AAAA,MACF,CAAC,CAAA;AACD,MAAA;AAAA,IACF;AAAA,IAEA,KAAK,qBAAA,EAAuB;AAC1B,MAAA,IAAI,oBAAoB,MAAA,EAAQ;AAC9B,QAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,MAAA,EAAQ,gBAAgB,CAAA;AACxD,QAAA,IAAI,CAAC,cAAA,IAAkB,cAAA,CAAe,MAAA,KAAW,CAAA,EAAG;AAClD,UAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,mCAAA,EAAqC,gBAAgB,CAAA;AAAA,QAC3F;AACA,QAAA,IAAI,CAAC,iBAAA,CAAkB,MAAA,EAAQ,gBAAgB,CAAA,EAAG;AAChD,UAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,eAAA,EAAiB,gBAAgB,CAAA;AAAA,QACvE;AACA,QAAA,MAAM,eAAA,GAAkB,SAAA,CAAU,MAAA,EAAQ,iBAAiB,CAAA;AAC3D,QAAA,IAAI,eAAA,IAAmB,CAAC,CAAC,OAAA,EAAS,UAAU,aAAa,CAAA,CAAE,QAAA,CAAS,eAAe,CAAA,EAAG;AACpF,UAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,6BAAA,EAA+B,iBAAiB,CAAA;AAAA,QACtF;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAAA,IAEA,KAAK,eAAA,EAAiB;AACpB,MAAA,MAAM,SAAA,GAAY,SAAA,CAAU,MAAA,EAAQ,WAAW,CAAA,IAAK,EAAA;AACpD,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,eAAA,EAAiB,WAAW,CAAA;AAAA,MAClE,CAAA,MAAA,IAAW,CAAC,CAAC,QAAA,EAAU,OAAO,MAAA,EAAQ,OAAA,EAAS,aAAA,EAAe,SAAA,EAAW,SAAS,KAAA,EAAO,KAAK,CAAA,CAAE,QAAA,CAAS,SAAS,CAAA,EAAG;AACnH,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,2BAAA,EAA6B,WAAW,CAAA;AAAA,MAC9E;AAEA,MAAA,MAAM,aAAA,GAAgB,SAAA,CAAU,MAAA,EAAQ,eAAe,CAAA;AACvD,MAAA,MAAM,YAAA,GAAe,SAAA,CAAU,MAAA,EAAQ,QAAQ,CAAA;AAC/C,MAAA,IAAI,EAAE,iBAAiB,aAAA,CAAc,IAAA,OAAW,EAAE,YAAA,IAAgB,YAAA,CAAa,IAAA,EAAK,CAAA,EAAI;AACtF,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,eAAA,EAAiB,eAAe,CAAA;AAAA,MACtE;AACA,MAAA;AAAA,IACF;AAAA,IAEA,KAAK,oBAAA;AACH,MAAA,IAAI,CAAC,iBAAA,CAAkB,MAAA,EAAQ,UAAU,CAAA,EAAG;AAC1C,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,eAAA,EAAiB,UAAU,CAAA;AAAA,MACjE;AACA,MAAA;AAAA,IAEF,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,cAAA,GAAiB,SAAA,CAAU,MAAA,EAAQ,gBAAgB,CAAA;AACzD,MAAA,MAAM,YAAA,GAAe,SAAA,CAAU,MAAA,EAAQ,QAAQ,CAAA;AAC/C,MAAA,IAAI,EAAE,kBAAkB,cAAA,CAAe,IAAA,OAAW,EAAE,YAAA,IAAgB,YAAA,CAAa,IAAA,EAAK,CAAA,EAAI;AACxF,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,eAAA,EAAiB,gBAAgB,CAAA;AAAA,MACvE;AACA,MAAA;AAAA,IACF;AAAA,IAEA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,UAAA,GAAa,QAAA,CAAS,MAAA,EAAQ,YAAY,CAAA;AAChD,MAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAC1C,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,kBAAA,EAAoB,YAAY,CAAA;AAAA,MACtE,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,OAAA,CAAQ,CAAC,SAAA,EAAW,KAAA,KAAU;AACvC,UAAA,MAAM,MAAA,GAAS,QAAA,CAAS,SAAS,CAAA,GAAI,YAAY,EAAC;AAClD,UAAA,IAAI,OAAO,OAAO,QAAA,KAAa,QAAA,IAAY,OAAO,QAAA,CAAS,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA,EAAG;AAC9E,YAAA,aAAA,CAAc,QAAQ,IAAA,EAAM,MAAA,EAAQ,eAAA,EAAiB,CAAA,WAAA,EAAc,KAAK,CAAA,UAAA,CAAY,CAAA;AAAA,UACtF;AACA,UAAA,IAAI,OAAO,OAAO,QAAA,KAAa,QAAA,IAAY,OAAO,QAAA,CAAS,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA,EAAG;AAC9E,YAAA,aAAA,CAAc,QAAQ,IAAA,EAAM,MAAA,EAAQ,eAAA,EAAiB,CAAA,WAAA,EAAc,KAAK,CAAA,UAAA,CAAY,CAAA;AAAA,UACtF;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,eAAA,GAAkB,SAAA,CAAU,MAAA,EAAQ,iBAAiB,CAAA;AAC3D,MAAA,IAAI,eAAA,IAAmB,CAAC,CAAC,KAAA,EAAO,IAAI,CAAA,CAAE,QAAA,CAAS,eAAe,CAAA,EAAG;AAC/D,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,6BAAA,EAA+B,iBAAiB,CAAA;AAAA,MACtF;AACA,MAAA;AAAA,IACF;AAAA,IAEA,KAAK,WAAA,EAAa;AAChB,MAAA,MAAM,gBAAA,GAAmB,SAAA,CAAU,MAAA,EAAQ,kBAAkB,CAAA;AAC7D,MAAA,MAAM,YAAA,GAAe,SAAA,CAAU,MAAA,EAAQ,QAAQ,CAAA;AAC/C,MAAA,IAAI,EAAE,oBAAoB,gBAAA,CAAiB,IAAA,OAAW,EAAE,YAAA,IAAgB,YAAA,CAAa,IAAA,EAAK,CAAA,EAAI;AAC5F,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,eAAA,EAAiB,kBAAkB,CAAA;AAAA,MACzE;AACA,MAAA,IAAI,mBAAmB,MAAA,IAAU,SAAA,CAAU,MAAA,EAAQ,eAAe,MAAM,MAAA,EAAW;AACjF,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,mBAAA,EAAqB,eAAe,CAAA;AAAA,MAC1E;AACA,MAAA;AAAA,IACF;AAAA,IAEA,KAAK,cAAA,EAAgB;AACnB,MAAA,MAAM,UAAU,SAAA,CAAU,MAAA,EAAQ,QAAQ,CAAA,IAAK,IAAI,WAAA,EAAY;AAC/D,MAAA,IAAI,CAAC,CAAC,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,SAAS,QAAQ,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,EAAG;AAC/D,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,wBAAA,EAA0B,QAAQ,CAAA;AAAA,MACxE;AACA,MAAA,IAAI,CAAC,iBAAA,CAAkB,MAAA,EAAQ,KAAK,CAAA,EAAG;AACrC,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,eAAA,EAAiB,KAAK,CAAA;AAAA,MAC5D;AACA,MAAA;AAAA,IACF;AAAA,IAEA,KAAK,UAAA,EAAY;AAIf,MAAA,IAAI,CAAC,iBAAA,CAAkB,MAAA,EAAQ,KAAK,CAAA,EAAG;AACrC,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,eAAA,EAAiB,KAAK,CAAA;AAAA,MAC5D;AACA,MAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,MAAA,EAAQ,WAAW,CAAA;AACvD,MAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,MAAA,EAAQ,MAAM,CAAA;AAChD,MAAA,IAAI,CAAC,SAAA,IAAa,CAAC,OAAA,EAAS;AAC1B,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,kCAAA,EAAoC,WAAW,CAAA;AAAA,MACrF;AACA,MAAA;AAAA,IACF;AAAA,IAEA,KAAK,MAAA;AACH,MAAA;AAAA,IAEF,KAAK,OAAA;AACH,MAAA,IAAI,CAAC,iBAAA,CAAkB,MAAA,EAAQ,YAAY,CAAA,EAAG;AAC5C,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,eAAA,EAAiB,YAAY,CAAA;AAAA,MACnE;AACA,MAAA,0BAAA,CAA2B,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAA;AACvD,MAAA;AAAA,IAEF,KAAK,qBAAA,EAAuB;AAC1B,MAAA,0BAAA,CAA2B,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAA;AACvD,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,MAAA,EAAQ,OAAO,CAAA;AACvC,MAAA,MAAM,YAAA,GAAe,SAAA,CAAU,MAAA,EAAQ,cAAc,CAAA;AACrD,MAAA,IAAI,EAAE,SAAS,KAAA,CAAM,IAAA,OAAW,EAAE,YAAA,IAAgB,YAAA,CAAa,IAAA,EAAK,CAAA,EAAI;AACtE,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,kCAAA,EAAoC,OAAO,CAAA;AAAA,MACjF;AAEA,MAAA,MAAM,aAAa,QAAA,CAAS,MAAA,EAAQ,YAAY,CAAA,IAAK,QAAA,CAAS,QAAQ,SAAS,CAAA;AAC/E,MAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAC1C,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,kBAAA,EAAoB,YAAY,CAAA;AAAA,MACtE;AACA,MAAA;AAAA,IACF;AAAA,IAEA,KAAK,qBAAA,EAAuB;AAC1B,MAAA,0BAAA,CAA2B,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAA;AACvD,MAAA,IAAI,CAAC,iBAAA,CAAkB,MAAA,EAAQ,OAAO,CAAA,EAAG;AACvC,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,eAAA,EAAiB,OAAO,CAAA;AAAA,MAC9D;AACA,MAAA,MAAM,UAAA,GAAa,QAAA,CAAS,MAAA,EAAQ,YAAY,CAAA;AAChD,MAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAC1C,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,kBAAA,EAAoB,YAAY,CAAA;AAAA,MACtE;AACA,MAAA;AAAA,IACF;AAAA,IAEA,KAAK,MAAA;AACH,MAAA,IAAI,CAAC,iBAAA,CAAkB,MAAA,EAAQ,QAAQ,CAAA,EAAG;AACxC,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,eAAA,EAAiB,QAAQ,CAAA;AAAA,MAC/D;AACA,MAAA;AAAA,IAEF,KAAK,YAAA;AACH,MAAA,IAAI,CAAC,iBAAA,CAAkB,MAAA,EAAQ,SAAS,CAAA,EAAG;AACzC,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,eAAA,EAAiB,SAAS,CAAA;AAAA,MAChE;AACA,MAAA,IAAI,CAAC,iBAAA,CAAkB,MAAA,EAAQ,QAAQ,CAAA,EAAG;AACxC,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,eAAA,EAAiB,QAAQ,CAAA;AAAA,MAC/D;AACA,MAAA;AAAA,IAEF,KAAK,gBAAA;AACH,MAAA,IAAI,CAAC,iBAAA,CAAkB,MAAA,EAAQ,UAAU,CAAA,EAAG;AAC1C,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,eAAA,EAAiB,UAAU,CAAA;AAAA,MACjE;AACA,MAAA,IAAI,UAAU,MAAA,IAAU,SAAA,CAAU,MAAA,EAAQ,MAAM,MAAM,MAAA,EAAW;AAC/D,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,mBAAA,EAAqB,MAAM,CAAA;AAAA,MACjE;AACA,MAAA,IAAI,yBAAyB,MAAA,IAAU,SAAA,CAAU,MAAA,EAAQ,qBAAqB,MAAM,MAAA,EAAW;AAC7F,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,mBAAA,EAAqB,qBAAqB,CAAA;AAAA,MAChF;AACA,MAAA;AAAA,IAEF,KAAK,oBAAA,EAAsB;AACzB,MAAA,MAAM,cAAA,GAAiB,SAAA,CAAU,MAAA,EAAQ,gBAAgB,CAAA;AACzD,MAAA,IAAI,cAAA,IAAkB,CAAC,CAAC,MAAA,EAAQ,SAAS,YAAY,CAAA,CAAE,QAAA,CAAS,cAAc,CAAA,EAAG;AAC/E,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,4BAAA,EAA8B,gBAAgB,CAAA;AAAA,MACpF;AACA,MAAA;AAAA,IACF;AAAA,IAEA,KAAK,aAAA;AACH,MAAA,IAAI,CAAC,iBAAA,CAAkB,MAAA,EAAQ,KAAK,CAAA,EAAG;AACrC,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,eAAA,EAAiB,KAAK,CAAA;AAAA,MAC5D;AACA,MAAA;AAAA,IAEF,KAAK,oBAAA;AAIH,MAAA,IAAI,CAAC,iBAAA,CAAkB,MAAA,EAAQ,UAAU,CAAA,EAAG;AAC1C,QAAA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,eAAA,EAAiB,UAAU,CAAA;AAAA,MACjE;AACA,MAAA;AAAA,IAEF;AACE,MAAA,aAAA,CAAc,QAAQ,IAAA,EAAM,MAAA,EAAQ,oBAAoB,MAAA,EAAW,EAAE,UAAU,CAAA;AAC/E,MAAA;AAAA;AAGJ,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,wBAAA,CAAyB,KAAA,EAAsB,OAAA,GAA6B,EAAC,EAA0B;AACrH,EAAA,OAAO,KAAA,CAAM,MAAM,OAAA,CAAQ,CAAC,SAAS,kBAAA,CAAmB,IAAA,EAAM,OAAO,CAAC,CAAA;AACxE;AAEO,SAAS,qBAAA,CAAsB,KAAA,EAAsB,OAAA,GAA6B,EAAC,EAAqB;AAC7G,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AACvB,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAA0B;AAE9C,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,IAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,IAAI,CAAA;AAAA,EAC3B;AAEA,EAAA,MAAM,UAAA,GAAa,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,OAAO,CAAA;AACrE,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,SAAA,CAAU,MAAA,EAAQ,QAAQ,gBAAgB,CAAA;AAAA,EAC5C;AAEA,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,IAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,EAAG;AAC7B,MAAA,SAAA,CAAU,MAAA,EAAQ,MAAA,EAAQ,qBAAA,EAAuB,EAAE,MAAA,EAAQ,KAAK,EAAA,EAAI,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAA,IAC3F;AACA,IAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,EAAG;AAC7B,MAAA,SAAA,CAAU,MAAA,EAAQ,MAAA,EAAQ,qBAAA,EAAuB,EAAE,MAAA,EAAQ,KAAK,EAAA,EAAI,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAA,IAC3F;AAAA,EACF;AAEA,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAY;AACzC,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,IAAA,gBAAA,CAAiB,GAAA,CAAI,KAAK,MAAM,CAAA;AAChC,IAAA,gBAAA,CAAiB,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,EAClC;AAEA,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,CAAC,gBAAA,CAAiB,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG;AAClC,MAAA,SAAA,CAAU,MAAA,EAAQ,QAAQ,kBAAA,EAAoB;AAAA,QAC5C,KAAA,EAAO,IAAA,CAAK,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,EAAA;AAAA,QAC/B,UAAU,IAAA,CAAK;AAAA,OAChB,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAC1C,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAC1C,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,UAAA,EAAY;AAEhC,IAAA,IAAI,UAAA,CAAW,IAAA,KAAS,MAAA,IAAU,UAAA,CAAW,SAAS,OAAA,EAAS;AAC7D,MAAA,SAAA,CAAU,MAAA,EAAQ,QAAQ,sBAAA,EAAwB;AAAA,QAChD,KAAA,EAAO,UAAA,CAAW,IAAA,CAAK,KAAA,IAAS,UAAA,CAAW,EAAA;AAAA,QAC3C,YAAY,UAAA,CAAW;AAAA,OACxB,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,MAAM,CAAA;AACnE,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,MAAM,aAAA,GAAgB,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,KAAW,QAAA,CAAS,EAAE,CAAA;AAC9E,IAAA,MAAM,cAAA,GAAiB,aAAA,CAAc,IAAA,CAAK,CAAC,IAAA,KAAS,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,EAAG,IAAA,KAAS,OAAO,CAAA;AAC9F,IAAA,IAAI,aAAA,CAAc,MAAA,KAAW,CAAA,IAAK,CAAC,cAAA,EAAgB;AACjD,MAAA,SAAA,CAAU,MAAA,EAAQ,QAAQ,mBAAA,EAAqB;AAAA,QAC7C,KAAA,EAAO,QAAA,CAAS,IAAA,CAAK,KAAA,IAAS,QAAA,CAAS;AAAA,OACxC,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,MAAM,aAAa,WAAA,CAAY,UAAA,EAAY,KAAA,CAAM,KAAA,EAAO,SAAS,MAAM,CAAA;AACvE,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAA,CAAO,KAAK,UAAU,CAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,OAAO,CAAA;AACrE,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,SAAA,CAAU,MAAA,EAAQ,QAAQ,0BAA0B,CAAA;AAAA,EACtD;AAEA,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,KAAK,CAAA;AACjE,EAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,IAAA,SAAA,CAAU,MAAA,EAAQ,QAAQ,wBAAwB,CAAA;AAAA,EACpD;AAEA,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,MAAM,aAAA,GAAgB,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,KAAW,SAAA,CAAU,EAAE,CAAA;AAC/E,IAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,MAAA,SAAA,CAAU,MAAA,EAAQ,QAAQ,wBAAwB,CAAA;AAAA,IACpD;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,aAAA,GAAgB,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,KAAW,OAAA,CAAQ,EAAE,CAAA;AAC7E,IAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,MAAA,SAAA,CAAU,MAAA,EAAQ,QAAQ,sBAAsB,CAAA;AAAA,IAClD;AAAA,EACF;AAEA,EAAA,MAAM,cAAA,GAAiB,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,WAAW,CAAA;AAC7E,EAAA,KAAA,MAAW,iBAAiB,cAAA,EAAgB;AAC1C,IAAA,MAAM,aAAA,GAAgB,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,KAAW,aAAA,CAAc,EAAE,CAAA;AACnF,IAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,MAAA,SAAA,CAAU,MAAA,EAAQ,QAAQ,2BAA2B,CAAA;AAAA,IACvD;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,wBAAA,CAAyB,KAAA,EAAO,OAAO,CAAA;AAC1D,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,GAAG,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU,MAAM,OAAO,CAAA;AAAA,IACtC,GAAG,WAAW,GAAA,CAAI,CAAC,UAAU,eAAA,CAAgB,KAAA,EAAO,OAAO,CAAC;AAAA,GAC9D;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,IACzB,MAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,qBAAA,CACd,UAAA,EACA,KAAA,EACA,OAAA,EACgB;AAChB,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAsB;AAC5C,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AAEzC,EAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,IAAA,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,EAAE,CAAA;AACzB,IAAA,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,CAAC,CAAA;AAAA,EACzB;AAEA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAC1C,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAC1C,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,UAAA,EAAY;AAEhC,IAAA,IAAI,UAAA,CAAW,IAAA,KAAS,OAAA,IAAW,UAAA,CAAW,SAAS,OAAA,EAAS;AAC9D,MAAA,SAAA,CAAU,IAAI,IAAA,CAAK,MAAM,CAAA,EAAG,IAAA,CAAK,KAAK,MAAM,CAAA;AAC5C,MAAA,QAAA,CAAS,GAAA,CAAI,KAAK,MAAA,EAAA,CAAS,QAAA,CAAS,IAAI,IAAA,CAAK,MAAM,CAAA,IAAK,CAAA,IAAK,CAAC,CAAA;AAAA,IAChE;AAAA,EACF;AAEA,EAAA,MAAM,QAAQ,UAAA,CACX,MAAA,CAAO,CAAC,IAAA,KAAA,CAAU,SAAS,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,IAAK,OAAO,CAAC,CAAA,CACnD,IAAI,CAAC,IAAA,KAAS,KAAK,EAAE,CAAA;AAExB,EAAA,MAAM,YAAsB,EAAC;AAE7B,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,IAAA,MAAM,MAAA,GAAS,MAAM,KAAA,EAAM;AAC3B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,SAAA,CAAU,KAAK,MAAM,CAAA;AAErB,IAAA,MAAM,SAAA,GAAY,SAAA,CAAU,GAAA,CAAI,MAAM,KAAK,EAAC;AAC5C,IAAA,KAAA,MAAW,cAAc,SAAA,EAAW;AAClC,MAAA,MAAM,WAAA,GAAA,CAAe,QAAA,CAAS,GAAA,CAAI,UAAU,KAAK,CAAA,IAAK,CAAA;AACtD,MAAA,QAAA,CAAS,GAAA,CAAI,YAAY,WAAW,CAAA;AACpC,MAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,QAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,SAAA,CAAU,MAAA,KAAW,UAAA,CAAW,MAAA,EAAQ;AAC1C,IAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,EACjD;AAEA,EAAA,OAAO,SAAA,CAAU,GAAA,CAAI,CAAC,MAAA,KAAW,QAAQ,GAAA,CAAI,MAAM,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAA+B,OAAA,CAAQ,IAAI,CAAC,CAAA;AAC5G;AAEA,SAAS,WAAA,CACP,UAAA,EACA,KAAA,EACA,OAAA,EACA,MAAA,EACwB;AACxB,EAAA,IAAI;AACF,IAAA,qBAAA,CAAsB,UAAA,EAAY,OAAO,OAAO,CAAA;AAChD,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,qBAAA;AAAA,MACN,OAAA,EAAS,QAAA,CAAS,qBAAA,EAAuB,MAAA,EAAW,MAAM;AAAA,KAC5D;AAAA,EACF;AACF","file":"chunk-DJDZIRM6.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 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"]}
|