@ibdop/platform-kit 1.0.11 → 1.0.13

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 (63) hide show
  1. package/README.md +0 -0
  2. package/dist/components/ErrorBoundary.d.ts +0 -0
  3. package/dist/components/ErrorBoundary.d.ts.map +0 -0
  4. package/dist/components/Notification.d.ts +0 -0
  5. package/dist/components/Notification.d.ts.map +0 -0
  6. package/dist/components/VersionInfo.d.ts +0 -0
  7. package/dist/components/VersionInfo.d.ts.map +0 -0
  8. package/dist/components/index.d.ts +0 -0
  9. package/dist/components/index.d.ts.map +0 -0
  10. package/dist/hooks/index.d.ts +3 -2
  11. package/dist/hooks/index.d.ts.map +1 -1
  12. package/dist/hooks/useApi.d.ts +22 -8
  13. package/dist/hooks/useApi.d.ts.map +1 -1
  14. package/dist/hooks/useFeatures.d.ts +0 -0
  15. package/dist/hooks/useFeatures.d.ts.map +0 -0
  16. package/dist/hooks/useInfoData.d.ts +0 -0
  17. package/dist/hooks/useInfoData.d.ts.map +0 -0
  18. package/dist/hooks/usePermissions.d.ts +0 -0
  19. package/dist/hooks/usePermissions.d.ts.map +0 -0
  20. package/dist/hooks/useShellAuth.d.ts +2 -5
  21. package/dist/hooks/useShellAuth.d.ts.map +1 -1
  22. package/dist/hooks/useV1Config.d.ts +0 -0
  23. package/dist/hooks/useV1Config.d.ts.map +0 -0
  24. package/dist/index.d.ts +0 -0
  25. package/dist/index.d.ts.map +0 -0
  26. package/dist/index.js +10 -10
  27. package/dist/index.mjs +931 -866
  28. package/dist/index.umd.js +10 -10
  29. package/dist/services/api.d.ts +2 -0
  30. package/dist/services/api.d.ts.map +1 -1
  31. package/dist/services/index.d.ts +0 -0
  32. package/dist/services/index.d.ts.map +0 -0
  33. package/dist/services/logger.d.ts +0 -0
  34. package/dist/services/logger.d.ts.map +0 -0
  35. package/dist/types/index.d.ts +0 -23
  36. package/dist/types/index.d.ts.map +1 -1
  37. package/dist/utils/index.d.ts +1 -0
  38. package/dist/utils/index.d.ts.map +1 -1
  39. package/dist/utils/mfeName.d.ts +0 -0
  40. package/dist/utils/mfeName.d.ts.map +0 -0
  41. package/dist/utils/shellAuth.d.ts +44 -0
  42. package/dist/utils/shellAuth.d.ts.map +1 -0
  43. package/package.json +3 -5
  44. package/src/components/ErrorBoundary.tsx +0 -0
  45. package/src/components/Notification.tsx +0 -0
  46. package/src/components/VersionInfo.tsx +0 -0
  47. package/src/components/index.ts +0 -0
  48. package/src/global.d.ts +0 -0
  49. package/src/hooks/index.ts +3 -2
  50. package/src/hooks/useApi.ts +114 -47
  51. package/src/hooks/useFeatures.ts +0 -0
  52. package/src/hooks/useInfoData.ts +0 -0
  53. package/src/hooks/usePermissions.ts +0 -0
  54. package/src/hooks/useShellAuth.ts +6 -26
  55. package/src/hooks/useV1Config.ts +0 -0
  56. package/src/index.ts +0 -0
  57. package/src/services/api.ts +47 -44
  58. package/src/services/index.ts +0 -0
  59. package/src/services/logger.ts +0 -0
  60. package/src/types/index.ts +1 -24
  61. package/src/utils/index.ts +10 -0
  62. package/src/utils/mfeName.ts +0 -0
  63. package/src/utils/shellAuth.ts +107 -0
package/README.md CHANGED
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -1,10 +1,11 @@
1
1
  /**
2
2
  * Hooks barrel export
3
3
  */
4
- export { useShellAuth, getAuth } from './useShellAuth';
4
+ export { useShellAuth, getShellAuth } from './useShellAuth';
5
5
  export { useInfoData } from './useInfoData';
6
6
  export { useV1Config } from './useV1Config';
7
- export { useApi } from './useApi';
7
+ export { useApi, useGet, usePost, usePut, useDel } from './useApi';
8
+ export type { UseApiConfig, UseApiResult, UseGetConfig } from './useApi';
8
9
  export { usePermissions } from './usePermissions';
9
10
  export { useFeatures, useFeatureAdmin, useMicrofrontendsFeatures, } from './useFeatures';
10
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAEtD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE3C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE3C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEjC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD,OAAO,EACL,WAAW,EACX,eAAe,EACf,yBAAyB,GAC1B,MAAM,eAAe,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE3D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE3C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE3C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAClE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAExE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD,OAAO,EACL,WAAW,EACX,eAAe,EACf,yBAAyB,GAC1B,MAAM,eAAe,CAAA"}
@@ -17,6 +17,8 @@ export interface UseApiConfig<T = never> {
17
17
  errorContext?: string;
18
18
  onSuccess?: (data: T) => void;
19
19
  onError?: (error: ApiError) => void;
20
+ /** Auto-execute on mount (default: false) */
21
+ immediate?: boolean;
20
22
  }
21
23
  /**
22
24
  * Interface для результата useApi
@@ -29,6 +31,7 @@ export interface UseApiResult<T> {
29
31
  isSuccess: boolean;
30
32
  execute: () => Promise<T | null>;
31
33
  reset: () => void;
34
+ abort: () => void;
32
35
  }
33
36
  /**
34
37
  * Централизованный хук для API запросов
@@ -39,27 +42,38 @@ export interface UseApiResult<T> {
39
42
  *
40
43
  * @example
41
44
  * ```tsx
42
- * const { data, isLoading, isError, execute } = useApi<User[]>(
43
- * () => fetch('/api/users').then(r => r.json()),
45
+ * const { data, isLoading, isError, execute, abort } = useApi<User[]>(
46
+ * (signal) => fetch('/api/users', { signal }).then(r => r.json()),
44
47
  * { notifyOnError: true, errorContext: 'загрузка пользователей' }
45
48
  * )
46
49
  * ```
47
50
  */
48
- export declare function useApi<T>(request: () => Promise<ApiResponse<T>>, config?: UseApiConfig<T>): UseApiResult<T>;
51
+ export declare function useApi<T>(request: (signal?: AbortSignal) => Promise<ApiResponse<T>>, config?: UseApiConfig<T>): UseApiResult<T>;
49
52
  /**
50
- * GET запрос
53
+ * GET request config with auto-execute support
51
54
  */
52
- export declare function useGet<T>(url: string, params?: Record<string, unknown>, config?: UseApiConfig<T>): UseApiResult<T>;
55
+ export interface UseGetConfig<T> extends UseApiConfig<T> {
56
+ /** Skip request (don't execute) */
57
+ skip?: boolean;
58
+ /** Dynamic headers function */
59
+ headers?: () => Record<string, string>;
60
+ /** Auto-execute on mount (default: true for useGet) */
61
+ immediate?: boolean;
62
+ }
63
+ /**
64
+ * GET request with AbortController and auto-execute
65
+ */
66
+ export declare function useGet<T>(url: string, config?: UseGetConfig<T>): UseApiResult<T>;
53
67
  /**
54
- * POST запрос
68
+ * POST запрос с AbortController
55
69
  */
56
70
  export declare function usePost<T>(url: string, data?: unknown, config?: UseApiConfig<T>): UseApiResult<T>;
57
71
  /**
58
- * PUT запрос
72
+ * PUT запрос с AbortController
59
73
  */
60
74
  export declare function usePut<T>(url: string, data?: unknown, config?: UseApiConfig<T>): UseApiResult<T>;
61
75
  /**
62
- * DELETE запрос
76
+ * DELETE запрос с AbortController
63
77
  */
64
78
  export declare function useDel<T>(url: string, config?: UseApiConfig<T>): UseApiResult<T>;
65
79
  //# sourceMappingURL=useApi.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useApi.d.ts","sourceRoot":"","sources":["../../src/hooks/useApi.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAsB1E;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,IAAI,CAAC,mBAAmB,EAAE,WAAW,GAAG,SAAS,CAAC,GAAG,IAAI,CAiB3G;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAuCjF;AAED;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,KAAK;IACrC,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAA;IAC7B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAA;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,IAAI,EAAE,CAAC,GAAG,IAAI,CAAA;IACd,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAA;IACtB,SAAS,EAAE,OAAO,CAAA;IAClB,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,OAAO,CAAA;IAClB,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;IAChC,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,MAAM,CAAC,CAAC,EACtB,OAAO,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EACtC,MAAM,GAAE,YAAY,CAAC,CAAC,CAAM,GAC3B,YAAY,CAAC,CAAC,CAAC,CAsFjB;AAID;;GAEG;AACH,wBAAgB,MAAM,CAAC,CAAC,EACtB,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,MAAM,GAAE,YAAY,CAAC,CAAC,CAAM,GAC3B,YAAY,CAAC,CAAC,CAAC,CAYjB;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,CAAC,EACvB,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,OAAO,EACd,MAAM,GAAE,YAAY,CAAC,CAAC,CAAM,GAC3B,YAAY,CAAC,CAAC,CAAC,CAajB;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,CAAC,EACtB,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,OAAO,EACd,MAAM,GAAE,YAAY,CAAC,CAAC,CAAM,GAC3B,YAAY,CAAC,CAAC,CAAC,CAajB;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,CAAC,EACtB,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,YAAY,CAAC,CAAC,CAAM,GAC3B,YAAY,CAAC,CAAC,CAAC,CAYjB"}
