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.
Files changed (328) hide show
  1. package/LICENSE +674 -21
  2. package/README.md +260 -1626
  3. package/dist/src/agent_workspace.contract.parity.test.js +159 -0
  4. package/dist/src/agent_workspace.frontend.test.js +10388 -0
  5. package/dist/src/agent_workspace.locale.contract.test.js +95 -0
  6. package/dist/src/agent_workspace.runtime.behavior.test.js +5072 -0
  7. package/dist/src/android.knowledgebase.picker.contract.test.js +102 -0
  8. package/dist/src/appimage.patchelf.test.js +113 -0
  9. package/dist/src/appimage.portability.test.js +156 -0
  10. package/dist/src/backend/FileLoader.js +18 -4
  11. package/dist/src/backend/FileLoader.test.js +125 -0
  12. package/dist/src/backend/GraphBuilder.identity.test.js +86 -0
  13. package/dist/src/backend/GraphBuilder.js +66 -18
  14. package/dist/src/backend/GraphBuilder.matching.test.js +127 -0
  15. package/dist/src/backend/GraphMetrics.js +0 -3
  16. package/dist/src/backend/ResourceIdentity.js +155 -0
  17. package/dist/src/backend/ResourceIdentity.test.js +113 -0
  18. package/dist/src/backend/algorithms/CycleDetection.js +0 -1
  19. package/dist/src/backend/algorithms/HybridEngine.js +0 -3
  20. package/dist/src/backend/algorithms/LayoutEngine.js +0 -1
  21. package/dist/src/backend/algorithms/StatisticalAnalyzer.js +0 -4
  22. package/dist/src/backend/algorithms/TopologicalSort.js +0 -2
  23. package/dist/src/backend/build_dag.js +0 -1
  24. package/dist/src/capacitor.bridge.serialization.contract.test.js +3 -0
  25. package/dist/src/capacitor.runtime.contract.test.js +11 -2
  26. package/dist/src/copy.assets.contract.test.js +130 -0
  27. package/dist/src/core/Graph.js +138 -42
  28. package/dist/src/core/Graph.test.js +74 -0
  29. package/dist/src/core/NoteConnection.js +2 -2
  30. package/dist/src/core/PathBridge.js +293 -5
  31. package/dist/src/core/ResourceReference.js +17 -0
  32. package/dist/src/desktop.godot.pack.test.js +142 -0
  33. package/dist/src/desktop.runtime.graph.test.js +66 -0
  34. package/dist/src/export/WorkspaceExportBundle.js +1174 -0
  35. package/dist/src/export/WorkspaceExportBundle.test.js +1541 -0
  36. package/dist/src/export/index.js +18 -0
  37. package/dist/src/export/types.js +2 -0
  38. package/dist/src/fixrisk.issue.verifier.contract.test.js +3 -1
  39. package/dist/src/foundation.ann.runtime.contract.test.js +81 -0
  40. package/dist/src/foundation.release.evidence.contract.test.js +524 -0
  41. package/dist/src/foundation.sqlite.runtime.contract.test.js +88 -0
  42. package/dist/src/frontend/README.md +260 -1626
  43. package/dist/src/frontend/agent_workspace.js +6011 -0
  44. package/dist/src/frontend/agent_workspace_runtime.js +4434 -0
  45. package/dist/src/frontend/analysis.js +31 -4
  46. package/dist/src/frontend/app.js +2178 -62
  47. package/dist/src/frontend/focus_mode_interactions.js +33 -0
  48. package/dist/src/frontend/godot_future_path_renderer.js +540 -0
  49. package/dist/src/frontend/godot_tree_interactions.js +178 -0
  50. package/dist/src/frontend/graph_state.mjs +105 -0
  51. package/dist/src/frontend/hosted_future_path_runtime.js +157 -0
  52. package/dist/src/frontend/i18n.mjs +186 -0
  53. package/dist/src/frontend/index.html +672 -268
  54. package/dist/src/frontend/knowledge_projection_contract.js +230 -0
  55. package/dist/src/frontend/knowledge_projection_store.js +214 -0
  56. package/dist/src/frontend/layout_gpu.js +12 -4
  57. package/dist/src/frontend/libs/path_core.js +158 -42
  58. package/dist/src/frontend/locales/en.json +753 -5
  59. package/dist/src/frontend/locales/zh.json +753 -5
  60. package/dist/src/frontend/main.mjs +60 -0
  61. package/dist/src/frontend/markdown_runtime.js +827 -0
  62. package/dist/src/frontend/mobile_budget_runtime.js +33 -0
  63. package/dist/src/frontend/mobile_exact_analyzer.js +393 -0
  64. package/dist/src/frontend/mobile_identity_contract.js +221 -0
  65. package/dist/src/frontend/mobile_semantic_comparator.js +264 -0
  66. package/dist/src/frontend/notemd.css +49 -0
  67. package/dist/src/frontend/notemd.html +7 -1
  68. package/dist/src/frontend/notemd.js +64 -0
  69. package/dist/src/frontend/path.html +113 -2
  70. package/dist/src/frontend/path_app.js +2108 -130
  71. package/dist/src/frontend/path_layout.mjs +143 -0
  72. package/dist/src/frontend/path_mermaid_utils.mjs +108 -0
  73. package/dist/src/frontend/path_modules_bridge.js +486 -0
  74. package/dist/src/frontend/path_state.mjs +118 -0
  75. package/dist/src/frontend/path_styles.css +146 -0
  76. package/dist/src/frontend/path_worker_bridge.mjs +85 -0
  77. package/dist/src/frontend/reader.js +393 -33
  78. package/dist/src/frontend/runtime_bridge.js +67 -54
  79. package/dist/src/frontend/runtime_bridge.mjs +279 -0
  80. package/dist/src/frontend/settings.js +130 -12
  81. package/dist/src/frontend/simulationWorker.js +1 -1
  82. package/dist/src/frontend/source_manager.js +297 -22
  83. package/dist/src/frontend/storage_provider.js +661 -71
  84. package/dist/src/frontend/styles.css +2814 -72
  85. package/dist/src/frontend/workbench_state.mjs +101 -0
  86. package/dist/src/frontend/workspace_panes.js +10272 -0
  87. package/dist/src/frontend.locale.contract.test.js +62 -0
  88. package/dist/src/frontend.runtime.assets.contract.test.js +81 -0
  89. package/dist/src/godot.sidecar.bootstrap.contract.test.js +244 -0
  90. package/dist/src/graph.answer.operator.contract.test.js +72 -0
  91. package/dist/src/index.js +6 -2
  92. package/dist/src/index.knowledge-root.test.js +118 -0
  93. package/dist/src/indexing/IndexLifecycle.js +217 -0
  94. package/dist/src/indexing/IndexLifecycle.test.js +73 -0
  95. package/dist/src/indexing/SegmentBuilder.js +64 -0
  96. package/dist/src/indexing/UnitBuilder.js +48 -0
  97. package/dist/src/indexing/types.js +2 -0
  98. package/dist/src/knowledge.api.contract.test.js +172 -0
  99. package/dist/src/knowledge_projection.contract.test.js +134 -0
  100. package/dist/src/knowledge_projection_store.test.js +200 -0
  101. package/dist/src/learning/AnswerQualityEvaluation.js +153 -0
  102. package/dist/src/learning/AnswerQualityEvaluation.test.js +118 -0
  103. package/dist/src/learning/KnowledgeLearningPlatform.js +11181 -0
  104. package/dist/src/learning/KnowledgeLearningPlatform.persistence.test.js +745 -0
  105. package/dist/src/learning/KnowledgeLearningPlatform.program-f.test.js +99 -0
  106. package/dist/src/learning/KnowledgeLearningPlatform.test.js +3208 -0
  107. package/dist/src/learning/KnowledgeWorkspaceConversationRegression.js +2998 -0
  108. package/dist/src/learning/KnowledgeWorkspaceConversationRegression.test.js +3936 -0
  109. package/dist/src/learning/MeasurementEvidenceConflicts.test.js +78 -0
  110. package/dist/src/learning/PublicAnswerContract.test.js +85 -0
  111. package/dist/src/learning/PublicEvidenceSelection.test.js +94 -0
  112. package/dist/src/learning/PublicMeasurementDisclosure.test.js +54 -0
  113. package/dist/src/learning/agentConversationExecution.js +211 -0
  114. package/dist/src/learning/agentConversationExecution.test.js +209 -0
  115. package/dist/src/learning/agentConversationSerialization.js +266 -0
  116. package/dist/src/learning/agentConversationSerialization.test.js +165 -0
  117. package/dist/src/learning/agentResponseBudget.js +179 -0
  118. package/dist/src/learning/agentResponseBudget.test.js +97 -0
  119. package/dist/src/learning/agentWorkspaceCapabilityContracts.js +65 -0
  120. package/dist/src/learning/answerReleaseReview.js +5260 -0
  121. package/dist/src/learning/answerReleaseReview.test.js +4174 -0
  122. package/dist/src/learning/answerTaskPlan.js +473 -0
  123. package/dist/src/learning/api.js +2 -0
  124. package/dist/src/learning/conversationComposer.js +1721 -0
  125. package/dist/src/learning/conversationComposer.test.js +3220 -0
  126. package/dist/src/learning/domains/ConversationManager.js +53 -0
  127. package/dist/src/learning/domains/KnowledgeIngestor.js +238 -0
  128. package/dist/src/learning/domains/KnowledgeQuerier.js +187 -0
  129. package/dist/src/learning/domains/MasteryEngine.js +387 -0
  130. package/dist/src/learning/domains/MemoryPolicyManager.js +408 -0
  131. package/dist/src/learning/domains/QualityEvaluator.js +307 -0
  132. package/dist/src/learning/domains/TutorRouter.js +313 -0
  133. package/dist/src/learning/domains/index.js +33 -0
  134. package/dist/src/learning/domains/types.js +7 -0
  135. package/dist/src/learning/errors.js +29 -0
  136. package/dist/src/learning/evidenceContextAssembler.js +1368 -0
  137. package/dist/src/learning/evidenceContextAssembler.test.js +6332 -0
  138. package/dist/src/learning/graphAnswerCoverage.js +37 -0
  139. package/dist/src/learning/graphAnswerCoverage.test.js +93 -0
  140. package/dist/src/learning/graphAnswerCoverageCalibration.js +59 -0
  141. package/dist/src/learning/graphAnswerCoverageCalibration.test.js +46 -0
  142. package/dist/src/learning/graphAnswerFacts.js +94 -0
  143. package/dist/src/learning/graphAnswerFacts.test.js +39 -0
  144. package/dist/src/learning/graphAnswerPlan.js +908 -0
  145. package/dist/src/learning/graphAnswerPlan.test.js +907 -0
  146. package/dist/src/learning/graphAnswerQualityCalibration.js +255 -0
  147. package/dist/src/learning/graphAnswerQualityCalibration.test.js +72 -0
  148. package/dist/src/learning/graphAnswerQualityPolicy.js +30 -0
  149. package/dist/src/learning/graphClaimMatcher.js +104 -0
  150. package/dist/src/learning/graphConditionedContext.js +109 -0
  151. package/dist/src/learning/graphConditionedContext.test.js +99 -0
  152. package/dist/src/learning/graphContextAssembler.js +860 -0
  153. package/dist/src/learning/graphContextAssembler.test.js +1033 -0
  154. package/dist/src/learning/graphExpansionPolicy.js +22 -0
  155. package/dist/src/learning/graphExpansionPolicy.test.js +33 -0
  156. package/dist/src/learning/identityMetadata.test.js +26 -0
  157. package/dist/src/learning/index.js +29 -0
  158. package/dist/src/learning/mobileAnswerProjection.js +104 -0
  159. package/dist/src/learning/mobileAnswerProjection.test.js +102 -0
  160. package/dist/src/learning/queryBackend.js +1922 -0
  161. package/dist/src/learning/queryBackend.test.js +976 -0
  162. package/dist/src/learning/ragContextPack.js +356 -0
  163. package/dist/src/learning/ragContextPack.test.js +311 -0
  164. package/dist/src/learning/ragEvidenceQuality.js +96 -0
  165. package/dist/src/learning/ragEvidenceQuality.test.js +29 -0
  166. package/dist/src/learning/ragPublicText.js +101 -0
  167. package/dist/src/learning/ragPublicText.test.js +57 -0
  168. package/dist/src/learning/ragSufficiencyJudge.js +171 -0
  169. package/dist/src/learning/ragSufficiencyJudge.test.js +177 -0
  170. package/dist/src/learning/ragSufficiencyProviderJudge.js +217 -0
  171. package/dist/src/learning/ragSufficiencyProviderJudge.test.js +207 -0
  172. package/dist/src/learning/requestNormalization.js +304 -0
  173. package/dist/src/learning/requestNormalization.test.js +101 -0
  174. package/dist/src/learning/runtimeCapability.js +4677 -0
  175. package/dist/src/learning/runtimeCapability.test.js +3635 -0
  176. package/dist/src/learning/store.js +1344 -0
  177. package/dist/src/learning/store.test.js +1425 -0
  178. package/dist/src/learning/tutorAdapter.js +2 -0
  179. package/dist/src/learning/types.js +2 -0
  180. package/dist/src/learning/vectorAccelerationAdapter.js +958 -0
  181. package/dist/src/learning/vectorAccelerationAdapter.test.js +412 -0
  182. package/dist/src/learning/workspaceHydration.js +168 -0
  183. package/dist/src/learning/workspaceHydration.test.js +30 -0
  184. package/dist/src/lfs.asset.policy.contract.test.js +153 -0
  185. package/dist/src/license.policy.contract.test.js +71 -0
  186. package/dist/src/markdown/MarkdownGateway.js +4 -0
  187. package/dist/src/markdown/MarkdownGateway.test.js +59 -0
  188. package/dist/src/memory/MemoryGovernance.js +74 -0
  189. package/dist/src/memory/MemoryGovernance.test.js +46 -0
  190. package/dist/src/memory/types.js +2 -0
  191. package/dist/src/mermaid.frontend.guard.contract.test.js +77 -0
  192. package/dist/src/middleware/SseResponseWriter.js +122 -0
  193. package/dist/src/middleware/SseResponseWriter.test.js +54 -0
  194. package/dist/src/middleware/auth.js +38 -0
  195. package/dist/src/middleware/auth.test.js +33 -0
  196. package/dist/src/middleware/body-parser.js +45 -0
  197. package/dist/src/middleware/cors.js +44 -0
  198. package/dist/src/middleware/index.js +22 -0
  199. package/dist/src/middleware/request-trace.js +96 -0
  200. package/dist/src/mobile.android.evidence.contract.test.js +146 -0
  201. package/dist/src/mobile.android.signing.contract.test.js +66 -0
  202. package/dist/src/mobile.artifact.contract.test.js +144 -0
  203. package/dist/src/mobile.budget.contract.test.js +90 -0
  204. package/dist/src/mobile.canonical-id.readiness.test.js +54 -0
  205. package/dist/src/mobile.graph.parity.contract.test.js +207 -0
  206. package/dist/src/mobile.identity.contract.test.js +66 -0
  207. package/dist/src/mobile.identity.corpus.manifest.test.js +72 -0
  208. package/dist/src/mobile.identity.corpus.test.js +40 -0
  209. package/dist/src/mobile.native.recovery.contract.test.js +64 -0
  210. package/dist/src/mobile.pipeline.test.js +11 -1
  211. package/dist/src/mobile.profile.contract.test.js +225 -0
  212. package/dist/src/mobile.semantic.parity.test.js +92 -0
  213. package/dist/src/mobile_exact_analyzer.test.js +113 -0
  214. package/dist/src/notemd/AppConfigToml.js +6 -4
  215. package/dist/src/notemd/ContentGenerator.js +4 -9
  216. package/dist/src/notemd/FileProcessor.js +4 -9
  217. package/dist/src/notemd/MermaidProcessor.js +400 -50
  218. package/dist/src/notemd/NotemdService.js +506 -26
  219. package/dist/src/notemd/PromptManager.js +15 -0
  220. package/dist/src/notemd/Translator.js +4 -9
  221. package/dist/src/notemd/cli/commands.js +357 -0
  222. package/dist/src/notemd/cli/dispatcher.js +225 -0
  223. package/dist/src/notemd/cli/index.js +169 -0
  224. package/dist/src/notemd/cli/parser.js +68 -0
  225. package/dist/src/notemd/cli/types.js +2 -0
  226. package/dist/src/notemd/constants.js +43 -0
  227. package/dist/src/notemd/diagram/diagramGenerationService.js +78 -0
  228. package/dist/src/notemd/diagram/diagramSpec.js +79 -0
  229. package/dist/src/notemd/diagram/diagramSpecResponseParser.js +131 -0
  230. package/dist/src/notemd/diagram/intent.js +95 -0
  231. package/dist/src/notemd/diagram/planner.js +71 -0
  232. package/dist/src/notemd/diagram/prompts/diagramSpecPrompt.js +42 -0
  233. package/dist/src/notemd/diagram/types.js +18 -0
  234. package/dist/src/notemd/index.js +26 -0
  235. package/dist/src/notemd/operations/capabilityManifest.js +23 -0
  236. package/dist/src/notemd/operations/cliContracts.js +17 -0
  237. package/dist/src/notemd/operations/configProfileCommands.js +85 -0
  238. package/dist/src/notemd/operations/registry.contract.test.js +95 -0
  239. package/dist/src/notemd/operations/registry.js +991 -0
  240. package/dist/src/notemd/operations/types.js +2 -0
  241. package/dist/src/notemd/progressReporter.js +9 -0
  242. package/dist/src/notemd/providerDiagnostics.js +220 -0
  243. package/dist/src/notemd/providerProfiles.js +42 -0
  244. package/dist/src/notemd/providerTemplates.js +231 -0
  245. package/dist/src/notemd/search/DuckDuckGoProvider.js +39 -0
  246. package/dist/src/notemd/search/SearchManager.js +13 -0
  247. package/dist/src/notemd/search/SearchProvider.js +2 -0
  248. package/dist/src/notemd/search/TavilyProvider.js +44 -0
  249. package/dist/src/notemd.agent.manifest.test.js +85 -0
  250. package/dist/src/notemd.api.contract.test.js +14 -1
  251. package/dist/src/notemd.app_config_toml.test.js +2 -1
  252. package/dist/src/notemd.batch.workflow.test.js +117 -0
  253. package/dist/src/notemd.cli.e2e.test.js +136 -0
  254. package/dist/src/notemd.core.test.js +51 -0
  255. package/dist/src/notemd.diagram.pipeline.test.js +233 -0
  256. package/dist/src/notemd.providerTemplates.test.js +34 -0
  257. package/dist/src/notemd.server.integration.test.js +262 -39
  258. package/dist/src/notemd.workflow.pipeline.test.js +162 -0
  259. package/dist/src/pathbridge.handshake.contract.test.js +45 -2
  260. package/dist/src/pathbridge.host-adapter.contract.test.js +133 -0
  261. package/dist/src/pathcore.bundle.contract.test.js +8 -0
  262. package/dist/src/pathmode.background.contract.test.js +69 -0
  263. package/dist/src/pathmode.settings.api.contract.test.js +9 -0
  264. package/dist/src/pkg.sidecar.contract.test.js +9 -3
  265. package/dist/src/platform/ExportProfile.js +86 -0
  266. package/dist/src/platform/MobileBudget.js +11 -0
  267. package/dist/src/platform/PlatformCapabilities.js +59 -0
  268. package/dist/src/platform/PlatformCapabilities.test.js +36 -0
  269. package/dist/src/platform/RenderMaterializer.js +33 -0
  270. package/dist/src/platform/RenderMaterializer.test.js +32 -0
  271. package/dist/src/query_backend.external_http.integration.test.js +410 -0
  272. package/dist/src/reader_renderer.js +404 -3
  273. package/dist/src/reader_renderer.test.js +87 -0
  274. package/dist/src/release.godot.mirror.contract.test.js +97 -0
  275. package/dist/src/resources/ResourceRegistry.js +263 -0
  276. package/dist/src/resources/ResourceRegistry.test.js +97 -0
  277. package/dist/src/resources/types.js +2 -0
  278. package/dist/src/routes/agentWorkspaceDiagnostics.js +173 -0
  279. package/dist/src/routes/index.js +19 -0
  280. package/dist/src/routes/knowledge.js +981 -0
  281. package/dist/src/routes/knowledgePayload.js +185 -0
  282. package/dist/src/routes/knowledgePayload.test.js +53 -0
  283. package/dist/src/routes/markdown.js +295 -0
  284. package/dist/src/routes/notemd.js +1321 -0
  285. package/dist/src/routes/registry.contract.test.js +133 -0
  286. package/dist/src/routes/registry.shadow.contract.test.js +22 -0
  287. package/dist/src/routes/render.js +248 -0
  288. package/dist/src/routes/runtimeRunbookRouteOps.js +149 -0
  289. package/dist/src/routes/runtimeRunbookRouteOps.test.js +194 -0
  290. package/dist/src/routes/settings.js +6 -0
  291. package/dist/src/routes/staticFiles.js +94 -0
  292. package/dist/src/routes/types.js +2 -0
  293. package/dist/src/runtime.capabilities.test.js +18 -2
  294. package/dist/src/runtime.transport.adapter.contract.test.js +81 -0
  295. package/dist/src/server.js +10342 -1325
  296. package/dist/src/server.migration.test.js +584 -10
  297. package/dist/src/server.port.fallback.contract.test.js +63 -0
  298. package/dist/src/session/SessionStateStore.js +81 -0
  299. package/dist/src/session/SessionStateStore.test.js +58 -0
  300. package/dist/src/session/types.js +2 -0
  301. package/dist/src/settings.runtime.contract.test.js +50 -0
  302. package/dist/src/shared/types.contract.test.js +107 -0
  303. package/dist/src/shared/types.js +22 -0
  304. package/dist/src/sidecar.build.lock.contract.test.js +201 -0
  305. package/dist/src/sidecar.freshness.contract.test.js +184 -0
  306. package/dist/src/sidecar.replacement.boundary.contract.test.js +131 -0
  307. package/dist/src/sidecar.supply.readiness.contract.test.js +155 -0
  308. package/dist/src/simulation.worker.offline.test.js +104 -0
  309. package/dist/src/source_manager.loadflow.test.js +46 -0
  310. package/dist/src/startup.layout.snapshot.contract.test.js +57 -0
  311. package/dist/src/storage.provider.capacitor.content.contract.test.js +4 -1
  312. package/dist/src/storage.provider.contract.test.js +152 -1
  313. package/dist/src/tauri.frontend.build.contract.test.js +68 -0
  314. package/dist/src/tauri.sidecar.cleanup.contract.test.js +21 -0
  315. package/dist/src/tauri.window.evidence.execution.test.js +68 -0
  316. package/dist/src/utils/RuntimePaths.js +10 -13
  317. package/dist/src/utils/RuntimePaths.test.js +27 -0
  318. package/dist/src/utils/platform.js +153 -0
  319. package/dist/src/windows.installer.build.test.js +109 -0
  320. package/dist/src/windows.installer.payload.test.js +76 -0
  321. package/dist/src/windows.installer.runtime.test.js +69 -0
  322. package/dist/src/workflows/WorkflowArtifactStore.js +96 -0
  323. package/dist/src/workflows/WorkflowArtifactStore.test.js +80 -0
  324. package/dist/src/workflows/types.js +2 -0
  325. package/dist/src/workspace/WorkspaceRegistry.js +135 -0
  326. package/dist/src/workspace/WorkspaceRegistry.test.js +29 -0
  327. package/dist/src/workspace/types.js +2 -0
  328. 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 (!this.nodes.has(node.id)) {
32
- this.nodes.set(node.id, { ...node, inDegree: 0, outDegree: 0 });
33
- this.adjacencyList.set(node.id, []);
34
- this.reverseAdjacencyList.set(node.id, []);
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(id) {
44
- return this.nodes.get(id);
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(id) {
52
- return this.nodes.has(id);
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
- if (!this.nodes.has(source)) {
64
- this.addNode({ id: source, label: source, inDegree: 0, outDegree: 0 });
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(target)) {
67
- this.addNode({ id: target, label: target, inDegree: 0, outDegree: 0 });
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(source) || [];
175
+ const outgoing = this.adjacencyList.get(sourceId) || [];
72
176
  // Prevent duplicate edges
73
- if (!outgoing.some(e => e.target === target && e.type === type)) {
177
+ if (!outgoing.some(e => e.target === targetId && e.type === type)) {
74
178
  outgoing.push(edge);
75
- this.adjacencyList.set(source, outgoing);
179
+ this.adjacencyList.set(sourceId, outgoing);
76
180
  // Update out-degree
77
- const sourceNode = this.nodes.get(source);
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(target) || [];
82
- if (!incoming.some(e => e.source === source && e.type === type)) {
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(target, incoming);
188
+ this.reverseAdjacencyList.set(targetId, incoming);
85
189
  // Update in-degree
86
- const targetNode = this.nodes.get(target);
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(id) {
96
- return this.adjacencyList.get(id) || [];
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(id) {
104
- return (this.adjacencyList.get(id) || []).map(edge => edge.target);
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(id) {
126
- return this.reverseAdjacencyList.get(id) || [];
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(id) {
249
+ getPredecessors(reference) {
144
250
  const predecessors = new Set();
145
- const queue = [id];
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(id);
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(id) {
275
+ getSuccessors(reference) {
167
276
  const successors = new Set();
168
- const queue = [id];
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(id);
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
- if (source === target)
193
- return [source];
194
- const queue = [source];
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(source);
313
+ visited.add(sourceId);
198
314
  while (queue.length > 0) {
199
315
  const current = queue.shift();
200
- if (current === target)
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(target))
327
+ if (!visited.has(targetId))
212
328
  return [];
213
329
  // Reconstruct path
214
- const path = [target];
215
- let curr = target;
216
- while (curr !== source) {
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
  }