dsh-data-domain-knowledge 0.1.0-alpha.2 → 0.1.0-alpha.4
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/README.md +147 -19
- package/cordis.patch.yml +25 -10
- package/lib/client.js +6400 -3326
- package/lib/doc-page.js +7761 -0
- package/lib/types/convert/host.d.ts.map +1 -1
- package/lib/types/convert/host.js +63 -11
- package/lib/types/convert/host.js.map +1 -1
- package/lib/types/convert/ingest.d.ts +7 -4
- package/lib/types/convert/ingest.d.ts.map +1 -1
- package/lib/types/convert/ingest.js +52 -14
- package/lib/types/convert/ingest.js.map +1 -1
- package/lib/types/convert/types.d.ts +2 -2
- package/lib/types/convert/types.d.ts.map +1 -1
- package/lib/types/convert/types.js +2 -2
- package/lib/types/convert/types.js.map +1 -1
- package/lib/types/diagnosis/cards.d.ts +8 -7
- package/lib/types/diagnosis/cards.d.ts.map +1 -1
- package/lib/types/diagnosis/cards.js +119 -49
- package/lib/types/diagnosis/cards.js.map +1 -1
- package/lib/types/diagnosis/run.d.ts +57 -0
- package/lib/types/diagnosis/run.d.ts.map +1 -0
- package/lib/types/diagnosis/run.js +245 -0
- package/lib/types/diagnosis/run.js.map +1 -0
- package/lib/types/diagnosis/schema.d.ts +25 -2
- package/lib/types/diagnosis/schema.d.ts.map +1 -1
- package/lib/types/diagnosis/schema.js +64 -25
- package/lib/types/diagnosis/schema.js.map +1 -1
- package/lib/types/diagnosis/seed-source.d.ts +17 -2
- package/lib/types/diagnosis/seed-source.d.ts.map +1 -1
- package/lib/types/diagnosis/seed-source.js +19 -2
- package/lib/types/diagnosis/seed-source.js.map +1 -1
- package/lib/types/diagnosis/seed.d.ts +32 -42
- package/lib/types/diagnosis/seed.d.ts.map +1 -1
- package/lib/types/diagnosis/seed.js +187 -51
- package/lib/types/diagnosis/seed.js.map +1 -1
- package/lib/types/diagnosis/store.d.ts +95 -25
- package/lib/types/diagnosis/store.d.ts.map +1 -1
- package/lib/types/diagnosis/store.js +297 -166
- package/lib/types/diagnosis/store.js.map +1 -1
- package/lib/types/diagnosis/types.d.ts +168 -16
- package/lib/types/diagnosis/types.d.ts.map +1 -1
- package/lib/types/diagnosis/types.js +1 -1
- package/lib/types/diagnosis/types.js.map +1 -1
- package/lib/types/document-page.d.ts +39 -0
- package/lib/types/document-page.d.ts.map +1 -0
- package/lib/types/document-page.js +43 -0
- package/lib/types/document-page.js.map +1 -0
- package/lib/types/extract-model.d.ts +67 -27
- package/lib/types/extract-model.d.ts.map +1 -1
- package/lib/types/extract-model.js +225 -97
- package/lib/types/extract-model.js.map +1 -1
- package/lib/types/extract.d.ts +16 -0
- package/lib/types/extract.d.ts.map +1 -1
- package/lib/types/extract.js +19 -2
- package/lib/types/extract.js.map +1 -1
- package/lib/types/fs-atomic.d.ts +11 -0
- package/lib/types/fs-atomic.d.ts.map +1 -0
- package/lib/types/fs-atomic.js +41 -0
- package/lib/types/fs-atomic.js.map +1 -0
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/index.js +466 -63
- package/lib/types/index.js.map +1 -1
- package/lib/types/intent/types.js +1 -1
- package/lib/types/intent/types.js.map +1 -1
- package/lib/types/knowledge-bases.d.ts +23 -12
- package/lib/types/knowledge-bases.d.ts.map +1 -1
- package/lib/types/knowledge-bases.js +37 -44
- package/lib/types/knowledge-bases.js.map +1 -1
- package/lib/types/layout.d.ts +3 -3
- package/lib/types/layout.d.ts.map +1 -1
- package/lib/types/layout.js +4 -4
- package/lib/types/layout.js.map +1 -1
- package/lib/types/migrate.d.ts +1 -1
- package/lib/types/migrate.js +2 -2
- package/lib/types/migrate.js.map +1 -1
- package/lib/types/model-text.d.ts +99 -0
- package/lib/types/model-text.d.ts.map +1 -0
- package/lib/types/model-text.js +103 -0
- package/lib/types/model-text.js.map +1 -0
- package/lib/types/present.d.ts +239 -0
- package/lib/types/present.d.ts.map +1 -0
- package/lib/types/present.js +255 -0
- package/lib/types/present.js.map +1 -0
- package/lib/types/recall-rank.d.ts +37 -0
- package/lib/types/recall-rank.d.ts.map +1 -1
- package/lib/types/recall-rank.js +41 -1
- package/lib/types/recall-rank.js.map +1 -1
- package/lib/types/runtime.d.ts +564 -31
- package/lib/types/runtime.d.ts.map +1 -1
- package/lib/types/runtime.js +2645 -292
- package/lib/types/runtime.js.map +1 -1
- package/lib/types/settings-schema.d.ts +4 -2
- package/lib/types/settings-schema.d.ts.map +1 -1
- package/lib/types/settings-schema.js +2 -0
- package/lib/types/settings-schema.js.map +1 -1
- package/lib/types/source-images.d.ts +118 -0
- package/lib/types/source-images.d.ts.map +1 -0
- package/lib/types/source-images.js +288 -0
- package/lib/types/source-images.js.map +1 -0
- package/lib/types/types.d.ts +356 -28
- package/lib/types/types.d.ts.map +1 -1
- package/lib/types/types.js +112 -18
- package/lib/types/types.js.map +1 -1
- package/lib/types/wiki-finalize.d.ts +140 -0
- package/lib/types/wiki-finalize.d.ts.map +1 -0
- package/lib/types/wiki-finalize.js +269 -0
- package/lib/types/wiki-finalize.js.map +1 -0
- package/lib/types/wiki-types.d.ts +10 -2
- package/lib/types/wiki-types.d.ts.map +1 -1
- package/lib/types/wiki-types.js +27 -30
- package/lib/types/wiki-types.js.map +1 -1
- package/package.json +4 -3
- package/preset/tita-data-agent/agent.cordis.yml +25 -10
- package/src/client/DirectoryPicker.tsx +12 -12
- package/src/client/DrawerSection.tsx +18 -0
- package/src/client/InfoHint.tsx +21 -8
- package/src/client/IntentTab.tsx +20 -26
- package/src/client/KnowledgeBaseTab.tsx +458 -158
- package/src/client/KnowledgePanel.tsx +44 -10
- package/src/client/KnowledgeStepRail.tsx +3 -0
- package/src/client/KnowledgeToolRow.tsx +331 -0
- package/src/client/NodeSettings.tsx +20 -22
- package/src/client/PreviewSections.tsx +178 -43
- package/src/client/RecallPanel.tsx +418 -127
- package/src/client/TypeDefinitionDrawer.tsx +154 -54
- package/src/client/WikiCardReview.tsx +266 -0
- package/src/client/WikiFlowCard.tsx +57 -95
- package/src/client/WikiTypeEditor.tsx +197 -95
- package/src/client/arch/AgentArchitectureGraph.tsx +30 -14
- package/src/client/arch/NodeLogicPanel.tsx +6 -3
- package/src/client/arch/model.ts +164 -26
- package/src/client/architecture.css +25 -10
- package/src/client/architecture.tsx +66 -41
- package/src/client/asset-images.ts +125 -0
- package/src/client/attribution/AttributionGraph.tsx +481 -34
- package/src/client/attribution/AttributionTab.tsx +501 -106
- package/src/client/attribution/CaseView.tsx +9 -14
- package/src/client/attribution/GraphStage.tsx +25 -18
- package/src/client/attribution/RunView.tsx +27 -9
- package/src/client/attribution/StageChrome.tsx +280 -140
- package/src/client/attribution/graph-options.ts +611 -47
- package/src/client/attribution/model.ts +559 -30
- package/src/client/convert/ConvertPanel.tsx +36 -4
- package/src/client/doc-page.css +134 -0
- package/src/client/doc-page.tsx +242 -0
- package/src/client/index.ts +18 -0
- package/src/client/panel-state.ts +105 -0
- package/src/client/problem-domains.ts +1 -1
- package/src/client/request.ts +36 -0
- package/src/client/styles.css +397 -54
- package/src/client/useFitScale.ts +15 -2
- package/src/client/wiki-type-groups.ts +86 -0
- package/src/convert/host.ts +68 -9
- package/src/convert/ingest.ts +61 -18
- package/src/convert/types.ts +2 -2
- package/src/diagnosis/cards.ts +120 -50
- package/src/diagnosis/run.ts +251 -0
- package/src/diagnosis/schema.ts +67 -26
- package/src/diagnosis/seed-source.ts +29 -4
- package/src/diagnosis/seed.ts +187 -85
- package/src/diagnosis/store.ts +310 -173
- package/src/diagnosis/types.ts +181 -16
- package/src/document-page.ts +51 -0
- package/src/extract-model.ts +254 -99
- package/src/extract.ts +35 -3
- package/src/fs-atomic.ts +41 -0
- package/src/index.ts +499 -62
- package/src/intent/types.ts +1 -1
- package/src/knowledge-bases.ts +50 -49
- package/src/layout.ts +4 -4
- package/src/migrate.ts +2 -2
- package/src/model-text.ts +126 -0
- package/src/present.ts +367 -0
- package/src/recall-rank.ts +57 -2
- package/src/runtime.ts +2802 -293
- package/src/settings-schema.ts +2 -0
- package/src/source-images.ts +326 -0
- package/src/types.ts +446 -45
- package/src/wiki-finalize.ts +310 -0
- package/src/wiki-types.ts +28 -32
|
@@ -46,7 +46,7 @@ export declare const KNOWLEDGE_SETTINGS_SCHEMA: z<Schemastery.ObjectS<NoInfer<{
|
|
|
46
46
|
* 是为了让老用户的 settings JSON 还能被解析出来,从而知道旧树在哪。
|
|
47
47
|
*/
|
|
48
48
|
rootDir: z<string, string, "defined">;
|
|
49
|
-
schemaTypes: z<("case" | "diagnosis/symptom" | "diagnosis/hypothesis" | "diagnosis/check" | "diagnosis/failure-
|
|
49
|
+
schemaTypes: z<("case" | "table" | "metric" | "diagnosis/symptom" | "diagnosis/hypothesis" | "diagnosis/check-point" | "diagnosis/failure-reason" | "diagnosis/case" | "concept" | "event" | "playbook")[], ("case" | "table" | "metric" | "diagnosis/symptom" | "diagnosis/hypothesis" | "diagnosis/check-point" | "diagnosis/failure-reason" | "diagnosis/case" | "concept" | "event" | "playbook")[], "defined">;
|
|
50
50
|
/**
|
|
51
51
|
* @deprecated 0013:来源分类改为按知识库持久化的注册表。这里保留一个**宽松**
|
|
52
52
|
* 的历史字段(旧的 zod union 会把自定义分类直接判为非法,等于把配置入口焊死),
|
|
@@ -70,6 +70,7 @@ export declare const KNOWLEDGE_SETTINGS_SCHEMA: z<Schemastery.ObjectS<NoInfer<{
|
|
|
70
70
|
keywordThreshold: z<number, number, "defined">;
|
|
71
71
|
vectorThreshold: z<number, number, "defined">;
|
|
72
72
|
contextTopN: z<number, number, "defined">;
|
|
73
|
+
contextMaxChars: z<number, number, "defined">;
|
|
73
74
|
rerankThreshold: z<number, number, "defined">;
|
|
74
75
|
rerankProvider: z<"none" | "bert-python", "none" | "bert-python", "defined">;
|
|
75
76
|
rerankModel: z<string, string, "defined">;
|
|
@@ -85,7 +86,7 @@ export declare const KNOWLEDGE_SETTINGS_SCHEMA: z<Schemastery.ObjectS<NoInfer<{
|
|
|
85
86
|
* 是为了让老用户的 settings JSON 还能被解析出来,从而知道旧树在哪。
|
|
86
87
|
*/
|
|
87
88
|
rootDir: z<string, string, "defined">;
|
|
88
|
-
schemaTypes: z<("case" | "diagnosis/symptom" | "diagnosis/hypothesis" | "diagnosis/check" | "diagnosis/failure-
|
|
89
|
+
schemaTypes: z<("case" | "table" | "metric" | "diagnosis/symptom" | "diagnosis/hypothesis" | "diagnosis/check-point" | "diagnosis/failure-reason" | "diagnosis/case" | "concept" | "event" | "playbook")[], ("case" | "table" | "metric" | "diagnosis/symptom" | "diagnosis/hypothesis" | "diagnosis/check-point" | "diagnosis/failure-reason" | "diagnosis/case" | "concept" | "event" | "playbook")[], "defined">;
|
|
89
90
|
/**
|
|
90
91
|
* @deprecated 0013:来源分类改为按知识库持久化的注册表。这里保留一个**宽松**
|
|
91
92
|
* 的历史字段(旧的 zod union 会把自定义分类直接判为非法,等于把配置入口焊死),
|
|
@@ -109,6 +110,7 @@ export declare const KNOWLEDGE_SETTINGS_SCHEMA: z<Schemastery.ObjectS<NoInfer<{
|
|
|
109
110
|
keywordThreshold: z<number, number, "defined">;
|
|
110
111
|
vectorThreshold: z<number, number, "defined">;
|
|
111
112
|
contextTopN: z<number, number, "defined">;
|
|
113
|
+
contextMaxChars: z<number, number, "defined">;
|
|
112
114
|
rerankThreshold: z<number, number, "defined">;
|
|
113
115
|
rerankProvider: z<"none" | "bert-python", "none" | "bert-python", "defined">;
|
|
114
116
|
rerankModel: z<string, string, "defined">;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-schema.d.ts","sourceRoot":"","sources":["../../src/settings-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAMxC,iFAAiF;AACjF,eAAO,MAAM,kBAAkB,8BAA8B,CAAA;AAE7D,eAAO,MAAM,yBAAyB;IACpC;;OAEG;;IAEH;;;;OAIG;;;IAGH;;;;OAIG
|
|
1
|
+
{"version":3,"file":"settings-schema.d.ts","sourceRoot":"","sources":["../../src/settings-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAMxC,iFAAiF;AACjF,eAAO,MAAM,kBAAkB,8BAA8B,CAAA;AAE7D,eAAO,MAAM,yBAAyB;IACpC;;OAEG;;IAEH;;;;OAIG;;;IAGH;;;;OAIG;;;;;;;;;;;;;;;;;;;;;;;;;IAfH;;OAEG;;IAEH;;;;OAIG;;;IAGH;;;;OAIG;;;;;;;;;;;;;;;;;;;;;;;;aAmCF,CAAA"}
|
|
@@ -81,6 +81,8 @@ export const KNOWLEDGE_SETTINGS_SCHEMA = z.object(volatileFields({
|
|
|
81
81
|
keywordThreshold: z.number().min(0).max(1).default(DEFAULT_KNOWLEDGE_CONFIG.keywordThreshold),
|
|
82
82
|
vectorThreshold: z.number().min(-1).max(1).default(DEFAULT_KNOWLEDGE_CONFIG.vectorThreshold),
|
|
83
83
|
contextTopN: z.number().step(1).min(1).max(50).default(DEFAULT_KNOWLEDGE_CONFIG.contextTopN),
|
|
84
|
+
// 0050:上下文最大字符数。`0` = 不限(不是「默认」,是明确要求不设上限)。
|
|
85
|
+
contextMaxChars: z.number().step(1000).min(0).max(1_000_000).default(DEFAULT_KNOWLEDGE_CONFIG.contextMaxChars),
|
|
84
86
|
// 重排阈值与 WeKnora 同刻度:**原始 cross-encoder logit**(−10..10,默认 0.2)。
|
|
85
87
|
// 展示用的 `rerankScore` 是它的 sigmoid,两者单调等价 —— 但阈值留在原始刻度上,
|
|
86
88
|
// 这样「0.2」这个数与参照实现的配置可以直接对照。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-schema.js","sourceRoot":"","sources":["../../src/settings-schema.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"settings-schema.js","sourceRoot":"","sources":["../../src/settings-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 来源里的图片怎么落进卡片正文(0046)。
|
|
3
|
+
*
|
|
4
|
+
* ## 为什么要有这一步
|
|
5
|
+
*
|
|
6
|
+
* 一篇公众号文章 22 张图表,图片已经跟着转换内核落到知识库根目录的
|
|
7
|
+
* `01_source_raw/_assets/` 下,但编译出来的 8 张卡片正文里**一条图片引用都没有** ——
|
|
8
|
+
* 因为抽取那一段交给模型的是文字,模型给回来的正文里没有图。于是
|
|
9
|
+
* `imagePaths` 一直是空的,多模态编码拿不到图,图表承载的结论(「景气上行板块领涨」
|
|
10
|
+
* 那张图、`图表11` 的收益率矩阵)在召回里等于不存在。
|
|
11
|
+
*
|
|
12
|
+
* ## 怎么决定「哪张图去哪张卡」
|
|
13
|
+
*
|
|
14
|
+
* 一段话配一张图,所以判据是**文字**,不是顺序:
|
|
15
|
+
*
|
|
16
|
+
* 1. **第一档**:拿图**前面最近那一段话**去各张卡片的正文里比对。命中率够高
|
|
17
|
+
* ({@link ANCHOR_MIN})就说明「这张卡讲的就是这段文字」,图落在这张卡上。
|
|
18
|
+
* 2. **第二档**:锚点对不上时(模型把那段话改写过),退回**图所在的来源小节**:
|
|
19
|
+
* 整节的文字和哪张卡重合度最高,图就归哪张卡。阈值低得多
|
|
20
|
+
* ({@link SECTION_MIN}),因为比的是整节而不是一段。
|
|
21
|
+
* 3. 两档都不够 → **不挂**。宁可少一张图,也不要把图挂到一张讲别的事的卡上:
|
|
22
|
+
* 多模态召回会把它当成这张卡的证据。
|
|
23
|
+
*
|
|
24
|
+
* 比对用 12 字滑窗命中率而不是整串包含:模型改写时常常删掉「(参见图表12)」这种
|
|
25
|
+
* 图号指引,或者改几个字,整串包含会全部落空,滑窗不会。
|
|
26
|
+
*
|
|
27
|
+
* ## 落点在正文的哪里
|
|
28
|
+
*
|
|
29
|
+
* 卡片正文里找**命中率最高的那一段**,把图插在它后面 —— 图跟在它说明的文字下面,
|
|
30
|
+
* 而不是堆在卡片末尾。这样按 `##` 小节切出来的 wikiNote 只会带自己那一节的图,
|
|
31
|
+
* 而多模态编码只吃每张 note 的**第一张**图(`vectorInputs`),落点正确才编码得对。
|
|
32
|
+
*
|
|
33
|
+
* 同一张图不会重复插入:正文里已经有这个引用就跳过(重复编译是常态)。
|
|
34
|
+
*/
|
|
35
|
+
/** 锚点命中率的下限:图前那段话至少要有一半的滑窗落在卡片里。 */
|
|
36
|
+
export declare const ANCHOR_MIN = 0.4;
|
|
37
|
+
/** 小节命中率的下限:比整节,标准低得多。 */
|
|
38
|
+
export declare const SECTION_MIN = 0.12;
|
|
39
|
+
/** 收尾图(图后没有正文)的锚点短于这个长度就当成署名图 / 二维码,不挂。 */
|
|
40
|
+
export declare const TAIL_ANCHOR_MIN = 40;
|
|
41
|
+
/** 第二档(比整节)至少要命中这么多滑窗:短小节不能靠一个滑窗蒙混过关。 */
|
|
42
|
+
export declare const SECTION_MIN_HITS = 3;
|
|
43
|
+
export interface SourceImage {
|
|
44
|
+
sourceId: string;
|
|
45
|
+
/**
|
|
46
|
+
* 来源正文里的图片引用,**原样**搬进卡片。
|
|
47
|
+
*
|
|
48
|
+
* 不重新计算路径:卡片在 `02_wiki/<type>/`、来源在 `01_source_raw/<type>/`,
|
|
49
|
+
* 两者到知识库根目录的深度相同,所以 `../../01_source_raw/_assets/…` 这种相对
|
|
50
|
+
* 引用在两边都成立。重算一次反而会引入一个可能算错的路径。
|
|
51
|
+
*/
|
|
52
|
+
ref: string;
|
|
53
|
+
/** 图前最近一段正文(已归一化),用来找「这张图在讲哪一段」。 */
|
|
54
|
+
anchor: string;
|
|
55
|
+
/**
|
|
56
|
+
* 图所在**小节全文**(`## 标题` 或整行加粗的伪标题划出的那一段,已归一化,
|
|
57
|
+
* 截到 {@link SECTION_MAX_CHARS}),锚点对不上时的退路。
|
|
58
|
+
*
|
|
59
|
+
* 用全文而不是只用标题:标题常常是「三、合理估值策略」这种带序号的短句,卡片正文
|
|
60
|
+
* 里根本不会出现;而整节几百个字里总有一截能对上。实测同一篇文章,标题档的命中率
|
|
61
|
+
* 是 0,整节档是 0.32–0.35。
|
|
62
|
+
*/
|
|
63
|
+
section: string;
|
|
64
|
+
/** 图后面再没有正文了:收尾的署名图 / 二维码。 */
|
|
65
|
+
tail: boolean;
|
|
66
|
+
}
|
|
67
|
+
export interface ImageFit {
|
|
68
|
+
/** 1 = 锚点命中(图前那段话就在这张卡里);2 = 只对上了小节。 */
|
|
69
|
+
tier: 1 | 2;
|
|
70
|
+
score: number;
|
|
71
|
+
}
|
|
72
|
+
/** 归一化:去掉图片语法、图号指引、markdown 记号与标点,只留字。 */
|
|
73
|
+
export declare function normalizeForMatch(text: string): string;
|
|
74
|
+
/** 12 字滑窗命中率:`needle` 有多少比例的滑窗出现在 `haystack` 里。 */
|
|
75
|
+
export declare function overlap(needle: string, haystack: string): number;
|
|
76
|
+
/**
|
|
77
|
+
* 从一份来源正文里读出它的图片与每张图的定位依据。
|
|
78
|
+
*
|
|
79
|
+
* 顺序就是图片在来源里出现的顺序 —— 落位时按这个顺序插,同一段下面多张图保持原序。
|
|
80
|
+
*/
|
|
81
|
+
export declare function readSourceImages(sourceId: string, content: string): SourceImage[];
|
|
82
|
+
/** 一张图对一张卡片的贴合度;两档都不够就是 `null`(不挂)。 */
|
|
83
|
+
export declare function fitOf(cardContent: string, image: SourceImage): ImageFit | null;
|
|
84
|
+
export interface PlannedImages {
|
|
85
|
+
/** 卡片 key(`<entityType>:<entityId>`)→ 要挂上去的图,按来源出现顺序。 */
|
|
86
|
+
byCard: Map<string, SourceImage[]>;
|
|
87
|
+
/** 两档都没对上的图:留在来源里,由调用方如实报出来。 */
|
|
88
|
+
unplaced: SourceImage[];
|
|
89
|
+
/** 判定为署名图 / 二维码而**故意**不挂的图。 */
|
|
90
|
+
boilerplate: SourceImage[];
|
|
91
|
+
}
|
|
92
|
+
export interface PlanInput {
|
|
93
|
+
cards: Array<{
|
|
94
|
+
key: string;
|
|
95
|
+
content: string;
|
|
96
|
+
sourceRefs: string[];
|
|
97
|
+
}>;
|
|
98
|
+
sources: Array<{
|
|
99
|
+
sourceId: string;
|
|
100
|
+
content: string;
|
|
101
|
+
}>;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* 给一批卡片和一批来源算图落点。**跨卡片一起算**,因为「这张图归哪张卡」是一个
|
|
105
|
+
* 相对判断:一篇方法论文章编出 8 张卡,同一张图必须只落一张。
|
|
106
|
+
*
|
|
107
|
+
* 排序是确定的:先比档位(锚点命中优于只对小节),再比分数,最后按卡片 key 的字典序
|
|
108
|
+
* —— 两个都说得通时不能靠 `Map` 的插入顺序决定。
|
|
109
|
+
*/
|
|
110
|
+
export declare function planSourceImages(input: PlanInput): PlannedImages;
|
|
111
|
+
/**
|
|
112
|
+
* 把一张图插进正文:插在**和它最贴的那一段**后面。
|
|
113
|
+
*
|
|
114
|
+
* 正文里已经有这个引用就原样返回 —— 重复编译是常态,同一次编译里同一张图也不该
|
|
115
|
+
* 出现两遍。
|
|
116
|
+
*/
|
|
117
|
+
export declare function insertImage(content: string, image: SourceImage): string;
|
|
118
|
+
//# sourceMappingURL=source-images.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-images.d.ts","sourceRoot":"","sources":["../../src/source-images.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,oCAAoC;AACpC,eAAO,MAAM,UAAU,MAAM,CAAA;AAE7B,0BAA0B;AAC1B,eAAO,MAAM,WAAW,OAAO,CAAA;AAE/B,2CAA2C;AAC3C,eAAO,MAAM,eAAe,KAAK,CAAA;AAEjC,yCAAyC;AACzC,eAAO,MAAM,gBAAgB,IAAI,CAAA;AAkBjC,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB;;;;;;OAMG;IACH,GAAG,EAAE,MAAM,CAAA;IACX,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAA;IACd;;;;;;;OAOG;IACH,OAAO,EAAE,MAAM,CAAA;IACf,8BAA8B;IAC9B,IAAI,EAAE,OAAO,CAAA;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,wCAAwC;IACxC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;CACd;AAED,0CAA0C;AAC1C,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMtD;AAUD,mDAAmD;AACnD,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEhE;AAoBD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,CA+DjF;AAED,uCAAuC;AACvC,wBAAgB,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,QAAQ,GAAG,IAAI,CAQ9E;AAeD,MAAM,WAAW,aAAa;IAC5B,yDAAyD;IACzD,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAA;IAClC,gCAAgC;IAChC,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,+BAA+B;IAC/B,WAAW,EAAE,WAAW,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAA;IACpE,OAAO,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACtD;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,GAAG,aAAa,CAiChE;AAcD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,CAuBvE"}
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 来源里的图片怎么落进卡片正文(0046)。
|
|
3
|
+
*
|
|
4
|
+
* ## 为什么要有这一步
|
|
5
|
+
*
|
|
6
|
+
* 一篇公众号文章 22 张图表,图片已经跟着转换内核落到知识库根目录的
|
|
7
|
+
* `01_source_raw/_assets/` 下,但编译出来的 8 张卡片正文里**一条图片引用都没有** ——
|
|
8
|
+
* 因为抽取那一段交给模型的是文字,模型给回来的正文里没有图。于是
|
|
9
|
+
* `imagePaths` 一直是空的,多模态编码拿不到图,图表承载的结论(「景气上行板块领涨」
|
|
10
|
+
* 那张图、`图表11` 的收益率矩阵)在召回里等于不存在。
|
|
11
|
+
*
|
|
12
|
+
* ## 怎么决定「哪张图去哪张卡」
|
|
13
|
+
*
|
|
14
|
+
* 一段话配一张图,所以判据是**文字**,不是顺序:
|
|
15
|
+
*
|
|
16
|
+
* 1. **第一档**:拿图**前面最近那一段话**去各张卡片的正文里比对。命中率够高
|
|
17
|
+
* ({@link ANCHOR_MIN})就说明「这张卡讲的就是这段文字」,图落在这张卡上。
|
|
18
|
+
* 2. **第二档**:锚点对不上时(模型把那段话改写过),退回**图所在的来源小节**:
|
|
19
|
+
* 整节的文字和哪张卡重合度最高,图就归哪张卡。阈值低得多
|
|
20
|
+
* ({@link SECTION_MIN}),因为比的是整节而不是一段。
|
|
21
|
+
* 3. 两档都不够 → **不挂**。宁可少一张图,也不要把图挂到一张讲别的事的卡上:
|
|
22
|
+
* 多模态召回会把它当成这张卡的证据。
|
|
23
|
+
*
|
|
24
|
+
* 比对用 12 字滑窗命中率而不是整串包含:模型改写时常常删掉「(参见图表12)」这种
|
|
25
|
+
* 图号指引,或者改几个字,整串包含会全部落空,滑窗不会。
|
|
26
|
+
*
|
|
27
|
+
* ## 落点在正文的哪里
|
|
28
|
+
*
|
|
29
|
+
* 卡片正文里找**命中率最高的那一段**,把图插在它后面 —— 图跟在它说明的文字下面,
|
|
30
|
+
* 而不是堆在卡片末尾。这样按 `##` 小节切出来的 wikiNote 只会带自己那一节的图,
|
|
31
|
+
* 而多模态编码只吃每张 note 的**第一张**图(`vectorInputs`),落点正确才编码得对。
|
|
32
|
+
*
|
|
33
|
+
* 同一张图不会重复插入:正文里已经有这个引用就跳过(重复编译是常态)。
|
|
34
|
+
*/
|
|
35
|
+
/** 锚点命中率的下限:图前那段话至少要有一半的滑窗落在卡片里。 */
|
|
36
|
+
export const ANCHOR_MIN = 0.4;
|
|
37
|
+
/** 小节命中率的下限:比整节,标准低得多。 */
|
|
38
|
+
export const SECTION_MIN = 0.12;
|
|
39
|
+
/** 收尾图(图后没有正文)的锚点短于这个长度就当成署名图 / 二维码,不挂。 */
|
|
40
|
+
export const TAIL_ANCHOR_MIN = 40;
|
|
41
|
+
/** 第二档(比整节)至少要命中这么多滑窗:短小节不能靠一个滑窗蒙混过关。 */
|
|
42
|
+
export const SECTION_MIN_HITS = 3;
|
|
43
|
+
/** 小节全文参与比对的上限:够用就好,别让一次编译为几万字的小节付代价。 */
|
|
44
|
+
const SECTION_MAX_CHARS = 4000;
|
|
45
|
+
/** 滑窗宽度。中文里 12 个字已经足够区分「在讲哪一段」。 */
|
|
46
|
+
const SHINGLE = 12;
|
|
47
|
+
/**
|
|
48
|
+
* 细滑窗宽度,只用来**给段落排序**(不是判定)。
|
|
49
|
+
*
|
|
50
|
+
* 第二档的图(锚点对不上)落到哪一段,12 字滑窗全是 0 分,`argmax` 会退化成「第一段」
|
|
51
|
+
* —— 实测 5 张「估值波动」图表会全部堆在 `## 定义` 下面,而它们讲的是边界与关联。
|
|
52
|
+
* 4 字滑窗在这种低重合度下仍能分出高下(实测把这 5 张分到了 `## 边界与反例` 与
|
|
53
|
+
* `## 关联`)。它只是排序依据:判定仍然只看 12 字滑窗与两档阈值。
|
|
54
|
+
*/
|
|
55
|
+
const FINE_SHINGLE = 4;
|
|
56
|
+
/** 归一化:去掉图片语法、图号指引、markdown 记号与标点,只留字。 */
|
|
57
|
+
export function normalizeForMatch(text) {
|
|
58
|
+
return text
|
|
59
|
+
.replace(/!\[[^\]]*\]\([^)]*\)/g, '')
|
|
60
|
+
// 图号指引(`(参见图表12)`)最容易被改写掉,比对时两边都不算它。
|
|
61
|
+
.replace(/[((][^(())]*图表\s*\d+[^(())]*[))]/g, '')
|
|
62
|
+
.replace(/[\s*_`~"'“”‘’、,。:;?!,.!?;:#\-—–|/\\()[\]{}<>]+/g, '');
|
|
63
|
+
}
|
|
64
|
+
function shingles(text, size) {
|
|
65
|
+
if (!text)
|
|
66
|
+
return [];
|
|
67
|
+
if (text.length <= size)
|
|
68
|
+
return [text];
|
|
69
|
+
const result = [];
|
|
70
|
+
for (let index = 0; index + size <= text.length; index += 1)
|
|
71
|
+
result.push(text.slice(index, index + size));
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
/** 12 字滑窗命中率:`needle` 有多少比例的滑窗出现在 `haystack` 里。 */
|
|
75
|
+
export function overlap(needle, haystack) {
|
|
76
|
+
return score(needle, normalizeForMatch(haystack)).ratio;
|
|
77
|
+
}
|
|
78
|
+
/** 命中率与命中条数一起给:只看比例的话,一个滑窗的小节命中就是 100%。 */
|
|
79
|
+
function score(needle, normalizedTarget, size = SHINGLE) {
|
|
80
|
+
const parts = shingles(needle, size);
|
|
81
|
+
if (parts.length === 0 || !normalizedTarget)
|
|
82
|
+
return { ratio: 0, hits: 0 };
|
|
83
|
+
let hits = 0;
|
|
84
|
+
for (const part of parts)
|
|
85
|
+
if (normalizedTarget.includes(part))
|
|
86
|
+
hits += 1;
|
|
87
|
+
return { ratio: hits / parts.length, hits };
|
|
88
|
+
}
|
|
89
|
+
/** 一行是不是小节标题:`## 标题` 或整行加粗且不长的伪标题。 */
|
|
90
|
+
function sectionLabel(line) {
|
|
91
|
+
const trimmed = line.trim();
|
|
92
|
+
if (/^#{1,6}\s+\S/.test(trimmed))
|
|
93
|
+
return trimmed.replace(/^#{1,6}\s+/, '').trim();
|
|
94
|
+
const bold = /^\*\*(.+)\*\*$/.exec(trimmed);
|
|
95
|
+
if (bold && bold[1].length <= 40 && !/[。;;]$/.test(bold[1]))
|
|
96
|
+
return bold[1].trim();
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* 从一份来源正文里读出它的图片与每张图的定位依据。
|
|
101
|
+
*
|
|
102
|
+
* 顺序就是图片在来源里出现的顺序 —— 落位时按这个顺序插,同一段下面多张图保持原序。
|
|
103
|
+
*/
|
|
104
|
+
export function readSourceImages(sourceId, content) {
|
|
105
|
+
const lines = content.split('\n');
|
|
106
|
+
/**
|
|
107
|
+
* 先按小节切一遍:每张图的「退路依据」是**它所在小节的全文**,而小节要等整节读完
|
|
108
|
+
* 才知道 —— 图的后面半节也算这一节。
|
|
109
|
+
*/
|
|
110
|
+
const sectionOf = [];
|
|
111
|
+
const sections = [];
|
|
112
|
+
let sectionIndex = -1;
|
|
113
|
+
for (const [index, line] of lines.entries()) {
|
|
114
|
+
if (sectionLabel(line) !== undefined || sectionIndex < 0) {
|
|
115
|
+
sectionIndex += 1;
|
|
116
|
+
sections.push('');
|
|
117
|
+
}
|
|
118
|
+
sectionOf.push(sectionIndex);
|
|
119
|
+
const current = sections[sectionIndex] ?? '';
|
|
120
|
+
if (current.length < SECTION_MAX_CHARS)
|
|
121
|
+
sections[sectionIndex] = current + line + '\n';
|
|
122
|
+
}
|
|
123
|
+
const images = [];
|
|
124
|
+
let currentParagraph = [];
|
|
125
|
+
let lastParagraph = '';
|
|
126
|
+
let offset = 0;
|
|
127
|
+
for (const [index, line] of lines.entries()) {
|
|
128
|
+
const refs = [...line.matchAll(/!\[[^\]]*\]\(\s*(?:<([^>]+)>|([^\s)]+))\s*\)/g)]
|
|
129
|
+
.map(match => ({ ref: (match[1] ?? match[2] ?? '').trim(), end: offset + (match.index ?? 0) + match[0].length }))
|
|
130
|
+
.filter(item => item.ref && !item.ref.startsWith('data:') && !/^https?:\/\//i.test(item.ref));
|
|
131
|
+
const section = normalizeForMatch(sections[sectionOf[index] ?? 0] ?? '');
|
|
132
|
+
if (refs.length > 0) {
|
|
133
|
+
// 图在段落中间时,锚点是这一行图前面已经出现的那半句;否则用上一段。
|
|
134
|
+
const before = line.slice(0, line.indexOf('!['));
|
|
135
|
+
const anchor = normalizeForMatch([...currentParagraph, before].join(''));
|
|
136
|
+
for (const item of refs) {
|
|
137
|
+
images.push({ sourceId, ref: item.ref, anchor: anchor || normalizeForMatch(lastParagraph), section, end: item.end });
|
|
138
|
+
}
|
|
139
|
+
currentParagraph = [];
|
|
140
|
+
offset += line.length + 1;
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
if (!line.trim()) {
|
|
144
|
+
if (currentParagraph.length > 0)
|
|
145
|
+
lastParagraph = currentParagraph.join('');
|
|
146
|
+
currentParagraph = [];
|
|
147
|
+
offset += line.length + 1;
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
if (sectionLabel(line) !== undefined) {
|
|
151
|
+
if (currentParagraph.length > 0)
|
|
152
|
+
lastParagraph = currentParagraph.join('');
|
|
153
|
+
currentParagraph = [];
|
|
154
|
+
offset += line.length + 1;
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
currentParagraph.push(line);
|
|
158
|
+
offset += line.length + 1;
|
|
159
|
+
}
|
|
160
|
+
// 「图后面还有没有正文」只能整篇读完才知道,所以最后一遍回填:这张图之后
|
|
161
|
+
// 一个正文字都没有 → 收尾的署名图 / 二维码(下一行还可能有别的图,所以逐图判断)。
|
|
162
|
+
return images.map(image => ({
|
|
163
|
+
sourceId: image.sourceId,
|
|
164
|
+
ref: image.ref,
|
|
165
|
+
anchor: image.anchor,
|
|
166
|
+
section: image.section,
|
|
167
|
+
tail: !normalizeForMatch(content.slice(image.end)),
|
|
168
|
+
}));
|
|
169
|
+
}
|
|
170
|
+
/** 一张图对一张卡片的贴合度;两档都不够就是 `null`(不挂)。 */
|
|
171
|
+
export function fitOf(cardContent, image) {
|
|
172
|
+
const target = normalizeForMatch(cardContent);
|
|
173
|
+
if (!target)
|
|
174
|
+
return null;
|
|
175
|
+
const anchor = score(image.anchor, target);
|
|
176
|
+
if (anchor.ratio >= ANCHOR_MIN)
|
|
177
|
+
return { tier: 1, score: anchor.ratio };
|
|
178
|
+
const section = score(image.section, target);
|
|
179
|
+
if (section.hits >= SECTION_MIN_HITS && section.ratio >= SECTION_MIN)
|
|
180
|
+
return { tier: 2, score: section.ratio };
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* 收尾的署名图 / 二维码的**候选**:图后没有正文,而且锚点很短
|
|
185
|
+
* (「分析师:燕翔」「沈重衡, S0210523060006」这种)。
|
|
186
|
+
*
|
|
187
|
+
* 候选不等于结论:它只是**取消第二档退路**。收尾的短锚点图如果字面上真的落在某张
|
|
188
|
+
* 卡片正文里,那它就是一张正经的收尾图,照挂;只有靠「整节重合」这种宽标准才拉得
|
|
189
|
+
* 进来的,才判定成署名图。反过来,「图后没正文 + 短锚点」在短文里很常见,所以不能
|
|
190
|
+
* 拿它当唯一判据 —— 那会把一张正经的收尾插图丢掉。
|
|
191
|
+
*/
|
|
192
|
+
function isBoilerplateCandidate(image) {
|
|
193
|
+
return image.tail && normalizeForMatch(image.anchor).length < TAIL_ANCHOR_MIN;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* 给一批卡片和一批来源算图落点。**跨卡片一起算**,因为「这张图归哪张卡」是一个
|
|
197
|
+
* 相对判断:一篇方法论文章编出 8 张卡,同一张图必须只落一张。
|
|
198
|
+
*
|
|
199
|
+
* 排序是确定的:先比档位(锚点命中优于只对小节),再比分数,最后按卡片 key 的字典序
|
|
200
|
+
* —— 两个都说得通时不能靠 `Map` 的插入顺序决定。
|
|
201
|
+
*/
|
|
202
|
+
export function planSourceImages(input) {
|
|
203
|
+
const byCard = new Map();
|
|
204
|
+
const unplaced = [];
|
|
205
|
+
const boilerplate = [];
|
|
206
|
+
for (const source of input.sources) {
|
|
207
|
+
const images = readSourceImages(source.sourceId, source.content);
|
|
208
|
+
if (images.length === 0)
|
|
209
|
+
continue;
|
|
210
|
+
const owners = input.cards.filter(card => card.sourceRefs.includes(source.sourceId));
|
|
211
|
+
for (const image of images) {
|
|
212
|
+
let best;
|
|
213
|
+
for (const card of owners) {
|
|
214
|
+
const fit = fitOf(card.content, image);
|
|
215
|
+
if (!fit)
|
|
216
|
+
continue;
|
|
217
|
+
const better = best === undefined
|
|
218
|
+
|| fit.tier < best.fit.tier
|
|
219
|
+
|| (fit.tier === best.fit.tier && fit.score > best.fit.score)
|
|
220
|
+
|| (fit.tier === best.fit.tier && fit.score === best.fit.score && card.key < best.card);
|
|
221
|
+
if (better)
|
|
222
|
+
best = { card: card.key, fit };
|
|
223
|
+
}
|
|
224
|
+
const boilerplateCandidate = isBoilerplateCandidate(image);
|
|
225
|
+
// 收尾的短锚点图不接受第二档退路:那点重合度不足以证明「这张图在讲这段」。
|
|
226
|
+
if (boilerplateCandidate && best?.fit.tier === 2)
|
|
227
|
+
best = undefined;
|
|
228
|
+
if (!best) {
|
|
229
|
+
if (boilerplateCandidate)
|
|
230
|
+
boilerplate.push(image);
|
|
231
|
+
else
|
|
232
|
+
unplaced.push(image);
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
const bucket = byCard.get(best.card);
|
|
236
|
+
if (bucket)
|
|
237
|
+
bucket.push(image);
|
|
238
|
+
else
|
|
239
|
+
byCard.set(best.card, [image]);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return { byCard, unplaced, boilerplate };
|
|
243
|
+
}
|
|
244
|
+
/** 正文里的段落及其结束位置(按空行切,空段不算)。 */
|
|
245
|
+
function paragraphs(content) {
|
|
246
|
+
const result = [];
|
|
247
|
+
const pattern = /[^\n][\s\S]*?(?=\n\s*\n|$)/g;
|
|
248
|
+
for (const match of content.matchAll(pattern)) {
|
|
249
|
+
const text = match[0];
|
|
250
|
+
if (!text.trim())
|
|
251
|
+
continue;
|
|
252
|
+
result.push({ text, end: (match.index ?? 0) + text.length });
|
|
253
|
+
}
|
|
254
|
+
return result;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* 把一张图插进正文:插在**和它最贴的那一段**后面。
|
|
258
|
+
*
|
|
259
|
+
* 正文里已经有这个引用就原样返回 —— 重复编译是常态,同一次编译里同一张图也不该
|
|
260
|
+
* 出现两遍。
|
|
261
|
+
*/
|
|
262
|
+
export function insertImage(content, image) {
|
|
263
|
+
if (content.includes(image.ref))
|
|
264
|
+
return content;
|
|
265
|
+
const blocks = paragraphs(content);
|
|
266
|
+
const markdown = ``;
|
|
267
|
+
if (blocks.length === 0)
|
|
268
|
+
return content.trim() ? `${content.trim()}\n\n${markdown}` : markdown;
|
|
269
|
+
let best = blocks[0];
|
|
270
|
+
let bestWide = -1;
|
|
271
|
+
let bestFine = -1;
|
|
272
|
+
for (const block of blocks) {
|
|
273
|
+
const target = normalizeForMatch(block.text);
|
|
274
|
+
const wide = score(image.anchor, target).ratio;
|
|
275
|
+
const fine = score(image.anchor, target, FINE_SHINGLE).ratio;
|
|
276
|
+
// 先比 12 字滑窗(判定用的那一档),同分再用 4 字滑窗分高下,仍同分取靠前的段落
|
|
277
|
+
// —— 顺序稳定,也不会把图越推越后。
|
|
278
|
+
if (wide > bestWide || (wide === bestWide && fine > bestFine)) {
|
|
279
|
+
best = block;
|
|
280
|
+
bestWide = wide;
|
|
281
|
+
bestFine = fine;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
const head = content.slice(0, best.end).trimEnd();
|
|
285
|
+
const tail = content.slice(best.end).trimStart();
|
|
286
|
+
return tail ? `${head}\n\n${markdown}\n\n${tail}` : `${head}\n\n${markdown}`;
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=source-images.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-images.js","sourceRoot":"","sources":["../../src/source-images.ts"],"names":[],"mappings":"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"}
|