@datatechsolutions/ui 2.11.91 → 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.
Files changed (137) hide show
  1. package/dist/astrlabe/contracts.d.mts +14 -3
  2. package/dist/astrlabe/contracts.d.ts +14 -3
  3. package/dist/astrlabe/index.d.mts +9 -3
  4. package/dist/astrlabe/index.d.ts +9 -3
  5. package/dist/astrlabe/index.js +120 -116
  6. package/dist/astrlabe/index.mjs +6 -6
  7. package/dist/astrlabe/utils.d.mts +1 -1
  8. package/dist/astrlabe/utils.d.ts +1 -1
  9. package/dist/astrlabe/utils.js +9 -9
  10. package/dist/astrlabe/utils.mjs +2 -2
  11. package/dist/astrlabe/workflow-canvas.d.mts +1 -1
  12. package/dist/astrlabe/workflow-canvas.d.ts +1 -1
  13. package/dist/astrlabe/workflow-canvas.js +5 -5
  14. package/dist/astrlabe/workflow-canvas.mjs +4 -4
  15. package/dist/{chunk-MLAIUJYC.js → chunk-24QKSC74.js} +6 -6
  16. package/dist/{chunk-MLAIUJYC.js.map → chunk-24QKSC74.js.map} +1 -1
  17. package/dist/{chunk-OQDWU6AE.js → chunk-2RDGJXYZ.js} +67 -67
  18. package/dist/{chunk-OQDWU6AE.js.map → chunk-2RDGJXYZ.js.map} +1 -1
  19. package/dist/{chunk-B5NZVS4A.js → chunk-3Z366CVM.js} +69 -69
  20. package/dist/{chunk-B5NZVS4A.js.map → chunk-3Z366CVM.js.map} +1 -1
  21. package/dist/{chunk-GWRJ5L36.js → chunk-43GCSCQA.js} +12 -12
  22. package/dist/{chunk-GWRJ5L36.js.map → chunk-43GCSCQA.js.map} +1 -1
  23. package/dist/{chunk-U4BTEKZT.mjs → chunk-4TY55HGO.mjs} +3 -3
  24. package/dist/{chunk-U4BTEKZT.mjs.map → chunk-4TY55HGO.mjs.map} +1 -1
  25. package/dist/{chunk-WNCPAWLC.mjs → chunk-5W7L7BT7.mjs} +13 -2
  26. package/dist/chunk-5W7L7BT7.mjs.map +1 -0
  27. package/dist/{chunk-7JFAOHZ3.mjs → chunk-6NAZVG2O.mjs} +4 -4
  28. package/dist/{chunk-7JFAOHZ3.mjs.map → chunk-6NAZVG2O.mjs.map} +1 -1
  29. package/dist/{chunk-J4QUCX27.mjs → chunk-A3BFURJB.mjs} +24 -25
  30. package/dist/chunk-A3BFURJB.mjs.map +1 -0
  31. package/dist/{chunk-L5VEY7G4.js → chunk-ARVLVWUC.js} +7 -5
  32. package/dist/chunk-ARVLVWUC.js.map +1 -0
  33. package/dist/{chunk-BVCS7RBR.js → chunk-BUI7BCUN.js} +33 -33
  34. package/dist/{chunk-BVCS7RBR.js.map → chunk-BUI7BCUN.js.map} +1 -1
  35. package/dist/{chunk-C7BI5LQ6.js → chunk-C3H4FM4A.js} +13 -2
  36. package/dist/chunk-C3H4FM4A.js.map +1 -0
  37. package/dist/{chunk-C7KAF363.js → chunk-DB64YDV2.js} +55 -55
  38. package/dist/{chunk-C7KAF363.js.map → chunk-DB64YDV2.js.map} +1 -1
  39. package/dist/{chunk-WIKMIULO.js → chunk-DIMLLLZR.js} +36 -36
  40. package/dist/{chunk-WIKMIULO.js.map → chunk-DIMLLLZR.js.map} +1 -1
  41. package/dist/{chunk-FDSU7GPS.mjs → chunk-DWFLIXES.mjs} +3 -3
  42. package/dist/{chunk-FDSU7GPS.mjs.map → chunk-DWFLIXES.mjs.map} +1 -1
  43. package/dist/{chunk-Y4DNREFH.js → chunk-FZTOP6EE.js} +190 -132
  44. package/dist/chunk-FZTOP6EE.js.map +1 -0
  45. package/dist/{chunk-URMZJ3WF.mjs → chunk-GMZ3PTNK.mjs} +8 -8
  46. package/dist/{chunk-URMZJ3WF.mjs.map → chunk-GMZ3PTNK.mjs.map} +1 -1
  47. package/dist/{chunk-HPIKJS5B.mjs → chunk-HGN5W56D.mjs} +3 -3
  48. package/dist/{chunk-HPIKJS5B.mjs.map → chunk-HGN5W56D.mjs.map} +1 -1
  49. package/dist/{chunk-CBVRUJ7N.mjs → chunk-HUGHELRM.mjs} +65 -8
  50. package/dist/chunk-HUGHELRM.mjs.map +1 -0
  51. package/dist/{chunk-6OWD54HK.mjs → chunk-LKJZGFM4.mjs} +3 -3
  52. package/dist/{chunk-6OWD54HK.mjs.map → chunk-LKJZGFM4.mjs.map} +1 -1
  53. package/dist/{chunk-AP7OWR6S.js → chunk-MEEFOZC4.js} +4 -4
  54. package/dist/{chunk-AP7OWR6S.js.map → chunk-MEEFOZC4.js.map} +1 -1
  55. package/dist/{chunk-CG3P5Z5U.mjs → chunk-MLAXYDEU.mjs} +3 -3
  56. package/dist/{chunk-CG3P5Z5U.mjs.map → chunk-MLAXYDEU.mjs.map} +1 -1
  57. package/dist/{chunk-YMGJ4FZZ.js → chunk-NA57KK4O.js} +4 -4
  58. package/dist/{chunk-YMGJ4FZZ.js.map → chunk-NA57KK4O.js.map} +1 -1
  59. package/dist/{chunk-5UU3RQRB.js → chunk-NJS2YC3J.js} +15 -2
  60. package/dist/chunk-NJS2YC3J.js.map +1 -0
  61. package/dist/{chunk-R5KUEOPU.js → chunk-NYQAEPC7.js} +200 -74
  62. package/dist/chunk-NYQAEPC7.js.map +1 -0
  63. package/dist/{chunk-Q7WGFPGK.mjs → chunk-OLXOBT42.mjs} +4 -4
  64. package/dist/{chunk-Q7WGFPGK.mjs.map → chunk-OLXOBT42.mjs.map} +1 -1
  65. package/dist/{chunk-E32B2MVK.js → chunk-PTGPQJZJ.js} +15 -15
  66. package/dist/{chunk-E32B2MVK.js.map → chunk-PTGPQJZJ.js.map} +1 -1
  67. package/dist/{chunk-OE4Z4FKM.mjs → chunk-PU2KTO4O.mjs} +7 -5
  68. package/dist/chunk-PU2KTO4O.mjs.map +1 -0
  69. package/dist/{chunk-KHAMY7MA.mjs → chunk-RXFAQFE7.mjs} +3 -3
  70. package/dist/{chunk-KHAMY7MA.mjs.map → chunk-RXFAQFE7.mjs.map} +1 -1
  71. package/dist/{chunk-SIBJRWUB.js → chunk-SMKN4ZVB.js} +4 -4
  72. package/dist/{chunk-SIBJRWUB.js.map → chunk-SMKN4ZVB.js.map} +1 -1
  73. package/dist/{chunk-WY3YDQXK.js → chunk-ST3GH5OM.js} +26 -26
  74. package/dist/{chunk-WY3YDQXK.js.map → chunk-ST3GH5OM.js.map} +1 -1
  75. package/dist/{chunk-36G7GAPU.mjs → chunk-TEQYIK2B.mjs} +126 -8
  76. package/dist/chunk-TEQYIK2B.mjs.map +1 -0
  77. package/dist/{chunk-53SRKVKQ.mjs → chunk-U7XM3N7F.mjs} +15 -2
  78. package/dist/chunk-U7XM3N7F.mjs.map +1 -0
  79. package/dist/{chunk-E2ZGFN2H.mjs → chunk-VGSWSQQU.mjs} +4 -4
  80. package/dist/{chunk-E2ZGFN2H.mjs.map → chunk-VGSWSQQU.mjs.map} +1 -1
  81. package/dist/{chunk-SOYGVHPZ.js → chunk-XSBZNPUO.js} +53 -53
  82. package/dist/{chunk-SOYGVHPZ.js.map → chunk-XSBZNPUO.js.map} +1 -1
  83. package/dist/{chunk-IEWFVP42.mjs → chunk-Y3WJAYOY.mjs} +6 -6
  84. package/dist/{chunk-IEWFVP42.mjs.map → chunk-Y3WJAYOY.mjs.map} +1 -1
  85. package/dist/{chunk-VPNZDLR6.mjs → chunk-YEWXDCCI.mjs} +4 -4
  86. package/dist/{chunk-VPNZDLR6.mjs.map → chunk-YEWXDCCI.mjs.map} +1 -1
  87. package/dist/{chunk-256TJHVO.mjs → chunk-ZHUPYX4Q.mjs} +3 -3
  88. package/dist/{chunk-256TJHVO.mjs.map → chunk-ZHUPYX4Q.mjs.map} +1 -1
  89. package/dist/{chunk-YN4IEDE4.js → chunk-ZKUYNCAG.js} +26 -27
  90. package/dist/chunk-ZKUYNCAG.js.map +1 -0
  91. package/dist/{index-AioB90qq.d.mts → index-CoB18TbG.d.ts} +9 -2
  92. package/dist/{index-D5ai0cGZ.d.ts → index-VI9gyJXl.d.mts} +9 -2
  93. package/dist/index.js +747 -747
  94. package/dist/index.mjs +2 -2
  95. package/dist/platform/admin/index.js +11 -11
  96. package/dist/platform/admin/index.mjs +5 -5
  97. package/dist/platform/agents-workspace.js +9 -9
  98. package/dist/platform/agents-workspace.mjs +8 -8
  99. package/dist/platform/app-shell.js +4 -4
  100. package/dist/platform/app-shell.mjs +3 -3
  101. package/dist/platform/auth/index.js +28 -28
  102. package/dist/platform/auth/index.mjs +5 -5
  103. package/dist/platform/billing/index.js +4 -4
  104. package/dist/platform/billing/index.mjs +3 -3
  105. package/dist/platform/impersonation/index.js +4 -4
  106. package/dist/platform/impersonation/index.mjs +3 -3
  107. package/dist/platform/index.d.mts +1 -1
  108. package/dist/platform/index.d.ts +1 -1
  109. package/dist/platform/index.js +101 -101
  110. package/dist/platform/index.mjs +21 -21
  111. package/dist/platform/pages/index.d.mts +3 -3
  112. package/dist/platform/pages/index.d.ts +3 -3
  113. package/dist/platform/pages/index.js +198 -198
  114. package/dist/platform/pages/index.mjs +10 -10
  115. package/dist/platform/settings/index.js +8 -8
  116. package/dist/platform/settings/index.mjs +7 -7
  117. package/dist/platform/workflow-api-client.d.mts +2 -2
  118. package/dist/platform/workflow-api-client.d.ts +2 -2
  119. package/dist/platform/workflow-api-client.js +61 -61
  120. package/dist/platform/workflow-api-client.mjs +1 -1
  121. package/dist/platform/workflow-canvas-shell.js +6 -6
  122. package/dist/platform/workflow-canvas-shell.mjs +5 -5
  123. package/dist/{workflow-api-client-CXN5iaih.d.ts → workflow-api-client-DVLhcpUj.d.ts} +26 -7
  124. package/dist/{workflow-api-client-XU83zq0k.d.mts → workflow-api-client-DpBxHTHr.d.mts} +26 -7
  125. package/package.json +1 -1
  126. package/dist/chunk-36G7GAPU.mjs.map +0 -1
  127. package/dist/chunk-53SRKVKQ.mjs.map +0 -1
  128. package/dist/chunk-5UU3RQRB.js.map +0 -1
  129. package/dist/chunk-C7BI5LQ6.js.map +0 -1
  130. package/dist/chunk-CBVRUJ7N.mjs.map +0 -1
  131. package/dist/chunk-J4QUCX27.mjs.map +0 -1
  132. package/dist/chunk-L5VEY7G4.js.map +0 -1
  133. package/dist/chunk-OE4Z4FKM.mjs.map +0 -1
  134. package/dist/chunk-R5KUEOPU.js.map +0 -1
  135. package/dist/chunk-WNCPAWLC.mjs.map +0 -1
  136. package/dist/chunk-Y4DNREFH.js.map +0 -1
  137. package/dist/chunk-YN4IEDE4.js.map +0 -1
