@lemoncat7/dsh-knowledge 2.3.1 → 2.3.3

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 (56) hide show
  1. package/README.md +4 -3
  2. package/docs/architecture.md +1 -1
  3. package/lib/activity-control.d.ts +6 -0
  4. package/lib/activity-control.d.ts.map +1 -0
  5. package/lib/activity-control.js +118 -0
  6. package/lib/activity-control.js.map +1 -0
  7. package/lib/api.d.ts +2 -0
  8. package/lib/api.d.ts.map +1 -1
  9. package/lib/api.js +2 -2
  10. package/lib/api.js.map +1 -1
  11. package/lib/client.d.ts +17 -0
  12. package/lib/client.d.ts.map +1 -1
  13. package/lib/client.js +3825 -142
  14. package/lib/client.js.map +4 -4
  15. package/lib/config.d.ts +2 -0
  16. package/lib/config.d.ts.map +1 -1
  17. package/lib/config.js +26 -0
  18. package/lib/config.js.map +1 -1
  19. package/lib/index.d.ts.map +1 -1
  20. package/lib/index.js +18 -1
  21. package/lib/index.js.map +1 -1
  22. package/lib/knowledge-activity-api.d.ts +35 -0
  23. package/lib/knowledge-activity-api.d.ts.map +1 -0
  24. package/lib/knowledge-activity-api.js +115 -0
  25. package/lib/knowledge-activity-api.js.map +1 -0
  26. package/lib/knowledge-activity-controller.d.ts +25 -0
  27. package/lib/knowledge-activity-controller.d.ts.map +1 -0
  28. package/lib/knowledge-activity-controller.js +126 -0
  29. package/lib/knowledge-activity-controller.js.map +1 -0
  30. package/lib/knowledge-activity-notes.d.ts +9 -0
  31. package/lib/knowledge-activity-notes.d.ts.map +1 -0
  32. package/lib/knowledge-activity-notes.js +141 -0
  33. package/lib/knowledge-activity-notes.js.map +1 -0
  34. package/lib/knowledge-activity-panel.d.ts +8 -0
  35. package/lib/knowledge-activity-panel.d.ts.map +1 -0
  36. package/lib/knowledge-activity-panel.js +233 -0
  37. package/lib/knowledge-activity-panel.js.map +1 -0
  38. package/lib/notes/share-import.d.ts +16 -2
  39. package/lib/notes/share-import.d.ts.map +1 -1
  40. package/lib/notes/share-import.js +32 -13
  41. package/lib/notes/share-import.js.map +1 -1
  42. package/lib/notes/share-markdown.d.ts +12 -0
  43. package/lib/notes/share-markdown.d.ts.map +1 -0
  44. package/lib/notes/share-markdown.js +79 -0
  45. package/lib/notes/share-markdown.js.map +1 -0
  46. package/lib/notes/share-page.d.ts.map +1 -1
  47. package/lib/notes/share-page.js +116 -21
  48. package/lib/notes/share-page.js.map +1 -1
  49. package/lib/web-note-editor-outline.js +2 -2
  50. package/lib/web-note-editor-outline.js.map +1 -1
  51. package/lib/web-note-editor-selection.js +1 -1
  52. package/lib/web-note-editor-selection.js.map +1 -1
  53. package/package.json +5 -2
  54. package/web/app.js +33 -15
  55. package/web/note-editor.js +1 -1
  56. package/web/styles.css +69 -18
