@whispering233/ai-editor-agent 0.0.20 → 0.0.26
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/context.d.ts +30 -30
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +11 -12
- package/dist/context.js.map +1 -1
- package/dist/executor.d.ts +25 -25
- package/dist/executor.d.ts.map +1 -1
- package/dist/executor.js +23 -36
- package/dist/executor.js.map +1 -1
- package/dist/prompts.d.ts +5 -5
- package/dist/prompts.d.ts.map +1 -1
- package/dist/prompts.js +6 -7
- package/dist/prompts.js.map +1 -1
- package/dist/run.d.ts +54 -54
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +53 -69
- package/dist/run.js.map +1 -1
- package/dist/session.d.ts +4 -4
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +11 -12
- package/dist/session.js.map +1 -1
- package/package.json +4 -4
package/dist/context.d.ts
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import type { LLMMessage, LLMUsage } from "@whispering233/ai-editor-llm";
|
|
2
2
|
import { type ToolDefinition } from "@whispering233/ai-editor-tools";
|
|
3
3
|
import { type SessionMessage } from "./session.js";
|
|
4
|
-
/** 分层 token
|
|
4
|
+
/** 分层 token 预算(系统 ~500 / 聚焦 ~3000 / 历史 ~6000;可整体或单项覆盖)。
|
|
5
5
|
* 分层合计约 11.5K,远低于 DeepSeek 64K 窗口——各层独立校验、不设总预算校验(YAGNI:
|
|
6
6
|
* 分层裁剪已保证各层在其预算内,窗口余量充足) */
|
|
7
7
|
export interface ContextBudgets {
|
|
8
|
-
/** 基础 system 层:内核 + 项目提示词 +
|
|
8
|
+
/** 基础 system 层:内核 + 项目提示词 + 临时指令( ~500;超限仅记录不裁剪——用户内容不可裁) */
|
|
9
9
|
system: number;
|
|
10
|
-
/**
|
|
10
|
+
/** 聚焦上下文层( ~3000;超限截断并显式告知) */
|
|
11
11
|
focus: number;
|
|
12
|
-
/**
|
|
12
|
+
/** 对话历史层( ~6000;超限走 session 成对裁剪——同裁同留不拆对) */
|
|
13
13
|
history: number;
|
|
14
14
|
}
|
|
15
15
|
export declare const DEFAULT_CONTEXT_BUDGETS: ContextBudgets;
|
|
@@ -18,32 +18,32 @@ export type ToolListEntry = Pick<ToolDefinition, "name" | "description">;
|
|
|
18
18
|
/** buildContext 输入:除 history 外全部可空(无聚焦 / 无项目提示词 / 无临时指令均为合法态) */
|
|
19
19
|
export interface BuildContextInput {
|
|
20
20
|
/**
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
21
|
+
* 会话历史(session 状态;本层负责超预算成对裁剪 + 末条约束收尾)。
|
|
22
|
+
* **前置条件**:必须含至少一条 user/tool 消息( 末条约束);空历史属调用方错误——
|
|
23
|
+
* S7.3 应在 history 为空时走引导分支(不发请求),勿传入空数组(buildPayload 空数组
|
|
24
|
+
* 语义同源:空历史 = 无有效上下文,两者互相印证)
|
|
25
|
+
*/
|
|
26
26
|
history: SessionMessage[];
|
|
27
27
|
/** 内核提示词(默认 KERNEL_PROMPT;测试可覆盖) */
|
|
28
28
|
kernelPrompt?: string;
|
|
29
|
-
/**
|
|
29
|
+
/** 项目提示词( 项目层; 起数据源 = 项目目录 文件内容,调用方读取后传入;可空) */
|
|
30
30
|
projectPrompt?: string;
|
|
31
|
-
/**
|
|
31
|
+
/** 临时指令( 临时层,即时输入不持久化;可空) */
|
|
32
32
|
instruction?: string;
|
|
33
|
-
/**
|
|
33
|
+
/** 聚焦上下文文本( 聚焦层,调用方查询实体/大纲节点后拼好传入;空/缺省 = 无聚焦) */
|
|
34
34
|
focus?: string;
|
|
35
35
|
/** 工具清单(默认内部 listTools();测试可注入 mock) */
|
|
36
36
|
tools?: ToolListEntry[];
|
|
37
37
|
/**
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
38
|
+
* 最近一次成功响应的 usage 基线(本层触发裁剪后重置为 null)。
|
|
39
|
+
* **口径**(ora S7.3 审核 S1,与 run.ts toHistoryBaseline / llm token.ts 三处等价表述):
|
|
40
|
+
* 调用方(S7.3)须换算为「历史段」真实分量传入——以 usage.prompt_tokens 为起点减
|
|
41
|
+
* system + toolList + focus 估算(completion 属输出、不占 prompt_tokens,无需扣除);
|
|
42
|
+
* 若以 total_tokens 为起点则再减 completion(两式等价)。meta.tokens 已提供
|
|
43
|
+
* system/toolList/focus 各层估算可供换算;直接传原始 total_tokens 会与非历史层重复计费
|
|
44
|
+
*/
|
|
45
45
|
lastUsage?: LLMUsage | null;
|
|
46
|
-
/**
|
|
46
|
+
/** 分层预算覆盖(缺省用 常量) */
|
|
47
47
|
budgets?: Partial<ContextBudgets>;
|
|
48
48
|
}
|
|
49
49
|
/** buildContext 输出:完整喂回 messages + 各层估算 + 裁剪/截断/基线记录 */
|
|
@@ -72,25 +72,25 @@ export interface AssembledContext {
|
|
|
72
72
|
historyTrimmed: boolean;
|
|
73
73
|
/** 裁剪后历史条数 */
|
|
74
74
|
historyMessageCount: number;
|
|
75
|
-
/** 基线被重置(触发裁剪/重排后旧 usage
|
|
75
|
+
/** 基线被重置(触发裁剪/重排后旧 usage 不再可信—— 防预算漂移) */
|
|
76
76
|
lastUsageReset: boolean;
|
|
77
77
|
/**
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
78
|
+
* 生效基线:未触发裁剪时保留换算后的 lastUsage;触发后为 null。
|
|
79
|
+
* **回写(S7.3 接线)**:本层消费的 lastUsage 是「历史段」口径(见
|
|
80
|
+
* BuildContextInput.lastUsage);effectiveLastUsage 仅回写「是否重置」这一决策,
|
|
81
|
+
* S7.3 下一轮组装时仍须按换算公式从最新 usage 重新计算历史段分量传入
|
|
82
|
+
*/
|
|
83
83
|
effectiveLastUsage: LLMUsage | null;
|
|
84
84
|
};
|
|
85
85
|
}
|
|
86
86
|
/**
|
|
87
|
-
*
|
|
87
|
+
* 组装完整喂回上下文:
|
|
88
88
|
* 1. 基础 system = 内核 + 项目提示词 + 临时指令 + 工具清单(超 system 预算仅记录不裁剪)
|
|
89
89
|
* 2. 聚焦注入 = 独立 system 消息(有 focus 时;超预算截断并显式告知)
|
|
90
90
|
* 3. 历史 = 超预算成对裁剪(同裁同留)+ 末条约束收尾(buildPayload——输出末条恒 user/tool)
|
|
91
|
-
* 4. usage 基线:未触发裁剪时保留 lastUsage
|
|
92
|
-
*
|
|
93
|
-
*
|
|
91
|
+
* 4. usage 基线:未触发裁剪时保留 lastUsage(真实用量优先);一旦触发裁剪即重置为
|
|
92
|
+
* null(旧 usage 描述裁剪前前缀,沿用会导致预算漂移)——meta.effectiveLastUsage 反映
|
|
93
|
+
* 生效基线,S7.3 应回写该值作为下一轮输入
|
|
94
94
|
*/
|
|
95
95
|
export declare function buildContext(input: BuildContextInput): AssembledContext;
|
|
96
96
|
//# sourceMappingURL=context.d.ts.map
|
package/dist/context.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAEzE,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAShF,OAAO,EAA6B,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAI9E;;4BAE4B;AAC5B,MAAM,WAAW,cAAc;IAC9B,6DAA6D;IAC5D,MAAM,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC7C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,uBAAuB,EAAE,cAIrC,CAAC;AAIF,4DAA4D;AAC5D,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC;AAEzE,iEAAiE;AACjE,MAAM,WAAW,iBAAiB;IACjC;;;;;MAKE;IACD,OAAO,EAAE,cAAc,EAAE,CAAC;IAC3B,oCAAoC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACvB,gDAAgD;IAC/C,aAAa,CAAC,EAAE,MAAM,CAAC;IACxB,6BAA6B;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACtB,iDAAiD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACvC,KAAK,CAAC,EAAE,aAAa,EAAE,CAAC;IACzB;;;;;;;MAOE;IACD,SAAS,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC7B,qBAAqB;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;CACnC;AAED,wDAAwD;AACxD,MAAM,WAAW,gBAAgB;IAChC,yEAAyE;IACxE,QAAQ,EAAE,UAAU,EAAE,CAAC;IACxB,yCAAyC;IACxC,MAAM,EAAE;QACT,0BAA0B;QACvB,MAAM,EAAE,MAAM,CAAC;QAClB,4CAA4C;QACzC,QAAQ,EAAE,MAAM,CAAC;QACpB,sBAAsB;QACnB,KAAK,EAAE,MAAM,CAAC;QACjB,eAAe;QACZ,OAAO,EAAE,MAAM,CAAC;QACnB,WAAW;QACR,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,IAAI,EAAE;QACP,oCAAoC;QACjC,gBAAgB,EAAE,OAAO,CAAC;QAC7B,mBAAmB;QAChB,cAAc,EAAE,OAAO,CAAC;QAC3B,uBAAuB;QACpB,cAAc,EAAE,OAAO,CAAC;QAC3B,cAAc;QACX,mBAAmB,EAAE,MAAM,CAAC;QAC/B,0CAA0C;QACvC,cAAc,EAAE,OAAO,CAAC;QAC3B;;;;;UAKE;QACC,kBAAkB,EAAE,QAAQ,GAAG,IAAI,CAAC;KACrC,CAAC;CACH;AAsED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,gBAAgB,CA2DvE"}
|
package/dist/context.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
// @whispering233/ai-editor-agent 上下文组装(S7.2)
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
// (提示词三层注入:内核 + 项目 + 临时)、doc/api/endpoints.md(POST /api/v1/chat 的
|
|
3
|
+
// 历史 ~6000;usage 基线——优先最近真实 usage,裁剪历史后重置基线防预算漂移)、
|
|
4
|
+
// (提示词三层注入:内核 + 项目 + 临时)、(POST /api/v1/chat 的
|
|
6
5
|
// context 字段 focus_entity_type/focus_entity_id/focus_node_id——聚焦数据由调用方查询后
|
|
7
6
|
// 以文本传入)、packages/llm/src/token.ts(estimateTokens / estimateMessagesTokens)、
|
|
8
7
|
// packages/tools/src/registry.ts(listTools 工具清单)。
|
|
@@ -10,7 +9,7 @@
|
|
|
10
9
|
// 架构边界:本模块**不依赖 db**——聚焦上下文文本与项目提示词均由调用方(S7.6 server 层)
|
|
11
10
|
// 查询后传入,context.ts 只做组装与预算控制;工具列表默认内部取 registry(agent 依赖 tools ✓)。
|
|
12
11
|
//
|
|
13
|
-
// 消费链(S7.3 主循环):SessionState → buildContext
|
|
12
|
+
// 消费链(S7.3 主循环):SessionState → buildContext(本层成对裁剪 + 基线重置)→
|
|
14
13
|
// 输出 LLMMessage[](system + 可选聚焦 system + 历史)直接喂给模型。
|
|
15
14
|
import { estimateMessagesTokens, estimateTokens } from "@whispering233/ai-editor-llm";
|
|
16
15
|
import { listTools } from "@whispering233/ai-editor-tools";
|
|
@@ -22,7 +21,7 @@ export const DEFAULT_CONTEXT_BUDGETS = {
|
|
|
22
21
|
history: 6000,
|
|
23
22
|
};
|
|
24
23
|
// ============ 内部组装辅助(纯函数) ============
|
|
25
|
-
/** 基础 system 文本:内核 + 项目提示词 +
|
|
24
|
+
/** 基础 system 文本:内核 + 项目提示词 + 临时指令( 三层注入,空层跳过) */
|
|
26
25
|
function buildSystemBase(kernel, project, instruction) {
|
|
27
26
|
const parts = [kernel];
|
|
28
27
|
if (project !== undefined && project.trim() !== "") {
|
|
@@ -41,7 +40,7 @@ function buildToolListText(tools) {
|
|
|
41
40
|
return `${TOOL_LIST_TITLE}\n${lines.join("\n")}`;
|
|
42
41
|
}
|
|
43
42
|
/**
|
|
44
|
-
*
|
|
43
|
+
* 聚焦文本按预算截断(显式告知,不静默丢数据):
|
|
45
44
|
* 按 chars/4 反推可保留字符数(预留截断提示空间),保留前缀 + 截断提示。
|
|
46
45
|
*/
|
|
47
46
|
function trimFocus(focus, maxTokens) {
|
|
@@ -53,7 +52,7 @@ function trimFocus(focus, maxTokens) {
|
|
|
53
52
|
return { text: focus.slice(0, keptChars) + FOCUS_TRUNCATION_NOTICE, truncated: true };
|
|
54
53
|
}
|
|
55
54
|
/**
|
|
56
|
-
* 历史按 token
|
|
55
|
+
* 历史按 token 预算成对裁剪:
|
|
57
56
|
* 用 trimSession 以「配对块」为单位裁剪(同裁同留不拆对),二分找预算内尽量多保留的
|
|
58
57
|
* 最大条数。裁剪后的估算**一律不带 usage 基线**——旧基线描述裁剪前前缀,沿用即预算漂移。
|
|
59
58
|
* 返回 { messages, trimmed }:trimmed=true 表示至少裁掉一条消息。
|
|
@@ -83,13 +82,13 @@ function trimHistoryToBudget(history, maxTokens) {
|
|
|
83
82
|
}
|
|
84
83
|
// ============ 主组装 ============
|
|
85
84
|
/**
|
|
86
|
-
*
|
|
85
|
+
* 组装完整喂回上下文:
|
|
87
86
|
* 1. 基础 system = 内核 + 项目提示词 + 临时指令 + 工具清单(超 system 预算仅记录不裁剪)
|
|
88
87
|
* 2. 聚焦注入 = 独立 system 消息(有 focus 时;超预算截断并显式告知)
|
|
89
88
|
* 3. 历史 = 超预算成对裁剪(同裁同留)+ 末条约束收尾(buildPayload——输出末条恒 user/tool)
|
|
90
|
-
* 4. usage 基线:未触发裁剪时保留 lastUsage
|
|
91
|
-
*
|
|
92
|
-
*
|
|
89
|
+
* 4. usage 基线:未触发裁剪时保留 lastUsage(真实用量优先);一旦触发裁剪即重置为
|
|
90
|
+
* null(旧 usage 描述裁剪前前缀,沿用会导致预算漂移)——meta.effectiveLastUsage 反映
|
|
91
|
+
* 生效基线,S7.3 应回写该值作为下一轮输入
|
|
93
92
|
*/
|
|
94
93
|
export function buildContext(input) {
|
|
95
94
|
const budgets = { ...DEFAULT_CONTEXT_BUDGETS, ...input.budgets };
|
|
@@ -113,7 +112,7 @@ export function buildContext(input) {
|
|
|
113
112
|
focusMessage = { role: "system", content: `${FOCUS_TITLE}\n${trimmed.text}` };
|
|
114
113
|
}
|
|
115
114
|
// ---- 3. 历史层(超预算成对裁剪 + 末条约束收尾) ----
|
|
116
|
-
// 预算判定优先真实 usage
|
|
115
|
+
// 预算判定优先真实 usage 基线;一旦判定超限触发裁剪,基线即重置
|
|
117
116
|
const withBaseline = estimateMessagesTokens(input.history, {
|
|
118
117
|
lastUsage: input.lastUsage ?? null,
|
|
119
118
|
});
|
package/dist/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,EAAE;AACF,
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|
package/dist/executor.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { type Proposal, type ToolContext } from "@whispering233/ai-editor-tools";
|
|
2
2
|
import type { ToolDispatcher } from "./run.js";
|
|
3
|
-
/** 提案 TTL
|
|
3
|
+
/** 提案 TTL(10 分钟;S7.5 confirm/reject 引用——超期按不存在处理) */
|
|
4
4
|
export declare const PROPOSAL_TTL_MS: number;
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
6
|
+
* 提案条数上限(超限淘汰 createdAt 最旧)。
|
|
7
7
|
* 决策原文未定数——取 200 为数量级防御:正常会话一轮最多 15 个提案、挂卡不确认的
|
|
8
8
|
* 残留按 TTL 自动过期,200 足以覆盖极端多轮场景且内存占用可忽略(防无限增长)。
|
|
9
9
|
*/
|
|
@@ -13,24 +13,24 @@ export interface ProposalStore {
|
|
|
13
13
|
/** 存入提案(TTL 从 createdAt 起算;先清过期、超限淘汰最旧) */
|
|
14
14
|
set(proposal: Proposal): void;
|
|
15
15
|
/**
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
* 按 id + 项目取:不存在 / 过期 / **跨项目** → null。
|
|
17
|
+
* 跨项目返回 null 即防御 PROPOSAL_PROJECT_MISMATCH 语义(
|
|
18
|
+
* 提案绑定 project_id,确认时校验与当前项目一致)。
|
|
19
|
+
*/
|
|
20
20
|
get(proposalId: string, projectId: string): Proposal | null;
|
|
21
21
|
/**
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
* 仅按 id 取(不校验项目):S7.5 区分「404 PROPOSAL_NOT_FOUND」与
|
|
23
|
+
* 「409 PROPOSAL_PROJECT_MISMATCH」用——get 返回 null 后 peek 仍可见 ⇒ 跨项目误操作。
|
|
24
|
+
* 过期条目同样视为不存在(惰性清理)。
|
|
25
|
+
*/
|
|
26
26
|
peek(proposalId: string): Proposal | null;
|
|
27
27
|
/**
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
* 按 id 移除单条(S7.5 一次性消费:confirm/reject 终态后移除—— 瞬态交互对象,
|
|
29
|
+
* 确认/拒绝动作即消费,残留只会让重复 confirm 产生重复执行或反复 409)。
|
|
30
|
+
* 与 clear 的区别:clear 清空全部(S7.6 切换项目用),remove 只移除指定提案。
|
|
31
|
+
*/
|
|
32
32
|
remove(proposalId: string): void;
|
|
33
|
-
/**
|
|
33
|
+
/** 清空全部项目提案(create/open/close 切换项目时由 S7.6 调用) */
|
|
34
34
|
clear(): void;
|
|
35
35
|
/** 当前仓内提案数(测试/诊断) */
|
|
36
36
|
size(): number;
|
|
@@ -44,7 +44,7 @@ export interface ProposalStoreOptions {
|
|
|
44
44
|
}
|
|
45
45
|
/**
|
|
46
46
|
* 创建提案仓实例。
|
|
47
|
-
* 过期策略:**惰性过期 +
|
|
47
|
+
* 过期策略:**惰性过期 + 按需清理**(「超期自动清除」落地)——get/peek 只清理命中的
|
|
48
48
|
* 单条,set 前扫全仓清理;无定时器(定时器引入时钟耦合且小仓无必要,测试用假时钟直接断言)。
|
|
49
49
|
* 淘汰策略:条数超限时淘汰 createdAt **最旧**的提案(sweep 过期后仍满则循环淘汰最旧)。
|
|
50
50
|
*/
|
|
@@ -53,7 +53,7 @@ export declare function createProposalStore(options?: ProposalStoreOptions): Pro
|
|
|
53
53
|
export declare const defaultProposalStore: ProposalStore;
|
|
54
54
|
/**
|
|
55
55
|
* 提案 build 层入口签名(args 已过 argsSchema 校验——执行前 safeParse 的 parsed.data)。
|
|
56
|
-
* run 层裁剪只返回 { proposal_id, summary }
|
|
56
|
+
* run 层裁剪只返回 { proposal_id, summary }(「提案类」2026-08 修订),
|
|
57
57
|
* 完整 Proposal 对象须经 build 层重建(与 run 内部产出同源确定:同 ctx + 同 args 结果一致)。
|
|
58
58
|
*/
|
|
59
59
|
type ProposalBuilder = (ctx: ToolContext, args: unknown) => Proposal;
|
|
@@ -71,15 +71,15 @@ export interface CreateToolDispatcherOptions {
|
|
|
71
71
|
}
|
|
72
72
|
/**
|
|
73
73
|
* 创建工具调度器(run.ts ToolDispatcher 真实现):
|
|
74
|
-
* 1. **批量校验 fail fast
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
* 2. **执行中检查 signal
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
* 3. 工具执行抛错(非 AbortedError)→ 统一 isError
|
|
74
|
+
* 1. **批量校验 fail fast**(「工具执行」):先全部 getTool(name).argsSchema
|
|
75
|
+
* safeParse——工具不存在 / 参数非法 → 该调用合成 isError 结果(**不中断其他调用**,
|
|
76
|
+
* 「fail fast」指校验先于执行,错误编码进 isError 喂回 LLM 自纠);全部校验完再逐个执行
|
|
77
|
+
* 2. **执行中检查 signal**:调度前 + 每个工具执行前 throwIfAborted,run 调用
|
|
78
|
+
* 透传 signal(长分析工具内部周期检查);命中取消抛 AbortedError **按取消语义传播**
|
|
79
|
+
* (原样抛穿,run.ts 识别后按用户取消终止——不喂回、不视为工具失败)
|
|
80
|
+
* 3. 工具执行抛错(非 AbortedError)→ 统一 isError 结构化(工具名+参数+错误信息)
|
|
81
81
|
* 4. propose_* 执行成功 → build 层重建完整 Proposal 入仓 + 构造 preview(S7.6 推 GUI)→
|
|
82
|
-
*
|
|
82
|
+
* DispatchResult.proposal 透传 run.ts(proposal 事件在 tool_result 后、循环继续前——run.ts 保证)
|
|
83
83
|
*/
|
|
84
84
|
export declare function createToolDispatcher(ctx: ToolContext, options?: CreateToolDispatcherOptions): ToolDispatcher;
|
|
85
85
|
export {};
|
package/dist/executor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAwBA,OAAO,EAoBL,KAAK,QAAQ,EACb,KAAK,WAAW,EAEjB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAoC,cAAc,EAAE,MAAM,UAAU,CAAC;AAIjF,qDAAqD;AACrD,eAAO,MAAM,eAAe,QAAc,CAAC;AAE3C;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAEtC,kEAAkE;AAClE,MAAM,WAAW,aAAa;IAC7B,2CAA2C;IAC1C,GAAG,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC/B;;;;MAIE;IACD,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC;IAC7D;;;;MAIE;IACD,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC;IAC3C;;;;MAIE;IACD,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,iDAAiD;IAChD,KAAK,IAAI,IAAI,CAAC;IACf,qBAAqB;IACpB,IAAI,IAAI,MAAM,CAAC;CAChB;AAED,oDAAoD;AACpD,MAAM,WAAW,oBAAoB;IACpC,oCAAoC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,oBAAyB,GAAG,aAAa,CA+DrF;AAED,uFAAuF;AACvF,eAAO,MAAM,oBAAoB,EAAE,aAAqC,CAAC;AAIzE;;;;GAIG;AACH,KAAK,eAAe,GAAG,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,KAAK,QAAQ,CAAC;AAErE;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAiB7D,CAAC;AAEF,8BAA8B;AAC9B,MAAM,WAAW,2BAA2B;IAC3C,mEAAmE;IAClE,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,GAAE,2BAAgC,GAAG,cAAc,CAwGhH"}
|
package/dist/executor.js
CHANGED
|
@@ -1,33 +1,20 @@
|
|
|
1
1
|
// @whispering233/ai-editor-agent 工具调度器 + 提案内存仓(S7.4)
|
|
2
|
-
// 契约来源:
|
|
3
|
-
// - doc/design/tasks.md S7.4(调度 query/analysis/proposal;提案仓 TTL 10 分钟 + 条数上限 +
|
|
4
|
-
// project_id 绑定、切换项目清空;批量 tool_call 先全部校验再执行、错误统一结构化回填、
|
|
5
|
-
// 执行中检查取消 signal)
|
|
6
|
-
// - doc/api/tools.md「工具执行契约」(抛错即失败不抛穿循环、批量先校验 fail fast 再逐个执行、
|
|
7
|
-
// 结果按 tool_call_id 一一回填、截断显式告知——截断由 S7.2 上下文裁剪承担,本层不截断)
|
|
8
|
-
// 与「提案类」返回语义(tool_result 仅 { proposal_id, summary },完整预览经 SSE proposal
|
|
9
|
-
// 事件推送 GUI)
|
|
10
|
-
// - doc/design/decisions.md 决策 14(提案仅内存:TTL/上限/项目绑定/切换清空)、
|
|
11
|
-
// 决策 15(工具失败结构化喂回自纠:工具名+参数+错误信息)、
|
|
12
|
-
// 决策 16 ③(工具执行中检查取消信号——AbortedError 按取消语义传播,不喂回、不视为工具失败)
|
|
13
|
-
// - run.ts(S7.3)ToolDispatcher 契约:同序等长、不抛错(失败编码进 isError)、proposal 透传;
|
|
14
|
-
// AbortedError 经**抛错路径**传播(本文件抛、run.ts dispatcher catch 识别后按用户取消终止)
|
|
15
2
|
//
|
|
16
3
|
// 架构边界:本包**不依赖 db**——ToolContext(db/outlineDir/projectId)由 S7.6 server 层注入
|
|
17
4
|
// (createToolDispatcher 闭包捕获),这里只透传给工具 run/build;agent 侧不触碰 db 类型。
|
|
18
5
|
import { AbortedError, buildProposeAbandonHook, buildProposeAddDelta, buildProposeAddRelation, buildProposeAdvanceHook, buildProposeCreateEntity, buildProposeCreateHook, buildProposeCreateReference, buildProposeDeleteEntity, buildProposeDeleteNode, buildProposeMoveNode, buildProposeOutlineNode, buildProposeRemoveRelation, buildProposeReorderTimepoints, buildProposeResolveHook, buildProposeUpdateEntity, buildProposeUpdateHook, getTool, throwIfAborted, } from "@whispering233/ai-editor-tools";
|
|
19
|
-
// ============
|
|
20
|
-
/** 提案 TTL
|
|
6
|
+
// ============ 提案内存仓(仅内存、不落盘) ============
|
|
7
|
+
/** 提案 TTL(10 分钟;S7.5 confirm/reject 引用——超期按不存在处理) */
|
|
21
8
|
export const PROPOSAL_TTL_MS = 10 * 60_000;
|
|
22
9
|
/**
|
|
23
|
-
*
|
|
10
|
+
* 提案条数上限(超限淘汰 createdAt 最旧)。
|
|
24
11
|
* 决策原文未定数——取 200 为数量级防御:正常会话一轮最多 15 个提案、挂卡不确认的
|
|
25
12
|
* 残留按 TTL 自动过期,200 足以覆盖极端多轮场景且内存占用可忽略(防无限增长)。
|
|
26
13
|
*/
|
|
27
14
|
export const PROPOSAL_MAX_COUNT = 200;
|
|
28
15
|
/**
|
|
29
16
|
* 创建提案仓实例。
|
|
30
|
-
* 过期策略:**惰性过期 +
|
|
17
|
+
* 过期策略:**惰性过期 + 按需清理**(「超期自动清除」落地)——get/peek 只清理命中的
|
|
31
18
|
* 单条,set 前扫全仓清理;无定时器(定时器引入时钟耦合且小仓无必要,测试用假时钟直接断言)。
|
|
32
19
|
* 淘汰策略:条数超限时淘汰 createdAt **最旧**的提案(sweep 过期后仍满则循环淘汰最旧)。
|
|
33
20
|
*/
|
|
@@ -76,7 +63,7 @@ export function createProposalStore(options = {}) {
|
|
|
76
63
|
return null;
|
|
77
64
|
}
|
|
78
65
|
if (entry.proposal.project_id !== projectId)
|
|
79
|
-
return null; //
|
|
66
|
+
return null; // 项目绑定
|
|
80
67
|
return entry.proposal;
|
|
81
68
|
},
|
|
82
69
|
peek(proposalId) {
|
|
@@ -124,30 +111,30 @@ export const PROPOSAL_BUILDERS = {
|
|
|
124
111
|
propose_resolve_hook: (ctx, args) => buildProposeResolveHook(ctx, args),
|
|
125
112
|
propose_abandon_hook: (ctx, args) => buildProposeAbandonHook(ctx, args),
|
|
126
113
|
propose_reorder_timepoints: (ctx, args) => buildProposeReorderTimepoints(ctx, args), // G2(取代 F9 的 propose_reorder_events)
|
|
127
|
-
propose_create_reference: (ctx, args) => buildProposeCreateReference(ctx, args), //
|
|
114
|
+
propose_create_reference: (ctx, args) => buildProposeCreateReference(ctx, args), //
|
|
128
115
|
};
|
|
129
116
|
/**
|
|
130
117
|
* 创建工具调度器(run.ts ToolDispatcher 真实现):
|
|
131
|
-
* 1. **批量校验 fail fast
|
|
132
|
-
*
|
|
133
|
-
*
|
|
134
|
-
* 2. **执行中检查 signal
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
* 3. 工具执行抛错(非 AbortedError)→ 统一 isError
|
|
118
|
+
* 1. **批量校验 fail fast**(「工具执行」):先全部 getTool(name).argsSchema
|
|
119
|
+
* safeParse——工具不存在 / 参数非法 → 该调用合成 isError 结果(**不中断其他调用**,
|
|
120
|
+
* 「fail fast」指校验先于执行,错误编码进 isError 喂回 LLM 自纠);全部校验完再逐个执行
|
|
121
|
+
* 2. **执行中检查 signal**:调度前 + 每个工具执行前 throwIfAborted,run 调用
|
|
122
|
+
* 透传 signal(长分析工具内部周期检查);命中取消抛 AbortedError **按取消语义传播**
|
|
123
|
+
* (原样抛穿,run.ts 识别后按用户取消终止——不喂回、不视为工具失败)
|
|
124
|
+
* 3. 工具执行抛错(非 AbortedError)→ 统一 isError 结构化(工具名+参数+错误信息)
|
|
138
125
|
* 4. propose_* 执行成功 → build 层重建完整 Proposal 入仓 + 构造 preview(S7.6 推 GUI)→
|
|
139
|
-
*
|
|
126
|
+
* DispatchResult.proposal 透传 run.ts(proposal 事件在 tool_result 后、循环继续前——run.ts 保证)
|
|
140
127
|
*/
|
|
141
128
|
export function createToolDispatcher(ctx, options = {}) {
|
|
142
129
|
const store = options.store ?? defaultProposalStore;
|
|
143
130
|
return async (calls, signal) => {
|
|
144
|
-
//
|
|
131
|
+
// 调度前取消检查:已取消则一个工具都不执行,直接按取消传播
|
|
145
132
|
throwIfAborted(toAbortSignal(signal));
|
|
146
133
|
// ---- 1. 批量校验 fail fast:全部先校验,再逐个执行 ----
|
|
147
134
|
const plans = calls.map((call) => {
|
|
148
135
|
const def = getTool(call.tool);
|
|
149
136
|
if (def === undefined) {
|
|
150
|
-
//
|
|
137
|
+
// 工具不存在:执行类工具不注册不暴露(「核心设计原则」——AI 只能提案不能直接写)
|
|
151
138
|
return {
|
|
152
139
|
call,
|
|
153
140
|
error: `工具不存在或不可调用:${call.tool}(AI 只能调用已注册的查询/分析/提案工具,执行类工具不暴露)`,
|
|
@@ -159,10 +146,10 @@ export function createToolDispatcher(ctx, options = {}) {
|
|
|
159
146
|
}
|
|
160
147
|
return { call, def, parsed: parsed.data };
|
|
161
148
|
});
|
|
162
|
-
// ---- 2. 逐个执行(结果按输入顺序一一回填,同序等长——run.ts
|
|
149
|
+
// ---- 2. 逐个执行(结果按输入顺序一一回填,同序等长——run.ts ) ----
|
|
163
150
|
const results = [];
|
|
164
151
|
for (const plan of plans) {
|
|
165
|
-
//
|
|
152
|
+
// 批量执行间隙被取消:立即中止后续工具并传播取消
|
|
166
153
|
throwIfAborted(toAbortSignal(signal));
|
|
167
154
|
const def = plan.def;
|
|
168
155
|
if (def === undefined) {
|
|
@@ -190,7 +177,7 @@ export function createToolDispatcher(ctx, options = {}) {
|
|
|
190
177
|
});
|
|
191
178
|
continue;
|
|
192
179
|
}
|
|
193
|
-
// ---- 提案路径(propose_
|
|
180
|
+
// ---- 提案路径(propose_*, + 「提案类」) ----
|
|
194
181
|
// run 层裁剪只返回 { proposal_id, summary };完整 Proposal 经 build 层重建入仓——
|
|
195
182
|
// proposal_id 以 run 返回为准覆盖(build 每次生成新 id),保证
|
|
196
183
|
// tool_result / proposal 事件 / 仓 key 三处同一 id(S7.5 confirm 按事件 id 取仓)
|
|
@@ -198,7 +185,7 @@ export function createToolDispatcher(ctx, options = {}) {
|
|
|
198
185
|
if (runResult === null ||
|
|
199
186
|
typeof runResult !== "object" ||
|
|
200
187
|
typeof runResult.proposal_id !== "string") {
|
|
201
|
-
throw new Error(`提案工具 ${plan.call.tool}
|
|
188
|
+
throw new Error(`提案工具 ${plan.call.tool} 返回结果不符合(缺 proposal_id)`);
|
|
202
189
|
}
|
|
203
190
|
const summary = typeof runResult.summary === "string" ? runResult.summary : "";
|
|
204
191
|
const proposal = { ...builder(ctx, plan.parsed), proposal_id: runResult.proposal_id };
|
|
@@ -221,14 +208,14 @@ export function createToolDispatcher(ctx, options = {}) {
|
|
|
221
208
|
});
|
|
222
209
|
}
|
|
223
210
|
catch (err) {
|
|
224
|
-
//
|
|
211
|
+
// 取消语义传播:AbortedError 不喂回、不计失败轮——原样抛出,
|
|
225
212
|
// run.ts dispatcher catch 识别后按用户取消终止(aborted=true,不重试)。
|
|
226
213
|
// signal 已置位时一律按取消传播(双保险,与 run.ts catch 对称):覆盖「工具未检查
|
|
227
214
|
// signal 即抛普通 Error」的取消竞态,以及跨包副本 AbortedError 的 instanceof 失效场景
|
|
228
215
|
// (工具包内抛出的 AbortedError 若经打包/深拷贝丢失原型链,仍可按 signal 状态识别)
|
|
229
216
|
if (err instanceof AbortedError || signal?.aborted === true)
|
|
230
217
|
throw err;
|
|
231
|
-
// 其余抛错:结构化 isError
|
|
218
|
+
// 其余抛错:结构化 isError 回填(工具名 + 参数 + 错误信息,喂回 LLM 自纠)
|
|
232
219
|
results.push({
|
|
233
220
|
id: plan.call.id,
|
|
234
221
|
tool: plan.call.tool,
|
|
@@ -255,7 +242,7 @@ function formatValidationError(call, error) {
|
|
|
255
242
|
.join(";");
|
|
256
243
|
return `工具 ${call.tool} 参数校验失败(未执行,请修正参数后重试):${detail};参数:${JSON.stringify(call.args)}`;
|
|
257
244
|
}
|
|
258
|
-
/**
|
|
245
|
+
/** 工具执行失败结构化回填(工具名 + 参数 + 错误信息,喂回 LLM 自纠) */
|
|
259
246
|
function formatRunError(call, err) {
|
|
260
247
|
const message = err instanceof Error ? err.message : String(err);
|
|
261
248
|
return `工具 ${call.tool} 执行失败:${message};参数:${JSON.stringify(call.args)}`;
|
package/dist/executor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"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"}
|
package/dist/prompts.d.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/** 内核提示词( 内核层):创作顾问角色定义 + 行为规范,代码固定不可用户编辑 */
|
|
2
2
|
export declare const KERNEL_PROMPT = "\u4F60\u662F\u300C\u521B\u4F5C\u987E\u95EE\u300D\uFF0C\u4E00\u540D\u8D44\u6DF1\u5C0F\u8BF4\u521B\u4F5C\u642D\u6863\uFF0C\u670D\u52A1\u4E8E\u4F5C\u8005\u7684 AI \u5199\u4F5C\u5DE5\u4F5C\u53F0\u3002\n\u4F60\u7684\u804C\u8D23\u662F\u5E2E\u52A9\u4F5C\u8005\u5206\u6790\u5927\u7EB2\u3001\u4EBA\u7269\u3001\u5173\u7CFB\u3001\u60C5\u8282\u4E0E\u4F0F\u7B14\uFF0C\u63D0\u51FA\u53EF\u6267\u884C\u7684\u4FEE\u6539\u5EFA\u8BAE\u2014\u2014\u4F60\u662F\u5206\u6790\u987E\u95EE\uFF0C\u4E0D\u662F\u64CD\u4F5C\u5458\uFF0C\u4E5F\u4E0D\u4EE3\u5199\u6B63\u6587\u3002\n\n\u884C\u4E3A\u51C6\u5219\uFF1A\n1. \u4E0D\u751F\u6210\u6B63\u6587\uFF1A\u4E0D\u4EE3\u5199\u5C0F\u8BF4\u6B63\u6587\u6216\u7AE0\u8282\u5185\u5BB9\uFF0C\u8F93\u51FA\u59CB\u7EC8\u662F\u5206\u6790\u3001\u5EFA\u8BAE\u4E0E\u65B9\u6848\u3002\n2. \u4E0D\u76F4\u63A5\u5199\u5165\uFF1A\u7EDD\u4E0D\u76F4\u63A5\u5199\u5165\u3001\u4FEE\u6539\u6216\u5220\u9664\u4EFB\u4F55\u6570\u636E\uFF08\u5B9E\u4F53/\u5173\u7CFB/\u5927\u7EB2\u8282\u70B9/\u4F0F\u7B14/Delta\uFF09\uFF1B\u5199\u64CD\u4F5C\u4E00\u5F8B\u901A\u8FC7 propose_* \u5DE5\u5177\u751F\u6210\u63D0\u6848\uFF0C\u7531\u7528\u6237\u786E\u8BA4\u540E\u6267\u884C\u2014\u2014\u7528\u6237\u59CB\u7EC8\u662F\u6700\u7EC8\u51B3\u7B56\u8005\u3002\n3. \u67E5\u8BE2\u4E0E\u5206\u6790\u81EA\u7531\uFF1A\u53EF\u968F\u65F6\u8C03\u7528\u67E5\u8BE2\u7C7B\u4E0E\u5206\u6790\u7C7B\u5DE5\u5177\u83B7\u53D6\u6570\u636E\u3001\u8FD0\u884C\u7ED3\u6784\u5316\u5206\u6790\u3002\n4. \u7ED3\u679C\u622A\u65AD\u987B\u77E5\uFF1A\u5DE5\u5177\u7ED3\u679C\u82E5\u542B\u300C\u5DF2\u622A\u65AD\u300D\u6807\u8BB0\u5373\u6570\u636E\u4E0D\u5B8C\u6574\u2014\u2014\u8BF7\u7F29\u5C0F\u67E5\u8BE2\u8303\u56F4\u6216\u5206\u9875\u83B7\u53D6\uFF0C\u4E0D\u5F97\u57FA\u4E8E\u6B8B\u7F3A\u6570\u636E\u4E0B\u7ED3\u8BBA\u3002\n5. \u957F\u5EA6\u622A\u65AD\u987B\u77E5\uFF1A\u82E5\u4F60\u7684\u56DE\u590D\u56E0\u957F\u5EA6\u9650\u5236\u88AB\u622A\u65AD\uFF0C\u7CFB\u7EDF\u4E0D\u4F1A\u91CD\u53D1\u4F60\u7684\u534A\u6761\u56DE\u590D\uFF1B\u8BF7\u63A7\u5236\u7BC7\u5E45\uFF0C\u4F18\u5148\u7ED9\u51FA\u7ED3\u8BBA\u4E0E\u8981\u70B9\u3002\n6. \u805A\u7126\u4F18\u5148\uFF1Asystem \u6D88\u606F\u4E2D\u300C\u5F53\u524D\u805A\u7126\u300D\u6BB5\u843D\u662F\u4F5C\u8005\u6B63\u5728\u67E5\u770B\u7684\u5185\u5BB9\uFF0C\u4F18\u5148\u56F4\u7ED5\u5B83\u5C55\u5F00\u3002\n7. \u63D0\u6848\u8BED\u4E49\uFF1A\u8C03\u7528\u63D0\u6848\u5DE5\u5177\u540E\u9700\u7528\u6237\u786E\u8BA4\u624D\u751F\u6548\uFF1B\u786E\u8BA4\u524D\u4E0D\u8981\u5047\u8BBE\u4EFB\u4F55\u4FEE\u6539\u5DF2\u53D1\u751F\u3002\n8. \u56DE\u590D\u4F7F\u7528\u9879\u76EE\u914D\u7F6E\u7684\u8BED\u8A00\u3002";
|
|
3
|
-
/**
|
|
3
|
+
/** 项目提示词段标题( 项目层,来自 project.json 的 prompt 字段) */
|
|
4
4
|
export declare const PROJECT_PROMPT_TITLE = "## \u9879\u76EE\u8BBE\u5B9A";
|
|
5
|
-
/**
|
|
5
|
+
/** 临时指令段标题( 临时层,即时输入、不持久化) */
|
|
6
6
|
export declare const INSTRUCTION_TITLE = "## \u672C\u6B21\u6307\u4EE4";
|
|
7
7
|
/** 可用工具清单段标题(name + description 一行,来自 registry listTools) */
|
|
8
8
|
export declare const TOOL_LIST_TITLE = "## \u53EF\u7528\u5DE5\u5177";
|
|
9
|
-
/**
|
|
9
|
+
/** 聚焦上下文段标题( 聚焦层:当前视图中的实体/大纲节点,由调用方查询后传入) */
|
|
10
10
|
export declare const FOCUS_TITLE = "## \u5F53\u524D\u805A\u7126";
|
|
11
|
-
/**
|
|
11
|
+
/** 聚焦上下文截断提示(截断必须显式告知,不得静默丢数据) */
|
|
12
12
|
export declare const FOCUS_TRUNCATION_NOTICE = "\n\n[\u805A\u7126\u4E0A\u4E0B\u6587\u5DF2\u622A\u65AD\uFF1A\u8D85\u51FA token \u9884\u7B97\uFF0C\u6570\u636E\u4E0D\u5B8C\u6574\uFF1B\u8BF7\u7F29\u5C0F\u67E5\u770B\u8303\u56F4]";
|
|
13
13
|
//# sourceMappingURL=prompts.d.ts.map
|
package/dist/prompts.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAKA,6CAA6C;AAC7C,eAAO,MAAM,aAAa,oiFAWV,CAAC;AAIjB,iDAAiD;AACjD,eAAO,MAAM,oBAAoB,gCAAY,CAAC;AAE9C,8BAA8B;AAC9B,eAAO,MAAM,iBAAiB,gCAAY,CAAC;AAE3C,6DAA6D;AAC7D,eAAO,MAAM,eAAe,gCAAY,CAAC;AAEzC,6CAA6C;AAC7C,eAAO,MAAM,WAAW,gCAAY,CAAC;AAErC,kCAAkC;AAClC,eAAO,MAAM,uBAAuB,oLAA6C,CAAC"}
|
package/dist/prompts.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
// @whispering233/ai-editor-agent 提示词(S7.2)
|
|
2
|
-
//
|
|
3
|
-
// 开发者编辑、代码固定、不持久化)、doc/api/tools.md「核心设计原则」(AI 角色是分析顾问
|
|
2
|
+
// 开发者编辑、代码固定、不持久化)、「核心设计原则」(AI 角色是分析顾问
|
|
4
3
|
// 不是操作员、写操作走提案、截断显式告知)。
|
|
5
4
|
// 项目层(用户可编辑,project.json)与临时层(即时输入)由调用方传入 context.ts 组装。
|
|
6
|
-
/**
|
|
5
|
+
/** 内核提示词( 内核层):创作顾问角色定义 + 行为规范,代码固定不可用户编辑 */
|
|
7
6
|
export const KERNEL_PROMPT = `你是「创作顾问」,一名资深小说创作搭档,服务于作者的 AI 写作工作台。
|
|
8
7
|
你的职责是帮助作者分析大纲、人物、关系、情节与伏笔,提出可执行的修改建议——你是分析顾问,不是操作员,也不代写正文。
|
|
9
8
|
|
|
@@ -17,14 +16,14 @@ export const KERNEL_PROMPT = `你是「创作顾问」,一名资深小说创
|
|
|
17
16
|
7. 提案语义:调用提案工具后需用户确认才生效;确认前不要假设任何修改已发生。
|
|
18
17
|
8. 回复使用项目配置的语言。`;
|
|
19
18
|
// ============ 组装段标题与提示文案(context.ts 拼装 system 消息使用) ============
|
|
20
|
-
/**
|
|
19
|
+
/** 项目提示词段标题( 项目层,来自 project.json 的 prompt 字段) */
|
|
21
20
|
export const PROJECT_PROMPT_TITLE = "## 项目设定";
|
|
22
|
-
/**
|
|
21
|
+
/** 临时指令段标题( 临时层,即时输入、不持久化) */
|
|
23
22
|
export const INSTRUCTION_TITLE = "## 本次指令";
|
|
24
23
|
/** 可用工具清单段标题(name + description 一行,来自 registry listTools) */
|
|
25
24
|
export const TOOL_LIST_TITLE = "## 可用工具";
|
|
26
|
-
/**
|
|
25
|
+
/** 聚焦上下文段标题( 聚焦层:当前视图中的实体/大纲节点,由调用方查询后传入) */
|
|
27
26
|
export const FOCUS_TITLE = "## 当前聚焦";
|
|
28
|
-
/**
|
|
27
|
+
/** 聚焦上下文截断提示(截断必须显式告知,不得静默丢数据) */
|
|
29
28
|
export const FOCUS_TRUNCATION_NOTICE = "\n\n[聚焦上下文已截断:超出 token 预算,数据不完整;请缩小查看范围]";
|
|
30
29
|
//# sourceMappingURL=prompts.js.map
|
package/dist/prompts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,uCAAuC;AACvC,wBAAwB;AACxB,yDAAyD;AAEzD,6CAA6C;AAC7C,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;gBAWb,CAAC;AAEjB,kEAAkE;AAElE,iDAAiD;AACjD,MAAM,CAAC,MAAM,oBAAoB,GAAG,SAAS,CAAC;AAE9C,8BAA8B;AAC9B,MAAM,CAAC,MAAM,iBAAiB,GAAG,SAAS,CAAC;AAE3C,6DAA6D;AAC7D,MAAM,CAAC,MAAM,eAAe,GAAG,SAAS,CAAC;AAEzC,6CAA6C;AAC7C,MAAM,CAAC,MAAM,WAAW,GAAG,SAAS,CAAC;AAErC,kCAAkC;AAClC,MAAM,CAAC,MAAM,uBAAuB,GAAG,0CAA0C,CAAC"}
|