@@ -1,38 +1,38 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunk5UU3RQRB_js = require('../chunk-5UU3RQRB.js');
5
- var chunkC7BI5LQ6_js = require('../chunk-C7BI5LQ6.js');
4
+ var chunkNJS2YC3J_js = require('../chunk-NJS2YC3J.js');
5
+ var chunkC3H4FM4A_js = require('../chunk-C3H4FM4A.js');
6
6
 
7
7
 
8
8
 
9
9
  Object.defineProperty(exports, "topologicalSortAgents", {
10
10
  enumerable: true,
11
- get: function () { return chunk5UU3RQRB_js.topologicalSortAgents; }
11
+ get: function () { return chunkNJS2YC3J_js.topologicalSortAgents; }
12
12
  });
13
13
  Object.defineProperty(exports, "validateGraphNodeConfigs", {
14
14
  enumerable: true,
15
- get: function () { return chunk5UU3RQRB_js.validateGraphNodeConfigs; }
15
+ get: function () { return chunkNJS2YC3J_js.validateGraphNodeConfigs; }
16
16
  });
17
17
  Object.defineProperty(exports, "validateNodeConfig", {
18
18
  enumerable: true,
19
- get: function () { return chunk5UU3RQRB_js.validateNodeConfig; }
19
+ get: function () { return chunkNJS2YC3J_js.validateNodeConfig; }
20
20
  });
