@yfwu2020/dsh-selection-explain 0.10.6 → 0.11.1
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 +13 -3
- package/lib/client.js +728 -19
- package/lib/client.js.map +3 -3
- package/lib/host/analyze.js +130 -15
- package/lib/host/analyze.js.map +1 -1
- package/lib/host/attach.js +254 -0
- package/lib/host/attach.js.map +1 -0
- package/lib/host/history-attachments.js +184 -0
- package/lib/host/history-attachments.js.map +1 -0
- package/lib/host/history-store.js +45 -14
- package/lib/host/history-store.js.map +1 -1
- package/lib/host/http.js +7 -0
- package/lib/host/http.js.map +1 -1
- package/lib/host/mic.js +51 -6
- package/lib/host/mic.js.map +1 -1
- package/lib/host/plugin.js +5 -0
- package/lib/host/plugin.js.map +1 -1
- package/lib/host/promote.js +65 -13
- package/lib/host/promote.js.map +1 -1
- package/lib/host/tools.js +28 -0
- package/lib/host/tools.js.map +1 -1
- package/lib/types/host/attach.d.ts +77 -0
- package/lib/types/host/history-attachments.d.ts +108 -0
- package/lib/types/host/http.d.ts +7 -0
- package/lib/types/host/tools.d.ts +21 -0
- package/lib/types/host/types.d.ts +7 -0
- package/package.json +1 -1
package/lib/host/promote.js
CHANGED
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
import { sendJson, readBody, BODY_LIMIT } from './http.js';
|
|
2
2
|
import { sessionIdOf } from './context.js';
|
|
3
3
|
import { name, PLUGIN_SOURCE_KIND } from './constants.js';
|
|
4
|
+
import { readHistoryAttachments } from './history-attachments.js';
|
|
5
|
+
/**
|
|
6
|
+
* 去掉小窗正文里那行 `【本条消息带了附件】…`。
|
|
7
|
+
*
|
|
8
|
+
* 那行是**小窗**的说法(历史里给模型看的锚点)。升格时附件是**真带过来**的,
|
|
9
|
+
* 再留着它,主会话里就会同时出现"一行字说带了附件"和"附件本身",
|
|
10
|
+
* 而且措辞("本条消息")在主会话语境下也不通顺。
|
|
11
|
+
*
|
|
12
|
+
* 只在**确实带上了附件**时才去(`hasAttachments`):没有附件时那行是唯一的信息,不能抹。
|
|
13
|
+
*/
|
|
14
|
+
function attachmentMarkerStripped(text, hasAttachments) {
|
|
15
|
+
if (!hasAttachments)
|
|
16
|
+
return text;
|
|
17
|
+
return text.replace(/^【本条消息带了附件】[^\n]*\n?/, '');
|
|
18
|
+
}
|
|
4
19
|
/** Owns promote state for one plugin instance. */
|
|
5
20
|
export function createPromote(ctx, config, sessions, historyStore) {
|
|
6
21
|
/**
|
|
@@ -86,7 +101,14 @@ export function createPromote(ctx, config, sessions, historyStore) {
|
|
|
86
101
|
.slice(-20)
|
|
87
102
|
.map((turn) => turn)
|
|
88
103
|
.filter((turn) => turn.seed !== true && typeof turn.text === 'string' && turn.text.trim().length > 0)
|
|
89
|
-
.map((turn) => ({
|
|
104
|
+
.map((turn) => ({
|
|
105
|
+
role: turn.role === 'assistant' ? 'assistant' : 'user',
|
|
106
|
+
text: turn.text.trim(),
|
|
107
|
+
// 附件(图片/文件)随轮次一起带过来 —— 走的是和 /analyze、历史落盘**同一个收敛器**。
|
|
108
|
+
// 客户端本来就在发它们(exportTurns 带 attachments),是这里以前只认 role/text 把它们丢了,
|
|
109
|
+
// 于是升格出来的会话「声称带了附件、却看不到图」。
|
|
110
|
+
attachments: readHistoryAttachments(turn.attachments),
|
|
111
|
+
}));
|
|
90
112
|
const live = ctx.get('sessions')?.get?.(newSessionId);
|
|
91
113
|
let seeded = false;
|
|
92
114
|
if (live && typeof live.append === 'function') {
|
|
@@ -100,6 +122,23 @@ export function createPromote(ctx, config, sessions, historyStore) {
|
|
|
100
122
|
// 一定从 1 开始(phase.turn 初始为 0),所以历史轮必须避开低位号段,
|
|
101
123
|
// 否则历史的 turn 1 会和真实的 turn 1 并成同一组、看起来"历史没进去"。
|
|
102
124
|
// 同时这也是 resume 语义安全的:resume 时 phase.turn = lastTurn + 1 = 1000+N+1,仍不与历史重号。
|
|
125
|
+
/**
|
|
126
|
+
* 一轮升格后的**内容块**:附件在前、正文在后。
|
|
127
|
+
*
|
|
128
|
+
* 顺序与主会话、与 /analyze 完全一致(先给材料,再读问题)——
|
|
129
|
+
* 形状也是主会话真实使用的那一种(`{type:'image', attachment:{…}}`),
|
|
130
|
+
* 所以升格后客户端能画出缩略图、模型也能真的看到图。
|
|
131
|
+
*/
|
|
132
|
+
const contentOfTurn = (turn) => {
|
|
133
|
+
const blocks = [];
|
|
134
|
+
for (const item of turn.attachments) {
|
|
135
|
+
blocks.push(item.kind === 'image'
|
|
136
|
+
? { type: 'image', attachment: item.ref }
|
|
137
|
+
: { type: 'file', attachment: item.ref });
|
|
138
|
+
}
|
|
139
|
+
blocks.push({ type: 'text', text: attachmentMarkerStripped(turn.text, turn.attachments.length > 0) });
|
|
140
|
+
return blocks;
|
|
141
|
+
};
|
|
103
142
|
let turnNo = 1000;
|
|
104
143
|
const appendTurn = (userEvent, assistantText) => {
|
|
105
144
|
turnNo += 1;
|
|
@@ -159,7 +198,7 @@ export function createPromote(ctx, config, sessions, historyStore) {
|
|
|
159
198
|
id: `sel-u-${stamp}-${i}`,
|
|
160
199
|
role: 'user',
|
|
161
200
|
source: { kind: 'user' },
|
|
162
|
-
content:
|
|
201
|
+
content: contentOfTurn(turn),
|
|
163
202
|
}, turns[i + 1] && turns[i + 1]?.role === 'assistant' ? (turns[i + 1]?.text ?? '') : '(未记录)');
|
|
164
203
|
i += 1; // 助手回答已随本轮写入
|
|
165
204
|
}
|
|
@@ -170,10 +209,22 @@ export function createPromote(ctx, config, sessions, historyStore) {
|
|
|
170
209
|
}
|
|
171
210
|
seeded = true;
|
|
172
211
|
}
|
|
173
|
-
// ⑤
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
212
|
+
// ⑤ 开场消息
|
|
213
|
+
//
|
|
214
|
+
// ⚠️ 这个 prompt **只在打包回退路径下需要** —— 那时它本身就是"背景"的载体
|
|
215
|
+
//(一整段打包文字),不发就等于背景没进去。
|
|
216
|
+
// history 模式下历史已经是真实的 user/assistant 事件,来源也写在第一条上下文消息里
|
|
217
|
+
//(`选中文字:… / 所在位置:… / 来源:划词解读小窗(来源会话 …)`),
|
|
218
|
+
// 再发一句"请用一句话确认"没有任何作用,只剩代价:
|
|
219
|
+
// · 每次升格白烧一次模型调用(升格时模型往往正忙);
|
|
220
|
+
// · 升格出来的会话顶部多一条"好的,我确认"的噪声;
|
|
221
|
+
// · 把 agent 的第 1 轮占掉 —— 用户自己问的第一句变成第 2 轮。
|
|
222
|
+
//
|
|
223
|
+
// 曾经的理由是「整段历史落盘的触发点」。**实测否掉了**(2026-10-19):
|
|
224
|
+
// 种子事件 +328ms 就写进磁盘,模型回复 +2863ms 才出现 ——
|
|
225
|
+
// 落盘靠的是 `live.append`(当场写盘),与这次 prompt 无关。
|
|
226
|
+
if (!seeded) {
|
|
227
|
+
const opener = [
|
|
177
228
|
'【划词解读 · 升格为会话】',
|
|
178
229
|
'下面这段文字来自一次划词解读小窗;上下文、结论与小窗里的追问一并附上,作为本次会话的既有背景。',
|
|
179
230
|
'',
|
|
@@ -195,13 +246,14 @@ export function createPromote(ctx, config, sessions, historyStore) {
|
|
|
195
246
|
'',
|
|
196
247
|
'以上是背景,请把它作为本次会话的既有上下文;先不需要展开,等我继续提问。',
|
|
197
248
|
].join('\n');
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
249
|
+
const promoteController = new AbortController();
|
|
250
|
+
await controller.prompt({
|
|
251
|
+
requestId: `sel-promote-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
|
|
252
|
+
sessionId: newSessionId,
|
|
253
|
+
mode: 'queue',
|
|
254
|
+
content: [{ type: 'text', text: opener }],
|
|
255
|
+
}, promoteController.signal);
|
|
256
|
+
}
|
|
205
257
|
sendJson(res, 200, {
|
|
206
258
|
ok: true,
|
|
207
259
|
sessionId: newSessionId,
|
package/lib/host/promote.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promote.js","sourceRoot":"","sources":["../../src/host/promote.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"promote.js","sourceRoot":"","sources":["../../src/host/promote.ts"],"names":[],"mappings":"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"}
|
package/lib/host/tools.js
CHANGED
|
@@ -176,4 +176,32 @@ export async function runTool(ctx, name, args, signal, maxChars, agent) {
|
|
|
176
176
|
return { content: [{ type: 'text', text: `工具执行失败:${String(error?.message ?? error)}` }], isError: true };
|
|
177
177
|
}
|
|
178
178
|
}
|
|
179
|
+
/**
|
|
180
|
+
* 文件工具这道门:**项目内放行;本次用户亲手附带的文件也放行**。
|
|
181
|
+
*
|
|
182
|
+
* 为什么需要第二张名单:附件的只读副本存在 `~/.dsh/attachments/…`(附件仓),
|
|
183
|
+
* 而 `readRoot` 默认是会话工作目录 —— 两者没有交集。可 dsh-llm 交给模型的
|
|
184
|
+
* 文件句柄文本明确写着"用你的文件工具去读那个路径,需要内容时就读",
|
|
185
|
+
* 于是模型**必然**去读、**必然**被拒,工具轮就这么被烧光:
|
|
186
|
+
* 实测连续两轮 `emitted=0 / finish=tool-calls`,最后只剩
|
|
187
|
+
* 「工具查询完成了,但模型没有产出正文」那句兜底 —— 附文件等于白附。
|
|
188
|
+
*
|
|
189
|
+
* 为什么不是把 readRoot 调大:那等于给**整段对话**(以及项目外的任意路径)开口子。
|
|
190
|
+
* 这里只放行"这次请求里真的拼进消息的那些文件"(路径由附件服务按内容哈希推出,
|
|
191
|
+
* 名字还有 `ref.name === fileLeafName(ref.name)` 的校验),
|
|
192
|
+
* 所以放开的范围严格等于用户的意图,边界其余部分一字不动。
|
|
193
|
+
*
|
|
194
|
+
* @param root - 会话工作目录(空 = 不限)
|
|
195
|
+
* @param target - 模型请求的路径(原样,未解析)
|
|
196
|
+
* @param attached - 本次附带的文件绝对路径集合(已 `resolve` 过)
|
|
197
|
+
* @returns 是否放行
|
|
198
|
+
*/
|
|
199
|
+
export function isReadAllowed(root, target, attached) {
|
|
200
|
+
// 走到这里说明 root 非空、target 也非空(两者有任何一个为空,isInsideRoot 就直接放行了)
|
|
201
|
+
if (isInsideRoot(root, target))
|
|
202
|
+
return true;
|
|
203
|
+
if (!attached || attached.size === 0)
|
|
204
|
+
return false;
|
|
205
|
+
return attached.has(resolve(String(target).trim()));
|
|
206
|
+
}
|
|
179
207
|
//# sourceMappingURL=tools.js.map
|
package/lib/host/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/host/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC1C,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAIxC,gCAAgC;AAChC,MAAM,iBAAiB,GAAG,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,YAAY,CAAC,CAAA;AAE9E;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAmB,EAAE,QAAkB,EAAE,OAAiB;IACzF,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAA;IAChC,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;IACzD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;IACjG,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,IAAI,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACtE,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IAC1C,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAA;IACxB,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAA;QACjC,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,KAAK,CAAA;QACnD,IAAI,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAA;QAClD,IAAI,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAA;QAClD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;IAC1D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;QAAE,OAAO,KAAK,CAAA;IACnG,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAW,CAAA;IAC5B,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAW,CAAA;IAC5B,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAW,CAAA;IAC5B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,KAAK,CAAA;IAClD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG;QAAE,OAAO,KAAK,CAAA;IAClD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,KAAK,CAAA;IACxC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,KAAK,CAAA;IACjD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,KAAK,CAAA;IACrD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;QAAE,OAAO,KAAK,CAAA,CAAC,oCAAoC;IAC1F,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,KAAK,CAAA;IACpD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,KAAK,CAAA;IACnD,IAAI,CAAC,IAAI,GAAG;QAAE,OAAO,KAAK,CAAA;IAC1B,OAAO,IAAI,CAAA;AACb,CAAC;AAED,sCAAsC;AACtC,IAAI,UAAU,GAAoD,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;AAErG,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,EAAE,GAAG,OAAO;QAAE,OAAO,UAAU,CAAA;IAC3D,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAA;QAC5D,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAA;QACjG,UAAU,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAA;IACrG,CAAC;IAAC,MAAM,CAAC;QACP,UAAU,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;IAC3D,CAAC;IACD,OAAO,UAAU,CAAA;AACnB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,MAAc;IACvD,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IACtB,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IACvC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAA;IACrB,uCAAuC;IACvC,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IAC9E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAC/B,OAAO,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,CAAA;AACjF,CAAC;AAED,oCAAoC;AACpC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAErD,4BAA4B;AAC5B,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,IAAa;IAC1D,MAAM,MAAM,GAAG,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAA;IACtD,uDAAuD;IACvD,MAAM,GAAG,GACP,MAAM,CAAC,KAAK;QACZ,MAAM,CAAC,OAAO;QACd,MAAM,CAAC,CAAC;QACR,MAAM,CAAC,GAAG;QACV,MAAM,CAAC,MAAM;QACb,MAAM,CAAC,OAAO;QACd,MAAM,CAAC,SAAS;QAChB,MAAM,CAAC,IAAI;QACX,MAAM,CAAC,OAAO,CAAA;IAChB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;IAC/C,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AAC/D,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,gBAAgB,CAAC,OAAuB;IACtD,MAAM,IAAI,GAAG,OAAO;SACjB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SACzD,IAAI,CAAC,IAAI,CAAC;SACV,IAAI,EAAE,CAAA;IACT,MAAM,IAAI,GAAa,EAAE,CAAA;IACzB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,IAAI,EAAE,CAAA;IAC7D,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAA;QAC3C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACvC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC;YAAE,MAAK;IAC7B,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAA;AAClE,CAAC;AAED,mCAAmC;AACnC,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,GAAY,EACZ,IAAY,EACZ,IAAa,EACb,MAAmB,EACnB,QAAgB,EAChB,KAAc;IAEd,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAUnB,CAAA;IACb,IAAI,OAAO,QAAQ,EAAE,OAAO,KAAK,UAAU,EAAE,CAAC;QAC5C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IACxE,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC;YACpC,MAAM,EAAE,YAAY,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;YAC1E,IAAI;YACJ,SAAS,EAAE,IAAI;YACf,MAAM;YACN,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5B,CAAC,CAAA;QACF,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAA;QAClE,IAAI,IAAI,GAAG,CAAC,CAAA;QACZ,MAAM,OAAO,GAAmB,EAAE,CAAA;QAClC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;gBAAE,SAAQ;YACnC,MAAM,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAA;YAC9B,IAAI,MAAM,IAAI,CAAC;gBAAE,MAAK;YACtB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC;OACvE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAA;YACd,IAAI,IAAI,IAAI,CAAC,MAAM,CAAA;YACnB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;QACtC,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAA;QAC9E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI,EAAE,CAAA;IAC/D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,MAAM,CAAE,KAAe,EAAE,OAAO,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IACrH,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/host/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC1C,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAIxC,gCAAgC;AAChC,MAAM,iBAAiB,GAAG,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,YAAY,CAAC,CAAA;AAE9E;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAmB,EAAE,QAAkB,EAAE,OAAiB;IACzF,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAA;IAChC,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;IACzD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;IACjG,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,IAAI,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACtE,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IAC1C,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAA;IACxB,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAA;QACjC,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,KAAK,CAAA;QACnD,IAAI,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAA;QAClD,IAAI,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAA;QAClD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;IAC1D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;QAAE,OAAO,KAAK,CAAA;IACnG,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAW,CAAA;IAC5B,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAW,CAAA;IAC5B,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAW,CAAA;IAC5B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,KAAK,CAAA;IAClD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG;QAAE,OAAO,KAAK,CAAA;IAClD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,KAAK,CAAA;IACxC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,KAAK,CAAA;IACjD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,KAAK,CAAA;IACrD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;QAAE,OAAO,KAAK,CAAA,CAAC,oCAAoC;IAC1F,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,KAAK,CAAA;IACpD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,KAAK,CAAA;IACnD,IAAI,CAAC,IAAI,GAAG;QAAE,OAAO,KAAK,CAAA;IAC1B,OAAO,IAAI,CAAA;AACb,CAAC;AAED,sCAAsC;AACtC,IAAI,UAAU,GAAoD,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;AAErG,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,EAAE,GAAG,OAAO;QAAE,OAAO,UAAU,CAAA;IAC3D,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAA;QAC5D,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAA;QACjG,UAAU,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAA;IACrG,CAAC;IAAC,MAAM,CAAC;QACP,UAAU,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;IAC3D,CAAC;IACD,OAAO,UAAU,CAAA;AACnB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,MAAc;IACvD,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IACtB,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IACvC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAA;IACrB,uCAAuC;IACvC,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IAC9E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAC/B,OAAO,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,CAAA;AACjF,CAAC;AAED,oCAAoC;AACpC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAErD,4BAA4B;AAC5B,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,IAAa;IAC1D,MAAM,MAAM,GAAG,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAA;IACtD,uDAAuD;IACvD,MAAM,GAAG,GACP,MAAM,CAAC,KAAK;QACZ,MAAM,CAAC,OAAO;QACd,MAAM,CAAC,CAAC;QACR,MAAM,CAAC,GAAG;QACV,MAAM,CAAC,MAAM;QACb,MAAM,CAAC,OAAO;QACd,MAAM,CAAC,SAAS;QAChB,MAAM,CAAC,IAAI;QACX,MAAM,CAAC,OAAO,CAAA;IAChB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;IAC/C,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AAC/D,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,gBAAgB,CAAC,OAAuB;IACtD,MAAM,IAAI,GAAG,OAAO;SACjB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SACzD,IAAI,CAAC,IAAI,CAAC;SACV,IAAI,EAAE,CAAA;IACT,MAAM,IAAI,GAAa,EAAE,CAAA;IACzB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,IAAI,EAAE,CAAA;IAC7D,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAA;QAC3C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACvC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC;YAAE,MAAK;IAC7B,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAA;AAClE,CAAC;AAED,mCAAmC;AACnC,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,GAAY,EACZ,IAAY,EACZ,IAAa,EACb,MAAmB,EACnB,QAAgB,EAChB,KAAc;IAEd,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAUnB,CAAA;IACb,IAAI,OAAO,QAAQ,EAAE,OAAO,KAAK,UAAU,EAAE,CAAC;QAC5C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IACxE,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC;YACpC,MAAM,EAAE,YAAY,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;YAC1E,IAAI;YACJ,SAAS,EAAE,IAAI;YACf,MAAM;YACN,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5B,CAAC,CAAA;QACF,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAA;QAClE,IAAI,IAAI,GAAG,CAAC,CAAA;QACZ,MAAM,OAAO,GAAmB,EAAE,CAAA;QAClC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;gBAAE,SAAQ;YACnC,MAAM,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAA;YAC9B,IAAI,MAAM,IAAI,CAAC;gBAAE,MAAK;YACtB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC;OACvE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAA;YACd,IAAI,IAAI,IAAI,CAAC,MAAM,CAAA;YACnB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;QACtC,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAA;QAC9E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI,EAAE,CAAA;IAC/D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,MAAM,CAAE,KAAe,EAAE,OAAO,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IACrH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,MAAc,EAAE,QAA8B;IACxF,2DAA2D;IAC3D,IAAI,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC;QAAE,OAAO,IAAI,CAAA;IAC3C,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IAClD,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;AACrD,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 小窗附件:把浏览器选中的图片 / 文件存成 DSH 的**持久附件**,回一个可回传的引用。
|
|
3
|
+
*
|
|
4
|
+
* 为什么要单开一条路由,而不是把 base64 塞进 /analyze:
|
|
5
|
+
* ① 一张截图 base64 之后几 MB,而 /analyze 的请求体上限是 512 KiB(http.ts 的 BODY_LIMIT)——
|
|
6
|
+
* 那是给提示词用的,不该为一个附件通道放宽;
|
|
7
|
+
* ② 上传要能**逐个失败、逐个重试**(一张图被拒不该把整条消息连同别的附件一起废掉),
|
|
8
|
+
* 独立路由 + 每个文件一次请求,错误就自然落在那个文件头上;
|
|
9
|
+
* ③ 进度与状态(转圈 / 失败 / 重试)在客户端本来就是逐项的。
|
|
10
|
+
*
|
|
11
|
+
* 存进去之后 /analyze 只带引用(`{kind, ref}`),拼成 `ImageBlock` / `FileBlock`:
|
|
12
|
+
* · 图片 → 模型直接看(不支持视觉的模型由 dsh-llm 换成一行文字占位,不会报错);
|
|
13
|
+
* · 文件 → dsh-llm 自动投影成"文件名 + 字节数 + 只读路径"的一行,模型需要时用文件工具读。
|
|
14
|
+
* 这两条投影都在 dsh-llm 里,插件这边只负责把引用放进 content。
|
|
15
|
+
*
|
|
16
|
+
* 服务是从 `ctx.get('attachments')` 拿的(`@deepseek-ai/dsh-attachment` 的 AttachmentStore)。
|
|
17
|
+
* 这里**不 import 那个包**,只按结构化类型用它 —— 和本插件读 `sessionQuery` / `agents` / `tools`
|
|
18
|
+
* 是同一套办法:插件与内核的版本范围是分开演的,少一个编译期依赖就少一处版本耦合。
|
|
19
|
+
*/
|
|
20
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
21
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
22
|
+
/** 单次请求最多带几件(和主会话的观感一致:一次拖一堆也别失控)。 */
|
|
23
|
+
export declare const ATTACH_MAX_ITEMS = 10;
|
|
24
|
+
/** 单个文件的原始字节上限。图片另有服务自己的限额(默认 20 MiB),这里只做粗筛。 */
|
|
25
|
+
export declare const ATTACH_MAX_ITEM_BYTES: number;
|
|
26
|
+
/**
|
|
27
|
+
* `ctx.attachments` 的宽松视图 —— 只写用得到的三个方法。
|
|
28
|
+
*
|
|
29
|
+
* 方法名与 `@deepseek-ai/dsh-attachment` 的 AttachmentStore 一致(v0.2.x):
|
|
30
|
+
* · saveImages:成批校验 + 规范化 + 落盘,返回与输入同序的引用(图片);
|
|
31
|
+
* · admitEncodedFile:校验 canonical base64 后**原样**落盘(任意文件,无类型/大小白名单);
|
|
32
|
+
* · isAttachmentError:按稳定错误码判定"这是附件层的失败"。
|
|
33
|
+
*/
|
|
34
|
+
export interface AttachmentsLike {
|
|
35
|
+
saveImages?: (inputs: ReadonlyArray<{
|
|
36
|
+
data: Uint8Array;
|
|
37
|
+
mediaType: string;
|
|
38
|
+
name?: string;
|
|
39
|
+
}>) => Promise<readonly unknown[]>;
|
|
40
|
+
admitEncodedFile?: (input: {
|
|
41
|
+
data: string;
|
|
42
|
+
name?: string;
|
|
43
|
+
}) => Promise<unknown>;
|
|
44
|
+
isAttachmentError?: (error: unknown) => boolean;
|
|
45
|
+
/** 归一化图片在宿主文件系统里的绝对路径(无效引用会抛 AttachmentError)。 */
|
|
46
|
+
imageHostPath?: (ref: unknown) => string | undefined;
|
|
47
|
+
/** 逐字节文件在宿主文件系统里的绝对路径(无效引用会抛 AttachmentError)。 */
|
|
48
|
+
fileHostPath?: (ref: unknown) => string | undefined;
|
|
49
|
+
}
|
|
50
|
+
/** 客户端提交的一件附件(data 为 canonical base64,不带 data: 前缀)。 */
|
|
51
|
+
interface AttachInput {
|
|
52
|
+
kind: 'image' | 'file';
|
|
53
|
+
name: string;
|
|
54
|
+
mediaType: string;
|
|
55
|
+
data: string;
|
|
56
|
+
}
|
|
57
|
+
/** 把附件层的失败翻译成一句给用户看的话。 */
|
|
58
|
+
export declare function explainAttachError(error: unknown): {
|
|
59
|
+
code: string;
|
|
60
|
+
message: string;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* 严格解 base64。
|
|
64
|
+
*
|
|
65
|
+
* 必须是 **canonical** 形式:`Buffer.from(x, 'base64')` 对畸形输入是"尽量解",
|
|
66
|
+
* 解完再编码回去跟原文比对才能确认没有静默丢字节。附件服务自己也这么查,
|
|
67
|
+
* 这里先查一遍是为了在**动到磁盘之前**就把坏包挡掉。
|
|
68
|
+
*/
|
|
69
|
+
export declare function decodeBase64(data: string): Uint8Array | null;
|
|
70
|
+
/** 把请求体里的一项收敛成内部形状;形状不对返回 null。 */
|
|
71
|
+
export declare function readAttachInput(raw: unknown): AttachInput | null;
|
|
72
|
+
/** 一次附件上传的入口(路由 handler)。 */
|
|
73
|
+
export declare function createAttach(ctx: Context): {
|
|
74
|
+
handleAttach: (req: IncomingMessage, res: ServerResponse) => void;
|
|
75
|
+
handleAttachment: (req: IncomingMessage, res: ServerResponse) => void;
|
|
76
|
+
};
|
|
77
|
+
export {};
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 小窗历史里的附件:**持久化的引用**怎么进模型请求,以及图片预算怎么降级。
|
|
3
|
+
*
|
|
4
|
+
* 为什么要单独一个模块:这段逻辑全是**纯函数**(形状收敛 / 预算规划 / 内容块重建),
|
|
5
|
+
* 它决定了"第 N 轮还能不能看见第 1 轮那张图",是最容易写错、又最难人工发现的地方 ——
|
|
6
|
+
* 单独放出来才测得动(见 tests/unit/history-attachments.test.mjs)。
|
|
7
|
+
*
|
|
8
|
+
* ── 三条设计约束 ──
|
|
9
|
+
*
|
|
10
|
+
* ① **只回传引用,不回传字节**。历史里存的是 `/api/attach` 给的持久引用
|
|
11
|
+
* (`{attachmentId:'sha256:…', name, bytes, mediaType, width, height}`),
|
|
12
|
+
* 和主会话往会话事件里写的是同一套形状。字节只在附件服务里存一份。
|
|
13
|
+
*
|
|
14
|
+
* ② **图片有预算,超了退化成一行文字**。小窗直接调 `ctx.llm.stream()`,不走 agent loop,
|
|
15
|
+
* 所以吃不到 `dsh-compaction-image-offload`(它挂在 `agent/request-error` 这个
|
|
16
|
+
* agent-loop 才派发的 waterfall 上)。历史里的图要是不管,每多问一轮就重发一遍,
|
|
17
|
+
* token 会一路涨上去 —— 所以这里自己卡预算:**从最近往前数**,新图优先,
|
|
18
|
+
* 超出的老图换成一行为模型可读的说明(照 dsh-llm 那句 offloaded 措辞的风格写,
|
|
19
|
+
* 模型在别处见过同款说法)。
|
|
20
|
+
*
|
|
21
|
+
* ③ **文件不占图片预算**。文件本来就不进请求体:dsh-llm 会把它投影成
|
|
22
|
+
* "名字 + 字节数 + 只读路径"一行文字,模型需要时用文件工具按路径去读。
|
|
23
|
+
* 这行的成本很低,而且"能读回来"正是持久化它的全部意义 —— 所以文件只要限个条数就行。
|
|
24
|
+
*/
|
|
25
|
+
import type { ContentBlock } from '@deepseek-ai/dsh-llm';
|
|
26
|
+
/** 历史里最多回带几张**图片**(当前这一轮的附件也算在这个额度里)。 */
|
|
27
|
+
export declare const HISTORY_IMAGE_MAX = 2;
|
|
28
|
+
/** 历史回带图片的总字节上限(规范化后的字节,取自引用里的 bytes)。 */
|
|
29
|
+
export declare const HISTORY_IMAGE_BYTES: number;
|
|
30
|
+
/** 历史里最多回带几个**文件**引用(每个只投影成一行路径文字)。 */
|
|
31
|
+
export declare const HISTORY_FILE_MAX = 8;
|
|
32
|
+
/** 单轮最多认几件附件(客户端被改坏、或有人手写请求时的护栏)。 */
|
|
33
|
+
export declare const HISTORY_ATTACHMENTS_PER_TURN_MAX = 10;
|
|
34
|
+
/** 附件引用里我们**只**认这几个字段 —— 其余一律丢掉。 */
|
|
35
|
+
export interface AttachmentRefLike {
|
|
36
|
+
attachmentId: string;
|
|
37
|
+
name?: string;
|
|
38
|
+
bytes?: number;
|
|
39
|
+
mediaType?: string;
|
|
40
|
+
width?: number;
|
|
41
|
+
height?: number;
|
|
42
|
+
}
|
|
43
|
+
/** 历史里的一条附件(与 /api/attach 回给客户端、客户端又回传的形状一致)。 */
|
|
44
|
+
export interface HistoryAttachment {
|
|
45
|
+
kind: 'image' | 'file';
|
|
46
|
+
ref: AttachmentRefLike;
|
|
47
|
+
}
|
|
48
|
+
/** 预算规划的结果:每轮一份内容块 + 几个计数(计数只用于上报/诊断)。 */
|
|
49
|
+
export interface HistoryContentPlan {
|
|
50
|
+
blocks: ContentBlock[][];
|
|
51
|
+
/**
|
|
52
|
+
* **这次请求真的进了消息**的附件(按轮次先后,含被降级掉的?不含 —— 只列真进去了的)。
|
|
53
|
+
*
|
|
54
|
+
* 它存在的唯一理由是给文件工具发一张"访客名单":模型只该读得到它**看得见**的文件,
|
|
55
|
+
* 而"看得见"这件事的唯一定义就是"这次请求里真的拼进了内容块"。
|
|
56
|
+
* 所以名单不另算一套口径,直接用这份(口径一致,不会漂)。
|
|
57
|
+
*/
|
|
58
|
+
kept: HistoryAttachment[];
|
|
59
|
+
keptImages: number;
|
|
60
|
+
omittedImages: number;
|
|
61
|
+
keptFiles: number;
|
|
62
|
+
omittedFiles: number;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* 收敛一个附件引用:**必须**是带 `attachmentId` 字符串的对象。
|
|
66
|
+
*
|
|
67
|
+
* 只挑白名单字段是有意的:`body.history` 从浏览器来,指向哪里都不该让请求体跟着它走。
|
|
68
|
+
*/
|
|
69
|
+
export declare function readAttachmentRef(raw: unknown): AttachmentRefLike | null;
|
|
70
|
+
/** 收敛一条附件:形状不对、或 kind 不认识就整条丢掉。 */
|
|
71
|
+
export declare function readHistoryAttachment(raw: unknown): HistoryAttachment | null;
|
|
72
|
+
/**
|
|
73
|
+
* 收敛一轮的附件列表(带单轮条数上限)。
|
|
74
|
+
*
|
|
75
|
+
* 上限是**从后往前**保留的:客户端是按下标顺序 push 的,用户最后加的那件最要紧。
|
|
76
|
+
*/
|
|
77
|
+
export declare function readHistoryAttachments(raw: unknown): HistoryAttachment[];
|
|
78
|
+
/**
|
|
79
|
+
* 图片被预算挤掉时,模型看到的那行文字。
|
|
80
|
+
*
|
|
81
|
+
* 措辞照着 dsh-llm 的 `offloadedImageText` 写(identity + "ask the user to attach it again"),
|
|
82
|
+
* 这样模型在别处见过同款说法 —— 它知道这是"图被省略了",而不是"用户没附图"。
|
|
83
|
+
*/
|
|
84
|
+
export declare function omittedImageText(ref: AttachmentRefLike): string;
|
|
85
|
+
/** 文件引用被条数上限挤掉时的那行文字。 */
|
|
86
|
+
export declare function omittedFileText(ref: AttachmentRefLike): string;
|
|
87
|
+
/**
|
|
88
|
+
* 把客户端传来的历史轮次重建成**每轮一份内容块**,并按预算决定图片是回带还是降级。
|
|
89
|
+
*
|
|
90
|
+
* @param turns - 客户端给的历史(`[{role, text, attachments?}]`),顺序 = 从旧到新。
|
|
91
|
+
* @param current - **当前这一轮**的附件;它已经占了额度(用户刚附上的图必须发出去,
|
|
92
|
+
* 但总张数仍要封顶,否则"历史 2 张 + 本轮 1 张"会逐轮往上叠)。
|
|
93
|
+
* @returns 与 `turns` 等长(下标对齐)的内容块,外加几个计数。
|
|
94
|
+
*
|
|
95
|
+
* 返回 `[]` 表示"这一轮没有可进模型的内容"(既没文字也没附件)—— 调用方据此跳过它,
|
|
96
|
+
* 与从前的 `if (!text) continue` 等价。
|
|
97
|
+
*/
|
|
98
|
+
export declare function historyContentBlocks(turns: readonly unknown[], current?: readonly HistoryAttachment[]): HistoryContentPlan;
|
|
99
|
+
/**
|
|
100
|
+
* 这个失败像不像"附件读不回来了"。
|
|
101
|
+
*
|
|
102
|
+
* 为什么需要:引用一旦落进历史,它的寿命就**超过**了那一轮 —— 而对象仓里的字节
|
|
103
|
+
* 并不会跟着历史一起管理(附件服务不自动删除,但用户可能手动清理)。
|
|
104
|
+
* 那时每一轮都会撞 `Attachment object is missing.`,整个小窗等于废了。
|
|
105
|
+
* 判据取宽一点(码前缀 + 关键措辞),因为这条错误是**穿过** llm 适配器上来的,
|
|
106
|
+
* 码可能已经被包成 UNKNOWN,只剩措辞还认得出来。
|
|
107
|
+
*/
|
|
108
|
+
export declare function looksLikeAttachmentFailure(message: unknown, code?: unknown): boolean;
|
package/lib/types/host/http.d.ts
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import type { ServerResponse, IncomingMessage } from 'node:http';
|
|
2
2
|
/** 单次请求体上限(字节)。 */
|
|
3
3
|
export declare const BODY_LIMIT: number;
|
|
4
|
+
/**
|
|
5
|
+
* 附件上传的请求体上限(字节)。
|
|
6
|
+
*
|
|
7
|
+
* 比 BODY_LIMIT 大得多:附件是 base64 传的(体积 ×4/3),一张 20 MiB 的图到这里就 ~27 MiB。
|
|
8
|
+
* 单独开一个常量而不是把 BODY_LIMIT 调大 —— 提示词那条路仍然只该有 512 KiB。
|
|
9
|
+
*/
|
|
10
|
+
export declare const ATTACH_BODY_LIMIT: number;
|
|
4
11
|
/** 写一条 SSE 事件。 */
|
|
5
12
|
export declare function sse(res: ServerResponse, payload: unknown): void;
|
|
6
13
|
export declare function sendJson(res: ServerResponse, status: number, body: unknown): void;
|
|
@@ -37,3 +37,24 @@ export declare function runTool(ctx: Context, name: string, args: unknown, signa
|
|
|
37
37
|
content: ContentBlock[];
|
|
38
38
|
isError: boolean;
|
|
39
39
|
}>;
|
|
40
|
+
/**
|
|
41
|
+
* 文件工具这道门:**项目内放行;本次用户亲手附带的文件也放行**。
|
|
42
|
+
*
|
|
43
|
+
* 为什么需要第二张名单:附件的只读副本存在 `~/.dsh/attachments/…`(附件仓),
|
|
44
|
+
* 而 `readRoot` 默认是会话工作目录 —— 两者没有交集。可 dsh-llm 交给模型的
|
|
45
|
+
* 文件句柄文本明确写着"用你的文件工具去读那个路径,需要内容时就读",
|
|
46
|
+
* 于是模型**必然**去读、**必然**被拒,工具轮就这么被烧光:
|
|
47
|
+
* 实测连续两轮 `emitted=0 / finish=tool-calls`,最后只剩
|
|
48
|
+
* 「工具查询完成了,但模型没有产出正文」那句兜底 —— 附文件等于白附。
|
|
49
|
+
*
|
|
50
|
+
* 为什么不是把 readRoot 调大:那等于给**整段对话**(以及项目外的任意路径)开口子。
|
|
51
|
+
* 这里只放行"这次请求里真的拼进消息的那些文件"(路径由附件服务按内容哈希推出,
|
|
52
|
+
* 名字还有 `ref.name === fileLeafName(ref.name)` 的校验),
|
|
53
|
+
* 所以放开的范围严格等于用户的意图,边界其余部分一字不动。
|
|
54
|
+
*
|
|
55
|
+
* @param root - 会话工作目录(空 = 不限)
|
|
56
|
+
* @param target - 模型请求的路径(原样,未解析)
|
|
57
|
+
* @param attached - 本次附带的文件绝对路径集合(已 `resolve` 过)
|
|
58
|
+
* @returns 是否放行
|
|
59
|
+
*/
|
|
60
|
+
export declare function isReadAllowed(root: string, target: string, attached?: ReadonlySet<string>): boolean;
|
|
@@ -19,6 +19,8 @@ export interface AnalyzeBody {
|
|
|
19
19
|
key?: unknown;
|
|
20
20
|
parts?: unknown;
|
|
21
21
|
pinned?: unknown;
|
|
22
|
+
/** 小窗历史:这段对话**没有解读**("跳过翻译与详解、直接追问"那条路);回放时据此不画「翻译」一节。 */
|
|
23
|
+
skipped?: unknown;
|
|
22
24
|
/** 单次请求的推理档位覆盖(off / low / high / max);不传用插件配置。 */
|
|
23
25
|
effort?: unknown;
|
|
24
26
|
/** 小窗的「模型」控件:显式指定 provider + model(按清单校验,缺省跟随会话默认)。 */
|
|
@@ -32,6 +34,11 @@ export interface AnalyzeBody {
|
|
|
32
34
|
question?: unknown;
|
|
33
35
|
/** 追问模式下的历史轮次:[{ role: 'user' | 'assistant', text }]。 */
|
|
34
36
|
history?: unknown;
|
|
37
|
+
/**
|
|
38
|
+
* 这一轮追问带的附件:[{ kind: 'image' | 'file', ref }],ref 是 /api/attach 存好之后的持久引用。
|
|
39
|
+
* 图片 → ImageBlock(模型直接看);文件 → FileBlock(dsh-llm 投影成"名字 + 字节数 + 只读路径"一行)。
|
|
40
|
+
*/
|
|
41
|
+
attachments?: unknown;
|
|
35
42
|
/** 升格为正式会话时的入参。 */
|
|
36
43
|
translation?: unknown;
|
|
37
44
|
detail?: unknown;
|