@synopackageland/sdk 0.10.9 → 0.10.11

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 (58) hide show
  1. package/README.md +75 -29
  2. package/dist/i18n/authorization/de.json +6 -1
  3. package/dist/i18n/authorization/en.json +6 -1
  4. package/dist/i18n/authorization/es.json +6 -1
  5. package/dist/i18n/authorization/fr.json +6 -1
  6. package/dist/i18n/authorization/it.json +6 -1
  7. package/dist/i18n/authorization/ja.json +6 -1
  8. package/dist/i18n/authorization/ko.json +6 -1
  9. package/dist/i18n/authorization/zh-CN.json +6 -1
  10. package/dist/i18n/authorization/zh-TW.json +6 -1
  11. package/dist/i18n/delegate/de.json +19 -12
  12. package/dist/i18n/delegate/en.json +19 -12
  13. package/dist/i18n/delegate/es.json +19 -12
  14. package/dist/i18n/delegate/fr.json +19 -12
  15. package/dist/i18n/delegate/it.json +19 -12
  16. package/dist/i18n/delegate/ja.json +19 -12
  17. package/dist/i18n/delegate/ko.json +19 -12
  18. package/dist/i18n/delegate/zh-CN.json +19 -12
  19. package/dist/i18n/delegate/zh-TW.json +19 -12
  20. package/dist/i18n/save/de.json +3 -25
  21. package/dist/i18n/save/en.json +3 -25
  22. package/dist/i18n/save/es.json +3 -25
  23. package/dist/i18n/save/fr.json +3 -25
  24. package/dist/i18n/save/it.json +3 -25
  25. package/dist/i18n/save/ja.json +3 -25
  26. package/dist/i18n/save/ko.json +3 -25
  27. package/dist/i18n/save/zh-CN.json +3 -25
  28. package/dist/i18n/save/zh-TW.json +3 -25
  29. package/dist/index.js +2796 -2817
  30. package/dist/src/authorization/failure.d.ts +2 -0
  31. package/dist/src/authorization/refusal.d.ts +10 -0
  32. package/dist/src/background/BackgroundPanel.vue.d.ts +1 -1
  33. package/dist/src/background/i18n.d.ts +1 -1
  34. package/dist/src/delegate/BackgroundSavePanel.vue.d.ts +1 -1
  35. package/dist/src/delegate/BackgroundSaveSettings.vue.d.ts +3 -6
  36. package/dist/src/delegate/DelegatePanel.vue.d.ts +1 -1
  37. package/dist/src/delegate/ExecutorApproval.vue.d.ts +1 -0
  38. package/dist/src/delegate/ExecutorConsent.vue.d.ts +20 -0
  39. package/dist/src/delegate/ExecutorNotice.vue.d.ts +1 -0
  40. package/dist/src/delegate/ExecutorSettings.vue.d.ts +3 -0
  41. package/dist/src/delegate/copy.d.ts +25 -11
  42. package/dist/src/delegate/save-copy.d.ts +1 -67
  43. package/dist/src/delegate/use-scope-approval.d.ts +3 -2
  44. package/dist/src/dsm/session.d.ts +15 -0
  45. package/dist/src/files/FileBrowser.vue.d.ts +1 -0
  46. package/dist/src/identity/session.d.ts +6 -0
  47. package/dist/src/index.d.ts +2 -0
  48. package/dist/src/nas/NasPicker.vue.d.ts +1 -0
  49. package/dist/src/nas/locale.d.ts +1 -1
  50. package/dist/src/shell/app-pages.d.ts +2 -0
  51. package/dist/src/shell/portal-chrome.d.ts +8 -0
  52. package/dist/src/shell/portal-chrome.test-fixture.d.ts +6 -0
  53. package/dist/style.css +1 -1
  54. package/dist/vue.js +2150 -2239
  55. package/package.json +2 -2
  56. package/spec/protocol/v1/README.md +2 -2
  57. package/dist/src/delegate/SaveOperations.vue.d.ts +0 -24
  58. package/dist/src/delegate/saves-height.d.ts +0 -4
@@ -0,0 +1,2 @@
1
+ /** Existing authorization-check classification, including opaque HTTP refusals. */
2
+ export declare function isAuthorizationDenied(error: unknown): boolean;
@@ -0,0 +1,10 @@
1
+ /** Only entry-policy refusals identify an App access remedy. Other denials
2
+ * can concern a file, an operation or the request's origin. */
3
+ export type AppDenial = 'app_privilege_denied' | 'admin_required';
4
+ export declare function appDenial(error: unknown): AppDenial | undefined;
5
+ /** Shared recovery copy for an explicit entry-policy refusal. No guess is
6
+ * made from a generic permission code, HTTP status, or backend prose. */
7
+ export declare function appRefusal(error: unknown, locale?: string, name?: string): {
8
+ title: string;
9
+ message: string;
10
+ } | undefined;
@@ -1,6 +1,6 @@
1
1
  import type { Context } from '../context';
2
2
  type __VLS_Props = {
3
- ctx: Pick<Context, 'call' | 'locale'>;
3
+ ctx: Pick<Context, 'call' | 'locale' | 'displayName'>;
4
4
  };
5
5
  declare function refresh(): Promise<void>;
6
6
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {
@@ -85,4 +85,4 @@ export declare const backgroundCatalogs: Record<import("..").UiLocale, {
85
85
  unsupported: string;
86
86
  }>;
87
87
  export declare function backgroundCopy(locale: string): BackgroundCopy;
88
- export declare function backgroundErrorCopy(e: unknown, copy: BackgroundCopy, locale?: string): string;
88
+ export declare function backgroundErrorCopy(e: unknown, copy: BackgroundCopy, locale?: string, name?: string): string;
@@ -11,7 +11,7 @@ type __VLS_Props = {
11
11
  keys: string[];
12
12
  labels?: Record<string, string>;
13
13
  };
14
- ctx?: Pick<Context, 'call'>;
14
+ ctx?: Pick<Context, 'call' | 'displayName'>;
15
15
  pickerErrorText?: (error: unknown) => string | undefined;
16
16
  sampleSave?: boolean;
17
17
  };
