dsh-life-pack 0.3.3 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -0
- package/dist/client.js +166 -22
- package/dist/client.js.map +1 -1
- package/dist/directory-browser-api.d.ts +10 -7
- package/dist/directory-browser-api.d.ts.map +1 -1
- package/dist/directory-browser-api.js +8 -6
- package/dist/directory-browser-api.js.map +1 -1
- package/dist/directory-browser-contract.d.ts +51 -3
- package/dist/directory-browser-contract.d.ts.map +1 -1
- package/dist/directory-browser-contract.js +56 -5
- package/dist/directory-browser-contract.js.map +1 -1
- package/dist/directory-browser-parts.d.ts +68 -0
- package/dist/directory-browser-parts.d.ts.map +1 -0
- package/dist/directory-browser-parts.js +195 -0
- package/dist/directory-browser-parts.js.map +1 -0
- package/dist/directory-browser-roots.d.ts +21 -0
- package/dist/directory-browser-roots.d.ts.map +1 -0
- package/dist/directory-browser-roots.js +40 -0
- package/dist/directory-browser-roots.js.map +1 -0
- package/dist/directory-browser-state.d.ts +38 -5
- package/dist/directory-browser-state.d.ts.map +1 -1
- package/dist/directory-browser-state.js +69 -2
- package/dist/directory-browser-state.js.map +1 -1
- package/dist/directory-browser-ui.d.ts +8 -23
- package/dist/directory-browser-ui.d.ts.map +1 -1
- package/dist/directory-browser-ui.js +10 -148
- package/dist/directory-browser-ui.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/roots.d.ts +34 -0
- package/dist/roots.d.ts.map +1 -0
- package/dist/roots.js +95 -0
- package/dist/roots.js.map +1 -0
- package/dist/update-contract.d.ts +7 -0
- package/dist/update-contract.d.ts.map +1 -1
- package/dist/update-contract.js +7 -0
- package/dist/update-contract.js.map +1 -1
- package/dist/update-host.d.ts.map +1 -1
- package/dist/update-host.js +5 -1
- package/dist/update-host.js.map +1 -1
- package/package.json +6 -1
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
/** 目录浏览器的公开门(**六家只 import 这一个名字**)。
|
|
2
2
|
*
|
|
3
|
-
* 为什么需要它:`package.json` 的 exports
|
|
4
|
-
*
|
|
5
|
-
* 六家就取不到「开图接线」(它在 state
|
|
3
|
+
* 为什么需要它:`package.json` 的 exports 一条子路径只能指一个文件,而本件分五份写
|
|
4
|
+
* (契约/状态/视图/零件/根取数)。若把 `./directory-browser` 直接指到 `directory-browser-contract.js`,
|
|
5
|
+
* 六家就取不到「开图接线」(它在 state 那份里)。故设这一个门,把纯逻辑与取数接线都转出;
|
|
6
6
|
* 视图那一份走 `./directory-browser-ui`(它要吃 React,单独一条)。
|
|
7
7
|
*
|
|
8
|
-
*
|
|
8
|
+
* 本件不含实现、也不含判断,只做转出——实现见同目录那几份。
|
|
9
9
|
*/
|
|
10
|
-
export { filterEntries, hasPickFn, hiddenCount, isBrowseFace, joinPath, locationLabel, parentOf, pickerModeOf, readPickAnswer, splitDraft, validateFolderName, visibleEntries, } from './directory-browser-contract.js';
|
|
11
|
-
export
|
|
12
|
-
export {
|
|
10
|
+
export { browseFaceOf, filterEntries, hasPickFn, hiddenCount, isBrowseFace, joinPath, locationLabel, parentOf, pickerModeOf, readBrowseAnswer, readPickAnswer, splitDraft, validateFolderName, visibleEntries, } from './directory-browser-contract.js';
|
|
11
|
+
export { BrowseAnswerError } from './directory-browser-contract.js';
|
|
12
|
+
export type { BrowseFailure, DirectoryBrowseFace, DirectoryCrumb, DirectoryEntry, DirectoryListing, PickEnvelope, PickerMode, PickOutcome, RootKind, RootRow, } from './directory-browser-contract.js';
|
|
13
|
+
export { canGoUp, createBaseOf, createBrowseController, createDirectoryRowBrowser, describe, entryPath, openRowBrowser, rowsOf, targetOf, } from './directory-browser-state.js';
|
|
13
14
|
export type { BrowseController, BrowseListener, BrowsePhase, BrowseState, DirectoryRowBrowser, } from './directory-browser-state.js';
|
|
15
|
+
export { createRootsSource, readRootsAnswer } from './directory-browser-roots.js';
|
|
16
|
+
export type { RootsCall } from './directory-browser-roots.js';
|
|
14
17
|
import type { PickerMode } from './directory-browser-contract.js';
|
|
15
18
|
/** 一行目录配置的入口(**六家画按钮就靠这两格**):
|
|
16
19
|
* `mode` 决定按钮写什么(`native`=「选择文件夹…」/`browse`=「浏览…」),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"directory-browser-api.d.ts","sourceRoot":"","sources":["../src/directory-browser-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,aAAa,EACb,SAAS,EACT,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,cAAc,GACf,MAAM,iCAAiC,CAAC;AACzC,YAAY,EACV,aAAa,EACb,mBAAmB,EACnB,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,WAAW,
|
|
1
|
+
{"version":3,"file":"directory-browser-api.d.ts","sourceRoot":"","sources":["../src/directory-browser-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,YAAY,EACZ,aAAa,EACb,SAAS,EACT,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,cAAc,GACf,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,YAAY,EACV,aAAa,EACb,mBAAmB,EACnB,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,WAAW,EACX,QAAQ,EACR,OAAO,GACR,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,OAAO,EACP,YAAY,EACZ,sBAAsB,EACtB,yBAAyB,EACzB,QAAQ,EACR,SAAS,EACT,cAAc,EACd,MAAM,EACN,QAAQ,GACT,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,WAAW,EACX,mBAAmB,GACpB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAClF,YAAY,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAE9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAElE;;;kDAGkD;AAClD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;CAC7D"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
/** 目录浏览器的公开门(**六家只 import 这一个名字**)。
|
|
2
2
|
*
|
|
3
|
-
* 为什么需要它:`package.json` 的 exports
|
|
4
|
-
*
|
|
5
|
-
* 六家就取不到「开图接线」(它在 state
|
|
3
|
+
* 为什么需要它:`package.json` 的 exports 一条子路径只能指一个文件,而本件分五份写
|
|
4
|
+
* (契约/状态/视图/零件/根取数)。若把 `./directory-browser` 直接指到 `directory-browser-contract.js`,
|
|
5
|
+
* 六家就取不到「开图接线」(它在 state 那份里)。故设这一个门,把纯逻辑与取数接线都转出;
|
|
6
6
|
* 视图那一份走 `./directory-browser-ui`(它要吃 React,单独一条)。
|
|
7
7
|
*
|
|
8
|
-
*
|
|
8
|
+
* 本件不含实现、也不含判断,只做转出——实现见同目录那几份。
|
|
9
9
|
*/
|
|
10
|
-
export { filterEntries, hasPickFn, hiddenCount, isBrowseFace, joinPath, locationLabel, parentOf, pickerModeOf, readPickAnswer, splitDraft, validateFolderName, visibleEntries, } from './directory-browser-contract.js';
|
|
11
|
-
export {
|
|
10
|
+
export { browseFaceOf, filterEntries, hasPickFn, hiddenCount, isBrowseFace, joinPath, locationLabel, parentOf, pickerModeOf, readBrowseAnswer, readPickAnswer, splitDraft, validateFolderName, visibleEntries, } from './directory-browser-contract.js';
|
|
11
|
+
export { BrowseAnswerError } from './directory-browser-contract.js';
|
|
12
|
+
export { canGoUp, createBaseOf, createBrowseController, createDirectoryRowBrowser, describe, entryPath, openRowBrowser, rowsOf, targetOf, } from './directory-browser-state.js';
|
|
13
|
+
export { createRootsSource, readRootsAnswer } from './directory-browser-roots.js';
|
|
12
14
|
//# sourceMappingURL=directory-browser-api.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"directory-browser-api.js","sourceRoot":"","sources":["../src/directory-browser-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,aAAa,EACb,SAAS,EACT,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,cAAc,GACf,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"directory-browser-api.js","sourceRoot":"","sources":["../src/directory-browser-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,YAAY,EACZ,aAAa,EACb,SAAS,EACT,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,cAAc,GACf,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAcpE,OAAO,EACL,OAAO,EACP,YAAY,EACZ,sBAAsB,EACtB,yBAAyB,EACzB,QAAQ,EACR,SAAS,EACT,cAAc,EACd,MAAM,EACN,QAAQ,GACT,MAAM,8BAA8B,CAAC;AAStC,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC"}
|
|
@@ -42,8 +42,24 @@ export interface BrowseFailure {
|
|
|
42
42
|
readonly code: string;
|
|
43
43
|
readonly message: string;
|
|
44
44
|
}
|
|
45
|
-
/**
|
|
45
|
+
/** 宿主拒了一条路的说法随宿主变化,**本件不认识**:调用方把它的回执码传进 `openRowBrowser`。
|
|
46
|
+
*
|
|
47
|
+
* 它为什么是唯一信号:一次组合里只服务一种能力(native 或 browse),另一条路上的动词一律被拒
|
|
48
|
+
* (`@deepseek-ai/dsh-api-workspace-controller/lib/types/directory-picker.js` 的 `requireCapability`);
|
|
49
|
+
* 而三条动词在客户端命名空间上都在(都由 `TYPERT_REMOTE.descriptors` 生成),
|
|
50
|
+
* 所以「有没有 `pick`/有没有 `list`」问不出组合里服务哪种能力,只有真调一次、看它拒没拒才知道。 */
|
|
51
|
+
/** 目录行入口的三态判定结果:**按命名空间上有什么动词**看一眼,不是问组合里服务哪种能力。 */
|
|
46
52
|
export type PickerMode = 'native' | 'browse' | 'none';
|
|
53
|
+
/** 一个「根」是什么类型:界面只拿它写悬停说明,不拿它做任何判断。
|
|
54
|
+
*
|
|
55
|
+
* 这五个值由**取数方**(宿主半)归一:Windows 上是 `DriveInfo.DriveType` 映过来的;
|
|
56
|
+
* 别的根(挂载点等)落 `other`。本件不认识任何宿主名词,只认识这五个值。 */
|
|
57
|
+
export type RootKind = 'fixed' | 'network' | 'removable' | 'optical' | 'other';
|
|
58
|
+
/** 一个可跳转的根:`path` 是绝对路径(Windows 上形如 `D:\`),`kind` 只用于显示。 */
|
|
59
|
+
export interface RootRow {
|
|
60
|
+
readonly path: string;
|
|
61
|
+
readonly kind: RootKind;
|
|
62
|
+
}
|
|
47
63
|
/** 平台回执的信封(各家的 `DirectoryPickerAnswer` 与此同形;本件只认这三格,不认别家的类名)。 */
|
|
48
64
|
export interface PickEnvelope {
|
|
49
65
|
readonly ok: boolean;
|
|
@@ -53,7 +69,11 @@ export interface PickEnvelope {
|
|
|
53
69
|
readonly message?: string;
|
|
54
70
|
};
|
|
55
71
|
}
|
|
56
|
-
/** 一次「唤起选择器」的归一结果:选中/取消/供不了,永不抛。
|
|
72
|
+
/** 一次「唤起选择器」的归一结果:选中/取消/供不了,永不抛。
|
|
73
|
+
*
|
|
74
|
+
* `code` 只在平台给了的时候带上(就是 `error.code`):调用方据它分辨「宿主没给这条路」与
|
|
75
|
+
* 「别的失败」——前者该换一条路走,后者才该报出来。那个码由调用方从自己的宿主镜像里传进来
|
|
76
|
+
* (见 `openRowBrowser` 的 `refusalCode`),本件不认它的名字。 */
|
|
57
77
|
export type PickOutcome = {
|
|
58
78
|
readonly kind: 'picked';
|
|
59
79
|
readonly path: string;
|
|
@@ -61,13 +81,19 @@ export type PickOutcome = {
|
|
|
61
81
|
readonly kind: 'cancelled';
|
|
62
82
|
} | {
|
|
63
83
|
readonly kind: 'unavailable';
|
|
84
|
+
readonly code?: string;
|
|
64
85
|
readonly message: string;
|
|
65
86
|
};
|
|
66
87
|
/** 认一认某个值是不是可用的目录取数面(软依赖守卫用:认不出就当没有,绝不把页面带下来)。 */
|
|
67
88
|
export declare function isBrowseFace(raw: unknown): raw is DirectoryBrowseFace;
|
|
68
89
|
/** 认一认某个值有没有 `pick`(对应宿主 composition 里的 `native` 能力)。 */
|
|
69
90
|
export declare function hasPickFn(raw: unknown): boolean;
|
|
70
|
-
/**
|
|
91
|
+
/** 三态判定:**先看两格浏览原语**(都在=应用内浏览器这条路在),再看单独的 `pick`,都没有=`none`。
|
|
92
|
+
*
|
|
93
|
+
* 为什么浏览优先:客户端命名空间上三条动词一定都在(由 `TYPERT_REMOTE.descriptors` 生成,
|
|
94
|
+
* 与组合里服务哪种能力无关),所以两格原语在=这台宿主**可能**给浏览;真调一次才知道给不给,
|
|
95
|
+
* 不给({@link CAPABILITY_REFUSED})再由调用方换系统对话框。反过来先认 `pick` 就会在
|
|
96
|
+
* Desktop 这种「只服务 browse」的宿主上每次都去唤一次系统对话框、被拒一次(#744 实测)。 */
|
|
71
97
|
export declare function pickerModeOf(raw: unknown): PickerMode;
|
|
72
98
|
/** 平台回执 → 三态(**永不抛**):成功回的是信封里的 `value` 不是路径;`ok:false` 是「供不了」不是「取消」。
|
|
73
99
|
*
|
|
@@ -75,6 +101,28 @@ export declare function pickerModeOf(raw: unknown): PickerMode;
|
|
|
75
101
|
* 第一方消费方 `@deepseek-ai/dsh-client-ui-workspace/lib/client.js:99-103` 就照这个信封拆。
|
|
76
102
|
* 裸串照收(老形状兜底),认不出的形状当「供不了」报出来,不当取消吞掉(#743 的教训)。 */
|
|
77
103
|
export declare function readPickAnswer(raw: unknown): PickOutcome;
|
|
104
|
+
/** 取数原语失败:带上宿主给的回执码,好让调用方分辨「没这条路」与「这一层读不出来」。
|
|
105
|
+
*
|
|
106
|
+
* `code` 就是 `humanize`(状态那半)读的那一格,人话直接上图。 */
|
|
107
|
+
export declare class BrowseAnswerError extends Error {
|
|
108
|
+
readonly code: string;
|
|
109
|
+
constructor(code: string, message: string);
|
|
110
|
+
}
|
|
111
|
+
/** 宿主 browse 原语的**信封** → 值,或按信封里的 `error` 抛。
|
|
112
|
+
*
|
|
113
|
+
* 为什么必须走这一道:`list`/`createDirectory` 与 `pick` 一样是 Remote 动词,客户端拿到的是
|
|
114
|
+
* `{ok:true,value}`/`{ok:false,error}`(`@deepseek-ai/dsh-api-gateway/lib/client.js` 的 `invoke()`)。
|
|
115
|
+
* 把信封当值用,图上就会是一层「读出来了但一行都没有」的空目录(#744 实测),
|
|
116
|
+
* 而不是报错——所以宁可在这里抛,也不许把它当列举结果传下去。
|
|
117
|
+
* 第一方消费方同口径:`@deepseek-ai/dsh-client-ui-workspace/lib/client.js:105-113` 也是这么拆的。 */
|
|
118
|
+
export declare function readBrowseAnswer<T>(raw: unknown, what: string): T;
|
|
119
|
+
/** 宿主命名空间 → 本件的取数面:把两条原语的信封拆开,成功给值、失败按码抛。
|
|
120
|
+
*
|
|
121
|
+
* 命名空间上两格原语不在就回 null(调用方据此不画入口)。**透传参数个数照宿主的规矩**:
|
|
122
|
+
* 描述符声明了可选 `AbortSignal`(`cancellation: {parameter:'signal'}`),而客户端按
|
|
123
|
+
* `values.length === 业务参数个数 + 1` 判有没有 signal——显式传一个 `undefined` 会被当成 signal
|
|
124
|
+
* 去 `AbortSignal.any([…, undefined])` 而炸。本件的界面不做取消,故**从不传 signal**。 */
|
|
125
|
+
export declare function browseFaceOf(raw: unknown): DirectoryBrowseFace | null;
|
|
78
126
|
/** 上一层:`'C:\\a\\b\\'` → `'C:\\a'`;已经是根则回自身;相对名(没有任何分隔符)也回自身。
|
|
79
127
|
*
|
|
80
128
|
* 尾分隔符先吃掉再切——否则「回上一级」会在原地打转。**盘根单独认**:`C:\` 掐掉尾分隔符会剩成
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"directory-browser-contract.d.ts","sourceRoot":"","sources":["../src/directory-browser-contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,uCAAuC;AACvC,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED,sCAAsC;AACtC,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED,6EAA6E;AAC7E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,QAAQ,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,oCAAoC;AACpC,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACrE,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9D;AAED,8CAA8C;AAC9C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,
|
|
1
|
+
{"version":3,"file":"directory-browser-contract.d.ts","sourceRoot":"","sources":["../src/directory-browser-contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,11 +25,16 @@ export function hasPickFn(raw) {
|
|
|
25
25
|
return false;
|
|
26
26
|
return typeof raw.pick === 'function';
|
|
27
27
|
}
|
|
28
|
-
/**
|
|
28
|
+
/** 三态判定:**先看两格浏览原语**(都在=应用内浏览器这条路在),再看单独的 `pick`,都没有=`none`。
|
|
29
|
+
*
|
|
30
|
+
* 为什么浏览优先:客户端命名空间上三条动词一定都在(由 `TYPERT_REMOTE.descriptors` 生成,
|
|
31
|
+
* 与组合里服务哪种能力无关),所以两格原语在=这台宿主**可能**给浏览;真调一次才知道给不给,
|
|
32
|
+
* 不给({@link CAPABILITY_REFUSED})再由调用方换系统对话框。反过来先认 `pick` 就会在
|
|
33
|
+
* Desktop 这种「只服务 browse」的宿主上每次都去唤一次系统对话框、被拒一次(#744 实测)。 */
|
|
29
34
|
export function pickerModeOf(raw) {
|
|
30
|
-
if (
|
|
31
|
-
return '
|
|
32
|
-
return
|
|
35
|
+
if (isBrowseFace(raw))
|
|
36
|
+
return 'browse';
|
|
37
|
+
return hasPickFn(raw) ? 'native' : 'none';
|
|
33
38
|
}
|
|
34
39
|
/** 平台回执 → 三态(**永不抛**):成功回的是信封里的 `value` 不是路径;`ok:false` 是「供不了」不是「取消」。
|
|
35
40
|
*
|
|
@@ -45,7 +50,53 @@ export function readPickAnswer(raw) {
|
|
|
45
50
|
return typeof value === 'string' && value.trim() !== '' ? { kind: 'picked', path: value } : { kind: 'cancelled' };
|
|
46
51
|
}
|
|
47
52
|
const detail = answer.error?.message?.trim() ?? '';
|
|
48
|
-
|
|
53
|
+
const code = answer.error?.code;
|
|
54
|
+
return {
|
|
55
|
+
kind: 'unavailable',
|
|
56
|
+
...(typeof code === 'string' && code !== '' ? { code } : {}),
|
|
57
|
+
message: '打不开系统文件夹对话框' + (detail === '' ? '' : '(' + detail + ')') + ':请直接在框里填绝对路径。',
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/** 取数原语失败:带上宿主给的回执码,好让调用方分辨「没这条路」与「这一层读不出来」。
|
|
61
|
+
*
|
|
62
|
+
* `code` 就是 `humanize`(状态那半)读的那一格,人话直接上图。 */
|
|
63
|
+
export class BrowseAnswerError extends Error {
|
|
64
|
+
code;
|
|
65
|
+
constructor(code, message) {
|
|
66
|
+
super(message);
|
|
67
|
+
this.name = 'BrowseAnswerError';
|
|
68
|
+
this.code = code;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/** 宿主 browse 原语的**信封** → 值,或按信封里的 `error` 抛。
|
|
72
|
+
*
|
|
73
|
+
* 为什么必须走这一道:`list`/`createDirectory` 与 `pick` 一样是 Remote 动词,客户端拿到的是
|
|
74
|
+
* `{ok:true,value}`/`{ok:false,error}`(`@deepseek-ai/dsh-api-gateway/lib/client.js` 的 `invoke()`)。
|
|
75
|
+
* 把信封当值用,图上就会是一层「读出来了但一行都没有」的空目录(#744 实测),
|
|
76
|
+
* 而不是报错——所以宁可在这里抛,也不许把它当列举结果传下去。
|
|
77
|
+
* 第一方消费方同口径:`@deepseek-ai/dsh-client-ui-workspace/lib/client.js:105-113` 也是这么拆的。 */
|
|
78
|
+
export function readBrowseAnswer(raw, what) {
|
|
79
|
+
const answer = (typeof raw === 'object' && raw !== null ? raw : {});
|
|
80
|
+
if (answer.ok === true && answer.value !== undefined && answer.value !== null)
|
|
81
|
+
return answer.value;
|
|
82
|
+
const detail = answer.error?.message?.trim() ?? '';
|
|
83
|
+
const code = answer.error?.code;
|
|
84
|
+
throw new BrowseAnswerError(typeof code === 'string' && code !== '' ? code : 'browse-failed', detail === '' ? what + '没有回执' : detail);
|
|
85
|
+
}
|
|
86
|
+
/** 宿主命名空间 → 本件的取数面:把两条原语的信封拆开,成功给值、失败按码抛。
|
|
87
|
+
*
|
|
88
|
+
* 命名空间上两格原语不在就回 null(调用方据此不画入口)。**透传参数个数照宿主的规矩**:
|
|
89
|
+
* 描述符声明了可选 `AbortSignal`(`cancellation: {parameter:'signal'}`),而客户端按
|
|
90
|
+
* `values.length === 业务参数个数 + 1` 判有没有 signal——显式传一个 `undefined` 会被当成 signal
|
|
91
|
+
* 去 `AbortSignal.any([…, undefined])` 而炸。本件的界面不做取消,故**从不传 signal**。 */
|
|
92
|
+
export function browseFaceOf(raw) {
|
|
93
|
+
if (!isBrowseFace(raw))
|
|
94
|
+
return null;
|
|
95
|
+
const namespace = raw;
|
|
96
|
+
return {
|
|
97
|
+
list: async (path) => readBrowseAnswer(path === undefined ? await namespace.list() : await namespace.list(path), '列举目录'),
|
|
98
|
+
createDirectory: async (path, name) => readBrowseAnswer(await namespace.createDirectory(path, name), '新建文件夹'),
|
|
99
|
+
};
|
|
49
100
|
}
|
|
50
101
|
/** 一段路径里最后那个分隔符的位置(Windows 上 `\` 与 `/` 都算;POSIX 上 `\` 是合法文件名字符,不算)。 */
|
|
51
102
|
function lastSeparator(path) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"directory-browser-contract.js","sourceRoot":"","sources":["../src/directory-browser-contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;
|
|
1
|
+
{"version":3,"file":"directory-browser-contract.js","sourceRoot":"","sources":["../src/directory-browser-contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/** 文件浏览器视图半的**零件**:样式表与四行控件(面包屑/根/一行子目录/新建行)。
|
|
2
|
+
*
|
|
3
|
+
* 为什么拆出来:整张对话框的组版与这些零件的变化频率不同——零件跟着「图上多一行/少一行」动,
|
|
4
|
+
* 组版跟着「对话框长什么样」动。拆开之后两边都在 350 行告警线内,而对外面不变
|
|
5
|
+
* (`directory-browser-ui.ts` 照旧转出组件与两个接线函数)。
|
|
6
|
+
*
|
|
7
|
+
* 本件与视图半同样**不认识宿主**:只认状态与文案。
|
|
8
|
+
*/
|
|
9
|
+
import * as React from 'react';
|
|
10
|
+
import type { BrowseState } from './directory-browser-state.js';
|
|
11
|
+
import type { DirectoryEntry } from './directory-browser-contract.js';
|
|
12
|
+
/** 图上出现的每一句文案;调用方给(本件不自造口径)。 */
|
|
13
|
+
export interface DirectoryBrowserLabels {
|
|
14
|
+
/** 对话框标题,例:「选择数据目录」。 */
|
|
15
|
+
readonly title: string;
|
|
16
|
+
readonly close: string;
|
|
17
|
+
readonly up: string;
|
|
18
|
+
readonly pathPlaceholder: string;
|
|
19
|
+
readonly go: string;
|
|
20
|
+
readonly showHidden: (count: number) => string;
|
|
21
|
+
readonly empty: string;
|
|
22
|
+
readonly loading: string;
|
|
23
|
+
readonly newFolder: string;
|
|
24
|
+
readonly createConfirm: string;
|
|
25
|
+
readonly createCancel: string;
|
|
26
|
+
readonly select: string;
|
|
27
|
+
readonly selected: string;
|
|
28
|
+
readonly open: string;
|
|
29
|
+
readonly cancel: string;
|
|
30
|
+
/** 选中预览那一行的前缀,例:「将选定:」。 */
|
|
31
|
+
readonly willPick: string;
|
|
32
|
+
/** 根那一行的行首说明,例:「其他磁盘:」。 */
|
|
33
|
+
readonly roots: string;
|
|
34
|
+
}
|
|
35
|
+
export declare const S: {
|
|
36
|
+
readonly scrim: React.CSSProperties;
|
|
37
|
+
readonly dialog: React.CSSProperties;
|
|
38
|
+
readonly head: React.CSSProperties;
|
|
39
|
+
readonly title: React.CSSProperties;
|
|
40
|
+
readonly headTail: React.CSSProperties;
|
|
41
|
+
readonly crumbs: React.CSSProperties;
|
|
42
|
+
readonly chromeButton: React.CSSProperties;
|
|
43
|
+
readonly crumbSep: React.CSSProperties;
|
|
44
|
+
readonly roots: React.CSSProperties;
|
|
45
|
+
readonly rootsLabel: React.CSSProperties;
|
|
46
|
+
readonly rootButton: React.CSSProperties;
|
|
47
|
+
readonly pathRow: React.CSSProperties;
|
|
48
|
+
readonly input: React.CSSProperties;
|
|
49
|
+
readonly button: React.CSSProperties;
|
|
50
|
+
readonly buttonOff: React.CSSProperties;
|
|
51
|
+
readonly list: React.CSSProperties;
|
|
52
|
+
readonly row: React.CSSProperties;
|
|
53
|
+
readonly rowSelected: React.CSSProperties;
|
|
54
|
+
readonly empty: React.CSSProperties;
|
|
55
|
+
readonly footNote: React.CSSProperties;
|
|
56
|
+
readonly foot: React.CSSProperties;
|
|
57
|
+
readonly target: React.CSSProperties;
|
|
58
|
+
readonly error: React.CSSProperties;
|
|
59
|
+
};
|
|
60
|
+
/** 面包屑:从文件系统根到当前层,每一格都是跳转目标(`listing.crumbs` 由取数方给)。 */
|
|
61
|
+
export declare function crumbRow(state: BrowseState, onEnter: (path: string) => void): React.ReactElement | null;
|
|
62
|
+
/** 可跳转的根那一行(Windows 上的盘符等)。**少于两个根就不画**:一个根没有「跳到别处」可言。 */
|
|
63
|
+
export declare function rootsRow(state: BrowseState, labels: DirectoryBrowserLabels, onEnter: (path: string) => void): React.ReactElement | null;
|
|
64
|
+
/** 一行子目录:点名字进它,点「选」把它当目标(「选」再点一次取消)。 */
|
|
65
|
+
export declare function entryRow(entry: DirectoryEntry, selected: boolean, labels: DirectoryBrowserLabels, onToggleSelect: (path: string) => void, onEnter: (path: string) => void): React.ReactElement;
|
|
66
|
+
/** 「新建文件夹」那一行(`creatingName === null` 时收起)。 */
|
|
67
|
+
export declare function createRow(labels: DirectoryBrowserLabels, onName: (name: string) => void, onCancel: () => void, onCreate: (name: string) => void, creatingName: string | null): React.ReactElement | null;
|
|
68
|
+
//# sourceMappingURL=directory-browser-parts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directory-browser-parts.d.ts","sourceRoot":"","sources":["../src/directory-browser-parts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/** 文件浏览器视图半的**零件**:样式表与四行控件(面包屑/根/一行子目录/新建行)。
|
|
2
|
+
*
|
|
3
|
+
* 为什么拆出来:整张对话框的组版与这些零件的变化频率不同——零件跟着「图上多一行/少一行」动,
|
|
4
|
+
* 组版跟着「对话框长什么样」动。拆开之后两边都在 350 行告警线内,而对外面不变
|
|
5
|
+
* (`directory-browser-ui.ts` 照旧转出组件与两个接线函数)。
|
|
6
|
+
*
|
|
7
|
+
* 本件与视图半同样**不认识宿主**:只认状态与文案。
|
|
8
|
+
*/
|
|
9
|
+
import * as React from 'react';
|
|
10
|
+
/** 根的类型说明(悬停可见):**本件自己的词汇**,与取数方无关。 */
|
|
11
|
+
const ROOT_KIND_TEXT = {
|
|
12
|
+
fixed: '固定磁盘',
|
|
13
|
+
network: '网络驱动器',
|
|
14
|
+
removable: '可移动磁盘',
|
|
15
|
+
optical: '光驱',
|
|
16
|
+
other: '磁盘',
|
|
17
|
+
};
|
|
18
|
+
export const S = {
|
|
19
|
+
scrim: {
|
|
20
|
+
position: 'fixed',
|
|
21
|
+
inset: 0,
|
|
22
|
+
background: 'rgba(0,0,0,0.35)',
|
|
23
|
+
display: 'flex',
|
|
24
|
+
alignItems: 'center',
|
|
25
|
+
justifyContent: 'center',
|
|
26
|
+
zIndex: 9999,
|
|
27
|
+
},
|
|
28
|
+
dialog: {
|
|
29
|
+
width: 680,
|
|
30
|
+
maxWidth: '92vw',
|
|
31
|
+
height: 500,
|
|
32
|
+
maxHeight: '86vh',
|
|
33
|
+
display: 'flex',
|
|
34
|
+
flexDirection: 'column',
|
|
35
|
+
background: 'var(--dsw-alias-bg-layer-1, #1f1f23)',
|
|
36
|
+
color: 'var(--dsw-alias-label-primary, inherit)',
|
|
37
|
+
border: '1px solid var(--dsw-alias-border-l2, rgba(128,128,128,0.35))',
|
|
38
|
+
borderRadius: 10,
|
|
39
|
+
boxShadow: '0 12px 32px rgba(0,0,0,0.35)',
|
|
40
|
+
overflow: 'hidden',
|
|
41
|
+
},
|
|
42
|
+
head: {
|
|
43
|
+
display: 'flex',
|
|
44
|
+
alignItems: 'center',
|
|
45
|
+
gap: 8,
|
|
46
|
+
padding: '10px 12px',
|
|
47
|
+
borderBottom: '1px solid var(--dsw-alias-border-l2, rgba(128,128,128,0.25))',
|
|
48
|
+
},
|
|
49
|
+
title: { fontSize: 14, fontWeight: 700 },
|
|
50
|
+
headTail: { marginLeft: 'auto', fontSize: 12, opacity: 0.72, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' },
|
|
51
|
+
crumbs: { display: 'flex', flexWrap: 'wrap', alignItems: 'center', gap: 2, padding: '8px 12px 0', fontSize: 12 },
|
|
52
|
+
chromeButton: {
|
|
53
|
+
background: 'transparent',
|
|
54
|
+
border: 'none',
|
|
55
|
+
color: 'var(--dsw-alias-label-primary, inherit)',
|
|
56
|
+
cursor: 'pointer',
|
|
57
|
+
padding: '2px 4px',
|
|
58
|
+
fontSize: 12,
|
|
59
|
+
opacity: 0.85,
|
|
60
|
+
},
|
|
61
|
+
crumbSep: { opacity: 0.45, fontSize: 12 },
|
|
62
|
+
roots: { display: 'flex', flexWrap: 'wrap', alignItems: 'center', gap: 6, padding: '0 12px 8px', fontSize: 12 },
|
|
63
|
+
rootsLabel: { opacity: 0.72, marginRight: 2 },
|
|
64
|
+
rootButton: {
|
|
65
|
+
border: '1px solid var(--dsw-alias-border-l2, rgba(128,128,128,0.35))',
|
|
66
|
+
borderRadius: 6,
|
|
67
|
+
padding: '3px 8px',
|
|
68
|
+
opacity: 1,
|
|
69
|
+
},
|
|
70
|
+
pathRow: { display: 'flex', gap: 6, padding: '8px 12px' },
|
|
71
|
+
input: {
|
|
72
|
+
flex: 1,
|
|
73
|
+
minWidth: 0,
|
|
74
|
+
fontSize: 12,
|
|
75
|
+
padding: '5px 8px',
|
|
76
|
+
background: 'var(--dsw-alias-bg-layer-2, rgba(128,128,128,0.12))',
|
|
77
|
+
color: 'inherit',
|
|
78
|
+
border: '1px solid var(--dsw-alias-border-l2, rgba(128,128,128,0.35))',
|
|
79
|
+
borderRadius: 6,
|
|
80
|
+
},
|
|
81
|
+
button: {
|
|
82
|
+
fontSize: 12,
|
|
83
|
+
padding: '5px 10px',
|
|
84
|
+
cursor: 'pointer',
|
|
85
|
+
background: 'var(--dsw-alias-bg-layer-2, rgba(128,128,128,0.12))',
|
|
86
|
+
color: 'inherit',
|
|
87
|
+
border: '1px solid var(--dsw-alias-border-l2, rgba(128,128,128,0.35))',
|
|
88
|
+
borderRadius: 6,
|
|
89
|
+
},
|
|
90
|
+
buttonOff: { opacity: 0.45, cursor: 'default' },
|
|
91
|
+
list: {
|
|
92
|
+
flex: 1,
|
|
93
|
+
minHeight: 0,
|
|
94
|
+
overflowY: 'auto',
|
|
95
|
+
margin: '0 12px',
|
|
96
|
+
border: '1px solid var(--dsw-alias-border-l2, rgba(128,128,128,0.25))',
|
|
97
|
+
borderRadius: 6,
|
|
98
|
+
},
|
|
99
|
+
row: {
|
|
100
|
+
display: 'flex',
|
|
101
|
+
alignItems: 'center',
|
|
102
|
+
gap: 8,
|
|
103
|
+
width: '100%',
|
|
104
|
+
padding: '6px 10px',
|
|
105
|
+
textAlign: 'left',
|
|
106
|
+
background: 'transparent',
|
|
107
|
+
color: 'inherit',
|
|
108
|
+
border: 'none',
|
|
109
|
+
borderBottom: '1px solid var(--dsw-alias-border-l2, rgba(128,128,128,0.12))',
|
|
110
|
+
cursor: 'pointer',
|
|
111
|
+
fontSize: 13,
|
|
112
|
+
},
|
|
113
|
+
rowSelected: { background: 'var(--dsw-alias-bg-layer-2, rgba(128,128,128,0.18))' },
|
|
114
|
+
empty: { padding: '14px 12px', fontSize: 12, opacity: 0.7 },
|
|
115
|
+
footNote: { padding: '6px 12px 0', fontSize: 12, minHeight: 20 },
|
|
116
|
+
foot: {
|
|
117
|
+
display: 'flex',
|
|
118
|
+
alignItems: 'center',
|
|
119
|
+
gap: 8,
|
|
120
|
+
padding: '10px 12px',
|
|
121
|
+
borderTop: '1px solid var(--dsw-alias-border-l2, rgba(128,128,128,0.25))',
|
|
122
|
+
},
|
|
123
|
+
target: { marginRight: 'auto', fontSize: 12, opacity: 0.8, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' },
|
|
124
|
+
error: { color: 'var(--dsw-alias-label-error, #e66)' },
|
|
125
|
+
};
|
|
126
|
+
/** 面包屑:从文件系统根到当前层,每一格都是跳转目标(`listing.crumbs` 由取数方给)。 */
|
|
127
|
+
export function crumbRow(state, onEnter) {
|
|
128
|
+
const listing = state.listing;
|
|
129
|
+
if (listing === null || listing.crumbs.length === 0)
|
|
130
|
+
return null;
|
|
131
|
+
const parts = [];
|
|
132
|
+
listing.crumbs.forEach((crumb, index) => {
|
|
133
|
+
if (index > 0)
|
|
134
|
+
parts.push(React.createElement('span', { key: 'sep-' + crumb.path, style: S.crumbSep }, '›'));
|
|
135
|
+
const isCurrent = crumb.path === listing.path;
|
|
136
|
+
parts.push(React.createElement('button', {
|
|
137
|
+
key: crumb.path,
|
|
138
|
+
type: 'button',
|
|
139
|
+
style: { ...S.chromeButton, fontWeight: isCurrent ? 700 : 400 },
|
|
140
|
+
title: crumb.path,
|
|
141
|
+
onClick: () => onEnter(crumb.path),
|
|
142
|
+
},
|
|
143
|
+
// 每一格都写**它自己那一层的名字**:第一格是文件系统根(`C:\`),不是「上一级」——
|
|
144
|
+
// 「上一级」是路径行那颗按钮的活(#744 返修:这一格原先串了那颗按钮的文案)。
|
|
145
|
+
crumb.name));
|
|
146
|
+
});
|
|
147
|
+
return React.createElement('div', { style: S.crumbs }, parts);
|
|
148
|
+
}
|
|
149
|
+
/** 可跳转的根那一行(Windows 上的盘符等)。**少于两个根就不画**:一个根没有「跳到别处」可言。 */
|
|
150
|
+
export function rootsRow(state, labels, onEnter) {
|
|
151
|
+
if (state.roots.length < 2)
|
|
152
|
+
return null;
|
|
153
|
+
const parts = [
|
|
154
|
+
React.createElement('span', { key: 'roots-label', style: S.rootsLabel }, labels.roots),
|
|
155
|
+
];
|
|
156
|
+
for (const root of state.roots) {
|
|
157
|
+
parts.push(React.createElement('button', {
|
|
158
|
+
key: root.path,
|
|
159
|
+
type: 'button',
|
|
160
|
+
style: { ...S.chromeButton, ...S.rootButton },
|
|
161
|
+
title: ROOT_KIND_TEXT[root.kind] ?? ROOT_KIND_TEXT.other,
|
|
162
|
+
onClick: () => onEnter(root.path),
|
|
163
|
+
}, root.path));
|
|
164
|
+
}
|
|
165
|
+
return React.createElement('div', { style: S.roots, role: 'group', 'aria-label': labels.roots }, parts);
|
|
166
|
+
}
|
|
167
|
+
/** 一行子目录:点名字进它,点「选」把它当目标(「选」再点一次取消)。 */
|
|
168
|
+
export function entryRow(entry, selected, labels, onToggleSelect, onEnter) {
|
|
169
|
+
return React.createElement('div', { key: entry.path, style: { ...S.row, padding: 0, ...(selected ? S.rowSelected : {}) } }, React.createElement('button', { type: 'button', style: { ...S.row, flex: 1, border: 'none' }, onClick: () => onEnter(entry.path) }, '📁 ' + entry.name), React.createElement('button', {
|
|
170
|
+
type: 'button',
|
|
171
|
+
style: { ...S.button, marginRight: 8, padding: '2px 8px' },
|
|
172
|
+
'aria-pressed': selected,
|
|
173
|
+
title: selected ? labels.selected : labels.select,
|
|
174
|
+
onClick: () => onToggleSelect(entry.path),
|
|
175
|
+
}, selected ? '✓' : labels.select));
|
|
176
|
+
}
|
|
177
|
+
/** 「新建文件夹」那一行(`creatingName === null` 时收起)。 */
|
|
178
|
+
export function createRow(labels, onName, onCancel, onCreate, creatingName) {
|
|
179
|
+
if (creatingName === null)
|
|
180
|
+
return null;
|
|
181
|
+
return React.createElement('div', { style: { ...S.pathRow, borderTop: '1px solid var(--dsw-alias-border-l2, rgba(128,128,128,0.25))' } }, React.createElement('input', {
|
|
182
|
+
style: S.input,
|
|
183
|
+
value: creatingName,
|
|
184
|
+
placeholder: labels.newFolder,
|
|
185
|
+
'aria-label': labels.newFolder,
|
|
186
|
+
onChange: (event) => onName(event.currentTarget.value),
|
|
187
|
+
onKeyDown: (event) => {
|
|
188
|
+
if (event.key === 'Enter')
|
|
189
|
+
onCreate(creatingName);
|
|
190
|
+
if (event.key === 'Escape')
|
|
191
|
+
onCancel();
|
|
192
|
+
},
|
|
193
|
+
}), React.createElement('button', { type: 'button', style: S.button, onClick: () => onCreate(creatingName) }, labels.createConfirm), React.createElement('button', { type: 'button', style: S.button, onClick: onCancel }, labels.createCancel));
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=directory-browser-parts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directory-browser-parts.js","sourceRoot":"","sources":["../src/directory-browser-parts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** 「本机根清单」的取数接线(客户端半):把一通电话变成图上那一行可跳转的根。
|
|
2
|
+
*
|
|
3
|
+
* **不认识宿主**:载体基段、通道名(第二段)、电话名全由调用方传进来——各家从自己的宿主镜像里拿
|
|
4
|
+
* 那几个字面量(和 `openRowBrowser` 的 `refusalCode` 同一条规矩)。本件只做两件事:
|
|
5
|
+
* 发一次调用、把回执信封拆成根清单;**任何失败都当空清单**(图上少画一行,不报错、不挡路)。
|
|
6
|
+
*/
|
|
7
|
+
import type { RootRow } from './directory-browser-contract.js';
|
|
8
|
+
/** 取数口:`connection.rpc.call` 的形状,每次现取(连接后到也不永久缺席)。 */
|
|
9
|
+
export type RootsCall = (base: string, endpoint: string, payload: unknown, signal?: AbortSignal) => Promise<unknown>;
|
|
10
|
+
/** 信封 → 根清单(纯函数,**永不抛**):`{ok:true, value:{roots:[…]}}` 之外的形状一律当空。 */
|
|
11
|
+
export declare function readRootsAnswer(raw: unknown): readonly RootRow[];
|
|
12
|
+
/** 建一个「根清单取数器」:给调用口与三个名字,回一个 `() => Promise<RootRow[]>`。
|
|
13
|
+
*
|
|
14
|
+
* 界面按需调它(开图一次),不在渲染里调,也不缓存到这里——缓存是宿主半的事。 */
|
|
15
|
+
export declare function createRootsSource(input: {
|
|
16
|
+
readonly getCall: () => unknown;
|
|
17
|
+
readonly base: string;
|
|
18
|
+
readonly endpoint: string;
|
|
19
|
+
readonly method: string;
|
|
20
|
+
}): () => Promise<readonly RootRow[]>;
|
|
21
|
+
//# sourceMappingURL=directory-browser-roots.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directory-browser-roots.d.ts","sourceRoot":"","sources":["../src/directory-browser-roots.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAY,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAEzE,sDAAsD;AACtD,MAAM,MAAM,SAAS,GAAG,CACtB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,EAChB,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,OAAO,CAAC,CAAC;AAStB,sEAAsE;AACtE,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS,OAAO,EAAE,CAMhE;AAED;;4CAE4C;AAC5C,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GAAG,MAAM,OAAO,CAAC,SAAS,OAAO,EAAE,CAAC,CAYpC"}
|