@whispering233/ai-editor-agent 0.0.30 → 0.0.32
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/dist/index.d.ts +2 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -9
- package/dist/index.js.map +1 -1
- package/dist/runtime/events.d.ts +21 -0
- package/dist/runtime/events.d.ts.map +1 -0
- package/dist/runtime/events.js +235 -0
- package/dist/runtime/events.js.map +1 -0
- package/dist/runtime/index.d.ts +11 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +12 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/message-projection.d.ts +57 -0
- package/dist/runtime/message-projection.d.ts.map +1 -0
- package/dist/runtime/message-projection.js +94 -0
- package/dist/runtime/message-projection.js.map +1 -0
- package/dist/runtime/paths.d.ts +11 -0
- package/dist/runtime/paths.d.ts.map +1 -0
- package/dist/runtime/paths.js +23 -0
- package/dist/runtime/paths.js.map +1 -0
- package/dist/runtime/project-runtime.d.ts +57 -0
- package/dist/runtime/project-runtime.d.ts.map +1 -0
- package/dist/runtime/project-runtime.js +78 -0
- package/dist/runtime/project-runtime.js.map +1 -0
- package/dist/runtime/proposals.d.ts +85 -0
- package/dist/runtime/proposals.d.ts.map +1 -0
- package/dist/runtime/proposals.js +173 -0
- package/dist/runtime/proposals.js.map +1 -0
- package/dist/runtime/resources.d.ts +14 -0
- package/dist/runtime/resources.d.ts.map +1 -0
- package/dist/runtime/resources.js +39 -0
- package/dist/runtime/resources.js.map +1 -0
- package/dist/runtime/sessions.d.ts +35 -0
- package/dist/runtime/sessions.d.ts.map +1 -0
- package/dist/runtime/sessions.js +89 -0
- package/dist/runtime/sessions.js.map +1 -0
- package/dist/{prompts.d.ts → runtime/system-prompt.d.ts} +4 -12
- package/dist/runtime/system-prompt.d.ts.map +1 -0
- package/dist/runtime/system-prompt.js +22 -0
- package/dist/runtime/system-prompt.js.map +1 -0
- package/dist/runtime/tool-result.d.ts +12 -0
- package/dist/runtime/tool-result.d.ts.map +1 -0
- package/dist/runtime/tool-result.js +53 -0
- package/dist/runtime/tool-result.js.map +1 -0
- package/dist/runtime/tools.d.ts +28 -0
- package/dist/runtime/tools.d.ts.map +1 -0
- package/dist/runtime/tools.js +54 -0
- package/dist/runtime/tools.js.map +1 -0
- package/package.json +5 -4
- package/dist/context.d.ts +0 -96
- package/dist/context.d.ts.map +0 -1
- package/dist/context.js +0 -149
- package/dist/context.js.map +0 -1
- package/dist/executor.d.ts +0 -86
- package/dist/executor.d.ts.map +0 -1
- package/dist/executor.js +0 -259
- package/dist/executor.js.map +0 -1
- package/dist/prompts.d.ts.map +0 -1
- package/dist/prompts.js +0 -29
- package/dist/prompts.js.map +0 -1
- package/dist/run.d.ts +0 -182
- package/dist/run.d.ts.map +0 -1
- package/dist/run.js +0 -430
- package/dist/run.js.map +0 -1
- package/dist/session.d.ts +0 -60
- package/dist/session.d.ts.map +0 -1
- package/dist/session.js +0 -204
- package/dist/session.js.map +0 -1
package/dist/session.js
DELETED
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
// @whispering233/ai-editor-agent 会话管理(S7.1)
|
|
2
|
-
//
|
|
3
|
-
// 孤儿半对整对丢弃 / 末条约束)、packages/llm/src/types.ts(LLMMessage 四角色 wire 形态)、
|
|
4
|
-
// packages/db/src/queries/chat.ts(数据层参照——本包**不依赖 db**,仅对齐重组算法语义)。
|
|
5
|
-
//
|
|
6
|
-
// 架构边界:本模块是**纯内存消息处理**(函数式、无 I/O)——输入历史消息数组 + 运行时
|
|
7
|
-
// 追加消息,输出裁剪后的喂回格式;持久化读写由 server 层负责(db 包 chat 查询)。
|
|
8
|
-
// 使用链(S7.3 主循环消费):loadHistory(服务重启续聊)→ appendMessage(运行时追加)→
|
|
9
|
-
// trimSession(滑动窗口成对裁剪)→ buildPayload(喂回格式 + 末条约束)→
|
|
10
|
-
// 失败重试时 retryPayload(复用原 payload,不追加失败轮半条 assistant)。
|
|
11
|
-
// ============ 内部辅助 ============
|
|
12
|
-
/**
|
|
13
|
-
* 行内 tool_calls(unknown[],来自 chat_messages.tool_calls JSON 列)→ wire 形态。
|
|
14
|
-
* 任一调用形态不合法(缺 id / type 非 function / function 字段缺失)即返回 null——
|
|
15
|
-
* 缺 id 即孤儿半对,该 assistant 消息与其工具结果**整组丢弃**(由调用方判定)。
|
|
16
|
-
*/
|
|
17
|
-
function toToolCallRequests(raw) {
|
|
18
|
-
const out = [];
|
|
19
|
-
for (const item of raw) {
|
|
20
|
-
if (typeof item !== "object" || item === null)
|
|
21
|
-
return null;
|
|
22
|
-
const call = item;
|
|
23
|
-
const fn = call.function;
|
|
24
|
-
if (typeof call.id !== "string" ||
|
|
25
|
-
call.type !== "function" ||
|
|
26
|
-
typeof fn !== "object" ||
|
|
27
|
-
fn === null ||
|
|
28
|
-
typeof fn.name !== "string" ||
|
|
29
|
-
typeof fn.arguments !== "string") {
|
|
30
|
-
return null;
|
|
31
|
-
}
|
|
32
|
-
out.push({
|
|
33
|
-
id: call.id,
|
|
34
|
-
type: "function",
|
|
35
|
-
function: {
|
|
36
|
-
name: fn.name,
|
|
37
|
-
arguments: fn.arguments,
|
|
38
|
-
},
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
return out;
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* 收集全部 tool 结果:tool_call_id → content(同一 id 多条结果取最先到达者)。
|
|
45
|
-
* 与 db 包 reassembleMessages 的收集口径一致(本包不依赖 db,按文档独立实现)。
|
|
46
|
-
*/
|
|
47
|
-
function collectToolResults(messages) {
|
|
48
|
-
const toolResults = new Map();
|
|
49
|
-
for (const m of messages) {
|
|
50
|
-
if (m.role === "tool" && !toolResults.has(m.tool_call_id)) {
|
|
51
|
-
toolResults.set(m.tool_call_id, m.content);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
return toolResults;
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* 把消息序列切成「配对块」(成对重组算法):
|
|
58
|
-
* - user 消息:独立块
|
|
59
|
-
* - assistant 无 tool_calls:独立块
|
|
60
|
-
* - assistant 带 tool_calls:全部调用有对应结果才成块(assistant + 结果按 tool_calls 顺序);
|
|
61
|
-
* 任一调用缺结果 / 形态不合法 → 孤儿半对,**整块丢弃**
|
|
62
|
-
* - tool 消息:仅作为其 assistant 块的组成部分;未被任何 assistant 引用的孤儿在此自然丢弃
|
|
63
|
-
* 输出天然无孤儿,是成对裁剪与重建喂回的共同基础。
|
|
64
|
-
*/
|
|
65
|
-
function toBlocks(messages) {
|
|
66
|
-
const toolResults = collectToolResults(messages);
|
|
67
|
-
const blocks = [];
|
|
68
|
-
for (const m of messages) {
|
|
69
|
-
if (m.role === "user") {
|
|
70
|
-
blocks.push({ messages: [m] });
|
|
71
|
-
continue;
|
|
72
|
-
}
|
|
73
|
-
if (m.role === "assistant") {
|
|
74
|
-
const calls = m.tool_calls ?? [];
|
|
75
|
-
if (calls.length === 0) {
|
|
76
|
-
blocks.push({ messages: [m] });
|
|
77
|
-
continue;
|
|
78
|
-
}
|
|
79
|
-
// 任一调用缺对应 tool 结果 → 整组丢弃(不部分保留)
|
|
80
|
-
if (!calls.every((c) => toolResults.has(c.id)))
|
|
81
|
-
continue;
|
|
82
|
-
blocks.push({
|
|
83
|
-
messages: [
|
|
84
|
-
m,
|
|
85
|
-
...calls.map((c) => ({
|
|
86
|
-
role: "tool",
|
|
87
|
-
content: toolResults.get(c.id) ?? "",
|
|
88
|
-
tool_call_id: c.id,
|
|
89
|
-
})),
|
|
90
|
-
],
|
|
91
|
-
});
|
|
92
|
-
continue;
|
|
93
|
-
}
|
|
94
|
-
// role === "tool":仅作为上面 assistant 块的组成部分;孤儿在此自然丢弃
|
|
95
|
-
}
|
|
96
|
-
return blocks;
|
|
97
|
-
}
|
|
98
|
-
// ============ 状态机函数链(加载历史 → 重建 → 追加 → 裁剪 → 喂回) ============
|
|
99
|
-
/** 新建空会话(初始状态;随后 loadHistory 或 appendMessage 填充) */
|
|
100
|
-
export function createSession() {
|
|
101
|
-
return [];
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* 加载历史:持久化行 → 运行时消息(成对重组)。
|
|
105
|
-
* 输入 ChatMessageRow[](由 server 层经 db 包查询得到),纯内存重组、无 I/O。
|
|
106
|
-
* - 按 created_at 升序稳定排序(同时间戳保持输入序,与 db 查询口径一致)
|
|
107
|
-
* - 孤儿半对整对丢弃(tool_call 已写 tool_result 未写,或反之)
|
|
108
|
-
* - 输出为无孤儿的完整配对序列,可直接 trimSession / buildPayload
|
|
109
|
-
*/
|
|
110
|
-
export function loadHistory(rows) {
|
|
111
|
-
const sorted = [...rows].sort((a, b) => a.created_at.localeCompare(b.created_at));
|
|
112
|
-
// 预收集 tool 结果(同一 id 多条结果取最先到达者)
|
|
113
|
-
const toolResults = new Map();
|
|
114
|
-
for (const r of sorted) {
|
|
115
|
-
if (r.role === "tool" && r.tool_call_id !== null && !toolResults.has(r.tool_call_id)) {
|
|
116
|
-
toolResults.set(r.tool_call_id, r.content);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
const out = [];
|
|
120
|
-
for (const r of sorted) {
|
|
121
|
-
if (r.role === "user") {
|
|
122
|
-
out.push({ role: "user", content: r.content ?? "" });
|
|
123
|
-
continue;
|
|
124
|
-
}
|
|
125
|
-
if (r.role === "assistant") {
|
|
126
|
-
const rawCalls = r.tool_calls;
|
|
127
|
-
if (rawCalls == null || rawCalls.length === 0) {
|
|
128
|
-
// 普通 assistant(无工具调用):原样保留
|
|
129
|
-
out.push({ role: "assistant", content: r.content });
|
|
130
|
-
continue;
|
|
131
|
-
}
|
|
132
|
-
// 有 tool_calls:形态必须合法且全部配对,否则孤儿整组丢弃
|
|
133
|
-
const calls = toToolCallRequests(rawCalls);
|
|
134
|
-
if (calls === null)
|
|
135
|
-
continue;
|
|
136
|
-
if (!calls.every((c) => toolResults.has(c.id)))
|
|
137
|
-
continue;
|
|
138
|
-
out.push({ role: "assistant", content: r.content, tool_calls: calls });
|
|
139
|
-
for (const c of calls) {
|
|
140
|
-
out.push({ role: "tool", content: toolResults.get(c.id) ?? "", tool_call_id: c.id });
|
|
141
|
-
}
|
|
142
|
-
continue;
|
|
143
|
-
}
|
|
144
|
-
// role === "tool":仅作为上面 assistant 的结果被引用;孤儿在此自然丢弃
|
|
145
|
-
}
|
|
146
|
-
return out;
|
|
147
|
-
}
|
|
148
|
-
/** 追加一条运行时消息(纯函数,返回新数组,不修改入参) */
|
|
149
|
-
export function appendMessage(session, message) {
|
|
150
|
-
return [...session, message];
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* 滑动窗口成对裁剪(tool_call 与对应 tool_result **同裁同留**)。
|
|
154
|
-
* 以「配对块」为单位从尾部保留,最多 maxCount 条:
|
|
155
|
-
* - 窗口边界恰在 tool 消息处时**不拆对**——放不下的块整块丢弃(宁可窗口略小,不拆散配对)
|
|
156
|
-
* - 裁剪前先经 toBlocks 清理孤儿(孤儿半对整对丢弃,不进入窗口)
|
|
157
|
-
* - 输出不含孤儿;末条约束(末条必须 user/tool)由 buildPayload 统一兜底修正
|
|
158
|
-
*/
|
|
159
|
-
export function trimSession(session, maxCount) {
|
|
160
|
-
if (maxCount <= 0)
|
|
161
|
-
return [];
|
|
162
|
-
const blocks = toBlocks(session);
|
|
163
|
-
const kept = [];
|
|
164
|
-
// 从尾部向前累计;放不下的块整块跳过(同裁同留,不拆对)
|
|
165
|
-
for (let i = blocks.length - 1; i >= 0; i--) {
|
|
166
|
-
const block = blocks[i];
|
|
167
|
-
if (block.messages.length + kept.length > maxCount)
|
|
168
|
-
continue;
|
|
169
|
-
kept.unshift(...block.messages);
|
|
170
|
-
if (kept.length >= maxCount)
|
|
171
|
-
break;
|
|
172
|
-
}
|
|
173
|
-
return kept;
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* 输出喂回模型的 messages 数组(末条约束的最终防御)。
|
|
177
|
-
* 末条**必须**是 user 或 tool 消息——assistant 结尾 DeepSeek 直接拒绝。
|
|
178
|
-
* 修正策略(最简防御):从尾部丢弃连续的 assistant 消息。tool 消息的配对 assistant
|
|
179
|
-
* 位于其**前方**,丢弃尾部 assistant 不会产生新孤儿;带 tool_calls 的 assistant 若以
|
|
180
|
-
* 结尾出现(典型:失败轮半条产物),其 tool 结果本就不存在,整条丢弃即「失败轮半条
|
|
181
|
-
* assistant 不喂回」。输入应为 loadHistory / trimSession 处理过的无孤儿序列;
|
|
182
|
-
* 返回空数组时调用方(S7.3)应视为无有效上下文(需重新引导用户输入)。
|
|
183
|
-
*/
|
|
184
|
-
export function buildPayload(session) {
|
|
185
|
-
let messages = session;
|
|
186
|
-
while (messages.length > 0 && messages[messages.length - 1].role === "assistant") {
|
|
187
|
-
messages = messages.slice(0, -1);
|
|
188
|
-
}
|
|
189
|
-
return messages;
|
|
190
|
-
}
|
|
191
|
-
/**
|
|
192
|
-
* 重试 payload 复用(末条约束补充,S7.3 主循环消费)。
|
|
193
|
-
* 模型调用失败重试时**必须复用原请求的 messages 数组**——绝不追加失败轮的半条
|
|
194
|
-
* assistant 产物(失败轮未产出完整回复,其内容不入重试序列)。
|
|
195
|
-
* 本函数返回原数组的浅拷贝,防御调用方原地修改;调用方直接传原 payload 亦等效。
|
|
196
|
-
*/
|
|
197
|
-
export function retryPayload(payload) {
|
|
198
|
-
return payload.slice();
|
|
199
|
-
}
|
|
200
|
-
/** 服务重启续聊组合入口:加载历史 → 成对裁剪(喂回格式由 buildPayload 兜底) */
|
|
201
|
-
export function restoreSession(rows, maxCount) {
|
|
202
|
-
return trimSession(loadHistory(rows), maxCount);
|
|
203
|
-
}
|
|
204
|
-
//# sourceMappingURL=session.js.map
|
package/dist/session.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|