@@ -10,16 +10,13 @@ type __VLS_Props = {
10
10
  keys: string[];
11
11
  labels?: Record<string, string>;
12
12
  };
13
- ctx?: Pick<Context, 'call'>;
13
+ ctx?: Pick<Context, 'call' | 'displayName'>;
14
14
  title?: string;
15
15
  pickerErrorText?: (error: unknown) => string | undefined;
16
16
  };
17
- declare var __VLS_203: {
18
- busy: boolean;
19
- run: (work: () => Promise<unknown>) => Promise<void>;
20
- };
17
+ declare var __VLS_168: {};
21
18
  type __VLS_Slots = {} & {
22
- operations?: (props: typeof __VLS_203) => any;
19
+ default?: (props: typeof __VLS_168) => any;
23
20
  };
24
21
  declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {
25
22
  refresh: () => Promise<void>;
@@ -1,6 +1,6 @@
1
1
  import type { Context } from '../context';
2
2
  type __VLS_Props = {
3
- ctx: Pick<Context, 'call' | 'locale'>;
3
+ ctx: Pick<Context, 'call' | 'locale' | 'displayName'>;
4
4
  };
5
5
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {
6
6
  refresh: () => Promise<void>;
@@ -2,6 +2,7 @@ import { type Context } from '../context';
2
2
  type __VLS_Props = {
3
3
  admin: boolean;
4
4
  locale?: string;
5
+ purpose?: string;
5
6
  ctx?: Pick<Context, 'reopen'> & Partial<Pick<Context, 'displayName' | 'appIcon' | 'fullPage' | 'host'>>;
6
7
  preload?: boolean;
7
8
  };
@@ -0,0 +1,20 @@
1
+ type __VLS_Props = {
2
+ admin: boolean;
3
+ locale?: string;
4
+ files?: boolean;
5
+ purpose?: string;
6
+ layout?: 'page' | 'inline';
7
+ };
8
+ declare var __VLS_6: {};
9
+ type __VLS_Slots = {} & {
10
+ default?: (props: typeof __VLS_6) => any;
11
+ };
12
+ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
13
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
14
+ declare const _default: typeof __VLS_export;
15
+ export default _default;
16
+ type __VLS_WithSlots<T, S> = T & {
17
+ new (): {
18
+ $slots: S;
19
+ };
20
+ };
@@ -1,6 +1,7 @@
1
1
  import type { Context } from '../context';
2
2
  type __VLS_Props = {
3
3
  locale?: string;
4
+ purpose?: string;
4
5
  ctx: Partial<Pick<Context, 'executor' | 'user' | 'call' | 'reopen'>>;
5
6
  };
6
7
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
@@ -5,6 +5,9 @@ type __VLS_Props = {
5
5
  locale?: string;
6
6
  ctx?: Pick<Context, 'call'>;
7
7
  initial?: CapabilityStatus;
8
+ purpose?: string;
9
+ title?: string;
10
+ layout?: 'page' | 'inline';
8
11
  };
9
12
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {
10
13
  refresh: () => Promise<void>;
@@ -6,15 +6,25 @@ export declare const delegateCatalogs: Record<import("..").UiLocale, {
6
6
  setupTitle: string;
7
7
  setupHelp: string;
8
8
  setupHelpFiles: string;
9
+ consentTitle: string;
10
+ consentTitleUser: string;
11
+ consentWhy: string;
12
+ consentPurpose: string;
13
+ consentPurposeFiles: string;
14
+ consentDetails: string;
15
+ pointPassword: string;
16
+ passwordNote: string;
17
+ pointLimited: string;
18
+ pointUpdate: string;
19
+ pointRevoke: string;
20
+ consentAsk: string;
9
21
  password: string;
10
22
  authorize: string;
11
23
  confirmShare: string;
12
- scopeNeeds: string;
13
24
  ready: string;
14
25
  confirming: string;
15
26
  needs: string;
16
27
  blocked: string;
17
- executorNeeds: string;
18
28
  executorBlocked: string;
19
29
  noticeAdmin: string;
20
30
  noticeUser: string;
@@ -62,13 +72,10 @@ export declare const delegateCatalogs: Record<import("..").UiLocale, {
62
72
  waiting_executor: string;
63
73
  status: string;
64
74
  statusReady: string;
65
- statusNeeds: string;
66
- statusScope: string;
67
75
  statusBlocked: string;
68
76
  statusConfirming: string;
69
77
  statusUnreachable: string;
70
78
  statusStarting: string;
71
- hintPassword: string;
72
79
  retry: string;
73
80
  }>;
74
81
  export declare function delegateCopy(locale?: string): {
@@ -77,15 +84,25 @@ export declare function delegateCopy(locale?: string): {
77
84
  setupTitle: string;
78
85
  setupHelp: string;
79
86
  setupHelpFiles: string;
87
+ consentTitle: string;
88
+ consentTitleUser: string;
89
+ consentWhy: string;
90
+ consentPurpose: string;
91
+ consentPurposeFiles: string;
92
+ consentDetails: string;
93
+ pointPassword: string;
94
+ passwordNote: string;
95
+ pointLimited: string;
96
+ pointUpdate: string;
97
+ pointRevoke: string;
98
+ consentAsk: string;
80
99
  password: string;
81
100
  authorize: string;
82
101
  confirmShare: string;
83
- scopeNeeds: string;
84
102
  ready: string;
85
103
  confirming: string;
86
104
  needs: string;
87
105
  blocked: string;
88
- executorNeeds: string;
89
106
  executorBlocked: string;
90
107
  noticeAdmin: string;
91
108
  noticeUser: string;
@@ -133,13 +150,10 @@ export declare function delegateCopy(locale?: string): {
133
150
  waiting_executor: string;
134
151
  status: string;
135
152
  statusReady: string;
136
- statusNeeds: string;
137
- statusScope: string;
138
153
  statusBlocked: string;
139
154
  statusConfirming: string;
140
155
  statusUnreachable: string;
141
156
  statusStarting: string;
142
- hintPassword: string;
143
157
  retry: string;
144
158
  };
145
- export declare function errorCopy(error: unknown, copy: DelegateCopy): string;
159
+ export declare function errorCopy(error: unknown, copy: DelegateCopy, locale?: string, name?: string): string;
@@ -2,27 +2,12 @@ export declare const saveCatalogs: Record<import("..").UiLocale, {
2
2
  title: string;
3
3
  help: string;
4
4
  selection: string;
5
- operations: string;
6
- operationsHelp: string;
7
- noOperations: string;
8
5
  revoke: string;
9
6
  choose: string;
10
7
  needs: string;
11
- cancel: string;
12
- disable: string;
13
8
  enable: string;
14
- disableHelp: string;
15
- disableConfirm: string;
16
9
  disabled: string;
17
- queued: string;
18
- copying: string;
19
- committed: string;
20
- canceled: string;
21
- canceling: string;
22
- interrupted: string;
23
- uncertain: string;
24
10
  uncertainHelp: string;
25
- interruptedHelp: string;
26
11
  denied: string;
27
12
  permission: string;
28
13
  permissionSelect: string;
@@ -36,16 +21,9 @@ export declare const saveCatalogs: Record<import("..").UiLocale, {
36
21
  reselect: string;
37
22
  example: string;
38
23
  exampleHelp: string;
39
- status: string;
40
- file: string;
41
- size: string;
42
- location: string;
43
- openFolder: string;
44
24
  retry: string;
45
25
  folder: string;
46
26
  folderNone: string;
47
- scopeRow: string;
48
- change: string;
49
27
  cancelChange: string;
50
28
  changeHelp: string;
51
29
  approveHelp: string;
@@ -57,27 +35,12 @@ export declare function saveCopy(locale?: string): {
57
35
  title: string;
58
36
  help: string;
59
37
  selection: string;
60
- operations: string;
61
- operationsHelp: string;
62
- noOperations: string;
63
38
  revoke: string;
64
39
  choose: string;
65
40
  needs: string;
66
- cancel: string;
67
- disable: string;
68
41
  enable: string;
69
- disableHelp: string;
70
- disableConfirm: string;
71
42
  disabled: string;
72
- queued: string;
73
- copying: string;
74
- committed: string;
75
- canceled: string;
76
- canceling: string;
77
- interrupted: string;
78
- uncertain: string;
79
43
  uncertainHelp: string;
80
- interruptedHelp: string;
81
44
  denied: string;
82
45
  permission: string;
83
46
  permissionSelect: string;
@@ -91,16 +54,9 @@ export declare function saveCopy(locale?: string): {
91
54
  reselect: string;
92
55
  example: string;
93
56
  exampleHelp: string;
94
- status: string;
95
- file: string;
96
- size: string;
97
- location: string;
98
- openFolder: string;
99
57
  retry: string;
100
58
  folder: string;
101
59
  folderNone: string;
102
- scopeRow: string;
103
- change: string;
104
60
  cancelChange: string;
105
61
  changeHelp: string;
106
62
  approveHelp: string;
@@ -112,27 +68,12 @@ export declare function saveError(error: unknown, copy?: {
112
68
  title: string;
113
69
  help: string;
114
70
  selection: string;
115
- operations: string;
116
- operationsHelp: string;
117
- noOperations: string;
118
71
  revoke: string;
119
72
  choose: string;
120
73
  needs: string;
121
- cancel: string;
122
- disable: string;
123
74
  enable: string;
124
- disableHelp: string;
125
- disableConfirm: string;
126
75
  disabled: string;
127
- queued: string;
128
- copying: string;
129
- committed: string;
130
- canceled: string;
131
- canceling: string;
132
- interrupted: string;
133
- uncertain: string;
134
76
  uncertainHelp: string;
135
- interruptedHelp: string;
136
77
  denied: string;
137
78
  permission: string;
138
79
  permissionSelect: string;
@@ -146,20 +87,13 @@ export declare function saveError(error: unknown, copy?: {
146
87
  reselect: string;
147
88
  example: string;
148
89
  exampleHelp: string;
149
- status: string;
150
- file: string;
151
- size: string;
152
- location: string;
153
- openFolder: string;
154
90
  retry: string;
155
91
  folder: string;
156
92
  folderNone: string;
157
- scopeRow: string;
158
- change: string;
159
93
  cancelChange: string;
160
94
  changeHelp: string;
161
95
  approveHelp: string;
162
96
  approve: string;
163
97
  confirmChange: string;
164
98
  password: string;
165
- }, situation?: 'save' | 'select', locale?: string): string;
99
+ }, situation?: 'save' | 'select', locale?: string, name?: string): string;
@@ -14,7 +14,7 @@ export declare function useScopeApproval(props: {
14
14
  readonly locale?: string;
15
15
  readonly ctx?: Pick<Context, 'call'>;
16
16
  readonly initial?: CapabilityStatus;
17
- }, confirmed: () => void): {
17
+ }, confirmed: () => void | Promise<void>): {
18
18
  status: import("vue").Ref<CapabilityStatus | undefined, CapabilityStatus | undefined>;
19
19
  password: import("vue").Ref<string, string>;
20
20
  busy: import("vue").Ref<boolean, boolean>;
@@ -31,6 +31,7 @@ export declare function useScopeApproval(props: {
31
31
  reason: string;
32
32
  code?: string;
33
33
  } | undefined>;
34
+ passwordError: import("vue").ComputedRef<string>;
34
35
  scope: import("vue").Ref<ScopeDetail | undefined, ScopeDetail | undefined>;
35
36
  chosen: import("vue").Ref<string, string>;
36
37
  options: import("vue").ComputedRef<{
@@ -41,9 +42,9 @@ export declare function useScopeApproval(props: {
41
42
  files: import("vue").ComputedRef<boolean>;
42
43
  canConfirm: import("vue").ComputedRef<boolean>;
43
44
  needsScope: import("vue").ComputedRef<boolean>;
44
- changed: import("vue").ComputedRef<boolean>;
45
45
  refresh: () => Promise<void>;
46
46
  authorize: () => Promise<void>;
47
+ submit: () => Promise<void>;
47
48
  explain: (r?: {
48
49
  reason?: string;
49
50
  code?: string;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Session carriers for a DSM desktop window or an Application Portal page.
3
+ * This plain JavaScript factory is also embedded by the CLI into DSM's
4
+ * generated window, so Go-only Apps need no frontend build toolchain.
5
+ * @param {{read: () => string | undefined, write?: (token: string) => void, fetch: typeof globalThis.fetch}} options
6
+ * @returns {{token: () => string | undefined, ready: () => Promise<string | undefined>}}
7
+ */
8
+ export function createDsmSession(options: {
9
+ read: () => string | undefined;
10
+ write?: (token: string) => void;
11
+ fetch: typeof globalThis.fetch;
12
+ }): {
13
+ token: () => string | undefined;
14
+ ready: () => Promise<string | undefined>;
15
+ };
@@ -2,6 +2,7 @@ import type { NasProvider } from '../nas/contract';
2
2
  type __VLS_Props = {
3
3
  provider: NasProvider;
4
4
  locale: string;
5
+ name?: string;
5
6
  mode?: 'folder' | 'file';
6
7
  transfers?: boolean;
7
8
  };
@@ -1,5 +1,6 @@
1
1
  import type { Context } from '../context';
2
2
  import type { IdentityNotice } from './i18n';
3
+ import { type AppDenial } from '../authorization/refusal';
3
4
  export interface SessionSubject {
4
5
  user: string;
5
6
  uid: string;
@@ -10,6 +11,11 @@ export declare function createSession(ctx: Context): {
10
11
  ready: import("vue").Ref<boolean, boolean>;
11
12
  subject: import("vue").Ref<SessionSubject | undefined, SessionSubject | undefined>;
12
13
  notice: import("vue").Ref<IdentityNotice, IdentityNotice>;
14
+ denied: import("vue").ComputedRef<{
15
+ title: string;
16
+ message: string;
17
+ code: AppDenial;
18
+ } | undefined>;
13
19
  start: () => Promise<void>;
14
20
  call: <T = unknown>(method: string, params?: Record<string, unknown>) => Promise<T>;
15
21
  login: (account: string, password: string, otp: string) => Promise<void>;
@@ -1,6 +1,7 @@
1
1
  export type * from './context';
2
2
  export { DEFAULT_REQUEST_TIMEOUT, clientTimeout, isFullPage } from './context';
3
3
  export { createStandaloneHost, createStandaloneContext } from './standalone';
4
+ export { createDsmSession } from './dsm/session.js';
4
5
  export type * from './delegate/long-running';
5
6
  export type * from './delegate/executor-setup';
6
7
  export type * from './delegate/root';
@@ -29,3 +30,4 @@ export { bridgeErrorCopy, bridgeCatalogs } from './bridge/i18n';
29
30
  export { createPortalAccess, type PortalOptions } from './portal/access';
30
31
  export * from './protocol/v1';
31
32
  export { encodeRequest, decodeResponse, type ProtocolAuth, type ProtocolResponse } from './protocol/codec';
33
+ export { appDenial, appRefusal, type AppDenial } from './authorization/refusal';
@@ -3,6 +3,7 @@ import type { DestinationGrant, DestinationSelection } from '../delegate/long-ru
3
3
  type __VLS_Props = {
4
4
  open: boolean;
5
5
  locale: string;
6
+ name?: string;
6
7
  provider: NasProvider;
7
8
  mode: 'folder' | 'file';
8
9
  title?: string;
@@ -46,4 +46,4 @@ export declare const nasCatalogs: Record<import("..").UiLocale, {
46
46
  fullPath: string;
47
47
  }>;
48
48
  export declare function nasCopy(locale: string): NasCopy;
49
- export declare function nasErrorCopy(error: unknown, copy: NasCopy, locale?: string): string;
49
+ export declare function nasErrorCopy(error: unknown, copy: NasCopy, locale?: string, name?: string): string;
@@ -29,6 +29,8 @@ export interface AppShellPage {
29
29
  export type AppShellPageEntry = ShellPage | AppShellPage;
30
30
  /** The page a denied shell shows; each field falls back to the shell's own words. */
31
31
  export interface AppShellDenied {
32
+ /** Backend entry refusal code; other codes keep the generic denial copy. */
33
+ code?: string;
32
34
  title?: string;
33
35
  /** The default body; the denied slot replaces it. */
34
36
  message?: string;
@@ -0,0 +1,8 @@
1
+ /** DSM renders Portal chrome beside the App in its standalone main window.
2
+ * Unknown markup stays visible in AppShell; no admin-only settings API is used.
3
+ */
4
+ export interface PortalChrome {
5
+ brand: boolean;
6
+ user: boolean;
7
+ }
8
+ export declare function readPortalChrome(root: HTMLElement): PortalChrome;
@@ -0,0 +1,6 @@
1
+ export declare function portalFixture(): {
2
+ main: HTMLDivElement;
3
+ title: HTMLElement;
4
+ account: HTMLElement;
5
+ remove(): void;
6
+ };
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .executor-help[data-v-666ac74c]{margin:0 0 var(--ui-space-3,12px);max-width:72ch;color:var(--ui-text-secondary)}.executor-summary[data-v-666ac74c]:not(:last-child){margin-bottom:var(--ui-space-3,12px)}.executor-form[data-v-666ac74c]{margin-top:var(--ui-space-4,16px);max-width:28rem}.executor-hint[data-v-666ac74c]{font-size:var(--ui-font-size-sm,12px);color:var(--ui-text-secondary)}.executor-reason[data-v-666ac74c]{display:block;margin-top:var(--ui-space-1,4px);font-size:var(--ui-font-size-sm,12px)}.executor-alert[data-v-666ac74c]{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:var(--ui-space-2,8px)}.executor-notice[data-v-1edce327]{margin-bottom:var(--ui-space-4, 16px)}.executor-notice-body[data-v-1edce327]{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:var(--ui-space-2, 8px)}.app-shell[data-v-61068e94]{height:100%;min-width:0;grid-template-rows:minmax(0,1fr)}.app-shell[data-v-61068e94]>div{min-height:0}.app-shell[data-v-61068e94] main{display:flex;flex-direction:column;overflow:hidden}.app-page[data-v-61068e94]{flex:1 1 auto;min-height:0;overflow-y:auto}.app-denied[data-v-61068e94]{height:100%;overflow-y:auto}.app-page-actions[data-v-61068e94]{display:contents}.app-shell-fill[data-v-61068e94]{max-height:100dvh}.app-page-fill[data-v-61068e94]{display:flex;flex-direction:column;overflow:hidden}.app-page-fill[data-v-61068e94]>[data-page-content-body]{display:flex;flex:1 1 auto;flex-direction:column;width:100%;min-height:0}.app-page-fill .app-notices[data-v-61068e94]{flex:0 0 auto}.app-page-fill .app-page-content[data-v-61068e94]{display:grid;flex:1 1 auto;grid-template-columns:minmax(0,1fr);grid-template-rows:minmax(0,1fr);min-height:0}.app-notices[data-v-61068e94]{display:flex;flex-direction:column;gap:var(--ui-space-2, 8px);margin-bottom:var(--ui-space-4, 16px)}.app-notices[hidden][data-v-61068e94]{display:none}.app-page-content[data-v-61068e94]{padding-bottom:var(--ui-space-6, 24px)}.file-browser[data-v-70c72250]{min-width:0;color:var(--ui-text)}.file-toolbar[data-v-70c72250]{display:flex;flex-wrap:wrap;gap:var(--ui-space-2, 8px);margin-block:var(--ui-space-3, 12px)}.file-location[data-v-70c72250]{flex-wrap:nowrap;align-items:center;gap:var(--ui-space-1, 4px)}.file-path[data-v-70c72250]{flex:1;min-width:0;margin-inline-start:var(--ui-space-2, 8px)}.file-columns[data-v-70c72250]{display:grid;grid-template-columns:minmax(140px,1fr) minmax(0,3fr);gap:var(--ui-space-3, 12px);height:clamp(240px,60vh,400px)}.file-tree[data-v-70c72250]{min-width:0;overflow:auto;border-inline-end:1px solid var(--ui-border)}.file-content[data-v-70c72250]{display:flex;flex-direction:column;min-width:0;min-height:0;overflow:auto}.file-empty[data-v-70c72250]{display:flex;flex-direction:column;align-items:center;gap:var(--ui-space-2, 8px);padding-block:var(--ui-space-6, 24px);color:var(--ui-text-muted)}.file-name[data-v-70c72250]{display:inline-flex;align-items:center;gap:var(--ui-space-2, 8px);overflow-wrap:anywhere}.file-bytes[data-v-70c72250]{font-variant-numeric:tabular-nums}.file-selection[data-v-70c72250]{overflow-wrap:anywhere}@media(max-width:600px){.file-columns[data-v-70c72250]{grid-template-columns:minmax(0,1fr);height:auto}.file-content[data-v-70c72250] th:nth-child(2),.file-content[data-v-70c72250] td:nth-child(2),.file-content[data-v-70c72250] th:nth-child(3),.file-content[data-v-70c72250] td:nth-child(3){display:none}.file-tree[data-v-70c72250]{height:clamp(96px,25vh,180px);border-inline-end:0;border-bottom:1px solid var(--ui-border)}.file-content[data-v-70c72250]{height:clamp(200px,45vh,360px)}}.nas-picker-content[data-v-46817cb6]{max-height:65vh;overflow:auto}.save-message[data-v-46817cb6]{--ui-text-secondary:var(--ui-text)}.save-consent[data-v-46817cb6]{color:var(--ui-text);margin-block:0 var(--ui-space-4,16px)}.files-actions[data-v-96eb4bab]{display:flex;flex-wrap:wrap;gap:var(--ui-space-2, 8px)}.files-path[data-v-96eb4bab]{display:flex;min-width:0}.identity-login[data-v-1c0358cd]{max-width:36rem;margin-inline:auto;padding:var(--ui-space-4, 16px);overflow:auto;max-height:100%;color:var(--ui-text);font-family:var(--ui-font-sans);font-size:13px;line-height:1.5}.identity-login p[data-v-1c0358cd]{margin-block:var(--ui-space-4, 16px);overflow-wrap:anywhere}.bg-cards[data-v-85b8b7a1]{display:grid;gap:var(--ui-space-3,12px);min-width:0;overflow-wrap:anywhere}.bg-card-body[data-v-85b8b7a1]{display:flex;flex-direction:column;align-items:flex-start;gap:var(--ui-space-2,8px);min-width:0}.bg-card-body>span[data-v-85b8b7a1]{min-width:0;max-width:100%}.integration-actions[data-v-85b8b7a1]{display:flex;flex-wrap:wrap;gap:var(--ui-space-2,8px)}.bg-schedules[data-v-85b8b7a1]{margin-block-start:var(--ui-space-6,24px);min-width:0;overflow-wrap:anywhere}.bg-schedules p[data-v-85b8b7a1]{min-width:0;max-width:100%}.bg-schedule-form[data-v-85b8b7a1]{margin-block:var(--ui-space-4,16px)}.bg-path[data-v-85b8b7a1]{display:flex;align-items:center;gap:var(--ui-space-2,8px);min-width:0;max-width:100%}.executor-pages[data-v-bf0dbc7c]{display:contents}.executor-pages.executor-preloading[data-v-bf0dbc7c]{display:block;position:fixed;inset:0;visibility:hidden;overflow:hidden;pointer-events:none}.executor-approval[data-v-bf0dbc7c]{padding:var(--ui-space-6, 24px)}.executor-brand[data-v-bf0dbc7c]{display:flex;align-items:center;gap:var(--ui-space-2, 8px);margin-bottom:var(--ui-space-4, 16px);font-size:16px;font-weight:600;color:var(--ui-text-primary)}.executor-brand img[data-v-bf0dbc7c]{width:24px;height:24px}.delegate-panel[data-v-080a311e]{min-width:0;overflow-wrap:anywhere}.delegate-group[data-v-080a311e]{margin-top:var(--ui-space-6,24px)}.records[data-v-080a311e]{list-style:none;padding:0;margin:0}.records li[data-v-080a311e]{display:flex;align-items:flex-start;justify-content:space-between;flex-wrap:wrap;gap:var(--ui-space-3,12px);padding-block:var(--ui-space-4,16px);border-bottom:1px solid var(--ui-border)}.records li>div[data-v-080a311e],.records li>span[data-v-080a311e],.destination[data-v-080a311e]{min-width:0;max-width:100%;overflow-wrap:anywhere}.records p[data-v-080a311e]{margin:var(--ui-space-2,8px) 0 0}.destination[data-v-080a311e]{display:flex;align-items:center;gap:var(--ui-space-2,8px)}.save-help[data-v-56f34b37]{margin:0 0 var(--ui-space-3,12px);max-width:72ch;color:var(--ui-text-secondary)}.save-alert[data-v-56f34b37]{display:flex;align-items:center;flex-wrap:wrap;gap:var(--ui-space-2,8px);justify-content:space-between}.save-name[data-v-56f34b37]{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.save-note[data-v-56f34b37]{margin:var(--ui-space-1,4px) 0 0;font-size:var(--ui-font-size-sm,12px);color:var(--ui-text-secondary);white-space:normal}.save-icon[data-v-56f34b37]{width:16px;height:16px}[data-save-operations][data-v-56f34b37] table{table-layout:fixed}[data-save-operations][data-v-56f34b37] th,[data-save-operations][data-v-56f34b37] td{overflow-wrap:normal;white-space:nowrap}[data-save-operations][data-v-56f34b37] td{padding-block:var(--ui-space-2,8px)}.save-pages[data-v-56f34b37]{margin-top:var(--ui-space-3,12px)}.background-save-settings[data-v-d2fd6882]{min-width:0;overflow-wrap:anywhere}.save-help[data-v-d2fd6882]{margin:0 0 var(--ui-space-2,8px);max-width:72ch;color:var(--ui-text-secondary)}.save-form[data-v-d2fd6882]{max-width:44rem}.save-actions[data-v-d2fd6882],.save-alert[data-v-d2fd6882],.save-danger[data-v-d2fd6882]{display:flex;align-items:center;flex-wrap:wrap;gap:var(--ui-space-2,8px)}.save-alert[data-v-d2fd6882],.save-danger[data-v-d2fd6882]{justify-content:space-between}.save-none[data-v-d2fd6882]{color:var(--ui-text-secondary)}.save-reason[data-v-d2fd6882]{display:block;margin-top:var(--ui-space-1,4px);font-size:var(--ui-font-size-sm,12px)}.save-danger[data-v-d2fd6882]{flex:1;padding-top:var(--ui-space-3,12px);border-top:1px solid var(--ui-border)}.save-danger p[data-v-d2fd6882]{margin:0;flex:1 1 20rem;max-width:72ch;font-size:var(--ui-font-size-sm,12px);color:var(--ui-text-secondary)}.background-save-panel[data-v-55770b8c]{min-width:0;overflow-wrap:anywhere}.save-help[data-v-55770b8c]{margin:0 0 var(--ui-space-3,12px);max-width:72ch;color:var(--ui-text-secondary)}.save-actions[data-v-55770b8c]{display:flex;align-items:center;flex-wrap:wrap;gap:var(--ui-space-2,8px);margin-bottom:var(--ui-space-3,12px)}.authorization-view[data-v-59492506]{display:flex;flex-direction:column;gap:12px}.authorization-body[data-v-59492506]{margin:0;font-size:13px;line-height:1.6;color:var(--ui-text);text-wrap:pretty}.authorization-status[data-v-59492506],.authorization-failed[data-v-59492506]{color:var(--ui-text)}.authorization-content[data-v-59492506]{display:flex;flex-direction:column;height:100%;min-height:0}.authorization-content[data-v-59492506] .app-shell{flex:1;min-height:0;height:auto}.authorization-setting[data-v-f031e7c7]{display:flex;align-items:center;flex-wrap:wrap;gap:12px}.authorization-revoke-body[data-v-f031e7c7]{margin:0;font-size:13px;line-height:1.6;color:var(--ui-text)}.authorization-state[data-v-f031e7c7]{display:inline-flex;align-items:center;gap:6px;color:var(--ui-text)}
1
+ .executor-consent[data-v-c5e4ccd1]{display:grid;grid-template-columns:32px minmax(0,1fr);column-gap:var(--ui-space-3,12px);max-width:640px;overflow-wrap:anywhere}.executor-consent-icon[data-v-c5e4ccd1]{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:50%;background:var(--ui-primary-soft);color:var(--ui-primary)}.executor-consent-body[data-v-c5e4ccd1]{display:flex;flex-direction:column;gap:var(--ui-space-4,16px);min-width:0}.executor-consent-title[data-v-c5e4ccd1]{margin:6px 0 var(--ui-space-1,4px);font-size:14px;font-weight:600;line-height:20px;color:var(--ui-text)}.executor-consent-lead[data-v-c5e4ccd1]{margin:0;font-size:13px;line-height:20px;color:var(--ui-text);text-wrap:pretty}.executor-consent-ask[data-v-c5e4ccd1]{margin-top:var(--ui-space-2,8px)}.executor-consent-page[data-v-c5e4ccd1]{grid-template-columns:minmax(0,1fr);justify-items:center;row-gap:var(--ui-space-3,12px);box-sizing:border-box;width:100%;max-width:480px;margin:var(--ui-space-6,24px) auto;padding:var(--ui-space-6,24px);border:1px solid var(--ui-border-subtle);border-radius:var(--ui-radius-lg);background:var(--ui-surface);box-shadow:var(--ui-shadow-card)}.executor-consent-page .executor-consent-icon[data-v-c5e4ccd1]{width:48px;height:48px}.executor-consent-page .executor-consent-body[data-v-c5e4ccd1]{width:100%;gap:var(--ui-space-5,20px)}.executor-consent-page .executor-consent-head[data-v-c5e4ccd1]{text-align:center}.executor-consent-page .executor-consent-title[data-v-c5e4ccd1]{margin-top:0;font-size:16px;line-height:24px}.executor-consent-more summary[data-v-c5e4ccd1]{display:inline-flex;align-items:center;gap:var(--ui-space-1,4px);cursor:pointer;list-style:none;font-size:13px;line-height:20px;color:var(--ui-primary);border-radius:var(--ui-radius-sm)}.executor-consent-more summary[data-v-c5e4ccd1]::-webkit-details-marker{display:none}.executor-consent-more summary[data-v-c5e4ccd1]:focus-visible{outline:none;box-shadow:var(--ui-shadow-focus)}.executor-consent-chevron[data-v-c5e4ccd1]{transition:transform .15s}.executor-consent-more[open] .executor-consent-chevron[data-v-c5e4ccd1]{transform:rotate(90deg)}.executor-consent-more ul[data-v-c5e4ccd1]{margin:var(--ui-space-2,8px) 0 0;padding:var(--ui-space-3,12px) var(--ui-space-4,16px) var(--ui-space-3,12px) 32px;border-radius:var(--ui-radius-md);background:var(--ui-surface-subtle);list-style:disc;font-size:13px;line-height:20px;color:var(--ui-text)}.executor-consent-more li+li[data-v-c5e4ccd1]{margin-top:var(--ui-space-1,4px)}@media(prefers-reduced-motion:reduce){.executor-consent-chevron[data-v-c5e4ccd1]{transition:none}}.executor-summary[data-v-96e151f8]:not(:last-child){margin-bottom:var(--ui-space-3,12px)}.executor-form[data-v-96e151f8]{max-width:28rem}.executor-summary+.executor-form[data-v-96e151f8],.ui-callout+div>.executor-form[data-v-96e151f8]{margin-top:var(--ui-space-4,16px)}.executor-reason[data-v-96e151f8]{display:block;margin-top:var(--ui-space-1,4px);font-size:var(--ui-font-size-sm,12px)}.executor-alert[data-v-96e151f8]{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:var(--ui-space-2,8px)}.executor-notice[data-v-d0ed5a05]{margin-bottom:var(--ui-space-4, 16px)}.executor-notice-body[data-v-d0ed5a05]{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:var(--ui-space-2, 8px)}.app-shell[data-v-ca12cb17]{height:100%;min-width:0;grid-template-rows:minmax(0,1fr)}.app-shell-portal-brand[data-v-ca12cb17] [data-ui-sidebar-brand]{display:none}.app-shell[data-v-ca12cb17]>div{min-height:0}.app-shell[data-v-ca12cb17] main{display:flex;flex-direction:column;overflow:hidden}.app-page[data-v-ca12cb17]{flex:1 1 auto;min-height:0;overflow-y:auto}.app-denied[data-v-ca12cb17]{height:100%;overflow-y:auto}.app-page-actions[data-v-ca12cb17]{display:contents}.app-shell-fill[data-v-ca12cb17]{max-height:100dvh}.app-page-fill[data-v-ca12cb17]{display:flex;flex-direction:column;overflow:hidden}.app-page-fill[data-v-ca12cb17]>[data-page-content-body]{display:flex;flex:1 1 auto;flex-direction:column;width:100%;min-height:0}.app-page-fill .app-notices[data-v-ca12cb17]{flex:0 0 auto}.app-page-fill .app-page-content[data-v-ca12cb17]{display:grid;flex:1 1 auto;grid-template-columns:minmax(0,1fr);grid-template-rows:minmax(0,1fr);min-height:0}.app-notices[data-v-ca12cb17]{display:flex;flex-direction:column;gap:var(--ui-space-2, 8px);margin-bottom:var(--ui-space-4, 16px)}.app-notices[hidden][data-v-ca12cb17]{display:none}.app-page-content[data-v-ca12cb17]{padding-bottom:var(--ui-space-6, 24px)}.file-browser[data-v-f4863cea]{min-width:0;color:var(--ui-text)}.file-toolbar[data-v-f4863cea]{display:flex;flex-wrap:wrap;gap:var(--ui-space-2, 8px);margin-block:var(--ui-space-3, 12px)}.file-location[data-v-f4863cea]{flex-wrap:nowrap;align-items:center;gap:var(--ui-space-1, 4px)}.file-path[data-v-f4863cea]{flex:1;min-width:0;margin-inline-start:var(--ui-space-2, 8px)}.file-columns[data-v-f4863cea]{display:grid;grid-template-columns:minmax(140px,1fr) minmax(0,3fr);gap:var(--ui-space-3, 12px);height:clamp(240px,60vh,400px)}.file-tree[data-v-f4863cea]{min-width:0;overflow:auto;border-inline-end:1px solid var(--ui-border)}.file-content[data-v-f4863cea]{display:flex;flex-direction:column;min-width:0;min-height:0;overflow:auto}.file-empty[data-v-f4863cea]{display:flex;flex-direction:column;align-items:center;gap:var(--ui-space-2, 8px);padding-block:var(--ui-space-6, 24px);color:var(--ui-text-muted)}.file-name[data-v-f4863cea]{display:inline-flex;align-items:center;gap:var(--ui-space-2, 8px);overflow-wrap:anywhere}.file-bytes[data-v-f4863cea]{font-variant-numeric:tabular-nums}.file-selection[data-v-f4863cea]{overflow-wrap:anywhere}@media(max-width:600px){.file-columns[data-v-f4863cea]{grid-template-columns:minmax(0,1fr);height:auto}.file-content[data-v-f4863cea] th:nth-child(2),.file-content[data-v-f4863cea] td:nth-child(2),.file-content[data-v-f4863cea] th:nth-child(3),.file-content[data-v-f4863cea] td:nth-child(3){display:none}.file-tree[data-v-f4863cea]{height:clamp(96px,25vh,180px);border-inline-end:0;border-bottom:1px solid var(--ui-border)}.file-content[data-v-f4863cea]{height:clamp(200px,45vh,360px)}}.nas-picker-content[data-v-08be5e1e]{max-height:65vh;overflow:auto}.save-message[data-v-08be5e1e]{--ui-text-secondary:var(--ui-text)}.save-consent[data-v-08be5e1e]{color:var(--ui-text);margin-block:0 var(--ui-space-4,16px)}.files-actions[data-v-a8fc5aa4]{display:flex;flex-wrap:wrap;gap:var(--ui-space-2, 8px)}.files-path[data-v-a8fc5aa4]{display:flex;min-width:0}.identity-login[data-v-07e4497c]{max-width:36rem;margin-inline:auto;padding:var(--ui-space-4, 16px);overflow:auto;max-height:100%;color:var(--ui-text);font-family:var(--ui-font-sans);font-size:13px;line-height:1.5}.identity-login p[data-v-07e4497c]{margin-block:var(--ui-space-4, 16px);overflow-wrap:anywhere}.bg-cards[data-v-a7c98d9d]{display:grid;gap:var(--ui-space-3,12px);min-width:0;overflow-wrap:anywhere}.bg-card-body[data-v-a7c98d9d]{display:flex;flex-direction:column;align-items:flex-start;gap:var(--ui-space-2,8px);min-width:0}.bg-card-body>span[data-v-a7c98d9d]{min-width:0;max-width:100%}.integration-actions[data-v-a7c98d9d]{display:flex;flex-wrap:wrap;gap:var(--ui-space-2,8px)}.bg-schedules[data-v-a7c98d9d]{margin-block-start:var(--ui-space-6,24px);min-width:0;overflow-wrap:anywhere}.bg-schedules p[data-v-a7c98d9d]{min-width:0;max-width:100%}.bg-schedule-form[data-v-a7c98d9d]{margin-block:var(--ui-space-4,16px)}.bg-path[data-v-a7c98d9d]{display:flex;align-items:center;gap:var(--ui-space-2,8px);min-width:0;max-width:100%}.executor-pages[data-v-59aae3f3]{display:contents}.executor-pages.executor-preloading[data-v-59aae3f3]{display:block;position:fixed;inset:0;visibility:hidden;overflow:hidden;pointer-events:none}.executor-approval[data-v-59aae3f3]{padding:var(--ui-space-6, 24px)}.executor-brand[data-v-59aae3f3]{display:flex;align-items:center;gap:var(--ui-space-2, 8px);margin-bottom:var(--ui-space-4, 16px);font-size:16px;font-weight:600;color:var(--ui-text-primary)}.executor-brand img[data-v-59aae3f3]{width:24px;height:24px}.delegate-panel[data-v-987b56d5]{min-width:0;overflow-wrap:anywhere}.delegate-group[data-v-987b56d5]{margin-top:var(--ui-space-6,24px)}.records[data-v-987b56d5]{list-style:none;padding:0;margin:0}.records li[data-v-987b56d5]{display:flex;align-items:flex-start;justify-content:space-between;flex-wrap:wrap;gap:var(--ui-space-3,12px);padding-block:var(--ui-space-4,16px);border-bottom:1px solid var(--ui-border)}.records li>div[data-v-987b56d5],.records li>span[data-v-987b56d5],.destination[data-v-987b56d5]{min-width:0;max-width:100%;overflow-wrap:anywhere}.records p[data-v-987b56d5]{margin:var(--ui-space-2,8px) 0 0}.destination[data-v-987b56d5]{display:flex;align-items:center;gap:var(--ui-space-2,8px)}.background-save-settings[data-v-79ce68f8]{min-width:0;overflow-wrap:anywhere}.save-help[data-v-79ce68f8]{margin:0 0 var(--ui-space-2,8px);max-width:72ch;color:var(--ui-text-secondary)}.save-form[data-v-79ce68f8]{max-width:28rem}.save-actions[data-v-79ce68f8],.save-alert[data-v-79ce68f8]{display:flex;align-items:center;flex-wrap:wrap;gap:var(--ui-space-2,8px)}.save-alert[data-v-79ce68f8]{justify-content:space-between}.save-actions[data-v-79ce68f8] .ui-path-display{flex:1;min-width:0}.save-none[data-v-79ce68f8]{flex:1;color:var(--ui-text-secondary)}.save-reason[data-v-79ce68f8]{display:block;margin-top:var(--ui-space-1,4px);font-size:var(--ui-font-size-sm,12px)}.background-save-panel[data-v-05618cb8]{min-width:0;overflow-wrap:anywhere}.save-help[data-v-05618cb8]{margin:0 0 var(--ui-space-3,12px);max-width:72ch;color:var(--ui-text-secondary)}.save-actions[data-v-05618cb8]{display:flex;align-items:center;flex-wrap:wrap;gap:var(--ui-space-2,8px);margin-bottom:var(--ui-space-3,12px)}.authorization-view[data-v-3e998887]{display:flex;flex-direction:column;gap:12px}.authorization-body[data-v-3e998887]{margin:0;font-size:13px;line-height:1.6;color:var(--ui-text);text-wrap:pretty}.authorization-status[data-v-3e998887],.authorization-failed[data-v-3e998887]{color:var(--ui-text)}.authorization-content[data-v-3e998887]{display:flex;flex-direction:column;height:100%;min-height:0}.authorization-content[data-v-3e998887] .app-shell{flex:1;min-height:0;height:auto}.authorization-setting[data-v-f031e7c7]{display:flex;align-items:center;flex-wrap:wrap;gap:12px}.authorization-revoke-body[data-v-f031e7c7]{margin:0;font-size:13px;line-height:1.6;color:var(--ui-text)}.authorization-state[data-v-f031e7c7]{display:inline-flex;align-items:center;gap:6px;color:var(--ui-text)}