@lemoncat7/dsh-knowledge 0.6.0-alpha.6
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/LICENSE +21 -0
- package/README.md +184 -0
- package/cordis.patch.yml +12 -0
- package/docs/architecture.md +107 -0
- package/docs/document-knowledge-design.zh-CN.md +329 -0
- package/docs/requirements.md +86 -0
- package/lib/api.d.ts +4 -0
- package/lib/api.d.ts.map +1 -0
- package/lib/api.js +497 -0
- package/lib/api.js.map +1 -0
- package/lib/client.js +420 -0
- package/lib/client.js.map +7 -0
- package/lib/config.d.ts +38 -0
- package/lib/config.d.ts.map +1 -0
- package/lib/config.js +84 -0
- package/lib/config.js.map +1 -0
- package/lib/connection.d.ts +15 -0
- package/lib/connection.d.ts.map +1 -0
- package/lib/connection.js +95 -0
- package/lib/connection.js.map +1 -0
- package/lib/control.d.ts +26 -0
- package/lib/control.d.ts.map +1 -0
- package/lib/control.js +149 -0
- package/lib/control.js.map +1 -0
- package/lib/domain.d.ts +207 -0
- package/lib/domain.d.ts.map +1 -0
- package/lib/domain.js +122 -0
- package/lib/domain.js.map +1 -0
- package/lib/extraction.d.ts +27 -0
- package/lib/extraction.d.ts.map +1 -0
- package/lib/extraction.js +367 -0
- package/lib/extraction.js.map +1 -0
- package/lib/index.d.ts +15 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +198 -0
- package/lib/index.js.map +1 -0
- package/lib/local-provider.d.ts +60 -0
- package/lib/local-provider.d.ts.map +1 -0
- package/lib/local-provider.js +1096 -0
- package/lib/local-provider.js.map +1 -0
- package/lib/provider-router.d.ts +19 -0
- package/lib/provider-router.d.ts.map +1 -0
- package/lib/provider-router.js +83 -0
- package/lib/provider-router.js.map +1 -0
- package/lib/provider.d.ts +38 -0
- package/lib/provider.d.ts.map +1 -0
- package/lib/provider.js +2 -0
- package/lib/provider.js.map +1 -0
- package/lib/recall.d.ts +8 -0
- package/lib/recall.d.ts.map +1 -0
- package/lib/recall.js +76 -0
- package/lib/recall.js.map +1 -0
- package/lib/remote-provider.d.ts +51 -0
- package/lib/remote-provider.d.ts.map +1 -0
- package/lib/remote-provider.js +216 -0
- package/lib/remote-provider.js.map +1 -0
- package/lib/retrieval.d.ts +35 -0
- package/lib/retrieval.d.ts.map +1 -0
- package/lib/retrieval.js +206 -0
- package/lib/retrieval.js.map +1 -0
- package/lib/runtime.d.ts +147 -0
- package/lib/runtime.d.ts.map +1 -0
- package/lib/runtime.js +26 -0
- package/lib/runtime.js.map +1 -0
- package/lib/tools.d.ts +6 -0
- package/lib/tools.d.ts.map +1 -0
- package/lib/tools.js +99 -0
- package/lib/tools.js.map +1 -0
- package/lib/web.d.ts +3 -0
- package/lib/web.d.ts.map +1 -0
- package/lib/web.js +71 -0
- package/lib/web.js.map +1 -0
- package/package.json +79 -0
- package/web/app.js +1686 -0
- package/web/index.html +19 -0
- package/web/styles.css +786 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# 首版需求
|
|
2
|
+
|
|
3
|
+
## 使用场景
|
|
4
|
+
|
|
5
|
+
一个 DSH 实例可以直接使用本地 SQLite 知识库,也可以作为中央知识库开放远程访问。另一台 DSH 或未来的桌面客户端安装同一个插件后,可以连接中央知识库。首版面向单用户和 NAS/LAN 部署,不提供多租户能力。
|
|
6
|
+
|
|
7
|
+
## 回答后提取
|
|
8
|
+
|
|
9
|
+
每次成功的助手回答完成后,插件在轮次提交前同步判断是否需要回写,并在回答下方持久化显示逐库结果。提取失败不得阻断下一轮对话。
|
|
10
|
+
|
|
11
|
+
提取器必须在目标范围内检索已有知识,并产生以下一种结果:
|
|
12
|
+
|
|
13
|
+
- `skip`:没有可复用知识或内容已经存在。
|
|
14
|
+
- `create`:产生新的原子知识候选。
|
|
15
|
+
- `update`:补充或修订已有知识,保留旧版本。
|
|
16
|
+
- `conflict`:与已有知识矛盾,等待用户选择。
|
|
17
|
+
|
|
18
|
+
审核写入模式下,除 `skip` 外的结果进入待审核区。直接写入模式下,所有无冲突内容自动通过,冲突仍必须审核。待审核知识不参与自动召回。
|
|
19
|
+
|
|
20
|
+
## 知识库与挂载
|
|
21
|
+
|
|
22
|
+
用户可创建多个知识库,每个库保存名称、回写匹配描述、默认标签和提取要求。匹配描述用于判断当前对话的可复用知识是否属于该库;挂载本身不能导致无关内容回写。知识条目和提取候选必须属于一个知识库。
|
|
23
|
+
|
|
24
|
+
项目和会话可挂载多个知识库。会话默认继承项目挂载;对同一库创建会话配置后,会话配置覆盖项目配置,包括显式关闭。每个挂载可设定:
|
|
25
|
+
|
|
26
|
+
- 是否召回。
|
|
27
|
+
- 仅召回、审核写入或直接写入。
|
|
28
|
+
- 包含与排除标签。
|
|
29
|
+
- 附加提取要求。
|
|
30
|
+
|
|
31
|
+
没有解析出任何挂载时,不进行召回、提取或回写。
|
|
32
|
+
|
|
33
|
+
## 知识模型
|
|
34
|
+
|
|
35
|
+
每条知识只表达一个独立知识点,并保存标题、正文、类型、标签、范围、状态、置信度、来源会话、来源消息、创建时间、更新时间和版本记录。
|
|
36
|
+
|
|
37
|
+
首版范围:
|
|
38
|
+
|
|
39
|
+
- `global`:所有项目可用。
|
|
40
|
+
- `project`:只在指定工作区或项目使用,并在冲突时优先于全局知识。
|
|
41
|
+
|
|
42
|
+
首版类型:
|
|
43
|
+
|
|
44
|
+
- `preference`:用户偏好。
|
|
45
|
+
- `fact`:事实或背景。
|
|
46
|
+
- `decision`:决策或约束。
|
|
47
|
+
- `procedure`:操作流程。
|
|
48
|
+
- `lesson`:经验结论。
|
|
49
|
+
|
|
50
|
+
技能设定不属于知识类型,后续由独立插件或模块管理。
|
|
51
|
+
|
|
52
|
+
## 检索与召回
|
|
53
|
+
|
|
54
|
+
SQLite 是本地后端的权威数据源。首版提供 FTS5 全文检索,并为可选 embedding provider 保留接口;未配置 embedding 时功能仍可使用。每次模型请求只自动召回有限数量的相关知识,用户和模型还可以显式搜索知识库。
|
|
55
|
+
|
|
56
|
+
## 本地与远程后端
|
|
57
|
+
|
|
58
|
+
插件提供统一的 knowledge provider 接口:
|
|
59
|
+
|
|
60
|
+
- `local` 后端读写本机 SQLite 文件。
|
|
61
|
+
- `remote` 后端通过 HTTPS 访问中央知识库。
|
|
62
|
+
- `local` 后端设置 `exposeApi` 后,同时承担中央知识库服务端角色。
|
|
63
|
+
|
|
64
|
+
首版不做本地库与远程库的透明双向同步。数据迁移使用显式导入和导出,远程客户端断网时不得写入中央知识库。
|
|
65
|
+
|
|
66
|
+
## 权限
|
|
67
|
+
|
|
68
|
+
中央知识库为每个客户端使用独立令牌。权限至少区分查询、提交候选、直接写入和管理。普通客户端默认只获得查询和提交候选权限。
|
|
69
|
+
|
|
70
|
+
## 管理界面
|
|
71
|
+
|
|
72
|
+
Web 管理界面至少支持:
|
|
73
|
+
|
|
74
|
+
- 查看和筛选生效知识。
|
|
75
|
+
- 创建和编辑知识库,设定标签与提取要求。
|
|
76
|
+
- 管理当前项目挂载与会话覆盖。
|
|
77
|
+
- 审核新增、更新和冲突候选。
|
|
78
|
+
- 修改、归档和彻底删除知识。
|
|
79
|
+
- 查看来源与版本历史。
|
|
80
|
+
- 管理客户端令牌。
|
|
81
|
+
|
|
82
|
+
管理界面随插件包提供,复用中央知识库认证 API,不引入单独进程。访问令牌只保存于浏览器会话;AI 生成内容必须明确标记为候选,审核确认前不得参与召回。
|
|
83
|
+
|
|
84
|
+
## Docker
|
|
85
|
+
|
|
86
|
+
插件随 DSH 应用运行,不要求单独容器。`DSH_HOME` 必须挂载为持久卷,使 SQLite、profile、插件依赖和配置在容器重建后保留。密钥只通过环境变量或外部 secret 提供。
|
package/lib/api.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { LocalKnowledgeProvider } from './local-provider.js';
|
|
2
|
+
import type { RuntimeContextLike } from './runtime.js';
|
|
3
|
+
export declare function registerKnowledgeApi(ctx: RuntimeContextLike, provider: LocalKnowledgeProvider, prefix: string): () => void;
|
|
4
|
+
//# sourceMappingURL=api.d.ts.map
|
package/lib/api.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAItD,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,kBAAkB,EACvB,QAAQ,EAAE,sBAAsB,EAChC,MAAM,EAAE,MAAM,GACb,MAAM,IAAI,CAcZ"}
|
package/lib/api.js
ADDED
|
@@ -0,0 +1,497 @@
|
|
|
1
|
+
import { DEFAULT_KNOWLEDGE_BASE_ID, isKnowledgeType, normalizeDraft, normalizeKnowledgeBaseDraft, normalizeKnowledgeMountDraft, } from './domain.js';
|
|
2
|
+
const MAX_BODY_BYTES = 1_048_576;
|
|
3
|
+
export function registerKnowledgeApi(ctx, provider, prefix) {
|
|
4
|
+
const webServer = ctx.webServer ?? ctx.get('webServer');
|
|
5
|
+
if (webServer === undefined)
|
|
6
|
+
throw new Error('exposeApi requires the DSH webServer service');
|
|
7
|
+
return webServer.register({
|
|
8
|
+
kind: 'prefix',
|
|
9
|
+
path: prefix,
|
|
10
|
+
handler: async (req, res) => {
|
|
11
|
+
try {
|
|
12
|
+
await dispatch(provider, prefix, req, res);
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
sendError(res, error);
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
async function dispatch(provider, prefix, req, res) {
|
|
21
|
+
const url = new URL(req.url ?? '/', 'http://knowledge.local');
|
|
22
|
+
const relative = url.pathname.slice(prefix.length).replace(/^\/+|\/+$/g, '');
|
|
23
|
+
const segments = relative.length === 0 ? [] : relative.split('/').map(decodeURIComponent);
|
|
24
|
+
const method = req.method ?? 'GET';
|
|
25
|
+
if (method === 'GET' && segments[0] === 'health') {
|
|
26
|
+
return sendJson(res, 200, { ok: true, service: 'dsh-knowledge', schemaVersion: 4 });
|
|
27
|
+
}
|
|
28
|
+
const actor = authenticate(provider, req);
|
|
29
|
+
if (method === 'GET' && segments[0] === 'search' && segments.length === 1) {
|
|
30
|
+
requirePermission(actor.permissions, 'read');
|
|
31
|
+
const types = url.searchParams.getAll('type').filter(isKnowledgeType);
|
|
32
|
+
const projectId = url.searchParams.get('projectId') ?? undefined;
|
|
33
|
+
const knowledgeBaseIds = url.searchParams.getAll('knowledgeBaseId').filter(Boolean);
|
|
34
|
+
const includeTags = url.searchParams.getAll('includeTag').filter(Boolean);
|
|
35
|
+
const excludeTags = url.searchParams.getAll('excludeTag').filter(Boolean);
|
|
36
|
+
const result = await provider.search({
|
|
37
|
+
text: url.searchParams.get('q') ?? '',
|
|
38
|
+
...projectId === undefined ? {} : { projectId },
|
|
39
|
+
...knowledgeBaseIds.length === 0 ? {} : { knowledgeBaseIds },
|
|
40
|
+
...includeTags.length === 0 ? {} : { includeTags },
|
|
41
|
+
...excludeTags.length === 0 ? {} : { excludeTags },
|
|
42
|
+
...types.length === 0 ? {} : { types },
|
|
43
|
+
limit: integerParam(url, 'limit', 10, 1, 100),
|
|
44
|
+
});
|
|
45
|
+
return sendJson(res, 200, result);
|
|
46
|
+
}
|
|
47
|
+
if (method === 'GET' && segments[0] === 'stats' && segments.length === 1) {
|
|
48
|
+
requirePermission(actor.permissions, 'read');
|
|
49
|
+
return sendJson(res, 200, await provider.stats());
|
|
50
|
+
}
|
|
51
|
+
if (segments[0] === 'knowledge-bases') {
|
|
52
|
+
if (method === 'GET' && segments.length === 1) {
|
|
53
|
+
requirePermission(actor.permissions, 'read');
|
|
54
|
+
return sendJson(res, 200, await provider.listKnowledgeBases());
|
|
55
|
+
}
|
|
56
|
+
if (method === 'POST' && segments.length === 1) {
|
|
57
|
+
requirePermission(actor.permissions, 'write');
|
|
58
|
+
const body = await readObject(req);
|
|
59
|
+
return sendJson(res, 201, await provider.createKnowledgeBase(parseKnowledgeBaseDraft(body.draft)));
|
|
60
|
+
}
|
|
61
|
+
const id = segments[1];
|
|
62
|
+
if (id !== undefined && method === 'GET' && segments.length === 2) {
|
|
63
|
+
requirePermission(actor.permissions, 'read');
|
|
64
|
+
const base = await provider.getKnowledgeBase(id);
|
|
65
|
+
if (base === undefined)
|
|
66
|
+
throw httpError(404, `knowledge base "${id}" was not found`);
|
|
67
|
+
return sendJson(res, 200, base);
|
|
68
|
+
}
|
|
69
|
+
if (id !== undefined && method === 'PUT' && segments.length === 2) {
|
|
70
|
+
requirePermission(actor.permissions, 'write');
|
|
71
|
+
const body = await readObject(req);
|
|
72
|
+
return sendJson(res, 200, await provider.updateKnowledgeBase(id, parseKnowledgeBaseDraft(body.draft)));
|
|
73
|
+
}
|
|
74
|
+
if (id !== undefined && method === 'PATCH' && segments.length === 2) {
|
|
75
|
+
requirePermission(actor.permissions, 'write');
|
|
76
|
+
const body = await readObject(req);
|
|
77
|
+
return sendJson(res, 200, await provider.patchKnowledgeBase(id, parseKnowledgeBasePatch(body.patch)));
|
|
78
|
+
}
|
|
79
|
+
if (id !== undefined && method === 'POST' && segments[2] === 'archive' && segments.length === 3) {
|
|
80
|
+
requirePermission(actor.permissions, 'admin');
|
|
81
|
+
return sendJson(res, 200, await provider.archiveKnowledgeBase(id));
|
|
82
|
+
}
|
|
83
|
+
if (id !== undefined && method === 'POST' && segments[2] === 'restore' && segments.length === 3) {
|
|
84
|
+
requirePermission(actor.permissions, 'admin');
|
|
85
|
+
return sendJson(res, 200, await provider.restoreKnowledgeBase(id));
|
|
86
|
+
}
|
|
87
|
+
if (id !== undefined && method === 'DELETE' && segments.length === 2) {
|
|
88
|
+
requirePermission(actor.permissions, 'admin');
|
|
89
|
+
await provider.deleteKnowledgeBase(id);
|
|
90
|
+
return sendJson(res, 204, undefined);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (segments[0] === 'mounts') {
|
|
94
|
+
if (method === 'GET' && segments[1] === 'resolve' && segments.length === 2) {
|
|
95
|
+
requirePermission(actor.permissions, 'read');
|
|
96
|
+
const sessionId = url.searchParams.get('sessionId')?.trim();
|
|
97
|
+
if (!sessionId)
|
|
98
|
+
throw httpError(400, 'sessionId is required');
|
|
99
|
+
return sendJson(res, 200, await provider.resolveMounts(sessionId, url.searchParams.get('projectId') ?? undefined));
|
|
100
|
+
}
|
|
101
|
+
if (method === 'GET' && segments.length === 1) {
|
|
102
|
+
requirePermission(actor.permissions, 'read');
|
|
103
|
+
const targetKind = url.searchParams.get('targetKind');
|
|
104
|
+
if (targetKind !== null && targetKind !== 'project' && targetKind !== 'session')
|
|
105
|
+
throw httpError(400, 'invalid mount targetKind');
|
|
106
|
+
return sendJson(res, 200, await provider.listMounts(targetKind ?? undefined, url.searchParams.get('targetId') ?? undefined));
|
|
107
|
+
}
|
|
108
|
+
if (method === 'POST' && segments.length === 1) {
|
|
109
|
+
requirePermission(actor.permissions, 'write');
|
|
110
|
+
const body = await readObject(req);
|
|
111
|
+
return sendJson(res, 200, await provider.upsertMount(parseMountDraft(body.draft)));
|
|
112
|
+
}
|
|
113
|
+
if (method === 'POST' && segments[1] === 'bulk' && segments.length === 2) {
|
|
114
|
+
requirePermission(actor.permissions, 'write');
|
|
115
|
+
const body = await readObject(req);
|
|
116
|
+
const upserts = Array.isArray(body.upserts) ? body.upserts.map(parseMountDraft) : [];
|
|
117
|
+
const deleteIds = Array.isArray(body.deleteIds)
|
|
118
|
+
? body.deleteIds.map(id => typeof id === 'string' ? id.trim() : '').filter(Boolean)
|
|
119
|
+
: [];
|
|
120
|
+
if (upserts.length + deleteIds.length === 0)
|
|
121
|
+
throw httpError(400, 'mount batch must contain at least one operation');
|
|
122
|
+
if (upserts.length + deleteIds.length > 500)
|
|
123
|
+
throw httpError(400, 'mount batch must contain at most 500 operations');
|
|
124
|
+
return sendJson(res, 200, await provider.applyMountBatch({ upserts, deleteIds }));
|
|
125
|
+
}
|
|
126
|
+
if (method === 'DELETE' && segments[1] !== undefined && segments.length === 2) {
|
|
127
|
+
requirePermission(actor.permissions, 'write');
|
|
128
|
+
await provider.deleteMount(segments[1]);
|
|
129
|
+
return sendJson(res, 204, undefined);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (segments[0] === 'documents') {
|
|
133
|
+
if (method === 'GET' && segments.length === 1) {
|
|
134
|
+
requirePermission(actor.permissions, 'read');
|
|
135
|
+
return sendJson(res, 200, await provider.listDocuments(url.searchParams.get('knowledgeBaseId') ?? undefined, url.searchParams.get('q') ?? undefined));
|
|
136
|
+
}
|
|
137
|
+
if (method === 'GET' && segments[1] !== undefined && segments.length === 2) {
|
|
138
|
+
requirePermission(actor.permissions, 'read');
|
|
139
|
+
const document = await provider.getDocument(segments[1]);
|
|
140
|
+
if (document === undefined)
|
|
141
|
+
throw httpError(404, `knowledge document "${segments[1]}" was not found`);
|
|
142
|
+
return sendJson(res, 200, document);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (segments[0] === 'entries') {
|
|
146
|
+
if (method === 'GET' && segments.length === 1) {
|
|
147
|
+
requirePermission(actor.permissions, 'read');
|
|
148
|
+
const status = url.searchParams.get('status');
|
|
149
|
+
const type = url.searchParams.get('type');
|
|
150
|
+
const projectId = url.searchParams.get('projectId') ?? undefined;
|
|
151
|
+
const knowledgeBaseId = url.searchParams.get('knowledgeBaseId') ?? undefined;
|
|
152
|
+
const cursor = url.searchParams.get('cursor') ?? undefined;
|
|
153
|
+
const result = await provider.list({
|
|
154
|
+
...status === 'active' || status === 'archived' ? { status } : {},
|
|
155
|
+
...type !== null && isKnowledgeType(type) ? { type } : {},
|
|
156
|
+
...projectId === undefined ? {} : { projectId },
|
|
157
|
+
...knowledgeBaseId === undefined ? {} : { knowledgeBaseId },
|
|
158
|
+
...cursor === undefined ? {} : { cursor },
|
|
159
|
+
limit: integerParam(url, 'limit', 50, 1, 100),
|
|
160
|
+
});
|
|
161
|
+
return sendJson(res, 200, result);
|
|
162
|
+
}
|
|
163
|
+
if (method === 'POST' && segments.length === 1) {
|
|
164
|
+
requirePermission(actor.permissions, 'write');
|
|
165
|
+
const body = await readObject(req);
|
|
166
|
+
return sendJson(res, 201, await provider.create(parseDraft(body.draft)));
|
|
167
|
+
}
|
|
168
|
+
const id = segments[1];
|
|
169
|
+
if (id !== undefined && method === 'GET' && segments.length === 2) {
|
|
170
|
+
requirePermission(actor.permissions, 'read');
|
|
171
|
+
const entry = await provider.get(id);
|
|
172
|
+
if (entry === undefined)
|
|
173
|
+
throw httpError(404, `knowledge entry "${id}" was not found`);
|
|
174
|
+
return sendJson(res, 200, entry);
|
|
175
|
+
}
|
|
176
|
+
if (id !== undefined && method === 'GET' && segments[2] === 'versions' && segments.length === 3) {
|
|
177
|
+
requirePermission(actor.permissions, 'read');
|
|
178
|
+
return sendJson(res, 200, await provider.versions(id));
|
|
179
|
+
}
|
|
180
|
+
if (id !== undefined && method === 'PUT' && segments.length === 2) {
|
|
181
|
+
requirePermission(actor.permissions, 'write');
|
|
182
|
+
const body = await readObject(req);
|
|
183
|
+
return sendJson(res, 200, await provider.update(id, parseDraft(body.draft)));
|
|
184
|
+
}
|
|
185
|
+
if (id !== undefined && method === 'POST' && segments[2] === 'archive' && segments.length === 3) {
|
|
186
|
+
requirePermission(actor.permissions, 'write');
|
|
187
|
+
return sendJson(res, 200, await provider.archive(id));
|
|
188
|
+
}
|
|
189
|
+
if (id !== undefined && method === 'DELETE' && segments.length === 2) {
|
|
190
|
+
requirePermission(actor.permissions, 'admin');
|
|
191
|
+
await provider.delete(id);
|
|
192
|
+
return sendJson(res, 204, undefined);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
if (segments[0] === 'candidates') {
|
|
196
|
+
if (method === 'GET' && segments.length === 1) {
|
|
197
|
+
requirePermission(actor.permissions, 'read');
|
|
198
|
+
const status = url.searchParams.get('status');
|
|
199
|
+
if (status !== 'pending' && status !== 'approved' && status !== 'rejected')
|
|
200
|
+
throw httpError(400, 'invalid candidate status');
|
|
201
|
+
return sendJson(res, 200, await provider.listCandidates(status, integerParam(url, 'limit', 50, 1, 100)));
|
|
202
|
+
}
|
|
203
|
+
if (method === 'POST' && segments.length === 1) {
|
|
204
|
+
requirePermission(actor.permissions, 'propose');
|
|
205
|
+
const body = await readObject(req);
|
|
206
|
+
return sendJson(res, 201, await provider.propose(parseProposal(body.proposal), optionalString(body.sourceKey)));
|
|
207
|
+
}
|
|
208
|
+
if (method === 'POST' && segments[1] !== undefined && segments[2] === 'review' && segments.length === 3) {
|
|
209
|
+
requirePermission(actor.permissions, 'write');
|
|
210
|
+
const body = await readObject(req);
|
|
211
|
+
return sendJson(res, 200, await provider.review(segments[1], parseReview(body)));
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
if (segments[0] === 'extraction-jobs' && segments[1] !== undefined) {
|
|
215
|
+
const sourceKey = segments[1];
|
|
216
|
+
if (method === 'GET' && segments.length === 2) {
|
|
217
|
+
requirePermission(actor.permissions, 'read');
|
|
218
|
+
const job = await provider.extractionJob(sourceKey);
|
|
219
|
+
if (job === undefined)
|
|
220
|
+
throw httpError(404, 'extraction job was not found');
|
|
221
|
+
return sendJson(res, 200, job);
|
|
222
|
+
}
|
|
223
|
+
requirePermission(actor.permissions, 'propose');
|
|
224
|
+
if (method === 'POST' && segments[2] === 'claim') {
|
|
225
|
+
return sendJson(res, 200, { claimed: await provider.claimExtraction(sourceKey) });
|
|
226
|
+
}
|
|
227
|
+
if (method === 'POST' && segments[2] === 'complete') {
|
|
228
|
+
const body = await readObject(req);
|
|
229
|
+
const count = typeof body.candidateCount === 'number' && Number.isInteger(body.candidateCount) ? body.candidateCount : 0;
|
|
230
|
+
await provider.completeExtraction(sourceKey, Math.max(0, count));
|
|
231
|
+
return sendJson(res, 204, undefined);
|
|
232
|
+
}
|
|
233
|
+
if (method === 'POST' && segments[2] === 'fail') {
|
|
234
|
+
const body = await readObject(req);
|
|
235
|
+
await provider.failExtraction(sourceKey, typeof body.error === 'string' ? body.error : 'remote extraction failed');
|
|
236
|
+
return sendJson(res, 204, undefined);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
if (segments[0] === 'tokens') {
|
|
240
|
+
requirePermission(actor.permissions, 'admin');
|
|
241
|
+
if (method === 'GET' && segments.length === 1)
|
|
242
|
+
return sendJson(res, 200, provider.listApiTokens());
|
|
243
|
+
if (method === 'POST' && segments.length === 1) {
|
|
244
|
+
const body = await readObject(req);
|
|
245
|
+
const name = typeof body.name === 'string' ? body.name : '';
|
|
246
|
+
const permissions = Array.isArray(body.permissions)
|
|
247
|
+
? body.permissions.filter((permission) => permission === 'read' || permission === 'propose' || permission === 'write' || permission === 'admin')
|
|
248
|
+
: [];
|
|
249
|
+
return sendJson(res, 201, provider.createApiToken(name, permissions));
|
|
250
|
+
}
|
|
251
|
+
if (method === 'DELETE' && segments[1] !== undefined && segments.length === 2) {
|
|
252
|
+
if (segments[1] === actor.id)
|
|
253
|
+
throw httpError(409, 'the current token cannot revoke itself');
|
|
254
|
+
provider.revokeApiToken(segments[1]);
|
|
255
|
+
return sendJson(res, 204, undefined);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
throw httpError(404, 'knowledge API route was not found');
|
|
259
|
+
}
|
|
260
|
+
function parseKnowledgeBaseDraft(value) {
|
|
261
|
+
if (!isRecord(value))
|
|
262
|
+
throw httpError(400, 'knowledge base draft is invalid');
|
|
263
|
+
try {
|
|
264
|
+
return normalizeKnowledgeBaseDraft({
|
|
265
|
+
name: typeof value.name === 'string' ? value.name : '',
|
|
266
|
+
description: typeof value.description === 'string' ? value.description : '',
|
|
267
|
+
defaultTags: Array.isArray(value.defaultTags) ? value.defaultTags.filter((tag) => typeof tag === 'string') : [],
|
|
268
|
+
extractionInstructions: typeof value.extractionInstructions === 'string' ? value.extractionInstructions : '',
|
|
269
|
+
...typeof value.writebackProvider === 'string' ? { writebackProvider: value.writebackProvider } : {},
|
|
270
|
+
...typeof value.writebackModel === 'string' ? { writebackModel: value.writebackModel } : {},
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
catch (error) {
|
|
274
|
+
throw httpError(400, error instanceof Error ? error.message : 'knowledge base draft is invalid');
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
function parseKnowledgeBasePatch(value) {
|
|
278
|
+
if (!isRecord(value))
|
|
279
|
+
throw httpError(400, 'knowledge base patch is invalid');
|
|
280
|
+
const patch = {};
|
|
281
|
+
if (Object.hasOwn(value, 'name')) {
|
|
282
|
+
if (typeof value.name !== 'string')
|
|
283
|
+
throw httpError(400, 'knowledge base patch name must be a string');
|
|
284
|
+
patch.name = value.name;
|
|
285
|
+
}
|
|
286
|
+
if (Object.hasOwn(value, 'description')) {
|
|
287
|
+
if (typeof value.description !== 'string')
|
|
288
|
+
throw httpError(400, 'knowledge base patch description must be a string');
|
|
289
|
+
patch.description = value.description;
|
|
290
|
+
}
|
|
291
|
+
if (Object.hasOwn(value, 'defaultTags')) {
|
|
292
|
+
if (!Array.isArray(value.defaultTags) || value.defaultTags.some(tag => typeof tag !== 'string')) {
|
|
293
|
+
throw httpError(400, 'knowledge base patch defaultTags must be a string array');
|
|
294
|
+
}
|
|
295
|
+
patch.defaultTags = value.defaultTags;
|
|
296
|
+
}
|
|
297
|
+
if (Object.hasOwn(value, 'extractionInstructions')) {
|
|
298
|
+
if (typeof value.extractionInstructions !== 'string')
|
|
299
|
+
throw httpError(400, 'knowledge base patch extractionInstructions must be a string');
|
|
300
|
+
patch.extractionInstructions = value.extractionInstructions;
|
|
301
|
+
}
|
|
302
|
+
if (Object.hasOwn(value, 'writebackProvider') || Object.hasOwn(value, 'writebackModel')) {
|
|
303
|
+
const provider = value.writebackProvider;
|
|
304
|
+
const model = value.writebackModel;
|
|
305
|
+
if (provider !== undefined && provider !== null && typeof provider !== 'string') {
|
|
306
|
+
throw httpError(400, 'knowledge base patch writebackProvider must be a string or null');
|
|
307
|
+
}
|
|
308
|
+
if (model !== undefined && model !== null && typeof model !== 'string') {
|
|
309
|
+
throw httpError(400, 'knowledge base patch writebackModel must be a string or null');
|
|
310
|
+
}
|
|
311
|
+
patch.writebackProvider = typeof provider === 'string' ? provider : null;
|
|
312
|
+
patch.writebackModel = typeof model === 'string' ? model : null;
|
|
313
|
+
}
|
|
314
|
+
if (Object.keys(patch).length === 0)
|
|
315
|
+
throw httpError(400, 'knowledge base patch must contain at least one editable field');
|
|
316
|
+
return patch;
|
|
317
|
+
}
|
|
318
|
+
function parseMountDraft(value) {
|
|
319
|
+
if (!isRecord(value))
|
|
320
|
+
throw httpError(400, 'knowledge mount draft is invalid');
|
|
321
|
+
if (value.targetKind !== 'project' && value.targetKind !== 'session') {
|
|
322
|
+
throw httpError(400, 'knowledge mount targetKind must be project or session');
|
|
323
|
+
}
|
|
324
|
+
try {
|
|
325
|
+
return normalizeKnowledgeMountDraft({
|
|
326
|
+
targetKind: value.targetKind,
|
|
327
|
+
targetId: typeof value.targetId === 'string' ? value.targetId : '',
|
|
328
|
+
knowledgeBaseId: typeof value.knowledgeBaseId === 'string' ? value.knowledgeBaseId : '',
|
|
329
|
+
enabled: value.enabled !== false,
|
|
330
|
+
recallEnabled: value.recallEnabled !== false,
|
|
331
|
+
writeMode: value.writeMode === 'direct' || value.writeMode === 'none' ? value.writeMode : 'audit',
|
|
332
|
+
includeTags: Array.isArray(value.includeTags) ? value.includeTags.filter((tag) => typeof tag === 'string') : [],
|
|
333
|
+
excludeTags: Array.isArray(value.excludeTags) ? value.excludeTags.filter((tag) => typeof tag === 'string') : [],
|
|
334
|
+
extractionInstructions: typeof value.extractionInstructions === 'string' ? value.extractionInstructions : '',
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
catch (error) {
|
|
338
|
+
throw httpError(400, error instanceof Error ? error.message : 'knowledge mount draft is invalid');
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
function authenticate(provider, req) {
|
|
342
|
+
const authorization = req.headers.authorization;
|
|
343
|
+
if (authorization === undefined || !authorization.startsWith('Bearer '))
|
|
344
|
+
throw httpError(401, 'bearer token is required');
|
|
345
|
+
const actor = provider.authenticate(authorization.slice(7).trim());
|
|
346
|
+
if (actor === undefined)
|
|
347
|
+
throw httpError(401, 'bearer token is invalid or revoked');
|
|
348
|
+
return actor;
|
|
349
|
+
}
|
|
350
|
+
function requirePermission(permissions, required) {
|
|
351
|
+
if (permissions.includes('admin'))
|
|
352
|
+
return;
|
|
353
|
+
if (required === 'read' && (permissions.includes('write') || permissions.includes('propose')))
|
|
354
|
+
return;
|
|
355
|
+
if (required === 'propose' && permissions.includes('write'))
|
|
356
|
+
return;
|
|
357
|
+
if (!permissions.includes(required))
|
|
358
|
+
throw httpError(403, `token lacks ${required} permission`);
|
|
359
|
+
}
|
|
360
|
+
async function readObject(req) {
|
|
361
|
+
const declared = Number(req.headers['content-length'] ?? 0);
|
|
362
|
+
if (Number.isFinite(declared) && declared > MAX_BODY_BYTES)
|
|
363
|
+
throw httpError(413, 'request body is too large');
|
|
364
|
+
const chunks = [];
|
|
365
|
+
let size = 0;
|
|
366
|
+
for await (const chunk of req) {
|
|
367
|
+
const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
368
|
+
size += buffer.length;
|
|
369
|
+
if (size > MAX_BODY_BYTES)
|
|
370
|
+
throw httpError(413, 'request body is too large');
|
|
371
|
+
chunks.push(buffer);
|
|
372
|
+
}
|
|
373
|
+
try {
|
|
374
|
+
const value = JSON.parse(Buffer.concat(chunks).toString('utf8'));
|
|
375
|
+
if (!isRecord(value))
|
|
376
|
+
throw new Error();
|
|
377
|
+
return value;
|
|
378
|
+
}
|
|
379
|
+
catch {
|
|
380
|
+
throw httpError(400, 'request body must be a JSON object');
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
function parseDraft(value) {
|
|
384
|
+
if (!isRecord(value) || !isRecord(value.scope))
|
|
385
|
+
throw httpError(400, 'draft is invalid');
|
|
386
|
+
if (!isKnowledgeType(value.type))
|
|
387
|
+
throw httpError(400, 'draft type is invalid');
|
|
388
|
+
const scope = value.scope.kind === 'global'
|
|
389
|
+
? { kind: 'global' }
|
|
390
|
+
: { kind: 'project', id: typeof value.scope.id === 'string' ? value.scope.id : '' };
|
|
391
|
+
try {
|
|
392
|
+
const source = isRecord(value.source) ? parseSource(value.source) : undefined;
|
|
393
|
+
return normalizeDraft({
|
|
394
|
+
knowledgeBaseId: optionalString(value.knowledgeBaseId) ?? DEFAULT_KNOWLEDGE_BASE_ID,
|
|
395
|
+
title: typeof value.title === 'string' ? value.title : '',
|
|
396
|
+
body: typeof value.body === 'string' ? value.body : '',
|
|
397
|
+
type: value.type,
|
|
398
|
+
tags: Array.isArray(value.tags) ? value.tags.filter((tag) => typeof tag === 'string') : [],
|
|
399
|
+
scope,
|
|
400
|
+
confidence: typeof value.confidence === 'number' ? value.confidence : 0.5,
|
|
401
|
+
...source === undefined ? {} : { source },
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
catch (error) {
|
|
405
|
+
throw httpError(400, error instanceof Error ? error.message : 'draft is invalid');
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
function parseProposal(value) {
|
|
409
|
+
if (!isRecord(value) || (value.action !== 'create' && value.action !== 'update' && value.action !== 'conflict')) {
|
|
410
|
+
throw httpError(400, 'proposal is invalid');
|
|
411
|
+
}
|
|
412
|
+
const targetId = optionalString(value.targetId);
|
|
413
|
+
if (value.action !== 'create' && targetId === undefined)
|
|
414
|
+
throw httpError(400, `${value.action} proposal requires targetId`);
|
|
415
|
+
return {
|
|
416
|
+
action: value.action,
|
|
417
|
+
...targetId === undefined ? {} : { targetId },
|
|
418
|
+
draft: parseDraft(value.draft),
|
|
419
|
+
reason: typeof value.reason === 'string' ? value.reason : '',
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
function parseReview(value) {
|
|
423
|
+
if (value.decision !== 'approve' && value.decision !== 'reject')
|
|
424
|
+
throw httpError(400, 'review decision is invalid');
|
|
425
|
+
const note = optionalString(value.note);
|
|
426
|
+
return {
|
|
427
|
+
decision: value.decision,
|
|
428
|
+
...note === undefined ? {} : { note },
|
|
429
|
+
...value.draft === undefined ? {} : { draft: parseDraft(value.draft) },
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
function parseSource(value) {
|
|
433
|
+
const sessionId = optionalString(value.sessionId);
|
|
434
|
+
const messageId = optionalString(value.messageId);
|
|
435
|
+
const clientId = optionalString(value.clientId);
|
|
436
|
+
return {
|
|
437
|
+
...sessionId === undefined ? {} : { sessionId },
|
|
438
|
+
...messageId === undefined ? {} : { messageId },
|
|
439
|
+
...typeof value.turn === 'number' && Number.isInteger(value.turn) ? { turn: value.turn } : {},
|
|
440
|
+
...clientId === undefined ? {} : { clientId },
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
function integerParam(url, name, fallback, min, max) {
|
|
444
|
+
const raw = url.searchParams.get(name);
|
|
445
|
+
if (raw === null)
|
|
446
|
+
return fallback;
|
|
447
|
+
const value = Number(raw);
|
|
448
|
+
if (!Number.isInteger(value) || value < min || value > max)
|
|
449
|
+
throw httpError(400, `${name} must be an integer from ${min} to ${max}`);
|
|
450
|
+
return value;
|
|
451
|
+
}
|
|
452
|
+
function sendJson(res, status, body) {
|
|
453
|
+
if (status === 204) {
|
|
454
|
+
res.writeHead(status, { 'cache-control': 'no-store' });
|
|
455
|
+
res.end();
|
|
456
|
+
return;
|
|
457
|
+
}
|
|
458
|
+
const payload = JSON.stringify(body);
|
|
459
|
+
res.writeHead(status, {
|
|
460
|
+
'content-type': 'application/json; charset=utf-8',
|
|
461
|
+
'content-length': Buffer.byteLength(payload),
|
|
462
|
+
'cache-control': 'no-store',
|
|
463
|
+
'x-content-type-options': 'nosniff',
|
|
464
|
+
});
|
|
465
|
+
res.end(payload);
|
|
466
|
+
}
|
|
467
|
+
function sendError(res, error) {
|
|
468
|
+
const status = statusOf(error);
|
|
469
|
+
const message = error instanceof Error ? error.message : 'internal knowledge API error';
|
|
470
|
+
sendJson(res, status, { error: status >= 500 ? 'internal knowledge API error' : message, code: codeOf(error) });
|
|
471
|
+
}
|
|
472
|
+
function statusOf(error) {
|
|
473
|
+
if (isRecord(error) && typeof error.status === 'number')
|
|
474
|
+
return error.status;
|
|
475
|
+
if (isRecord(error) && error.code === 'NOT_FOUND')
|
|
476
|
+
return 404;
|
|
477
|
+
if (isRecord(error) && error.code === 'CONFLICT')
|
|
478
|
+
return 409;
|
|
479
|
+
if (error instanceof Error && /UNIQUE constraint failed/.test(error.message))
|
|
480
|
+
return 409;
|
|
481
|
+
return 500;
|
|
482
|
+
}
|
|
483
|
+
function codeOf(error) {
|
|
484
|
+
if (isRecord(error) && typeof error.code === 'string')
|
|
485
|
+
return error.code;
|
|
486
|
+
return 'INTERNAL';
|
|
487
|
+
}
|
|
488
|
+
function httpError(status, message) {
|
|
489
|
+
return Object.assign(new Error(message), { status, code: status === 400 ? 'BAD_REQUEST' : `HTTP_${status}` });
|
|
490
|
+
}
|
|
491
|
+
function optionalString(value) {
|
|
492
|
+
return typeof value === 'string' && value.length > 0 ? value : undefined;
|
|
493
|
+
}
|
|
494
|
+
function isRecord(value) {
|
|
495
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
496
|
+
}
|
|
497
|
+
//# sourceMappingURL=api.js.map
|
package/lib/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|