21
21
  Object.defineProperty(exports, "validateWorkflowGraph", {
22
22
  enumerable: true,
23
- get: function () { return chunk5UU3RQRB_js.validateWorkflowGraph; }
23
+ get: function () { return chunkNJS2YC3J_js.validateWorkflowGraph; }
24
24
  });
25
25
  Object.defineProperty(exports, "applyDagreLayout", {
26
26
  enumerable: true,
27
- get: function () { return chunkC7BI5LQ6_js.applyDagreLayout; }
27
+ get: function () { return chunkC3H4FM4A_js.applyDagreLayout; }
28
28
  });
29
29
  Object.defineProperty(exports, "createDefaultLogicNodeConfig", {
30
30
  enumerable: true,
31
- get: function () { return chunkC7BI5LQ6_js.createDefaultLogicNodeConfig; }
31
+ get: function () { return chunkC3H4FM4A_js.createDefaultLogicNodeConfig; }
32
32
  });
33
33
  Object.defineProperty(exports, "getAgentTier", {
34
34
  enumerable: true,
35
- get: function () { return chunkC7BI5LQ6_js.getAgentTier; }
35
+ get: function () { return chunkC3H4FM4A_js.getAgentTier; }
36
36
  });
37
37
  //# sourceMappingURL=utils.js.map
38
38
  //# sourceMappingURL=utils.js.map
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- export { topologicalSortAgents, validateGraphNodeConfigs, validateNodeConfig, validateWorkflowGraph } from '../chunk-53SRKVKQ.mjs';
3
- export { applyDagreLayout, createDefaultLogicNodeConfig, getAgentTier } from '../chunk-WNCPAWLC.mjs';
2
+ export { topologicalSortAgents, validateGraphNodeConfigs, validateNodeConfig, validateWorkflowGraph } from '../chunk-U7XM3N7F.mjs';
3
+ export { applyDagreLayout, createDefaultLogicNodeConfig, getAgentTier } from '../chunk-5W7L7BT7.mjs';
4
4
  //# sourceMappingURL=utils.mjs.map
5
5
  //# sourceMappingURL=utils.mjs.map
@@ -1,7 +1,7 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { ComponentProps } from 'react';
3
3
  import { NodeTypes } from '@xyflow/react';
4
- import { A as AgentWithPrompts, W as WorkflowEntityDefinition } from '../index-AioB90qq.mjs';
4
+ import { A as AgentWithPrompts, W as WorkflowEntityDefinition } from '../index-VI9gyJXl.mjs';
5
5
  import { AgentModel, WorkflowTool, AgentTool, AgentRule, WorkflowGraph, LogicNodeConfig } from './contracts.mjs';
6
6
 