1
+ {"version":3,"file":"useApi.d.ts","sourceRoot":"","sources":["../../src/hooks/useApi.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAuB1E;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,IAAI,CAAC,mBAAmB,EAAE,WAAW,GAAG,SAAS,CAAC,GAAG,IAAI,CAiB3G;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAuCjF;AAED;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,KAAK;IACrC,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAA;IAC7B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAA;IACnC,6CAA6C;IAC7C,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,IAAI,EAAE,CAAC,GAAG,IAAI,CAAA;IACd,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAA;IACtB,SAAS,EAAE,OAAO,CAAA;IAClB,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,OAAO,CAAA;IAClB,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;IAChC,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AASD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,MAAM,CAAC,CAAC,EACtB,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAC1D,MAAM,GAAE,YAAY,CAAC,CAAC,CAAM,GAC3B,YAAY,CAAC,CAAC,CAAC,CAmIjB;AAID;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,CAAE,SAAQ,YAAY,CAAC,CAAC,CAAC;IACtD,mCAAmC;IACnC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACtC,uDAAuD;IACvD,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,CAAC,EACtB,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,YAAY,CAAC,CAAC,CAAM,GAC3B,YAAY,CAAC,CAAC,CAAC,CA0BjB;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,CAAC,EACvB,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,OAAO,EACd,MAAM,GAAE,YAAY,CAAC,CAAC,CAAM,GAC3B,YAAY,CAAC,CAAC,CAAC,CAQjB;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,CAAC,EACtB,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,OAAO,EACd,MAAM,GAAE,YAAY,CAAC,CAAC,CAAM,GAC3B,YAAY,CAAC,CAAC,CAAC,CAQjB;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,CAAC,EACtB,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,YAAY,CAAC,CAAC,CAAM,GAC3B,YAAY,CAAC,CAAC,CAAC,CAQjB"}
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -1,8 +1,5 @@
1
1
  import { ShellAuth } from '../types';
2
- /**
3
- * Получить auth из window globals
4
- */
5
- declare function getAuth(): ShellAuth | null;
2
+ import { getShellAuth } from '../utils/shellAuth';
6
3
  /**
7
4
  * Централизованный хук для получения состояния авторизации из shell
8
5
  *
@@ -19,5 +16,5 @@ declare function getAuth(): ShellAuth | null;
19
16
  * ```
20
17
  */
21
18
  export declare function useShellAuth(): ShellAuth;
22
- export { getAuth };
19
+ export { getShellAuth };
23
20
  //# sourceMappingURL=useShellAuth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useShellAuth.d.ts","sourceRoot":"","sources":["../../src/hooks/useShellAuth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAiBzC;;GAEG;AACH,iBAAS,OAAO,IAAI,SAAS,GAAG,IAAI,CAgBnC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,IAAI,SAAS,CAgFxC;AAGD,OAAO,EAAE,OAAO,EAAE,CAAA"}
1
+ {"version":3,"file":"useShellAuth.d.ts","sourceRoot":"","sources":["../../src/hooks/useShellAuth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAiBjD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,IAAI,SAAS,CAgFxC;AAGD,OAAO,EAAE,YAAY,EAAE,CAAA"}
File without changes
File without changes
package/dist/index.d.ts CHANGED
File without changes
File without changes
package/dist/index.js CHANGED
@@ -1,18 +1,18 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("react"),Dt=require("axios"),ze={log:(...t)=>{},warn:(...t)=>{}};function ne(){if(typeof window>"u")return null;const t=window;if(t.__SHELL_AUTH_INSTANCE__)return t.__SHELL_AUTH_INSTANCE__;const r=window;return r.__SHELL_AUTH__?.authInstance?r.__SHELL_AUTH__.authInstance:null}function J(){const[t,r]=l.useState(null),[s,u]=l.useState(!0),o=l.useRef(0),p=20,a=l.useCallback(()=>ne(),[]);l.useEffect(()=>{const y=a();if(y){r(y),u(!1);return}const f=c=>{r(c.detail),u(!1)},_=setInterval(()=>{o.current++;const c=a();c?(ze.log("Auth found via polling, attempts:",o.current),r(c),u(!1),clearInterval(_)):o.current>=p&&(u(!1),clearInterval(_))},500);return window.addEventListener("shell-auth-ready",f),()=>{clearInterval(_),window.removeEventListener("shell-auth-ready",f)}},[a]);const d=t||{user:null,isAuthenticated:!1,isLoading:s,signinRedirect:async()=>{const y=ne();y?.signinRedirect?await y.signinRedirect():typeof window<"u"&&(window.location.href="/")},removeUser:async()=>{const y=ne();y?.removeUser&&await y.removeUser()}};return ze.log("Auth result:",{isAuthenticated:d.isAuthenticated,isLoading:d.isLoading}),d}const $t={log:(...t)=>{},warn:(...t)=>{},error:(...t)=>{console.error("[useInfoData]",...t)}};function Lt(t){if(t)return t;if(typeof window<"u"){const r=window;if(r.__MF_NAME__)return r.__MF_NAME__}return"unknown-mfe"}function qe(t){const[r,s]=l.useState(null),[u,o]=l.useState(!0),[p,a]=l.useState(null),S=l.useCallback(()=>{const y=Lt(t?.mfeName).replace("@ib-dop/","");o(!0),a(null),fetch(`/svc/${y}/info.json`).then(f=>{if(!f.ok)throw new Error(`HTTP ${f.status}: ${f.statusText}`);return f.json()}).then(f=>{s(f)}).catch(f=>{$t.error("Failed to load info:",f),a(f instanceof Error?f.message:String(f))}).finally(()=>{o(!1)})},[t?.mfeName]);return l.useEffect(()=>{S()},[S]),{data:r,isLoading:u,error:p,refetch:S}}const pe={log:(...t)=>{},warn:(...t)=>{},error:(...t)=>{console.error("[useV1Config]",...t)}},te={authority:"",client_id:"",environment:"development"};function Ut(){const[t,r]=l.useState(null),[s,u]=l.useState(!0),[o,p]=l.useState(null);return l.useEffect(()=>{(()=>{if(typeof sessionStorage>"u"){p("sessionStorage not available"),r(te),u(!1);return}try{const S=sessionStorage.getItem("config");if(S){const d=JSON.parse(S);r({...te,...d}),p(null),pe.log("Config loaded successfully")}else r(te),p("Config not found in sessionStorage"),pe.warn("Config not found in sessionStorage")}catch(S){pe.error("Error parsing config:",S),r(te),p("Error parsing config")}finally{u(!1)}})()},[]),{data:t,isLoading:s,error:o}}function Ke(t){if(typeof window>"u")return;const r=window.__MF_NAME__||"unknown",s={...t,mfeName:r,timestamp:Date.now()};window.dispatchEvent(new CustomEvent("mfe-notification",{detail:s,bubbles:!0}))}function We(t,r){const s={network:{title:"Нет подключения",message:"Сервер недоступен. Проверьте подключение к интернету."},unauthorized:{title:"Требуется вход",message:"Ваша сессия истекла. Войдите в систему снова."},forbidden:{title:"Доступ запрещён",message:"У вас нет прав для выполнения этого действия."},not_found:{title:"Не найдено",message:"Запрошенный ресурс не найден."},server:{title:"Ошибка сервера",message:"Произошла ошибка на сервере. Попробуйте позже."},client:{title:"Ошибка",message:t.message||"Произошла ошибка при выполнении запроса."},unknown:{title:"Неизвестная ошибка",message:t.message||"Произошла неизвестная ошибка."}},u=s[t.type]||s.unknown;Ke({type:t.type==="network"?"warning":"error",title:u.title,message:r?`${u.message} (${r})`:u.message})}function Vt(t,r={}){const{notifyOnError:s=!0,notifyOnSuccess:u=!1,successMessage:o,errorContext:p,onSuccess:a,onError:S}=r,[d,y]=l.useState(null),[f,_]=l.useState(null),[c,v]=l.useState(!1),b=f!==null,I=d!==null&&!c&&!b,T=l.useCallback(async()=>{v(!0),_(null);try{const h=await t();if(h.ok)return y(h.data),u&&o&&Ke({type:"success",title:"Успешно",message:o}),a?.(h.data),h.data;{const A={message:h.data||"Request failed",status:h.status,type:"client",timestamp:Date.now()};return _(A),s&&We(A,p),S?.(A),null}}catch(h){const A=h;return _(A),s&&We(A,p),S?.(A),null}finally{v(!1)}},[t,s,u,o,p,a,S]),x=l.useCallback(()=>{y(null),_(null),v(!1)},[]);return{data:d,error:f,isLoading:c,isError:b,isSuccess:I,execute:T,reset:x}}const Bt={canView:["all"],canEdit:["ibdop-user","ibdop-admin","ibdop-devops"],canDelete:["ibdop-admin","ibdop-devops"],canAdmin:["ibdop-admin"],canViewSensitiveData:["ibdop-admin","ibdop-devops"],canExportData:["ibdop-user"],canManageUsers:["ibdop-admin"]};function Ht(t={}){const r=J(),s=l.useMemo(()=>({...Bt,...t}),[t]),u=l.useMemo(()=>{const p=r.user?.profile?.realm_roles||r.user?.profile?.roles||[];return Array.isArray(p)?p:[p]},[r.user]),o=p=>p.includes("all")?!0:p.some(a=>u.includes(a));return{canView:o(s.canView),canEdit:o(s.canEdit),canDelete:o(s.canDelete),canAdmin:o(s.canAdmin),canViewSensitiveData:o(s.canViewSensitiveData),canExportData:o(s.canExportData),canManageUsers:o(s.canManageUsers)}}function zt(){const t=J(),[r,s]=l.useState([]),[u,o]=l.useState(0),[p,a]=l.useState([]),[S,d]=l.useState(!0),[y,f]=l.useState(null),_=l.useCallback(async()=>{if(!t.isAuthenticated){console.debug("[useFeatures] Not authenticated"),d(!1);return}d(!0),f(null);try{const b={"Content-Type":"application/json"},I=t.user?.access_token;I&&(b.Authorization=`Bearer ${I}`);const T=await fetch("/api/features",{headers:b});if(!T.ok)throw new Error(`HTTP ${T.status}: ${T.statusText}`);const x=await T.json();s(x.features||[]),o(x.totalCount||0),a(x.userRoles||[])}catch(b){console.debug("Features fetch error:",b),f(b instanceof Error?b.message:String(b)),s([]),a([])}finally{d(!1)}},[t.isAuthenticated,t.user?.access_token]);l.useEffect(()=>{_()},[_]);const c=l.useCallback(b=>r.find(T=>T.name===b)?.userEnabled??!1,[r]),v=l.useCallback(b=>r.filter(I=>I.mfDependencies?.includes(b)),[r]);return{features:r,totalCount:u,userRoles:p,isLoading:S,error:y,refetch:_,isFeatureEnabled:c,getFeaturesByMf:v}}function Wt(){const t=J(),[r,s]=l.useState([]),[u,o]=l.useState([]),[p,a]=l.useState(!1),[S,d]=l.useState(!0),[y,f]=l.useState(null),_=l.useCallback(async()=>{if(!t.isAuthenticated){console.debug("[useFeatureAdmin] Not authenticated"),d(!1);return}d(!0),f(null);try{const T={"Content-Type":"application/json"},x=t.user?.access_token;x&&(T.Authorization=`Bearer ${x}`);const h=await fetch("/api/features/admin",{headers:T});if(!h.ok){if(h.status===403){console.warn("[useFeatureAdmin] 403 Forbidden - checking if token has admin role"),a(!1),s([]),o([]),d(!1);return}throw new Error(`HTTP ${h.status}: ${h.statusText}`)}const A=await h.json();s(A.featureToggles||[]),o(A.microfrontends||[]),a(A.isAdmin||!1)}catch(T){console.debug("FeatureAdmin fetch error:",T),s([]),o([]),a(!1)}finally{d(!1)}},[t.isAuthenticated,t.user?.access_token]),c=l.useCallback(async T=>{try{const x={"Content-Type":"application/json"},h=t.user?.access_token;h&&(x.Authorization=`Bearer ${h}`);const A=await fetch("/api/features/admin",{method:"POST",headers:x,body:JSON.stringify(T)});if(!A.ok){const P=await A.json().catch(()=>({}));throw new Error(P.error||`HTTP ${A.status}`)}return await _(),!0}catch(x){return f(x instanceof Error?x.message:String(x)),!1}},[_]),v=l.useCallback(async(T,x)=>{try{const h={"Content-Type":"application/json"},A=t.user?.access_token;A&&(h.Authorization=`Bearer ${A}`);const P=await fetch(`/api/features/admin/${encodeURIComponent(T)}`,{method:"PUT",headers:h,body:JSON.stringify(x)});if(!P.ok){const B=await P.json().catch(()=>({}));throw new Error(B.error||`HTTP ${P.status}`)}return await _(),!0}catch(h){return f(h instanceof Error?h.message:String(h)),!1}},[_]),b=l.useCallback(async(T,x)=>{try{const h={},A=t.user?.access_token;A&&(h.Authorization=`Bearer ${A}`);const P=await fetch(`/api/features/admin/${encodeURIComponent(T)}/toggle?enabled=${x}`,{method:"POST",headers:h});if(!P.ok){const B=await P.json().catch(()=>({}));throw new Error(B.error||`HTTP ${P.status}`)}return await _(),!0}catch(h){return f(h instanceof Error?h.message:String(h)),!1}},[_]),I=l.useCallback(async T=>{try{const x={},h=t.user?.access_token;h&&(x.Authorization=`Bearer ${h}`);const A=await fetch(`/api/features/admin/${encodeURIComponent(T)}`,{method:"DELETE",headers:x});if(!A.ok){const P=await A.json().catch(()=>({}));throw new Error(P.error||`HTTP ${A.status}`)}return await _(),!0}catch(x){return f(x instanceof Error?x.message:String(x)),!1}},[_]);return l.useEffect(()=>{_()},[_]),{features:r,microfrontends:u,isAdmin:p,isLoading:S,error:y,refetch:_,createFeature:c,updateFeature:v,toggleFeature:b,deleteFeature:I}}function Gt(){const t=J(),[r,s]=l.useState([]),[u,o]=l.useState(0),[p,a]=l.useState(!0),[S,d]=l.useState(null),y=l.useCallback(async()=>{if(!t.isAuthenticated){a(!1);return}a(!0),d(null);try{const f={"Content-Type":"application/json"},_=t.user?.access_token;_&&(f.Authorization=`Bearer ${_}`);const c=await fetch("/api/features/microfrontends",{headers:f});if(!c.ok)throw new Error(`HTTP ${c.status}: ${c.statusText}`);const v=await c.json();s(v.microfrontends||[]),o(v.totalCount||0)}catch(f){d(f instanceof Error?f.message:String(f))}finally{a(!1)}},[t.isAuthenticated,t.user?.access_token]);return l.useEffect(()=>{y()},[y]),{microfrontends:r,totalCount:u,isLoading:p,error:S,refetch:y}}var re={exports:{}},W={};var Ge;function Yt(){if(Ge)return W;Ge=1;var t=l,r=Symbol.for("react.element"),s=Symbol.for("react.fragment"),u=Object.prototype.hasOwnProperty,o=t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};function a(S,d,y){var f,_={},c=null,v=null;y!==void 0&&(c=""+y),d.key!==void 0&&(c=""+d.key),d.ref!==void 0&&(v=d.ref);for(f in d)u.call(d,f)&&!p.hasOwnProperty(f)&&(_[f]=d[f]);if(S&&S.defaultProps)for(f in d=S.defaultProps,d)_[f]===void 0&&(_[f]=d[f]);return{$$typeof:r,type:S,key:c,ref:v,props:_,_owner:o.current}}return W.Fragment=s,W.jsx=a,W.jsxs=a,W}var G={};var Ye;function Jt(){return Ye||(Ye=1,process.env.NODE_ENV!=="production"&&(function(){var t=l,r=Symbol.for("react.element"),s=Symbol.for("react.portal"),u=Symbol.for("react.fragment"),o=Symbol.for("react.strict_mode"),p=Symbol.for("react.profiler"),a=Symbol.for("react.provider"),S=Symbol.for("react.context"),d=Symbol.for("react.forward_ref"),y=Symbol.for("react.suspense"),f=Symbol.for("react.suspense_list"),_=Symbol.for("react.memo"),c=Symbol.for("react.lazy"),v=Symbol.for("react.offscreen"),b=Symbol.iterator,I="@@iterator";function T(e){if(e===null||typeof e!="object")return null;var n=b&&e[b]||e[I];return typeof n=="function"?n:null}var x=t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;function h(e){{for(var n=arguments.length,i=new Array(n>1?n-1:0),g=1;g<n;g++)i[g-1]=arguments[g];A("error",e,i)}}function A(e,n,i){{var g=x.ReactDebugCurrentFrame,C=g.getStackAddendum();C!==""&&(n+="%s",i=i.concat([C]));var k=i.map(function(w){return String(w)});k.unshift("Warning: "+n),Function.prototype.apply.call(console[e],console,k)}}var P=!1,B=!1,at=!1,ot=!1,it=!1,Ee;Ee=Symbol.for("react.module.reference");function ut(e){return!!(typeof e=="string"||typeof e=="function"||e===u||e===p||it||e===o||e===y||e===f||ot||e===v||P||B||at||typeof e=="object"&&e!==null&&(e.$$typeof===c||e.$$typeof===_||e.$$typeof===a||e.$$typeof===S||e.$$typeof===d||e.$$typeof===Ee||e.getModuleId!==void 0))}function ct(e,n,i){var g=e.displayName;if(g)return g;var C=n.displayName||n.name||"";return C!==""?i+"("+C+")":i}function ye(e){return e.displayName||"Context"}function D(e){if(e==null)return null;if(typeof e.tag=="number"&&h("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case u:return"Fragment";case s:return"Portal";case p:return"Profiler";case o:return"StrictMode";case y:return"Suspense";case f:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case S:var n=e;return ye(n)+".Consumer";case a:var i=e;return ye(i._context)+".Provider";case d:return ct(e,e.render,"ForwardRef");case _:var g=e.displayName||null;return g!==null?g:D(e.type)||"Memo";case c:{var C=e,k=C._payload,w=C._init;try{return D(w(k))}catch{return null}}}return null}var $=Object.assign,H=0,we,be,xe,Se,Ce,Ae,ke;function Te(){}Te.__reactDisabledLog=!0;function lt(){{if(H===0){we=console.log,be=console.info,xe=console.warn,Se=console.error,Ce=console.group,Ae=console.groupCollapsed,ke=console.groupEnd;var e={configurable:!0,enumerable:!0,value:Te,writable:!0};Object.defineProperties(console,{info:e,log:e,warn:e,error:e,group:e,groupCollapsed:e,groupEnd:e})}H++}}function ft(){{if(H--,H===0){var e={configurable:!0,enumerable:!0,writable:!0};Object.defineProperties(console,{log:$({},e,{value:we}),info:$({},e,{value:be}),warn:$({},e,{value:xe}),error:$({},e,{value:Se}),group:$({},e,{value:Ce}),groupCollapsed:$({},e,{value:Ae}),groupEnd:$({},e,{value:ke})})}H<0&&h("disabledDepth fell below zero. This is a bug in React. Please file an issue.")}}var ae=x.ReactCurrentDispatcher,oe;function X(e,n,i){{if(oe===void 0)try{throw Error()}catch(C){var g=C.stack.trim().match(/\n( *(at )?)/);oe=g&&g[1]||""}return`
2
- `+oe+e}}var ie=!1,Z;{var dt=typeof WeakMap=="function"?WeakMap:Map;Z=new dt}function Re(e,n){if(!e||ie)return"";{var i=Z.get(e);if(i!==void 0)return i}var g;ie=!0;var C=Error.prepareStackTrace;Error.prepareStackTrace=void 0;var k;k=ae.current,ae.current=null,lt();try{if(n){var w=function(){throw Error()};if(Object.defineProperty(w.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(w,[])}catch(j){g=j}Reflect.construct(e,[],w)}else{try{w.call()}catch(j){g=j}e.call(w.prototype)}}else{try{throw Error()}catch(j){g=j}e()}}catch(j){if(j&&g&&typeof j.stack=="string"){for(var E=j.stack.split(`
3
- `),N=g.stack.split(`
4
- `),R=E.length-1,M=N.length-1;R>=1&&M>=0&&E[R]!==N[M];)M--;for(;R>=1&&M>=0;R--,M--)if(E[R]!==N[M]){if(R!==1||M!==1)do if(R--,M--,M<0||E[R]!==N[M]){var O=`
5
- `+E[R].replace(" at new "," at ");return e.displayName&&O.includes("<anonymous>")&&(O=O.replace("<anonymous>",e.displayName)),typeof e=="function"&&Z.set(e,O),O}while(R>=1&&M>=0);break}}}finally{ie=!1,ae.current=k,ft(),Error.prepareStackTrace=C}var V=e?e.displayName||e.name:"",L=V?X(V):"";return typeof e=="function"&&Z.set(e,L),L}function pt(e,n,i){return Re(e,!1)}function ht(e){var n=e.prototype;return!!(n&&n.isReactComponent)}function Q(e,n,i){if(e==null)return"";if(typeof e=="function")return Re(e,ht(e));if(typeof e=="string")return X(e);switch(e){case y:return X("Suspense");case f:return X("SuspenseList")}if(typeof e=="object")switch(e.$$typeof){case d:return pt(e.render);case _:return Q(e.type,n,i);case c:{var g=e,C=g._payload,k=g._init;try{return Q(k(C),n,i)}catch{}}}return""}var z=Object.prototype.hasOwnProperty,Me={},Ie=x.ReactDebugCurrentFrame;function ee(e){if(e){var n=e._owner,i=Q(e.type,e._source,n?n.type:null);Ie.setExtraStackFrame(i)}else Ie.setExtraStackFrame(null)}function gt(e,n,i,g,C){{var k=Function.call.bind(z);for(var w in e)if(k(e,w)){var E=void 0;try{if(typeof e[w]!="function"){var N=Error((g||"React class")+": "+i+" type `"+w+"` is invalid; it must be a function, usually from the `prop-types` package, but received `"+typeof e[w]+"`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.");throw N.name="Invariant Violation",N}E=e[w](n,w,g,i,null,"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED")}catch(R){E=R}E&&!(E instanceof Error)&&(ee(C),h("%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).",g||"React class",i,w,typeof E),ee(null)),E instanceof Error&&!(E.message in Me)&&(Me[E.message]=!0,ee(C),h("Failed %s type: %s",i,E.message),ee(null))}}}var mt=Array.isArray;function ue(e){return mt(e)}function _t(e){{var n=typeof Symbol=="function"&&Symbol.toStringTag,i=n&&e[Symbol.toStringTag]||e.constructor.name||"Object";return i}}function vt(e){try{return Ne(e),!1}catch{return!0}}function Ne(e){return""+e}function je(e){if(vt(e))return h("The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.",_t(e)),Ne(e)}var Pe=x.ReactCurrentOwner,Et={key:!0,ref:!0,__self:!0,__source:!0},Oe,Fe;function yt(e){if(z.call(e,"ref")){var n=Object.getOwnPropertyDescriptor(e,"ref").get;if(n&&n.isReactWarning)return!1}return e.ref!==void 0}function wt(e){if(z.call(e,"key")){var n=Object.getOwnPropertyDescriptor(e,"key").get;if(n&&n.isReactWarning)return!1}return e.key!==void 0}function bt(e,n){typeof e.ref=="string"&&Pe.current}function xt(e,n){{var i=function(){Oe||(Oe=!0,h("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)",n))};i.isReactWarning=!0,Object.defineProperty(e,"key",{get:i,configurable:!0})}}function St(e,n){{var i=function(){Fe||(Fe=!0,h("%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)",n))};i.isReactWarning=!0,Object.defineProperty(e,"ref",{get:i,configurable:!0})}}var Ct=function(e,n,i,g,C,k,w){var E={$$typeof:r,type:e,key:n,ref:i,props:w,_owner:k};return E._store={},Object.defineProperty(E._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:!1}),Object.defineProperty(E,"_self",{configurable:!1,enumerable:!1,writable:!1,value:g}),Object.defineProperty(E,"_source",{configurable:!1,enumerable:!1,writable:!1,value:C}),Object.freeze&&(Object.freeze(E.props),Object.freeze(E)),E};function At(e,n,i,g,C){{var k,w={},E=null,N=null;i!==void 0&&(je(i),E=""+i),wt(n)&&(je(n.key),E=""+n.key),yt(n)&&(N=n.ref,bt(n,C));for(k in n)z.call(n,k)&&!Et.hasOwnProperty(k)&&(w[k]=n[k]);if(e&&e.defaultProps){var R=e.defaultProps;for(k in R)w[k]===void 0&&(w[k]=R[k])}if(E||N){var M=typeof e=="function"?e.displayName||e.name||"Unknown":e;E&&xt(w,M),N&&St(w,M)}return Ct(e,E,N,C,g,Pe.current,w)}}var ce=x.ReactCurrentOwner,De=x.ReactDebugCurrentFrame;function U(e){if(e){var n=e._owner,i=Q(e.type,e._source,n?n.type:null);De.setExtraStackFrame(i)}else De.setExtraStackFrame(null)}var le;le=!1;function fe(e){return typeof e=="object"&&e!==null&&e.$$typeof===r}function $e(){{if(ce.current){var e=D(ce.current.type);if(e)return`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("react"),Ut=require("axios");function L(){if(typeof window>"u")return null;const t=window;if(t.__SHELL_AUTH_INSTANCE__)return t.__SHELL_AUTH_INSTANCE__;const r=window;return r.__SHELL_AUTH__?.authInstance?r.__SHELL_AUTH__.authInstance:null}function Xe(){const t=L();return t?{isAuthenticated:t.isAuthenticated,user:t.user??void 0}:{isAuthenticated:!1}}function Vt(){const t=L();return t?.isAuthenticated?t.user?.profile?.access_token??null:null}function Bt(){return L()?.isAuthenticated??!1}async function Ze(){const t=L();t?.signinRedirect?await t.signinRedirect():typeof window<"u"&&(window.location.href="/")}async function Wt(){const t=L();t?.removeUser&&await t.removeUser()}const Ge={log:(...t)=>{},warn:(...t)=>{}};function K(){const[t,r]=c.useState(null),[a,i]=c.useState(!0),o=c.useRef(0),p=20,n=c.useCallback(()=>L(),[]);c.useEffect(()=>{const E=n();if(E){r(E),i(!1);return}const l=d=>{r(d.detail),i(!1)},m=setInterval(()=>{o.current++;const d=n();d?(Ge.log("Auth found via polling, attempts:",o.current),r(d),i(!1),clearInterval(m)):o.current>=p&&(i(!1),clearInterval(m))},500);return window.addEventListener("shell-auth-ready",l),()=>{clearInterval(m),window.removeEventListener("shell-auth-ready",l)}},[n]);const f=t||{user:null,isAuthenticated:!1,isLoading:a,signinRedirect:async()=>{const E=L();E?.signinRedirect?await E.signinRedirect():typeof window<"u"&&(window.location.href="/")},removeUser:async()=>{const E=L();E?.removeUser&&await E.removeUser()}};return Ge.log("Auth result:",{isAuthenticated:f.isAuthenticated,isLoading:f.isLoading}),f}const zt={log:(...t)=>{},warn:(...t)=>{},error:(...t)=>{console.error("[useInfoData]",...t)}};function Ht(t){if(t)return t;if(typeof window<"u"){const r=window;if(r.__MF_NAME__)return r.__MF_NAME__}return"unknown-mfe"}function Qe(t){const[r,a]=c.useState(null),[i,o]=c.useState(!0),[p,n]=c.useState(null),h=c.useCallback(()=>{const E=Ht(t?.mfeName).replace("@ib-dop/","");o(!0),n(null),fetch(`/svc/${E}/info.json`).then(l=>{if(!l.ok)throw new Error(`HTTP ${l.status}: ${l.statusText}`);return l.json()}).then(l=>{a(l)}).catch(l=>{zt.error("Failed to load info:",l),n(l instanceof Error?l.message:String(l))}).finally(()=>{o(!1)})},[t?.mfeName]);return c.useEffect(()=>{h()},[h]),{data:r,isLoading:i,error:p,refetch:h}}const ge={log:(...t)=>{},warn:(...t)=>{},error:(...t)=>{console.error("[useV1Config]",...t)}},ne={authority:"",client_id:"",environment:"development"};function Gt(){const[t,r]=c.useState(null),[a,i]=c.useState(!0),[o,p]=c.useState(null);return c.useEffect(()=>{(()=>{if(typeof sessionStorage>"u"){p("sessionStorage not available"),r(ne),i(!1);return}try{const h=sessionStorage.getItem("config");if(h){const f=JSON.parse(h);r({...ne,...f}),p(null),ge.log("Config loaded successfully")}else r(ne),p("Config not found in sessionStorage"),ge.warn("Config not found in sessionStorage")}catch(h){ge.error("Error parsing config:",h),r(ne),p("Error parsing config")}finally{i(!1)}})()},[]),{data:t,isLoading:a,error:o}}const et="platform-kit",se={log:(...t)=>{},warn:(...t)=>{},error:(...t)=>{console.error(`[${et}]`,...t)},info:(...t)=>{}};function Yt(t){const r=t.response;let a="unknown";return r?r.status===401?a="unauthorized":r.status===403?a="forbidden":r.status===404?a="not_found":r.status>=500&&(a="server"):a="network",{message:r?.data?.message??t.message??"Unknown error",code:r?.data?.code,status:r?.status,type:a,timestamp:Date.now(),url:t.config?.url}}const qt=3,Jt=1e3;function Kt(t){return!t||t>=500||t===429}function Xt(t){return new Promise(r=>setTimeout(r,t))}function tt(t={}){const r=t.name||et,a=t.retries??qt,i=t.retryDelay??Jt,o={log:(...n)=>se.log(`[API:${r}]`,...n),warn:(...n)=>se.warn(`[API:${r}]`,...n),error:(...n)=>se.error(`[API:${r}]`,...n),info:(...n)=>se.info(`[API:${r}]`,...n)},p=Ut.create({timeout:t.timeout??1e4,baseURL:t.baseURL??"",headers:{"Content-Type":"application/json"}});return p.interceptors.request.use(n=>{const h=Xe();if(h?.isAuthenticated){const f=h.user?.access_token||h.user?.profile?.access_token;f&&n.headers?(n.headers.Authorization=`Bearer ${f}`,o.info("Auth token attached")):o.warn("User is authenticated but no token found")}else o.info("User not authenticated - request without token");return o.log(`${n.method?.toUpperCase()} ${n.url}`),n},n=>(o.error("Request interceptor error:",n.message),Promise.reject(n))),p.interceptors.response.use(n=>(o.log(`Response ${n.status}:`,n.config.url),n),async n=>{const h=n.response?.status,f=n.config?.url,E=n.config?._retryCount??0;if(Kt(h)&&E<a){const l=n.config;l._retryCount=E+1;const m=i*Math.pow(2,E);return o.warn(`Retrying (${l._retryCount}/${a}) after ${m}ms:`,f),await Xt(m),p.request(l)}return h===401?(o.warn("401 Unauthorized - triggering re-auth"),Ze()):h===403?o.warn("403 Forbidden - insufficient permissions"):h===404?o.warn("404 Not found:",f):h===429?o.warn("429 Rate limited"):h===500?o.error("500 Server error:",f):n.response?o.warn(`Error ${h}:`,n.message):o.error("Network error - backend may be unavailable:",f),Promise.reject(Yt(n))}),p}const U=tt();async function Zt(t,r,a=U){const i=await a.get(t,{params:r});return{data:i.data,status:i.status,ok:i.status>=200&&i.status<300}}async function Qt(t,r,a=U){const i=await a.post(t,r);return{data:i.data,status:i.status,ok:i.status>=200&&i.status<300}}async function er(t,r,a=U){const i=await a.put(t,r);return{data:i.data,status:i.status,ok:i.status>=200&&i.status<300}}async function tr(t,r=U){const a=await r.delete(t);return{data:a.data,status:a.status,ok:a.status>=200&&a.status<300}}function rt(t){if(typeof window>"u")return;const r=window.__MF_NAME__||"unknown",a={...t,mfeName:r,timestamp:Date.now()};window.dispatchEvent(new CustomEvent("mfe-notification",{detail:a,bubbles:!0}))}function Ye(t,r){const a={network:{title:"Нет подключения",message:"Сервер недоступен. Проверьте подключение к интернету."},unauthorized:{title:"Требуется вход",message:"Ваша сессия истекла. Войдите в систему снова."},forbidden:{title:"Доступ запрещён",message:"У вас нет прав для выполнения этого действия."},not_found:{title:"Не найдено",message:"Запрошенный ресурс не найден."},server:{title:"Ошибка сервера",message:"Произошла ошибка на сервере. Попробуйте позже."},client:{title:"Ошибка",message:t.message||"Произошла ошибка при выполнении запроса."},unknown:{title:"Неизвестная ошибка",message:t.message||"Произошла неизвестная ошибка."}},i=a[t.type]||a.unknown;rt({type:t.type==="network"?"warning":"error",title:i.title,message:r?`${i.message} (${r})`:i.message})}function rr(t){return t instanceof Error&&t.name==="AbortError"}function X(t,r={}){const{notifyOnError:a=!0,notifyOnSuccess:i=!1,successMessage:o,errorContext:p,onSuccess:n,onError:h}=r,[f,E]=c.useState(null),[l,m]=c.useState(null),[d,w]=c.useState(!1),y=c.useRef(null),I=l!==null,k=f!==null&&!d&&!I;c.useEffect(()=>()=>{y.current&&y.current.abort()},[]);const S=c.useCallback(()=>{y.current&&(y.current.abort(),y.current=null,w(!1))},[]),v=c.useCallback(async()=>{y.current&&y.current.abort(),y.current=new AbortController;const N=y.current.signal;w(!0),m(null);try{const j=await t(N);if(N.aborted)return null;if(j.ok)return E(j.data),i&&o&&rt({type:"success",title:"Успешно",message:o}),n?.(j.data),j.data;{const $={message:j.data||"Request failed",status:j.status,type:"client",timestamp:Date.now()};return m($),a&&Ye($,p),h?.($),null}}catch(j){if(rr(j))return null;const $=j;return m($),a&&Ye($,p),h?.($),null}finally{N.aborted||w(!1),y.current=null}},[t,a,i,o,p,n,h]),T=c.useCallback(()=>{E(null),m(null),w(!1)},[]);return{data:f,error:l,isLoading:d,isError:I,isSuccess:k,execute:v,reset:T,abort:S}}function nr(t,r={}){const{skip:a=!1,headers:i,immediate:o=!0,...p}=r,n=c.useMemo(()=>f=>{const E=i?i():{};return U.get(t,{headers:{"Content-Type":"application/json",...E},signal:f}).then(l=>({data:l.data,status:l.status,ok:l.status>=200&&l.status<300}))},[t,i]),h=X(n,{...p});return c.useEffect(()=>{o&&!a&&h.execute()},[o,a,t]),h}function sr(t,r,a={}){return X(o=>U.post(t,r,{signal:o}).then(p=>({data:p.data,status:p.status,ok:p.status>=200&&p.status<300})),a)}function ar(t,r,a={}){return X(o=>U.put(t,r,{signal:o}).then(p=>({data:p.data,status:p.status,ok:p.status>=200&&p.status<300})),a)}function or(t,r={}){return X(i=>U.delete(t,{signal:i}).then(o=>({data:o.data,status:o.status,ok:o.status>=200&&o.status<300})),r)}const ir={canView:["all"],canEdit:["ibdop-user","ibdop-admin","ibdop-devops"],canDelete:["ibdop-admin","ibdop-devops"],canAdmin:["ibdop-admin"],canViewSensitiveData:["ibdop-admin","ibdop-devops"],canExportData:["ibdop-user"],canManageUsers:["ibdop-admin"]};function ur(t={}){const r=K(),a=c.useMemo(()=>({...ir,...t}),[t]),i=c.useMemo(()=>{const p=r.user?.profile?.realm_roles||r.user?.profile?.roles||[];return Array.isArray(p)?p:[p]},[r.user]),o=p=>p.includes("all")?!0:p.some(n=>i.includes(n));return{canView:o(a.canView),canEdit:o(a.canEdit),canDelete:o(a.canDelete),canAdmin:o(a.canAdmin),canViewSensitiveData:o(a.canViewSensitiveData),canExportData:o(a.canExportData),canManageUsers:o(a.canManageUsers)}}function cr(){const t=K(),[r,a]=c.useState([]),[i,o]=c.useState(0),[p,n]=c.useState([]),[h,f]=c.useState(!0),[E,l]=c.useState(null),m=c.useCallback(async()=>{if(!t.isAuthenticated){console.debug("[useFeatures] Not authenticated"),f(!1);return}f(!0),l(null);try{const y={"Content-Type":"application/json"},I=t.user?.access_token;I&&(y.Authorization=`Bearer ${I}`);const k=await fetch("/api/features",{headers:y});if(!k.ok)throw new Error(`HTTP ${k.status}: ${k.statusText}`);const S=await k.json();a(S.features||[]),o(S.totalCount||0),n(S.userRoles||[])}catch(y){console.debug("Features fetch error:",y),l(y instanceof Error?y.message:String(y)),a([]),n([])}finally{f(!1)}},[t.isAuthenticated,t.user?.access_token]);c.useEffect(()=>{m()},[m]);const d=c.useCallback(y=>r.find(k=>k.name===y)?.userEnabled??!1,[r]),w=c.useCallback(y=>r.filter(I=>I.mfDependencies?.includes(y)),[r]);return{features:r,totalCount:i,userRoles:p,isLoading:h,error:E,refetch:m,isFeatureEnabled:d,getFeaturesByMf:w}}function lr(){const t=K(),[r,a]=c.useState([]),[i,o]=c.useState([]),[p,n]=c.useState(!1),[h,f]=c.useState(!0),[E,l]=c.useState(null),m=c.useCallback(async()=>{if(!t.isAuthenticated){console.debug("[useFeatureAdmin] Not authenticated"),f(!1);return}f(!0),l(null);try{const k={"Content-Type":"application/json"},S=t.user?.access_token;S&&(k.Authorization=`Bearer ${S}`);const v=await fetch("/api/features/admin",{headers:k});if(!v.ok){if(v.status===403){console.warn("[useFeatureAdmin] 403 Forbidden - checking if token has admin role"),n(!1),a([]),o([]),f(!1);return}throw new Error(`HTTP ${v.status}: ${v.statusText}`)}const T=await v.json();a(T.featureToggles||[]),o(T.microfrontends||[]),n(T.isAdmin||!1)}catch(k){console.debug("FeatureAdmin fetch error:",k),a([]),o([]),n(!1)}finally{f(!1)}},[t.isAuthenticated,t.user?.access_token]),d=c.useCallback(async k=>{try{const S={"Content-Type":"application/json"},v=t.user?.access_token;v&&(S.Authorization=`Bearer ${v}`);const T=await fetch("/api/features/admin",{method:"POST",headers:S,body:JSON.stringify(k)});if(!T.ok){const N=await T.json().catch(()=>({}));throw new Error(N.error||`HTTP ${T.status}`)}return await m(),!0}catch(S){return l(S instanceof Error?S.message:String(S)),!1}},[m]),w=c.useCallback(async(k,S)=>{try{const v={"Content-Type":"application/json"},T=t.user?.access_token;T&&(v.Authorization=`Bearer ${T}`);const N=await fetch(`/api/features/admin/${encodeURIComponent(k)}`,{method:"PUT",headers:v,body:JSON.stringify(S)});if(!N.ok){const j=await N.json().catch(()=>({}));throw new Error(j.error||`HTTP ${N.status}`)}return await m(),!0}catch(v){return l(v instanceof Error?v.message:String(v)),!1}},[m]),y=c.useCallback(async(k,S)=>{try{const v={},T=t.user?.access_token;T&&(v.Authorization=`Bearer ${T}`);const N=await fetch(`/api/features/admin/${encodeURIComponent(k)}/toggle?enabled=${S}`,{method:"POST",headers:v});if(!N.ok){const j=await N.json().catch(()=>({}));throw new Error(j.error||`HTTP ${N.status}`)}return await m(),!0}catch(v){return l(v instanceof Error?v.message:String(v)),!1}},[m]),I=c.useCallback(async k=>{try{const S={},v=t.user?.access_token;v&&(S.Authorization=`Bearer ${v}`);const T=await fetch(`/api/features/admin/${encodeURIComponent(k)}`,{method:"DELETE",headers:S});if(!T.ok){const N=await T.json().catch(()=>({}));throw new Error(N.error||`HTTP ${T.status}`)}return await m(),!0}catch(S){return l(S instanceof Error?S.message:String(S)),!1}},[m]);return c.useEffect(()=>{m()},[m]),{features:r,microfrontends:i,isAdmin:p,isLoading:h,error:E,refetch:m,createFeature:d,updateFeature:w,toggleFeature:y,deleteFeature:I}}function fr(){const t=K(),[r,a]=c.useState([]),[i,o]=c.useState(0),[p,n]=c.useState(!0),[h,f]=c.useState(null),E=c.useCallback(async()=>{if(!t.isAuthenticated){n(!1);return}n(!0),f(null);try{const l={"Content-Type":"application/json"},m=t.user?.access_token;m&&(l.Authorization=`Bearer ${m}`);const d=await fetch("/api/features/microfrontends",{headers:l});if(!d.ok)throw new Error(`HTTP ${d.status}: ${d.statusText}`);const w=await d.json();a(w.microfrontends||[]),o(w.totalCount||0)}catch(l){f(l instanceof Error?l.message:String(l))}finally{n(!1)}},[t.isAuthenticated,t.user?.access_token]);return c.useEffect(()=>{E()},[E]),{microfrontends:r,totalCount:i,isLoading:p,error:h,refetch:E}}var ae={exports:{}},q={};var qe;function dr(){if(qe)return q;qe=1;var t=c,r=Symbol.for("react.element"),a=Symbol.for("react.fragment"),i=Object.prototype.hasOwnProperty,o=t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};function n(h,f,E){var l,m={},d=null,w=null;E!==void 0&&(d=""+E),f.key!==void 0&&(d=""+f.key),f.ref!==void 0&&(w=f.ref);for(l in f)i.call(f,l)&&!p.hasOwnProperty(l)&&(m[l]=f[l]);if(h&&h.defaultProps)for(l in f=h.defaultProps,f)m[l]===void 0&&(m[l]=f[l]);return{$$typeof:r,type:h,key:d,ref:w,props:m,_owner:o.current}}return q.Fragment=a,q.jsx=n,q.jsxs=n,q}var J={};var Je;function pr(){return Je||(Je=1,process.env.NODE_ENV!=="production"&&(function(){var t=c,r=Symbol.for("react.element"),a=Symbol.for("react.portal"),i=Symbol.for("react.fragment"),o=Symbol.for("react.strict_mode"),p=Symbol.for("react.profiler"),n=Symbol.for("react.provider"),h=Symbol.for("react.context"),f=Symbol.for("react.forward_ref"),E=Symbol.for("react.suspense"),l=Symbol.for("react.suspense_list"),m=Symbol.for("react.memo"),d=Symbol.for("react.lazy"),w=Symbol.for("react.offscreen"),y=Symbol.iterator,I="@@iterator";function k(e){if(e===null||typeof e!="object")return null;var s=y&&e[y]||e[I];return typeof s=="function"?s:null}var S=t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;function v(e){{for(var s=arguments.length,u=new Array(s>1?s-1:0),g=1;g<s;g++)u[g-1]=arguments[g];T("error",e,u)}}function T(e,s,u){{var g=S.ReactDebugCurrentFrame,C=g.getStackAddendum();C!==""&&(s+="%s",u=u.concat([C]));var A=u.map(function(x){return String(x)});A.unshift("Warning: "+s),Function.prototype.apply.call(console[e],console,A)}}var N=!1,j=!1,$=!1,ct=!1,lt=!1,we;we=Symbol.for("react.module.reference");function ft(e){return!!(typeof e=="string"||typeof e=="function"||e===i||e===p||lt||e===o||e===E||e===l||ct||e===w||N||j||$||typeof e=="object"&&e!==null&&(e.$$typeof===d||e.$$typeof===m||e.$$typeof===n||e.$$typeof===h||e.$$typeof===f||e.$$typeof===we||e.getModuleId!==void 0))}function dt(e,s,u){var g=e.displayName;if(g)return g;var C=s.displayName||s.name||"";return C!==""?u+"("+C+")":u}function be(e){return e.displayName||"Context"}function V(e){if(e==null)return null;if(typeof e.tag=="number"&&v("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case i:return"Fragment";case a:return"Portal";case p:return"Profiler";case o:return"StrictMode";case E:return"Suspense";case l:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case h:var s=e;return be(s)+".Consumer";case n:var u=e;return be(u._context)+".Provider";case f:return dt(e,e.render,"ForwardRef");case m:var g=e.displayName||null;return g!==null?g:V(e.type)||"Memo";case d:{var C=e,A=C._payload,x=C._init;try{return V(x(A))}catch{return null}}}return null}var B=Object.assign,G=0,xe,Se,Ce,Ae,ke,Te,Re;function Me(){}Me.__reactDisabledLog=!0;function pt(){{if(G===0){xe=console.log,Se=console.info,Ce=console.warn,Ae=console.error,ke=console.group,Te=console.groupCollapsed,Re=console.groupEnd;var e={configurable:!0,enumerable:!0,value:Me,writable:!0};Object.defineProperties(console,{info:e,log:e,warn:e,error:e,group:e,groupCollapsed:e,groupEnd:e})}G++}}function ht(){{if(G--,G===0){var e={configurable:!0,enumerable:!0,writable:!0};Object.defineProperties(console,{log:B({},e,{value:xe}),info:B({},e,{value:Se}),warn:B({},e,{value:Ce}),error:B({},e,{value:Ae}),group:B({},e,{value:ke}),groupCollapsed:B({},e,{value:Te}),groupEnd:B({},e,{value:Re})})}G<0&&v("disabledDepth fell below zero. This is a bug in React. Please file an issue.")}}var ie=S.ReactCurrentDispatcher,ue;function Q(e,s,u){{if(ue===void 0)try{throw Error()}catch(C){var g=C.stack.trim().match(/\n( *(at )?)/);ue=g&&g[1]||""}return`
2
+ `+ue+e}}var ce=!1,ee;{var gt=typeof WeakMap=="function"?WeakMap:Map;ee=new gt}function Ie(e,s){if(!e||ce)return"";{var u=ee.get(e);if(u!==void 0)return u}var g;ce=!0;var C=Error.prepareStackTrace;Error.prepareStackTrace=void 0;var A;A=ie.current,ie.current=null,pt();try{if(s){var x=function(){throw Error()};if(Object.defineProperty(x.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(x,[])}catch(O){g=O}Reflect.construct(e,[],x)}else{try{x.call()}catch(O){g=O}e.call(x.prototype)}}else{try{throw Error()}catch(O){g=O}e()}}catch(O){if(O&&g&&typeof O.stack=="string"){for(var b=O.stack.split(`
3
+ `),P=g.stack.split(`
4
+ `),R=b.length-1,M=P.length-1;R>=1&&M>=0&&b[R]!==P[M];)M--;for(;R>=1&&M>=0;R--,M--)if(b[R]!==P[M]){if(R!==1||M!==1)do if(R--,M--,M<0||b[R]!==P[M]){var F=`
5
+ `+b[R].replace(" at new "," at ");return e.displayName&&F.includes("<anonymous>")&&(F=F.replace("<anonymous>",e.displayName)),typeof e=="function"&&ee.set(e,F),F}while(R>=1&&M>=0);break}}}finally{ce=!1,ie.current=A,ht(),Error.prepareStackTrace=C}var H=e?e.displayName||e.name:"",W=H?Q(H):"";return typeof e=="function"&&ee.set(e,W),W}function mt(e,s,u){return Ie(e,!1)}function _t(e){var s=e.prototype;return!!(s&&s.isReactComponent)}function te(e,s,u){if(e==null)return"";if(typeof e=="function")return Ie(e,_t(e));if(typeof e=="string")return Q(e);switch(e){case E:return Q("Suspense");case l:return Q("SuspenseList")}if(typeof e=="object")switch(e.$$typeof){case f:return mt(e.render);case m:return te(e.type,s,u);case d:{var g=e,C=g._payload,A=g._init;try{return te(A(C),s,u)}catch{}}}return""}var Y=Object.prototype.hasOwnProperty,Ne={},je=S.ReactDebugCurrentFrame;function re(e){if(e){var s=e._owner,u=te(e.type,e._source,s?s.type:null);je.setExtraStackFrame(u)}else je.setExtraStackFrame(null)}function vt(e,s,u,g,C){{var A=Function.call.bind(Y);for(var x in e)if(A(e,x)){var b=void 0;try{if(typeof e[x]!="function"){var P=Error((g||"React class")+": "+u+" type `"+x+"` is invalid; it must be a function, usually from the `prop-types` package, but received `"+typeof e[x]+"`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.");throw P.name="Invariant Violation",P}b=e[x](s,x,g,u,null,"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED")}catch(R){b=R}b&&!(b instanceof Error)&&(re(C),v("%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).",g||"React class",u,x,typeof b),re(null)),b instanceof Error&&!(b.message in Ne)&&(Ne[b.message]=!0,re(C),v("Failed %s type: %s",u,b.message),re(null))}}}var Et=Array.isArray;function le(e){return Et(e)}function yt(e){{var s=typeof Symbol=="function"&&Symbol.toStringTag,u=s&&e[Symbol.toStringTag]||e.constructor.name||"Object";return u}}function wt(e){try{return Pe(e),!1}catch{return!0}}function Pe(e){return""+e}function Oe(e){if(wt(e))return v("The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.",yt(e)),Pe(e)}var Fe=S.ReactCurrentOwner,bt={key:!0,ref:!0,__self:!0,__source:!0},De,$e;function xt(e){if(Y.call(e,"ref")){var s=Object.getOwnPropertyDescriptor(e,"ref").get;if(s&&s.isReactWarning)return!1}return e.ref!==void 0}function St(e){if(Y.call(e,"key")){var s=Object.getOwnPropertyDescriptor(e,"key").get;if(s&&s.isReactWarning)return!1}return e.key!==void 0}function Ct(e,s){typeof e.ref=="string"&&Fe.current}function At(e,s){{var u=function(){De||(De=!0,v("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)",s))};u.isReactWarning=!0,Object.defineProperty(e,"key",{get:u,configurable:!0})}}function kt(e,s){{var u=function(){$e||($e=!0,v("%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)",s))};u.isReactWarning=!0,Object.defineProperty(e,"ref",{get:u,configurable:!0})}}var Tt=function(e,s,u,g,C,A,x){var b={$$typeof:r,type:e,key:s,ref:u,props:x,_owner:A};return b._store={},Object.defineProperty(b._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:!1}),Object.defineProperty(b,"_self",{configurable:!1,enumerable:!1,writable:!1,value:g}),Object.defineProperty(b,"_source",{configurable:!1,enumerable:!1,writable:!1,value:C}),Object.freeze&&(Object.freeze(b.props),Object.freeze(b)),b};function Rt(e,s,u,g,C){{var A,x={},b=null,P=null;u!==void 0&&(Oe(u),b=""+u),St(s)&&(Oe(s.key),b=""+s.key),xt(s)&&(P=s.ref,Ct(s,C));for(A in s)Y.call(s,A)&&!bt.hasOwnProperty(A)&&(x[A]=s[A]);if(e&&e.defaultProps){var R=e.defaultProps;for(A in R)x[A]===void 0&&(x[A]=R[A])}if(b||P){var M=typeof e=="function"?e.displayName||e.name||"Unknown":e;b&&At(x,M),P&&kt(x,M)}return Tt(e,b,P,C,g,Fe.current,x)}}var fe=S.ReactCurrentOwner,Le=S.ReactDebugCurrentFrame;function z(e){if(e){var s=e._owner,u=te(e.type,e._source,s?s.type:null);Le.setExtraStackFrame(u)}else Le.setExtraStackFrame(null)}var de;de=!1;function pe(e){return typeof e=="object"&&e!==null&&e.$$typeof===r}function Ue(){{if(fe.current){var e=V(fe.current.type);if(e)return`
6
6
 
7
- Check the render method of \``+e+"`."}return""}}function kt(e){return""}var Le={};function Tt(e){{var n=$e();if(!n){var i=typeof e=="string"?e:e.displayName||e.name;i&&(n=`
7
+ Check the render method of \``+e+"`."}return""}}function Mt(e){return""}var Ve={};function It(e){{var s=Ue();if(!s){var u=typeof e=="string"?e:e.displayName||e.name;u&&(s=`
8
8
 
9
- Check the top-level render call using <`+i+">.")}return n}}function Ue(e,n){{if(!e._store||e._store.validated||e.key!=null)return;e._store.validated=!0;var i=Tt(n);if(Le[i])return;Le[i]=!0;var g="";e&&e._owner&&e._owner!==ce.current&&(g=" It was passed a child from "+D(e._owner.type)+"."),U(e),h('Each child in a list should have a unique "key" prop.%s%s See https://reactjs.org/link/warning-keys for more information.',i,g),U(null)}}function Ve(e,n){{if(typeof e!="object")return;if(ue(e))for(var i=0;i<e.length;i++){var g=e[i];fe(g)&&Ue(g,n)}else if(fe(e))e._store&&(e._store.validated=!0);else if(e){var C=T(e);if(typeof C=="function"&&C!==e.entries)for(var k=C.call(e),w;!(w=k.next()).done;)fe(w.value)&&Ue(w.value,n)}}}function Rt(e){{var n=e.type;if(n==null||typeof n=="string")return;var i;if(typeof n=="function")i=n.propTypes;else if(typeof n=="object"&&(n.$$typeof===d||n.$$typeof===_))i=n.propTypes;else return;if(i){var g=D(n);gt(i,e.props,"prop",g,e)}else if(n.PropTypes!==void 0&&!le){le=!0;var C=D(n);h("Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?",C||"Unknown")}typeof n.getDefaultProps=="function"&&!n.getDefaultProps.isReactClassApproved&&h("getDefaultProps is only used on classic React.createClass definitions. Use a static property named `defaultProps` instead.")}}function Mt(e){{for(var n=Object.keys(e.props),i=0;i<n.length;i++){var g=n[i];if(g!=="children"&&g!=="key"){U(e),h("Invalid prop `%s` supplied to `React.Fragment`. React.Fragment can only have `key` and `children` props.",g),U(null);break}}e.ref!==null&&(U(e),h("Invalid attribute `ref` supplied to `React.Fragment`."),U(null))}}var Be={};function He(e,n,i,g,C,k){{var w=ut(e);if(!w){var E="";(e===void 0||typeof e=="object"&&e!==null&&Object.keys(e).length===0)&&(E+=" You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.");var N=kt();N?E+=N:E+=$e();var R;e===null?R="null":ue(e)?R="array":e!==void 0&&e.$$typeof===r?(R="<"+(D(e.type)||"Unknown")+" />",E=" Did you accidentally export a JSX literal instead of a component?"):R=typeof e,h("React.jsx: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s",R,E)}var M=At(e,n,i,C,k);if(M==null)return M;if(w){var O=n.children;if(O!==void 0)if(g)if(ue(O)){for(var V=0;V<O.length;V++)Ve(O[V],e);Object.freeze&&Object.freeze(O)}else h("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.");else Ve(O,e)}if(z.call(n,"key")){var L=D(e),j=Object.keys(n).filter(function(Ft){return Ft!=="key"}),de=j.length>0?"{key: someKey, "+j.join(": ..., ")+": ...}":"{key: someKey}";if(!Be[L+de]){var Ot=j.length>0?"{"+j.join(": ..., ")+": ...}":"{}";h(`A props object containing a "key" prop is being spread into JSX:
9
+ Check the top-level render call using <`+u+">.")}return s}}function Be(e,s){{if(!e._store||e._store.validated||e.key!=null)return;e._store.validated=!0;var u=It(s);if(Ve[u])return;Ve[u]=!0;var g="";e&&e._owner&&e._owner!==fe.current&&(g=" It was passed a child from "+V(e._owner.type)+"."),z(e),v('Each child in a list should have a unique "key" prop.%s%s See https://reactjs.org/link/warning-keys for more information.',u,g),z(null)}}function We(e,s){{if(typeof e!="object")return;if(le(e))for(var u=0;u<e.length;u++){var g=e[u];pe(g)&&Be(g,s)}else if(pe(e))e._store&&(e._store.validated=!0);else if(e){var C=k(e);if(typeof C=="function"&&C!==e.entries)for(var A=C.call(e),x;!(x=A.next()).done;)pe(x.value)&&Be(x.value,s)}}}function Nt(e){{var s=e.type;if(s==null||typeof s=="string")return;var u;if(typeof s=="function")u=s.propTypes;else if(typeof s=="object"&&(s.$$typeof===f||s.$$typeof===m))u=s.propTypes;else return;if(u){var g=V(s);vt(u,e.props,"prop",g,e)}else if(s.PropTypes!==void 0&&!de){de=!0;var C=V(s);v("Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?",C||"Unknown")}typeof s.getDefaultProps=="function"&&!s.getDefaultProps.isReactClassApproved&&v("getDefaultProps is only used on classic React.createClass definitions. Use a static property named `defaultProps` instead.")}}function jt(e){{for(var s=Object.keys(e.props),u=0;u<s.length;u++){var g=s[u];if(g!=="children"&&g!=="key"){z(e),v("Invalid prop `%s` supplied to `React.Fragment`. React.Fragment can only have `key` and `children` props.",g),z(null);break}}e.ref!==null&&(z(e),v("Invalid attribute `ref` supplied to `React.Fragment`."),z(null))}}var ze={};function He(e,s,u,g,C,A){{var x=ft(e);if(!x){var b="";(e===void 0||typeof e=="object"&&e!==null&&Object.keys(e).length===0)&&(b+=" You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.");var P=Mt();P?b+=P:b+=Ue();var R;e===null?R="null":le(e)?R="array":e!==void 0&&e.$$typeof===r?(R="<"+(V(e.type)||"Unknown")+" />",b=" Did you accidentally export a JSX literal instead of a component?"):R=typeof e,v("React.jsx: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s",R,b)}var M=Rt(e,s,u,C,A);if(M==null)return M;if(x){var F=s.children;if(F!==void 0)if(g)if(le(F)){for(var H=0;H<F.length;H++)We(F[H],e);Object.freeze&&Object.freeze(F)}else v("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.");else We(F,e)}if(Y.call(s,"key")){var W=V(e),O=Object.keys(s).filter(function(Lt){return Lt!=="key"}),he=O.length>0?"{key: someKey, "+O.join(": ..., ")+": ...}":"{key: someKey}";if(!ze[W+he]){var $t=O.length>0?"{"+O.join(": ..., ")+": ...}":"{}";v(`A props object containing a "key" prop is being spread into JSX:
10
10
  let props = %s;
11
11
  <%s {...props} />
12
12
  React keys must be passed directly to JSX without using spread:
13
13
  let props = %s;
14
- <%s key={someKey} {...props} />`,de,L,Ot,L),Be[L+de]=!0}}return e===u?Mt(M):Rt(M),M}}function It(e,n,i){return He(e,n,i,!0)}function Nt(e,n,i){return He(e,n,i,!1)}var jt=Nt,Pt=It;G.Fragment=u,G.jsx=jt,G.jsxs=Pt})()),G}var Je;function qt(){return Je||(Je=1,process.env.NODE_ENV==="production"?re.exports=Yt():re.exports=Jt()),re.exports}var m=qt();const Xe="platform-kit",Kt=!1,he={log:(...t)=>{},warn:(...t)=>{},error:(...t)=>{console.error(`[${Xe}]`,...t)}};class Xt extends l.Component{hasDispatched=!1;constructor(r){super(r),this.state={hasError:!1}}getMfeName(){if(this.props.mfeName)return this.props.mfeName;if(typeof window<"u"){const r=window;if(r.__MF_NAME__)return r.__MF_NAME__}return Xe}shouldShowDetails(){if(this.props.showDetails!==void 0)return this.props.showDetails;if(typeof sessionStorage<"u")try{const r=sessionStorage.getItem("config");if(r){const s=JSON.parse(r);if(s.showErrorDetails!==void 0)return s.showErrorDetails}}catch{}return Kt}dispatchError(r,s){if(this.hasDispatched||typeof window>"u")return;this.hasDispatched=!0;const u=this.getMfeName();he.error("ErrorBoundary caught:",r);try{window.dispatchEvent(new CustomEvent("mfe-error",{detail:{mfeName:u,error:r.message||String(r),stack:r.stack,componentStack:s?.componentStack,timestamp:Date.now()},bubbles:!0}))}catch(o){he.error("Failed to dispatch mfe-error event:",o)}}static getDerivedStateFromError(r){return{hasError:!0,error:r}}componentDidCatch(r,s){this.dispatchError(r,s),he.error("Error info:",s.componentStack)}handleCopy=()=>{const r=`Error in ${this.getMfeName()}:
14
+ <%s key={someKey} {...props} />`,he,W,$t,W),ze[W+he]=!0}}return e===i?jt(M):Nt(M),M}}function Pt(e,s,u){return He(e,s,u,!0)}function Ot(e,s,u){return He(e,s,u,!1)}var Ft=Ot,Dt=Pt;J.Fragment=i,J.jsx=Ft,J.jsxs=Dt})()),J}var Ke;function hr(){return Ke||(Ke=1,process.env.NODE_ENV==="production"?ae.exports=dr():ae.exports=pr()),ae.exports}var _=hr();const nt="platform-kit",gr=!1,me={log:(...t)=>{},warn:(...t)=>{},error:(...t)=>{console.error(`[${nt}]`,...t)}};class mr extends c.Component{hasDispatched=!1;constructor(r){super(r),this.state={hasError:!1}}getMfeName(){if(this.props.mfeName)return this.props.mfeName;if(typeof window<"u"){const r=window;if(r.__MF_NAME__)return r.__MF_NAME__}return nt}shouldShowDetails(){if(this.props.showDetails!==void 0)return this.props.showDetails;if(typeof sessionStorage<"u")try{const r=sessionStorage.getItem("config");if(r){const a=JSON.parse(r);if(a.showErrorDetails!==void 0)return a.showErrorDetails}}catch{}return gr}dispatchError(r,a){if(this.hasDispatched||typeof window>"u")return;this.hasDispatched=!0;const i=this.getMfeName();me.error("ErrorBoundary caught:",r);try{window.dispatchEvent(new CustomEvent("mfe-error",{detail:{mfeName:i,error:r.message||String(r),stack:r.stack,componentStack:a?.componentStack,timestamp:Date.now()},bubbles:!0}))}catch(o){me.error("Failed to dispatch mfe-error event:",o)}}static getDerivedStateFromError(r){return{hasError:!0,error:r}}componentDidCatch(r,a){this.dispatchError(r,a),me.error("Error info:",a.componentStack)}handleCopy=()=>{const r=`Error in ${this.getMfeName()}:
15
15
  ${this.state.error?.message}
16
- ${this.state.error?.stack}`;typeof navigator<"u"&&navigator.clipboard&&navigator.clipboard.writeText(r).then(()=>{alert("Ошибка скопирована в буфер обмена")}).catch(()=>{prompt("Скопируйте ошибку:",r)})};handleRetry=()=>{this.setState({hasError:!1,error:void 0}),this.hasDispatched=!1,typeof window<"u"&&window.location.reload()};handleGoHome=()=>{typeof window<"u"&&(window.location.href="/")};render(){if(this.state.hasError){const r=this.state.error?.message||"Unknown error",s=this.state.error?.stack||"",u=this.shouldShowDetails(),o=this.getMfeName();return m.jsxs("div",{style:{padding:"20px",textAlign:"center",color:"#d32f2f",fontFamily:"monospace",background:"#ffebee",border:"1px solid #ef5350",borderRadius:"4px",margin:"10px"},children:[m.jsxs("h2",{style:{fontSize:"16px",margin:"0 0 8px 0"},children:["⚠️ Ошибка в ",o]}),m.jsx("p",{style:{fontSize:"12px",margin:0},children:"Произошла ошибка в микрофронтенде. Сообщение отправлено в shell."}),u&&m.jsxs("details",{style:{whiteSpace:"pre-wrap",textAlign:"left",marginTop:"10px",background:"#fff",padding:"8px",borderRadius:"4px"},children:[m.jsx("summary",{style:{cursor:"pointer",fontWeight:"bold"},children:"Детали ошибки"}),m.jsxs("pre",{style:{fontSize:"11px",overflow:"auto",maxHeight:"150px",margin:"8px 0 0 0",padding:"8px",background:"#f5f5f5",borderRadius:"4px"},children:[r,s&&`
16
+ ${this.state.error?.stack}`;typeof navigator<"u"&&navigator.clipboard&&navigator.clipboard.writeText(r).then(()=>{alert("Ошибка скопирована в буфер обмена")}).catch(()=>{prompt("Скопируйте ошибку:",r)})};handleRetry=()=>{this.setState({hasError:!1,error:void 0}),this.hasDispatched=!1,typeof window<"u"&&window.location.reload()};handleGoHome=()=>{typeof window<"u"&&(window.location.href="/")};render(){if(this.state.hasError){const r=this.state.error?.message||"Unknown error",a=this.state.error?.stack||"",i=this.shouldShowDetails(),o=this.getMfeName();return _.jsxs("div",{style:{padding:"20px",textAlign:"center",color:"#d32f2f",fontFamily:"monospace",background:"#ffebee",border:"1px solid #ef5350",borderRadius:"4px",margin:"10px"},children:[_.jsxs("h2",{style:{fontSize:"16px",margin:"0 0 8px 0"},children:["⚠️ Ошибка в ",o]}),_.jsx("p",{style:{fontSize:"12px",margin:0},children:"Произошла ошибка в микрофронтенде. Сообщение отправлено в shell."}),i&&_.jsxs("details",{style:{whiteSpace:"pre-wrap",textAlign:"left",marginTop:"10px",background:"#fff",padding:"8px",borderRadius:"4px"},children:[_.jsx("summary",{style:{cursor:"pointer",fontWeight:"bold"},children:"Детали ошибки"}),_.jsxs("pre",{style:{fontSize:"11px",overflow:"auto",maxHeight:"150px",margin:"8px 0 0 0",padding:"8px",background:"#f5f5f5",borderRadius:"4px"},children:[r,a&&`
17
17
 
18
- ${s}`]})]}),m.jsxs("div",{style:{marginTop:"12px",display:"flex",gap:"8px",justifyContent:"center"},children:[m.jsx("button",{onClick:this.handleCopy,style:{padding:"8px 12px",background:"#666",color:"white",border:"none",borderRadius:"4px",cursor:"pointer"},children:"📋 Копировать"}),m.jsx("button",{onClick:this.handleRetry,style:{padding:"8px 12px",background:"#d32f2f",color:"white",border:"none",borderRadius:"4px",cursor:"pointer"},children:"🔄 Обновить"}),m.jsx("button",{onClick:this.handleGoHome,style:{padding:"8px 12px",background:"#1976d2",color:"white",border:"none",borderRadius:"4px",cursor:"pointer"},children:"🏠 На главную"})]})]})}return this.props.children==null?null:this.props.children}}const F={info:"ℹ️",code:"💻",link:"🔗",user:"👤",clock:"🕐",apps:"📦",storage:"💾",tags:"🏷️",spreadsheet:"📊"};function Zt({mfeName:t}){const{data:r,isLoading:s,error:u}=qe({mfeName:t}),[o,p]=l.useState(!1);if(s)return m.jsxs("span",{className:"text-muted small me-2",children:[m.jsx("span",{className:"me-1",children:"⏳"}),"Загрузка..."]});if(u||!r)return m.jsxs("span",{className:"text-muted small me-2",title:`Ошибка: ${u||"нет данных"}`,children:[m.jsx("span",{className:"me-1",children:"ℹ️"}),"N/A"]});const a=r,S=a.BUILD_VERSION||a.IMAGE_VERSION||a.APP_NAME||"N/A",d=[];return a.APP_NAME&&d.push({key:"APP_NAME",value:a.APP_NAME,label:"Приложение",icon:F.apps}),a.BUILD_VERSION&&d.push({key:"BUILD_VERSION",value:a.BUILD_VERSION,label:"Версия",icon:F.tags}),a.IMAGE_VERSION&&d.push({key:"IMAGE_VERSION",value:a.IMAGE_VERSION,label:"Образ",icon:F.storage}),a.GIT_COMMIT&&d.push({key:"GIT_COMMIT",value:a.GIT_COMMIT,label:"Commit",icon:F.spreadsheet}),a.GIT_BRANCH&&d.push({key:"GIT_BRANCH",value:a.GIT_BRANCH,label:"Ветка",icon:F.spreadsheet}),a.CI_COMMIT_AUTHOR&&d.push({key:"CI_COMMIT_AUTHOR",value:a.CI_COMMIT_AUTHOR,label:"Автор",icon:F.user}),a.CI_COMMIT_TIMESTAMP&&d.push({key:"CI_COMMIT_TIMESTAMP",value:a.CI_COMMIT_TIMESTAMP,label:"Дата",icon:F.clock}),a.CI_JOB_URL&&d.push({key:"CI_JOB_URL",value:a.CI_JOB_URL,label:"CI Job",icon:F.link}),a.CI_PIPELINE_URL&&d.push({key:"CI_PIPELINE_URL",value:a.CI_PIPELINE_URL,label:"Pipeline",icon:F.link}),a.CI_COMMIT_MESSAGE&&(a.CI_COMMIT_MESSAGE.length>60?a.CI_COMMIT_MESSAGE.substring(0,57)+"":a.CI_COMMIT_MESSAGE,d.push({key:"CI_COMMIT_MESSAGE",value:a.CI_COMMIT_MESSAGE,label:"Сообщение",icon:F.code})),m.jsxs("div",{style:{display:"inline-block",position:"relative"},children:[m.jsxs("button",{onClick:()=>p(!o),style:{background:"transparent",border:"none",cursor:"pointer",padding:"4px 8px",fontSize:"14px",display:"inline-flex",alignItems:"center"},title:"Информация о версии",children:[m.jsx("span",{className:"me-1",children:F.info}),m.jsx("span",{className:"text-dark",children:S})]}),o&&m.jsxs("div",{style:{position:"absolute",top:"100%",right:0,zIndex:1e3,minWidth:"300px",background:"white",border:"1px solid #dee2e6",borderRadius:"8px",boxShadow:"0 4px 12px rgba(0,0,0,0.15)",padding:"16px",marginTop:"4px"},children:[m.jsxs("div",{style:{marginBottom:"12px",paddingBottom:"8px",borderBottom:"1px solid #dee2e6",display:"flex",alignItems:"center"},children:[m.jsx("span",{className:"me-2",children:F.apps}),m.jsx("strong",{children:a.APP_NAME||t})]}),m.jsxs("div",{style:{marginBottom:"12px"},children:[m.jsx("span",{className:"text-muted",children:"Версия: "}),m.jsx("strong",{children:S})]}),d.length>0&&m.jsx("div",{style:{fontSize:"13px"},children:d.map(({key:y,value:f,label:_,icon:c})=>{const v=f.length>40&&(y.includes("URL")||y.includes("MESSAGE"))?`${f.substring(0,37)}...`:f;return m.jsxs("div",{style:{marginBottom:"8px",display:"flex",alignItems:"flex-start"},children:[m.jsx("span",{className:"me-2",style:{flexShrink:0},children:c}),m.jsxs("div",{style:{flex:1,minWidth:0},children:[m.jsx("div",{className:"small text-muted",children:_}),m.jsx("div",{className:"font-monospace small text-truncate",style:{maxWidth:"100%"},title:f,children:y.includes("URL")?m.jsx("a",{href:f,target:"_blank",rel:"noopener noreferrer",style:{color:"#007bff"},children:v}):v})]})]},y)})}),d.length===0&&m.jsx("div",{className:"text-center text-muted py-2 small",children:"Нет информации о версии"}),m.jsx("div",{style:{marginTop:"12px",paddingTop:"8px",borderTop:"1px solid #dee2e6",textAlign:"center",fontSize:"12px",color:"#6c757d"},children:"IngoBank DevOps Platform"}),m.jsx("button",{onClick:()=>p(!1),style:{position:"absolute",top:"8px",right:"8px",background:"transparent",border:"none",cursor:"pointer",fontSize:"16px",color:"#6c757d"},children:"×"})]}),o&&m.jsx("div",{onClick:()=>p(!1),style:{position:"fixed",top:0,left:0,right:0,bottom:0,zIndex:999}})]})}const ge="platform-kit",Ze=l.createContext(null);function Qt({children:t}){const[r,s]=l.useState([]),u=typeof window<"u"&&window.__MF_NAME__||ge,o=l.useCallback((c,v,b,I)=>({id:`${Date.now()}-${Math.random().toString(36).substr(2,9)}`,type:c,title:v,message:b,mfeName:u,timestamp:Date.now(),duration:I}),[u]),p=l.useCallback(c=>{s(b=>[...b,c].slice(0,5));const v=c.duration||5e3;v>0&&setTimeout(()=>{s(b=>b.filter(I=>I.id!==c.id))},v)},[]),a=l.useCallback(c=>{const v=o(c.type,c.title,c.message,c.duration);p(v),typeof window<"u"&&window.dispatchEvent(new CustomEvent("mfe-notification",{detail:v,bubbles:!0}))},[o,p]),S=l.useCallback((c,v="Успешно")=>{a({type:"success",title:v,message:c})},[a]),d=l.useCallback((c,v="Ошибка")=>{a({type:"error",title:v,message:c})},[a]),y=l.useCallback((c,v="Предупреждение")=>{a({type:"warning",title:v,message:c})},[a]),f=l.useCallback((c,v="Информация")=>{a({type:"info",title:v,message:c})},[a]),_=l.useCallback(c=>{s(v=>v.filter(b=>b.id!==c))},[]);return l.useEffect(()=>{if(typeof window>"u")return;const c=v=>{const b=v.detail;if(b&&b.type&&b.title&&b.message){const I={...b,id:`${Date.now()}-${Math.random().toString(36).substr(2,9)}`};p(I)}};return window.addEventListener("mfe-notification",c),()=>{window.removeEventListener("mfe-notification",c)}},[p]),m.jsxs(Ze.Provider,{value:{notify:a,notifySuccess:S,notifyError:d,notifyWarning:y,notifyInfo:f,removeNotification:_},children:[t,r.length>0&&m.jsx("div",{style:{position:"fixed",top:"80px",right:"20px",zIndex:9998,maxWidth:"400px",width:"100%",display:"flex",flexDirection:"column",gap:"8px",pointerEvents:"none"},children:r.map(c=>m.jsxs("div",{className:`notification notification-${c.type}`,style:{pointerEvents:"auto",padding:"12px 16px",borderRadius:"8px",background:c.type==="success"?"#d4edda":c.type==="error"?"#f8d7da":c.type==="warning"?"#fff3cd":"#d1ecf1",color:c.type==="success"?"#155724":c.type==="error"?"#721c24":c.type==="warning"?"#856404":"#0c5460",boxShadow:"0 4px 12px rgba(0,0,0,0.15)",display:"flex",alignItems:"flex-start",gap:"12px"},children:[m.jsxs("div",{style:{flex:1},children:[m.jsx("strong",{style:{display:"block",marginBottom:"4px"},children:c.title}),m.jsx("p",{style:{margin:0,fontSize:"14px"},children:c.message}),m.jsx("small",{style:{opacity:.7,fontSize:"12px"},children:c.mfeName})]}),m.jsx("button",{onClick:()=>_(c.id),style:{background:"transparent",border:"none",cursor:"pointer",fontSize:"18px",lineHeight:1,opacity:.5},children:"×"})]},c.id))})]})}function er(){const t=l.useContext(Ze);return t||{notify:()=>{},notifySuccess:()=>{},notifyError:()=>{},notifyWarning:()=>{},notifyInfo:()=>{},removeNotification:()=>{}}}function tr(t){if(typeof window>"u")return;const r=window.__MF_NAME__||ge,s={...t,mfeName:r,timestamp:Date.now()};window.dispatchEvent(new CustomEvent("mfe-notification",{detail:s,bubbles:!0}))}const Qe="platform-kit",Y={log:(...t)=>{},warn:(...t)=>{},error:(...t)=>{console.error(`[${Qe}]`,...t)},info:(...t)=>{}};function rr(){if(typeof window>"u")return{isAuthenticated:!1};const t=window.__SHELL_AUTH_INSTANCE__;if(t)return t;const r=window.__SHELL_AUTH__;return r?.authInstance?r.authInstance:{isAuthenticated:!1}}function nr(){if(typeof window>"u")return;const t=window.__SHELL_AUTH_INSTANCE__;t?.signinRedirect?t.signinRedirect().catch(r=>{Y.error("Failed to redirect to login:",r)}):window.location.href="/"}function sr(t){const r=t.response;let s="unknown";return r?r.status===401?s="unauthorized":r.status===403?s="forbidden":r.status===404?s="not_found":r.status>=500&&(s="server"):s="network",{message:r?.data?.message??t.message??"Unknown error",code:r?.data?.code,status:r?.status,type:s,timestamp:Date.now(),url:t.config?.url}}function et(t={}){const r=t.name||Qe,s={log:(...o)=>Y.log(`[API:${r}]`,...o),warn:(...o)=>Y.warn(`[API:${r}]`,...o),error:(...o)=>Y.error(`[API:${r}]`,...o),info:(...o)=>Y.info(`[API:${r}]`,...o)},u=Dt.create({timeout:t.timeout??1e4,baseURL:t.baseURL??"",headers:{"Content-Type":"application/json"}});return u.interceptors.request.use(o=>{const p=rr();if(p?.isAuthenticated){const a=p.user?.profile?.access_token;a&&o.headers&&(o.headers.Authorization=`Bearer ${a}`,s.info("Auth token attached"))}else s.info("User not authenticated - request without token");return s.log(`${o.method?.toUpperCase()} ${o.url}`),o},o=>(s.error("Request interceptor error:",o.message),Promise.reject(o))),u.interceptors.response.use(o=>(s.log(`Response ${o.status}:`,o.config.url),o),o=>{const p=o.response?.status,a=o.config?.url;return p===401?(s.warn("401 Unauthorized - triggering re-auth"),nr()):p===403?s.warn("403 Forbidden - insufficient permissions"):p===404?s.warn("404 Not found:",a):p===429?s.warn("429 Rate limited"):p===500?s.error("500 Server error:",a):o.response?s.warn(`Error ${p}:`,o.message):s.error("Network error - backend may be unavailable:",a),Promise.reject(sr(o))}),u}const q=et();async function ar(t,r,s=q){const u=await s.get(t,{params:r});return{data:u.data,status:u.status,ok:u.status>=200&&u.status<300}}async function or(t,r,s=q){const u=await s.post(t,r);return{data:u.data,status:u.status,ok:u.status>=200&&u.status<300}}async function ir(t,r,s=q){const u=await s.put(t,r);return{data:u.data,status:u.status,ok:u.status>=200&&u.status<300}}async function ur(t,r=q){const s=await r.delete(t);return{data:s.data,status:s.status,ok:s.status>=200&&s.status<300}}function K(t,r){const s=r?.prefix?`[${r.prefix}]`:`[${t}]`;return{log:(...u)=>{},warn:(...u)=>{},error:(...u)=>{console.error(s,...u)},info:(...u)=>{}}}const cr=K("platform-kit",{prefix:"AUTH"}),lr=K("platform-kit",{prefix:"API"}),fr=K("platform-kit",{prefix:"ERROR"}),dr=K("platform-kit",{prefix:"INFO"}),pr={},hr={log:(...t)=>{},warn:(...t)=>{},error:(...t)=>{console.error("[getMfeName]",...t)}};function _e(t){return t?t.mfeName?t.mfeName:t.name?t.name.replace("@ib-dop/",""):null:null}function tt(){if(typeof window>"u")return null;const t=window;return t.__MF_NAME__?t.__MF_NAME__:null}function rt(){if(typeof window>"u")return null;try{const t=sessionStorage.getItem("mf-config");if(t){const r=JSON.parse(t);if(r.mfeName)return r.mfeName;if(r.name)return r.name;if(r.appName)return r.appName}}catch{}return null}function ve(){const t=pr;return t.VITE_MFE_NAME?String(t.VITE_MFE_NAME):t.MFE_NAME?String(t.MFE_NAME):null}let se=null,me=!1;function nt(t,r){const s=_e(t);if(s)return s;if(me&&se)return se;const u=[{source:"window.__MF_NAME__",value:tt()},{source:"sessionStorage.mf-config",value:rt()},{source:"import.meta.env.VITE_MFE_NAME",value:ve()}];for(const{source:p,value:a}of u)if(a)return se=a,me=!0,a;if(r)return r;const o="Cannot determine MFE name. Please pass mfeName in props, set window.__MF_NAME__, sessionStorage.mf-config, or VITE_MFE_NAME";throw hr.error(o),new Error(o)}function gr(t){return nt(t)}function st(t){return _e(t)?"props.mfeName":tt()?"window.__MF_NAME__":rt()?"sessionStorage.mf-config":ve()?"import.meta.env.VITE_MFE_NAME":null}function mr(t){return st(t)!==null}function _r(){se=null,me=!1}function vr(t){const r=[];return _e(t)&&r.push("props.mfeName"),typeof window<"u"&&(window.__MF_NAME__&&r.push("window.__MF_NAME__"),sessionStorage.getItem("mf-config")&&r.push("sessionStorage.mf-config")),ve()&&r.push("import.meta.env.VITE_MFE_NAME"),r}exports.ErrorBoundary=Xt;exports.NotificationProvider=Qt;exports.VersionInfo=Zt;exports.api=q;exports.apiLogger=lr;exports.authLogger=cr;exports.createApiClient=et;exports.createMfLogger=K;exports.del=ur;exports.dispatchNotification=tr;exports.errorLogger=fr;exports.get=ar;exports.getAllMfeNameSources=vr;exports.getAuth=ne;exports.getMfeName=nt;exports.getMfeNameSource=st;exports.hasMfeName=mr;exports.infoLogger=dr;exports.post=or;exports.put=ir;exports.requireMfeName=gr;exports.resetMfeNameCache=_r;exports.useApi=Vt;exports.useFeatureAdmin=Wt;exports.useFeatures=zt;exports.useInfoData=qe;exports.useMicrofrontendsFeatures=Gt;exports.useNotification=er;exports.usePermissions=Ht;exports.useShellAuth=J;exports.useV1Config=Ut;
18
+ ${a}`]})]}),_.jsxs("div",{style:{marginTop:"12px",display:"flex",gap:"8px",justifyContent:"center"},children:[_.jsx("button",{onClick:this.handleCopy,style:{padding:"8px 12px",background:"#666",color:"white",border:"none",borderRadius:"4px",cursor:"pointer"},children:"📋 Копировать"}),_.jsx("button",{onClick:this.handleRetry,style:{padding:"8px 12px",background:"#d32f2f",color:"white",border:"none",borderRadius:"4px",cursor:"pointer"},children:"🔄 Обновить"}),_.jsx("button",{onClick:this.handleGoHome,style:{padding:"8px 12px",background:"#1976d2",color:"white",border:"none",borderRadius:"4px",cursor:"pointer"},children:"🏠 На главную"})]})]})}return this.props.children==null?null:this.props.children}}const D={info:"ℹ️",code:"💻",link:"🔗",user:"👤",clock:"🕐",apps:"📦",storage:"💾",tags:"🏷️",spreadsheet:"📊"};function _r({mfeName:t}){const{data:r,isLoading:a,error:i}=Qe({mfeName:t}),[o,p]=c.useState(!1);if(a)return _.jsxs("span",{className:"text-muted small me-2",children:[_.jsx("span",{className:"me-1",children:"⏳"}),"Загрузка..."]});if(i||!r)return _.jsxs("span",{className:"text-muted small me-2",title:`Ошибка: ${i||"нет данных"}`,children:[_.jsx("span",{className:"me-1",children:"ℹ️"}),"N/A"]});const n=r,h=n.BUILD_VERSION||n.IMAGE_VERSION||n.APP_NAME||"N/A",f=[];return n.APP_NAME&&f.push({key:"APP_NAME",value:n.APP_NAME,label:"Приложение",icon:D.apps}),n.BUILD_VERSION&&f.push({key:"BUILD_VERSION",value:n.BUILD_VERSION,label:"Версия",icon:D.tags}),n.IMAGE_VERSION&&f.push({key:"IMAGE_VERSION",value:n.IMAGE_VERSION,label:"Образ",icon:D.storage}),n.GIT_COMMIT&&f.push({key:"GIT_COMMIT",value:n.GIT_COMMIT,label:"Commit",icon:D.spreadsheet}),n.GIT_BRANCH&&f.push({key:"GIT_BRANCH",value:n.GIT_BRANCH,label:"Ветка",icon:D.spreadsheet}),n.CI_COMMIT_AUTHOR&&f.push({key:"CI_COMMIT_AUTHOR",value:n.CI_COMMIT_AUTHOR,label:"Автор",icon:D.user}),n.CI_COMMIT_TIMESTAMP&&f.push({key:"CI_COMMIT_TIMESTAMP",value:n.CI_COMMIT_TIMESTAMP,label:"Дата",icon:D.clock}),n.CI_JOB_URL&&f.push({key:"CI_JOB_URL",value:n.CI_JOB_URL,label:"CI Job",icon:D.link}),n.CI_PIPELINE_URL&&f.push({key:"CI_PIPELINE_URL",value:n.CI_PIPELINE_URL,label:"Pipeline",icon:D.link}),n.CI_COMMIT_MESSAGE&&(n.CI_COMMIT_MESSAGE.length>60?n.CI_COMMIT_MESSAGE.substring(0,57)+"":n.CI_COMMIT_MESSAGE,f.push({key:"CI_COMMIT_MESSAGE",value:n.CI_COMMIT_MESSAGE,label:"Сообщение",icon:D.code})),_.jsxs("div",{style:{display:"inline-block",position:"relative"},children:[_.jsxs("button",{onClick:()=>p(!o),style:{background:"transparent",border:"none",cursor:"pointer",padding:"4px 8px",fontSize:"14px",display:"inline-flex",alignItems:"center"},title:"Информация о версии",children:[_.jsx("span",{className:"me-1",children:D.info}),_.jsx("span",{className:"text-dark",children:h})]}),o&&_.jsxs("div",{style:{position:"absolute",top:"100%",right:0,zIndex:1e3,minWidth:"300px",background:"white",border:"1px solid #dee2e6",borderRadius:"8px",boxShadow:"0 4px 12px rgba(0,0,0,0.15)",padding:"16px",marginTop:"4px"},children:[_.jsxs("div",{style:{marginBottom:"12px",paddingBottom:"8px",borderBottom:"1px solid #dee2e6",display:"flex",alignItems:"center"},children:[_.jsx("span",{className:"me-2",children:D.apps}),_.jsx("strong",{children:n.APP_NAME||t})]}),_.jsxs("div",{style:{marginBottom:"12px"},children:[_.jsx("span",{className:"text-muted",children:"Версия: "}),_.jsx("strong",{children:h})]}),f.length>0&&_.jsx("div",{style:{fontSize:"13px"},children:f.map(({key:E,value:l,label:m,icon:d})=>{const w=l.length>40&&(E.includes("URL")||E.includes("MESSAGE"))?`${l.substring(0,37)}...`:l;return _.jsxs("div",{style:{marginBottom:"8px",display:"flex",alignItems:"flex-start"},children:[_.jsx("span",{className:"me-2",style:{flexShrink:0},children:d}),_.jsxs("div",{style:{flex:1,minWidth:0},children:[_.jsx("div",{className:"small text-muted",children:m}),_.jsx("div",{className:"font-monospace small text-truncate",style:{maxWidth:"100%"},title:l,children:E.includes("URL")?_.jsx("a",{href:l,target:"_blank",rel:"noopener noreferrer",style:{color:"#007bff"},children:w}):w})]})]},E)})}),f.length===0&&_.jsx("div",{className:"text-center text-muted py-2 small",children:"Нет информации о версии"}),_.jsx("div",{style:{marginTop:"12px",paddingTop:"8px",borderTop:"1px solid #dee2e6",textAlign:"center",fontSize:"12px",color:"#6c757d"},children:"IngoBank DevOps Platform"}),_.jsx("button",{onClick:()=>p(!1),style:{position:"absolute",top:"8px",right:"8px",background:"transparent",border:"none",cursor:"pointer",fontSize:"16px",color:"#6c757d"},children:"×"})]}),o&&_.jsx("div",{onClick:()=>p(!1),style:{position:"fixed",top:0,left:0,right:0,bottom:0,zIndex:999}})]})}const _e="platform-kit",st=c.createContext(null);function vr({children:t}){const[r,a]=c.useState([]),i=typeof window<"u"&&window.__MF_NAME__||_e,o=c.useCallback((d,w,y,I)=>({id:`${Date.now()}-${Math.random().toString(36).substr(2,9)}`,type:d,title:w,message:y,mfeName:i,timestamp:Date.now(),duration:I}),[i]),p=c.useCallback(d=>{a(y=>[...y,d].slice(0,5));const w=d.duration||5e3;w>0&&setTimeout(()=>{a(y=>y.filter(I=>I.id!==d.id))},w)},[]),n=c.useCallback(d=>{const w=o(d.type,d.title,d.message,d.duration);p(w),typeof window<"u"&&window.dispatchEvent(new CustomEvent("mfe-notification",{detail:w,bubbles:!0}))},[o,p]),h=c.useCallback((d,w="Успешно")=>{n({type:"success",title:w,message:d})},[n]),f=c.useCallback((d,w="Ошибка")=>{n({type:"error",title:w,message:d})},[n]),E=c.useCallback((d,w="Предупреждение")=>{n({type:"warning",title:w,message:d})},[n]),l=c.useCallback((d,w="Информация")=>{n({type:"info",title:w,message:d})},[n]),m=c.useCallback(d=>{a(w=>w.filter(y=>y.id!==d))},[]);return c.useEffect(()=>{if(typeof window>"u")return;const d=w=>{const y=w.detail;if(y&&y.type&&y.title&&y.message){const I={...y,id:`${Date.now()}-${Math.random().toString(36).substr(2,9)}`};p(I)}};return window.addEventListener("mfe-notification",d),()=>{window.removeEventListener("mfe-notification",d)}},[p]),_.jsxs(st.Provider,{value:{notify:n,notifySuccess:h,notifyError:f,notifyWarning:E,notifyInfo:l,removeNotification:m},children:[t,r.length>0&&_.jsx("div",{style:{position:"fixed",top:"80px",right:"20px",zIndex:9998,maxWidth:"400px",width:"100%",display:"flex",flexDirection:"column",gap:"8px",pointerEvents:"none"},children:r.map(d=>_.jsxs("div",{className:`notification notification-${d.type}`,style:{pointerEvents:"auto",padding:"12px 16px",borderRadius:"8px",background:d.type==="success"?"#d4edda":d.type==="error"?"#f8d7da":d.type==="warning"?"#fff3cd":"#d1ecf1",color:d.type==="success"?"#155724":d.type==="error"?"#721c24":d.type==="warning"?"#856404":"#0c5460",boxShadow:"0 4px 12px rgba(0,0,0,0.15)",display:"flex",alignItems:"flex-start",gap:"12px"},children:[_.jsxs("div",{style:{flex:1},children:[_.jsx("strong",{style:{display:"block",marginBottom:"4px"},children:d.title}),_.jsx("p",{style:{margin:0,fontSize:"14px"},children:d.message}),_.jsx("small",{style:{opacity:.7,fontSize:"12px"},children:d.mfeName})]}),_.jsx("button",{onClick:()=>m(d.id),style:{background:"transparent",border:"none",cursor:"pointer",fontSize:"18px",lineHeight:1,opacity:.5},children:"×"})]},d.id))})]})}function Er(){const t=c.useContext(st);return t||{notify:()=>{},notifySuccess:()=>{},notifyError:()=>{},notifyWarning:()=>{},notifyInfo:()=>{},removeNotification:()=>{}}}function yr(t){if(typeof window>"u")return;const r=window.__MF_NAME__||_e,a={...t,mfeName:r,timestamp:Date.now()};window.dispatchEvent(new CustomEvent("mfe-notification",{detail:a,bubbles:!0}))}function Z(t,r){const a=r?.prefix?`[${r.prefix}]`:`[${t}]`;return{log:(...i)=>{},warn:(...i)=>{},error:(...i)=>{console.error(a,...i)},info:(...i)=>{}}}const wr=Z("platform-kit",{prefix:"AUTH"}),br=Z("platform-kit",{prefix:"API"}),xr=Z("platform-kit",{prefix:"ERROR"}),Sr=Z("platform-kit",{prefix:"INFO"}),Cr={},Ar={log:(...t)=>{},warn:(...t)=>{},error:(...t)=>{console.error("[getMfeName]",...t)}};function Ee(t){return t?t.mfeName?t.mfeName:t.name?t.name.replace("@ib-dop/",""):null:null}function at(){if(typeof window>"u")return null;const t=window;return t.__MF_NAME__?t.__MF_NAME__:null}function ot(){if(typeof window>"u")return null;try{const t=sessionStorage.getItem("mf-config");if(t){const r=JSON.parse(t);if(r.mfeName)return r.mfeName;if(r.name)return r.name;if(r.appName)return r.appName}}catch{}return null}function ye(){const t=Cr;return t.VITE_MFE_NAME?String(t.VITE_MFE_NAME):t.MFE_NAME?String(t.MFE_NAME):null}let oe=null,ve=!1;function it(t,r){const a=Ee(t);if(a)return a;if(ve&&oe)return oe;const i=[{source:"window.__MF_NAME__",value:at()},{source:"sessionStorage.mf-config",value:ot()},{source:"import.meta.env.VITE_MFE_NAME",value:ye()}];for(const{source:p,value:n}of i)if(n)return oe=n,ve=!0,n;if(r)return r;const o="Cannot determine MFE name. Please pass mfeName in props, set window.__MF_NAME__, sessionStorage.mf-config, or VITE_MFE_NAME";throw Ar.error(o),new Error(o)}function kr(t){return it(t)}function ut(t){return Ee(t)?"props.mfeName":at()?"window.__MF_NAME__":ot()?"sessionStorage.mf-config":ye()?"import.meta.env.VITE_MFE_NAME":null}function Tr(t){return ut(t)!==null}function Rr(){oe=null,ve=!1}function Mr(t){const r=[];return Ee(t)&&r.push("props.mfeName"),typeof window<"u"&&(window.__MF_NAME__&&r.push("window.__MF_NAME__"),sessionStorage.getItem("mf-config")&&r.push("sessionStorage.mf-config")),ye()&&r.push("import.meta.env.VITE_MFE_NAME"),r}exports.ErrorBoundary=mr;exports.NotificationProvider=vr;exports.VersionInfo=_r;exports.api=U;exports.apiLogger=br;exports.authLogger=wr;exports.createApiClient=tt;exports.createMfLogger=Z;exports.del=tr;exports.dispatchNotification=yr;exports.errorLogger=xr;exports.get=Zt;exports.getAccessToken=Vt;exports.getAllMfeNameSources=Mr;exports.getAuthState=Xe;exports.getMfeName=it;exports.getMfeNameSource=ut;exports.getShellAuth=L;exports.hasMfeName=Tr;exports.infoLogger=Sr;exports.isAuthenticated=Bt;exports.logout=Wt;exports.post=Qt;exports.put=er;exports.redirectToLogin=Ze;exports.requireMfeName=kr;exports.resetMfeNameCache=Rr;exports.useApi=X;exports.useDel=or;exports.useFeatureAdmin=lr;exports.useFeatures=cr;exports.useGet=nr;exports.useInfoData=Qe;exports.useMicrofrontendsFeatures=fr;exports.useNotification=Er;exports.usePermissions=ur;exports.usePost=sr;exports.usePut=ar;exports.useShellAuth=K;exports.useV1Config=Gt;