@dshtrading/knowledge 0.4.0 → 0.5.0

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.
@@ -0,0 +1,13 @@
1
+ import { KnowledgeCard } from "./types.js";
2
+ //#region src/authors.d.ts
3
+ declare const AUTHOR_ALIASES: Readonly<Record<string, string>>;
4
+ /** 把作者名归一到规范名;未登记的写法原样返回(仅去除首尾空白)。 */
5
+ declare function canonicalAuthor(author: string): string;
6
+ /**
7
+ * 返回作者已归一的卡片副本;已是规范名时原样返回同一引用。
8
+ * 非破坏性:不修改传入卡片。缺 `source`/`author` 的畸形条目按原样放行——文件读取
9
+ * 层不为历史脏数据抛错,结构校验只在入库(`validateKnowledgeCard`)发生。
10
+ */
11
+ declare function canonicalizeCardAuthor(card: KnowledgeCard): KnowledgeCard;
12
+ //#endregion
13
+ export { AUTHOR_ALIASES, canonicalAuthor, canonicalizeCardAuthor };
package/lib/authors.js ADDED
@@ -0,0 +1,35 @@
1
+ //#region src/authors.ts
2
+ const AUTHOR_ALIASES = Object.freeze({
3
+ "鳄鱼派": "鳄鱼派(像鳄鱼一样思考)",
4
+ "鳄鱼派(公众号:像鳄鱼一样思考)": "鳄鱼派(像鳄鱼一样思考)",
5
+ "像鳄鱼一样思考(鳄鱼派)": "鳄鱼派(像鳄鱼一样思考)",
6
+ "zcl × DSH Master(自有分析,非外部素材)": "zcl × DSH Master(自有分析)",
7
+ "zcl × DSH Master(自有框架综合,非外部素材)": "zcl × DSH Master(自有分析)",
8
+ "山基说(素材提炼)/ zcl(分层核查,事实依据 facts/oil.md、facts/fed.md)": "山基说",
9
+ "小鹿投研日记(转播大摩闭门会 9.14,发言人Robin/Steven/钟申/Jenny;Laura股票部分视频截断未录)": "小鹿投研日记",
10
+ "中金点睛(刘刚、杨萱庭)": "中金点睛"
11
+ });
12
+ /** 把作者名归一到规范名;未登记的写法原样返回(仅去除首尾空白)。 */
13
+ function canonicalAuthor(author) {
14
+ const trimmed = author.trim();
15
+ return AUTHOR_ALIASES[trimmed] ?? trimmed;
16
+ }
17
+ /**
18
+ * 返回作者已归一的卡片副本;已是规范名时原样返回同一引用。
19
+ * 非破坏性:不修改传入卡片。缺 `source`/`author` 的畸形条目按原样放行——文件读取
20
+ * 层不为历史脏数据抛错,结构校验只在入库(`validateKnowledgeCard`)发生。
21
+ */
22
+ function canonicalizeCardAuthor(card) {
23
+ if (!card || typeof card !== "object" || !card.source || typeof card.source.author !== "string") return card;
24
+ const canonical = canonicalAuthor(card.source.author);
25
+ if (canonical === card.source.author) return card;
26
+ return {
27
+ ...card,
28
+ source: {
29
+ ...card.source,
30
+ author: canonical
31
+ }
32
+ };
33
+ }
34
+ //#endregion
35
+ export { AUTHOR_ALIASES, canonicalAuthor, canonicalizeCardAuthor };
package/lib/index.d.ts CHANGED
@@ -2,4 +2,5 @@ import { BuildGraphOptions, GraphLinkKind, KnowledgeCard, KnowledgeCardInput, Kn
2
2
  import { ValidationResult, generateCardId, validateKnowledgeCard } from "./validate.js";
3
3
  import { buildGraph } from "./graph.js";
4
4
  import { createMemoryKnowledgeCardStore } from "./store-memory.js";
5
- export { type BuildGraphOptions, type GraphLinkKind, type KnowledgeCard, type KnowledgeCardInput, type KnowledgeCardStore, type KnowledgeCredibility, type KnowledgeFactCheck, type KnowledgeGraphData, type KnowledgeGraphLink, type KnowledgeGraphNode, type KnowledgeSource, type KnowledgeSourceType, type ValidationResult, buildGraph, createMemoryKnowledgeCardStore, generateCardId, validateKnowledgeCard };
5
+ import { AUTHOR_ALIASES, canonicalAuthor, canonicalizeCardAuthor } from "./authors.js";
6
+ export { AUTHOR_ALIASES, type BuildGraphOptions, type GraphLinkKind, type KnowledgeCard, type KnowledgeCardInput, type KnowledgeCardStore, type KnowledgeCredibility, type KnowledgeFactCheck, type KnowledgeGraphData, type KnowledgeGraphLink, type KnowledgeGraphNode, type KnowledgeSource, type KnowledgeSourceType, type ValidationResult, buildGraph, canonicalAuthor, canonicalizeCardAuthor, createMemoryKnowledgeCardStore, generateCardId, validateKnowledgeCard };
package/lib/index.js CHANGED
@@ -1,4 +1,5 @@
1
+ import { AUTHOR_ALIASES, canonicalAuthor, canonicalizeCardAuthor } from "./authors.js";
1
2
  import { generateCardId, validateKnowledgeCard } from "./validate.js";
2
3
  import { buildGraph } from "./graph.js";
3
4
  import { createMemoryKnowledgeCardStore } from "./store-memory.js";
4
- export { buildGraph, createMemoryKnowledgeCardStore, generateCardId, validateKnowledgeCard };
5
+ export { AUTHOR_ALIASES, buildGraph, canonicalAuthor, canonicalizeCardAuthor, createMemoryKnowledgeCardStore, generateCardId, validateKnowledgeCard };
@@ -1,3 +1,4 @@
1
+ import { canonicalizeCardAuthor } from "./authors.js";
1
2
  import { readFile } from "node:fs/promises";
2
3
  import { writeJsonAtomic } from "@dshtrading/dsh-home";
3
4
  //#region src/knowledge-fs.ts
@@ -15,7 +16,13 @@ function createFileKnowledgeCardStore(filePath) {
15
16
  const parsed = JSON.parse(content);
16
17
  const map = /* @__PURE__ */ new Map();
17
18
  if (Array.isArray(parsed)) {
18
- for (const item of parsed) if (item && typeof item.id === "string") map.set(item.id, item);
19
+ let healed = 0;
20
+ for (const item of parsed) if (item && typeof item.id === "string") {
21
+ const card = canonicalizeCardAuthor(item);
22
+ if (card !== item) healed += 1;
23
+ map.set(item.id, card);
24
+ }
25
+ if (healed > 0) console.warn(`[dsh-trading/knowledge] 作者别名归一:读取时治愈 ${healed} 张历史卡片(${filePath});下一次写操作会把结果落盘`);
19
26
  }
20
27
  cache = map;
21
28
  return map;
@@ -42,7 +49,7 @@ function createFileKnowledgeCardStore(filePath) {
42
49
  },
43
50
  async save(card) {
44
51
  const map = await load();
45
- map.set(card.id, { ...card });
52
+ map.set(card.id, canonicalizeCardAuthor({ ...card }));
46
53
  await flush(map);
47
54
  },
48
55
  async delete(id) {
@@ -1,7 +1,8 @@
1
+ import { canonicalizeCardAuthor } from "./authors.js";
1
2
  //#region src/store-memory.ts
2
3
  function createMemoryKnowledgeCardStore(initialCards = []) {
3
4
  const map = /* @__PURE__ */ new Map();
4
- for (const c of initialCards) map.set(c.id, { ...c });
5
+ for (const c of initialCards) map.set(c.id, canonicalizeCardAuthor({ ...c }));
5
6
  return {
6
7
  async list() {
7
8
  return Array.from(map.values());
@@ -14,7 +15,7 @@ function createMemoryKnowledgeCardStore(initialCards = []) {
14
15
  for (const card of map.values()) if (card.source.url.trim() === trimmed) return card;
15
16
  },
16
17
  async save(card) {
17
- map.set(card.id, { ...card });
18
+ map.set(card.id, canonicalizeCardAuthor({ ...card }));
18
19
  },
19
20
  async delete(id) {
20
21
  return map.delete(id);
package/lib/tool.js CHANGED
@@ -186,7 +186,10 @@ function createKnowledgeIngestTool(store, options = {}) {
186
186
  const card = validation.card;
187
187
  await store.save(card);
188
188
  onWritten?.(card);
189
- return `[knowledge_ingest] ${!!existingByUrl ? "成功更新已有知识卡片" : "成功创建新知识卡片"} [${card.id}] "${card.title}" (标签: ${card.tags.join(", ")}${card.related?.length ? `, 关联: ${card.related.join(", ")}` : ""})`;
189
+ const actionDesc = !!existingByUrl ? "成功更新已有知识卡片" : "成功创建新知识卡片";
190
+ const requestedAuthor = typeof args.sourceAuthor === "string" ? args.sourceAuthor.trim() : "";
191
+ const authorNote = requestedAuthor !== "" && requestedAuthor !== card.source.author ? `(作者已归一:${requestedAuthor} → ${card.source.author})` : "";
192
+ return `[knowledge_ingest] ${actionDesc} [${card.id}] "${card.title}"${authorNote} (标签: ${card.tags.join(", ")}${card.related?.length ? `, 关联: ${card.related.join(", ")}` : ""})`;
190
193
  }
191
194
  });
192
195
  }
package/lib/validate.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { canonicalAuthor } from "./authors.js";
1
2
  //#region src/validate.ts
2
3
  const ALLOWED_CREDIBILITY = /* @__PURE__ */ new Set([
3
4
  "high",
@@ -103,7 +104,7 @@ function validateKnowledgeCard(input, existingCards = []) {
103
104
  source: {
104
105
  type: input.source.type,
105
106
  url: input.source.url.trim(),
106
- author: input.source.author.trim(),
107
+ author: canonicalAuthor(input.source.author),
107
108
  publishedAt: input.source.publishedAt
108
109
  },
109
110
  credibility: input.credibility,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@dshtrading/knowledge",
3
3
  "description": "Knowledge base data plane for dsh-trading: KnowledgeCard data model, validation, graph builder, atomic file store, and knowledge_ingest / knowledge_search agent tools.",
4
- "version": "0.4.0",
4
+ "version": "0.5.0",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
7
7
  "types": "./lib/index.d.ts",
@@ -25,9 +25,9 @@
25
25
  ],
26
26
  "license": "PolyForm-Noncommercial-1.0.0",
27
27
  "dependencies": {
28
- "@deepseek-ai/dsh-tools": "0.1.5-rc.1",
29
- "@deepseek-ai/schemastery": "^3.18.2",
30
- "@dshtrading/dsh-home": "^0.4.0"
28
+ "@deepseek-ai/dsh-tools": "0.2.0-rc.2",
29
+ "@deepseek-ai/schemastery": "^3.18.4",
30
+ "@dshtrading/dsh-home": "^0.5.0"
31
31
  },
32
32
  "peerDependencies": {
33
33
  "@deepseek-ai/cordis": ">=4.0.0"