@epam/ai-dial-chat-hooks 1.2.0-dev.164 → 1.2.0-dev.173

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.
@@ -19,138 +19,145 @@ var f = 5, p = (e) => e.error ? `${e.path} (${e.error})` : e.path, m = (e) => {
19
19
  }, h = (e, t) => `${e}${t}/`, g = (e) => /\.zip$/i.test(e), _ = (e) => {
20
20
  let [t] = e;
21
21
  if (!(e.length !== 1 || t == null)) return g(t.fileContent.name) && !g(t.name) ? t : void 0;
22
- }, v = ({ filesApi: f, bucket: p, rootLabel: g, activeTab: v, cache: y, sharedRootMetaRef: b, invalidateFolders: x, bumpRetry: S, onNotification: C }) => {
23
- let [w, T] = l(null), E = c(null), D = s((e, t, r) => {
24
- let a = i(r, g);
25
- T({
26
- files: [{
27
- id: `${Date.now()}-archive`,
28
- name: t,
29
- status: o.Uploading
30
- }],
31
- isOpen: !0
32
- }), (async () => {
22
+ }, v = 0, y = () => (v += 1, `${Date.now()}-${v}`), b = (e, t) => ({
23
+ files: [...e?.files ?? [], ...t],
24
+ isOpen: !0
25
+ }), x = ({ filesApi: f, bucket: p, rootLabel: g, activeTab: v, cache: x, sharedRootMetaRef: S, invalidateFolders: C, bumpRetry: w, onNotification: T }) => {
26
+ let [E, D] = l(null), O = c(/* @__PURE__ */ new Map()), k = s((e, t, r) => {
27
+ let s = i(r, g), c = y();
28
+ D((e) => b(e, [{
29
+ id: c,
30
+ name: t,
31
+ status: o.Uploading
32
+ }])), (async () => {
33
+ let r = o.Failed;
33
34
  try {
34
- let { results: r } = await f.uploadArchive(e, p, h(a, t)), i = r.filter((e) => e.success).length, o = r.filter((e) => !e.success), s = o.length, { names: c, restCount: l } = m(o);
35
- r.length > 0 && i === 0 ? C?.({
35
+ let { results: i } = await f.uploadArchive(e, p, h(s, t)), a = i.filter((e) => e.success).length, c = i.filter((e) => !e.success), l = c.length, { names: d, restCount: g } = m(c);
36
+ i.length > 0 && a === 0 ? T?.({
36
37
  variant: u.Error,
37
38
  reason: n.UploadArchiveFailed,
38
- names: c,
39
- restCount: l
40
- }) : s > 0 && C?.({
39
+ names: d,
40
+ restCount: g
41
+ }) : (r = o.Completed, l > 0 && T?.({
41
42
  variant: u.Error,
42
43
  reason: n.UploadArchivePartiallyFailed,
43
- count: s,
44
- names: c,
45
- restCount: l
46
- });
44
+ count: l,
45
+ names: d,
46
+ restCount: g
47
+ }));
47
48
  } catch {
48
- C?.({
49
+ T?.({
49
50
  variant: u.Error,
50
51
  reason: n.UploadArchiveRequestFailed
51
52
  });
52
53
  } finally {
53
- x([a]), S(), T(null);
54
+ C([s]), w(), D((e) => a(e, c, {
55
+ status: r,
56
+ percent: 100
57
+ }));
54
58
  }
55
59
  })();
56
60
  }, [
57
61
  p,
58
62
  g,
59
- C,
63
+ T,
60
64
  f,
65
+ C,
66
+ w
67
+ ]), A = s((e, s) => {
68
+ if (e.length === 0) return;
69
+ let c = _(e);
70
+ if (c != null) {
71
+ k(c.fileContent, c.name, s);
72
+ return;
73
+ }
74
+ let l = e.map((e) => ({
75
+ id: y(),
76
+ name: e.name,
77
+ status: o.Queued
78
+ })), m = O.current;
79
+ for (let e of l) m.set(e.id, new AbortController());
80
+ D((e) => b(e, l));
81
+ let h = i(s, g), { bucket: E, path: A } = v === d.Shared ? r(h, S.current, p) : {
82
+ bucket: p,
83
+ path: h
84
+ }, j = new Set((x.get(h) ?? []).map((e) => e.name.toLowerCase()));
85
+ (async () => {
86
+ let r = 0, i = 0, s = 0, c = 0, d = async () => {
87
+ for (; r < e.length;) {
88
+ let n = r++, u = e[n], { id: d } = l[n], p = m.get(d);
89
+ if (p == null || p.signal.aborted) {
90
+ c += 1, m.delete(d), D((e) => a(e, d, o.Cancelled));
91
+ continue;
92
+ }
93
+ D((e) => a(e, d, {
94
+ status: o.Uploading,
95
+ percent: 0
96
+ }));
97
+ let h = j.has(u.name.toLowerCase()) ? t.Overwrite : t.CreateOnly;
98
+ try {
99
+ await f.uploadFile(E, `${A}${u.name}`, u.fileContent, {
100
+ signal: p.signal,
101
+ uploadMode: h,
102
+ onProgress: (e) => {
103
+ D((t) => a(t, d, {
104
+ status: o.Uploading,
105
+ percent: e
106
+ }));
107
+ }
108
+ }), D((e) => a(e, d, {
109
+ status: o.Completed,
110
+ percent: 100
111
+ })), i += 1;
112
+ } catch {
113
+ let e = o.Failed;
114
+ p.signal.aborted ? (e = o.Cancelled, c += 1) : s += 1, D((t) => a(t, d, e));
115
+ } finally {
116
+ m.delete(d);
117
+ }
118
+ }
119
+ };
120
+ await Promise.all(Array.from({ length: 3 }, () => d())), c < e.length && (i === 0 && s > 0 ? T?.({
121
+ variant: u.Error,
122
+ reason: n.UploadFailed
123
+ }) : i > 0 && T?.({
124
+ variant: u.Success,
125
+ reason: n.UploadCompleted,
126
+ folder: A || g
127
+ })), C([h]), w();
128
+ })();
129
+ }, [
130
+ v,
131
+ p,
61
132
  x,
62
- S
63
- ]);
133
+ g,
134
+ T,
135
+ f,
136
+ S,
137
+ C,
138
+ w,
139
+ k
140
+ ]), j = s((e, t, n) => {
141
+ k(e, t, n);
142
+ }, [k]), M = s(async (t, n, r) => {
143
+ for (let n of t) n.name = e(n.name);
144
+ return { valid: !0 };
145
+ }, []), N = s((e) => {
146
+ O.current.get(e)?.abort();
147
+ }, []);
64
148
  return {
65
- onUploadFiles: s((e, s) => {
66
- if (e.length === 0) return;
67
- let c = _(e);
68
- if (c != null) {
69
- D(c.fileContent, c.name, s);
70
- return;
71
- }
72
- let l = new AbortController();
73
- E.current = l, T({
74
- files: e.map((e, t) => ({
75
- id: `${Date.now()}-${t}`,
76
- name: e.name,
77
- status: o.Queued
78
- })),
79
- isOpen: !0
80
- });
81
- let m = i(s, g), { bucket: h, path: w } = v === d.Shared ? r(m, b.current, p) : {
82
- bucket: p,
83
- path: m
84
- }, O = new Set((y.get(m) ?? []).map((e) => e.name.toLowerCase()));
85
- (async () => {
86
- let r = 0, i = 0, s = 0, c = async () => {
87
- for (; r < e.length;) {
88
- let n = r++, c = e[n];
89
- if (l.signal.aborted) {
90
- T((e) => a(e, n, o.Cancelled));
91
- continue;
92
- }
93
- T((e) => a(e, n, {
94
- status: o.Uploading,
95
- percent: 0
96
- }));
97
- let u = O.has(c.name.toLowerCase()) ? t.Overwrite : t.CreateOnly;
98
- try {
99
- await f.uploadFile(h, `${w}${c.name}`, c.fileContent, {
100
- signal: l.signal,
101
- uploadMode: u,
102
- onProgress: (e) => {
103
- T((t) => a(t, n, {
104
- status: o.Uploading,
105
- percent: e
106
- }));
107
- }
108
- }), T((e) => a(e, n, {
109
- status: o.Completed,
110
- percent: 100
111
- })), i += 1;
112
- } catch {
113
- let e = l.signal.aborted ? o.Cancelled : o.Failed;
114
- e === o.Failed && (s += 1), T((t) => a(t, n, e));
115
- }
116
- }
117
- };
118
- await Promise.all(Array.from({ length: 3 }, () => c())), l.signal.aborted || (i === 0 && s > 0 ? C?.({
119
- variant: u.Error,
120
- reason: n.UploadFailed
121
- }) : C?.({
122
- variant: u.Success,
123
- reason: n.UploadCompleted,
124
- folder: w || g
125
- })), x([m]), S(), E.current = null, T(null);
126
- })();
127
- }, [
128
- v,
129
- p,
130
- y,
131
- g,
132
- C,
133
- f,
134
- b,
135
- x,
136
- S,
137
- D
138
- ]),
139
- onUploadArchive: s((e, t, n) => {
140
- D(e, t, n);
141
- }, [D]),
142
- onValidateUpload: s(async (t, n, r) => {
143
- for (let n of t) n.name = e(n.name);
144
- return { valid: !0 };
145
- }, []),
146
- uploadBatchState: w,
149
+ onUploadFiles: A,
150
+ onUploadArchive: j,
151
+ onValidateUpload: M,
152
+ uploadBatchState: E,
147
153
  cancelUpload: s(() => {
148
- E.current?.abort();
154
+ for (let e of O.current.values()) e.abort();
149
155
  }, []),
156
+ cancelUploadFile: N,
150
157
  clearUploadBatch: s(() => {
151
- T(null);
158
+ D(null);
152
159
  }, [])
153
160
  };
154
161
  };
155
162
  //#endregion
156
- export { v as useDialFileUploadBatch };
163
+ export { x as useDialFileUploadBatch };
package/index.d.ts CHANGED
@@ -141,6 +141,7 @@ import { SkillEditorFileActions } from '@epam/ai-dial-skill-editor';
141
141
  import { SkillEditorValues } from '@epam/ai-dial-skill-editor';
142
142
  import { SkillFileBatchError } from '@epam/ai-dial-skill-editor';
143
143
  import { SkillFileListResponseDto } from '@epam/ai-dial-chat-api-client';
144
+ import { SkillFileSourceEntry } from '@epam/ai-dial-skill-editor';
144
145
  import { SkillFileTreeNode } from '@epam/ai-dial-skill-editor';
145
146
  import { SkillFileUploadCandidate } from '@epam/ai-dial-skill-editor';
146
147
  import { SkillFileValidationResult } from '@epam/ai-dial-skill-editor';
@@ -181,6 +182,7 @@ export declare interface AgentCapabilities {
181
182
  hasConfiguration?: boolean;
182
183
  hasChatCompletion?: boolean;
183
184
  hasResponsesApi?: boolean;
185
+ hasSkills?: boolean;
184
186
  }
185
187
 
186
188
  /** Input-attachment configuration for an agent (application) deployment. */
@@ -991,6 +993,12 @@ export declare interface CreateChatStreamApiDeps {
991
993
  getTimezone?: () => string | undefined;
992
994
  /** `fetch` implementation to issue requests through. Defaults to the global `fetch`. */
993
995
  fetchImpl?: typeof fetch;
996
+ /**
997
+ * How long an open completion stream may go without receiving a byte
998
+ * (keepalive comments included) before it is reported as a
999
+ * {@link StreamInterruptedError}. Defaults to {@link DEFAULT_STREAM_IDLE_TIMEOUT_MS}.
1000
+ */
1001
+ idleTimeoutMs?: number;
994
1002
  }
995
1003
 
996
1004
  /**
@@ -1145,6 +1153,8 @@ export declare const DEFAULT_GENERATION_PERSISTENCE_ERROR_MESSAGE = "The respons
1145
1153
  */
1146
1154
  export declare const DEFAULT_MAX_ARCHIVE_BYTES: number;
1147
1155
 
1156
+ export declare const DEFAULT_STREAM_IDLE_TIMEOUT_MS = 45000;
1157
+
1148
1158
  /** Translated folder-path labels for the Personal/Shared/Public deployment groupings. */
1149
1159
  export declare interface DeploymentFolderLabels {
1150
1160
  personal: string;
@@ -1583,8 +1593,6 @@ export declare type FileNameValidationError = {
1583
1593
  } | {
1584
1594
  reason: FileNameValidationErrorReason.DuplicateName;
1585
1595
  existingName: string;
1586
- } | {
1587
- reason: FileNameValidationErrorReason.LeadingDot;
1588
1596
  };
1589
1597
 
1590
1598
  /**
@@ -1597,8 +1605,7 @@ export declare enum FileNameValidationErrorReason {
1597
1605
  ForbiddenSymbols = "forbiddenSymbols",
1598
1606
  ReservedName = "reservedName",
1599
1607
  TooLong = "tooLong",
1600
- DuplicateName = "duplicateName",
1601
- LeadingDot = "leadingDot"
1608
+ DuplicateName = "duplicateName"
1602
1609
  }
1603
1610
 
1604
1611
  /**
@@ -1615,7 +1622,10 @@ export declare enum FileOperationKind {
1615
1622
  FileCopied = "fileCopied",
1616
1623
  FilesCopied = "filesCopied",
1617
1624
  FileMoved = "fileMoved",
1618
- FilesMoved = "filesMoved"
1625
+ FilesMoved = "filesMoved",
1626
+ /** A copy whose every item landed in its own source folder (Duplicate). */
1627
+ FileDuplicated = "fileDuplicated",
1628
+ FilesDuplicated = "filesDuplicated"
1619
1629
  }
1620
1630
 
1621
1631
  /**
@@ -1630,13 +1640,15 @@ export declare interface FileOperationSuccessEvent {
1630
1640
  name?: string;
1631
1641
  /** Number of items the operation covered, when applicable. */
1632
1642
  count?: number;
1633
- /** Destination folder name, for copy/move operations. */
1643
+ /**
1644
+ * Destination folder as a slash-joined virtual path starting at the root
1645
+ * label (e.g. `My files/reports`), for copy/move/duplicate operations.
1646
+ */
1634
1647
  destinationFolderName?: string;
1635
1648
  /**
1636
- * Whether the affected item is a folder rather than a file. Only set for
1637
- * `fileRenamed`, since it is the only kind whose current wording depends
1638
- * on the item's node type (a rename toast reads "Folder renamed" vs.
1639
- * "File renamed").
1649
+ * Whether the affected item is a folder rather than a file. Set for rename,
1650
+ * copy, move, and duplicate events; on a multi-item event it describes the
1651
+ * first successfully affected item (the one `name` refers to).
1640
1652
  */
1641
1653
  isFolder?: boolean;
1642
1654
  }
@@ -1859,6 +1871,9 @@ export declare const getQuickAppConversationStarters: (conversationStarters: unk
1859
1871
  */
1860
1872
  export declare const getRemainingCharacters: (value: string, maxLength: number) => number | null;
1861
1873
 
1874
+ /** Returns the limit each over-long skill field exceeds, keyed by field; fields within their limit are omitted. */
1875
+ export declare const getSkillFieldLengthViolations: (values: Record<SkillTextField, string>) => Partial<Record<SkillTextField, number>>;
1876
+
1862
1877
  /**
1863
1878
  * Returns the text to start/populate a conversation from a selected starter button.
1864
1879
  * `description` (the schema property's shared intro/question text) is used only
@@ -2521,6 +2536,15 @@ export declare enum McpResourceKind {
2521
2536
 
2522
2537
  export declare const mergeCreatedFolderIntoCache: (cache: Map<string, ListFilesItemDto[]>, parentApiPath: string, created: CreateFolderResponseDto, inheritedPermissions?: string[]) => Map<string, ListFilesItemDto[]>;
2523
2538
 
2539
+ /**
2540
+ * Merges a freshly-fetched page 0 into the currently-loaded run list: an
2541
+ * already-known id is replaced in place at its existing array position, an
2542
+ * unseen id is prepended (upstream order is `created_at desc`, so it is the
2543
+ * newest), and an id absent from `incoming` is left untouched — a background
2544
+ * refresh never removes a loaded run.
2545
+ */
2546
+ export declare const mergeRunsById: (current: ScheduledTaskRunDto[], incoming: ScheduledTaskRunDto[]) => ScheduledTaskRunDto[];
2547
+
2524
2548
  /**
2525
2549
  * Merges incoming stage deltas into an existing stage list, keyed by `index`.
2526
2550
  *
@@ -2598,6 +2622,7 @@ export declare interface ModelCapabilities {
2598
2622
  hasResume?: boolean;
2599
2623
  hasChatCompletion?: boolean;
2600
2624
  hasResponsesApi?: boolean;
2625
+ hasSkills?: boolean;
2601
2626
  reasoningEfforts?: string[];
2602
2627
  }
2603
2628
 
@@ -3581,6 +3606,9 @@ export declare const SKILL_MANIFEST_FILE = "SKILL.md";
3581
3606
  */
3582
3607
  export declare const SKILL_MANIFEST_MAX_BYTES: number;
3583
3608
 
3609
+ /** Length limit of each skill editor text field. */
3610
+ export declare const SKILL_TEXT_FIELD_MAX_LENGTHS: Record<SkillTextField, number>;
3611
+
3584
3612
  /**
3585
3613
  * Client-side mirror of the backend's default `SKILL_UPLOAD_MAX_FILES`
3586
3614
  * (`apps/chat-api/src/config/environment.config.ts`), used only for
@@ -3689,6 +3717,8 @@ export declare interface SkillEditorSubmitClient {
3689
3717
  export declare interface SkillEditorSubmitMessages {
3690
3718
  /** Shown when a required field is empty. */
3691
3719
  required: string;
3720
+ /** Shown when a name, description or instructions value exceeds its length limit, given that limit. */
3721
+ tooLong: (maxLength: number) => string;
3692
3722
  /**
3693
3723
  * Shown when the Instructions value opens with its own YAML frontmatter
3694
3724
  * block — pasting a whole `SKILL.md` in there would otherwise produce a
@@ -3895,6 +3925,9 @@ export declare enum SkillSource {
3895
3925
  Public = "public"
3896
3926
  }
3897
3927
 
3928
+ /** Skill editor text fields with a length limit. */
3929
+ export declare type SkillTextField = 'name' | 'description' | 'instructions';
3930
+
3898
3931
  /** Splits a file name into its base and extension, using only the last dot. */
3899
3932
  export declare const splitFileNameExtension: (fileName: string) => {
3900
3933
  base: string;
@@ -3931,6 +3964,18 @@ export declare interface StreamCompletionOptions {
3931
3964
  signal: AbortSignal;
3932
3965
  }
3933
3966
 
3967
+ /**
3968
+ * Reported through `onError` when the network connection carrying a
3969
+ * completion stream is lost (a rejected `fetch`, or a read that fails after a
3970
+ * 2xx response) or goes silent past the idle timeout — what a laptop sleep or
3971
+ * a phone lock mid-generation produces. The backend-owned generation may
3972
+ * still be running, so the caller can recover it rather than treat the
3973
+ * response as failed. `cause` holds the original error, when there is one.
3974
+ */
3975
+ export declare class StreamInterruptedError extends Error {
3976
+ constructor(cause?: unknown);
3977
+ }
3978
+
3934
3979
  /**
3935
3980
  * Reported through `onError` when DIAL Core itself signals a failure with an
3936
3981
  * in-band `{ error: { message } }` SSE chunk. Its `message` is upstream text
@@ -4314,7 +4359,7 @@ export declare enum UnsupportedTriggerReason {
4314
4359
  MissingRequiredFields = "missingRequiredFields"
4315
4360
  }
4316
4361
 
4317
- export declare const updateEntry: (prev: FileUploadBatchState | null, index: number, patch: FileUploadStatus | Partial<Pick<FileUploadEntry, "status" | "percent">>) => FileUploadBatchState | null;
4362
+ export declare const updateEntry: (prev: FileUploadBatchState | null, id: string, patch: FileUploadStatus | Partial<Pick<FileUploadEntry, "status" | "percent">>) => FileUploadBatchState | null;
4318
4363
 
4319
4364
  /** Max number of files uploaded concurrently within a single upload batch. */
4320
4365
  export declare const UPLOAD_CONCURRENCY = 3;
@@ -5251,7 +5296,9 @@ export declare interface UseDialFileManagerResult {
5251
5296
  uploadBatchState: FileUploadBatchState | null;
5252
5297
  /** Upload: abort all in-flight and queued uploads. */
5253
5298
  cancelUpload: () => void;
5254
- /** Upload: dismiss the progress modal after the batch has settled. */
5299
+ /** Upload: abort one queued or in-flight upload by its entry id. */
5300
+ cancelUploadFile: (id: string) => void;
5301
+ /** Upload: empty the upload queue. */
5255
5302
  clearUploadBatch: () => void;
5256
5303
  /** Folder creation: called when user confirms a new folder name. */
5257
5304
  onCreateFolder: (file: DialUploadFileItem, folderPath: string, fileId: string) => Promise<void>;
@@ -5318,7 +5365,7 @@ export declare interface UseDialFileManagerResult {
5318
5365
  /**
5319
5366
  * True while any mutating file-manager operation is in flight: the OR of
5320
5367
  * `isCreatingFolder`, `isDownloading`, `isDeleting`, `isRenaming`, `isCopying`,
5321
- * `isMoving`, `isUnsharing`, `isRemovingAccess`, and `uploadBatchState != null`.
5368
+ * `isMoving`, `isUnsharing`, `isRemovingAccess`, and any upload still queued or running.
5322
5369
  *
5323
5370
  * Deliberately excludes three flags, each already fully contained by its own
5324
5371
  * scoped loading UI:
@@ -5464,10 +5511,11 @@ export declare interface UseDialFileSharingResult {
5464
5511
 
5465
5512
  /**
5466
5513
  * Manages upload batches (single-file and ZIP-archive extraction), including
5467
- * concurrency-limited progress tracking and abort. Invalidates the shared
5468
- * listing cache for the destination folder through `invalidateFolders`/
5469
- * `bumpRetry` after a batch settles — it never holds its own copy of the
5470
- * cache.
5514
+ * concurrency-limited progress tracking and per-file abort. A batch started
5515
+ * while another is on screen is appended to it, and settled entries stay in
5516
+ * `uploadBatchState` until `clearUploadBatch`. Invalidates the shared listing
5517
+ * cache for the destination folder through `invalidateFolders`/`bumpRetry`
5518
+ * after a batch settles — it never holds its own copy of the cache.
5471
5519
  */
5472
5520
  export declare const useDialFileUploadBatch: ({ filesApi, bucket, rootLabel, activeTab, cache, sharedRootMetaRef, invalidateFolders, bumpRetry, onNotification, }: UseDialFileUploadBatchOptions) => UseDialFileUploadBatchResult;
5473
5521
 
@@ -5500,6 +5548,7 @@ export declare interface UseDialFileUploadBatchResult {
5500
5548
  onValidateUpload: (files: DialUploadFileItem[], existingFiles: DialFile[], destinationFolder: string) => Promise<FileUploadValidationResult>;
5501
5549
  uploadBatchState: FileUploadBatchState | null;
5502
5550
  cancelUpload: () => void;
5551
+ cancelUploadFile: (id: string) => void;
5503
5552
  clearUploadBatch: () => void;
5504
5553
  }
5505
5554
 
@@ -5902,8 +5951,8 @@ export declare interface UsePublishFoldersResult {
5902
5951
  hasPublishWriteAccess: (folderPath: string[]) => boolean;
5903
5952
  }
5904
5953
 
5905
- /** Shared, cancellation-safe pagination for one schedule's run history. */
5906
- export declare const useScheduledTaskRuns: (client: ScheduledTasksApiClient, { scheduleId, enabled, pageSize }: UseScheduledTaskRunsOptions) => {
5954
+ /** Shared, cancellation-safe pagination and background refresh for one schedule's run history. */
5955
+ export declare const useScheduledTaskRuns: (client: ScheduledTasksApiClient, { scheduleId, enabled, pageSize, nextRunTime, }: UseScheduledTaskRunsOptions) => {
5907
5956
  items: ScheduledTaskRunDto[];
5908
5957
  isLoading: boolean;
5909
5958
  isLoadingMore: boolean;
@@ -5919,6 +5968,12 @@ export declare interface UseScheduledTaskRunsOptions {
5919
5968
  scheduleId: string;
5920
5969
  enabled?: boolean;
5921
5970
  pageSize?: number;
5971
+ /**
5972
+ * The task's next scheduled run time (ISO string), when known. Drives the
5973
+ * one-shot background refresh described on {@link useScheduledTaskRuns}.
5974
+ * The caller already holds the task DTO — this hook never fetches it.
5975
+ */
5976
+ nextRunTime?: string | null;
5922
5977
  }
5923
5978
 
5924
5979
  /** Shared scheduler-list lifecycle with generation-scoped stale-response guards. */
@@ -6192,10 +6247,11 @@ export declare interface UseSkillEditorSubmitResult {
6192
6247
  /**
6193
6248
  * Owns the Skill Editor's batch file upload workflow: validating a staged
6194
6249
  * batch, committing it atomically (supporting files plus an optional
6195
- * `SKILL.md` manifest import, with a confirmation gate), and removing
6250
+ * `SKILL.md` manifest import, with a confirmation gate), creating empty
6251
+ * folders, expanding `.zip` archives for staging, and removing
6196
6252
  * already-committed nodes.
6197
6253
  */
6198
- export declare const useSkillFileActions: ({ files, setFiles, filesContentRef, frontmatterRef, loadedValues, setLoadedValues, isEditMode, isDirty, setSelectedPath, messages, }: UseSkillFileActionsParams) => UseSkillFileActionsResult;
6254
+ export declare const useSkillFileActions: ({ files, setFiles, filesContentRef, frontmatterRef, loadedValues, setLoadedValues, isEditMode, isDirty, setSelectedPath, messages, pickFromFileSystem, }: UseSkillFileActionsParams) => UseSkillFileActionsResult;
6199
6255
 
6200
6256
  /** Parameters accepted by {@link useSkillFileActions}. */
6201
6257
  export declare interface UseSkillFileActionsParams {
@@ -6219,6 +6275,12 @@ export declare interface UseSkillFileActionsParams {
6219
6275
  setSelectedPath: Dispatch<SetStateAction<string>>;
6220
6276
  /** Localized messages, resolved by the host. */
6221
6277
  messages: SkillFileActionsMessages;
6278
+ /**
6279
+ * Opens the host's file-system picker; passed through unchanged as
6280
+ * `fileActions.pickFromFileSystem`. Omit to hide the editor's "Open DIAL
6281
+ * file system" entry.
6282
+ */
6283
+ pickFromFileSystem?: () => Promise<SkillFileSourceEntry[] | undefined>;
6222
6284
  }
6223
6285
 
6224
6286
  /** Return value of {@link useSkillFileActions}. */