@@ -0,0 +1,141 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useMemo, useState } from 'react';
3
+ import { IconChevronLeftOutline14, IconChevronRightOutline14, IconCloseOutline16, IconDataOutline16, IconFolderOpenOutline16, IconRefreshOutline14, IconSearchOutline16, } from '@deepseek-ai/dsh-client-ui-primitives';
4
+ import { loadNoteContent, loadNoteIndex } from './knowledge-activity-api.js';
5
+ import { renderMarkdown } from './web-markdown-preview.js';
6
+ export function KnowledgeActivityNotes({ sessionId, projectId, controller }) {
7
+ const initial = controller.selection(sessionId);
8
+ const [folderId, setFolderId] = useState(initial.noteFolderId ?? null);
9
+ const [crumbs, setCrumbs] = useState([{ id: null, name: '全部笔记' }]);
10
+ const [selectedId, setSelectedId] = useState(initial.noteDocumentId);
11
+ const [nodes, setNodes] = useState([]);
12
+ const [content, setContent] = useState();
13
+ const [queryInput, setQueryInput] = useState('');
14
+ const [query, setQuery] = useState('');
15
+ const [listState, setListState] = useState('loading');
16
+ const [contentState, setContentState] = useState('idle');
17
+ const [error, setError] = useState('');
18
+ const [refresh, setRefresh] = useState(0);
19
+ const loadNodes = useCallback(async (signal) => {
20
+ setListState('loading');
21
+ setError('');
22
+ try {
23
+ const value = await loadNoteIndex({
24
+ sessionId,
25
+ ...projectId === undefined ? {} : { projectId },
26
+ parentId: folderId,
27
+ query,
28
+ ...signal === undefined ? {} : { signal },
29
+ });
30
+ setNodes(value);
31
+ setListState('ready');
32
+ }
33
+ catch (reason) {
34
+ if (signal?.aborted)
35
+ return;
36
+ setListState('error');
37
+ setError(message(reason));
38
+ }
39
+ }, [folderId, projectId, query, sessionId]);
40
+ useEffect(() => {
41
+ const abort = new AbortController();
42
+ void loadNodes(abort.signal);
43
+ return () => { abort.abort(); };
44
+ }, [loadNodes, refresh]);
45
+ useEffect(() => {
46
+ if (selectedId === undefined) {
47
+ setContent(undefined);
48
+ setContentState('idle');
49
+ return;
50
+ }
51
+ const abort = new AbortController();
52
+ setContentState('loading');
53
+ setError('');
54
+ void loadNoteContent({
55
+ id: selectedId,
56
+ sessionId,
57
+ ...projectId === undefined ? {} : { projectId },
58
+ signal: abort.signal,
59
+ }).then(value => {
60
+ setContent(value);
61
+ setContentState('ready');
62
+ }).catch(reason => {
63
+ if (abort.signal.aborted)
64
+ return;
65
+ setContentState('error');
66
+ setError(message(reason));
67
+ });
68
+ return () => { abort.abort(); };
69
+ }, [projectId, refresh, selectedId, sessionId]);
70
+ const openFolder = (node) => {
71
+ setFolderId(node.id);
72
+ setCrumbs(current => [...current, { id: node.id, name: node.name }]);
73
+ setQuery('');
74
+ setQueryInput('');
75
+ controller.select(sessionId, { ...controller.selection(sessionId), mode: 'notes', noteFolderId: node.id, noteDocumentId: undefined });
76
+ };
77
+ const openCrumb = (crumb, index) => {
78
+ setFolderId(crumb.id);
79
+ setCrumbs(current => current.slice(0, index + 1));
80
+ setSelectedId(undefined);
81
+ controller.select(sessionId, { ...controller.selection(sessionId), mode: 'notes', noteFolderId: crumb.id, noteDocumentId: undefined });
82
+ };
83
+ const openNode = (node) => {
84
+ if (node.kind === 'folder')
85
+ return openFolder(node);
86
+ if (!node.editable)
87
+ return;
88
+ setSelectedId(node.id);
89
+ controller.select(sessionId, { ...controller.selection(sessionId), mode: 'notes', noteFolderId: folderId, noteDocumentId: node.id });
90
+ };
91
+ const closeDocument = () => {
92
+ setSelectedId(undefined);
93
+ setContent(undefined);
94
+ controller.select(sessionId, { ...controller.selection(sessionId), mode: 'notes', noteFolderId: folderId, noteDocumentId: undefined });
95
+ };
96
+ const submitSearch = (event) => {
97
+ event.preventDefault();
98
+ setSelectedId(undefined);
99
+ setContent(undefined);
100
+ setQuery(queryInput.trim());
101
+ };
102
+ if (selectedId !== undefined)
103
+ return _jsx(NoteReader, { value: content, state: contentState, error: error, onBack: closeDocument, onRetry: () => setRefresh(value => value + 1) });
104
+ return _jsxs("div", { className: "dsh-knowledge-activity-browser", children: [_jsxs("form", { className: "dsh-knowledge-activity-search", role: "search", onSubmit: submitSearch, children: [_jsx(IconSearchOutline16, { size: 16, "aria-hidden": "true" }), _jsx("input", { "aria-label": "\u641C\u7D22\u7B14\u8BB0\u6587\u6863", value: queryInput, placeholder: "\u641C\u7D22\u7B14\u8BB0\u548C\u76EE\u5F55\u2026", onChange: event => setQueryInput(event.target.value) }), queryInput && _jsx("button", { type: "button", onClick: () => { setQueryInput(''); setQuery(''); }, "aria-label": "\u6E05\u9664\u641C\u7D22", children: _jsx(IconCloseOutline16, { size: 14 }) })] }), !query && _jsx("nav", { className: "dsh-knowledge-activity-breadcrumbs", "aria-label": "\u7B14\u8BB0\u76EE\u5F55\u8DEF\u5F84", children: crumbs.map((crumb, index) => _jsxs("span", { children: [index > 0 && _jsx(IconChevronRightOutline14, { size: 12 }), _jsx("button", { type: "button", "aria-current": index === crumbs.length - 1 ? 'location' : undefined, onClick: () => openCrumb(crumb, index), children: crumb.name })] }, `${crumb.id ?? 'root'}-${index}`)) }), _jsxs("div", { className: "dsh-knowledge-activity-list-heading", children: [_jsxs("span", { children: [_jsx("strong", { children: query ? `“${query}” 的结果` : crumbs.at(-1)?.name ?? '笔记文档' }), _jsx("small", { children: query ? '搜索全部笔记' : `当前显示 ${nodes.length} 项` })] }), _jsx("button", { type: "button", className: "dsh-knowledge-activity-icon-button", "aria-label": "\u5237\u65B0\u7B14\u8BB0", title: "\u5237\u65B0", onClick: () => setRefresh(value => value + 1), children: _jsx(IconRefreshOutline14, { size: 14 }) })] }), _jsx("div", { className: "dsh-knowledge-activity-list", "aria-busy": listState === 'loading', children: listState === 'loading' && nodes.length === 0 ? _jsx(ActivityState, { label: "\u6B63\u5728\u8BFB\u53D6\u7B14\u8BB0\u2026" })
105
+ : listState === 'error' ? _jsx(ActivityError, { error: error, onRetry: () => setRefresh(value => value + 1) })
106
+ : nodes.length === 0 ? _jsx(ActivityEmpty, { query: query })
107
+ : nodes.map(node => _jsxs("button", { type: "button", className: "dsh-knowledge-activity-row", disabled: node.kind !== 'folder' && !node.editable, onClick: () => openNode(node), children: [_jsx("span", { className: "dsh-knowledge-activity-row-icon", children: node.kind === 'folder' ? _jsx(IconFolderOpenOutline16, { size: 16 }) : _jsx(IconDataOutline16, { size: 16 }) }), _jsxs("span", { className: "dsh-knowledge-activity-row-copy", children: [_jsx("strong", { children: node.name }), _jsx("small", { children: node.kind === 'folder' ? '目录' : node.editable ? formatSize(node.size) : '暂不支持侧栏预览' })] }), _jsxs("span", { className: "dsh-knowledge-activity-row-meta", children: [_jsx("time", { dateTime: node.updatedAt, children: formatDate(node.updatedAt) }), node.kind === 'folder' && _jsx(IconChevronRightOutline14, { size: 13 })] })] }, node.id)) })] });
108
+ }
109
+ function NoteReader({ value, state, error, onBack, onRetry }) {
110
+ const html = useMemo(() => value === undefined ? '' : renderMarkdown(value.content), [value]);
111
+ return _jsxs("div", { className: "dsh-knowledge-activity-reader", children: [_jsxs("div", { className: "dsh-knowledge-activity-reader-bar", children: [_jsxs("button", { type: "button", className: "dsh-knowledge-activity-back", onClick: onBack, children: [_jsx(IconChevronLeftOutline14, { size: 14 }), "\u7B14\u8BB0\u76EE\u5F55"] }), value && _jsxs("span", { children: [formatDate(value.node.updatedAt), " \u66F4\u65B0"] })] }), state === 'loading' ? _jsx(ActivityState, { label: "\u6B63\u5728\u6253\u5F00\u7B14\u8BB0\u2026" })
112
+ : state === 'error' ? _jsx(ActivityError, { error: error, onRetry: onRetry })
113
+ : value === undefined ? _jsx(ActivityState, { label: "\u6B63\u5728\u51C6\u5907\u7B14\u8BB0\u2026" })
114
+ : _jsxs(_Fragment, { children: [_jsxs("div", { className: "dsh-knowledge-activity-document-heading", children: [_jsx("span", { className: "dsh-knowledge-activity-document-icon", children: _jsx(IconDataOutline16, { size: 18 }) }), _jsxs("div", { children: [_jsx("h2", { children: value.node.name }), _jsxs("p", { children: ["\u7B14\u8BB0\u6587\u6863 \u00B7 ", formatSize(value.node.size)] })] })] }), _jsx("article", { className: "dsh-knowledge-activity-markdown", dangerouslySetInnerHTML: { __html: html } })] })] });
115
+ }
116
+ function ActivityState({ label }) {
117
+ return _jsxs("p", { className: "dsh-knowledge-activity-state", role: "status", children: [_jsx("span", { "aria-hidden": "true" }), label] });
118
+ }
119
+ function ActivityError({ error, onRetry }) {
120
+ return _jsxs("div", { className: "dsh-knowledge-activity-error", role: "alert", children: [_jsx("strong", { children: "\u6682\u65F6\u65E0\u6CD5\u8BFB\u53D6" }), _jsx("p", { children: error }), _jsx("button", { type: "button", onClick: onRetry, children: "\u91CD\u8BD5" })] });
121
+ }
122
+ function ActivityEmpty({ query }) {
123
+ return _jsxs("div", { className: "dsh-knowledge-activity-empty", children: [_jsx("span", { children: _jsx(IconDataOutline16, { size: 20 }) }), _jsx("strong", { children: query ? '没有找到相关笔记' : '这个目录还是空的' }), _jsx("p", { children: query ? '换个关键词,或清除搜索后浏览目录。' : '可以在完整工作区中新建或导入笔记。' })] });
124
+ }
125
+ function formatDate(value) {
126
+ const date = new Date(value);
127
+ if (Number.isNaN(date.getTime()))
128
+ return '未知时间';
129
+ return new Intl.DateTimeFormat('zh-CN', { month: '2-digit', day: '2-digit' }).format(date);
130
+ }
131
+ function formatSize(value) {
132
+ if (value < 1024)
133
+ return `${value} B`;
134
+ if (value < 1024 * 1024)
135
+ return `${(value / 1024).toFixed(value < 10 * 1024 ? 1 : 0)} KB`;
136
+ return `${(value / 1024 / 1024).toFixed(1)} MB`;
137
+ }
138
+ function message(reason) {
139
+ return reason instanceof Error ? reason.message : String(reason);
140
+ }
141
+ //# sourceMappingURL=knowledge-activity-notes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-activity-notes.js","sourceRoot":"","sources":["../src/knowledge-activity-notes.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
2
+ import type { KnowledgeActivityController } from './knowledge-activity-controller.js';
3
+ type DetailsProps = PropsRuntime<'details'>;
4
+ export declare function KnowledgeActivityPanel(props: DetailsProps & {
5
+ controller: KnowledgeActivityController;
6
+ }): JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=knowledge-activity-panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-activity-panel.d.ts","sourceRoot":"","sources":["../src/knowledge-activity-panel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AAiBpE,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAA;AAIrF,KAAK,YAAY,GAAG,YAAY,CAAC,SAAS,CAAC,CAAA;AAE3C,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,YAAY,GAAG;IAAE,UAAU,EAAE,2BAA2B,CAAA;CAAE,GAChE,GAAG,CAAC,OAAO,CA+Pb"}
@@ -0,0 +1,233 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
+ import { IconChevronLeftOutline14, IconChevronDownOutline14, IconCloseOutline16, IconDatabaseOutline16, IconDataOutline16, IconRefreshOutline14, IconSearchOutline16, IconFullscreenOutline16, } from '@deepseek-ai/dsh-client-ui-primitives';
4
+ import { loadKnowledgeDocument, loadKnowledgeDocumentIndex, loadMountedKnowledge, } from './knowledge-activity-api.js';
5
+ import { KnowledgeActivityNotes } from './knowledge-activity-notes.js';
6
+ import { renderMarkdown } from './web-markdown-preview.js';
7
+ export function KnowledgeActivityPanel(props) {
8
+ const sessionId = String(props.sessionId);
9
+ const projectId = props.useSessions((state) => state.byId[sessionId]?.cwd);
10
+ const initial = props.controller.selection(sessionId);
11
+ const [mode, setMode] = useState(initial.mode ?? 'knowledge');
12
+ const [mounts, setMounts] = useState([]);
13
+ const [selectedBaseId, setSelectedBaseId] = useState(initial.knowledgeBaseId);
14
+ const [selectedDocumentId, setSelectedDocumentId] = useState(initial.documentId);
15
+ const [documents, setDocuments] = useState([]);
16
+ const [documentValue, setDocumentValue] = useState();
17
+ const [queryInput, setQueryInput] = useState('');
18
+ const [query, setQuery] = useState('');
19
+ const [mountState, setMountState] = useState('loading');
20
+ const [listState, setListState] = useState('idle');
21
+ const [documentState, setDocumentState] = useState('idle');
22
+ const [documentRefresh, setDocumentRefresh] = useState(0);
23
+ const [error, setError] = useState('');
24
+ const [nextCursor, setNextCursor] = useState();
25
+ const [baseMenuOpen, setBaseMenuOpen] = useState(false);
26
+ const scopeRef = useRef(null);
27
+ useEffect(() => {
28
+ if (!baseMenuOpen)
29
+ return;
30
+ const closeOutside = (event) => {
31
+ if (!scopeRef.current?.contains(event.target))
32
+ setBaseMenuOpen(false);
33
+ };
34
+ const closeOnEscape = (event) => {
35
+ if (event.key === 'Escape')
36
+ setBaseMenuOpen(false);
37
+ };
38
+ document.addEventListener('pointerdown', closeOutside);
39
+ document.addEventListener('keydown', closeOnEscape);
40
+ return () => {
41
+ document.removeEventListener('pointerdown', closeOutside);
42
+ document.removeEventListener('keydown', closeOnEscape);
43
+ };
44
+ }, [baseMenuOpen]);
45
+ const refreshMounts = useCallback(async (signal) => {
46
+ setMountState('loading');
47
+ setError('');
48
+ try {
49
+ const next = await loadMountedKnowledge(sessionId, projectId, signal);
50
+ setMounts(next);
51
+ const current = props.controller.selection(sessionId);
52
+ const selected = next.some(item => item.knowledgeBaseId === current.knowledgeBaseId)
53
+ ? current.knowledgeBaseId
54
+ : next[0]?.knowledgeBaseId;
55
+ props.controller.select(sessionId, {
56
+ ...selected === undefined ? {} : { knowledgeBaseId: selected },
57
+ ...selected === current.knowledgeBaseId && current.documentId !== undefined
58
+ ? { documentId: current.documentId }
59
+ : {},
60
+ });
61
+ setSelectedBaseId(selected);
62
+ if (selected !== current.knowledgeBaseId) {
63
+ setSelectedDocumentId(undefined);
64
+ setDocumentValue(undefined);
65
+ }
66
+ setMountState('ready');
67
+ }
68
+ catch (reason) {
69
+ if (signal?.aborted)
70
+ return;
71
+ setMountState('error');
72
+ setError(message(reason));
73
+ }
74
+ }, [projectId, props.controller, sessionId]);
75
+ useEffect(() => {
76
+ const controller = new AbortController();
77
+ void refreshMounts(controller.signal);
78
+ return () => { controller.abort(); };
79
+ }, [refreshMounts]);
80
+ const loadIndex = useCallback(async (cursor, append = false, signal) => {
81
+ if (mounts.length === 0 || (query.length === 0 && selectedBaseId === undefined)) {
82
+ setDocuments([]);
83
+ setNextCursor(undefined);
84
+ setListState('ready');
85
+ return;
86
+ }
87
+ setListState('loading');
88
+ setError('');
89
+ try {
90
+ const result = await loadKnowledgeDocumentIndex({
91
+ sessionId,
92
+ ...projectId === undefined ? {} : { projectId },
93
+ knowledgeBaseIds: query ? mounts.map(item => item.knowledgeBaseId) : [selectedBaseId],
94
+ ...query ? { query } : {},
95
+ ...cursor === undefined ? {} : { cursor },
96
+ ...signal === undefined ? {} : { signal },
97
+ });
98
+ setDocuments(current => append ? [...current, ...result.items] : result.items);
99
+ setNextCursor(result.nextCursor);
100
+ setListState('ready');
101
+ }
102
+ catch (reason) {
103
+ if (signal?.aborted)
104
+ return;
105
+ setListState('error');
106
+ setError(message(reason));
107
+ }
108
+ }, [mounts, projectId, query, selectedBaseId, sessionId]);
109
+ useEffect(() => {
110
+ const controller = new AbortController();
111
+ void loadIndex(undefined, false, controller.signal);
112
+ return () => { controller.abort(); };
113
+ }, [loadIndex]);
114
+ useEffect(() => {
115
+ if (selectedDocumentId === undefined) {
116
+ setDocumentValue(undefined);
117
+ setDocumentState('idle');
118
+ return;
119
+ }
120
+ const controller = new AbortController();
121
+ setDocumentState('loading');
122
+ setError('');
123
+ void loadKnowledgeDocument({
124
+ id: selectedDocumentId,
125
+ sessionId,
126
+ ...projectId === undefined ? {} : { projectId },
127
+ signal: controller.signal,
128
+ }).then(value => {
129
+ setDocumentValue(value);
130
+ setDocumentState('ready');
131
+ }).catch(reason => {
132
+ if (controller.signal.aborted)
133
+ return;
134
+ setDocumentState('error');
135
+ setError(message(reason));
136
+ });
137
+ return () => { controller.abort(); };
138
+ }, [documentRefresh, projectId, selectedDocumentId, sessionId]);
139
+ const selectBase = (knowledgeBaseId) => {
140
+ setBaseMenuOpen(false);
141
+ setSelectedBaseId(knowledgeBaseId);
142
+ setSelectedDocumentId(undefined);
143
+ setDocumentValue(undefined);
144
+ setQueryInput('');
145
+ setQuery('');
146
+ props.controller.select(sessionId, { mode: 'knowledge', knowledgeBaseId });
147
+ };
148
+ const selectDocument = (document) => {
149
+ setSelectedBaseId(document.knowledgeBaseId);
150
+ setSelectedDocumentId(document.id);
151
+ props.controller.select(sessionId, {
152
+ mode: 'knowledge',
153
+ knowledgeBaseId: document.knowledgeBaseId,
154
+ documentId: document.id,
155
+ });
156
+ };
157
+ const closeDocument = () => {
158
+ setSelectedDocumentId(undefined);
159
+ setDocumentValue(undefined);
160
+ props.controller.select(sessionId, {
161
+ mode: 'knowledge',
162
+ ...selectedBaseId === undefined ? {} : { knowledgeBaseId: selectedBaseId },
163
+ });
164
+ };
165
+ const submitSearch = (event) => {
166
+ event.preventDefault();
167
+ setSelectedDocumentId(undefined);
168
+ setDocumentValue(undefined);
169
+ setQuery(queryInput.trim());
170
+ };
171
+ const clearSearch = () => {
172
+ setQueryInput('');
173
+ setQuery('');
174
+ };
175
+ const workspaceTarget = mode === 'notes'
176
+ ? { view: 'notes' }
177
+ : documentValue === undefined ? undefined : {
178
+ knowledgeBaseId: documentValue.knowledgeBaseId,
179
+ documentId: documentValue.id,
180
+ };
181
+ const selectMode = (nextMode) => {
182
+ setMode(nextMode);
183
+ setBaseMenuOpen(false);
184
+ props.controller.select(sessionId, { ...props.controller.selection(sessionId), mode: nextMode });
185
+ };
186
+ return _jsxs("section", { className: "dsh-knowledge-activity-panel", "data-xiaohei-surface": "plugin-workspace", "aria-label": "\u4F1A\u8BDD\u77E5\u8BC6\u5E93", children: [_jsxs("header", { className: "dsh-knowledge-activity-header", children: [_jsxs("div", { className: "dsh-knowledge-activity-title", children: [_jsx("span", { className: "dsh-knowledge-activity-mark", children: _jsx(IconDatabaseOutline16, { size: 17 }) }), _jsxs("span", { children: [_jsx("strong", { children: "\u77E5\u8BC6\u5E93" }), _jsxs("small", { children: ["\u5F53\u524D\u4F1A\u8BDD \u00B7 ", shortId(sessionId)] })] })] }), _jsxs("div", { className: "dsh-knowledge-activity-header-actions", children: [_jsx("button", { type: "button", className: "dsh-knowledge-activity-icon-button", "aria-label": "\u5728\u5B8C\u6574\u5DE5\u4F5C\u533A\u4E2D\u6253\u5F00", title: "\u5B8C\u6574\u5DE5\u4F5C\u533A", onClick: () => props.controller.openWorkspace(workspaceTarget), children: _jsx(IconFullscreenOutline16, { size: 16 }) }), _jsx("button", { type: "button", className: "dsh-knowledge-activity-icon-button", "aria-label": "\u5173\u95ED\u4F1A\u8BDD\u77E5\u8BC6\u5E93", title: "\u5173\u95ED", onClick: () => props.controller.close(sessionId), children: _jsx(IconCloseOutline16, { size: 16 }) })] })] }), _jsxs("nav", { className: "dsh-knowledge-activity-tabs", "aria-label": "\u77E5\u8BC6\u5E93\u5185\u5BB9\u7C7B\u578B", children: [_jsxs("button", { type: "button", className: mode === 'knowledge' ? 'is-active' : '', "aria-pressed": mode === 'knowledge', onClick: () => selectMode('knowledge'), children: [_jsx(IconDatabaseOutline16, { size: 15 }), "\u77E5\u8BC6\u6587\u6863"] }), _jsxs("button", { type: "button", className: mode === 'notes' ? 'is-active' : '', "aria-pressed": mode === 'notes', onClick: () => selectMode('notes'), children: [_jsx(IconDataOutline16, { size: 15 }), "\u7B14\u8BB0\u6587\u6863"] })] }), mode === 'notes'
187
+ ? _jsx(KnowledgeActivityNotes, { sessionId: sessionId, projectId: projectId, controller: props.controller })
188
+ : selectedDocumentId === undefined
189
+ ? _jsxs("div", { className: "dsh-knowledge-activity-browser", children: [_jsxs("form", { className: "dsh-knowledge-activity-search", role: "search", onSubmit: submitSearch, children: [_jsx(IconSearchOutline16, { size: 16, "aria-hidden": "true" }), _jsx("input", { "aria-label": "\u641C\u7D22\u5F53\u524D\u4F1A\u8BDD\u77E5\u8BC6\u6587\u6863", value: queryInput, placeholder: "\u641C\u7D22\u5DF2\u6302\u8F7D\u77E5\u8BC6\u2026", onChange: event => setQueryInput(event.target.value) }), queryInput && _jsx("button", { type: "button", onClick: clearSearch, "aria-label": "\u6E05\u9664\u641C\u7D22", children: _jsx(IconCloseOutline16, { size: 14 }) })] }), mountState === 'loading' ? _jsx(ActivityState, { label: "\u6B63\u5728\u8BFB\u53D6\u4F1A\u8BDD\u6302\u8F7D\u2026" })
190
+ : mountState === 'error' ? _jsx(ActivityError, { message: error, onRetry: () => { void refreshMounts(); } })
191
+ : mounts.length === 0 ? _jsx(ActivityEmpty, { title: "\u5F53\u524D\u4F1A\u8BDD\u6CA1\u6709\u6302\u8F7D\u77E5\u8BC6\u5E93", description: "\u5728\u5B8C\u6574\u5DE5\u4F5C\u533A\u4E2D\u6302\u8F7D\u540E\uFF0C\u5C31\u80FD\u5728\u8FD9\u91CC\u968F\u624B\u67E5\u9605\u6587\u6863\u3002" })
192
+ : _jsxs(_Fragment, { children: [_jsxs("div", { ref: scopeRef, className: "dsh-knowledge-activity-scope", children: [_jsxs("button", { type: "button", className: "dsh-knowledge-activity-scope-trigger", "aria-haspopup": "listbox", "aria-expanded": baseMenuOpen, onClick: () => setBaseMenuOpen(value => !value), children: [_jsx("span", { className: "dsh-knowledge-activity-scope-icon", children: _jsx(IconDatabaseOutline16, { size: 15 }) }), _jsxs("span", { children: [_jsx("small", { children: "\u5F53\u524D\u77E5\u8BC6\u5E93" }), _jsx("strong", { children: mounts.find(item => item.knowledgeBaseId === selectedBaseId)?.base.name })] }), _jsx(IconChevronDownOutline14, { size: 14, className: baseMenuOpen ? 'is-open' : '' })] }), baseMenuOpen && _jsx("div", { className: "dsh-knowledge-activity-scope-menu", role: "listbox", "aria-label": "\u5207\u6362\u77E5\u8BC6\u5E93", children: mounts.map(mount => _jsxs("button", { type: "button", role: "option", "aria-selected": selectedBaseId === mount.knowledgeBaseId, className: selectedBaseId === mount.knowledgeBaseId ? 'is-active' : '', onClick: () => selectBase(mount.knowledgeBaseId), children: [_jsx(IconDataOutline16, { size: 15 }), _jsxs("span", { children: [_jsx("strong", { children: mount.base.name }), _jsx("small", { children: mount.inheritedFrom === 'project' ? '项目挂载' : '会话挂载' })] })] }, mount.knowledgeBaseId)) })] }), _jsxs("div", { className: "dsh-knowledge-activity-list-heading", children: [_jsxs("span", { children: [_jsx("strong", { children: query ? `“${query}” 的结果` : '知识文档' }), _jsx("small", { children: query ? '搜索全部已挂载知识库' : `当前显示 ${documents.length} 项` })] }), _jsx("button", { type: "button", className: "dsh-knowledge-activity-icon-button", "aria-label": "\u5237\u65B0\u6587\u6863", title: "\u5237\u65B0", onClick: () => { void loadIndex(); }, children: _jsx(IconRefreshOutline14, { size: 14 }) })] }), _jsx("div", { className: "dsh-knowledge-activity-list", "aria-busy": listState === 'loading', children: listState === 'loading' && documents.length === 0 ? _jsx(ActivityState, { label: "\u6B63\u5728\u8BFB\u53D6\u6587\u6863\u2026" })
193
+ : listState === 'error' ? _jsx(ActivityError, { message: error, onRetry: () => { void loadIndex(); } })
194
+ : documents.length === 0 ? _jsx(ActivityEmpty, { title: query ? '没有找到相关文档' : '这里还没有知识文档', description: query ? '换个关键词,或清除搜索后浏览目录。' : '审核通过或直接回写的知识会出现在这里。' })
195
+ : _jsxs(_Fragment, { children: [documents.map(document => _jsx(DocumentRow, { document: document, baseName: query ? mounts.find(item => item.knowledgeBaseId === document.knowledgeBaseId)?.base.name : undefined, onClick: () => selectDocument(document) }, document.id)), nextCursor && _jsx("button", { type: "button", className: "dsh-knowledge-activity-load-more", disabled: listState === 'loading', onClick: () => { void loadIndex(nextCursor, true); }, children: listState === 'loading' ? '正在加载…' : '加载更多' })] }) })] })] })
196
+ : _jsx(DocumentReader, { value: documentValue, state: documentState, error: error, onBack: closeDocument, onRetry: () => setDocumentRefresh(value => value + 1) })] });
197
+ }
198
+ function DocumentRow({ document, baseName, onClick }) {
199
+ const stateLabel = document.documentState === 'resolved' ? '已解决' : document.documentState === 'complete' ? '已完成' : undefined;
200
+ return _jsxs("button", { type: "button", className: "dsh-knowledge-activity-row", onClick: onClick, children: [_jsx("span", { className: "dsh-knowledge-activity-row-icon", children: _jsx(IconDataOutline16, { size: 16 }) }), _jsxs("span", { className: "dsh-knowledge-activity-row-copy", children: [_jsx("strong", { children: document.title }), _jsx("small", { children: baseName ? `${baseName} · ${document.relPath}` : document.relPath })] }), _jsxs("span", { className: "dsh-knowledge-activity-row-meta", children: [stateLabel && _jsx("em", { children: stateLabel }), _jsx("time", { dateTime: document.updatedAt, children: formatDate(document.updatedAt) })] })] });
201
+ }
202
+ function DocumentReader({ value, state, error, onBack, onRetry }) {
203
+ const html = useMemo(() => value === undefined ? '' : renderMarkdown(readableMarkdown(value.content)), [value]);
204
+ return _jsxs("div", { className: "dsh-knowledge-activity-reader", children: [_jsxs("div", { className: "dsh-knowledge-activity-reader-bar", children: [_jsxs("button", { type: "button", className: "dsh-knowledge-activity-back", onClick: onBack, children: [_jsx(IconChevronLeftOutline14, { size: 14 }), "\u6587\u6863\u76EE\u5F55"] }), value && _jsxs("span", { children: [formatDate(value.updatedAt), " \u66F4\u65B0"] })] }), state === 'loading' ? _jsx(ActivityState, { label: "\u6B63\u5728\u6253\u5F00\u6587\u6863\u2026" })
205
+ : state === 'error' ? _jsx(ActivityError, { message: error, onRetry: onRetry })
206
+ : value === undefined ? _jsx(ActivityState, { label: "\u6B63\u5728\u51C6\u5907\u6587\u6863\u2026" })
207
+ : _jsxs(_Fragment, { children: [_jsxs("div", { className: "dsh-knowledge-activity-document-heading", children: [_jsx("span", { className: "dsh-knowledge-activity-document-icon", children: _jsx(IconDataOutline16, { size: 18 }) }), _jsxs("div", { children: [_jsx("h2", { children: value.title }), _jsx("p", { children: value.relPath })] })] }), _jsx("article", { className: "dsh-knowledge-activity-markdown", dangerouslySetInnerHTML: { __html: html } })] })] });
208
+ }
209
+ function ActivityState({ label }) {
210
+ return _jsxs("p", { className: "dsh-knowledge-activity-state", role: "status", children: [_jsx("span", { "aria-hidden": "true" }), label] });
211
+ }
212
+ function ActivityError({ message, onRetry }) {
213
+ return _jsxs("div", { className: "dsh-knowledge-activity-error", role: "alert", children: [_jsx("strong", { children: "\u6682\u65F6\u65E0\u6CD5\u8BFB\u53D6" }), _jsx("p", { children: message }), _jsx("button", { type: "button", onClick: onRetry, children: "\u91CD\u8BD5" })] });
214
+ }
215
+ function ActivityEmpty({ title, description }) {
216
+ return _jsxs("div", { className: "dsh-knowledge-activity-empty", children: [_jsx("span", { children: _jsx(IconDatabaseOutline16, { size: 20 }) }), _jsx("strong", { children: title }), _jsx("p", { children: description })] });
217
+ }
218
+ function readableMarkdown(value) {
219
+ return value.replace(/^---\s*\n[\s\S]*?\n---\s*\n*/u, '').replace(/^#\s+[^\n]+\n*/u, '');
220
+ }
221
+ function shortId(value) {
222
+ return value.length <= 12 ? value : `${value.slice(0, 7)}…${value.slice(-5)}`;
223
+ }
224
+ function formatDate(value) {
225
+ const date = new Date(value);
226
+ if (Number.isNaN(date.getTime()))
227
+ return '未知时间';
228
+ return new Intl.DateTimeFormat('zh-CN', { month: '2-digit', day: '2-digit' }).format(date);
229
+ }
230
+ function message(reason) {
231
+ return reason instanceof Error ? reason.message : String(reason);
232
+ }
233
+ //# sourceMappingURL=knowledge-activity-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-activity-panel.js","sourceRoot":"","sources":["../src/knowledge-activity-panel.tsx"],"names":[],"mappings":"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"}
@@ -1,3 +1,5 @@
1
+ import { lookup } from 'node:dns/promises';
2
+ import { type LookupFunction } from 'node:net';
1
3
  import type { NoteNode, NoteNodeKind, NoteShare } from './domain.js';
2
4
  import type { NoteStore } from './store.js';
3
5
  export interface NoteShareManifestNode {
@@ -27,10 +29,22 @@ export interface NoteShareImportResult {
27
29
  importedFiles: number;
28
30
  totalBytes: number;
29
31
  }
32
+ export interface NoteShareRequestPolicy {
33
+ trustedPrivateOrigins?: readonly string[];
34
+ }
30
35
  export declare function createNoteShareManifest(share: NoteShare, nodes: NoteNode[], truncated: boolean): NoteShareManifest;
31
- export declare function inspectNoteShareUrl(rawUrl: string, store?: NoteStore): Promise<{
36
+ export declare function inspectNoteShareUrl(rawUrl: string, store?: NoteStore, policy?: NoteShareRequestPolicy): Promise<{
32
37
  url: string;
33
38
  manifest: NoteShareManifest;
34
39
  }>;
35
- export declare function importNoteShare(store: NoteStore, rawUrl: string, parentId: string | null): Promise<NoteShareImportResult>;
40
+ export declare function importNoteShare(store: NoteStore, rawUrl: string, parentId: string | null, policy?: NoteShareRequestPolicy): Promise<NoteShareImportResult>;
41
+ /** Keep the request on the address that passed SSRF validation, including Node 24's multi-address lookup mode. */
42
+ export declare function createPinnedLookup(target: {
43
+ address: string;
44
+ family: 4 | 6;
45
+ }): LookupFunction;
46
+ export declare function resolveShareTarget(url: URL, policy?: NoteShareRequestPolicy, lookupHost?: typeof lookup): Promise<{
47
+ address: string;
48
+ family: 4 | 6;
49
+ }>;
36
50
  //# sourceMappingURL=share-import.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"share-import.d.ts","sourceRoot":"","sources":["../../src/notes/share-import.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAS3C,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,YAAY,CAAA;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,CAAC,CAAA;IACV,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,YAAY,CAAA;QAClB,SAAS,EAAE,MAAM,CAAA;QACjB,SAAS,EAAE,MAAM,CAAA;QACjB,SAAS,EAAE,MAAM,CAAA;QACjB,SAAS,EAAE,MAAM,CAAA;KAClB,CAAA;IACD,KAAK,EAAE,qBAAqB,EAAE,CAAA;IAC9B,SAAS,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,QAAQ,CAAA;IACd,aAAa,EAAE,MAAM,CAAA;IACrB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,OAAO,GAAG,iBAAiB,CAwBlH;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,iBAAiB,CAAA;CAAE,CAAC,CAUlI;AAED,wBAAsB,eAAe,CACnC,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,OAAO,CAAC,qBAAqB,CAAC,CA+DhC"}
1
+ {"version":3,"file":"share-import.d.ts","sourceRoot":"","sources":["../../src/notes/share-import.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAG1C,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,UAAU,CAAA;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAS3C,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,YAAY,CAAA;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,CAAC,CAAA;IACV,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,YAAY,CAAA;QAClB,SAAS,EAAE,MAAM,CAAA;QACjB,SAAS,EAAE,MAAM,CAAA;QACjB,SAAS,EAAE,MAAM,CAAA;QACjB,SAAS,EAAE,MAAM,CAAA;KAClB,CAAA;IACD,KAAK,EAAE,qBAAqB,EAAE,CAAA;IAC9B,SAAS,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,QAAQ,CAAA;IACd,aAAa,EAAE,MAAM,CAAA;IACrB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,qBAAqB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC1C;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,OAAO,GAAG,iBAAiB,CAwBlH;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,MAAM,GAAE,sBAA2B,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,iBAAiB,CAAA;CAAE,CAAC,CAUvK;AAED,wBAAsB,eAAe,CACnC,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,MAAM,GAAE,sBAA2B,GAClC,OAAO,CAAC,qBAAqB,CAAC,CA+DhC;AAyED,kHAAkH;AAClH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAA;CAAE,GAAG,cAAc,CAK7F;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,GAAG,EACR,MAAM,GAAE,sBAA2B,EACnC,UAAU,GAAE,OAAO,MAAe,GACjC,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAA;CAAE,CAAC,CAsB7C"}
@@ -34,7 +34,7 @@ export function createNoteShareManifest(share, nodes, truncated) {
34
34
  truncated,
35
35
  };
36
36
  }
37
- export async function inspectNoteShareUrl(rawUrl, store) {
37
+ export async function inspectNoteShareUrl(rawUrl, store, policy = {}) {
38
38
  const url = canonicalShareUrl(rawUrl);
39
39
  const localShare = store?.getShareByToken(shareToken(url));
40
40
  if (localShare !== undefined) {
@@ -42,10 +42,10 @@ export async function inspectNoteShareUrl(rawUrl, store) {
42
42
  const truncated = localNodes.length > 500;
43
43
  return { url: url.href, manifest: createNoteShareManifest(localShare, localNodes.slice(0, 500), truncated) };
44
44
  }
45
- const payload = await requestPublicUrl(new URL(`${url.href}/manifest`), MAX_MANIFEST_BYTES);
45
+ const payload = await requestPublicUrl(new URL(`${url.href}/manifest`), MAX_MANIFEST_BYTES, policy);
46
46
  return { url: url.href, manifest: validateManifest(JSON.parse(payload.toString('utf8'))) };
47
47
  }
48
- export async function importNoteShare(store, rawUrl, parentId) {
48
+ export async function importNoteShare(store, rawUrl, parentId, policy = {}) {
49
49
  const canonical = canonicalShareUrl(rawUrl);
50
50
  const localShare = store.getShareByToken(shareToken(canonical));
51
51
  if (localShare !== undefined) {
@@ -61,7 +61,7 @@ export async function importNoteShare(store, rawUrl, parentId) {
61
61
  totalBytes: files.reduce((total, node) => total + node.size, 0),
62
62
  };
63
63
  }
64
- const { url, manifest } = await inspectNoteShareUrl(canonical.href);
64
+ const { url, manifest } = await inspectNoteShareUrl(canonical.href, undefined, policy);
65
65
  if (manifest.truncated)
66
66
  throw inputError('分享目录超过 500 项,暂时不能导入');
67
67
  if (manifest.nodes.length === 0)
@@ -95,7 +95,7 @@ export async function importNoteShare(store, rawUrl, parentId) {
95
95
  created = await store.createFolder(name, destinationParentId ?? null);
96
96
  }
97
97
  else {
98
- const content = await requestPublicUrl(contentUrl(url, item.id), MAX_IMPORT_FILE_BYTES);
98
+ const content = await requestPublicUrl(contentUrl(url, item.id), MAX_IMPORT_FILE_BYTES, policy);
99
99
  if (content.byteLength !== item.size)
100
100
  throw inputError(`分享文件大小校验失败:${item.path}`);
101
101
  if (item.sha256 !== null && createHash('sha256').update(content).digest('hex') !== item.sha256) {
@@ -149,15 +149,15 @@ function contentUrl(base, noteId) {
149
149
  return url;
150
150
  }
151
151
  function shareToken(url) { return url.pathname.slice(url.pathname.lastIndexOf('/') + 1); }
152
- async function requestPublicUrl(url, maximumBytes, redirects = 0) {
152
+ async function requestPublicUrl(url, maximumBytes, policy, redirects = 0) {
153
153
  if (redirects > 3)
154
154
  throw upstreamError('分享服务重定向次数过多');
155
- const target = await resolvePublicTarget(url);
155
+ const target = await resolveShareTarget(url, policy);
156
156
  const request = url.protocol === 'https:' ? requestHttps : requestHttp;
157
157
  return await new Promise((resolve, reject) => {
158
158
  const req = request(url, {
159
159
  headers: { accept: 'application/json, application/octet-stream;q=0.9', 'user-agent': 'dsh-knowledge-share-import/1' },
160
- lookup: (_hostname, _options, callback) => callback(null, target.address, target.family),
160
+ lookup: createPinnedLookup(target),
161
161
  }, response => {
162
162
  const status = response.statusCode ?? 502;
163
163
  if ([301, 302, 303, 307, 308].includes(status)) {
@@ -172,7 +172,7 @@ async function requestPublicUrl(url, maximumBytes, redirects = 0) {
172
172
  catch {
173
173
  return reject(upstreamError('分享服务返回了无效重定向'));
174
174
  }
175
- requestPublicUrl(redirected, maximumBytes, redirects + 1).then(resolve, reject);
175
+ requestPublicUrl(redirected, maximumBytes, policy, redirects + 1).then(resolve, reject);
176
176
  return;
177
177
  }
178
178
  if (status < 200 || status >= 300) {
@@ -205,7 +205,16 @@ async function requestPublicUrl(url, maximumBytes, redirects = 0) {
205
205
  req.end();
206
206
  });
207
207
  }
208
- async function resolvePublicTarget(url) {
208
+ /** Keep the request on the address that passed SSRF validation, including Node 24's multi-address lookup mode. */
209
+ export function createPinnedLookup(target) {
210
+ return (_hostname, options, callback) => {
211
+ if (options.all)
212
+ callback(null, [target]);
213
+ else
214
+ callback(null, target.address, target.family);
215
+ };
216
+ }
217
+ export async function resolveShareTarget(url, policy = {}, lookupHost = lookup) {
209
218
  if (url.protocol !== 'https:' && url.protocol !== 'http:')
210
219
  throw inputError('分享链接只支持 HTTP 或 HTTPS');
211
220
  const hostname = url.hostname.toLocaleLowerCase();
@@ -219,16 +228,26 @@ async function resolvePublicTarget(url) {
219
228
  }
220
229
  let addresses;
221
230
  try {
222
- addresses = await lookup(hostname, { all: true, verbatim: true });
231
+ addresses = await lookupHost(hostname, { all: true, verbatim: true });
223
232
  }
224
233
  catch {
225
234
  throw upstreamError('无法解析分享链接的主机名');
226
235
  }
227
236
  const publicAddress = addresses.find(item => isPublicAddress(item.address));
228
- if (publicAddress === undefined || addresses.some(item => !isPublicAddress(item.address))) {
237
+ if (publicAddress !== undefined && addresses.every(item => isPublicAddress(item.address))) {
238
+ return { address: publicAddress.address, family: publicAddress.family === 6 ? 6 : 4 };
239
+ }
240
+ const trustedPrivateOrigin = policy.trustedPrivateOrigins?.includes(url.origin) === true && isShareResourcePath(url.pathname);
241
+ if (!trustedPrivateOrigin) {
229
242
  throw inputError('分享链接不能解析到本机或私有网络');
230
243
  }
231
- return { address: publicAddress.address, family: publicAddress.family === 6 ? 6 : 4 };
244
+ const pinned = addresses.find(item => isIP(item.address) !== 0);
245
+ if (pinned === undefined)
246
+ throw upstreamError('无法解析分享链接的主机名');
247
+ return { address: pinned.address, family: pinned.family === 6 ? 6 : 4 };
248
+ }
249
+ function isShareResourcePath(pathname) {
250
+ return /\/shared\/share_[A-Za-z0-9_-]{32}(?:\/(?:manifest|content))?\/?$/u.test(pathname);
232
251
  }
233
252
  function isPublicAddress(address) {
234
253
  if (address.includes(':')) {