dsh-data-domain-knowledge 0.1.0-alpha.9 → 0.1.1-alpha.2
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 +118 -567
- package/cordis.patch.yml +5 -418
- package/eval/README.md +19 -8
- package/eval/benchmark-extraction-format.mjs +20 -0
- package/eval/evaluate-retrieval.mjs +17 -8
- package/eval/queries.example.jsonl +1 -0
- package/lib/client.js +4181 -3239
- package/lib/contract-envelope.d.ts +91 -0
- package/lib/contract-envelope.js +106 -0
- package/lib/contract-layout.d.ts +130 -0
- package/lib/contract-layout.js +138 -0
- package/lib/contract-refs.d.ts +39 -0
- package/lib/contract-refs.js +9 -0
- package/lib/contract-version.d.ts +311 -0
- package/lib/contract-version.js +270 -0
- package/lib/contract-wire.d.ts +147 -0
- package/lib/contract-wire.js +99 -0
- package/lib/contracts.d.ts +12 -0
- package/lib/contracts.js +12 -0
- package/lib/doc-page.js +2 -2
- package/lib/pages.js +3329 -1296
- package/lib/types/agent-behavior-rules.d.ts +10 -0
- package/lib/types/agent-behavior-rules.d.ts.map +1 -0
- package/lib/types/agent-behavior-rules.js +28 -0
- package/lib/types/agent-behavior-rules.js.map +1 -0
- package/lib/types/axis-registry.d.ts +37 -5
- package/lib/types/axis-registry.d.ts.map +1 -1
- package/lib/types/axis-registry.js +234 -26
- package/lib/types/axis-registry.js.map +1 -1
- package/lib/types/card-organize.d.ts +27 -12
- package/lib/types/card-organize.d.ts.map +1 -1
- package/lib/types/card-organize.js +58 -73
- package/lib/types/card-organize.js.map +1 -1
- package/lib/types/compiler/embedding-identity.d.ts +3 -0
- package/lib/types/compiler/embedding-identity.d.ts.map +1 -0
- package/lib/types/compiler/embedding-identity.js +24 -0
- package/lib/types/compiler/embedding-identity.js.map +1 -0
- package/lib/types/compiler/snapshot.d.ts +16 -0
- package/lib/types/compiler/snapshot.d.ts.map +1 -0
- package/lib/types/compiler/snapshot.js +2 -0
- package/lib/types/compiler/snapshot.js.map +1 -0
- package/lib/types/config-schema.d.ts +6 -3
- package/lib/types/config-schema.d.ts.map +1 -1
- package/lib/types/config-schema.js +6 -2
- package/lib/types/config-schema.js.map +1 -1
- package/lib/types/convert/host.d.ts +6 -5
- package/lib/types/convert/host.d.ts.map +1 -1
- package/lib/types/convert/host.js +58 -18
- package/lib/types/convert/host.js.map +1 -1
- package/lib/types/convert/ingest.d.ts +10 -1
- package/lib/types/convert/ingest.d.ts.map +1 -1
- package/lib/types/convert/ingest.js +68 -9
- package/lib/types/convert/ingest.js.map +1 -1
- package/lib/types/derive-contract.d.ts +3 -0
- package/lib/types/derive-contract.d.ts.map +1 -0
- package/lib/types/derive-contract.js +15 -0
- package/lib/types/derive-contract.js.map +1 -0
- package/lib/types/diagnosis/cards.d.ts +7 -3
- package/lib/types/diagnosis/cards.d.ts.map +1 -1
- package/lib/types/diagnosis/cards.js +13 -8
- package/lib/types/diagnosis/cards.js.map +1 -1
- package/lib/types/diagnosis/run.d.ts +4 -13
- package/lib/types/diagnosis/run.d.ts.map +1 -1
- package/lib/types/diagnosis/run.js +26 -16
- package/lib/types/diagnosis/run.js.map +1 -1
- package/lib/types/diagnosis/schema.js +2 -2
- package/lib/types/diagnosis/schema.js.map +1 -1
- package/lib/types/diagnosis/seed-source.d.ts +1 -1
- package/lib/types/diagnosis/seed-source.d.ts.map +1 -1
- package/lib/types/diagnosis/seed-source.js +5 -4
- package/lib/types/diagnosis/seed-source.js.map +1 -1
- package/lib/types/diagnosis/seed.d.ts +4 -4
- package/lib/types/diagnosis/seed.d.ts.map +1 -1
- package/lib/types/diagnosis/seed.js +6 -8
- package/lib/types/diagnosis/seed.js.map +1 -1
- package/lib/types/diagnosis/store.d.ts +24 -18
- package/lib/types/diagnosis/store.d.ts.map +1 -1
- package/lib/types/diagnosis/store.js +130 -65
- package/lib/types/diagnosis/store.js.map +1 -1
- package/lib/types/diagnosis/types.d.ts +47 -15
- package/lib/types/diagnosis/types.d.ts.map +1 -1
- package/lib/types/diagnosis/types.js.map +1 -1
- package/lib/types/environment/dsh-python.d.ts +77 -0
- package/lib/types/environment/dsh-python.d.ts.map +1 -0
- package/lib/types/environment/dsh-python.js +139 -0
- package/lib/types/environment/dsh-python.js.map +1 -0
- package/lib/types/environment/install.d.ts +15 -0
- package/lib/types/environment/install.d.ts.map +1 -0
- package/lib/types/environment/install.js +297 -0
- package/lib/types/environment/install.js.map +1 -0
- package/lib/types/environment/manifest.d.ts +208 -0
- package/lib/types/environment/manifest.d.ts.map +1 -0
- package/lib/types/environment/manifest.js +26 -0
- package/lib/types/environment/manifest.js.map +1 -0
- package/lib/types/environment/model-catalog.d.ts +223 -0
- package/lib/types/environment/model-catalog.d.ts.map +1 -0
- package/lib/types/environment/model-catalog.js +129 -0
- package/lib/types/environment/model-catalog.js.map +1 -0
- package/lib/types/environment/process.d.ts +10 -0
- package/lib/types/environment/process.d.ts.map +1 -0
- package/lib/types/environment/process.js +54 -0
- package/lib/types/environment/process.js.map +1 -0
- package/lib/types/environment/selection.d.ts +9 -0
- package/lib/types/environment/selection.d.ts.map +1 -0
- package/lib/types/environment/selection.js +29 -0
- package/lib/types/environment/selection.js.map +1 -0
- package/lib/types/environment/service.d.ts +64 -0
- package/lib/types/environment/service.d.ts.map +1 -0
- package/lib/types/environment/service.js +424 -0
- package/lib/types/environment/service.js.map +1 -0
- package/lib/types/environment/types.d.ts +56 -0
- package/lib/types/environment/types.d.ts.map +1 -0
- package/lib/types/environment/types.js +2 -0
- package/lib/types/environment/types.js.map +1 -0
- package/lib/types/events.d.ts +76 -0
- package/lib/types/events.d.ts.map +1 -0
- package/lib/types/events.js +52 -0
- package/lib/types/events.js.map +1 -0
- package/lib/types/extract-contract.d.ts +3 -0
- package/lib/types/extract-contract.d.ts.map +1 -0
- package/lib/types/extract-contract.js +41 -0
- package/lib/types/extract-contract.js.map +1 -0
- package/lib/types/extract-model.d.ts +5 -0
- package/lib/types/extract-model.d.ts.map +1 -1
- package/lib/types/extract-model.js.map +1 -1
- package/lib/types/extract-table-contract.d.ts +3 -0
- package/lib/types/extract-table-contract.d.ts.map +1 -0
- package/lib/types/extract-table-contract.js +27 -0
- package/lib/types/extract-table-contract.js.map +1 -0
- package/lib/types/extract-table.d.ts +8 -0
- package/lib/types/extract-table.d.ts.map +1 -0
- package/lib/types/extract-table.js +158 -0
- package/lib/types/extract-table.js.map +1 -0
- package/lib/types/extraction-runs.d.ts +30 -6
- package/lib/types/extraction-runs.d.ts.map +1 -1
- package/lib/types/extraction-runs.js +69 -8
- package/lib/types/extraction-runs.js.map +1 -1
- package/lib/types/fs-atomic.d.ts +0 -7
- package/lib/types/fs-atomic.d.ts.map +1 -1
- package/lib/types/fs-atomic.js +17 -2
- package/lib/types/fs-atomic.js.map +1 -1
- package/lib/types/images.d.ts +26 -0
- package/lib/types/images.d.ts.map +1 -0
- package/lib/types/images.js +196 -0
- package/lib/types/images.js.map +1 -0
- package/lib/types/index.d.ts +2 -2
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/index.js +598 -209
- package/lib/types/index.js.map +1 -1
- package/lib/types/intent/engine.d.ts +12 -4
- package/lib/types/intent/engine.d.ts.map +1 -1
- package/lib/types/intent/engine.js +43 -5
- package/lib/types/intent/engine.js.map +1 -1
- package/lib/types/intent/host.d.ts +5 -8
- package/lib/types/intent/host.d.ts.map +1 -1
- package/lib/types/intent/host.js +56 -11
- package/lib/types/intent/host.js.map +1 -1
- package/lib/types/intent/scope.d.ts +25 -0
- package/lib/types/intent/scope.d.ts.map +1 -0
- package/lib/types/intent/scope.js +116 -0
- package/lib/types/intent/scope.js.map +1 -0
- package/lib/types/intent/tools.d.ts +24 -20
- package/lib/types/intent/tools.d.ts.map +1 -1
- package/lib/types/intent/tools.js +65 -23
- package/lib/types/intent/tools.js.map +1 -1
- package/lib/types/intent/types.d.ts +11 -4
- package/lib/types/intent/types.d.ts.map +1 -1
- package/lib/types/knowledge-bases.d.ts +11 -5
- package/lib/types/knowledge-bases.d.ts.map +1 -1
- package/lib/types/knowledge-bases.js +52 -20
- package/lib/types/knowledge-bases.js.map +1 -1
- package/lib/types/knowledge-contract.d.ts +32 -0
- package/lib/types/knowledge-contract.d.ts.map +1 -0
- package/lib/types/knowledge-contract.js +116 -0
- package/lib/types/knowledge-contract.js.map +1 -0
- package/lib/types/knowledge.d.ts +31 -9
- package/lib/types/knowledge.d.ts.map +1 -1
- package/lib/types/knowledge.js +137 -60
- package/lib/types/knowledge.js.map +1 -1
- package/lib/types/layout.d.ts +10 -29
- package/lib/types/layout.d.ts.map +1 -1
- package/lib/types/layout.js +17 -36
- package/lib/types/layout.js.map +1 -1
- package/lib/types/materialize-snapshot.d.ts +49 -0
- package/lib/types/materialize-snapshot.d.ts.map +1 -0
- package/lib/types/materialize-snapshot.js +2 -0
- package/lib/types/materialize-snapshot.js.map +1 -0
- package/lib/types/migrate.d.ts +11 -0
- package/lib/types/migrate.d.ts.map +1 -1
- package/lib/types/migrate.js +83 -2
- package/lib/types/migrate.js.map +1 -1
- package/lib/types/model-text.d.ts +58 -1
- package/lib/types/model-text.d.ts.map +1 -1
- package/lib/types/model-text.js +85 -30
- package/lib/types/model-text.js.map +1 -1
- package/lib/types/oplog.d.ts.map +1 -1
- package/lib/types/oplog.js +7 -0
- package/lib/types/oplog.js.map +1 -1
- package/lib/types/organize-contract.d.ts +18 -0
- package/lib/types/organize-contract.d.ts.map +1 -0
- package/lib/types/organize-contract.js +82 -0
- package/lib/types/organize-contract.js.map +1 -0
- package/lib/types/pipeline/engine.d.ts +66 -0
- package/lib/types/pipeline/engine.d.ts.map +1 -0
- package/lib/types/pipeline/engine.js +352 -0
- package/lib/types/pipeline/engine.js.map +1 -0
- package/lib/types/pipeline/store.d.ts +73 -0
- package/lib/types/pipeline/store.d.ts.map +1 -0
- package/lib/types/pipeline/store.js +143 -0
- package/lib/types/pipeline/store.js.map +1 -0
- package/lib/types/pipeline/types.d.ts +102 -0
- package/lib/types/pipeline/types.d.ts.map +1 -0
- package/lib/types/pipeline/types.js +5 -0
- package/lib/types/pipeline/types.js.map +1 -0
- package/lib/types/present.d.ts +2 -0
- package/lib/types/present.d.ts.map +1 -1
- package/lib/types/present.js +9 -4
- package/lib/types/present.js.map +1 -1
- package/lib/types/preset-ids.d.ts +4 -0
- package/lib/types/preset-ids.d.ts.map +1 -0
- package/lib/types/preset-ids.js +6 -0
- package/lib/types/preset-ids.js.map +1 -0
- package/lib/types/query-analysis.d.ts +13 -1
- package/lib/types/query-analysis.d.ts.map +1 -1
- package/lib/types/query-analysis.js +62 -6
- package/lib/types/query-analysis.js.map +1 -1
- package/lib/types/recall-rank.d.ts +3 -3
- package/lib/types/recall-rank.d.ts.map +1 -1
- package/lib/types/recall-rank.js +4 -4
- package/lib/types/recall-rank.js.map +1 -1
- package/lib/types/retention.d.ts +39 -0
- package/lib/types/retention.d.ts.map +1 -0
- package/lib/types/retention.js +42 -0
- package/lib/types/retention.js.map +1 -0
- package/lib/types/retrieval/vector-index.d.ts +32 -0
- package/lib/types/retrieval/vector-index.d.ts.map +1 -0
- package/lib/types/retrieval/vector-index.js +15 -0
- package/lib/types/retrieval/vector-index.js.map +1 -0
- package/lib/types/retrieval/visibility.d.ts +6 -0
- package/lib/types/retrieval/visibility.d.ts.map +1 -0
- package/lib/types/retrieval/visibility.js +11 -0
- package/lib/types/retrieval/visibility.js.map +1 -0
- package/lib/types/runtime.d.ts +272 -27
- package/lib/types/runtime.d.ts.map +1 -1
- package/lib/types/runtime.js +2751 -537
- package/lib/types/runtime.js.map +1 -1
- package/lib/types/settings-schema.d.ts +17 -15
- package/lib/types/settings-schema.d.ts.map +1 -1
- package/lib/types/settings-schema.js +50 -47
- package/lib/types/settings-schema.js.map +1 -1
- package/lib/types/settings-volatile.d.ts +4 -4
- package/lib/types/settings-volatile.js +4 -4
- package/lib/types/source-evidence.d.ts +14 -0
- package/lib/types/source-evidence.d.ts.map +1 -0
- package/lib/types/source-evidence.js +36 -0
- package/lib/types/source-evidence.js.map +1 -0
- package/lib/types/store/axis-references.d.ts +5 -0
- package/lib/types/store/axis-references.d.ts.map +1 -0
- package/lib/types/store/axis-references.js +106 -0
- package/lib/types/store/axis-references.js.map +1 -0
- package/lib/types/store/derived.d.ts +12 -1
- package/lib/types/store/derived.d.ts.map +1 -1
- package/lib/types/store/derived.js +71 -12
- package/lib/types/store/derived.js.map +1 -1
- package/lib/types/store/knowledge-db.d.ts +31 -1
- package/lib/types/store/knowledge-db.d.ts.map +1 -1
- package/lib/types/store/knowledge-db.js +252 -18
- package/lib/types/store/knowledge-db.js.map +1 -1
- package/lib/types/store/migrate.d.ts.map +1 -1
- package/lib/types/store/migrate.js +17 -6
- package/lib/types/store/migrate.js.map +1 -1
- package/lib/types/trajectory-types.d.ts +172 -0
- package/lib/types/trajectory-types.d.ts.map +1 -0
- package/lib/types/trajectory-types.js +36 -0
- package/lib/types/trajectory-types.js.map +1 -0
- package/lib/types/types.d.ts +59 -27
- package/lib/types/types.d.ts.map +1 -1
- package/lib/types/types.js +6 -15
- package/lib/types/types.js.map +1 -1
- package/lib/types/wiki-finalize.d.ts +16 -0
- package/lib/types/wiki-finalize.d.ts.map +1 -1
- package/lib/types/wiki-finalize.js +26 -0
- package/lib/types/wiki-finalize.js.map +1 -1
- package/lib/types/wiki-materialize.d.ts +4 -0
- package/lib/types/wiki-materialize.d.ts.map +1 -1
- package/lib/types/wiki-materialize.js +21 -7
- package/lib/types/wiki-materialize.js.map +1 -1
- package/lib/types/wiki-trial-types.d.ts +87 -0
- package/lib/types/wiki-trial-types.d.ts.map +1 -1
- package/lib/types/wiki-trial-types.js +0 -16
- package/lib/types/wiki-trial-types.js.map +1 -1
- package/lib/types/wiki-trial.d.ts +40 -16
- package/lib/types/wiki-trial.d.ts.map +1 -1
- package/lib/types/wiki-trial.js +337 -224
- package/lib/types/wiki-trial.js.map +1 -1
- package/package.json +29 -20
- package/python/prepare-models.py +19 -0
- package/python/requirements.txt +8 -6
- package/scripts/doctor.mjs +13 -19
- package/scripts/environment.mjs +29 -0
- package/scripts/setup-embedding.sh +15 -5
- package/src/agent-behavior-rules.ts +37 -0
- package/src/axis-registry.ts +234 -27
- package/src/card-organize.ts +69 -75
- package/src/client/AgentBehaviorRulesCard.tsx +65 -0
- package/src/client/AttributionEventGuide.tsx +41 -39
- package/src/client/AxisRegistrySection.tsx +204 -164
- package/src/client/CompileDialogs.tsx +44 -29
- package/src/client/DeleteDocumentDialog.tsx +36 -5
- package/src/client/DirectoryPicker.tsx +0 -10
- package/src/client/EnvironmentSetup.tsx +243 -0
- package/src/client/ExpansionGraph.tsx +13 -7
- package/src/client/ExtractionTasksPage.tsx +578 -0
- package/src/client/GuideArchitectureCanvas.tsx +470 -0
- package/src/client/ImportFilesDialog.tsx +2 -13
- package/src/client/IntentLogic.tsx +2 -2
- package/src/client/IntentTab.tsx +118 -47
- package/src/client/KnowledgeBaseTab.tsx +277 -197
- package/src/client/KnowledgeLayerSection.tsx +24 -6
- package/src/client/KnowledgePanel.tsx +58 -93
- package/src/client/KnowledgeSettingsDrawer.tsx +90 -0
- package/src/client/ListPager.tsx +15 -5
- package/src/client/MaterializeTrajectoryView.tsx +124 -0
- package/src/client/NodeSettings.tsx +210 -89
- package/src/client/NormalizeTrajectoryView.tsx +136 -0
- package/src/client/PipelineNotice.tsx +26 -0
- package/src/client/PreviewSections.tsx +118 -51
- package/src/client/RecallPanel.tsx +89 -85
- package/src/client/TabGuide.tsx +159 -184
- package/src/client/TrialReportView.tsx +391 -214
- package/src/client/TypeDefinitionDrawer.tsx +150 -23
- package/src/client/WikiCardPreview.tsx +62 -16
- package/src/client/WikiFlowPanel.tsx +4 -4
- package/src/client/arch/NodeLogicPanel.tsx +3 -4
- package/src/client/arch/model.ts +6 -9
- package/src/client/architecture.tsx +23 -33
- package/src/client/attribution/AttributionGraph.tsx +10 -6
- package/src/client/attribution/AttributionTab.tsx +136 -84
- package/src/client/attribution/CaseView.tsx +3 -1
- package/src/client/attribution/EventView.tsx +108 -0
- package/src/client/attribution/RunView.tsx +2 -2
- package/src/client/attribution/StageChrome.tsx +34 -3
- package/src/client/attribution/ViewSwitch.tsx +20 -5
- package/src/client/attribution/graph-options.ts +47 -39
- package/src/client/attribution/model.ts +17 -10
- package/src/client/config-scope.ts +3 -3
- package/src/client/graph/palette.ts +165 -0
- package/src/client/index.ts +49 -42
- package/src/client/pages.css +459 -135
- package/src/client/pages.tsx +37 -9
- package/src/client/problem-domains.ts +1 -1
- package/src/client/session-remote.ts +9 -0
- package/src/client/styles.css +205 -62
- package/src/client/wiki-trial.ts +44 -3
- package/src/compiler/embedding-identity.ts +21 -0
- package/src/compiler/snapshot.ts +17 -0
- package/src/config-schema.ts +8 -3
- package/src/convert/host.ts +56 -21
- package/src/convert/ingest.ts +74 -10
- package/src/derive-contract.ts +14 -0
- package/src/diagnosis/cards.ts +13 -8
- package/src/diagnosis/run.ts +27 -17
- package/src/diagnosis/schema.ts +2 -2
- package/src/diagnosis/seed-source.ts +5 -4
- package/src/diagnosis/seed.ts +6 -8
- package/src/diagnosis/store.ts +138 -69
- package/src/diagnosis/types.ts +34 -15
- package/src/environment/dsh-python.ts +156 -0
- package/src/environment/install.ts +244 -0
- package/src/environment/manifest.ts +28 -0
- package/src/environment/model-catalog.ts +147 -0
- package/src/environment/process.ts +54 -0
- package/src/environment/selection.ts +29 -0
- package/src/environment/service.ts +348 -0
- package/src/environment/types.ts +45 -0
- package/src/events.ts +108 -0
- package/src/extract-contract.ts +42 -0
- package/src/extract-model.ts +10 -1
- package/src/extract-table-contract.ts +26 -0
- package/src/extract-table.ts +132 -0
- package/src/extraction-runs.ts +70 -11
- package/src/fs-atomic.ts +19 -2
- package/src/images.ts +203 -0
- package/src/index.ts +553 -205
- package/src/intent/README.md +8 -6
- package/src/intent/engine.ts +44 -6
- package/src/intent/host.ts +59 -18
- package/src/intent/scope.ts +125 -0
- package/src/intent/tools.ts +70 -28
- package/src/intent/types.ts +11 -4
- package/src/knowledge-bases.ts +56 -20
- package/src/knowledge-contract.ts +114 -0
- package/src/knowledge.ts +138 -69
- package/src/layout.ts +17 -37
- package/src/materialize-snapshot.ts +46 -0
- package/src/migrate.ts +75 -2
- package/src/model-text.ts +109 -4
- package/src/oplog.ts +7 -0
- package/src/organize-contract.ts +83 -0
- package/src/pipeline/engine.ts +323 -0
- package/src/pipeline/store.ts +147 -0
- package/src/pipeline/types.ts +93 -0
- package/src/present.ts +10 -4
- package/src/preset-ids.ts +6 -0
- package/src/python/embedding_worker.py +66 -2
- package/src/query-analysis.ts +68 -8
- package/src/recall-rank.ts +5 -5
- package/src/retention.ts +76 -0
- package/src/retrieval/vector-index.ts +45 -0
- package/src/retrieval/visibility.ts +14 -0
- package/src/runtime.ts +2708 -567
- package/src/settings-schema.ts +11 -8
- package/src/settings-volatile.ts +4 -4
- package/src/source-evidence.ts +37 -0
- package/src/store/axis-references.ts +96 -0
- package/src/store/derived.ts +70 -12
- package/src/store/knowledge-db.ts +248 -17
- package/src/store/migrate.ts +16 -6
- package/src/trajectory-types.ts +142 -0
- package/src/types.ts +61 -35
- package/src/wiki-finalize.ts +28 -0
- package/src/wiki-materialize.ts +25 -6
- package/src/wiki-trial-types.ts +83 -1
- package/src/wiki-trial.ts +357 -185
- package/lib/types/intent/preset-tools.d.ts +0 -37
- package/lib/types/intent/preset-tools.d.ts.map +0 -1
- package/lib/types/intent/preset-tools.js +0 -45
- package/lib/types/intent/preset-tools.js.map +0 -1
- package/preset/tita-data-agent/agent.cordis.yml +0 -394
- package/preset/tita-data-agent/preset.yml +0 -3
- package/scripts/install-agent-preset.mjs +0 -92
- package/scripts/sync-agent-preset.mjs +0 -188
- package/src/client/AgentPresetCard.tsx +0 -247
- package/src/client/agent-preset.ts +0 -121
- package/src/client/convert/ConvertPanel.tsx +0 -583
- package/src/client/convert/styles.css +0 -138
- package/src/client/convert/styles.ts +0 -49
- package/src/intent/preset-tools.ts +0 -48
|
@@ -1,33 +1,139 @@
|
|
|
1
|
-
|
|
2
|
-
* 知识库定义抽屉。
|
|
3
|
-
*
|
|
4
|
-
* 这里不再保留不参与运行时行为的来源标签入口,只保留真正参与坐标抽取的库级定义。
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { useEffect, useState, type ChangeEvent, type ReactNode } from 'react'
|
|
1
|
+
import { useEffect, useMemo, useRef, useState, type ChangeEvent, type ReactNode } from 'react'
|
|
8
2
|
import { Check } from '@tita-agent/ui/icons'
|
|
9
|
-
import { Button, Field, Textarea } from '@tita-agent/ui/components'
|
|
3
|
+
import { Button, Field, SelectMenu, Textarea, type SelectMenuOption } from '@tita-agent/ui/components'
|
|
10
4
|
import {
|
|
11
5
|
Drawer, DrawerBody, DrawerContent, DrawerHeader, DrawerTitle,
|
|
12
6
|
} from '@tita-agent/ui/overlays'
|
|
13
7
|
import { styles } from './styles.ts'
|
|
14
8
|
import { AxisRegistrySection } from './AxisRegistrySection.tsx'
|
|
9
|
+
import { requestJson } from './request.ts'
|
|
10
|
+
|
|
11
|
+
export interface CompileModelSelectionView {
|
|
12
|
+
mode: 'default' | 'fixed'
|
|
13
|
+
provider?: string
|
|
14
|
+
model?: string
|
|
15
|
+
reasoningEffort?: string
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
interface CompileModelCatalogItem {
|
|
19
|
+
provider: string
|
|
20
|
+
id: string
|
|
21
|
+
name: string
|
|
22
|
+
description?: string
|
|
23
|
+
available: boolean
|
|
24
|
+
current?: boolean
|
|
25
|
+
reasoning?: { efforts: Array<{ id: string; name: string; description?: string }>; defaultEffort?: string }
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
interface CompileModelCatalog {
|
|
29
|
+
selection: CompileModelSelectionView
|
|
30
|
+
default: { provider?: string; model?: string; reasoningEffort?: string; available: boolean }
|
|
31
|
+
models: CompileModelCatalogItem[]
|
|
32
|
+
why?: string
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const DEFAULT_MODEL_VALUE = '__dsh_default__'
|
|
36
|
+
const fixedModelValue = (provider: string, model: string): string => `fixed:${encodeURIComponent(provider)}:${encodeURIComponent(model)}`
|
|
15
37
|
|
|
16
38
|
export interface TypeDefinitionDrawerProps {
|
|
17
39
|
open: boolean
|
|
18
40
|
onOpenChange: (open: boolean) => void
|
|
19
41
|
kbId: string
|
|
20
42
|
busy: string | null
|
|
21
|
-
/** 坐标提取备注:逐字进入抽取提示词。 */
|
|
22
43
|
extractionNote?: string
|
|
23
44
|
onSaveExtractionNote?: (note: string) => Promise<void>
|
|
45
|
+
compileModel?: CompileModelSelectionView
|
|
46
|
+
onSaveCompileModel?: (selection: CompileModelSelectionView) => Promise<void>
|
|
24
47
|
}
|
|
25
48
|
|
|
26
49
|
export function TypeDefinitionDrawer({
|
|
27
50
|
open, onOpenChange, kbId, busy, extractionNote = '', onSaveExtractionNote,
|
|
51
|
+
compileModel = { mode: 'default' }, onSaveCompileModel,
|
|
28
52
|
}: TypeDefinitionDrawerProps): ReactNode {
|
|
29
53
|
const [noteDraft, setNoteDraft] = useState(extractionNote)
|
|
54
|
+
const [modelDraft, setModelDraft] = useState(DEFAULT_MODEL_VALUE)
|
|
55
|
+
const [effortDraft, setEffortDraft] = useState(compileModel.reasoningEffort ?? '__default__')
|
|
56
|
+
useEffect(() => { setEffortDraft(compileModel.reasoningEffort ?? '__default__') }, [compileModel.reasoningEffort])
|
|
57
|
+
const [catalog, setCatalog] = useState<CompileModelCatalog | null>(null)
|
|
58
|
+
const [catalogError, setCatalogError] = useState('')
|
|
59
|
+
/**
|
|
60
|
+
* 上一次读回来的默认模型。
|
|
61
|
+
*
|
|
62
|
+
* 放进 ref 而不是当成 effect 的依赖:这份 effect **自己会写 `catalog`**,把
|
|
63
|
+
* `catalog?.default.provider` 列进依赖就是让输出当输入 —— 每读一次目录都会再触发
|
|
64
|
+
* 一次自己,打开抽屉要打两三次 `/knowledge/models`。ref 让它读到最新值,但不触发。
|
|
65
|
+
*/
|
|
66
|
+
const catalogRef = useRef<CompileModelCatalog | null>(null)
|
|
67
|
+
catalogRef.current = catalog
|
|
30
68
|
useEffect(() => { setNoteDraft(extractionNote) }, [extractionNote])
|
|
69
|
+
useEffect(() => {
|
|
70
|
+
if (compileModel.mode === 'fixed' && compileModel.provider && compileModel.model) {
|
|
71
|
+
setModelDraft(fixedModelValue(compileModel.provider, compileModel.model))
|
|
72
|
+
} else {
|
|
73
|
+
setModelDraft(DEFAULT_MODEL_VALUE)
|
|
74
|
+
}
|
|
75
|
+
}, [compileModel.mode, compileModel.provider, compileModel.model])
|
|
76
|
+
useEffect(() => {
|
|
77
|
+
if (!open || onSaveCompileModel === undefined) return undefined
|
|
78
|
+
let cancelled = false
|
|
79
|
+
setCatalogError('')
|
|
80
|
+
const route = modelDraft.startsWith('fixed:') ? modelDraft.split(':').slice(1).map(decodeURIComponent) : [catalogRef.current?.default.provider, catalogRef.current?.default.model]
|
|
81
|
+
const params = new URLSearchParams({ kb: kbId })
|
|
82
|
+
if (route[0] && route[1]) { params.set('provider', route[0]); params.set('model', route[1]) }
|
|
83
|
+
void requestJson<CompileModelCatalog>(`/knowledge/models?${params}`).then(result => {
|
|
84
|
+
if (!cancelled) setCatalog(result.data ?? null)
|
|
85
|
+
}).catch(error => {
|
|
86
|
+
if (!cancelled) setCatalogError(error instanceof Error ? error.message : String(error))
|
|
87
|
+
})
|
|
88
|
+
return () => { cancelled = true }
|
|
89
|
+
}, [kbId, onSaveCompileModel, open, modelDraft])
|
|
90
|
+
|
|
91
|
+
const modelOptions = useMemo(() => {
|
|
92
|
+
const options: SelectMenuOption[] = [{
|
|
93
|
+
value: DEFAULT_MODEL_VALUE,
|
|
94
|
+
label: catalog?.default?.provider && catalog.default.model
|
|
95
|
+
? `跟随 DSH 默认模型(${catalog.default.provider} / ${catalog.default.model})`
|
|
96
|
+
: '跟随 DSH 默认模型',
|
|
97
|
+
}]
|
|
98
|
+
for (const item of catalog?.models ?? []) {
|
|
99
|
+
options.push({
|
|
100
|
+
value: fixedModelValue(item.provider, item.id),
|
|
101
|
+
label: item.available
|
|
102
|
+
? `${item.name}(${item.provider} / ${item.id})`
|
|
103
|
+
: `当前已失效:${item.provider} / ${item.id}`,
|
|
104
|
+
...(item.available ? {} : { disabled: true }),
|
|
105
|
+
})
|
|
106
|
+
}
|
|
107
|
+
if (compileModel.mode === 'fixed' && compileModel.provider && compileModel.model
|
|
108
|
+
&& !options.some(option => option.value === fixedModelValue(compileModel.provider!, compileModel.model!))) {
|
|
109
|
+
options.push({
|
|
110
|
+
value: fixedModelValue(compileModel.provider, compileModel.model),
|
|
111
|
+
label: `当前已失效:${compileModel.provider} / ${compileModel.model}`,
|
|
112
|
+
disabled: true,
|
|
113
|
+
})
|
|
114
|
+
}
|
|
115
|
+
return options
|
|
116
|
+
}, [catalog, compileModel.mode, compileModel.model, compileModel.provider])
|
|
117
|
+
|
|
118
|
+
const modelChanged = effortDraft !== (compileModel.reasoningEffort ?? '__default__') || modelDraft !== (compileModel.mode === 'fixed' && compileModel.provider && compileModel.model
|
|
119
|
+
? fixedModelValue(compileModel.provider, compileModel.model)
|
|
120
|
+
: DEFAULT_MODEL_VALUE)
|
|
121
|
+
const saveCompileModel = async (): Promise<void> => {
|
|
122
|
+
if (onSaveCompileModel === undefined) return
|
|
123
|
+
if (modelDraft === DEFAULT_MODEL_VALUE) {
|
|
124
|
+
await onSaveCompileModel({ mode: 'default', ...(effortDraft === '__default__' ? {} : { reasoningEffort: effortDraft }) })
|
|
125
|
+
return
|
|
126
|
+
}
|
|
127
|
+
const selected = catalog?.models.find(item => fixedModelValue(item.provider, item.id) === modelDraft && item.available)
|
|
128
|
+
if (!selected) return
|
|
129
|
+
await onSaveCompileModel({ mode: 'fixed', provider: selected.provider, model: selected.id, ...(effortDraft === '__default__' ? {} : { reasoningEffort: effortDraft }) })
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const selectedModel = catalog?.models.find(item => modelDraft === DEFAULT_MODEL_VALUE
|
|
133
|
+
? item.provider === catalog.default.provider && item.id === catalog.default.model
|
|
134
|
+
: fixedModelValue(item.provider, item.id) === modelDraft)
|
|
135
|
+
const effortOptions: SelectMenuOption[] = [{ value: '__default__', label: '跟随模型默认强度' }, ...(selectedModel?.reasoning?.efforts ?? []).map(item => ({ value: item.id, label: item.name }))]
|
|
136
|
+
if (effortDraft !== '__default__' && !effortOptions.some(option => option.value === effortDraft)) effortOptions.push({ value: effortDraft, label: `当前不可用:${effortDraft}`, disabled: true })
|
|
31
137
|
|
|
32
138
|
return <Drawer open={open} onOpenChange={onOpenChange}>
|
|
33
139
|
{open && <DrawerContent
|
|
@@ -36,28 +142,49 @@ export function TypeDefinitionDrawer({
|
|
|
36
142
|
resizeKey="tita-typedef-drawer"
|
|
37
143
|
>
|
|
38
144
|
<DrawerHeader>
|
|
39
|
-
<DrawerTitle
|
|
145
|
+
<DrawerTitle>编译设置</DrawerTitle>
|
|
40
146
|
</DrawerHeader>
|
|
41
147
|
<DrawerBody>
|
|
42
148
|
<div className={styles.settingsStack}>
|
|
149
|
+
{onSaveCompileModel !== undefined && <section className={styles.settingsSection}>
|
|
150
|
+
<div className={styles.settingsSectionHeader}>
|
|
151
|
+
<div><h3>编译模型</h3></div>
|
|
152
|
+
</div>
|
|
153
|
+
<Field as="div" label="模型" hint="用于抽取、归一补判与卡片组织;任务启动时保存实际选择。">
|
|
154
|
+
<SelectMenu value={modelDraft} disabled={busy !== null || (catalog === null && catalogError === '')} onValueChange={value => { setModelDraft(value); setEffortDraft('__default__') }}
|
|
155
|
+
options={modelOptions} placeholder="加载 DSH 模型目录…" aria-label="编译模型" />
|
|
156
|
+
</Field>
|
|
157
|
+
<Field as="div" label="思考强度" hint={selectedModel?.reasoning?.efforts.length ? '档位来自当前模型的 DSH 目录。' : '当前模型未提供可选档位,使用模型默认值。'}>
|
|
158
|
+
<SelectMenu value={effortDraft} options={effortOptions} onValueChange={setEffortDraft} disabled={busy !== null || !selectedModel?.reasoning?.efforts.length} aria-label="编译模型思考强度" />
|
|
159
|
+
</Field>
|
|
160
|
+
{catalog?.default && !catalog.default.available && <p className={styles.kbHint} role="status">
|
|
161
|
+
DSH 默认模型不可用;可在 DSH 设置中修复,或选择固定模型。
|
|
162
|
+
</p>}
|
|
163
|
+
{catalogError !== '' && <p className={styles.kbHint} role="alert">模型目录读取失败:{catalogError}</p>}
|
|
164
|
+
{catalog?.why && <p className={styles.kbHint} role="status">模型目录提示:{catalog.why}</p>}
|
|
165
|
+
{modelChanged && <div className={styles.settingsSectionActions}>
|
|
166
|
+
<Button variant="outline" size="sm" disabled={busy !== null || (catalog === null && modelDraft !== DEFAULT_MODEL_VALUE)}
|
|
167
|
+
onClick={() => void saveCompileModel()}>
|
|
168
|
+
<Check size={12} />保存
|
|
169
|
+
</Button>
|
|
170
|
+
</div>}
|
|
171
|
+
</section>}
|
|
172
|
+
|
|
43
173
|
{onSaveExtractionNote !== undefined && <section className={styles.settingsSection}>
|
|
44
174
|
<div className={styles.settingsSectionHeader}>
|
|
45
|
-
<div><h3
|
|
46
|
-
<span className={styles.kbCount}>{extractionNote.trim() === '' ? '没有备注' : `${extractionNote.length} 字`}</span>
|
|
175
|
+
<div><h3>提取备注</h3></div>
|
|
47
176
|
</div>
|
|
48
|
-
<
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
</p>
|
|
52
|
-
<Field label="备注">
|
|
53
|
-
<Textarea value={noteDraft} spellCheck={false} disabled={busy !== null}
|
|
54
|
-
placeholder={'本库约定:spm 的 a / b / c / d 是四个独立对象,别并成一个。\n「楼层」在不同页面分期下是不同对象,认的时候看作用域。'}
|
|
177
|
+
<Field label="坐标约定" hint="逐字加入每次抽取提示词。">
|
|
178
|
+
<Textarea value={noteDraft} rows={3} spellCheck={false} disabled={busy !== null}
|
|
179
|
+
aria-label="坐标提取备注" placeholder="填写本库特有的坐标约定。"
|
|
55
180
|
onChange={(event: ChangeEvent<HTMLTextAreaElement>) => setNoteDraft(event.target.value)} />
|
|
56
181
|
</Field>
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
182
|
+
{noteDraft !== extractionNote && <div className={styles.settingsSectionActions}>
|
|
183
|
+
<Button variant="outline" size="sm" disabled={busy !== null}
|
|
184
|
+
onClick={() => void onSaveExtractionNote(noteDraft)}>
|
|
185
|
+
<Check size={12} />保存
|
|
186
|
+
</Button>
|
|
187
|
+
</div>}
|
|
61
188
|
</section>}
|
|
62
189
|
|
|
63
190
|
<AxisRegistrySection kbId={kbId} canEdit={busy === null} />
|
|
@@ -20,8 +20,9 @@
|
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
22
|
import { useEffect, useMemo, useState, type ReactNode } from 'react'
|
|
23
|
-
import { AlertCircle, Check, RefreshCw } from '@tita-agent/ui/icons'
|
|
24
|
-
import { Button, cn } from '@tita-agent/ui/components'
|
|
23
|
+
import { AlertCircle, Check, CircleDot, GitCompare, RefreshCw } from '@tita-agent/ui/icons'
|
|
24
|
+
import { Badge, Button, cn } from '@tita-agent/ui/components'
|
|
25
|
+
import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '@tita-agent/ui/overlays'
|
|
25
26
|
import type { AssetRef } from './asset-images.ts'
|
|
26
27
|
import type { VersionManagerEntry } from '@tita-agent/ui/versions'
|
|
27
28
|
import { PreviewContent, PreviewMeta, PreviewRelated, PreviewVersions, VersionContentDiff, splitSections, type KnowledgeLine, type VersionContentDiffData } from './PreviewSections.tsx'
|
|
@@ -33,13 +34,10 @@ import { STATUS_VIEW } from './WikiCardRow.tsx'
|
|
|
33
34
|
import { styles } from './styles.ts'
|
|
34
35
|
import { formatDateTime } from './format.ts'
|
|
35
36
|
import type { CardRelatedView, KnowledgeCardView, WikiCardVersionView } from './KnowledgeBaseTab.tsx'
|
|
37
|
+
import type { AttributionEvent } from './attribution/model.ts'
|
|
36
38
|
|
|
37
|
-
/**
|
|
38
|
-
|
|
39
|
-
* 客户端不能 import 服务端模块(那边拉 node: 内置),所以这里重列一次,并由一条测试
|
|
40
|
-
* 钉住两边相等(同 `SOURCE_FORMAT_LABEL` 那类「契约重列」的处置)。
|
|
41
|
-
*/
|
|
42
|
-
const RELATED_SECTION = ['相关']
|
|
39
|
+
/** 正文里的生成式导航小节名;它们由结构化引用展示,不重复留在正文。 */
|
|
40
|
+
const RELATED_SECTION = ['相关', '关联 Event', '关联 Events', '关联事件']
|
|
43
41
|
|
|
44
42
|
/** 一张卡片的完整预览数据(正文 + 版本 + 图片 + 相关 + 坐标名字)。 */
|
|
45
43
|
export interface CardPreviewDetail {
|
|
@@ -81,15 +79,17 @@ export interface WikiCardPreviewProps {
|
|
|
81
79
|
kbId: string
|
|
82
80
|
detail: CardPreviewDetail
|
|
83
81
|
versionEntries: VersionManagerEntry[]
|
|
84
|
-
/** 当前版本的 id
|
|
82
|
+
/** 当前版本的 id:用于在只读时间线上标记当前版本。 */
|
|
85
83
|
currentVersionId?: string
|
|
86
84
|
loading: boolean
|
|
87
85
|
/** 卡片状态被 review / 备注改过之后,让宿主重新读这张卡片与列表。 */
|
|
88
86
|
onChanged: () => void | Promise<void>
|
|
89
|
-
onRestore: (entry: VersionManagerEntry) => void
|
|
90
87
|
onCompare?: (entry: VersionManagerEntry) => void
|
|
91
88
|
versionDiff?: { data?: VersionContentDiffData; loading: boolean; error?: string }
|
|
92
89
|
onOpenRelated: (link: { entityType: string; entityId: string; title: string }) => void
|
|
90
|
+
/** 打开 Event 栏并定位到这张卡片引用的事件。 */
|
|
91
|
+
onOpenEvent: (eventId: string) => void
|
|
92
|
+
events?: AttributionEvent[]
|
|
93
93
|
/**
|
|
94
94
|
* SourceRaw 的 docId → 文档标题。
|
|
95
95
|
*
|
|
@@ -113,16 +113,36 @@ function sourceRefsText(refs: string[], titles?: Map<string, string>): string {
|
|
|
113
113
|
|
|
114
114
|
export function WikiCardPreview({
|
|
115
115
|
kbId, detail, versionEntries, currentVersionId, loading,
|
|
116
|
-
onChanged,
|
|
116
|
+
onChanged, onOpenRelated, onOpenEvent, events = [], sourceTitles,
|
|
117
117
|
onCompare, versionDiff = { loading: false },
|
|
118
118
|
}: WikiCardPreviewProps): ReactNode {
|
|
119
119
|
const [recompiling, setRecompiling] = useState(false)
|
|
120
120
|
const [recompileNotice, setRecompileNotice] = useState<{ tone: 'success' | 'error'; text: string } | null>(null)
|
|
121
|
+
const [compareOpen, setCompareOpen] = useState(false)
|
|
121
122
|
const status = STATUS_VIEW[detail.card.status]?.label ?? detail.card.status
|
|
122
123
|
const refs = sourceRefsText(detail.card.sourceRefs, sourceTitles)
|
|
123
124
|
const knowledge = useCardKnowledge(kbId, detail.card.entityId, sourceTitles)
|
|
125
|
+
const relatedEvents = useMemo(() => {
|
|
126
|
+
const raw = detail.card.metadata?.event_refs
|
|
127
|
+
let ids: string[] = []
|
|
128
|
+
if (Array.isArray(raw)) ids = raw.filter((item): item is string => typeof item === 'string')
|
|
129
|
+
else if (typeof raw === 'string') {
|
|
130
|
+
try {
|
|
131
|
+
const parsed: unknown = JSON.parse(raw)
|
|
132
|
+
if (Array.isArray(parsed)) ids = parsed.filter((item): item is string => typeof item === 'string')
|
|
133
|
+
} catch { /* 无效派生引用不显示 */ }
|
|
134
|
+
}
|
|
135
|
+
const byId = new Map(events.map(event => [event.id, event]))
|
|
136
|
+
return [...new Set(ids)].map(id => byId.get(id) ?? { id }).map(event => ({
|
|
137
|
+
id: event.id,
|
|
138
|
+
title: 'title' in event ? event.title : event.id,
|
|
139
|
+
summary: 'summary' in event ? event.summary : '',
|
|
140
|
+
occurredAt: 'occurredAt' in event ? event.occurredAt : undefined,
|
|
141
|
+
}))
|
|
142
|
+
}, [detail.card.metadata, events])
|
|
143
|
+
useEffect(() => { setCompareOpen(false) }, [detail.card.entityId])
|
|
124
144
|
/**
|
|
125
|
-
*
|
|
145
|
+
* 移除旧版本正文里的生成式导航区块,再显示结构化卡片与 Event 引用。
|
|
126
146
|
*
|
|
127
147
|
* 投影顺序固定为:物化正文 → 去掉旧导航区 → 补引用清单。
|
|
128
148
|
*/
|
|
@@ -204,6 +224,21 @@ export function WikiCardPreview({
|
|
|
204
224
|
{recompiling ? '编译中…' : '按坐标重新编译'}</Button>}
|
|
205
225
|
/>
|
|
206
226
|
|
|
227
|
+
{relatedEvents.length > 0 && <section className="flex min-w-0 flex-col gap-1.5" aria-label="关联 Event">
|
|
228
|
+
<h3 className="m-0 flex items-center gap-1.5 text-[11px] font-semibold text-tita-ink">
|
|
229
|
+
<CircleDot size={12} aria-hidden="true" />关联 Event <Badge tone="neutral">{relatedEvents.length}</Badge>
|
|
230
|
+
</h3>
|
|
231
|
+
<ul className="m-0 grid list-none gap-1 p-0">
|
|
232
|
+
{relatedEvents.map(event => <li key={event.id} className="min-w-0 rounded-md border border-tita-line px-2 py-1.5">
|
|
233
|
+
<Button variant="ghost" size="sm" className="h-auto max-w-full justify-start px-0 py-0 text-left text-[10.5px]" onClick={() => onOpenEvent(event.id)}>
|
|
234
|
+
<span className="min-w-0 truncate">{event.title}</span>
|
|
235
|
+
{event.occurredAt && <span className="shrink-0 text-[9px] text-tita-ink-faint">· {event.occurredAt}</span>}
|
|
236
|
+
</Button>
|
|
237
|
+
{event.summary && <p className="m-0 mt-0.5 line-clamp-2 text-[10px] leading-relaxed text-tita-ink-muted">{event.summary}</p>}
|
|
238
|
+
</li>)}
|
|
239
|
+
</ul>
|
|
240
|
+
</section>}
|
|
241
|
+
|
|
207
242
|
{recompileNotice && <div className={cn(styles.cardRecompileNotice, recompileNotice.tone === 'error' ? styles.cardRecompileNoticeError : styles.cardRecompileNoticeSuccess)} role="status">
|
|
208
243
|
{recompileNotice.tone === 'error' ? <AlertCircle size={12} aria-hidden="true" /> : <Check size={12} aria-hidden="true" />}
|
|
209
244
|
<span>{recompileNotice.text}</span>
|
|
@@ -230,13 +265,24 @@ export function WikiCardPreview({
|
|
|
230
265
|
/>
|
|
231
266
|
|
|
232
267
|
<PreviewVersions
|
|
233
|
-
hint="
|
|
268
|
+
hint="卡片正文变化前会保存快照,可查看历史版本并比较正文差异。"
|
|
234
269
|
entries={versionEntries}
|
|
235
270
|
loading={loading}
|
|
236
271
|
emptyLabel="这张卡片还没有历史版本(正文变化时才会生成快照;只改状态不会造版本)。"
|
|
237
|
-
actions={{
|
|
238
|
-
|
|
239
|
-
|
|
272
|
+
actions={{
|
|
273
|
+
restorableId: currentVersionId,
|
|
274
|
+
...(onCompare === undefined ? {} : { onCompare: (entry: VersionManagerEntry) => { setCompareOpen(true); onCompare(entry) } }),
|
|
275
|
+
}}
|
|
276
|
+
/>
|
|
277
|
+
<Dialog open={compareOpen} onOpenChange={setCompareOpen}>
|
|
278
|
+
<DialogContent className="w-[min(900px,calc(100vw-32px))] max-w-[min(900px,calc(100vw-32px))] max-h-[calc(100vh-32px)]">
|
|
279
|
+
<DialogHeader>
|
|
280
|
+
<DialogTitle className="flex items-center gap-[6px]"><GitCompare size={15} aria-hidden="true" /> WikiCard 版本差异</DialogTitle>
|
|
281
|
+
<DialogDescription>只读比较所选历史正文与当前正文。关闭窗口不会改变卡片内容。</DialogDescription>
|
|
282
|
+
</DialogHeader>
|
|
283
|
+
<VersionContentDiff data={versionDiff.data} loading={versionDiff.loading} error={versionDiff.error} fullText />
|
|
284
|
+
</DialogContent>
|
|
285
|
+
</Dialog>
|
|
240
286
|
</div>
|
|
241
287
|
}
|
|
242
288
|
|
|
@@ -165,7 +165,7 @@ const STAGES: Stage[] = [
|
|
|
165
165
|
body: [
|
|
166
166
|
'**三个轴分别归一**:先找 canonical,再找 alias,最后才新建候选。匹配不唯一时,**不猜**。',
|
|
167
167
|
'每条知识绑定一个**坐标**:三个轴实体 id 的**复合键**。**Coordinate 不是实体**,没有自己的表。',
|
|
168
|
-
'
|
|
168
|
+
'归一化文本一致时合并并追加来源;语义相似只记候选,不自动合并。相互矛盾的说法需显式标记 disputed。',
|
|
169
169
|
],
|
|
170
170
|
rule: {
|
|
171
171
|
order: '2',
|
|
@@ -176,7 +176,7 @@ const STAGES: Stage[] = [
|
|
|
176
176
|
produces: {
|
|
177
177
|
layer: 'Canonical Knowledge',
|
|
178
178
|
ask: '在哪里',
|
|
179
|
-
note: '
|
|
179
|
+
note: '轴绑定为 id;同文事实合并,语义候选待确认',
|
|
180
180
|
},
|
|
181
181
|
},
|
|
182
182
|
{
|
|
@@ -198,7 +198,7 @@ const STAGES: Stage[] = [
|
|
|
198
198
|
title: '坐标决定卡片身份,卡名只是显示',
|
|
199
199
|
body: '一个坐标最多一张卡。坐标是数据库主键;标题由对象、场景和动作生成,只是**显示名**,不参与判重。',
|
|
200
200
|
},
|
|
201
|
-
model: '
|
|
201
|
+
model: '系统分组,可选模型组织',
|
|
202
202
|
produces: {
|
|
203
203
|
layer: 'Wiki Card',
|
|
204
204
|
ask: '怎么组织这些知道的东西',
|
|
@@ -217,7 +217,7 @@ const STAGES: Stage[] = [
|
|
|
217
217
|
'**Knowledge 是证据层,不是第二个检索入口**:命中 Section 后,再带出对应知识、状态和出处。',
|
|
218
218
|
'向量、关键词和图谱 boost 都属于**可重建的派生层**(`derived.db`)。**轴注册表不是索引**,而是坐标解析时使用的命名真源。',
|
|
219
219
|
],
|
|
220
|
-
model: '
|
|
220
|
+
model: '系统切分 + 向量编码',
|
|
221
221
|
produces: {
|
|
222
222
|
layer: '可检索 Wiki',
|
|
223
223
|
/* 派生层,所以没有 ask —— 它不是实体,不回答上面那三个问题。 */
|
|
@@ -38,7 +38,7 @@ export interface NodeLogicPanelProps {
|
|
|
38
38
|
version: number
|
|
39
39
|
/** 跳到节点所属的功能 tab;`knowledgeTab` 存在时还要落到知识库里那一栏。 */
|
|
40
40
|
onJump: (tab: PanelTab, knowledgeTab?: KnowledgeTab) => void
|
|
41
|
-
/** 打开一个工作区页面(Table /
|
|
41
|
+
/** 打开一个工作区页面(Table / 画布)。 */
|
|
42
42
|
onOpenTab?: (kind: WorkspaceTabKind) => void
|
|
43
43
|
onClose: () => void
|
|
44
44
|
}
|
|
@@ -124,10 +124,9 @@ export function NodeLogicPanel({ selected, stats, version, onJump, onOpenTab, on
|
|
|
124
124
|
去配置<ArrowRight size={14} />
|
|
125
125
|
</Button>
|
|
126
126
|
: <p className={styles.archPanelHint}><CircleHelp size={13} />这个节点没有可配置页:{meta.status === 'host' ? '它由宿主提供' : meta.status === 'planned' ? '它还没实现,先在这里说明设计意图' : '它的行为由代码决定,没有可调参数'}。</p>}
|
|
127
|
-
{(selected === 'answer' || selected === 'data-sheet' || selected === 'data-
|
|
127
|
+
{(selected === 'answer' || selected === 'data-sheet' || selected === 'data-canvas') && onOpenTab && <div className={styles.archPanelActions}>
|
|
128
128
|
<Button variant="outline" size="sm" onClick={() => onOpenTab('data-sheet')}><ChevronRight size={13} />打开 Table</Button>
|
|
129
|
-
|
|
130
|
-
{/* 画布与 Table / Notebook 并列:三者都是这一格的输出产物,之前少列了一个。 */}
|
|
129
|
+
{/* 画布与 Table 并列,都是可编辑的工作区产物。 */}
|
|
131
130
|
<Button variant="outline" size="sm" onClick={() => onOpenTab('data-excalidraw')}><ChevronRight size={13} />打开画布</Button>
|
|
132
131
|
</div>}
|
|
133
132
|
</PanelSection>
|
package/src/client/arch/model.ts
CHANGED
|
@@ -46,7 +46,7 @@ export const NODE_H_STACKED = 80
|
|
|
46
46
|
* 一列竖排**三张**时的卡片高度(2026-09-26 加画布带来的第三张)。
|
|
47
47
|
*
|
|
48
48
|
* 它比两排矮一档,不是审美选择,是算术:三张要挤进同一条带,而带高是全图共享的。
|
|
49
|
-
* 内容也正好只差一行 —— 这一列的 Table /
|
|
49
|
+
* 内容也正好只差一行 —— 这一列的 Table / 画布都没有计数行,两行文字
|
|
50
50
|
* (标题 + 说明)加 8px 上下内边距正好 52px;而情节 / 操作记忆两张带计数行,需要 73px,
|
|
51
51
|
* 所以它们仍用 80。写死一个高度给两种内容,不是裁掉计数就是白留一条空带。
|
|
52
52
|
*/
|
|
@@ -65,7 +65,7 @@ export const STACK_GAP = 14
|
|
|
65
65
|
* 测试会断言两者一致(一处写三张、另一处只放两张是最容易犯的错,而且肉眼看不出来)。
|
|
66
66
|
*/
|
|
67
67
|
export const STACK_COLUMNS: ReadonlyArray<{ lane: number; col: number; count: number }> = [
|
|
68
|
-
{ lane: 0, col: 4, count:
|
|
68
|
+
{ lane: 0, col: 4, count: 2 },
|
|
69
69
|
{ lane: 2, col: 3, count: 2 },
|
|
70
70
|
]
|
|
71
71
|
|
|
@@ -210,8 +210,7 @@ export const ARCH_SLOTS: Record<NodeId, Slot> = {
|
|
|
210
210
|
runtime: { lane: 0, col: 2 },
|
|
211
211
|
answer: { lane: 0, col: 3 },
|
|
212
212
|
'data-sheet': { lane: 0, col: 4, stack: 0 },
|
|
213
|
-
'data-
|
|
214
|
-
'data-canvas': { lane: 0, col: 4, stack: 2 },
|
|
213
|
+
'data-canvas': { lane: 0, col: 4, stack: 1 },
|
|
215
214
|
|
|
216
215
|
'source-raw': { lane: 1, col: 0 },
|
|
217
216
|
compile: { lane: 1, col: 1 },
|
|
@@ -284,9 +283,8 @@ export const ARCH_EDGES: ArchEdge[] = [
|
|
|
284
283
|
{ id: 'a2', source: 'intent', target: 'runtime', kind: 'flow' },
|
|
285
284
|
{ id: 'a3', source: 'runtime', target: 'answer', kind: 'flow' },
|
|
286
285
|
{ id: 'a4', source: 'answer', target: 'data-sheet', kind: 'branch' },
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
{ id: 'a6', source: 'answer', target: 'data-canvas', kind: 'branch' },
|
|
286
|
+
// 画布与 Table 是同一格的两种可编辑输出产物。
|
|
287
|
+
{ id: 'a5', source: 'answer', target: 'data-canvas', kind: 'branch' },
|
|
290
288
|
|
|
291
289
|
// B · 知识编译与召回链路(写入侧 → 读取侧)
|
|
292
290
|
{ id: 'b1', source: 'source-raw', target: 'compile', kind: 'flow' },
|
|
@@ -367,7 +365,6 @@ export function isBusEdge(edgeId: string): boolean {
|
|
|
367
365
|
* ```
|
|
368
366
|
* 回答 ──┐ 拐点 1 把三条边锁在同一个 y(发点的中心),
|
|
369
367
|
* ├──▶ Table 所以三根箭头从**同一个点**出来;
|
|
370
|
-
* ├──▶ Notebook 拐点 2 各自落在目标那一行。
|
|
371
368
|
* └──▶ 画布
|
|
372
369
|
* ```
|
|
373
370
|
*
|
|
@@ -923,7 +920,7 @@ export function recordRows(id: NodeId, stats: KnowledgeStats, version: number):
|
|
|
923
920
|
rows.push(indexRow)
|
|
924
921
|
break
|
|
925
922
|
case 'recall':
|
|
926
|
-
rows.push(['
|
|
923
|
+
rows.push(['召回方式', '多路径融合'])
|
|
927
924
|
rows.push(['召回 topK', String(stats.recallTopK ?? 10)])
|
|
928
925
|
rows.push(['检索后端', stats.searchBackend === 'hybrid' ? 'Hybrid(Coordinate + 关键词 + 向量)' : 'FTS fallback'])
|
|
929
926
|
rows.push(indexRow)
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
import {
|
|
14
|
-
BarChart3, Box, BrainCircuit, ClipboardCheck, Clock3, Database,
|
|
14
|
+
BarChart3, Box, BrainCircuit, ClipboardCheck, Clock3, Database, FileText,
|
|
15
15
|
HardDrive, Layers3, MessageCircle, PenTool, Quote, RefreshCw, Search,
|
|
16
16
|
Share2, Table2, UserRound,
|
|
17
17
|
} from '@tita-agent/ui/icons'
|
|
@@ -51,7 +51,7 @@ export type KnowledgeTab = 'source-raw' | 'knowledge' | 'wiki' | 'recall'
|
|
|
51
51
|
/**
|
|
52
52
|
* 「回答 / 数据工具」这个节点能打开的**工作区页面**。
|
|
53
53
|
*
|
|
54
|
-
*
|
|
54
|
+
* 两个 kind 各由一个别的插件注册(`dsh-data-table` /
|
|
55
55
|
* `dsh-data-excalidraw`)—— 这里只写 kind 字符串,不 import 它们的代码,所以某个
|
|
56
56
|
* 插件没装时按钮依然在,宿主会就着这个 kind 显示「没有页面类型能打开它」。
|
|
57
57
|
*
|
|
@@ -59,11 +59,9 @@ export type KnowledgeTab = 'source-raw' | 'knowledge' | 'wiki' | 'recall'
|
|
|
59
59
|
* 把它交给宿主的 `openTab`。三处各写一份,迟早出现「面板多了一个按钮,入口的类型
|
|
60
60
|
* 还不认它」——加画布这次就正好会踩到。
|
|
61
61
|
*
|
|
62
|
-
* 「回答 /
|
|
63
|
-
* 画布是 2026-09-26 补上的第四个出口:Excalidraw 画布已经在宿主里跑着,而这张架构图
|
|
64
|
-
* 上原先只列了 Table 与 Notebook,读起来像是「Agent 出不了图」。
|
|
62
|
+
* 「回答 / 数据工具」的可编辑工作区产物是表格和画布;分析报告由 DRender 生成。
|
|
65
63
|
*/
|
|
66
|
-
export type WorkspaceTabKind = 'data-sheet' | 'data-
|
|
64
|
+
export type WorkspaceTabKind = 'data-sheet' | 'data-excalidraw'
|
|
67
65
|
|
|
68
66
|
/**
|
|
69
67
|
* 四个分栏的顺序、名字与图标。**定义在这里而不是在 `KnowledgeBaseTab` 里**:
|
|
@@ -76,9 +74,8 @@ export type WorkspaceTabKind = 'data-sheet' | 'data-notebook' | 'data-excalidraw
|
|
|
76
74
|
*/
|
|
77
75
|
export const KNOWLEDGE_TABS: Array<{ id: KnowledgeTab; label: string; step: string; icon: LucideIcon }> = [
|
|
78
76
|
{ id: 'source-raw', label: 'SourceRaw', step: '收录', icon: Database },
|
|
79
|
-
/* Knowledge
|
|
80
|
-
|
|
81
|
-
{ id: 'knowledge', label: 'Knowledge', step: '抽取 · 归一', icon: Quote },
|
|
77
|
+
/* Knowledge 与 Event 都是抽取真源,放在同一栏用二级切换区分;两者都属于 Extract 与 Resolve。 */
|
|
78
|
+
{ id: 'knowledge', label: 'Knowledge & Event', step: '抽取 · 归一', icon: Quote },
|
|
82
79
|
/* WikiCard 这一栏现在只回答一件事:**这些知识被组织成了哪些页**(Materialize)。
|
|
83
80
|
构建(向量 + 图谱)没有自己的栏,它的参数 chip 挂在这一栏的卡片头上。 */
|
|
84
81
|
{ id: 'wiki', label: 'WikiCard', step: '物化', icon: Layers3 },
|
|
@@ -110,7 +107,7 @@ export const NODE_LANES: LaneMeta[] = [
|
|
|
110
107
|
]
|
|
111
108
|
|
|
112
109
|
export type NodeId =
|
|
113
|
-
| 'conversation' | 'intent' | 'runtime' | 'answer' | 'data-sheet' | 'data-
|
|
110
|
+
| 'conversation' | 'intent' | 'runtime' | 'answer' | 'data-sheet' | 'data-canvas'
|
|
114
111
|
| 'source-raw' | 'compile' | 'build' | 'recall' | 'context'
|
|
115
112
|
| 'interaction' | 'episodic-memory' | 'procedural-memory' | 'memory-quality' | 'daily-update'
|
|
116
113
|
|
|
@@ -118,7 +115,7 @@ export type NodeId =
|
|
|
118
115
|
* 实现状态。**这是这张图最容易被写坏的一格**:把待实现的画成已实现,图就从契约
|
|
119
116
|
* 退化成宣传。所以状态只有四档,且每一档都要在 `statusNote` 里说清依据。
|
|
120
117
|
*
|
|
121
|
-
* - `host`:不是本插件的代码(Runtime / Table
|
|
118
|
+
* - `host`:不是本插件的代码(Runtime / Table 由宿主提供),不冒充我们的进度。
|
|
122
119
|
*/
|
|
123
120
|
export type NodeStatus = 'live' | 'partial' | 'planned' | 'host'
|
|
124
121
|
|
|
@@ -209,8 +206,9 @@ icon: MessageCircle, lane: 'interaction',
|
|
|
209
206
|
input: '用户原文 + 会话 + 当前 Query', output: 'intent 记录 + Query Analysis(Intent / OAS)',
|
|
210
207
|
steps: [
|
|
211
208
|
{ label: '固定审计契约', detail: '按内置分类、act 与 relation 规则记录会话事实', state: 'done' },
|
|
212
|
-
{ label: '
|
|
213
|
-
{ label: '
|
|
209
|
+
{ label: '数据域门控', detail: '只有标准模式的数据轮次进入意图链路,普通聊天不生成记录', state: 'done' },
|
|
210
|
+
{ label: '记录不拦截执行', detail: '模型无法判定时记录 unknown,不阻塞后续请求;非数据轮次不补记录', state: 'done' },
|
|
211
|
+
{ label: '置信度与兜底', detail: '低于阈值的记录标 lowConfidence;数据轮次漏调由 Host 补一条 fallback', state: 'done' },
|
|
214
212
|
{ label: '召回侧解析', detail: '当前 Query 解析 Intent + Object / Action / Scene,交给 Coordinate 路', state: 'done' },
|
|
215
213
|
],
|
|
216
214
|
status: 'live', statusNote: '会话意图记录已落盘;召回侧 Query Analysis 在知识库 → 召回重排中实时展示。',
|
|
@@ -218,25 +216,25 @@ icon: BrainCircuit, lane: 'interaction', tab: 'intent',
|
|
|
218
216
|
},
|
|
219
217
|
runtime: {
|
|
220
218
|
title: 'Tita Agent Runtime', shortTitle: 'Agent Runtime', subtitle: '规划、调用工具、执行分析',
|
|
221
|
-
detail: 'Agent
|
|
219
|
+
detail: 'Agent 核心运行时:编排知识召回、数据表格和自进化记忆,组织结果并返回给用户。',
|
|
222
220
|
input: '意图与上下文 + 召回得到的知识', output: '回答、引用、结构化数据',
|
|
223
221
|
steps: [
|
|
224
222
|
{ label: '接收 Agent Context', detail: '重排后的 Section 归并为完整 WikiCard,连同 Knowledge 与 Source provenance 返回', state: 'done' },
|
|
225
|
-
{ label: '调用工具', detail: '
|
|
226
|
-
{ label: '组织回答', detail: '
|
|
223
|
+
{ label: '调用工具', detail: '取数、表格、知识写入都由工具完成', state: 'done' },
|
|
224
|
+
{ label: '组织回答', detail: '解释与引用一起返回,结构化结果可转交 Table / 画布或 DRender 报告', state: 'done' },
|
|
227
225
|
],
|
|
228
226
|
status: 'host', statusNote: 'Runtime 是宿主 Agent 本体;本插件以「召回上下文 + 知识工具」的方式接入它。',
|
|
229
227
|
icon: Box, lane: 'interaction',
|
|
230
228
|
},
|
|
231
229
|
answer: {
|
|
232
230
|
title: '回答 / 数据工具', subtitle: '生成结果、可视化与方案',
|
|
233
|
-
detail: '
|
|
234
|
-
input: '模型回答 + 工具返回值', output: '
|
|
231
|
+
detail: '输出解释、引用和数据结果,并把结构化结果交给 Table、画布或 DRender 报告处理。',
|
|
232
|
+
input: '模型回答 + 工具返回值', output: '可读回答、可编辑表格、DRender 报告、可编辑画布',
|
|
235
233
|
steps: [
|
|
236
234
|
{ label: '回答与引用', detail: '每一条结论都能指回 wiki 与 SourceRaw', state: 'done' },
|
|
237
|
-
{ label: '转交数据工具', detail: '结构化结果可继续在 Table /
|
|
235
|
+
{ label: '转交数据工具', detail: '结构化结果可继续在 Table / 画布里加工,或由 DRender 生成报告', state: 'done' },
|
|
238
236
|
],
|
|
239
|
-
status: 'host', statusNote: '回答渲染与 Table /
|
|
237
|
+
status: 'host', statusNote: '回答渲染与 Table / 画布由宿主工作区提供;DRender 负责报告生成。',
|
|
240
238
|
icon: BarChart3, lane: 'interaction',
|
|
241
239
|
},
|
|
242
240
|
'data-sheet': {
|
|
@@ -246,14 +244,6 @@ icon: BarChart3, lane: 'interaction',
|
|
|
246
244
|
steps: [{ label: '打开数据表格', detail: '由宿主的 Table 插件承载', state: 'done' }],
|
|
247
245
|
status: 'host', statusNote: '属于 `dsh-data-table` 插件,这里只画调用关系。',
|
|
248
246
|
icon: Table2, lane: 'interaction',
|
|
249
|
-
},
|
|
250
|
-
'data-notebook': {
|
|
251
|
-
title: 'Notebook', subtitle: '生成 / 分析 Notebook',
|
|
252
|
-
detail: '把查询、SQL、Markdown 和图表组织成可复用的分析 Notebook。',
|
|
253
|
-
input: '查询与代码片段', output: '可复现的分析 Notebook',
|
|
254
|
-
steps: [{ label: '打开数据笔记本', detail: '由宿主的 Notebook 插件承载', state: 'done' }],
|
|
255
|
-
status: 'host', statusNote: '属于 `dsh-data-notebook` 插件,这里只画调用关系。',
|
|
256
|
-
icon: FileCode2, lane: 'interaction',
|
|
257
247
|
},
|
|
258
248
|
'data-canvas': {
|
|
259
249
|
title: '画布', subtitle: '生成 / 编辑 Excalidraw 画布',
|
|
@@ -286,7 +276,7 @@ icon: Database, lane: 'knowledge', tab: 'knowledge', knowledgeTab: 'source-raw',
|
|
|
286
276
|
{ label: '物化 WikiCard', detail: '按 (对象, 动作, 场景) 分组,卡名由公式推导(对象名 + 场景 + 动作名);小节与字段作为组织提示,卡片直接入库,review 与备注在预览中处理', state: 'done' },
|
|
287
277
|
{ label: '建索引', detail: '切召回单元、写索引页与相关卡片、检查断链,不调模型', state: 'done' },
|
|
288
278
|
],
|
|
289
|
-
status: 'live', statusNote: '
|
|
279
|
+
status: 'live', statusNote: '导入默认只保存来源;抽取 Knowledge / Event、归一、物化分别运行,也可全链路运行。未变文档复用检查点;构建成功后统一发布索引。模型不可用时任务明确失败,可查看输出与历史后重试。',
|
|
290
280
|
icon: RefreshCw, lane: 'knowledge', tab: 'knowledge', knowledgeTab: 'wiki',
|
|
291
281
|
},
|
|
292
282
|
build: {
|
|
@@ -334,7 +324,7 @@ icon: Layers3, lane: 'knowledge', tab: 'knowledge', knowledgeTab: 'recall',
|
|
|
334
324
|
detail: '记录用户做了什么、采用了什么结果,以及对分析结果的反馈,为自进化闭环提供输入。',
|
|
335
325
|
input: '每一轮的意图记录与工具调用', output: '可回溯的交互审计流',
|
|
336
326
|
steps: [
|
|
337
|
-
{ label: '意图审计流', detail: '
|
|
327
|
+
{ label: '意图审计流', detail: '每个数据轮次一条 intent 记录,只标注不拦截', state: 'done' },
|
|
338
328
|
{ label: '结果采纳与反馈', detail: '用户是否采用了结果、事后评价还没采集', state: 'todo' },
|
|
339
329
|
],
|
|
340
330
|
status: 'partial', statusNote: '意图记录已经是一条真实的审计流;「结果是否被采用」这类反馈还没有采集入口。',
|
|
@@ -499,7 +489,7 @@ export function nodeMetrics(id: NodeId, stats: KnowledgeStats, version: number):
|
|
|
499
489
|
case 'recall':
|
|
500
490
|
return [
|
|
501
491
|
{ label: 'topK', value: String(stats.recallTopK ?? 10) },
|
|
502
|
-
{ label: '
|
|
492
|
+
{ label: '召回方式', value: '多路径融合' },
|
|
503
493
|
]
|
|
504
494
|
case 'context':
|
|
505
495
|
return [
|
|
@@ -533,12 +523,12 @@ export function metricsByNode(stats: KnowledgeStats, version: number): Partial<R
|
|
|
533
523
|
|
|
534
524
|
/** 节点在图上出现的顺序:按链路,再按链内阅读顺序。它就是键盘可达列表的顺序。 */
|
|
535
525
|
export const NODE_ORDER: NodeId[] = [
|
|
536
|
-
'conversation', 'intent', 'runtime', 'answer', 'data-sheet', 'data-
|
|
526
|
+
'conversation', 'intent', 'runtime', 'answer', 'data-sheet', 'data-canvas',
|
|
537
527
|
'source-raw', 'compile', 'build', 'recall', 'context',
|
|
538
528
|
'interaction', 'episodic-memory', 'procedural-memory', 'memory-quality', 'daily-update',
|
|
539
529
|
]
|
|
540
530
|
|
|
541
|
-
/**
|
|
531
|
+
/** 只在面板里出现、不占图上格子的节点(这里保留给未来扩展)。 */
|
|
542
532
|
export const DERIVED_NODES: NodeId[] = []
|
|
543
533
|
|
|
544
534
|
/** 某个节点归属的链路定义;找不到(例如未来新增节点漏填 lane)时返回 null 而不是猜。 */
|