7
7
  type AgentModalRenderProps = {
@@ -1,7 +1,7 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { ComponentProps } from 'react';
3
3
  import { NodeTypes } from '@xyflow/react';
4
- import { A as AgentWithPrompts, W as WorkflowEntityDefinition } from '../index-D5ai0cGZ.js';
4
+ import { A as AgentWithPrompts, W as WorkflowEntityDefinition } from '../index-CoB18TbG.js';
5
5
  import { AgentModel, WorkflowTool, AgentTool, AgentRule, WorkflowGraph, LogicNodeConfig } from './contracts.js';
6
6
 
7
7
  type AgentModalRenderProps = {
@@ -1,21 +1,21 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkR5KUEOPU_js = require('../chunk-R5KUEOPU.js');
5
- require('../chunk-YN4IEDE4.js');
4
+ var chunkNYQAEPC7_js = require('../chunk-NYQAEPC7.js');
5
+ require('../chunk-ZKUYNCAG.js');
6
6
  require('../chunk-UZ3CMNUJ.js');
7
7
  require('../chunk-YXN2K77G.js');
8
8
  require('../chunk-S7KHTUHA.js');
9
- require('../chunk-L5VEY7G4.js');
9
+ require('../chunk-ARVLVWUC.js');
10
10
  require('../chunk-FAGDZEKM.js');
11
11
  require('../chunk-P4YYEM4B.js');
12
- require('../chunk-C7BI5LQ6.js');
12
+ require('../chunk-C3H4FM4A.js');
13
13
 
14
14
 
15
15
 
16
16
  Object.defineProperty(exports, "Workspace", {
17
17
  enumerable: true,
18
- get: function () { return chunkR5KUEOPU_js.Workspace; }
18
+ get: function () { return chunkNYQAEPC7_js.Workspace; }
19
19
  });
20
20
  //# sourceMappingURL=workflow-canvas.js.map
21
21
  //# sourceMappingURL=workflow-canvas.js.map
@@ -1,12 +1,12 @@
1
1
  "use client";
2
- export { Workspace } from '../chunk-36G7GAPU.mjs';
3
- import '../chunk-J4QUCX27.mjs';
2
+ export { Workspace } from '../chunk-TEQYIK2B.mjs';
3
+ import '../chunk-A3BFURJB.mjs';
4
4
  import '../chunk-D2JF6C3E.mjs';
5
5
  import '../chunk-7VJ7CMMT.mjs';
6
6
  import '../chunk-QWG2FMUN.mjs';
7
- import '../chunk-OE4Z4FKM.mjs';
7
+ import '../chunk-PU2KTO4O.mjs';
8
8
  import '../chunk-SYNVNTLJ.mjs';
9
9
  import '../chunk-OZNTQROP.mjs';
10
- import '../chunk-WNCPAWLC.mjs';
10
+ import '../chunk-5W7L7BT7.mjs';
11
11
  //# sourceMappingURL=workflow-canvas.mjs.map
12
12
  //# sourceMappingURL=workflow-canvas.mjs.map
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkYN4IEDE4_js = require('./chunk-YN4IEDE4.js');
4
+ var chunkZKUYNCAG_js = require('./chunk-ZKUYNCAG.js');
5
5
  var chunkYXN2K77G_js = require('./chunk-YXN2K77G.js');
6
6
  var chunkS7KHTUHA_js = require('./chunk-S7KHTUHA.js');
7
7
  var react = require('react');
@@ -34,7 +34,7 @@ function usePlatformState() {
34
34
  }
35
35
  function resolveFlag(locale) {
36
36
  const code = locale === "pt-BR" ? "br" : locale;
37
- return chunkYN4IEDE4_js.LOCALE_FLAGS?.[code];
37
+ return chunkZKUYNCAG_js.LOCALE_FLAGS?.[code];
38
38
  }
39
39
  function PlatformAppShell({
40
40
  appName,
@@ -55,7 +55,7 @@ function PlatformAppShell({
55
55
  const { resolvedTheme, setTheme, dockPosition, dockAutoHide, dockEnabled } = client.usePlatformPreferences();
56
56
  const pathname = chunkS7KHTUHA_js.usePathname();
57
57
  const router = chunkS7KHTUHA_js.useRouter();
58
- const { history, openHistory } = chunkYN4IEDE4_js.useNotifications();
58
+ const { history, openHistory } = chunkZKUYNCAG_js.useNotifications();
59
59
  const currentLocale = chunkYXN2K77G_js.useLocale();
60
60
  const localeMeta = i18n.LANGUAGE_META[currentLocale];
61
61
  const items = react.useMemo(() => navigationItems.filter((item) => {
@@ -83,7 +83,7 @@ function PlatformAppShell({
83
83
  organizationId: user.organizationId ?? null
84
84
  } : null;
85
85
  return /* @__PURE__ */ jsxRuntime.jsx(
86
- chunkYN4IEDE4_js.PlatformShell,
86
+ chunkZKUYNCAG_js.PlatformShell,
87
87
  {
88
88
  items,
89
89
  launchpadPageOrder: pageOrder,
@@ -128,5 +128,5 @@ function PlatformAppShell({
128
128
  exports.PlatformAppShell = PlatformAppShell;
129
129
  exports.PlatformStateProvider = PlatformStateProvider;
130
130
  exports.usePlatformState = usePlatformState;
131
- //# sourceMappingURL=chunk-MLAIUJYC.js.map
132
- //# sourceMappingURL=chunk-MLAIUJYC.js.map
131
+ //# sourceMappingURL=chunk-24QKSC74.js.map
132
+ //# sourceMappingURL=chunk-24QKSC74.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/platform/platform-state-provider.tsx","../src/platform/app-shell.tsx"],"names":["createContext","useAuth","useMemo","useContext","LOCALE_FLAGS","useTranslations","usePlatformPreferences","usePathname","useRouter","useNotifications","useLocale","LANGUAGE_META","useCallback","jsx","PlatformShell","RectangleStackIcon","HomeIcon"],"mappings":";;;;;;;;;;;AAQA,IAAM,oBAAA,GAAuBA,oBAAoC,IAAI,CAAA;AAa9D,SAAS,qBAAA,CAAsB,EAAE,QAAA,EAAU,aAAA,EAAc,EAA+B;AAC7F,EAAA,MAAM,EAAE,IAAA,EAAK,GAAIC,cAAA,EAAQ;AAEzB,EAAA,MAAM,KAAA,GAAQC,cAAuB,MAAM;AACzC,IAAA,MAAM,cAAA,GAAiB,MAAM,cAAA,IAAkB,EAAA;AAE/C,IAAA,MAAM,QAAyB,IAAA,GAC3B;AAAA,MACA,GAAG,IAAA;AAAA,MACH,IAAA,EAAM,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AAAA,MAC7B;AAAA,KACF,GACE,IAAA;AAEJ,IAAA,OAAO;AAAA,MACL,qBAAA,EAAuB,cAAA;AAAA,MACvB;AAAA,KACF;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,aAAa,CAAC,CAAA;AAExB,EAAA,sCACG,oBAAA,CAAqB,QAAA,EAArB,EAA8B,KAAA,EAAO,OACnC,QAAA,EACH,CAAA;AAEJ;AAEO,SAAS,gBAAA,GAAmB;AACjC,EAAA,MAAM,OAAA,GAAUC,iBAAW,oBAAoB,CAAA;AAC/C,EAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,MAAM,4DAA4D,CAAA;AAC1F,EAAA,OAAO,OAAA;AACT;ACtCA,SAAS,YAAY,MAAA,EAAoC;AACvD,EAAA,MAAM,IAAA,GAAO,MAAA,KAAW,OAAA,GAAU,IAAA,GAAO,MAAA;AACzC,EAAA,OAAOC,gCAAe,IAAiC,CAAA;AACzD;AAoDO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,OAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,OAAA,GAAUC,iCAAgB,QAAQ,CAAA;AACxC,EAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,KAAWJ,cAAAA,EAAQ;AAGzC,EAAA,gBAAA,EAAiB;AACjB,EAAA,MAAM,EAAE,aAAA,EAAe,QAAA,EAAU,cAAc,YAAA,EAAc,WAAA,KAAgBK,6BAAA,EAAuB;AACpG,EAAA,MAAM,WAAWC,4BAAA,EAAY;AAC7B,EAAA,MAAM,SAASC,0BAAA,EAAU;AACzB,EAAA,MAAM,EAAE,OAAA,EAAS,WAAA,EAAY,GAAIC,iCAAA,EAAiB;AAClD,EAAA,MAAM,gBAAgBC,0BAAA,EAAU;AAChC,EAAA,MAAM,UAAA,GAAaC,mBAAc,aAA2C,CAAA;AAE5E,EAAA,MAAM,QAAQT,aAAAA,CAAQ,MAAM,eAAA,CAAgB,MAAA,CAAO,CAAC,IAAA,KAAS;AAC3D,IAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,IAAA,CAAK,EAAE,CAAA;AAC5C,IAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AACxB,IAAA,OAAO,cAAc,UAAU,CAAA;AAAA,EACjC,CAAC,CAAA,EAAG,CAAC,eAAA,EAAiB,iBAAA,EAAmB,aAAa,CAAC,CAAA;AAEvD,EAAA,MAAM,aAAA,GAAgBU,kBAAY,MAAM;AAAE,IAAA,KAAK,OAAO,QAAQ,CAAA;AAAA,EAAE,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAC3E,EAAA,MAAM,iBAAA,GAAoBA,iBAAA;AAAA,IACxB,MAAM;AAAE,MAAA,QAAA,CAAS,aAAA,KAAkB,MAAA,GAAS,OAAA,GAAU,MAAM,CAAA;AAAA,IAAE,CAAA;AAAA,IAC9D,CAAC,eAAe,QAAQ;AAAA,GAC1B;AACA,EAAA,MAAM,cAAA,GAAiBA,iBAAA,CAAY,CAAC,IAAA,KAAiB,MAAA,CAAO,KAAK,IAAI,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAChF,EAAA,MAAM,cAAA,GAAiBA,iBAAA,CAAY,CAAC,IAAA,KAAiB,MAAA,CAAO,SAAS,IAAI,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEpF,EAAA,MAAM,YAAY,IAAA,GACd;AAAA,IACA,IAAA,EAAM,KAAK,IAAA,IAAQ,IAAA;AAAA,IACnB,KAAA,EAAO,KAAK,KAAA,IAAS,IAAA;AAAA,IACrB,KAAA,EAAO,KAAK,KAAA,IAAS,IAAA;AAAA,IACrB,IAAA,EAAM,KAAK,IAAA,IAAQ,IAAA;AAAA,IACnB,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,cAAA,EAAgB,KAAK,cAAA,IAAkB;AAAA,GACzC,GACE,IAAA;AAEJ,EAAA,uBACEC,cAAAA;AAAA,IAACC,8BAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,kBAAA,EAAoB,SAAA;AAAA,MACpB,IAAA,EAAM,SAAA;AAAA,MACN,UAAA,EAAY,MAAA;AAAA,MACZ,SAAA,EAAW,aAAA;AAAA,MACX,YAAA;AAAA,MACA,YAAA;AAAA,MACA,WAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA,EAAe,iBAAA;AAAA,MACf,QAAA;AAAA,MACA,UAAA,EAAY,cAAA;AAAA,MACZ,UAAA,EAAY,cAAA;AAAA,MACZ,OAAA;AAAA,MACA,SAAS,OAAA,oBAAWD,cAAAA,CAACE,0BAAA,EAAA,EAAmB,WAAU,eAAA,EAAgB,CAAA;AAAA,MAClE,OAAA;AAAA,MACA,WAAA;AAAA,MACA,eAAe,aAAA,IAAiBC,gBAAA;AAAA,MAChC,mBAAmB,OAAA,CAAQ,MAAA;AAAA,MAC3B,eAAA,EAAiB,WAAA;AAAA,MACjB,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,QAAQ,MAAM,CAAA;AAAA,QACpB,OAAA,EAAS,QAAQ,SAAS,CAAA;AAAA,QAC1B,OAAA,EAAS,QAAQ,SAAS,CAAA;AAAA,QAC1B,mBAAA,EAAqB,QAAQ,qBAAqB,CAAA;AAAA,QAClD,MAAA,EAAQ,QAAQ,QAAQ,CAAA;AAAA,QACxB,aAAA,EAAe,QAAQ,eAAe,CAAA;AAAA,QACtC,KAAA,EAAO,QAAQ,OAAO,CAAA;AAAA,QACtB,cAAc,aAAA,KAAkB,MAAA,GAAS,QAAQ,UAAU,CAAA,GAAI,QAAQ,WAAW,CAAA;AAAA,QAClF,QAAA,EAAU,QAAQ,UAAU,CAAA;AAAA,QAC5B,aAAA,EAAe,YAAY,UAAA,IAAc,aAAA;AAAA,QACzC,UAAA,EAAY,YAAY,aAAa,CAAA;AAAA,QACrC,OAAA,EAAS,QAAQ,SAAS;AAAA,OAC5B;AAAA,MACC,GAAI,aAAA,GAAgB,EAAE,aAAA,EAAe,aAAA,KAAkB,EAAC;AAAA,MAExD;AAAA;AAAA,GACH;AAEJ","file":"chunk-MLAIUJYC.js","sourcesContent":["import { createContext, useContext, useMemo, type ReactNode } from 'react'\nimport { useAuth, type AuthUser } from '@datatechsolutions/windsock/client'\n\ntype PlatformState = {\n currentOrganizationId: string\n actor: AuthUser | null\n}\n\nconst PlatformStateContext = createContext<PlatformState | null>(null)\n\nexport type PlatformStateProviderProps = {\n children: ReactNode\n /**\n * Function that converts a JWT role claim to the app's canonical role\n * union (the same `normalizePlatformRole` produced by\n * `createPlatformRbac()` in this app). Lifted out as a prop because\n * each consuming app uses its own role enum.\n */\n normalizeRole: (input: unknown) => string\n}\n\nexport function PlatformStateProvider({ children, normalizeRole }: PlatformStateProviderProps) {\n const { user } = useAuth()\n\n const state = useMemo<PlatformState>(() => {\n const organizationId = user?.organizationId ?? ''\n\n const actor: AuthUser | null = user\n ? {\n ...user,\n role: normalizeRole(user.role),\n organizationId,\n }\n : null\n\n return {\n currentOrganizationId: organizationId,\n actor,\n }\n }, [user, normalizeRole])\n\n return (\n <PlatformStateContext.Provider value={state}>\n {children}\n </PlatformStateContext.Provider>\n )\n}\n\nexport function usePlatformState() {\n const context = useContext(PlatformStateContext)\n if (!context) throw new Error('usePlatformState must be used inside PlatformStateProvider')\n return context\n}\n","import { useCallback, useMemo, type ComponentType, type ReactNode } from 'react'\nimport { RectangleStackIcon, HomeIcon } from '@heroicons/react/24/outline'\nimport { useAuth, usePlatformPreferences } from '@datatechsolutions/windsock/client'\nimport { LANGUAGE_META } from '@datatechsolutions/shared-domain/i18n'\nimport {\n PlatformShell,\n type NavigationItem,\n} from '@ui/index'\nimport { useNotifications } from '@ui/components/notifications'\nimport { useLocale, useTranslations } from '@ui/lib/i18n-context'\nimport { usePathname, useRouter } from '@ui/lib/router-context'\nimport { LOCALE_FLAGS } from '@ui/lib/locale-flags'\nimport { usePlatformState } from './platform-state-provider'\n\nfunction resolveFlag(locale: string): string | undefined {\n const code = locale === 'pt-BR' ? 'br' : locale\n return LOCALE_FLAGS?.[code as keyof typeof LOCALE_FLAGS]\n}\n\nexport type PlatformAppShellProps = {\n /** App display name (e.g. \"Astrlabe\"). */\n appName: string\n /** Tailwind gradient classes for the shell branding (e.g. \"from-sky-500 to-indigo-600\"). */\n appGradient: string\n /** Branded logo node rendered inside the flyout trigger. */\n appLogo: ReactNode\n /**\n * Optional app icon for the branded loader (defaults to the platform's\n * RectangleStackIcon if omitted).\n */\n appIcon?: ReactNode\n /**\n * Optional override for the dock dashboard icon (defaults to HomeIcon).\n */\n dashboardIcon?: ComponentType<{ className?: string }>\n\n /** App-specific navigation items already pre-translated. */\n navigationItems: NavigationItem[]\n /** Custom ordering of launchpad page tiles. */\n pageOrder: string[]\n /**\n * Map of navigation/module ID → required permission name. The shell\n * filters `navigationItems` so that any item whose ID has an entry here\n * is hidden unless `hasPermission` returns true for the listed permission.\n */\n modulePermissions: Record<string, string>\n /**\n * Permission predicate, typically `(p) => can(actor, p)` from each app's\n * `createPlatformRbac()` factory.\n */\n hasPermission: (permission: string) => boolean\n\n /**\n * Optional settings/profile drawer content (e.g. an app-specific\n * `<SettingsModal>`). Receives the open state + close handler the shell\n * manages internally so the drawer renders inside the shell chrome.\n */\n settingsModal?: (props: { open: boolean; onClose: () => void }) => ReactNode\n\n children: ReactNode\n}\n\n/**\n * Cross-app platform shell — wires `<PlatformShell>` from ui to windsock's\n * auth + preferences hooks and to ui's i18n/router contexts. Each app\n * passes its own logo, gradient, navigation, and permission predicate; the\n * rest of the chrome (header, dock, flyout, sign-out confirm modal) is\n * shared.\n */\nexport function PlatformAppShell({\n appName,\n appGradient,\n appLogo,\n appIcon,\n dashboardIcon,\n navigationItems,\n pageOrder,\n modulePermissions,\n hasPermission,\n settingsModal,\n children,\n}: PlatformAppShellProps) {\n const tCommon = useTranslations('common')\n const { user, status, logout } = useAuth()\n // Validate the platform-state provider is mounted above this shell;\n // the actor itself isn't read here, but the same provider feeds children.\n usePlatformState()\n const { resolvedTheme, setTheme, dockPosition, dockAutoHide, dockEnabled } = usePlatformPreferences()\n const pathname = usePathname()\n const router = useRouter()\n const { history, openHistory } = useNotifications()\n const currentLocale = useLocale()\n const localeMeta = LANGUAGE_META[currentLocale as keyof typeof LANGUAGE_META]\n\n const items = useMemo(() => navigationItems.filter((item) => {\n const permission = modulePermissions[item.id]\n if (!permission) return true\n return hasPermission(permission)\n }), [navigationItems, modulePermissions, hasPermission])\n\n const handleSignOut = useCallback(() => { void logout('/login') }, [logout])\n const handleToggleTheme = useCallback(\n () => { setTheme(resolvedTheme === 'dark' ? 'light' : 'dark') },\n [resolvedTheme, setTheme],\n )\n const handleNavigate = useCallback((href: string) => router.push(href), [router])\n const handlePrefetch = useCallback((href: string) => router.prefetch(href), [router])\n\n const shellUser = user\n ? {\n name: user.name ?? null,\n email: user.email ?? null,\n image: user.image ?? null,\n role: user.role ?? null,\n permissions: user.permissions as string[] | undefined,\n organizationId: user.organizationId ?? null,\n }\n : null\n\n return (\n <PlatformShell\n items={items}\n launchpadPageOrder={pageOrder}\n user={shellUser}\n authStatus={status}\n onSignOut={handleSignOut}\n dockPosition={dockPosition}\n dockAutoHide={dockAutoHide}\n dockEnabled={dockEnabled}\n resolvedTheme={resolvedTheme}\n onToggleTheme={handleToggleTheme}\n pathname={pathname}\n onNavigate={handleNavigate}\n onPrefetch={handlePrefetch}\n appName={appName}\n appIcon={appIcon ?? <RectangleStackIcon className=\"h-full w-full\" />}\n appLogo={appLogo}\n appGradient={appGradient}\n dashboardIcon={dashboardIcon ?? HomeIcon}\n notificationCount={history.length}\n onNotifications={openHistory}\n labels={{\n home: tCommon('home'),\n profile: tCommon('profile'),\n signOut: tCommon('signOut'),\n signOutConfirmTitle: tCommon('signOutConfirmTitle'),\n cancel: tCommon('cancel'),\n notifications: tCommon('notifications'),\n theme: tCommon('theme'),\n currentTheme: resolvedTheme === 'dark' ? tCommon('darkMode') : tCommon('lightMode'),\n language: tCommon('language'),\n currentLocale: localeMeta?.nativeName ?? currentLocale,\n localeFlag: resolveFlag(currentLocale),\n actions: tCommon('actions'),\n }}\n {...(settingsModal ? { profileDrawer: settingsModal } : {})}\n >\n {children}\n </PlatformShell>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/platform/platform-state-provider.tsx","../src/platform/app-shell.tsx"],"names":["createContext","useAuth","useMemo","useContext","LOCALE_FLAGS","useTranslations","usePlatformPreferences","usePathname","useRouter","useNotifications","useLocale","LANGUAGE_META","useCallback","jsx","PlatformShell","RectangleStackIcon","HomeIcon"],"mappings":"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","file":"chunk-24QKSC74.js","sourcesContent":["import { createContext, useContext, useMemo, type ReactNode } from 'react'\nimport { useAuth, type AuthUser } from '@datatechsolutions/windsock/client'\n\ntype PlatformState = {\n currentOrganizationId: string\n actor: AuthUser | null\n}\n\nconst PlatformStateContext = createContext<PlatformState | null>(null)\n\nexport type PlatformStateProviderProps = {\n children: ReactNode\n /**\n * Function that converts a JWT role claim to the app's canonical role\n * union (the same `normalizePlatformRole` produced by\n * `createPlatformRbac()` in this app). Lifted out as a prop because\n * each consuming app uses its own role enum.\n */\n normalizeRole: (input: unknown) => string\n}\n\nexport function PlatformStateProvider({ children, normalizeRole }: PlatformStateProviderProps) {\n const { user } = useAuth()\n\n const state = useMemo<PlatformState>(() => {\n const organizationId = user?.organizationId ?? ''\n\n const actor: AuthUser | null = user\n ? {\n ...user,\n role: normalizeRole(user.role),\n organizationId,\n }\n : null\n\n return {\n currentOrganizationId: organizationId,\n actor,\n }\n }, [user, normalizeRole])\n\n return (\n <PlatformStateContext.Provider value={state}>\n {children}\n </PlatformStateContext.Provider>\n )\n}\n\nexport function usePlatformState() {\n const context = useContext(PlatformStateContext)\n if (!context) throw new Error('usePlatformState must be used inside PlatformStateProvider')\n return context\n}\n","import { useCallback, useMemo, type ComponentType, type ReactNode } from 'react'\nimport { RectangleStackIcon, HomeIcon } from '@heroicons/react/24/outline'\nimport { useAuth, usePlatformPreferences } from '@datatechsolutions/windsock/client'\nimport { LANGUAGE_META } from '@datatechsolutions/shared-domain/i18n'\nimport {\n PlatformShell,\n type NavigationItem,\n} from '@ui/index'\nimport { useNotifications } from '@ui/components/notifications'\nimport { useLocale, useTranslations } from '@ui/lib/i18n-context'\nimport { usePathname, useRouter } from '@ui/lib/router-context'\nimport { LOCALE_FLAGS } from '@ui/lib/locale-flags'\nimport { usePlatformState } from './platform-state-provider'\n\nfunction resolveFlag(locale: string): string | undefined {\n const code = locale === 'pt-BR' ? 'br' : locale\n return LOCALE_FLAGS?.[code as keyof typeof LOCALE_FLAGS]\n}\n\nexport type PlatformAppShellProps = {\n /** App display name (e.g. \"Astrlabe\"). */\n appName: string\n /** Tailwind gradient classes for the shell branding (e.g. \"from-sky-500 to-indigo-600\"). */\n appGradient: string\n /** Branded logo node rendered inside the flyout trigger. */\n appLogo: ReactNode\n /**\n * Optional app icon for the branded loader (defaults to the platform's\n * RectangleStackIcon if omitted).\n */\n appIcon?: ReactNode\n /**\n * Optional override for the dock dashboard icon (defaults to HomeIcon).\n */\n dashboardIcon?: ComponentType<{ className?: string }>\n\n /** App-specific navigation items already pre-translated. */\n navigationItems: NavigationItem[]\n /** Custom ordering of launchpad page tiles. */\n pageOrder: string[]\n /**\n * Map of navigation/module ID → required permission name. The shell\n * filters `navigationItems` so that any item whose ID has an entry here\n * is hidden unless `hasPermission` returns true for the listed permission.\n */\n modulePermissions: Record<string, string>\n /**\n * Permission predicate, typically `(p) => can(actor, p)` from each app's\n * `createPlatformRbac()` factory.\n */\n hasPermission: (permission: string) => boolean\n\n /**\n * Optional settings/profile drawer content (e.g. an app-specific\n * `<SettingsModal>`). Receives the open state + close handler the shell\n * manages internally so the drawer renders inside the shell chrome.\n */\n settingsModal?: (props: { open: boolean; onClose: () => void }) => ReactNode\n\n children: ReactNode\n}\n\n/**\n * Cross-app platform shell — wires `<PlatformShell>` from ui to windsock's\n * auth + preferences hooks and to ui's i18n/router contexts. Each app\n * passes its own logo, gradient, navigation, and permission predicate; the\n * rest of the chrome (header, dock, flyout, sign-out confirm modal) is\n * shared.\n */\nexport function PlatformAppShell({\n appName,\n appGradient,\n appLogo,\n appIcon,\n dashboardIcon,\n navigationItems,\n pageOrder,\n modulePermissions,\n hasPermission,\n settingsModal,\n children,\n}: PlatformAppShellProps) {\n const tCommon = useTranslations('common')\n const { user, status, logout } = useAuth()\n // Validate the platform-state provider is mounted above this shell;\n // the actor itself isn't read here, but the same provider feeds children.\n usePlatformState()\n const { resolvedTheme, setTheme, dockPosition, dockAutoHide, dockEnabled } = usePlatformPreferences()\n const pathname = usePathname()\n const router = useRouter()\n const { history, openHistory } = useNotifications()\n const currentLocale = useLocale()\n const localeMeta = LANGUAGE_META[currentLocale as keyof typeof LANGUAGE_META]\n\n const items = useMemo(() => navigationItems.filter((item) => {\n const permission = modulePermissions[item.id]\n if (!permission) return true\n return hasPermission(permission)\n }), [navigationItems, modulePermissions, hasPermission])\n\n const handleSignOut = useCallback(() => { void logout('/login') }, [logout])\n const handleToggleTheme = useCallback(\n () => { setTheme(resolvedTheme === 'dark' ? 'light' : 'dark') },\n [resolvedTheme, setTheme],\n )\n const handleNavigate = useCallback((href: string) => router.push(href), [router])\n const handlePrefetch = useCallback((href: string) => router.prefetch(href), [router])\n\n const shellUser = user\n ? {\n name: user.name ?? null,\n email: user.email ?? null,\n image: user.image ?? null,\n role: user.role ?? null,\n permissions: user.permissions as string[] | undefined,\n organizationId: user.organizationId ?? null,\n }\n : null\n\n return (\n <PlatformShell\n items={items}\n launchpadPageOrder={pageOrder}\n user={shellUser}\n authStatus={status}\n onSignOut={handleSignOut}\n dockPosition={dockPosition}\n dockAutoHide={dockAutoHide}\n dockEnabled={dockEnabled}\n resolvedTheme={resolvedTheme}\n onToggleTheme={handleToggleTheme}\n pathname={pathname}\n onNavigate={handleNavigate}\n onPrefetch={handlePrefetch}\n appName={appName}\n appIcon={appIcon ?? <RectangleStackIcon className=\"h-full w-full\" />}\n appLogo={appLogo}\n appGradient={appGradient}\n dashboardIcon={dashboardIcon ?? HomeIcon}\n notificationCount={history.length}\n onNotifications={openHistory}\n labels={{\n home: tCommon('home'),\n profile: tCommon('profile'),\n signOut: tCommon('signOut'),\n signOutConfirmTitle: tCommon('signOutConfirmTitle'),\n cancel: tCommon('cancel'),\n notifications: tCommon('notifications'),\n theme: tCommon('theme'),\n currentTheme: resolvedTheme === 'dark' ? tCommon('darkMode') : tCommon('lightMode'),\n language: tCommon('language'),\n currentLocale: localeMeta?.nativeName ?? currentLocale,\n localeFlag: resolveFlag(currentLocale),\n actions: tCommon('actions'),\n }}\n {...(settingsModal ? { profileDrawer: settingsModal } : {})}\n >\n {children}\n </PlatformShell>\n )\n}\n"]}