@whispering233/ai-editor-tools 0.0.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/dist/analysis/conflict.d.ts +20 -0
- package/dist/analysis/conflict.d.ts.map +1 -0
- package/dist/analysis/conflict.js +116 -0
- package/dist/analysis/conflict.js.map +1 -0
- package/dist/analysis/consistency.d.ts +28 -0
- package/dist/analysis/consistency.d.ts.map +1 -0
- package/dist/analysis/consistency.js +108 -0
- package/dist/analysis/consistency.js.map +1 -0
- package/dist/analysis/hook.d.ts +157 -0
- package/dist/analysis/hook.d.ts.map +1 -0
- package/dist/analysis/hook.js +381 -0
- package/dist/analysis/hook.js.map +1 -0
- package/dist/analysis/orphan.d.ts +60 -0
- package/dist/analysis/orphan.d.ts.map +1 -0
- package/dist/analysis/orphan.js +153 -0
- package/dist/analysis/orphan.js.map +1 -0
- package/dist/analysis/path.d.ts +23 -0
- package/dist/analysis/path.d.ts.map +1 -0
- package/dist/analysis/path.js +114 -0
- package/dist/analysis/path.js.map +1 -0
- package/dist/analysis/suggest.d.ts +19 -0
- package/dist/analysis/suggest.d.ts.map +1 -0
- package/dist/analysis/suggest.js +92 -0
- package/dist/analysis/suggest.js.map +1 -0
- package/dist/analysis/utils.d.ts +54 -0
- package/dist/analysis/utils.d.ts.map +1 -0
- package/dist/analysis/utils.js +123 -0
- package/dist/analysis/utils.js.map +1 -0
- package/dist/context.d.ts +10 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +11 -0
- package/dist/context.js.map +1 -0
- package/dist/executor/delta.d.ts +4 -0
- package/dist/executor/delta.d.ts.map +1 -0
- package/dist/executor/delta.js +22 -0
- package/dist/executor/delta.js.map +1 -0
- package/dist/executor/entity.d.ts +8 -0
- package/dist/executor/entity.d.ts.map +1 -0
- package/dist/executor/entity.js +47 -0
- package/dist/executor/entity.js.map +1 -0
- package/dist/executor/hook.d.ts +8 -0
- package/dist/executor/hook.d.ts.map +1 -0
- package/dist/executor/hook.js +183 -0
- package/dist/executor/hook.js.map +1 -0
- package/dist/executor/index.d.ts +22 -0
- package/dist/executor/index.d.ts.map +1 -0
- package/dist/executor/index.js +89 -0
- package/dist/executor/index.js.map +1 -0
- package/dist/executor/outline.d.ts +8 -0
- package/dist/executor/outline.d.ts.map +1 -0
- package/dist/executor/outline.js +39 -0
- package/dist/executor/outline.js.map +1 -0
- package/dist/executor/relation.d.ts +6 -0
- package/dist/executor/relation.d.ts.map +1 -0
- package/dist/executor/relation.js +33 -0
- package/dist/executor/relation.js.map +1 -0
- package/dist/executor/types.d.ts +25 -0
- package/dist/executor/types.d.ts.map +1 -0
- package/dist/executor/types.js +54 -0
- package/dist/executor/types.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +359 -0
- package/dist/index.js.map +1 -0
- package/dist/proposal/delta.d.ts +8 -0
- package/dist/proposal/delta.d.ts.map +1 -0
- package/dist/proposal/delta.js +29 -0
- package/dist/proposal/delta.js.map +1 -0
- package/dist/proposal/entity.d.ts +16 -0
- package/dist/proposal/entity.d.ts.map +1 -0
- package/dist/proposal/entity.js +54 -0
- package/dist/proposal/entity.js.map +1 -0
- package/dist/proposal/hook.d.ts +24 -0
- package/dist/proposal/hook.d.ts.map +1 -0
- package/dist/proposal/hook.js +81 -0
- package/dist/proposal/hook.js.map +1 -0
- package/dist/proposal/outline.d.ts +24 -0
- package/dist/proposal/outline.d.ts.map +1 -0
- package/dist/proposal/outline.js +78 -0
- package/dist/proposal/outline.js.map +1 -0
- package/dist/proposal/relation.d.ts +12 -0
- package/dist/proposal/relation.d.ts.map +1 -0
- package/dist/proposal/relation.js +50 -0
- package/dist/proposal/relation.js.map +1 -0
- package/dist/proposal/types.d.ts +72 -0
- package/dist/proposal/types.d.ts.map +1 -0
- package/dist/proposal/types.js +105 -0
- package/dist/proposal/types.js.map +1 -0
- package/dist/query/delta.d.ts +20 -0
- package/dist/query/delta.d.ts.map +1 -0
- package/dist/query/delta.js +41 -0
- package/dist/query/delta.js.map +1 -0
- package/dist/query/entity.d.ts +29 -0
- package/dist/query/entity.d.ts.map +1 -0
- package/dist/query/entity.js +53 -0
- package/dist/query/entity.js.map +1 -0
- package/dist/query/outline.d.ts +20 -0
- package/dist/query/outline.d.ts.map +1 -0
- package/dist/query/outline.js +68 -0
- package/dist/query/outline.js.map +1 -0
- package/dist/query/relation.d.ts +12 -0
- package/dist/query/relation.d.ts.map +1 -0
- package/dist/query/relation.js +30 -0
- package/dist/query/relation.js.map +1 -0
- package/dist/registry.d.ts +41 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +46 -0
- package/dist/registry.js.map +1 -0
- package/package.json +35 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// 查询类工具:大纲侧实现(S6.3)
|
|
2
|
+
// get_outline / get_outline_path(tools.md「大纲查询」)
|
|
3
|
+
// 契约来源:doc/api/tools.md;doc/api/endpoints.md 大纲端点;决策 12 修订(默认过滤软删)、
|
|
4
|
+
// 决策 19(严格三层,无游离节点)。
|
|
5
|
+
//
|
|
6
|
+
// db 层能力确认与分工:
|
|
7
|
+
// - get_outline:db readOutlineFile 返回存储形态 OutlineFileTree——
|
|
8
|
+
// 工具层 mapOutlineFileToTree 映射为 API 形态(camelCase);**默认不含 metadata**
|
|
9
|
+
// (省 token,tools.md 明确:需统计走 API with_metadata);软删节点整棵剔除
|
|
10
|
+
// (决策 12 修订:查询类工具不返回回收站中的对象)
|
|
11
|
+
// - get_outline_path:db getOutlinePathIds 返回根 → 目标节点路径(含 root);
|
|
12
|
+
// 节点不存在抛错——工具层转 null(查询无结果);路径上任一节点软删 → null(不可见)
|
|
13
|
+
import { findOutlineNode, getOutlinePathIds, readOutlineFile } from "@whispering233/ai-editor-db";
|
|
14
|
+
import { mapOutlineFileToTree } from "@whispering233/ai-editor-shared";
|
|
15
|
+
/**
|
|
16
|
+
* 递归剔除软删节点(决策 12 修订):deleted === true 的节点整棵不可见——
|
|
17
|
+
* 级联软删(决策 12)保证其子树已一并软删,但防御性仍剔除整棵子树
|
|
18
|
+
* (手改 outline.json 可能产生不一致,查询层不因脏数据暴露回收站对象)。
|
|
19
|
+
* 泛型 T 保持调用处的节点联合类型(root 层 volume|chapter,递归层逐级收窄)。
|
|
20
|
+
*/
|
|
21
|
+
function stripDeletedNodes(nodes) {
|
|
22
|
+
const out = [];
|
|
23
|
+
for (const node of nodes) {
|
|
24
|
+
if (node.deleted === true)
|
|
25
|
+
continue;
|
|
26
|
+
const children = node.children;
|
|
27
|
+
out.push(children === undefined ? node : { ...node, children: stripDeletedNodes(children) });
|
|
28
|
+
}
|
|
29
|
+
return out;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 完整大纲树(tools.md get_outline() → 严格三层树,决策 19)。
|
|
33
|
+
* - 默认不含 metadata 统计(省 token;需统计走 API GET /outline?with_metadata=)
|
|
34
|
+
* - 软删节点过滤(决策 12 修订)
|
|
35
|
+
* - 返回 API 形态 OutlineTree(camelCase;data 嵌套字段原样透传)
|
|
36
|
+
* 无参工具:签名省略 args(少参数赋值兼容 ToolDefinition.run,避免未使用参数 lint)
|
|
37
|
+
*/
|
|
38
|
+
export function runGetOutline(ctx) {
|
|
39
|
+
const tree = readOutlineFile(ctx.outlineDir);
|
|
40
|
+
const stripped = { ...tree, children: stripDeletedNodes(tree.children) };
|
|
41
|
+
return mapOutlineFileToTree(stripped);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 根 → 目标节点的路径 ID 列表(tools.md get_outline_path(node_id),含 root,
|
|
45
|
+
* 如 ["root", "vol-1", "ch-3", "sc-15"];严格三层下路径唯一,决策 19)。
|
|
46
|
+
* - 节点不存在 → null(db getOutlinePathIds 抛错,工具层转查询无结果)
|
|
47
|
+
* - 路径上任一节点软删 → null(决策 12 修订:软删对象不可见——目标节点软删时
|
|
48
|
+
* 其路径对 AI 无意义;防御手改 outline.json 产生的祖先软删不一致)
|
|
49
|
+
*/
|
|
50
|
+
export function runGetOutlinePath(ctx, args) {
|
|
51
|
+
const tree = readOutlineFile(ctx.outlineDir);
|
|
52
|
+
let path;
|
|
53
|
+
try {
|
|
54
|
+
path = getOutlinePathIds(tree, args.node_id);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return null; // 节点不存在(getOutlinePathIds 抛错语义,见 db 注释)
|
|
58
|
+
}
|
|
59
|
+
for (const nodeId of path) {
|
|
60
|
+
if (nodeId === "root")
|
|
61
|
+
continue; // root 非节点,无软删概念
|
|
62
|
+
const node = findOutlineNode(tree, nodeId);
|
|
63
|
+
if (node?.deleted === true)
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
return path;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=outline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outline.js","sourceRoot":"","sources":["../../src/query/outline.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,iDAAiD;AACjD,oEAAoE;AACpE,uBAAuB;AACvB,EAAE;AACF,eAAe;AACf,4DAA4D;AAC5D,qEAAqE;AACrE,0DAA0D;AAC1D,+BAA+B;AAC/B,gEAAgE;AAChE,oDAAoD;AAEpD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAClG,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAKvE;;;;;GAKG;AACH,SAAS,iBAAiB,CAA4B,KAAmB;IACvE,MAAM,GAAG,GAAQ,EAAE,CAAC;IACpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI;YAAE,SAAS;QACpC,MAAM,QAAQ,GAAI,IAAkD,CAAC,QAAQ,CAAC;QAC9E,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,iBAAiB,CAAC,QAAQ,CAAC,EAAQ,CAAC,CAAC;IACtG,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,GAAgB;IAC5C,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;IACzE,OAAO,oBAAoB,CAAC,QAAQ,CAAC,CAAC;AACxC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAgB,EAAE,IAAwB;IAC1E,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC7C,IAAI,IAAc,CAAC;IACnB,IAAI,CAAC;QACH,IAAI,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,CAAC,wCAAwC;IACvD,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,IAAI,EAAE,CAAC;QAC1B,IAAI,MAAM,KAAK,MAAM;YAAE,SAAS,CAAC,iBAAiB;QAClD,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3C,IAAI,IAAI,EAAE,OAAO,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;IAC1C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { RelationQueryResult } from "@whispering233/ai-editor-shared";
|
|
2
|
+
import type { ToolContext } from "../context.js";
|
|
3
|
+
import type { QueryRelationshipsArgs } from "@whispering233/ai-editor-shared";
|
|
4
|
+
/**
|
|
5
|
+
* 关系图子图(tools.md query_relationships → [{source,target,type,metadata}] 简写;
|
|
6
|
+
* 实际透传 db 的 RelationQueryResult 完整形态:relations: RelationRecord[](含
|
|
7
|
+
* sourceName/targetName 联表名)+ depth>=2 时 paths: RelationPath[])。
|
|
8
|
+
* 参数映射:snake_case 工具参数 → db 层 camelCase RelationQuery(字段一一对应);
|
|
9
|
+
* depth 1=紧邻 / 2=k跳 / 3=全量。
|
|
10
|
+
*/
|
|
11
|
+
export declare function runQueryRelationships(ctx: ToolContext, args: QueryRelationshipsArgs): RelationQueryResult;
|
|
12
|
+
//# sourceMappingURL=relation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relation.d.ts","sourceRoot":"","sources":["../../src/query/relation.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAE9E;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,sBAAsB,GAAG,mBAAmB,CAazG"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// 查询类工具:关系侧实现(S6.3)
|
|
2
|
+
// query_relationships(tools.md「关系查询」→ 关系图子图)
|
|
3
|
+
// 契约来源:doc/api/tools.md;doc/api/endpoints.md 关系端点;决策 12 修订
|
|
4
|
+
// (关系可见性联动端点状态:任一端点软删即不可见)、决策 10(plot_edge 同规则)。
|
|
5
|
+
//
|
|
6
|
+
// db 层能力确认:listRelations(db relation.ts)已实现全部所需语义——
|
|
7
|
+
// 1. 关系自身软删过滤(SQL 层)
|
|
8
|
+
// 2. **端点软删可见性校验**(buildEndpointContext:实体端点查 entities 软删集合、
|
|
9
|
+
// 大纲端点读 outline.json 收集软删节点——决策 12 修订)
|
|
10
|
+
// 3. name 联表填充(实体 entities.name、大纲节点 outline.json title)
|
|
11
|
+
// 4. depth>=2 的 k 跳 BFS 路径(防环、多起点)
|
|
12
|
+
// 工具层仅做参数映射透传,无额外过滤逻辑。
|
|
13
|
+
import { listRelations } from "@whispering233/ai-editor-db";
|
|
14
|
+
/**
|
|
15
|
+
* 关系图子图(tools.md query_relationships → [{source,target,type,metadata}] 简写;
|
|
16
|
+
* 实际透传 db 的 RelationQueryResult 完整形态:relations: RelationRecord[](含
|
|
17
|
+
* sourceName/targetName 联表名)+ depth>=2 时 paths: RelationPath[])。
|
|
18
|
+
* 参数映射:snake_case 工具参数 → db 层 camelCase RelationQuery(字段一一对应);
|
|
19
|
+
* depth 1=紧邻 / 2=k跳 / 3=全量。
|
|
20
|
+
*/
|
|
21
|
+
export function runQueryRelationships(ctx, args) {
|
|
22
|
+
return listRelations(ctx.db, {
|
|
23
|
+
sourceType: args.source_type,
|
|
24
|
+
sourceId: args.source_id,
|
|
25
|
+
targetType: args.target_type,
|
|
26
|
+
targetId: args.target_id,
|
|
27
|
+
relationType: args.relation_type,
|
|
28
|
+
}, args.depth, ctx.outlineDir);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=relation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relation.js","sourceRoot":"","sources":["../../src/query/relation.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,6CAA6C;AAC7C,2DAA2D;AAC3D,mDAAmD;AACnD,EAAE;AACF,oDAAoD;AACpD,qBAAqB;AACrB,6DAA6D;AAC7D,0CAA0C;AAC1C,yDAAyD;AACzD,mCAAmC;AACnC,uBAAuB;AAEvB,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAK5D;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAgB,EAAE,IAA4B;IAClF,OAAO,aAAa,CAClB,GAAG,CAAC,EAAE,EACN;QACE,UAAU,EAAE,IAAI,CAAC,WAAW;QAC5B,QAAQ,EAAE,IAAI,CAAC,SAAS;QACxB,UAAU,EAAE,IAAI,CAAC,WAAW;QAC5B,QAAQ,EAAE,IAAI,CAAC,SAAS;QACxB,YAAY,EAAE,IAAI,CAAC,aAAa;KACjC,EACD,IAAI,CAAC,KAAK,EACV,GAAG,CAAC,UAAU,CACf,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import type { ToolPermission } from "@whispering233/ai-editor-shared";
|
|
3
|
+
import type { ToolContext } from "./context.js";
|
|
4
|
+
/**
|
|
5
|
+
* 工具定义(argsSchema 的推断类型约束 run 的 args 入参)。
|
|
6
|
+
* run 声明为**方法**(而非函数属性):方法参数双变检查——具体 schema 的
|
|
7
|
+
* ToolDefinition<X> 可赋给容器默认的 ToolDefinition<z.ZodTypeAny>(run args 为
|
|
8
|
+
* unknown),executor 从注册表取出后先 schema 校验(parsed.data 为 unknown)再执行,
|
|
9
|
+
* 运行时由 argsSchema 兜底,类型层面双变无实际风险。
|
|
10
|
+
*/
|
|
11
|
+
export interface ToolDefinition<TSchema extends z.ZodTypeAny = z.ZodTypeAny> {
|
|
12
|
+
/** 工具名(tools.md 工具目录,如 get_entity;LLM tool_call 的 tool 字段) */
|
|
13
|
+
name: string;
|
|
14
|
+
/** 人类可读描述(注入 LLM 工具列表,说明用途与参数语义) */
|
|
15
|
+
description: string;
|
|
16
|
+
/** 参数 zod schema(入参校验;推断类型即 run 的 args 类型) */
|
|
17
|
+
argsSchema: TSchema;
|
|
18
|
+
/** 权限级别(TOOL_PERMISSION.AUTO / PROPOSAL) */
|
|
19
|
+
permission: ToolPermission;
|
|
20
|
+
/**
|
|
21
|
+
* 执行函数:注入 ToolContext(db/outlineDir/projectId),返回可序列化结果或抛错。
|
|
22
|
+
* signal:可选取消通道(决策 16 ③「长工具执行中检查 signal」)——S6.4 分析类
|
|
23
|
+
* 是长任务候选,executor 在 SSE 断开时中止在途工具;同步短工具可不检查。
|
|
24
|
+
*/
|
|
25
|
+
run(ctx: ToolContext, args: z.infer<TSchema>, signal?: AbortSignal): unknown;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 注册单个工具:重复注册同名工具抛错——防后续切片扩展时撞名,
|
|
29
|
+
* 保证「注册表 = 工具目录唯一事实来源」。
|
|
30
|
+
* 防呆:name 必须为非空字符串(S6.4-6.7 拼错名不应静默注册新工具)。
|
|
31
|
+
*/
|
|
32
|
+
export declare function registerTool(def: ToolDefinition): void;
|
|
33
|
+
/** 批量注册(各工具模块组装定义数组后统一挂载;内部逐个调 registerTool 保证判重) */
|
|
34
|
+
export declare function registerTools(defs: readonly ToolDefinition[]): void;
|
|
35
|
+
/** 按名查询工具;未注册返回 undefined(executor 收到未知工具名时按失败处理) */
|
|
36
|
+
export declare function getTool(name: string): ToolDefinition | undefined;
|
|
37
|
+
/** 全部已注册工具(按名称排序,稳定输出;供 S7.2 上下文组装注入 LLM 工具列表) */
|
|
38
|
+
export declare function listTools(): ToolDefinition[];
|
|
39
|
+
/** 当前注册的工具数量(冒烟/测试断言用) */
|
|
40
|
+
export declare function toolCount(): number;
|
|
41
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD;;;;;;GAMG;AACH,MAAM,WAAW,cAAc,CAAC,OAAO,SAAS,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU;IACzE,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,UAAU,EAAE,OAAO,CAAC;IACpB,4CAA4C;IAC5C,UAAU,EAAE,cAAc,CAAC;IAC3B;;;;OAIG;IACH,GAAG,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC;CAC9E;AAKD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAQtD;AAED,qDAAqD;AACrD,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,cAAc,EAAE,GAAG,IAAI,CAEnE;AAED,qDAAqD;AACrD,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEhE;AAED,kDAAkD;AAClD,wBAAgB,SAAS,IAAI,cAAc,EAAE,CAE5C;AAED,0BAA0B;AAC1B,wBAAgB,SAAS,IAAI,MAAM,CAElC"}
|
package/dist/registry.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// 工具注册表(S6.3):统一工具定义结构 + 注册/查询 API
|
|
2
|
+
// 契约来源:doc/api/tools.md(工具分级、工具执行契约);doc/design/decisions.md 决策 14/15。
|
|
3
|
+
// 供后续切片扩展:S6.4 分析类 / S6.5 伏笔 / S6.6 提案 / S6.7 执行 + executor 均可
|
|
4
|
+
// registerTool 挂载新工具;S7.4 executor 通过 getTool(name) 按名调度。
|
|
5
|
+
//
|
|
6
|
+
// 定义结构 { name, description, argsSchema, permission, run }:
|
|
7
|
+
// - argsSchema:zod 参数校验(执行前 preflight 校验,批量 tool_call 先全部校验再执行,
|
|
8
|
+
// tools.md「工具执行契约」);校验失败即抛错(executor 统一转结构化 tool_result 喂回 LLM)
|
|
9
|
+
// - permission:TOOL_PERMISSION.AUTO(自动)/ PROPOSAL(提案确认)两级(tools.md「工具分级」)
|
|
10
|
+
// - run(ctx, args):同步执行,返回 JSON 可序列化结果;抛错即失败(不把失败编码进正常 content)
|
|
11
|
+
//
|
|
12
|
+
// 注册语义:重复注册同名工具抛错(防 S6.4-6.7 与查询类撞名;注册表是唯一事实来源)。
|
|
13
|
+
/** 注册表内部存储(Map 保证按名 O(1) 查询) */
|
|
14
|
+
const registry = new Map();
|
|
15
|
+
/**
|
|
16
|
+
* 注册单个工具:重复注册同名工具抛错——防后续切片扩展时撞名,
|
|
17
|
+
* 保证「注册表 = 工具目录唯一事实来源」。
|
|
18
|
+
* 防呆:name 必须为非空字符串(S6.4-6.7 拼错名不应静默注册新工具)。
|
|
19
|
+
*/
|
|
20
|
+
export function registerTool(def) {
|
|
21
|
+
if (typeof def.name !== "string" || def.name.trim() === "") {
|
|
22
|
+
throw new Error("registerTool: 工具名必须为非空字符串");
|
|
23
|
+
}
|
|
24
|
+
if (registry.has(def.name)) {
|
|
25
|
+
throw new Error(`registerTool: 工具 ${def.name} 已注册(重复注册禁止)`);
|
|
26
|
+
}
|
|
27
|
+
registry.set(def.name, def);
|
|
28
|
+
}
|
|
29
|
+
/** 批量注册(各工具模块组装定义数组后统一挂载;内部逐个调 registerTool 保证判重) */
|
|
30
|
+
export function registerTools(defs) {
|
|
31
|
+
for (const def of defs)
|
|
32
|
+
registerTool(def);
|
|
33
|
+
}
|
|
34
|
+
/** 按名查询工具;未注册返回 undefined(executor 收到未知工具名时按失败处理) */
|
|
35
|
+
export function getTool(name) {
|
|
36
|
+
return registry.get(name);
|
|
37
|
+
}
|
|
38
|
+
/** 全部已注册工具(按名称排序,稳定输出;供 S7.2 上下文组装注入 LLM 工具列表) */
|
|
39
|
+
export function listTools() {
|
|
40
|
+
return [...registry.values()].sort((a, b) => a.name.localeCompare(b.name));
|
|
41
|
+
}
|
|
42
|
+
/** 当前注册的工具数量(冒烟/测试断言用) */
|
|
43
|
+
export function toolCount() {
|
|
44
|
+
return registry.size;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,uEAAuE;AACvE,+DAA+D;AAC/D,0DAA0D;AAC1D,EAAE;AACF,2DAA2D;AAC3D,gEAAgE;AAChE,kEAAkE;AAClE,0EAA0E;AAC1E,gEAAgE;AAChE,EAAE;AACF,iDAAiD;AA8BjD,gCAAgC;AAChC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;AAEnD;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,GAAmB;IAC9C,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,CAAC,IAAI,cAAc,CAAC,CAAC;IAC9D,CAAC;IACD,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,aAAa,CAAC,IAA+B;IAC3D,KAAK,MAAM,GAAG,IAAI,IAAI;QAAE,YAAY,CAAC,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,SAAS;IACvB,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,0BAA0B;AAC1B,MAAM,UAAU,SAAS;IACvB,OAAO,QAAQ,CAAC,IAAI,CAAC;AACvB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@whispering233/ai-editor-tools",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "AI 工具目录:工具定义 + 执行器",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"publishConfig": {
|
|
18
|
+
"access": "public"
|
|
19
|
+
},
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsc -p tsconfig.json",
|
|
22
|
+
"dev": "tsc --watch",
|
|
23
|
+
"test": "vitest run",
|
|
24
|
+
"prepack": "node ../../scripts/prepare-package-for-publish.mjs",
|
|
25
|
+
"postpack": "node ../../scripts/restore-package-json.mjs"
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@whispering233/ai-editor-db": "0.0.1",
|
|
29
|
+
"@whispering233/ai-editor-shared": "0.0.1"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"typescript": "^5.8.0",
|
|
33
|
+
"zod": "^4.0.0"
|
|
34
|
+
}
|
|
35
|
+
}
|