dsh-data-domain-knowledge 0.1.1-alpha.2 → 0.1.1-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 +33 -16
- package/lib/client.js +1042 -2097
- package/lib/contract-refs.d.ts +0 -1
- package/lib/doc-page.js +1 -1
- package/lib/pages.js +2489 -1060
- package/lib/types/agent-behavior-rules.d.ts.map +1 -1
- package/lib/types/agent-behavior-rules.js +3 -2
- package/lib/types/agent-behavior-rules.js.map +1 -1
- package/lib/types/axis-contract.js +1 -1
- package/lib/types/axis-contract.js.map +1 -1
- package/lib/types/card-organize.d.ts +2 -1
- package/lib/types/card-organize.d.ts.map +1 -1
- package/lib/types/card-organize.js +5 -3
- package/lib/types/card-organize.js.map +1 -1
- package/lib/types/config-schema.d.ts +1 -1
- package/lib/types/config-schema.js +1 -1
- package/lib/types/convert/host.d.ts +2 -3
- package/lib/types/convert/host.d.ts.map +1 -1
- package/lib/types/convert/host.js +11 -2
- package/lib/types/convert/host.js.map +1 -1
- package/lib/types/convert/ingest.d.ts +14 -20
- package/lib/types/convert/ingest.d.ts.map +1 -1
- package/lib/types/convert/ingest.js +8 -5
- package/lib/types/convert/ingest.js.map +1 -1
- package/lib/types/diagnosis/store.d.ts +2 -2
- package/lib/types/diagnosis/store.d.ts.map +1 -1
- package/lib/types/diagnosis/store.js +10 -2
- package/lib/types/diagnosis/store.js.map +1 -1
- package/lib/types/diagnosis/types.d.ts +1 -1
- package/lib/types/diagnosis/types.js +1 -1
- package/lib/types/extract-model.d.ts +3 -0
- package/lib/types/extract-model.d.ts.map +1 -1
- package/lib/types/extract-model.js.map +1 -1
- package/lib/types/images.js +1 -1
- package/lib/types/index.d.ts +0 -4
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/index.js +99 -91
- package/lib/types/index.js.map +1 -1
- package/lib/types/knowledge-bases.d.ts +3 -0
- package/lib/types/knowledge-bases.d.ts.map +1 -1
- package/lib/types/knowledge-bases.js +22 -2
- package/lib/types/knowledge-bases.js.map +1 -1
- package/lib/types/knowledge-contract.d.ts +6 -0
- package/lib/types/knowledge-contract.d.ts.map +1 -1
- package/lib/types/knowledge-contract.js +6 -2
- package/lib/types/knowledge-contract.js.map +1 -1
- package/lib/types/layout.d.ts +9 -26
- package/lib/types/layout.d.ts.map +1 -1
- package/lib/types/layout.js +10 -28
- package/lib/types/layout.js.map +1 -1
- package/lib/types/materialize-snapshot.d.ts +5 -0
- package/lib/types/materialize-snapshot.d.ts.map +1 -1
- package/lib/types/migrate.d.ts +3 -1
- package/lib/types/migrate.d.ts.map +1 -1
- package/lib/types/migrate.js +3 -1
- package/lib/types/migrate.js.map +1 -1
- package/lib/types/model-text.d.ts +7 -0
- package/lib/types/model-text.d.ts.map +1 -1
- package/lib/types/model-text.js +31 -9
- package/lib/types/model-text.js.map +1 -1
- package/lib/types/organize-contract.d.ts.map +1 -1
- package/lib/types/organize-contract.js +2 -1
- package/lib/types/organize-contract.js.map +1 -1
- package/lib/types/pipeline/engine.d.ts +28 -4
- package/lib/types/pipeline/engine.d.ts.map +1 -1
- package/lib/types/pipeline/engine.js +68 -15
- package/lib/types/pipeline/engine.js.map +1 -1
- package/lib/types/pipeline/progress.d.ts +12 -0
- package/lib/types/pipeline/progress.d.ts.map +1 -0
- package/lib/types/pipeline/progress.js +37 -0
- package/lib/types/pipeline/progress.js.map +1 -0
- package/lib/types/pipeline/resumable-extract.d.ts +45 -0
- package/lib/types/pipeline/resumable-extract.d.ts.map +1 -0
- package/lib/types/pipeline/resumable-extract.js +262 -0
- package/lib/types/pipeline/resumable-extract.js.map +1 -0
- package/lib/types/pipeline/store.d.ts +8 -2
- package/lib/types/pipeline/store.d.ts.map +1 -1
- package/lib/types/pipeline/store.js +27 -5
- package/lib/types/pipeline/store.js.map +1 -1
- package/lib/types/pipeline/types.d.ts +56 -0
- package/lib/types/pipeline/types.d.ts.map +1 -1
- package/lib/types/pipeline/types.js +18 -1
- package/lib/types/pipeline/types.js.map +1 -1
- package/lib/types/present.d.ts +1 -1
- package/lib/types/present.js +1 -1
- package/lib/types/preset-ids.d.ts +0 -1
- package/lib/types/preset-ids.d.ts.map +1 -1
- package/lib/types/preset-ids.js +0 -3
- package/lib/types/preset-ids.js.map +1 -1
- package/lib/types/query-analysis.d.ts +0 -5
- package/lib/types/query-analysis.d.ts.map +1 -1
- package/lib/types/query-analysis.js +0 -16
- package/lib/types/query-analysis.js.map +1 -1
- package/lib/types/recall-delivery.d.ts +36 -0
- package/lib/types/recall-delivery.d.ts.map +1 -0
- package/lib/types/recall-delivery.js +16 -0
- package/lib/types/recall-delivery.js.map +1 -0
- package/lib/types/retrieval/scope.d.ts +17 -0
- package/lib/types/retrieval/scope.d.ts.map +1 -0
- package/lib/types/retrieval/scope.js +11 -0
- package/lib/types/retrieval/scope.js.map +1 -0
- package/lib/types/runtime.d.ts +75 -14
- package/lib/types/runtime.d.ts.map +1 -1
- package/lib/types/runtime.js +454 -198
- package/lib/types/runtime.js.map +1 -1
- package/lib/types/settings-volatile.d.ts +0 -7
- package/lib/types/settings-volatile.d.ts.map +1 -1
- package/lib/types/settings-volatile.js +0 -7
- package/lib/types/settings-volatile.js.map +1 -1
- package/lib/types/source-identity.d.ts +34 -0
- package/lib/types/source-identity.d.ts.map +1 -0
- package/lib/types/source-identity.js +85 -0
- package/lib/types/source-identity.js.map +1 -0
- package/lib/types/source-read.d.ts +18 -0
- package/lib/types/source-read.d.ts.map +1 -0
- package/lib/types/source-read.js +49 -0
- package/lib/types/source-read.js.map +1 -0
- package/lib/types/store/axis-references.d.ts.map +1 -1
- package/lib/types/store/axis-references.js +5 -3
- package/lib/types/store/axis-references.js.map +1 -1
- package/lib/types/store/knowledge-db.d.ts +5 -29
- package/lib/types/store/knowledge-db.d.ts.map +1 -1
- package/lib/types/store/knowledge-db.js +57 -2
- package/lib/types/store/knowledge-db.js.map +1 -1
- package/lib/types/store/source-identity.d.ts +8 -0
- package/lib/types/store/source-identity.d.ts.map +1 -0
- package/lib/types/store/source-identity.js +56 -0
- package/lib/types/store/source-identity.js.map +1 -0
- package/lib/types/types.d.ts +46 -5
- package/lib/types/types.d.ts.map +1 -1
- package/lib/types/types.js +6 -3
- package/lib/types/types.js.map +1 -1
- package/lib/types/wiki-availability.d.ts +11 -0
- package/lib/types/wiki-availability.d.ts.map +1 -0
- package/lib/types/wiki-availability.js +39 -0
- package/lib/types/wiki-availability.js.map +1 -0
- package/lib/types/wiki-finalize.d.ts +4 -2
- package/lib/types/wiki-finalize.d.ts.map +1 -1
- package/lib/types/wiki-finalize.js +9 -27
- package/lib/types/wiki-finalize.js.map +1 -1
- package/lib/types/wiki-links.d.ts +35 -0
- package/lib/types/wiki-links.d.ts.map +1 -0
- package/lib/types/wiki-links.js +129 -0
- package/lib/types/wiki-links.js.map +1 -0
- package/lib/types/wiki-trial-types.d.ts +3 -0
- package/lib/types/wiki-trial-types.d.ts.map +1 -1
- package/lib/types/wiki-trial.d.ts +3 -3
- package/lib/types/wiki-trial.d.ts.map +1 -1
- package/lib/types/wiki-trial.js +14 -3
- package/lib/types/wiki-trial.js.map +1 -1
- package/package.json +16 -16
- package/scripts/doctor.mjs +0 -7
- package/scripts/setup-embedding.sh +0 -0
- package/src/agent-behavior-rules.ts +3 -2
- package/src/axis-contract.ts +1 -1
- package/src/card-organize.ts +5 -3
- package/src/client/AttributionEventGuide.tsx +3 -3
- package/src/client/AxisMatrix.tsx +86 -19
- package/src/client/AxisRegistrySection.tsx +1 -1
- package/src/client/CompileSettingsView.tsx +473 -0
- package/src/client/DirectoryPicker.tsx +0 -2
- package/src/client/ExtractionTasksPage.tsx +557 -423
- package/src/client/GuideArchitectureCanvas.tsx +5 -12
- package/src/client/ImportFilesDialog.tsx +1 -0
- package/src/client/InfoHint.tsx +1 -1
- package/src/client/KnowledgeBaseTab.tsx +141 -148
- package/src/client/KnowledgePanel.tsx +16 -9
- package/src/client/OperationLogTab.tsx +1 -1
- package/src/client/PipelineRunView.tsx +173 -0
- package/src/client/RecallPanel.tsx +5 -16
- package/src/client/TabGuide.tsx +3 -7
- package/src/client/WikiFlowPanel.tsx +10 -11
- package/src/client/arch/NodeLogicPanel.tsx +3 -3
- package/src/client/arch/model.ts +5 -113
- package/src/client/architecture.css +1 -1
- package/src/client/architecture.tsx +13 -27
- package/src/client/attribution/AttributionTab.tsx +141 -10
- package/src/client/pages.css +305 -180
- package/src/client/pages.tsx +7 -12
- package/src/client/styles.css +15 -96
- package/src/config-schema.ts +1 -1
- package/src/convert/host.ts +13 -5
- package/src/convert/ingest.ts +20 -7
- package/src/diagnosis/store.ts +7 -2
- package/src/diagnosis/types.ts +1 -1
- package/src/extract-model.ts +3 -0
- package/src/images.ts +1 -1
- package/src/index.ts +92 -97
- package/src/knowledge-bases.ts +23 -3
- package/src/knowledge-contract.ts +7 -2
- package/src/layout.ts +10 -32
- package/src/materialize-snapshot.ts +1 -0
- package/src/migrate.ts +3 -1
- package/src/model-text.ts +33 -11
- package/src/organize-contract.ts +2 -1
- package/src/pipeline/engine.ts +85 -22
- package/src/pipeline/progress.ts +40 -0
- package/src/pipeline/resumable-extract.ts +233 -0
- package/src/pipeline/store.ts +28 -6
- package/src/pipeline/types.ts +47 -2
- package/src/present.ts +1 -1
- package/src/preset-ids.ts +0 -4
- package/src/query-analysis.ts +0 -20
- package/src/recall-delivery.ts +19 -0
- package/src/retrieval/scope.ts +10 -0
- package/src/runtime.ts +412 -206
- package/src/settings-volatile.ts +0 -7
- package/src/source-identity.ts +85 -0
- package/src/source-read.ts +47 -0
- package/src/store/axis-references.ts +5 -3
- package/src/store/knowledge-db.ts +54 -2
- package/src/store/source-identity.ts +42 -0
- package/src/types.ts +18 -5
- package/src/wiki-availability.ts +37 -0
- package/src/wiki-finalize.ts +9 -25
- package/src/wiki-links.ts +120 -0
- package/src/wiki-trial-types.ts +3 -2
- package/src/wiki-trial.ts +17 -6
- package/lib/types/intent/engine.d.ts +0 -122
- package/lib/types/intent/engine.d.ts.map +0 -1
- package/lib/types/intent/engine.js +0 -488
- package/lib/types/intent/engine.js.map +0 -1
- package/lib/types/intent/host.d.ts +0 -68
- package/lib/types/intent/host.d.ts.map +0 -1
- package/lib/types/intent/host.js +0 -249
- package/lib/types/intent/host.js.map +0 -1
- package/lib/types/intent/scope.d.ts +0 -25
- package/lib/types/intent/scope.d.ts.map +0 -1
- package/lib/types/intent/scope.js +0 -116
- package/lib/types/intent/scope.js.map +0 -1
- package/lib/types/intent/store.d.ts +0 -33
- package/lib/types/intent/store.d.ts.map +0 -1
- package/lib/types/intent/store.js +0 -239
- package/lib/types/intent/store.js.map +0 -1
- package/lib/types/intent/tools.d.ts +0 -62
- package/lib/types/intent/tools.d.ts.map +0 -1
- package/lib/types/intent/tools.js +0 -130
- package/lib/types/intent/tools.js.map +0 -1
- package/lib/types/intent/types.d.ts +0 -170
- package/lib/types/intent/types.d.ts.map +0 -1
- package/lib/types/intent/types.js +0 -56
- package/lib/types/intent/types.js.map +0 -1
- package/src/client/IntentLogic.tsx +0 -192
- package/src/client/IntentTab.tsx +0 -343
- package/src/client/TypeDefinitionDrawer.tsx +0 -195
- package/src/intent/README.md +0 -42
- package/src/intent/engine.ts +0 -515
- package/src/intent/host.ts +0 -315
- package/src/intent/scope.ts +0 -125
- package/src/intent/store.ts +0 -218
- package/src/intent/tools.ts +0 -154
- package/src/intent/types.ts +0 -229
|
@@ -81,13 +81,6 @@ export declare function unwrapVolatile<T>(value: unknown): T | undefined;
|
|
|
81
81
|
* `knowledge` / `convert` / `behaviorRules` 三组),而只解一层的结果是「组本身还是原始对象、
|
|
82
82
|
* 组里的字段还是引用」。
|
|
83
83
|
*
|
|
84
|
-
* 0029 实测到的故障就是这样来的:`intent` 组被原样交给 `applyIntent`,于是
|
|
85
|
-
* `engine.settings.predicates` 是一个 `{get, write}` 引用而不是字符串数组,
|
|
86
|
-
* `routingPrompt()` 里那句 `predicates.join('、')` 抛
|
|
87
|
-
* `this.settings.predicates.join is not a function`。抛出点在 **preset 的挂载行**上,
|
|
88
|
-
* 所以整个 preset 组合不出会话 —— 宿主平面没事(它在 apply 时不读谓词),一个字段
|
|
89
|
-
* 的类型错误把 preset 打挂。
|
|
90
|
-
*
|
|
91
84
|
* ## 为什么是两层而不是把 `unwrapVolatile` 写成递归
|
|
92
85
|
*
|
|
93
86
|
* 多出来的那一层是**已知的、唯一的一层**:组 → 字段。递归会把「数组里的对象恰好
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-volatile.d.ts","sourceRoot":"","sources":["../../src/settings-volatile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAEH,OAAO,KAAK,WAAW,MAAM,0BAA0B,CAAA;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAIlF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC,GAAG,SAAS,CAI/D;AAED
|
|
1
|
+
{"version":3,"file":"settings-volatile.d.ts","sourceRoot":"","sources":["../../src/settings-volatile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAEH,OAAO,KAAK,WAAW,MAAM,0BAA0B,CAAA;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAIlF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC,GAAG,SAAS,CAI/D;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAMzD;AAED,kCAAkC;AAClC,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,GAAG,OAAO,CAAC,eAAe,CAAC,CAEpG"}
|
|
@@ -86,13 +86,6 @@ export function unwrapVolatile(value) {
|
|
|
86
86
|
* `knowledge` / `convert` / `behaviorRules` 三组),而只解一层的结果是「组本身还是原始对象、
|
|
87
87
|
* 组里的字段还是引用」。
|
|
88
88
|
*
|
|
89
|
-
* 0029 实测到的故障就是这样来的:`intent` 组被原样交给 `applyIntent`,于是
|
|
90
|
-
* `engine.settings.predicates` 是一个 `{get, write}` 引用而不是字符串数组,
|
|
91
|
-
* `routingPrompt()` 里那句 `predicates.join('、')` 抛
|
|
92
|
-
* `this.settings.predicates.join is not a function`。抛出点在 **preset 的挂载行**上,
|
|
93
|
-
* 所以整个 preset 组合不出会话 —— 宿主平面没事(它在 apply 时不读谓词),一个字段
|
|
94
|
-
* 的类型错误把 preset 打挂。
|
|
95
|
-
*
|
|
96
89
|
* ## 为什么是两层而不是把 `unwrapVolatile` 写成递归
|
|
97
90
|
*
|
|
98
91
|
* 多出来的那一层是**已知的、唯一的一层**:组 → 字段。递归会把「数组里的对象恰好
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-volatile.js","sourceRoot":"","sources":["../../src/settings-volatile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAKH;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAwC,MAAS;IAC7E,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CACnE,CAAA;AACR,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,cAAc,CAAI,KAAc;IAC9C,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAsB,CAAA;IAC9E,MAAM,GAAG,GAAG,KAA0B,CAAA;IACtC,OAAO,OAAO,GAAG,CAAC,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAE,KAAW,CAAA;AACjE,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"settings-volatile.js","sourceRoot":"","sources":["../../src/settings-volatile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAKH;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAwC,MAAS;IAC7E,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CACnE,CAAA;AACR,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,cAAc,CAAI,KAAc;IAC9C,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAsB,CAAA;IAC9E,MAAM,GAAG,GAAG,KAA0B,CAAA;IACtC,OAAO,OAAO,GAAG,CAAC,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAE,KAAW,CAAA;AACjE,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,WAAW,CAAI,KAAc;IAC3C,MAAM,KAAK,GAAG,cAAc,CAA0B,KAAK,CAAC,CAAA;IAC5D,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAA;IAC1D,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAC5D,CAAA;AACjB,CAAC;AAED,kCAAkC;AAClC,MAAM,UAAU,eAAe,CAAC,IAA0C;IACxE,OAAO,WAAW,CAAkB,IAAI,CAAC,CAAA;AAC3C,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/** Source IDs are opaque, scoped by knowledge base, and independent of names, locations and content. */
|
|
2
|
+
export declare function isSourceId(value: unknown): value is string;
|
|
3
|
+
/** Allocate once when an input joins the import queue; retries and conversions keep this ID. */
|
|
4
|
+
export declare function newSourceId(): string;
|
|
5
|
+
/** Explicit acquisition identity; never inferred from document body or an arbitrary external_id. */
|
|
6
|
+
export interface SourceIdentityInput {
|
|
7
|
+
url?: string;
|
|
8
|
+
system?: string;
|
|
9
|
+
scope?: string;
|
|
10
|
+
documentType?: string;
|
|
11
|
+
documentId?: string;
|
|
12
|
+
/** Snake-case names accepted by Agent/HTTP callers. */
|
|
13
|
+
document_id?: string;
|
|
14
|
+
document_type?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface SourceIdentity {
|
|
17
|
+
system: string;
|
|
18
|
+
scope: string;
|
|
19
|
+
documentType: string;
|
|
20
|
+
documentId: string;
|
|
21
|
+
rule: 'native-v1' | 'google-docs-v1' | 'feishu-v1' | 'url-v1';
|
|
22
|
+
url?: string;
|
|
23
|
+
}
|
|
24
|
+
export declare class SourceIdentityError extends Error {
|
|
25
|
+
readonly code: string;
|
|
26
|
+
readonly candidates: string[];
|
|
27
|
+
constructor(code: string, message: string, candidates?: string[]);
|
|
28
|
+
}
|
|
29
|
+
export declare function sourceIdentityKey(value: SourceIdentity): string;
|
|
30
|
+
/** WHATWG URL only: preserve query order, fragments, trailing slashes and protocol. No network/redirect inference. */
|
|
31
|
+
export declare function normalizeSourceUrl(value: string): URL;
|
|
32
|
+
/** First entry is the primary identity; additional entries are verified URL aliases of that same identity. */
|
|
33
|
+
export declare function resolveSourceIdentities(input: SourceIdentityInput): SourceIdentity[];
|
|
34
|
+
//# sourceMappingURL=source-identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-identity.d.ts","sourceRoot":"","sources":["../../src/source-identity.ts"],"names":[],"mappings":"AAAA,wGAAwG;AACxG,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAE1D;AAED,gGAAgG;AAChG,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,oGAAoG;AACpG,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AACD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,WAAW,GAAG,gBAAgB,GAAG,WAAW,GAAG,QAAQ,CAAA;IAC7D,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AACD,qBAAa,mBAAoB,SAAQ,KAAK;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM;IAAmB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE;gBAA5D,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAW,UAAU,GAAE,MAAM,EAAO;CACvF;AACD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAE/D;AAED,sHAAsH;AACtH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAKrD;AAmBD,8GAA8G;AAC9G,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,mBAAmB,GAAG,cAAc,EAAE,CAsBpF"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/** Source IDs are opaque, scoped by knowledge base, and independent of names, locations and content. */
|
|
2
|
+
export function isSourceId(value) {
|
|
3
|
+
return typeof value === 'string' && /^[a-zA-Z0-9._:-]{1,160}$/.test(value);
|
|
4
|
+
}
|
|
5
|
+
/** Allocate once when an input joins the import queue; retries and conversions keep this ID. */
|
|
6
|
+
export function newSourceId() {
|
|
7
|
+
return `src_${globalThis.crypto.randomUUID()}`;
|
|
8
|
+
}
|
|
9
|
+
export class SourceIdentityError extends Error {
|
|
10
|
+
code;
|
|
11
|
+
candidates;
|
|
12
|
+
constructor(code, message, candidates = []) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.code = code;
|
|
15
|
+
this.candidates = candidates;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function sourceIdentityKey(value) {
|
|
19
|
+
return JSON.stringify([value.system, value.scope, value.documentType, value.documentId]);
|
|
20
|
+
}
|
|
21
|
+
/** WHATWG URL only: preserve query order, fragments, trailing slashes and protocol. No network/redirect inference. */
|
|
22
|
+
export function normalizeSourceUrl(value) {
|
|
23
|
+
let url;
|
|
24
|
+
try {
|
|
25
|
+
url = new URL(value);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
throw new SourceIdentityError('SOURCE_IDENTITY_INVALID', '来源 URL 必须是完整的 HTTP(S) 地址。');
|
|
29
|
+
}
|
|
30
|
+
if (!['https:', 'http:'].includes(url.protocol) || url.username || url.password || value.length > 8192)
|
|
31
|
+
throw new SourceIdentityError('SOURCE_IDENTITY_INVALID', '来源 URL 必须为 HTTP(S),且不能包含用户名或密码。');
|
|
32
|
+
return url;
|
|
33
|
+
}
|
|
34
|
+
/** Known document links only. Unknown query parameters / fragments fall back to exact URL identity. */
|
|
35
|
+
function platformIdentity(url, scope) {
|
|
36
|
+
if (url.hash || url.port)
|
|
37
|
+
return undefined;
|
|
38
|
+
// These explicit tracking parameters do not select a document or its version. All others are retained via URL fallback.
|
|
39
|
+
if ([...url.searchParams.keys()].some(key => !['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content'].includes(key)))
|
|
40
|
+
return undefined;
|
|
41
|
+
if (url.hostname === 'docs.google.com') {
|
|
42
|
+
const match = /^\/document\/(?:u\/\d+\/)?d\/([a-zA-Z0-9_-]+)(?:\/(?:edit|view|preview))?\/?$/.exec(url.pathname);
|
|
43
|
+
if (match)
|
|
44
|
+
return { system: 'google-docs', scope: scope ?? url.origin, documentType: 'document', documentId: match[1], rule: 'google-docs-v1', url: url.href };
|
|
45
|
+
}
|
|
46
|
+
if (url.hostname.endsWith('.feishu.cn') || url.hostname.endsWith('.larksuite.com')) {
|
|
47
|
+
const match = /^\/(docx|docs|wiki)\/([a-zA-Z0-9]+)\/?$/.exec(url.pathname);
|
|
48
|
+
if (match)
|
|
49
|
+
return { system: url.hostname.endsWith('.feishu.cn') ? 'feishu' : 'lark', scope: scope ?? url.origin,
|
|
50
|
+
documentType: match[1] === 'wiki' ? 'wiki-node' : match[1] === 'docs' ? 'doc' : 'docx', documentId: match[2], rule: 'feishu-v1', url: url.href };
|
|
51
|
+
}
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
/** First entry is the primary identity; additional entries are verified URL aliases of that same identity. */
|
|
55
|
+
export function resolveSourceIdentities(input) {
|
|
56
|
+
if (!input || typeof input !== 'object' || Array.isArray(input))
|
|
57
|
+
throw new SourceIdentityError('SOURCE_IDENTITY_INVALID', 'source_identity 必须为对象。');
|
|
58
|
+
if ((input.documentId !== undefined && input.document_id !== undefined && input.documentId !== input.document_id) || (input.documentType !== undefined && input.document_type !== undefined && input.documentType !== input.document_type))
|
|
59
|
+
throw new SourceIdentityError('SOURCE_IDENTITY_INVALID', '平台文档身份的同名参数不能冲突。');
|
|
60
|
+
input = { ...input, documentId: input.documentId ?? input.document_id, documentType: input.documentType ?? input.document_type };
|
|
61
|
+
for (const key of ['url', 'system', 'scope', 'documentType', 'documentId']) {
|
|
62
|
+
const value = input[key];
|
|
63
|
+
if (value !== undefined && (typeof value !== 'string' || !value.trim() || value !== value.trim() || value.length > (key === 'url' ? 8192 : 2048)))
|
|
64
|
+
throw new SourceIdentityError('SOURCE_IDENTITY_INVALID', `source_identity.${key} 必须为非空、无首尾空格的字符串。`);
|
|
65
|
+
}
|
|
66
|
+
const url = input.url ? normalizeSourceUrl(input.url) : undefined;
|
|
67
|
+
const parsed = url ? platformIdentity(url, input.scope) : undefined;
|
|
68
|
+
const native = input.documentId !== undefined || input.system !== undefined || input.documentType !== undefined;
|
|
69
|
+
const urlIdentity = url ? { system: 'web', scope: input.scope ?? url.origin, documentType: 'url', documentId: url.href, rule: 'url-v1', url: url.href } : undefined;
|
|
70
|
+
if (native) {
|
|
71
|
+
if (!input.system || !input.scope || !input.documentId)
|
|
72
|
+
throw new SourceIdentityError('SOURCE_IDENTITY_INVALID', '平台身份必须同时提供 system、scope 和 document_id。');
|
|
73
|
+
const identity = { system: input.system.toLowerCase(), scope: input.scope, documentType: input.documentType ?? 'document', documentId: input.documentId, rule: 'native-v1', ...(url ? { url: url.href } : {}) };
|
|
74
|
+
if (parsed && sourceIdentityKey(identity) !== sourceIdentityKey(parsed))
|
|
75
|
+
throw new SourceIdentityError('SOURCE_ORIGIN_CONFLICT', '平台文档 ID 与链接解析结果不一致。');
|
|
76
|
+
// An unknown URL is provenance only: it does not prove an alias for a native resource.
|
|
77
|
+
return parsed && urlIdentity ? [identity, urlIdentity] : [identity];
|
|
78
|
+
}
|
|
79
|
+
if (parsed && urlIdentity)
|
|
80
|
+
return [parsed, urlIdentity];
|
|
81
|
+
if (urlIdentity)
|
|
82
|
+
return [urlIdentity];
|
|
83
|
+
throw new SourceIdentityError('SOURCE_IDENTITY_INVALID', '请提供 url,或完整的平台文档身份。');
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=source-identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-identity.js","sourceRoot":"","sources":["../../src/source-identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { KnowledgeDb } from './store/knowledge-db.js';
|
|
2
|
+
export interface SourceReadInput {
|
|
3
|
+
sourceId: string;
|
|
4
|
+
version?: number;
|
|
5
|
+
contentHash?: string;
|
|
6
|
+
start?: number;
|
|
7
|
+
end?: number;
|
|
8
|
+
quote?: string;
|
|
9
|
+
offset?: number;
|
|
10
|
+
maxChars?: number;
|
|
11
|
+
}
|
|
12
|
+
export declare class SourceReadError extends Error {
|
|
13
|
+
readonly code: string;
|
|
14
|
+
constructor(code: string, message: string);
|
|
15
|
+
}
|
|
16
|
+
/** Source ID identifies the document; the integer version pins its body; ranges use UTF-16, end exclusive. */
|
|
17
|
+
export declare function readSourceExact(db: KnowledgeDb, input: SourceReadInput): Record<string, unknown>;
|
|
18
|
+
//# sourceMappingURL=source-read.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-read.d.ts","sourceRoot":"","sources":["../../src/source-read.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAI1D,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AACD,qBAAa,eAAgB,SAAQ,KAAK;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CACnD;AACD,8GAA8G;AAC9G,wBAAgB,eAAe,CAAC,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA2BhG"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { isSourceId } from './source-identity.js';
|
|
3
|
+
import { locateQuote } from './wiki-trial.js';
|
|
4
|
+
export class SourceReadError extends Error {
|
|
5
|
+
code;
|
|
6
|
+
constructor(code, message) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.code = code;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
/** Source ID identifies the document; the integer version pins its body; ranges use UTF-16, end exclusive. */
|
|
12
|
+
export function readSourceExact(db, input) {
|
|
13
|
+
const fail = (code, message) => { throw new SourceReadError(code, message); };
|
|
14
|
+
if (!isSourceId(input.sourceId))
|
|
15
|
+
return fail('SOURCE_ID_INVALID', 'source_id 必须为已返回的完整合法 ID。');
|
|
16
|
+
const current = db.source(input.sourceId);
|
|
17
|
+
if (!current)
|
|
18
|
+
return fail('SOURCE_NOT_FOUND', 'source_id 不存在或已删除;不会回退到标题或正文搜索。');
|
|
19
|
+
const version = input.version ?? current.version;
|
|
20
|
+
if (!Number.isInteger(version) || version < 1)
|
|
21
|
+
return fail('SOURCE_VERSION_INVALID', 'version 必须为正整数。');
|
|
22
|
+
const revision = db.revisionBody('source', input.sourceId, version);
|
|
23
|
+
if (!revision)
|
|
24
|
+
return fail('SOURCE_VERSION_NOT_FOUND', '指定来源版本不可用;不会改读最新版。');
|
|
25
|
+
const text = revision.body;
|
|
26
|
+
const contentHash = createHash('sha256').update(text).digest('hex');
|
|
27
|
+
if (input.contentHash !== undefined && input.contentHash !== contentHash && input.contentHash !== contentHash.slice(0, 24))
|
|
28
|
+
return fail('SOURCE_HASH_MISMATCH', '指定版本的正文哈希与引用不一致。');
|
|
29
|
+
if (input.quote !== undefined && (typeof input.quote !== 'string' || !input.quote.trim()))
|
|
30
|
+
return fail('SOURCE_QUOTE_INVALID', 'quote 必须为非空原文引文。');
|
|
31
|
+
const located = input.quote === undefined ? undefined : locateQuote(text, input.quote);
|
|
32
|
+
if (located && !located.found)
|
|
33
|
+
return fail('SOURCE_QUOTE_MISMATCH', '引文不在指定版本中。');
|
|
34
|
+
const start = input.start ?? (input.end === undefined ? located?.locator?.start : undefined) ?? 0;
|
|
35
|
+
const end = input.end ?? (input.start === undefined ? located?.locator?.end : undefined) ?? text.length;
|
|
36
|
+
const offset = input.offset ?? 0, maxChars = input.maxChars ?? 20000;
|
|
37
|
+
if (![start, end, offset, maxChars].every(Number.isInteger) || start < 0 || end < start || end > text.length || offset < 0 || offset > end - start || maxChars < 1 || maxChars > 40000)
|
|
38
|
+
return fail('SOURCE_RANGE_INVALID', '范围必须满足 0 ≤ start ≤ end ≤ 正文长度;offset 为范围内偏移,max_chars 为 1–40000。');
|
|
39
|
+
if (input.quote && !locateQuote(text.slice(start, end), input.quote).found)
|
|
40
|
+
return fail('SOURCE_QUOTE_MISMATCH', '指定范围与引文不匹配。');
|
|
41
|
+
const from = start + offset, to = Math.min(end, from + maxChars), truncated = to < end;
|
|
42
|
+
const readRef = { source_id: input.sourceId, version, content_hash: contentHash, start, end };
|
|
43
|
+
return { sourceId: input.sourceId, title: String(revision.frontmatter.title ?? current.record.title), version, currentVersion: current.version,
|
|
44
|
+
historical: version !== current.version, contentHash, content: text.slice(from, to), start: from, end: to, rangeStart: start, rangeEnd: end,
|
|
45
|
+
offset, returnedChars: to - from, totalChars: text.length, truncated, nextOffset: truncated ? offset + to - from : null, readRef,
|
|
46
|
+
...(truncated ? { nextRead: { tool: 'query_source_truth', args: { ...readRef, offset: offset + to - from, max_chars: maxChars } } } : {}),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=source-read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-read.js","sourceRoot":"","sources":["../../src/source-read.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"axis-references.d.ts","sourceRoot":"","sources":["../../../src/store/axis-references.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAGnD,OAAO,KAAK,EAAE,WAAW,EAAoB,MAAM,mBAAmB,CAAA;AAEtE,+EAA+E;AAC/E,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"axis-references.d.ts","sourceRoot":"","sources":["../../../src/store/axis-references.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAGnD,OAAO,KAAK,EAAE,WAAW,EAAoB,MAAM,mBAAmB,CAAA;AAEtE,+EAA+E;AAC/E,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA0F5G"}
|
|
@@ -13,14 +13,15 @@ export function redirectAxisReferences(db, kind, fromId, intoId) {
|
|
|
13
13
|
db.raw(`UPDATE knowledge SET ${column} = ?, updated_at = ? WHERE ${column} = ?`).run(intoId, new Date().toISOString(), fromId);
|
|
14
14
|
const placements = db.placements();
|
|
15
15
|
const cards = db.cards();
|
|
16
|
-
const
|
|
16
|
+
const wikiKind = (card) => card.metadata.wiki_kind === 'fact' || card.metadata.wiki_kind === 'way' ? card.metadata.wiki_kind : undefined;
|
|
17
|
+
const byCoordinate = new Map(cards.filter(row => row.card.coordinate).map(row => [cardCoordinateKey(row.card.coordinate, wikiKind(row.card)), row]));
|
|
17
18
|
db.transact({ opId: `axis-merge:${fromId}:${intoId}:${Date.now()}`, actor: 'user', summary: '合并轴实体并迁移知识、卡片与事件引用' }, tx => {
|
|
18
19
|
for (const row of cards) {
|
|
19
20
|
const coordinate = row.card.coordinate;
|
|
20
21
|
if (!coordinate || coordinate[field] !== fromId)
|
|
21
22
|
continue;
|
|
22
23
|
const next = redirect(coordinate);
|
|
23
|
-
const key = cardCoordinateKey(next);
|
|
24
|
+
const key = cardCoordinateKey(next, wikiKind(row.card));
|
|
24
25
|
const target = byCoordinate.get(key);
|
|
25
26
|
const base = target && target.card.entityId !== row.card.entityId ? target : row;
|
|
26
27
|
const merged = base !== row;
|
|
@@ -31,6 +32,7 @@ export function redirectAxisReferences(db, kind, fromId, intoId) {
|
|
|
31
32
|
sourceRefs: [...new Set([...base.card.sourceRefs, ...row.card.sourceRefs])],
|
|
32
33
|
annotations: [...new Map([...(base.card.annotations ?? []), ...(row.card.annotations ?? [])].map(annotation => [annotation.id, annotation])).values()],
|
|
33
34
|
metadata: { ...base.card.metadata, layout: undefined, citations: undefined,
|
|
35
|
+
knowledge_versions: { ...(row.card.metadata.knowledge_versions ?? {}), ...(base.card.metadata.knowledge_versions ?? {}) },
|
|
34
36
|
aliases: [...new Set([...(Array.isArray(base.card.metadata.aliases) ? base.card.metadata.aliases : []), ...(Array.isArray(row.card.metadata.aliases) ? row.card.metadata.aliases : []), base.card.title, row.card.title])],
|
|
35
37
|
...(eventRefs.length ? { event_refs: JSON.stringify(eventRefs) } : {}) },
|
|
36
38
|
};
|
|
@@ -41,7 +43,7 @@ export function redirectAxisReferences(db, kind, fromId, intoId) {
|
|
|
41
43
|
const frontmatter = { ...base.frontmatter, coordinate: { object: next.objectId, action: next.actionId, scene: next.sceneId }, source_refs: card.sourceRefs, metadata: card.metadata, annotations: card.annotations };
|
|
42
44
|
tx.putCard(card, frontmatter, { actor: 'user', kind: 'named', summary: '轴合并后的卡片引用' }, combined, true);
|
|
43
45
|
db.setCardEvents(card.entityId, eventRefs);
|
|
44
|
-
byCoordinate.delete(cardCoordinateKey(coordinate));
|
|
46
|
+
byCoordinate.delete(cardCoordinateKey(coordinate, wikiKind(row.card)));
|
|
45
47
|
byCoordinate.set(key, { ...base, card, frontmatter });
|
|
46
48
|
placements.set(card.entityId, combined);
|
|
47
49
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"axis-references.js","sourceRoot":"","sources":["../../../src/store/axis-references.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,0BAA0B,EAAoB,MAAM,cAAc,CAAA;AAC3H,OAAO,EAAE,iBAAiB,EAAuB,MAAM,aAAa,CAAA;AAGpE,+EAA+E;AAC/E,MAAM,UAAU,sBAAsB,CAAC,EAAe,EAAE,IAAc,EAAE,MAAc,EAAE,MAAc;IACpG,MAAM,MAAM,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,IAAI,CAAC,CAAA;IACpF,MAAM,KAAK,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,IAAI,CAAyB,CAAA;IACxG,MAAM,QAAQ,GAAG,CAAC,UAA0B,EAAkB,EAAE,CAAC,CAAC;QAChE,GAAG,UAAU,EAAE,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC;KAClF,CAAC,CAAA;IACF,MAAM,YAAY,GAAG,EAAE,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC,GAAG,EAAE,CAAA;IACzF,IAAI,YAAY;QAAE,EAAE,CAAC,GAAG,CAAC,wBAAwB,MAAM,8BAA8B,MAAM,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,CAAA;IAChJ,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,EAAE,CAAA;IAClC,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,EAAE,CAAA;IACxB,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,UAAW,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"axis-references.js","sourceRoot":"","sources":["../../../src/store/axis-references.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,31 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* 知识库文件(`<库 id>/knowledge.db`):**正文、版本、血缘的唯一存储**。
|
|
3
|
-
*
|
|
4
|
-
* ## 为什么正文也进库(PRD v2 §0.1)
|
|
5
|
-
*
|
|
6
|
-
* v1 让正文留在 `.md` 文件、只有历史进库,用「DB 当写前日志 + 启动对账」兜底两个
|
|
7
|
-
* 存储之间的一致性。那道税是**永久的**:任何时刻都可能半截(文件写了、事务没提交),
|
|
8
|
-
* 每次启动都要对账,而且新增一份数据要同时维护两条写路径。
|
|
9
|
-
*
|
|
10
|
-
* 这个模块让那道税消失:正文、版本、血缘、资产引用在**同一个事务**里提交。
|
|
11
|
-
* 事务的边界就是**操作的边界**(见 {@link KnowledgeDb.transact}),不是写入的边界 ——
|
|
12
|
-
* 一次编译写 40 张卡是**一个**操作、**一行** `tree`、正文真变了的卡片各一行 `revision`。
|
|
13
|
-
*
|
|
14
|
-
* ## 这个模块知道什么、不知道什么
|
|
15
|
-
*
|
|
16
|
-
* 它**不解析 front matter**。调用方把 front matter 解析好、序列化成 JSON 交给它
|
|
17
|
-
* (`putSource` / `putCard` 的 `frontmatter` 参数),读的时候原样取回。理由是 front
|
|
18
|
-
* matter 的形状属于来源内容本身(OKF 键与通用 metadata),
|
|
19
|
-
* 让它变一次就要改一次存储层是错的。要查询的键才提升成列(`title` /
|
|
20
|
-
* `entity_type` / `status` / `external_id`)。
|
|
21
|
-
*
|
|
22
|
-
* ## 为什么历史正文按内容寻址
|
|
23
|
-
*
|
|
24
|
-
* `blob.hash` 是 sha256(正文)。重编一次 40 张卡里常常只有 3 张正文变了,另外 37 张的
|
|
25
|
-
* 新版本行**指向同一个 blob**,不占额外空间。实测(PRD §3.2):3 次写入 → 2 个 blob。
|
|
26
|
-
*
|
|
27
|
-
* @module
|
|
28
|
-
*/
|
|
1
|
+
import { type SourceIdentity } from '../source-identity.js';
|
|
29
2
|
import type { SqliteDatabase, SqliteStatement } from '../fts.js';
|
|
30
3
|
import { KNOWLEDGE_DB_FILE } from '../layout.js';
|
|
31
4
|
import { type KnowledgeCard, type SourceRaw } from '../types.js';
|
|
@@ -46,7 +19,7 @@ export declare const KNOWLEDGE_DB_APPLICATION_ID = 1414218308;
|
|
|
46
19
|
* 旧库会在打开时做一次**事务化就地迁移**。知识库是用户数据,不能因为存储层增加了
|
|
47
20
|
* 一列或调整了主键就要求用户重新导入;只有比当前版本更新的库才拒绝打开。
|
|
48
21
|
*/
|
|
49
|
-
export declare const KNOWLEDGE_DB_SCHEMA =
|
|
22
|
+
export declare const KNOWLEDGE_DB_SCHEMA = 9;
|
|
50
23
|
/** 实体种类。`knowledge` 与轴注册表不走这张表(它们各有自己的表,见 §3.2)。 */
|
|
51
24
|
export type EntityKind = 'source' | 'card';
|
|
52
25
|
/** 谁改的。与 `oplog.ts` 的 `actor` 同一套词。 */
|
|
@@ -202,6 +175,7 @@ export declare class KnowledgeTx {
|
|
|
202
175
|
* 让省略意味着「保留」,会让「主动清掉底稿」这件事无法表达。
|
|
203
176
|
*/
|
|
204
177
|
putSource(record: SourceRaw, frontmatter: Record<string, unknown>, journal: Journal, original?: SourceOriginal): WriteOutcome;
|
|
178
|
+
bindSourceIdentity(identity: SourceIdentity, sourceId: string): void;
|
|
205
179
|
/**
|
|
206
180
|
* 写一张卡片。判据同样是正文哈希。
|
|
207
181
|
*
|
|
@@ -322,6 +296,8 @@ export declare class KnowledgeDb {
|
|
|
322
296
|
* 行为必须留着 —— 它的用处是「同名的两份来源不要互相覆盖」,与「文件叫什么」无关。
|
|
323
297
|
*/
|
|
324
298
|
sourceIdByTitle(title: string): string | undefined;
|
|
299
|
+
sourceIdByIdentity(identity: SourceIdentity): string | undefined;
|
|
300
|
+
sourceIdentities(sourceId: string): SourceIdentity[];
|
|
325
301
|
card(id: string): CardRecord | undefined;
|
|
326
302
|
/**
|
|
327
303
|
* 把实体读回记录。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledge-db.d.ts","sourceRoot":"","sources":["../../../src/store/knowledge-db.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"knowledge-db.d.ts","sourceRoot":"","sources":["../../../src/store/knowledge-db.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { SourceIdentityError } from '../source-identity.js';
|
|
1
2
|
/**
|
|
2
3
|
* 知识库文件(`<库 id>/knowledge.db`):**正文、版本、血缘的唯一存储**。
|
|
3
4
|
*
|
|
@@ -48,7 +49,7 @@ export const KNOWLEDGE_DB_APPLICATION_ID = 0x544B4244;
|
|
|
48
49
|
* 旧库会在打开时做一次**事务化就地迁移**。知识库是用户数据,不能因为存储层增加了
|
|
49
50
|
* 一列或调整了主键就要求用户重新导入;只有比当前版本更新的库才拒绝打开。
|
|
50
51
|
*/
|
|
51
|
-
export const KNOWLEDGE_DB_SCHEMA =
|
|
52
|
+
export const KNOWLEDGE_DB_SCHEMA = 9;
|
|
52
53
|
/**
|
|
53
54
|
* 行上的坐标 → `CardCoordinate`。**三列全空返回 `undefined`**(这张卡还没有坐标)。
|
|
54
55
|
*
|
|
@@ -137,6 +138,15 @@ CREATE TABLE IF NOT EXISTS card_event (
|
|
|
137
138
|
);
|
|
138
139
|
CREATE INDEX IF NOT EXISTS card_event_event_idx ON card_event(event_id);
|
|
139
140
|
`;
|
|
141
|
+
const SOURCE_IDENTITY_SCHEMA_SQL = `
|
|
142
|
+
CREATE TABLE IF NOT EXISTS source_identity (
|
|
143
|
+
system TEXT NOT NULL, scope TEXT NOT NULL, document_type TEXT NOT NULL, document_id TEXT NOT NULL,
|
|
144
|
+
source_id TEXT NOT NULL, rule TEXT NOT NULL, url TEXT,
|
|
145
|
+
PRIMARY KEY(system, scope, document_type, document_id)
|
|
146
|
+
);
|
|
147
|
+
CREATE INDEX IF NOT EXISTS source_identity_source ON source_identity(source_id);
|
|
148
|
+
CREATE UNIQUE INDEX IF NOT EXISTS source_identity_primary ON source_identity(source_id) WHERE rule <> 'url-v1';
|
|
149
|
+
`;
|
|
140
150
|
function schemaSql() {
|
|
141
151
|
return `
|
|
142
152
|
CREATE TABLE IF NOT EXISTS blob (
|
|
@@ -159,6 +169,8 @@ CREATE TABLE IF NOT EXISTS source (
|
|
|
159
169
|
original_bytes INTEGER
|
|
160
170
|
);
|
|
161
171
|
|
|
172
|
+
${SOURCE_IDENTITY_SCHEMA_SQL}
|
|
173
|
+
|
|
162
174
|
CREATE TABLE IF NOT EXISTS card (
|
|
163
175
|
-- 坐标是卡片身份。entity_id 是旧接口、版本和关联表继续使用的稳定别名。
|
|
164
176
|
coordinate_key TEXT PRIMARY KEY NOT NULL,
|
|
@@ -398,6 +410,12 @@ function migrateSchema(db, fromVersion) {
|
|
|
398
410
|
return;
|
|
399
411
|
db.exec('BEGIN IMMEDIATE');
|
|
400
412
|
try {
|
|
413
|
+
if (fromVersion === 8) {
|
|
414
|
+
db.exec(SOURCE_IDENTITY_SCHEMA_SQL);
|
|
415
|
+
db.exec(`PRAGMA user_version = ${KNOWLEDGE_DB_SCHEMA}`);
|
|
416
|
+
db.exec('COMMIT');
|
|
417
|
+
return;
|
|
418
|
+
}
|
|
401
419
|
addColumnIfMissing(db, 'blob', 'bytes', '"bytes" INTEGER NOT NULL DEFAULT 0');
|
|
402
420
|
rebuildSourceTableForSchemaMigration(db);
|
|
403
421
|
addColumnIfMissing(db, 'source', 'original_rel', '"original_rel" TEXT');
|
|
@@ -411,6 +429,20 @@ function migrateSchema(db, fromVersion) {
|
|
|
411
429
|
addColumnIfMissing(db, 'card', 'scene_id', '"scene_id" TEXT NOT NULL DEFAULT \'\'');
|
|
412
430
|
// 其他模块可能已经先建了自己的表;schemaSql 使用 IF NOT EXISTS,可安全补齐剩余结构和索引。
|
|
413
431
|
db.exec(schemaSql());
|
|
432
|
+
// Rekey typed Wiki rows without changing entity IDs, content, reviews or revisions.
|
|
433
|
+
const wikiRows = db.prepare('SELECT entity_id,coordinate_key,object_id,action_id,scene_id,frontmatter FROM card').all();
|
|
434
|
+
for (const row of wikiRows) {
|
|
435
|
+
const metadata = parseFrontmatter(String(row.frontmatter)).metadata;
|
|
436
|
+
const kind = metadata?.wiki_kind;
|
|
437
|
+
const coordinate = coordinateOfRow(row);
|
|
438
|
+
if (!coordinate || (kind !== 'fact' && kind !== 'way'))
|
|
439
|
+
continue;
|
|
440
|
+
const key = cardCoordinateKey(coordinate, kind);
|
|
441
|
+
const holder = db.prepare('SELECT entity_id FROM card WHERE coordinate_key=?').get(key);
|
|
442
|
+
if (holder && holder.entity_id !== row.entity_id)
|
|
443
|
+
continue;
|
|
444
|
+
db.prepare('UPDATE card SET coordinate_key=? WHERE entity_id=?').run(key, String(row.entity_id));
|
|
445
|
+
}
|
|
414
446
|
db.exec(`PRAGMA application_id = ${KNOWLEDGE_DB_APPLICATION_ID}`);
|
|
415
447
|
db.exec(`PRAGMA user_version = ${KNOWLEDGE_DB_SCHEMA}`);
|
|
416
448
|
db.exec('COMMIT');
|
|
@@ -534,6 +566,15 @@ export class KnowledgeTx {
|
|
|
534
566
|
.run(record.sourceId, record.title, record.externalId ?? null, JSON.stringify(frontmatter), 0, record.createdAt, record.updatedAt, original?.rel ?? null, original?.sha256 ?? null, original?.bytes ?? null);
|
|
535
567
|
});
|
|
536
568
|
}
|
|
569
|
+
bindSourceIdentity(identity, sourceId) {
|
|
570
|
+
if (!this.db.source(sourceId))
|
|
571
|
+
throw new SourceIdentityError('SOURCE_ORIGIN_UNAVAILABLE', '身份绑定的来源必须存在。', [sourceId]);
|
|
572
|
+
const owner = this.db.sourceIdByIdentity(identity);
|
|
573
|
+
if (owner && owner !== sourceId)
|
|
574
|
+
throw new SourceIdentityError('SOURCE_ORIGIN_CONFLICT', '来源身份已绑定另一份文档。', [owner, sourceId]);
|
|
575
|
+
this.raw('INSERT INTO source_identity(system,scope,document_type,document_id,source_id,rule,url) VALUES (?,?,?,?,?,?,?) ON CONFLICT(system,scope,document_type,document_id) DO NOTHING')
|
|
576
|
+
.run(identity.system, identity.scope, identity.documentType, identity.documentId, sourceId, identity.rule, identity.url ?? null);
|
|
577
|
+
}
|
|
537
578
|
/**
|
|
538
579
|
* 写一张卡片。判据同样是正文哈希。
|
|
539
580
|
*
|
|
@@ -551,7 +592,7 @@ export class KnowledgeTx {
|
|
|
551
592
|
const storedCoordinate = card.coordinate ?? (existing === undefined ? undefined : coordinateOfRow(existing));
|
|
552
593
|
const coordinateKey = storedCoordinate === undefined
|
|
553
594
|
? legacyCardStorageKey(card.entityId)
|
|
554
|
-
: cardCoordinateKey(storedCoordinate);
|
|
595
|
+
: cardCoordinateKey(storedCoordinate, card.metadata.wiki_kind === 'fact' || card.metadata.wiki_kind === 'way' ? card.metadata.wiki_kind : undefined);
|
|
555
596
|
const oldKey = typeof existing?.coordinate_key === 'string' ? existing.coordinate_key : undefined;
|
|
556
597
|
if (existing !== undefined) {
|
|
557
598
|
if (!allowCoordinateMove && oldKey !== undefined && oldKey !== coordinateKey && !oldKey.startsWith('legacy:')) {
|
|
@@ -636,6 +677,10 @@ export class KnowledgeTx {
|
|
|
636
677
|
/** 删实体本体。**`revision` 行与 `blob` 不动** —— 删除即灭史是 0062 之前的缺陷 5。 */
|
|
637
678
|
removeEntity(kind, id) {
|
|
638
679
|
this.raw(`DELETE FROM ${kind === 'source' ? 'source' : 'card'} WHERE entity_id = ?`).run(id);
|
|
680
|
+
if (kind === 'source')
|
|
681
|
+
this.raw('DELETE FROM source_identity WHERE source_id=?').run(id);
|
|
682
|
+
if (kind === 'source' && tableExists(this.db.connection(), 'pipeline_chunks'))
|
|
683
|
+
this.raw('DELETE FROM pipeline_chunks WHERE source_id=?').run(id);
|
|
639
684
|
this.raw('DELETE FROM entity_asset WHERE entity_kind = ? AND entity_id = ?').run(kind, id);
|
|
640
685
|
/*
|
|
641
686
|
* 卡片的知识落位跟着走(0069)。这里没有外键,所以它是**代码责任** —— 漏掉的话,
|
|
@@ -690,6 +735,7 @@ export class KnowledgeDb {
|
|
|
690
735
|
let db;
|
|
691
736
|
try {
|
|
692
737
|
db = new DatabaseSync(file);
|
|
738
|
+
db.exec('PRAGMA busy_timeout = 5000');
|
|
693
739
|
}
|
|
694
740
|
catch (cause) {
|
|
695
741
|
return { ok: false, code: 'OPEN_FAILED', message: `打开失败:${cause instanceof Error ? cause.message : String(cause)}` };
|
|
@@ -1027,6 +1073,15 @@ export class KnowledgeDb {
|
|
|
1027
1073
|
const row = this.raw('SELECT entity_id FROM source WHERE title = ? LIMIT 1').get(title);
|
|
1028
1074
|
return typeof row?.entity_id === 'string' ? row.entity_id : undefined;
|
|
1029
1075
|
}
|
|
1076
|
+
sourceIdByIdentity(identity) {
|
|
1077
|
+
const row = this.raw('SELECT source_id FROM source_identity WHERE system=? AND scope=? AND document_type=? AND document_id=?')
|
|
1078
|
+
.get(identity.system, identity.scope, identity.documentType, identity.documentId);
|
|
1079
|
+
return row?.source_id;
|
|
1080
|
+
}
|
|
1081
|
+
sourceIdentities(sourceId) {
|
|
1082
|
+
const rows = this.raw('SELECT * FROM source_identity WHERE source_id=? ORDER BY system,scope,document_type,document_id').all(sourceId);
|
|
1083
|
+
return rows.map(row => ({ system: row.system, scope: row.scope, documentType: row.document_type, documentId: row.document_id, rule: row.rule, ...(row.url ? { url: row.url } : {}) }));
|
|
1084
|
+
}
|
|
1030
1085
|
card(id) {
|
|
1031
1086
|
return this.readEntities('card', id)[0];
|
|
1032
1087
|
}
|