noteconnection 1.7.0 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +674 -21
- package/README.md +260 -1626
- package/dist/src/agent_workspace.contract.parity.test.js +159 -0
- package/dist/src/agent_workspace.frontend.test.js +10388 -0
- package/dist/src/agent_workspace.locale.contract.test.js +95 -0
- package/dist/src/agent_workspace.runtime.behavior.test.js +5072 -0
- package/dist/src/android.knowledgebase.picker.contract.test.js +102 -0
- package/dist/src/appimage.patchelf.test.js +113 -0
- package/dist/src/appimage.portability.test.js +156 -0
- package/dist/src/backend/FileLoader.js +18 -4
- package/dist/src/backend/FileLoader.test.js +125 -0
- package/dist/src/backend/GraphBuilder.identity.test.js +86 -0
- package/dist/src/backend/GraphBuilder.js +66 -18
- package/dist/src/backend/GraphBuilder.matching.test.js +127 -0
- package/dist/src/backend/GraphMetrics.js +0 -3
- package/dist/src/backend/ResourceIdentity.js +155 -0
- package/dist/src/backend/ResourceIdentity.test.js +113 -0
- package/dist/src/backend/algorithms/CycleDetection.js +0 -1
- package/dist/src/backend/algorithms/HybridEngine.js +0 -3
- package/dist/src/backend/algorithms/LayoutEngine.js +0 -1
- package/dist/src/backend/algorithms/StatisticalAnalyzer.js +0 -4
- package/dist/src/backend/algorithms/TopologicalSort.js +0 -2
- package/dist/src/backend/build_dag.js +0 -1
- package/dist/src/capacitor.bridge.serialization.contract.test.js +3 -0
- package/dist/src/capacitor.runtime.contract.test.js +11 -2
- package/dist/src/copy.assets.contract.test.js +130 -0
- package/dist/src/core/Graph.js +138 -42
- package/dist/src/core/Graph.test.js +74 -0
- package/dist/src/core/NoteConnection.js +2 -2
- package/dist/src/core/PathBridge.js +293 -5
- package/dist/src/core/ResourceReference.js +17 -0
- package/dist/src/desktop.godot.pack.test.js +142 -0
- package/dist/src/desktop.runtime.graph.test.js +66 -0
- package/dist/src/export/WorkspaceExportBundle.js +1174 -0
- package/dist/src/export/WorkspaceExportBundle.test.js +1541 -0
- package/dist/src/export/index.js +18 -0
- package/dist/src/export/types.js +2 -0
- package/dist/src/fixrisk.issue.verifier.contract.test.js +3 -1
- package/dist/src/foundation.ann.runtime.contract.test.js +81 -0
- package/dist/src/foundation.release.evidence.contract.test.js +524 -0
- package/dist/src/foundation.sqlite.runtime.contract.test.js +88 -0
- package/dist/src/frontend/README.md +260 -1626
- package/dist/src/frontend/agent_workspace.js +6011 -0
- package/dist/src/frontend/agent_workspace_runtime.js +4434 -0
- package/dist/src/frontend/analysis.js +31 -4
- package/dist/src/frontend/app.js +2178 -62
- package/dist/src/frontend/focus_mode_interactions.js +33 -0
- package/dist/src/frontend/godot_future_path_renderer.js +540 -0
- package/dist/src/frontend/godot_tree_interactions.js +178 -0
- package/dist/src/frontend/graph_state.mjs +105 -0
- package/dist/src/frontend/hosted_future_path_runtime.js +157 -0
- package/dist/src/frontend/i18n.mjs +186 -0
- package/dist/src/frontend/index.html +672 -268
- package/dist/src/frontend/knowledge_projection_contract.js +230 -0
- package/dist/src/frontend/knowledge_projection_store.js +214 -0
- package/dist/src/frontend/layout_gpu.js +12 -4
- package/dist/src/frontend/libs/path_core.js +158 -42
- package/dist/src/frontend/locales/en.json +753 -5
- package/dist/src/frontend/locales/zh.json +753 -5
- package/dist/src/frontend/main.mjs +60 -0
- package/dist/src/frontend/markdown_runtime.js +827 -0
- package/dist/src/frontend/mobile_budget_runtime.js +33 -0
- package/dist/src/frontend/mobile_exact_analyzer.js +393 -0
- package/dist/src/frontend/mobile_identity_contract.js +221 -0
- package/dist/src/frontend/mobile_semantic_comparator.js +264 -0
- package/dist/src/frontend/notemd.css +49 -0
- package/dist/src/frontend/notemd.html +7 -1
- package/dist/src/frontend/notemd.js +64 -0
- package/dist/src/frontend/path.html +113 -2
- package/dist/src/frontend/path_app.js +2108 -130
- package/dist/src/frontend/path_layout.mjs +143 -0
- package/dist/src/frontend/path_mermaid_utils.mjs +108 -0
- package/dist/src/frontend/path_modules_bridge.js +486 -0
- package/dist/src/frontend/path_state.mjs +118 -0
- package/dist/src/frontend/path_styles.css +146 -0
- package/dist/src/frontend/path_worker_bridge.mjs +85 -0
- package/dist/src/frontend/reader.js +393 -33
- package/dist/src/frontend/runtime_bridge.js +67 -54
- package/dist/src/frontend/runtime_bridge.mjs +279 -0
- package/dist/src/frontend/settings.js +130 -12
- package/dist/src/frontend/simulationWorker.js +1 -1
- package/dist/src/frontend/source_manager.js +297 -22
- package/dist/src/frontend/storage_provider.js +661 -71
- package/dist/src/frontend/styles.css +2814 -72
- package/dist/src/frontend/workbench_state.mjs +101 -0
- package/dist/src/frontend/workspace_panes.js +10272 -0
- package/dist/src/frontend.locale.contract.test.js +62 -0
- package/dist/src/frontend.runtime.assets.contract.test.js +81 -0
- package/dist/src/godot.sidecar.bootstrap.contract.test.js +244 -0
- package/dist/src/graph.answer.operator.contract.test.js +72 -0
- package/dist/src/index.js +6 -2
- package/dist/src/index.knowledge-root.test.js +118 -0
- package/dist/src/indexing/IndexLifecycle.js +217 -0
- package/dist/src/indexing/IndexLifecycle.test.js +73 -0
- package/dist/src/indexing/SegmentBuilder.js +64 -0
- package/dist/src/indexing/UnitBuilder.js +48 -0
- package/dist/src/indexing/types.js +2 -0
- package/dist/src/knowledge.api.contract.test.js +172 -0
- package/dist/src/knowledge_projection.contract.test.js +134 -0
- package/dist/src/knowledge_projection_store.test.js +200 -0
- package/dist/src/learning/AnswerQualityEvaluation.js +153 -0
- package/dist/src/learning/AnswerQualityEvaluation.test.js +118 -0
- package/dist/src/learning/KnowledgeLearningPlatform.js +11181 -0
- package/dist/src/learning/KnowledgeLearningPlatform.persistence.test.js +745 -0
- package/dist/src/learning/KnowledgeLearningPlatform.program-f.test.js +99 -0
- package/dist/src/learning/KnowledgeLearningPlatform.test.js +3208 -0
- package/dist/src/learning/KnowledgeWorkspaceConversationRegression.js +2998 -0
- package/dist/src/learning/KnowledgeWorkspaceConversationRegression.test.js +3936 -0
- package/dist/src/learning/MeasurementEvidenceConflicts.test.js +78 -0
- package/dist/src/learning/PublicAnswerContract.test.js +85 -0
- package/dist/src/learning/PublicEvidenceSelection.test.js +94 -0
- package/dist/src/learning/PublicMeasurementDisclosure.test.js +54 -0
- package/dist/src/learning/agentConversationExecution.js +211 -0
- package/dist/src/learning/agentConversationExecution.test.js +209 -0
- package/dist/src/learning/agentConversationSerialization.js +266 -0
- package/dist/src/learning/agentConversationSerialization.test.js +165 -0
- package/dist/src/learning/agentResponseBudget.js +179 -0
- package/dist/src/learning/agentResponseBudget.test.js +97 -0
- package/dist/src/learning/agentWorkspaceCapabilityContracts.js +65 -0
- package/dist/src/learning/answerReleaseReview.js +5260 -0
- package/dist/src/learning/answerReleaseReview.test.js +4174 -0
- package/dist/src/learning/answerTaskPlan.js +473 -0
- package/dist/src/learning/api.js +2 -0
- package/dist/src/learning/conversationComposer.js +1721 -0
- package/dist/src/learning/conversationComposer.test.js +3220 -0
- package/dist/src/learning/domains/ConversationManager.js +53 -0
- package/dist/src/learning/domains/KnowledgeIngestor.js +238 -0
- package/dist/src/learning/domains/KnowledgeQuerier.js +187 -0
- package/dist/src/learning/domains/MasteryEngine.js +387 -0
- package/dist/src/learning/domains/MemoryPolicyManager.js +408 -0
- package/dist/src/learning/domains/QualityEvaluator.js +307 -0
- package/dist/src/learning/domains/TutorRouter.js +313 -0
- package/dist/src/learning/domains/index.js +33 -0
- package/dist/src/learning/domains/types.js +7 -0
- package/dist/src/learning/errors.js +29 -0
- package/dist/src/learning/evidenceContextAssembler.js +1368 -0
- package/dist/src/learning/evidenceContextAssembler.test.js +6332 -0
- package/dist/src/learning/graphAnswerCoverage.js +37 -0
- package/dist/src/learning/graphAnswerCoverage.test.js +93 -0
- package/dist/src/learning/graphAnswerCoverageCalibration.js +59 -0
- package/dist/src/learning/graphAnswerCoverageCalibration.test.js +46 -0
- package/dist/src/learning/graphAnswerFacts.js +94 -0
- package/dist/src/learning/graphAnswerFacts.test.js +39 -0
- package/dist/src/learning/graphAnswerPlan.js +908 -0
- package/dist/src/learning/graphAnswerPlan.test.js +907 -0
- package/dist/src/learning/graphAnswerQualityCalibration.js +255 -0
- package/dist/src/learning/graphAnswerQualityCalibration.test.js +72 -0
- package/dist/src/learning/graphAnswerQualityPolicy.js +30 -0
- package/dist/src/learning/graphClaimMatcher.js +104 -0
- package/dist/src/learning/graphConditionedContext.js +109 -0
- package/dist/src/learning/graphConditionedContext.test.js +99 -0
- package/dist/src/learning/graphContextAssembler.js +860 -0
- package/dist/src/learning/graphContextAssembler.test.js +1033 -0
- package/dist/src/learning/graphExpansionPolicy.js +22 -0
- package/dist/src/learning/graphExpansionPolicy.test.js +33 -0
- package/dist/src/learning/identityMetadata.test.js +26 -0
- package/dist/src/learning/index.js +29 -0
- package/dist/src/learning/mobileAnswerProjection.js +104 -0
- package/dist/src/learning/mobileAnswerProjection.test.js +102 -0
- package/dist/src/learning/queryBackend.js +1922 -0
- package/dist/src/learning/queryBackend.test.js +976 -0
- package/dist/src/learning/ragContextPack.js +356 -0
- package/dist/src/learning/ragContextPack.test.js +311 -0
- package/dist/src/learning/ragEvidenceQuality.js +96 -0
- package/dist/src/learning/ragEvidenceQuality.test.js +29 -0
- package/dist/src/learning/ragPublicText.js +101 -0
- package/dist/src/learning/ragPublicText.test.js +57 -0
- package/dist/src/learning/ragSufficiencyJudge.js +171 -0
- package/dist/src/learning/ragSufficiencyJudge.test.js +177 -0
- package/dist/src/learning/ragSufficiencyProviderJudge.js +217 -0
- package/dist/src/learning/ragSufficiencyProviderJudge.test.js +207 -0
- package/dist/src/learning/requestNormalization.js +304 -0
- package/dist/src/learning/requestNormalization.test.js +101 -0
- package/dist/src/learning/runtimeCapability.js +4677 -0
- package/dist/src/learning/runtimeCapability.test.js +3635 -0
- package/dist/src/learning/store.js +1344 -0
- package/dist/src/learning/store.test.js +1425 -0
- package/dist/src/learning/tutorAdapter.js +2 -0
- package/dist/src/learning/types.js +2 -0
- package/dist/src/learning/vectorAccelerationAdapter.js +958 -0
- package/dist/src/learning/vectorAccelerationAdapter.test.js +412 -0
- package/dist/src/learning/workspaceHydration.js +168 -0
- package/dist/src/learning/workspaceHydration.test.js +30 -0
- package/dist/src/lfs.asset.policy.contract.test.js +153 -0
- package/dist/src/license.policy.contract.test.js +71 -0
- package/dist/src/markdown/MarkdownGateway.js +4 -0
- package/dist/src/markdown/MarkdownGateway.test.js +59 -0
- package/dist/src/memory/MemoryGovernance.js +74 -0
- package/dist/src/memory/MemoryGovernance.test.js +46 -0
- package/dist/src/memory/types.js +2 -0
- package/dist/src/mermaid.frontend.guard.contract.test.js +77 -0
- package/dist/src/middleware/SseResponseWriter.js +122 -0
- package/dist/src/middleware/SseResponseWriter.test.js +54 -0
- package/dist/src/middleware/auth.js +38 -0
- package/dist/src/middleware/auth.test.js +33 -0
- package/dist/src/middleware/body-parser.js +45 -0
- package/dist/src/middleware/cors.js +44 -0
- package/dist/src/middleware/index.js +22 -0
- package/dist/src/middleware/request-trace.js +96 -0
- package/dist/src/mobile.android.evidence.contract.test.js +146 -0
- package/dist/src/mobile.android.signing.contract.test.js +66 -0
- package/dist/src/mobile.artifact.contract.test.js +144 -0
- package/dist/src/mobile.budget.contract.test.js +90 -0
- package/dist/src/mobile.canonical-id.readiness.test.js +54 -0
- package/dist/src/mobile.graph.parity.contract.test.js +207 -0
- package/dist/src/mobile.identity.contract.test.js +66 -0
- package/dist/src/mobile.identity.corpus.manifest.test.js +72 -0
- package/dist/src/mobile.identity.corpus.test.js +40 -0
- package/dist/src/mobile.native.recovery.contract.test.js +64 -0
- package/dist/src/mobile.pipeline.test.js +11 -1
- package/dist/src/mobile.profile.contract.test.js +225 -0
- package/dist/src/mobile.semantic.parity.test.js +92 -0
- package/dist/src/mobile_exact_analyzer.test.js +113 -0
- package/dist/src/notemd/AppConfigToml.js +6 -4
- package/dist/src/notemd/ContentGenerator.js +4 -9
- package/dist/src/notemd/FileProcessor.js +4 -9
- package/dist/src/notemd/MermaidProcessor.js +400 -50
- package/dist/src/notemd/NotemdService.js +506 -26
- package/dist/src/notemd/PromptManager.js +15 -0
- package/dist/src/notemd/Translator.js +4 -9
- package/dist/src/notemd/cli/commands.js +357 -0
- package/dist/src/notemd/cli/dispatcher.js +225 -0
- package/dist/src/notemd/cli/index.js +169 -0
- package/dist/src/notemd/cli/parser.js +68 -0
- package/dist/src/notemd/cli/types.js +2 -0
- package/dist/src/notemd/constants.js +43 -0
- package/dist/src/notemd/diagram/diagramGenerationService.js +78 -0
- package/dist/src/notemd/diagram/diagramSpec.js +79 -0
- package/dist/src/notemd/diagram/diagramSpecResponseParser.js +131 -0
- package/dist/src/notemd/diagram/intent.js +95 -0
- package/dist/src/notemd/diagram/planner.js +71 -0
- package/dist/src/notemd/diagram/prompts/diagramSpecPrompt.js +42 -0
- package/dist/src/notemd/diagram/types.js +18 -0
- package/dist/src/notemd/index.js +26 -0
- package/dist/src/notemd/operations/capabilityManifest.js +23 -0
- package/dist/src/notemd/operations/cliContracts.js +17 -0
- package/dist/src/notemd/operations/configProfileCommands.js +85 -0
- package/dist/src/notemd/operations/registry.contract.test.js +95 -0
- package/dist/src/notemd/operations/registry.js +991 -0
- package/dist/src/notemd/operations/types.js +2 -0
- package/dist/src/notemd/progressReporter.js +9 -0
- package/dist/src/notemd/providerDiagnostics.js +220 -0
- package/dist/src/notemd/providerProfiles.js +42 -0
- package/dist/src/notemd/providerTemplates.js +231 -0
- package/dist/src/notemd/search/DuckDuckGoProvider.js +39 -0
- package/dist/src/notemd/search/SearchManager.js +13 -0
- package/dist/src/notemd/search/SearchProvider.js +2 -0
- package/dist/src/notemd/search/TavilyProvider.js +44 -0
- package/dist/src/notemd.agent.manifest.test.js +85 -0
- package/dist/src/notemd.api.contract.test.js +14 -1
- package/dist/src/notemd.app_config_toml.test.js +2 -1
- package/dist/src/notemd.batch.workflow.test.js +117 -0
- package/dist/src/notemd.cli.e2e.test.js +136 -0
- package/dist/src/notemd.core.test.js +51 -0
- package/dist/src/notemd.diagram.pipeline.test.js +233 -0
- package/dist/src/notemd.providerTemplates.test.js +34 -0
- package/dist/src/notemd.server.integration.test.js +262 -39
- package/dist/src/notemd.workflow.pipeline.test.js +162 -0
- package/dist/src/pathbridge.handshake.contract.test.js +45 -2
- package/dist/src/pathbridge.host-adapter.contract.test.js +133 -0
- package/dist/src/pathcore.bundle.contract.test.js +8 -0
- package/dist/src/pathmode.background.contract.test.js +69 -0
- package/dist/src/pathmode.settings.api.contract.test.js +9 -0
- package/dist/src/pkg.sidecar.contract.test.js +9 -3
- package/dist/src/platform/ExportProfile.js +86 -0
- package/dist/src/platform/MobileBudget.js +11 -0
- package/dist/src/platform/PlatformCapabilities.js +59 -0
- package/dist/src/platform/PlatformCapabilities.test.js +36 -0
- package/dist/src/platform/RenderMaterializer.js +33 -0
- package/dist/src/platform/RenderMaterializer.test.js +32 -0
- package/dist/src/query_backend.external_http.integration.test.js +410 -0
- package/dist/src/reader_renderer.js +404 -3
- package/dist/src/reader_renderer.test.js +87 -0
- package/dist/src/release.godot.mirror.contract.test.js +97 -0
- package/dist/src/resources/ResourceRegistry.js +263 -0
- package/dist/src/resources/ResourceRegistry.test.js +97 -0
- package/dist/src/resources/types.js +2 -0
- package/dist/src/routes/agentWorkspaceDiagnostics.js +173 -0
- package/dist/src/routes/index.js +19 -0
- package/dist/src/routes/knowledge.js +981 -0
- package/dist/src/routes/knowledgePayload.js +185 -0
- package/dist/src/routes/knowledgePayload.test.js +53 -0
- package/dist/src/routes/markdown.js +295 -0
- package/dist/src/routes/notemd.js +1321 -0
- package/dist/src/routes/registry.contract.test.js +133 -0
- package/dist/src/routes/registry.shadow.contract.test.js +22 -0
- package/dist/src/routes/render.js +248 -0
- package/dist/src/routes/runtimeRunbookRouteOps.js +149 -0
- package/dist/src/routes/runtimeRunbookRouteOps.test.js +194 -0
- package/dist/src/routes/settings.js +6 -0
- package/dist/src/routes/staticFiles.js +94 -0
- package/dist/src/routes/types.js +2 -0
- package/dist/src/runtime.capabilities.test.js +18 -2
- package/dist/src/runtime.transport.adapter.contract.test.js +81 -0
- package/dist/src/server.js +10342 -1325
- package/dist/src/server.migration.test.js +584 -10
- package/dist/src/server.port.fallback.contract.test.js +63 -0
- package/dist/src/session/SessionStateStore.js +81 -0
- package/dist/src/session/SessionStateStore.test.js +58 -0
- package/dist/src/session/types.js +2 -0
- package/dist/src/settings.runtime.contract.test.js +50 -0
- package/dist/src/shared/types.contract.test.js +107 -0
- package/dist/src/shared/types.js +22 -0
- package/dist/src/sidecar.build.lock.contract.test.js +201 -0
- package/dist/src/sidecar.freshness.contract.test.js +184 -0
- package/dist/src/sidecar.replacement.boundary.contract.test.js +131 -0
- package/dist/src/sidecar.supply.readiness.contract.test.js +155 -0
- package/dist/src/simulation.worker.offline.test.js +104 -0
- package/dist/src/source_manager.loadflow.test.js +46 -0
- package/dist/src/startup.layout.snapshot.contract.test.js +57 -0
- package/dist/src/storage.provider.capacitor.content.contract.test.js +4 -1
- package/dist/src/storage.provider.contract.test.js +152 -1
- package/dist/src/tauri.frontend.build.contract.test.js +68 -0
- package/dist/src/tauri.sidecar.cleanup.contract.test.js +21 -0
- package/dist/src/tauri.window.evidence.execution.test.js +68 -0
- package/dist/src/utils/RuntimePaths.js +10 -13
- package/dist/src/utils/RuntimePaths.test.js +27 -0
- package/dist/src/utils/platform.js +153 -0
- package/dist/src/windows.installer.build.test.js +109 -0
- package/dist/src/windows.installer.payload.test.js +76 -0
- package/dist/src/windows.installer.runtime.test.js +69 -0
- package/dist/src/workflows/WorkflowArtifactStore.js +96 -0
- package/dist/src/workflows/WorkflowArtifactStore.test.js +80 -0
- package/dist/src/workflows/types.js +2 -0
- package/dist/src/workspace/WorkspaceRegistry.js +135 -0
- package/dist/src/workspace/WorkspaceRegistry.test.js +29 -0
- package/dist/src/workspace/types.js +2 -0
- package/package.json +80 -15
|
@@ -8,10 +8,31 @@ var module = { exports: exports };
|
|
|
8
8
|
// var Graph, PathEngine;
|
|
9
9
|
|
|
10
10
|
|
|
11
|
+
/* ResourceReference.js */
|
|
12
|
+
"use strict";
|
|
13
|
+
|
|
14
|
+
normalizeResourceReference = normalizeResourceReference;
|
|
15
|
+
/**
|
|
16
|
+
* Shared, host-neutral reference normalization used by Graph and backend
|
|
17
|
+
* identity generation. It intentionally has no Node or platform dependency so
|
|
18
|
+
* the path-core bundle can execute in a browser VM and in Godot WebView.
|
|
19
|
+
*/
|
|
20
|
+
function normalizeResourceReference(reference) {
|
|
21
|
+
if (typeof reference !== 'string') {
|
|
22
|
+
throw new Error('Resource reference must be a string');
|
|
23
|
+
}
|
|
24
|
+
if (reference.includes('\0')) {
|
|
25
|
+
throw new Error('Resource reference must not contain NUL characters');
|
|
26
|
+
}
|
|
27
|
+
return reference.normalize('NFC').replace(/\\/g, '/').toLowerCase();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
|
|
11
31
|
/* Graph.js */
|
|
12
32
|
"use strict";
|
|
13
33
|
|
|
14
34
|
|
|
35
|
+
|
|
15
36
|
/**
|
|
16
37
|
* Directed Graph implementation for managing notes and dependencies.
|
|
17
38
|
* 用于管理笔记和依赖关系的有向图实现。
|
|
@@ -21,6 +42,7 @@ class Graph {
|
|
|
21
42
|
this.nodes = new Map();
|
|
22
43
|
this.adjacencyList = new Map();
|
|
23
44
|
this.reverseAdjacencyList = new Map();
|
|
45
|
+
this.aliases = new Map();
|
|
24
46
|
}
|
|
25
47
|
/**
|
|
26
48
|
* Adds a node to the graph.
|
|
@@ -28,11 +50,90 @@ class Graph {
|
|
|
28
50
|
* @param node The node to add | 要添加的节点
|
|
29
51
|
*/
|
|
30
52
|
addNode(node) {
|
|
31
|
-
if (
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
53
|
+
if (this.nodes.has(node.id)) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const aliases = [node.id, node.sourceUri, ...(node.identityAliases ?? [])]
|
|
57
|
+
.filter((alias) => typeof alias === 'string' && alias.length > 0);
|
|
58
|
+
const normalizedAliases = new Set(aliases.map(alias => (0, normalizeResourceReference)(alias)));
|
|
59
|
+
normalizedAliases.forEach(alias => {
|
|
60
|
+
const existingNodeId = this.aliases.get(alias);
|
|
61
|
+
if (existingNodeId && existingNodeId !== node.id) {
|
|
62
|
+
throw new Error(`Resource identity alias collision: "${alias}" is claimed by both "${existingNodeId}" and "${node.id}"`);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
this.nodes.set(node.id, { ...node, inDegree: 0, outDegree: 0 });
|
|
66
|
+
this.adjacencyList.set(node.id, []);
|
|
67
|
+
this.reverseAdjacencyList.set(node.id, []);
|
|
68
|
+
normalizedAliases.forEach(alias => {
|
|
69
|
+
this.aliases.set(alias, node.id);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Rehydrates a graph from either a current or legacy JSON snapshot.
|
|
74
|
+
*
|
|
75
|
+
* The snapshot is validated before mutating the returned graph. Edges must
|
|
76
|
+
* reference declared nodes so a corrupt or partially-written snapshot cannot
|
|
77
|
+
* silently create synthetic nodes and change graph semantics during replay.
|
|
78
|
+
*/
|
|
79
|
+
static fromJSON(data) {
|
|
80
|
+
if (!data || typeof data !== 'object' || Array.isArray(data)) {
|
|
81
|
+
throw new Error('Graph snapshot must be an object.');
|
|
82
|
+
}
|
|
83
|
+
const snapshot = data;
|
|
84
|
+
if (!Array.isArray(snapshot.nodes) || !Array.isArray(snapshot.edges)) {
|
|
85
|
+
throw new Error('Graph snapshot must contain nodes and edges arrays.');
|
|
35
86
|
}
|
|
87
|
+
const graph = new Graph();
|
|
88
|
+
const nodeIds = new Set();
|
|
89
|
+
snapshot.nodes.forEach((rawNode, index) => {
|
|
90
|
+
if (!rawNode || typeof rawNode !== 'object' || Array.isArray(rawNode)) {
|
|
91
|
+
throw new Error(`Graph snapshot node at index ${index} must be an object.`);
|
|
92
|
+
}
|
|
93
|
+
const node = rawNode;
|
|
94
|
+
if (typeof node.id !== 'string' || node.id.trim().length === 0) {
|
|
95
|
+
throw new Error(`Graph snapshot node at index ${index} requires a non-empty id.`);
|
|
96
|
+
}
|
|
97
|
+
if (nodeIds.has(node.id)) {
|
|
98
|
+
throw new Error(`Graph snapshot contains duplicate node id: ${node.id}.`);
|
|
99
|
+
}
|
|
100
|
+
nodeIds.add(node.id);
|
|
101
|
+
graph.addNode({
|
|
102
|
+
...node,
|
|
103
|
+
id: node.id,
|
|
104
|
+
label: typeof node.label === 'string' && node.label.length > 0 ? node.label : node.id,
|
|
105
|
+
inDegree: 0,
|
|
106
|
+
outDegree: 0,
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
snapshot.edges.forEach((rawEdge, index) => {
|
|
110
|
+
if (!rawEdge || typeof rawEdge !== 'object' || Array.isArray(rawEdge)) {
|
|
111
|
+
throw new Error(`Graph snapshot edge at index ${index} must be an object.`);
|
|
112
|
+
}
|
|
113
|
+
const edge = rawEdge;
|
|
114
|
+
if (typeof edge.source !== 'string' || typeof edge.target !== 'string') {
|
|
115
|
+
throw new Error(`Graph snapshot edge at index ${index} requires source and target ids.`);
|
|
116
|
+
}
|
|
117
|
+
if (!graph.hasNode(edge.source) || !graph.hasNode(edge.target)) {
|
|
118
|
+
throw new Error(`Graph snapshot edge at index ${index} references an undeclared node: ${edge.source} -> ${edge.target}.`);
|
|
119
|
+
}
|
|
120
|
+
graph.addEdge(edge.source, edge.target, edge.type, edge.weight);
|
|
121
|
+
});
|
|
122
|
+
return graph;
|
|
123
|
+
}
|
|
124
|
+
/** Restore this instance atomically from a legacy or current JSON snapshot. */
|
|
125
|
+
restore(data) {
|
|
126
|
+
const restored = Graph.fromJSON(data);
|
|
127
|
+
this.nodes = restored.nodes;
|
|
128
|
+
this.adjacencyList = restored.adjacencyList;
|
|
129
|
+
this.reverseAdjacencyList = restored.reverseAdjacencyList;
|
|
130
|
+
this.aliases = restored.aliases;
|
|
131
|
+
}
|
|
132
|
+
resolveNodeId(reference) {
|
|
133
|
+
if (this.nodes.has(reference)) {
|
|
134
|
+
return reference;
|
|
135
|
+
}
|
|
136
|
+
return this.aliases.get((0, normalizeResourceReference)(reference));
|
|
36
137
|
}
|
|
37
138
|
/**
|
|
38
139
|
* Retrieves a node by its ID.
|
|
@@ -40,16 +141,17 @@ class Graph {
|
|
|
40
141
|
* @param id The node ID | 节点 ID
|
|
41
142
|
* @returns The node or undefined if not found | 节点,如果未找到则返回 undefined
|
|
42
143
|
*/
|
|
43
|
-
getNode(
|
|
44
|
-
|
|
144
|
+
getNode(reference) {
|
|
145
|
+
const nodeId = this.resolveNodeId(reference);
|
|
146
|
+
return nodeId ? this.nodes.get(nodeId) : undefined;
|
|
45
147
|
}
|
|
46
148
|
/**
|
|
47
149
|
* Checks if a node exists in the graph.
|
|
48
150
|
* 检查图中是否存在该节点。
|
|
49
151
|
* @param id The node ID | 节点 ID
|
|
50
152
|
*/
|
|
51
|
-
hasNode(
|
|
52
|
-
return this.
|
|
153
|
+
hasNode(reference) {
|
|
154
|
+
return this.resolveNodeId(reference) !== undefined;
|
|
53
155
|
}
|
|
54
156
|
/**
|
|
55
157
|
* Adds a directed edge between two nodes.
|
|
@@ -60,30 +162,32 @@ class Graph {
|
|
|
60
162
|
* @param weight Edge weight (confidence) | 边权重 (置信度)
|
|
61
163
|
*/
|
|
62
164
|
addEdge(source, target, type = 'dependency', weight = 1) {
|
|
63
|
-
|
|
64
|
-
|
|
165
|
+
const sourceId = this.resolveNodeId(source) ?? source;
|
|
166
|
+
const targetId = this.resolveNodeId(target) ?? target;
|
|
167
|
+
if (!this.nodes.has(sourceId)) {
|
|
168
|
+
this.addNode({ id: sourceId, label: sourceId, inDegree: 0, outDegree: 0 });
|
|
65
169
|
}
|
|
66
|
-
if (!this.nodes.has(
|
|
67
|
-
this.addNode({ id:
|
|
170
|
+
if (!this.nodes.has(targetId)) {
|
|
171
|
+
this.addNode({ id: targetId, label: targetId, inDegree: 0, outDegree: 0 });
|
|
68
172
|
}
|
|
69
|
-
const edge = { source, target, type, weight };
|
|
173
|
+
const edge = { source: sourceId, target: targetId, type, weight };
|
|
70
174
|
// Add to adjacency list (outgoing)
|
|
71
|
-
const outgoing = this.adjacencyList.get(
|
|
175
|
+
const outgoing = this.adjacencyList.get(sourceId) || [];
|
|
72
176
|
// Prevent duplicate edges
|
|
73
|
-
if (!outgoing.some(e => e.target ===
|
|
177
|
+
if (!outgoing.some(e => e.target === targetId && e.type === type)) {
|
|
74
178
|
outgoing.push(edge);
|
|
75
|
-
this.adjacencyList.set(
|
|
179
|
+
this.adjacencyList.set(sourceId, outgoing);
|
|
76
180
|
// Update out-degree
|
|
77
|
-
const sourceNode = this.nodes.get(
|
|
181
|
+
const sourceNode = this.nodes.get(sourceId);
|
|
78
182
|
sourceNode.outDegree++;
|
|
79
183
|
}
|
|
80
184
|
// Add to reverse adjacency list (incoming)
|
|
81
|
-
const incoming = this.reverseAdjacencyList.get(
|
|
82
|
-
if (!incoming.some(e => e.source ===
|
|
185
|
+
const incoming = this.reverseAdjacencyList.get(targetId) || [];
|
|
186
|
+
if (!incoming.some(e => e.source === sourceId && e.type === type)) {
|
|
83
187
|
incoming.push(edge);
|
|
84
|
-
this.reverseAdjacencyList.set(
|
|
188
|
+
this.reverseAdjacencyList.set(targetId, incoming);
|
|
85
189
|
// Update in-degree
|
|
86
|
-
const targetNode = this.nodes.get(
|
|
190
|
+
const targetNode = this.nodes.get(targetId);
|
|
87
191
|
targetNode.inDegree++;
|
|
88
192
|
}
|
|
89
193
|
}
|
|
@@ -92,16 +196,17 @@ class Graph {
|
|
|
92
196
|
* 获取节点的所有出边。
|
|
93
197
|
* @param id Node ID | 节点 ID
|
|
94
198
|
*/
|
|
95
|
-
getOutgoingEdges(
|
|
96
|
-
|
|
199
|
+
getOutgoingEdges(reference) {
|
|
200
|
+
const nodeId = this.resolveNodeId(reference);
|
|
201
|
+
return nodeId ? (this.adjacencyList.get(nodeId) || []) : [];
|
|
97
202
|
}
|
|
98
203
|
/**
|
|
99
204
|
* Gets all outgoing neighbor IDs for a node.
|
|
100
205
|
* 获取节点的所有出度邻居 ID。
|
|
101
206
|
* @param id Node ID | 节点 ID
|
|
102
207
|
*/
|
|
103
|
-
getNeighbors(
|
|
104
|
-
return
|
|
208
|
+
getNeighbors(reference) {
|
|
209
|
+
return this.getOutgoingEdges(reference).map(edge => edge.target);
|
|
105
210
|
}
|
|
106
211
|
/**
|
|
107
212
|
* Gets all nodes in the graph.
|
|
@@ -122,8 +227,9 @@ class Graph {
|
|
|
122
227
|
* 获取节点的所有入边。
|
|
123
228
|
* @param id Node ID | 节点 ID
|
|
124
229
|
*/
|
|
125
|
-
getIncomingEdges(
|
|
126
|
-
|
|
230
|
+
getIncomingEdges(reference) {
|
|
231
|
+
const nodeId = this.resolveNodeId(reference);
|
|
232
|
+
return nodeId ? (this.reverseAdjacencyList.get(nodeId) || []) : [];
|
|
127
233
|
}
|
|
128
234
|
/**
|
|
129
235
|
* Returns the graph data in a serializable format.
|
|
@@ -140,11 +246,14 @@ class Graph {
|
|
|
140
246
|
* 获取所有前驱节点(入边的传递闭包)。
|
|
141
247
|
* @param id Target node ID
|
|
142
248
|
*/
|
|
143
|
-
getPredecessors(
|
|
249
|
+
getPredecessors(reference) {
|
|
144
250
|
const predecessors = new Set();
|
|
145
|
-
const
|
|
251
|
+
const nodeId = this.resolveNodeId(reference);
|
|
252
|
+
if (!nodeId)
|
|
253
|
+
return predecessors;
|
|
254
|
+
const queue = [nodeId];
|
|
146
255
|
const visited = new Set();
|
|
147
|
-
visited.add(
|
|
256
|
+
visited.add(nodeId);
|
|
148
257
|
while (queue.length > 0) {
|
|
149
258
|
const current = queue.shift();
|
|
150
259
|
const incoming = this.getIncomingEdges(current);
|
|
@@ -163,11 +272,14 @@ class Graph {
|
|
|
163
272
|
* 获取所有后继节点(出边的传递闭包)。
|
|
164
273
|
* @param id Source node ID
|
|
165
274
|
*/
|
|
166
|
-
getSuccessors(
|
|
275
|
+
getSuccessors(reference) {
|
|
167
276
|
const successors = new Set();
|
|
168
|
-
const
|
|
277
|
+
const nodeId = this.resolveNodeId(reference);
|
|
278
|
+
if (!nodeId)
|
|
279
|
+
return successors;
|
|
280
|
+
const queue = [nodeId];
|
|
169
281
|
const visited = new Set();
|
|
170
|
-
visited.add(
|
|
282
|
+
visited.add(nodeId);
|
|
171
283
|
while (queue.length > 0) {
|
|
172
284
|
const current = queue.shift();
|
|
173
285
|
const outgoing = this.getOutgoingEdges(current);
|
|
@@ -189,15 +301,19 @@ class Graph {
|
|
|
189
301
|
* @returns Array of node IDs representing the path, or empty if no path found
|
|
190
302
|
*/
|
|
191
303
|
getShortestPath(source, target) {
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
304
|
+
const sourceId = this.resolveNodeId(source);
|
|
305
|
+
const targetId = this.resolveNodeId(target);
|
|
306
|
+
if (!sourceId || !targetId)
|
|
307
|
+
return [];
|
|
308
|
+
if (sourceId === targetId)
|
|
309
|
+
return [sourceId];
|
|
310
|
+
const queue = [sourceId];
|
|
195
311
|
const visited = new Set();
|
|
196
312
|
const parent = new Map();
|
|
197
|
-
visited.add(
|
|
313
|
+
visited.add(sourceId);
|
|
198
314
|
while (queue.length > 0) {
|
|
199
315
|
const current = queue.shift();
|
|
200
|
-
if (current ===
|
|
316
|
+
if (current === targetId)
|
|
201
317
|
break;
|
|
202
318
|
const neighbors = this.getNeighbors(current);
|
|
203
319
|
for (const neighbor of neighbors) {
|
|
@@ -208,12 +324,12 @@ class Graph {
|
|
|
208
324
|
}
|
|
209
325
|
}
|
|
210
326
|
}
|
|
211
|
-
if (!visited.has(
|
|
327
|
+
if (!visited.has(targetId))
|
|
212
328
|
return [];
|
|
213
329
|
// Reconstruct path
|
|
214
|
-
const path = [
|
|
215
|
-
let curr =
|
|
216
|
-
while (curr !==
|
|
330
|
+
const path = [targetId];
|
|
331
|
+
let curr = targetId;
|
|
332
|
+
while (curr !== sourceId) {
|
|
217
333
|
curr = parent.get(curr);
|
|
218
334
|
path.unshift(curr);
|
|
219
335
|
}
|