@tutti-os/workspace-file-reference 0.0.13 → 0.0.14

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.
@@ -1,3 +1,122 @@
1
+ /**
2
+ * Reference Source Services 契约。
3
+ *
4
+ * 设计见 docs/architecture/agent-reference-source-services.md。
5
+ * 把「+」文件引用弹窗从单一数据源升级为可插拔的多源服务层:
6
+ * 本地文件 / 应用内产物 / 任务中心产物,每个一个 ReferenceSourceService。
7
+ */
8
+ /**
9
+ * 不透明、源内作用域的节点句柄。
10
+ * picker 永不解析 nodeId —— 只整体持有、原样回传给所属源。
11
+ */
12
+ interface NodeRef {
13
+ /** "workspace-file" | "app-artifact" | "task-artifact" ... */
14
+ sourceId: string;
15
+ /** 源内不透明标识。本地源 = path;应用产物源 = 编码后的 app/group/file 句柄。 */
16
+ nodeId: string;
17
+ }
18
+ /** 统一树节点。identity = NodeRef。folder 可有子节点,file 不可。 */
19
+ interface ReferenceNode {
20
+ ref: NodeRef;
21
+ kind: "folder" | "file";
22
+ displayName: string;
23
+ /** folder 是否可下钻(懒加载箭头)。 */
24
+ hasChildren?: boolean;
25
+ /** 可选数量,如 app group 的 referenceCount。 */
26
+ childCount?: number | null;
27
+ /** 可选图标(data URL / 远程 URL),如应用产物源的 app 图标;有则替代默认文件夹图标。 */
28
+ iconUrl?: string | null;
29
+ sizeBytes?: number | null;
30
+ mtimeMs?: number | null;
31
+ mimeType?: string | null;
32
+ }
33
+ /** 所有源操作的上下文。 */
34
+ type ReferenceScope = WorkspaceFileReferenceScope;
35
+ interface ListChildrenInput {
36
+ /** null = 该源根层级。 */
37
+ node: NodeRef | null;
38
+ /** 续页游标;本地源恒不返回。 */
39
+ cursor?: string | null;
40
+ /** 当前层过滤(可选)。协议层只过滤直接子项,非递归。 */
41
+ filter?: string | null;
42
+ signal?: AbortSignal;
43
+ }
44
+ interface ListChildrenResult {
45
+ entries: ReferenceNode[];
46
+ /** null/undefined 表示无更多。 */
47
+ nextCursor?: string | null;
48
+ /**
49
+ * 源已自行排序、picker 不应再重排时置 true(如「最近访问」按访问时间倒序)。
50
+ * 缺省/false:picker 首屏按 folder 在前 + 名称排序。
51
+ */
52
+ ordered?: boolean;
53
+ }
54
+ interface SearchInput {
55
+ query: string;
56
+ cursor?: string | null;
57
+ limit?: number;
58
+ signal?: AbortSignal;
59
+ }
60
+ interface SearchResult {
61
+ entries: ReferenceNode[];
62
+ nextCursor?: string | null;
63
+ }
64
+ /** 预览内容(复用 workspace 预览结构)。 */
65
+ type ReferencePreview = WorkspaceFileReferencePreview;
66
+ /**
67
+ * 选中 → 插入 composer 的产物。
68
+ * 统一形态:所有源最终都归一为一个文件路径,与现有 picker 逐字段一致,
69
+ * composer / 序列化 / agent 侧零改动。
70
+ */
71
+ interface SelectedReference {
72
+ /** 应用产物 = daemon 解析的绝对路径;本地 = /workspace 逻辑路径。 */
73
+ path: string;
74
+ kind: "file" | "folder";
75
+ displayName?: string;
76
+ }
77
+ interface ReferenceSourceMetadata {
78
+ id: string;
79
+ label: string;
80
+ icon?: string;
81
+ /** 根层级排序,小者在前。 */
82
+ order: number;
83
+ }
84
+ interface ReferenceSourceCapabilities {
85
+ searchable: boolean;
86
+ previewable: boolean;
87
+ paginated: boolean;
88
+ /** 是否展示左侧分组导航(master-detail)。本地源 false;应用/任务源 true。 */
89
+ navigable?: boolean;
90
+ /** 是否展示文件类型筛选(网页/文档/图片…)。本地源 false;应用源 true。 */
91
+ typeFilterable?: boolean;
92
+ }
93
+ /**
94
+ * 单源契约。各源自治:取数 / open / preview 各自负责。
95
+ * 形状处理(kind 映射、排序去重、预览类型、cursor 累积、nodeKey 归一)走共享 base 工具。
96
+ */
97
+ interface ReferenceSourceService {
98
+ readonly metadata: ReferenceSourceMetadata;
99
+ readonly capabilities: ReferenceSourceCapabilities;
100
+ /** 动态可用性。如:无支持 references 的 app 时应用产物源返回 false。 */
101
+ isAvailable(scope: ReferenceScope): boolean | Promise<boolean>;
102
+ /**
103
+ * 可选:源自带的左栏二级分组(固定「位置」),返回顺序即展示顺序。
104
+ * 返回时 picker 直接用这些节点作为二级分组,不再从源根推导。
105
+ * 缺省:picker 取源根下的 folder 作为分组(navigable 源默认行为)。
106
+ */
107
+ listSidebarGroups?(scope: ReferenceScope): ReferenceNode[];
108
+ listChildren(scope: ReferenceScope, input: ListChildrenInput): Promise<ListChildrenResult>;
109
+ search?(scope: ReferenceScope, input: SearchInput): Promise<SearchResult>;
110
+ open?(scope: ReferenceScope, node: ReferenceNode): Promise<void>;
111
+ readPreview?(scope: ReferenceScope, node: ReferenceNode): Promise<ReferencePreview | null>;
112
+ /** 选中产物归一,见 SelectedReference。 */
113
+ resolveSelection(node: ReferenceNode): SelectedReference;
114
+ }
115
+ interface ReferenceSourceRegistry {
116
+ /** 已按 isAvailable 过滤、按 metadata.order 排序。 */
117
+ getSources(scope: ReferenceScope): Promise<ReferenceSourceService[]>;
118
+ }
119
+
1
120
  interface WorkspaceFileReference {
2
121
  displayName?: string;
3
122
  kind: "file" | "folder" | (string & {});
@@ -49,6 +168,10 @@ interface WorkspaceFileReferenceAdapter {
49
168
  listDirectory?(input: WorkspaceFileReferenceScope & {
50
169
  path?: string | null;
51
170
  }): Promise<WorkspaceFileReferenceDirectoryListing>;
171
+ listRecentReferences?(input: WorkspaceFileReferenceScope & {
172
+ limit?: number;
173
+ signal?: AbortSignal;
174
+ }): Promise<WorkspaceFileReference[]>;
52
175
  openReference?(reference: WorkspaceFileReference): Promise<void> | void;
53
176
  readReferencePreview?(input: WorkspaceFileReferenceScope & {
54
177
  reference: WorkspaceFileReference;
@@ -68,4 +191,4 @@ interface WorkspaceFileReferenceCopy {
68
191
  t(key: string, values?: Record<string, number | string>): string;
69
192
  }
70
193
 
71
- export type { WorkspaceFileReference, WorkspaceFileReferenceAdapter, WorkspaceFileReferenceCopy, WorkspaceFileReferenceDirectoryListing, WorkspaceFileReferencePrefetchReason, WorkspaceFileReferencePrefetchState, WorkspaceFileReferencePreview, WorkspaceFileReferencePreviewKind, WorkspaceFileReferenceScope, WorkspaceFileReferenceTreeDirectory, WorkspaceFileReferenceTreeEntry, WorkspaceFileReferenceTreeSnapshot };
194
+ export type { ListChildrenInput, ListChildrenResult, NodeRef, ReferenceNode, ReferencePreview, ReferenceScope, ReferenceSourceCapabilities, ReferenceSourceMetadata, ReferenceSourceRegistry, ReferenceSourceService, SearchInput, SearchResult, SelectedReference, WorkspaceFileReference, WorkspaceFileReferenceAdapter, WorkspaceFileReferenceCopy, WorkspaceFileReferenceDirectoryListing, WorkspaceFileReferencePrefetchReason, WorkspaceFileReferencePrefetchState, WorkspaceFileReferencePreview, WorkspaceFileReferencePreviewKind, WorkspaceFileReferenceScope, WorkspaceFileReferenceTreeDirectory, WorkspaceFileReferenceTreeEntry, WorkspaceFileReferenceTreeSnapshot };
@@ -1,5 +1,100 @@
1
- import { WorkspaceFileReference } from '../contracts/index.js';
1
+ import { ReferenceNode, NodeRef, SelectedReference, WorkspaceFileReference, ReferenceSourceCapabilities, ReferenceScope, WorkspaceFileReferenceAdapter, ReferenceSourceService } from '../contracts/index.js';
2
+ export { R as ReferenceSourceAggregator, a as ReferenceSourceTab, S as SOURCE_ROOT_NODE_ID, c as createReferenceSourceAggregator, b as createStaticReferenceSourceRegistry, i as isSourceRootNode } from '../referenceSourceAggregator-yyyLVOPi.js';
3
+
4
+ /**
5
+ * Reference Source Services 的共享 base 工具(形状处理,非取数)。
6
+ * 设计见 docs/architecture/agent-reference-source-services.md §1 / §2。
7
+ */
8
+ /**
9
+ * 「回到源根」哨兵 nodeId。源在 listSidebarGroups 里用它表示一个等价于源根的
10
+ * 二级分组(如本地源的「个人」= 用户 home 根);picker 选中它走 navigateToRoot
11
+ * 而非 ensureChildren,避免把哨兵当真实路径打后端。
12
+ */
13
+ declare const WORKSPACE_ROOT_GROUP_NODE_ID = "__workspace_root__";
14
+ /** 节点的全局 key,用于 picker 树状态索引与去重。picker 不解析其内部结构。 */
15
+ declare function nodeRefKey(ref: NodeRef): string;
16
+ declare function nodeKey(node: ReferenceNode): string;
17
+ /** 任意输入归一为 "file" | "folder"。 */
18
+ declare function normalizeReferenceNodeKind(kind: string | null | undefined): "file" | "folder";
19
+ /** folder 在前、同类按 displayName 本地化排序。 */
20
+ declare function sortReferenceNodes(nodes: readonly ReferenceNode[]): ReferenceNode[];
21
+ /** 按 node key 去重,保留首次出现。支持 cursor append 的稳定去重。 */
22
+ declare function dedupeReferenceNodes(nodes: readonly ReferenceNode[]): ReferenceNode[];
23
+ /** 续页累积:把新一页 append 到已有项后并去重(cursor 语义,不重排)。 */
24
+ declare function appendReferencePage(current: readonly ReferenceNode[], next: readonly ReferenceNode[]): ReferenceNode[];
25
+ /** SelectedReference 与现有 WorkspaceFileReference 形状兼容,便于下游零改动复用。 */
26
+ declare function selectedReferenceToWorkspaceFileReference(selected: SelectedReference): WorkspaceFileReference;
27
+
28
+ /**
29
+ * 统一的「引用列表协议」—— 与 app references 同一套 group/reference/parentGroupId/cursor 形状。
30
+ * 各源(应用 / issue / 任务…)各自实现一个 ReferenceListBackend 把自家数据映射成此协议;
31
+ * createReferenceListSource 把协议 item 映射成 ReferenceNode,各源前端逻辑完全复用。
32
+ * 设计见 docs/architecture/agent-reference-source-services.md。
33
+ */
34
+ interface ReferenceListGroup {
35
+ type: "group";
36
+ /** 不透明分组 id;作为下钻的 parentGroupId 原样回传。 */
37
+ id: string;
38
+ displayName: string;
39
+ referenceCount?: number | null;
40
+ /** 可选分组图标(data URL / 远程 URL),如应用产物源的 app 图标。 */
41
+ iconUrl?: string | null;
42
+ }
43
+ interface ReferenceListFile {
44
+ /** daemon/host 可解析的文件路径。 */
45
+ path: string;
46
+ displayName?: string | null;
47
+ sizeBytes?: number | null;
48
+ mtimeMs?: number | null;
49
+ mimeType?: string | null;
50
+ }
51
+ interface ReferenceListReference {
52
+ type: "reference";
53
+ reference: ReferenceListFile;
54
+ }
55
+ type ReferenceListItem = ReferenceListGroup | ReferenceListReference;
56
+ interface ReferenceListRequest {
57
+ /** null = 根层级。 */
58
+ parentGroupId: string | null;
59
+ cursor?: string | null;
60
+ filter?: string | null;
61
+ signal?: AbortSignal;
62
+ }
63
+ interface ReferenceListResult {
64
+ items: ReferenceListItem[];
65
+ nextCursor?: string | null;
66
+ }
67
+ /** 递归搜索请求(跨整源,非当前层 filter)。 */
68
+ interface ReferenceListSearchRequest {
69
+ query: string;
70
+ cursor?: string | null;
71
+ limit?: number;
72
+ signal?: AbortSignal;
73
+ }
74
+ /** 各源自治的取数适配器:把自家数据映射成统一协议。 */
75
+ interface ReferenceListBackend {
76
+ list(scope: ReferenceScope, request: ReferenceListRequest): Promise<ReferenceListResult>;
77
+ /**
78
+ * 可选:递归搜索。实现即代表该源支持全局搜索(对应 capabilities.searchable)。
79
+ * 返回 flat reference items(协议层不返回 group)。
80
+ */
81
+ search?(scope: ReferenceScope, request: ReferenceListSearchRequest): Promise<ReferenceListResult>;
82
+ }
83
+ interface CreateReferenceListSourceInput {
84
+ sourceId: string;
85
+ label: string;
86
+ order?: number;
87
+ capabilities: ReferenceSourceCapabilities;
88
+ isAvailable: (scope: ReferenceScope) => boolean | Promise<boolean>;
89
+ backend: ReferenceListBackend;
90
+ /** open/preview 复用 host 链路(协议返回的 path 可被解析打开)。 */
91
+ adapter: WorkspaceFileReferenceAdapter;
92
+ }
93
+ declare function createReferenceListSource(input: CreateReferenceListSourceInput): ReferenceSourceService;
94
+ /** UTF-8 安全的 base64url(浏览器/Node 通用)。 */
95
+ declare function base64UrlEncode(value: string): string;
96
+ declare function base64UrlDecode(value: string): string;
2
97
 
3
98
  declare function uniqueWorkspaceFileReferences(refs: readonly WorkspaceFileReference[]): WorkspaceFileReference[];
4
99
 
5
- export { uniqueWorkspaceFileReferences };
100
+ export { type CreateReferenceListSourceInput, type ReferenceListBackend, type ReferenceListFile, type ReferenceListGroup, type ReferenceListItem, type ReferenceListReference, type ReferenceListRequest, type ReferenceListResult, type ReferenceListSearchRequest, WORKSPACE_ROOT_GROUP_NODE_ID, appendReferencePage, base64UrlDecode, base64UrlEncode, createReferenceListSource, dedupeReferenceNodes, nodeKey, nodeRefKey, normalizeReferenceNodeKind, selectedReferenceToWorkspaceFileReference, sortReferenceNodes, uniqueWorkspaceFileReferences };
@@ -1,7 +1,37 @@
1
1
  import {
2
+ SOURCE_ROOT_NODE_ID,
3
+ WORKSPACE_ROOT_GROUP_NODE_ID,
4
+ appendReferencePage,
5
+ base64UrlDecode,
6
+ base64UrlEncode,
7
+ createReferenceListSource,
8
+ createReferenceSourceAggregator,
9
+ createStaticReferenceSourceRegistry,
10
+ dedupeReferenceNodes,
11
+ isSourceRootNode,
12
+ nodeKey,
13
+ nodeRefKey,
14
+ normalizeReferenceNodeKind,
15
+ selectedReferenceToWorkspaceFileReference,
16
+ sortReferenceNodes,
2
17
  uniqueWorkspaceFileReferences
3
- } from "../chunk-PAR2R2G5.js";
18
+ } from "../chunk-7C3RZYQE.js";
4
19
  export {
20
+ SOURCE_ROOT_NODE_ID,
21
+ WORKSPACE_ROOT_GROUP_NODE_ID,
22
+ appendReferencePage,
23
+ base64UrlDecode,
24
+ base64UrlEncode,
25
+ createReferenceListSource,
26
+ createReferenceSourceAggregator,
27
+ createStaticReferenceSourceRegistry,
28
+ dedupeReferenceNodes,
29
+ isSourceRootNode,
30
+ nodeKey,
31
+ nodeRefKey,
32
+ normalizeReferenceNodeKind,
33
+ selectedReferenceToWorkspaceFileReference,
34
+ sortReferenceNodes,
5
35
  uniqueWorkspaceFileReferences
6
36
  };
7
37
  //# sourceMappingURL=index.js.map
package/dist/index.d.ts CHANGED
@@ -1,2 +1,3 @@
1
- export { WorkspaceFileReference, WorkspaceFileReferenceAdapter, WorkspaceFileReferenceCopy, WorkspaceFileReferenceDirectoryListing, WorkspaceFileReferencePrefetchReason, WorkspaceFileReferencePrefetchState, WorkspaceFileReferencePreview, WorkspaceFileReferencePreviewKind, WorkspaceFileReferenceScope, WorkspaceFileReferenceTreeDirectory, WorkspaceFileReferenceTreeEntry, WorkspaceFileReferenceTreeSnapshot } from './contracts/index.js';
2
- export { uniqueWorkspaceFileReferences } from './core/index.js';
1
+ export { ListChildrenInput, ListChildrenResult, NodeRef, ReferenceNode, ReferencePreview, ReferenceScope, ReferenceSourceCapabilities, ReferenceSourceMetadata, ReferenceSourceRegistry, ReferenceSourceService, SearchInput, SearchResult, SelectedReference, WorkspaceFileReference, WorkspaceFileReferenceAdapter, WorkspaceFileReferenceCopy, WorkspaceFileReferenceDirectoryListing, WorkspaceFileReferencePrefetchReason, WorkspaceFileReferencePrefetchState, WorkspaceFileReferencePreview, WorkspaceFileReferencePreviewKind, WorkspaceFileReferenceScope, WorkspaceFileReferenceTreeDirectory, WorkspaceFileReferenceTreeEntry, WorkspaceFileReferenceTreeSnapshot } from './contracts/index.js';
2
+ export { CreateReferenceListSourceInput, ReferenceListBackend, ReferenceListFile, ReferenceListGroup, ReferenceListItem, ReferenceListReference, ReferenceListRequest, ReferenceListResult, ReferenceListSearchRequest, WORKSPACE_ROOT_GROUP_NODE_ID, appendReferencePage, base64UrlDecode, base64UrlEncode, createReferenceListSource, dedupeReferenceNodes, nodeKey, nodeRefKey, normalizeReferenceNodeKind, selectedReferenceToWorkspaceFileReference, sortReferenceNodes, uniqueWorkspaceFileReferences } from './core/index.js';
3
+ export { R as ReferenceSourceAggregator, a as ReferenceSourceTab, S as SOURCE_ROOT_NODE_ID, c as createReferenceSourceAggregator, b as createStaticReferenceSourceRegistry, i as isSourceRootNode } from './referenceSourceAggregator-yyyLVOPi.js';
package/dist/index.js CHANGED
@@ -1,7 +1,37 @@
1
1
  import {
2
+ SOURCE_ROOT_NODE_ID,
3
+ WORKSPACE_ROOT_GROUP_NODE_ID,
4
+ appendReferencePage,
5
+ base64UrlDecode,
6
+ base64UrlEncode,
7
+ createReferenceListSource,
8
+ createReferenceSourceAggregator,
9
+ createStaticReferenceSourceRegistry,
10
+ dedupeReferenceNodes,
11
+ isSourceRootNode,
12
+ nodeKey,
13
+ nodeRefKey,
14
+ normalizeReferenceNodeKind,
15
+ selectedReferenceToWorkspaceFileReference,
16
+ sortReferenceNodes,
2
17
  uniqueWorkspaceFileReferences
3
- } from "./chunk-PAR2R2G5.js";
18
+ } from "./chunk-7C3RZYQE.js";
4
19
  export {
20
+ SOURCE_ROOT_NODE_ID,
21
+ WORKSPACE_ROOT_GROUP_NODE_ID,
22
+ appendReferencePage,
23
+ base64UrlDecode,
24
+ base64UrlEncode,
25
+ createReferenceListSource,
26
+ createReferenceSourceAggregator,
27
+ createStaticReferenceSourceRegistry,
28
+ dedupeReferenceNodes,
29
+ isSourceRootNode,
30
+ nodeKey,
31
+ nodeRefKey,
32
+ normalizeReferenceNodeKind,
33
+ selectedReferenceToWorkspaceFileReference,
34
+ sortReferenceNodes,
5
35
  uniqueWorkspaceFileReferences
6
36
  };
7
37
  //# sourceMappingURL=index.js.map
@@ -1,6 +1,7 @@
1
- import { WorkspaceFileReference, WorkspaceFileReferencePrefetchReason, WorkspaceFileReferencePrefetchState, WorkspaceFileReferenceTreeSnapshot, WorkspaceFileReferenceAdapter } from '../contracts/index.js';
1
+ import { WorkspaceFileReference, WorkspaceFileReferencePrefetchReason, WorkspaceFileReferencePrefetchState, WorkspaceFileReferenceTreeSnapshot, WorkspaceFileReferenceAdapter, ReferenceScope, ReferenceNode, SelectedReference } from '../contracts/index.js';
2
2
  import * as react from 'react';
3
3
  import { WorkspaceFilePreviewReadonlyReason } from '@tutti-os/workspace-file-preview';
4
+ import { R as ReferenceSourceAggregator, a as ReferenceSourceTab } from '../referenceSourceAggregator-yyyLVOPi.js';
4
5
 
5
6
  declare const workspaceFileReferenceDefaultExpandedDepth = 4;
6
7
  interface WorkspaceFileReferenceDirectoryState {
@@ -89,4 +90,76 @@ declare function useWorkspaceFileReferencePickerView({ fileAdapter, initialPath,
89
90
  toggleRef: (ref: WorkspaceFileReference) => void;
90
91
  };
91
92
 
92
- export { type UseWorkspaceFileReferencePickerViewInput, type WorkspaceFileReferenceDirectoryState, type WorkspaceFileReferencePreviewState, collectVisibleTreeEntries, createWorkspaceFileReferenceDirectoryStateFromSnapshot, mergeExpandedFolderPaths, mergePrefetchedDirectoryState, normalizeDirectoryPath, prefetchReferenceTree, useWorkspaceFileReferencePickerView, workspaceFileReferenceDefaultExpandedDepth };
93
+ /**
94
+ * node-keyed 多源 picker 的逻辑层 controller(顶部分源 tab)。
95
+ * 独立于现有 WorkspaceFileReferencePickerController —— issue-manager 不受影响。
96
+ * 设计见 docs/architecture/agent-reference-source-services.md §2 / §3。
97
+ *
98
+ * 本层只管:tabs、per-source inline 展开树(node-keyed)、cursor 加载更多、
99
+ * per-tab 搜索、跨 tab 选中集、confirm。预览/打开留待 UI 接入步骤。
100
+ */
101
+ type ReferenceSourcePickerMode = "browse" | "search";
102
+ interface ReferenceSourceNodeChildrenState {
103
+ /** 已累积的子节点(含多页 append)。 */
104
+ entries: ReferenceNode[];
105
+ nextCursor: string | null;
106
+ loaded: boolean;
107
+ loading: boolean;
108
+ error: Error | null;
109
+ }
110
+ interface ReferenceSourceTabState {
111
+ sourceId: string;
112
+ expandedKeys: Record<string, boolean>;
113
+ /** key = nodeRefKey;源根用 ROOT_CHILDREN_KEY。 */
114
+ childrenByKey: Record<string, ReferenceSourceNodeChildrenState>;
115
+ mode: ReferenceSourcePickerMode;
116
+ searchQuery: string;
117
+ searchEntries: ReferenceNode[];
118
+ searchNextCursor: string | null;
119
+ isSearchLoading: boolean;
120
+ searchError: Error | null;
121
+ }
122
+ interface ReferenceSourcePickerSnapshot {
123
+ isLoadingTabs: boolean;
124
+ tabsError: Error | null;
125
+ tabs: ReferenceSourceTab[];
126
+ activeSourceId: string | null;
127
+ bySource: Record<string, ReferenceSourceTabState>;
128
+ /** 跨 tab 累积的选中文件节点,按选中顺序。 */
129
+ selection: ReferenceNode[];
130
+ }
131
+ interface ReferenceSourcePickerController {
132
+ readonly store: ReferenceSourcePickerSnapshot;
133
+ getSnapshot(): ReferenceSourcePickerSnapshot;
134
+ open(): void;
135
+ close(): void;
136
+ reset(): void;
137
+ setActiveSource(sourceId: string): void;
138
+ /** 确保某节点(null=当前源根)的子节点已加载(抽屉式导航进入用,不切换展开态)。 */
139
+ ensureChildren(node: ReferenceNode | null): void;
140
+ /** 确保指定源的根层级已加载(左栏可同时展开多源时,为非 active 源预载分组)。 */
141
+ ensureSourceRoot(sourceId: string): void;
142
+ toggleNode(node: ReferenceNode): void;
143
+ loadMore(node: ReferenceNode | null): void;
144
+ setSearchQuery(query: string): void;
145
+ toggleSelection(node: ReferenceNode): void;
146
+ clearSelection(): void;
147
+ /**
148
+ * 选中归一。文件 → 单条;文件夹按所属源区分:
149
+ * - 本地(非 navigable)源:保持单条 folder 引用(filesystem 路径与目录一一对应);
150
+ * - app/issue(navigable)源:其文件夹下文件在 filesystem 里不一定落在该目录路径下,
151
+ * 故递归 listChildren 枚举,展开成多条文件引用。
152
+ * 含异步枚举,故返回 Promise;结果按 path 去重、保序。
153
+ */
154
+ confirm(): Promise<SelectedReference[]>;
155
+ }
156
+ interface CreateReferenceSourcePickerControllerInput {
157
+ aggregator: ReferenceSourceAggregator;
158
+ scope: ReferenceScope;
159
+ searchDebounceMs?: number;
160
+ }
161
+ /** 源根 children 的 key(node===null 时)。 */
162
+ declare const ROOT_CHILDREN_KEY: string;
163
+ declare function createReferenceSourcePickerController(input: CreateReferenceSourcePickerControllerInput): ReferenceSourcePickerController;
164
+
165
+ export { type CreateReferenceSourcePickerControllerInput, ROOT_CHILDREN_KEY, type ReferenceSourceNodeChildrenState, type ReferenceSourcePickerController, type ReferenceSourcePickerMode, type ReferenceSourcePickerSnapshot, type ReferenceSourceTabState, type UseWorkspaceFileReferencePickerViewInput, type WorkspaceFileReferenceDirectoryState, type WorkspaceFileReferencePreviewState, collectVisibleTreeEntries, createReferenceSourcePickerController, createWorkspaceFileReferenceDirectoryStateFromSnapshot, mergeExpandedFolderPaths, mergePrefetchedDirectoryState, normalizeDirectoryPath, prefetchReferenceTree, useWorkspaceFileReferencePickerView, workspaceFileReferenceDefaultExpandedDepth };
@@ -1,5 +1,7 @@
1
1
  import {
2
+ ROOT_CHILDREN_KEY,
2
3
  collectVisibleTreeEntries,
4
+ createReferenceSourcePickerController,
3
5
  createWorkspaceFileReferenceDirectoryStateFromSnapshot,
4
6
  mergeExpandedFolderPaths,
5
7
  mergePrefetchedDirectoryState,
@@ -7,10 +9,12 @@ import {
7
9
  prefetchReferenceTree,
8
10
  useWorkspaceFileReferencePickerView,
9
11
  workspaceFileReferenceDefaultExpandedDepth
10
- } from "../chunk-LS7P3J6Z.js";
11
- import "../chunk-PAR2R2G5.js";
12
+ } from "../chunk-CD3YNHYJ.js";
13
+ import "../chunk-7C3RZYQE.js";
12
14
  export {
15
+ ROOT_CHILDREN_KEY,
13
16
  collectVisibleTreeEntries,
17
+ createReferenceSourcePickerController,
14
18
  createWorkspaceFileReferenceDirectoryStateFromSnapshot,
15
19
  mergeExpandedFolderPaths,
16
20
  mergePrefetchedDirectoryState,
@@ -0,0 +1,42 @@
1
+ import { ReferenceScope, ReferenceSourceService, ReferenceNode, NodeRef, ListChildrenResult, SearchInput, SearchResult, ReferencePreview, SelectedReference, ReferenceSourceRegistry } from './contracts/index.js';
2
+
3
+ /**
4
+ * 多源聚合器:根层级 = 每个可用源一个 folder 节点;其余按 node.ref.sourceId 委派。
5
+ * 设计见 docs/architecture/agent-reference-source-services.md §3 / §4.4。
6
+ */
7
+ /**
8
+ * 源根节点的 nodeId 哨兵。由聚合器创建源根节点时使用;
9
+ * 任何真实源都不会产出 nodeId 等于此值的子节点(workspace 源 nodeId 是路径,
10
+ * app 源 nodeId 以 "app:" 开头),因此路由无歧义。
11
+ */
12
+ declare const SOURCE_ROOT_NODE_ID = "\0source-root";
13
+ /** 顶部 tab 的描述(source 身份 + 能力)。 */
14
+ interface ReferenceSourceTab {
15
+ sourceId: string;
16
+ label: string;
17
+ icon?: string;
18
+ capabilities: ReferenceSourceService["capabilities"];
19
+ }
20
+ interface ReferenceSourceAggregator {
21
+ /** 顶部 tab 列表:每个可用源一个 tab(已过滤 isAvailable、按 order 排序)。 */
22
+ listSources(scope: ReferenceScope): Promise<ReferenceSourceTab[]>;
23
+ /** (备用,单树多根形态)根层级:每个可用源一个 folder 节点。 */
24
+ listRoot(scope: ReferenceScope): Promise<ReferenceNode[]>;
25
+ listChildren(scope: ReferenceScope, node: NodeRef, input?: {
26
+ cursor?: string | null;
27
+ filter?: string | null;
28
+ signal?: AbortSignal;
29
+ }): Promise<ListChildrenResult>;
30
+ search(scope: ReferenceScope, sourceId: string, input: SearchInput): Promise<SearchResult>;
31
+ open(scope: ReferenceScope, node: ReferenceNode): Promise<void>;
32
+ readPreview(scope: ReferenceScope, node: ReferenceNode): Promise<ReferencePreview | null>;
33
+ resolveSelection(node: ReferenceNode): SelectedReference;
34
+ /** 取已加载的源(用于读取 capabilities/metadata)。需先 listRoot 触发加载。 */
35
+ getLoadedSource(sourceId: string): ReferenceSourceService | undefined;
36
+ }
37
+ declare function isSourceRootNode(ref: NodeRef): boolean;
38
+ declare function createReferenceSourceAggregator(registry: ReferenceSourceRegistry): ReferenceSourceAggregator;
39
+ /** 静态 registry:持有一组源,按 isAvailable 过滤、按 order 排序。 */
40
+ declare function createStaticReferenceSourceRegistry(sources: readonly ReferenceSourceService[]): ReferenceSourceRegistry;
41
+
42
+ export { type ReferenceSourceAggregator as R, SOURCE_ROOT_NODE_ID as S, type ReferenceSourceTab as a, createStaticReferenceSourceRegistry as b, createReferenceSourceAggregator as c, isSourceRootNode as i };
@@ -1,5 +1,7 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { WorkspaceFileReferenceCopy, WorkspaceFileReferenceAdapter, WorkspaceFileReference } from '../contracts/index.js';
3
+ import { JSX } from 'react';
4
+ import { R as ReferenceSourceAggregator } from '../referenceSourceAggregator-yyyLVOPi.js';
3
5
 
4
6
  interface WorkspaceFileReferencePickerProps {
5
7
  copy: WorkspaceFileReferenceCopy;
@@ -12,4 +14,14 @@ interface WorkspaceFileReferencePickerProps {
12
14
  }
13
15
  declare function WorkspaceFileReferencePicker({ copy, fileAdapter, initialPath, onClose, onConfirm, open, workspaceId }: WorkspaceFileReferencePickerProps): react_jsx_runtime.JSX.Element | null;
14
16
 
15
- export { WorkspaceFileReferencePicker, type WorkspaceFileReferencePickerProps };
17
+ interface ReferenceSourcePickerProps {
18
+ aggregator: ReferenceSourceAggregator;
19
+ copy: WorkspaceFileReferenceCopy;
20
+ onClose: () => void;
21
+ onConfirm: (refs: WorkspaceFileReference[]) => void;
22
+ open: boolean;
23
+ workspaceId: string;
24
+ }
25
+ declare function ReferenceSourcePicker({ aggregator, copy, onClose, onConfirm, open, workspaceId }: ReferenceSourcePickerProps): JSX.Element | null;
26
+
27
+ export { ReferenceSourcePicker, type ReferenceSourcePickerProps, WorkspaceFileReferencePicker, type WorkspaceFileReferencePickerProps };