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
@@ -0,0 +1,473 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isComparisonRequest = isComparisonRequest;
4
+ exports.isProcedureRequest = isProcedureRequest;
5
+ exports.extractDefinitionQuerySubject = extractDefinitionQuerySubject;
6
+ exports.buildAnswerTaskPlan = buildAnswerTaskPlan;
7
+ exports.formatLearningRouteAnswer = formatLearningRouteAnswer;
8
+ exports.formatDisplayMathBlocks = formatDisplayMathBlocks;
9
+ exports.formatTaskAwareAnswer = formatTaskAwareAnswer;
10
+ exports.reviewAnswerTaskCoverage = reviewAnswerTaskCoverage;
11
+ function normalize(value) {
12
+ return String(value || '').replace(/\s+/gu, ' ').trim();
13
+ }
14
+ function compact(value) {
15
+ return normalize(value)
16
+ .replace(/[^\p{L}\p{N}]+/gu, '')
17
+ .toLowerCase();
18
+ }
19
+ function isDefinitionRequest(message) {
20
+ const normalized = normalize(message).toLowerCase();
21
+ return /\b(?:what\s+is|what'?s|what\s+are|define|definition\s+of|meaning\s+of|explain)\b/u.test(normalized)
22
+ || /什么是|何谓|定义|解释|介绍/u.test(normalized);
23
+ }
24
+ function isComparisonRequest(message) {
25
+ return /\b(?:compare|contrast|difference|versus|vs)\b|区别|区分|对比|比较/iu.test(message);
26
+ }
27
+ function isProcedureRequest(message) {
28
+ return /\b(?:how\s+(?:to|should|can|do)|steps?|procedure|procedural|workflow|runbook|sequence|plan)\b|如何|怎么|怎样|步骤|流程|方案/iu.test(message);
29
+ }
30
+ function isLearningRouteRequest(message) {
31
+ const normalized = normalize(message).toLowerCase();
32
+ return /\b(?:learn|learning|study|studying|knowledge\s+points?|learning\s+path|what\s+should\s+i\s+learn|which\s+concepts?)\b/u.test(normalized)
33
+ || /学习|知识点|学习路径|学哪些|先学|应该通过|如何学习|怎么学习/u.test(normalized);
34
+ }
35
+ function extractDefinitionQuerySubject(message) {
36
+ const normalized = normalize(message);
37
+ const match = normalized.match(/^(?:what\s+is|what'?s|what\s+are|who\s+is|define|definition\s+of|meaning\s+of|explain)\s+([^??!!。.,,;;::\n\r]+)/iu) || normalized.match(/^(?:什么是|何谓|指的是什么|定义(?:是什么)?|是什么意思|解释(?:一下)?|介绍(?:一下)?|请(?:解释|介绍)(?:一下)?)\s*([^??!!。.,,;;::\n\r]+)/u);
38
+ return normalize(match?.[1] || '')
39
+ .replace(/\s+according\s+to\s+(?:the\s+)?(?:(?:active|current|available|provided|cited)\s+)?(?:notes?|sources?|evidence|records?|documents?)\s*$/iu, '')
40
+ .replace(/\s+(?:and|as\s+well\s+as)\s+(?:what|which|how|why|when|where|who|its|their)\b.*$/iu, '')
41
+ .replace(/\s+(?:which|what|how|should|learn|study)\b.*$/iu, '')
42
+ .replace(/(?:我应该|应该通过|通过哪些|哪些知识点|如何学习|怎么学习|及其|以及它|以及其).*$/u, '')
43
+ .replace(/^(?:a|an|the)\s+/iu, '')
44
+ .replace(/[??!!。.,,;;]+$/gu, '')
45
+ .trim();
46
+ }
47
+ function extractSubject(message, fallbackTitle) {
48
+ const subject = extractDefinitionQuerySubject(message) || normalize(fallbackTitle);
49
+ const normalizedFallback = normalize(fallbackTitle);
50
+ return normalizedFallback && compact(subject) === compact(normalizedFallback)
51
+ ? normalizedFallback
52
+ : subject;
53
+ }
54
+ function resolveDepth(message) {
55
+ const normalized = normalize(message).toLowerCase();
56
+ if (/\b(?:deep|deeply|detailed|detail|comprehensive|in depth)\b/u.test(normalized)
57
+ || /深入|详细|全面|系统/u.test(normalized)) {
58
+ return 'deep';
59
+ }
60
+ if (/\b(?:brief|briefly|short|compact)\b/u.test(normalized)
61
+ || /简要|简短|概括/u.test(normalized)) {
62
+ return 'compact';
63
+ }
64
+ return 'standard';
65
+ }
66
+ function resolveExpectedOutput(kind) {
67
+ switch (kind) {
68
+ case 'learning_route':
69
+ return 'ordered_nodes';
70
+ case 'comparison':
71
+ return 'comparison_matrix';
72
+ case 'procedure':
73
+ case 'causal_explanation':
74
+ return 'steps';
75
+ default:
76
+ return 'direct_answer';
77
+ }
78
+ }
79
+ function inferRouteRole(title, text, isAnchor) {
80
+ if (isAnchor) {
81
+ return 'core';
82
+ }
83
+ const value = `${title} ${text}`.toLowerCase();
84
+ if (/prerequisite|foundation|basic|molecular|hydrogen|water\s+molecule|先修|前置|基础|基本|水分子|氢键/u.test(value)) {
85
+ return 'prerequisite';
86
+ }
87
+ if (/application|use case|performance|measurement|characteri[sz]ation|应用|用例|性能|表征/u.test(value)) {
88
+ return 'application';
89
+ }
90
+ if (/mechanism|formation|structure|radial|distribution|glass|transition|thermal|math|equation|机制|形成|结构|径向|分布|玻璃化|转变|热力学|数学|公式/u.test(value)) {
91
+ return 'mechanism';
92
+ }
93
+ return 'core';
94
+ }
95
+ function deriveLearningConceptTitle(title, text) {
96
+ const normalizedTitle = normalize(title);
97
+ const normalizedText = normalize(text);
98
+ const value = `${normalizedTitle} ${normalizedText}`.toLowerCase();
99
+ if (/(?:核心概念|核心结构|数学基础|key\s+concept|mathematical\s+basis)/iu.test(normalizedTitle)) {
100
+ return '核心结构与数学基础';
101
+ }
102
+ if (/radial\s+distribution\s+function/iu.test(normalizedTitle)) {
103
+ return normalizedTitle;
104
+ }
105
+ if (/(?:core|math|mathemat|数学|核心概念|径向分布|radial|rdf|g\s*\(r\))/u.test(value)) {
106
+ if (/径向分布|radial|rdf|g\s*\(r\)/u.test(value)) {
107
+ return /g\s*\(r\)/u.test(value) ? '径向分布函数 g(r)' : '径向分布函数(RDF)';
108
+ }
109
+ return '核心结构与数学基础';
110
+ }
111
+ if (/(?:technical|specification|density|形态|技术规格|密度|lda|hda|vhda)/u.test(value)) {
112
+ if (/lda|hda|vhda/u.test(value)) {
113
+ return 'LDA / HDA / VHDA 多非晶性';
114
+ }
115
+ return '密度与形态分类';
116
+ }
117
+ if (/(?:application|use\s*case|performance|应用|用例|性能|冷冻电子|cryo)/u.test(value)) {
118
+ return '实验表征与应用';
119
+ }
120
+ if (/(?:implementation|formation|pathway|制备|形成路径|形成方法|算法分析)/u.test(value)) {
121
+ return '形成路径与制备方法';
122
+ }
123
+ if (/(?:property|statistic|structure\s*factor|玻璃化|结构因子|统计度量|性能特征)/u.test(value)) {
124
+ return '结构因子与玻璃化转变';
125
+ }
126
+ return normalizedTitle;
127
+ }
128
+ function isRouteNoiseTitle(title) {
129
+ const normalized = normalize(title);
130
+ return !normalized
131
+ || /preamble|reference|bibliograph|table|mermaid|diagram|code\s+block|参考文献|参考资料|表格|比较模型|comparison model/u.test(normalized);
132
+ }
133
+ function appendMarkdownSectionCandidates(appendCandidate, text, atomId, evidenceRefs) {
134
+ const source = String(text || '').replace(/\r\n?/gu, '\n');
135
+ if (!/\n\s*#{1,6}\s+[^\n]+/u.test(source)) {
136
+ return;
137
+ }
138
+ const headings = Array.from(source.matchAll(/(?:^|\n)\s*#{1,6}\s+([^\n]+)\n?/gu))
139
+ .map((heading) => ({
140
+ ...heading,
141
+ 1: String(heading[1] || '').replace(/\s+#{1,6}\s+.*$/u, '').trim(),
142
+ }))
143
+ .filter((heading) => heading[1].length > 0 && heading[1].length <= 160);
144
+ if (headings.length <= 0) {
145
+ return;
146
+ }
147
+ headings.forEach((heading, index) => {
148
+ const title = normalize(String(heading[1] || ''));
149
+ const start = (heading.index || 0) + heading[0].length;
150
+ const end = index + 1 < headings.length
151
+ ? (headings[index + 1].index || source.length)
152
+ : source.length;
153
+ const sectionText = normalize(source.slice(start, end));
154
+ appendCandidate({
155
+ title,
156
+ text: sectionText,
157
+ atomId,
158
+ evidenceRefs,
159
+ orderingBasis: 'source_order',
160
+ });
161
+ });
162
+ }
163
+ function routeReason(role, title, orderingBasis) {
164
+ const basisNote = orderingBasis === 'explicit_prerequisite'
165
+ ? ''
166
+ : orderingBasis === 'explicit_sequence'
167
+ ? '(依据图谱中的显式顺序)'
168
+ : orderingBasis === 'source_order'
169
+ ? '(当前资料顺序,不代表显式前置关系)'
170
+ : '(按资料主题分组,不代表显式前置关系)';
171
+ switch (role) {
172
+ case 'prerequisite':
173
+ return `建立 ${title} 所需的前置概念${basisNote}。`;
174
+ case 'mechanism':
175
+ return `用 ${title} 解释目标概念的结构或形成机制${basisNote}。`;
176
+ case 'application':
177
+ return `用 ${title} 把概念连接到测量、性能或应用${basisNote}。`;
178
+ default:
179
+ return `先掌握 ${title} 的核心定义与边界${basisNote}。`;
180
+ }
181
+ }
182
+ function collectLearningRoute(params, subject) {
183
+ const subjectKey = compact(subject);
184
+ const candidates = [];
185
+ let sourceOrder = 0;
186
+ const appendCandidate = (candidate) => {
187
+ const rawTitle = normalize(candidate.title);
188
+ const rawKey = compact(rawTitle);
189
+ const isAnchorTitle = Boolean(rawKey && (rawKey === subjectKey
190
+ || rawKey.includes(subjectKey)
191
+ || subjectKey.includes(rawKey)));
192
+ const title = isAnchorTitle
193
+ ? rawTitle
194
+ : deriveLearningConceptTitle(rawTitle, candidate.text);
195
+ if (isRouteNoiseTitle(title)) {
196
+ return;
197
+ }
198
+ const key = compact(title);
199
+ if (!key || candidates.some((entry) => compact(entry.title) === key)) {
200
+ return;
201
+ }
202
+ const isAnchor = key === subjectKey || key.includes(subjectKey) || subjectKey.includes(key);
203
+ const evidenceRefs = Array.from(new Set((candidate.evidenceRefs || []).map(normalize).filter(Boolean)));
204
+ if (evidenceRefs.length <= 0 && candidate.atomId) {
205
+ evidenceRefs.push(`atom:${normalize(candidate.atomId)}`);
206
+ }
207
+ candidates.push({
208
+ title,
209
+ text: normalize(candidate.text),
210
+ atomId: normalize(String(candidate.atomId || '')) || undefined,
211
+ evidenceRefs,
212
+ role: candidate.role || inferRouteRole(title, candidate.text, isAnchor),
213
+ orderingBasis: candidate.orderingBasis || (candidate.relationKind === 'prerequisite'
214
+ ? 'explicit_prerequisite'
215
+ : candidate.relationKind === 'sequence'
216
+ ? 'explicit_sequence'
217
+ : 'semantic_grouping'),
218
+ sourceOrder: sourceOrder++,
219
+ });
220
+ };
221
+ params.knowledgePoints.forEach((point) => {
222
+ const pointEvidenceRefs = [
223
+ ...(point.citations || []).map((citation) => citation.citationId),
224
+ point.citation?.citationId || '',
225
+ ];
226
+ appendCandidate({
227
+ title: point.title,
228
+ text: point.summary || point.evidenceSnippet || '',
229
+ atomId: point.atomId,
230
+ evidenceRefs: pointEvidenceRefs,
231
+ orderingBasis: 'source_order',
232
+ });
233
+ appendMarkdownSectionCandidates(appendCandidate, point.summary || point.evidenceSnippet || '', point.atomId, pointEvidenceRefs);
234
+ (point.matchedSpans || []).forEach((span) => {
235
+ appendCandidate({
236
+ title: span.title,
237
+ text: span.snippet,
238
+ atomId: span.atomId,
239
+ evidenceRefs: [span.citation?.citationId || ''],
240
+ orderingBasis: 'source_order',
241
+ });
242
+ appendMarkdownSectionCandidates(appendCandidate, span.snippet, span.atomId, [span.citation?.citationId || '']);
243
+ });
244
+ });
245
+ (params.ragContextPack?.fragments || [])
246
+ .filter((fragment) => fragment.role !== 'background' && fragment.role !== 'conflict')
247
+ .forEach((fragment) => {
248
+ appendCandidate({
249
+ title: String(fragment.title || ''),
250
+ text: String(fragment.text || ''),
251
+ atomId: fragment.atomId,
252
+ evidenceRefs: Array.isArray(fragment.citationIds) ? fragment.citationIds : [],
253
+ orderingBasis: 'source_order',
254
+ });
255
+ appendMarkdownSectionCandidates(appendCandidate, String(fragment.text || ''), fragment.atomId, Array.isArray(fragment.citationIds) ? fragment.citationIds : []);
256
+ });
257
+ const graph = params.graphContext;
258
+ (graph?.predecessorWindow || []).forEach((node) => {
259
+ if (node.relationKind === 'prerequisite' || node.relationKind === 'sequence') {
260
+ appendCandidate({
261
+ title: node.title,
262
+ text: node.relationKind,
263
+ atomId: node.atomId,
264
+ evidenceRefs: [`edge:${node.atomId}:${node.relationKind}`],
265
+ role: 'prerequisite',
266
+ relationKind: node.relationKind,
267
+ });
268
+ }
269
+ });
270
+ (graph?.successorWindow || []).forEach((node) => {
271
+ if (node.relationKind === 'application' || node.relationKind === 'sequence') {
272
+ appendCandidate({
273
+ title: node.title,
274
+ text: node.relationKind,
275
+ atomId: node.atomId,
276
+ evidenceRefs: [`edge:${node.atomId}:${node.relationKind}`],
277
+ role: node.relationKind === 'application' ? 'application' : 'mechanism',
278
+ relationKind: node.relationKind,
279
+ });
280
+ }
281
+ });
282
+ const roleOrder = {
283
+ prerequisite: 10,
284
+ core: 20,
285
+ mechanism: 30,
286
+ application: 40,
287
+ };
288
+ return candidates
289
+ .sort((left, right) => (Number(right.orderingBasis === 'explicit_prerequisite') - Number(left.orderingBasis === 'explicit_prerequisite')
290
+ || Number(right.orderingBasis === 'explicit_sequence') - Number(left.orderingBasis === 'explicit_sequence')
291
+ || roleOrder[left.role] - roleOrder[right.role]
292
+ || left.sourceOrder - right.sourceOrder))
293
+ .slice(0, 8)
294
+ .map((candidate, index) => ({
295
+ nodeId: candidate.atomId
296
+ ? `${candidate.atomId}:${compact(candidate.title)}`
297
+ : `route_node_${index + 1}`,
298
+ title: candidate.title,
299
+ role: candidate.role,
300
+ order: index + 1,
301
+ orderingBasis: candidate.orderingBasis,
302
+ evidenceRefs: candidate.evidenceRefs,
303
+ reason: routeReason(candidate.role, candidate.title, candidate.orderingBasis),
304
+ }));
305
+ }
306
+ function buildSubtasks(message, subject) {
307
+ const subtasks = [];
308
+ const append = (kind, required = true) => {
309
+ if (subtasks.some((subtask) => subtask.kind === kind)) {
310
+ return;
311
+ }
312
+ subtasks.push({
313
+ subtaskId: kind,
314
+ kind,
315
+ subject,
316
+ required,
317
+ expectedOutput: resolveExpectedOutput(kind),
318
+ });
319
+ };
320
+ if (isDefinitionRequest(message)) {
321
+ append('definition');
322
+ }
323
+ if (isLearningRouteRequest(message)) {
324
+ append('learning_route');
325
+ }
326
+ if (subtasks.length <= 0) {
327
+ append('definition', false);
328
+ }
329
+ return subtasks;
330
+ }
331
+ function buildAnswerTaskPlan(params) {
332
+ const fallbackTitle = normalize(params.knowledgePoints[0]?.title || params.graphContext?.anchorTitle || '');
333
+ const primarySubject = extractSubject(params.message, fallbackTitle);
334
+ const subtasks = buildSubtasks(params.message, primarySubject);
335
+ const learningRoute = subtasks.some((subtask) => subtask.kind === 'learning_route')
336
+ ? collectLearningRoute(params, primarySubject)
337
+ : [];
338
+ return {
339
+ schemaVersion: '1',
340
+ primarySubject,
341
+ subtasks,
342
+ requestedDepth: resolveDepth(params.message),
343
+ learningRoute,
344
+ };
345
+ }
346
+ function routeRoleLabel(role, useChinese) {
347
+ if (useChinese) {
348
+ return {
349
+ prerequisite: '前置',
350
+ core: '核心',
351
+ mechanism: '机制',
352
+ application: '应用',
353
+ }[role];
354
+ }
355
+ return role;
356
+ }
357
+ function formatLearningRouteAnswer(plan, useChinese) {
358
+ const route = plan?.learningRoute || [];
359
+ if (route.length <= 0 || !plan?.subtasks.some((subtask) => subtask.kind === 'learning_route')) {
360
+ return '';
361
+ }
362
+ const heading = useChinese ? '### 建议学习路径' : '### Suggested learning path';
363
+ const items = route.map((node) => {
364
+ const title = normalize(node.title);
365
+ const role = routeRoleLabel(node.role, useChinese);
366
+ const reason = normalize(node.reason)
367
+ || routeReason(node.role, title, node.orderingBasis);
368
+ const label = useChinese ? `**${title}**(${role})` : `**${title}** (${role})`;
369
+ return `${node.order}. ${label}\n - ${reason}`;
370
+ });
371
+ return `${heading}\n\n${items.join('\n')}`;
372
+ }
373
+ function normalizeMarkdownLineEndings(value) {
374
+ return String(value || '').replace(/\r\n?/gu, '\n').trim();
375
+ }
376
+ /**
377
+ * Restores display-math block boundaries after evidence clauses have been
378
+ * normalized into prose. This is intentionally limited to compound task
379
+ * answers; legacy single-deliverable answers retain their existing surface.
380
+ */
381
+ function formatDisplayMathBlocks(value) {
382
+ const source = normalizeMarkdownLineEndings(value);
383
+ if (!source) {
384
+ return '';
385
+ }
386
+ const withBlockBoundaries = source.replace(/(?<!\\)\$\$([\s\S]*?)(?<!\\)\$\$/gu, (_match, expression) => {
387
+ const body = normalizeMarkdownLineEndings(expression);
388
+ return body ? `\n\n$$\n${body}\n$$\n\n` : '';
389
+ });
390
+ return withBlockBoundaries
391
+ .replace(/[ \t]+\n/gu, '\n')
392
+ .replace(/\n{3,}/gu, '\n\n')
393
+ .trim();
394
+ }
395
+ function formatTaskAwareAnswer(parts, plan, useChinese) {
396
+ const normalizedParts = parts
397
+ .map((part) => normalizeMarkdownLineEndings(part))
398
+ .filter(Boolean);
399
+ const hasLearningRoute = Boolean(plan?.subtasks.some((subtask) => subtask.kind === 'learning_route')
400
+ && plan.learningRoute.length > 0);
401
+ const joinedBody = normalizedParts.join(useChinese ? '' : ' ');
402
+ const body = /(?<!\\)\$\$/u.test(joinedBody)
403
+ ? formatDisplayMathBlocks(joinedBody)
404
+ : joinedBody;
405
+ if (!hasLearningRoute) {
406
+ return body;
407
+ }
408
+ const route = formatLearningRouteAnswer(plan, useChinese);
409
+ return [body, route].filter(Boolean).join('\n\n').trim();
410
+ }
411
+ function answerContainsSubject(answer, subject) {
412
+ const answerKey = compact(answer);
413
+ const subjectKey = compact(subject);
414
+ return Boolean(subjectKey && answerKey.includes(subjectKey));
415
+ }
416
+ function reviewAnswerTaskCoverage(answer, plan) {
417
+ const subtasks = plan?.subtasks || [];
418
+ if (subtasks.length <= 0) {
419
+ return {
420
+ passed: true,
421
+ applicable: false,
422
+ coveredSubtaskIds: [],
423
+ missingRequiredSubtaskIds: [],
424
+ subtaskCoverage: [],
425
+ learningRouteNodeCount: 0,
426
+ coverageScore: 1,
427
+ };
428
+ }
429
+ const route = plan?.learningRoute || [];
430
+ const routeNodeThreshold = Math.max(3, Math.min(5, route.length));
431
+ const routeTitleMatches = route.filter((node) => answerContainsSubject(answer, node.title)).length;
432
+ const coverage = subtasks.map((subtask) => {
433
+ if (subtask.kind === 'definition') {
434
+ const covered = answerContainsSubject(answer, subtask.subject) && normalize(answer).length >= 12;
435
+ return {
436
+ subtaskId: subtask.subtaskId,
437
+ kind: subtask.kind,
438
+ covered,
439
+ evidenceRefIds: [],
440
+ reason: covered ? undefined : 'definition_subject_missing',
441
+ };
442
+ }
443
+ if (subtask.kind === 'learning_route') {
444
+ const covered = route.length >= 3 && routeTitleMatches >= routeNodeThreshold;
445
+ return {
446
+ subtaskId: subtask.subtaskId,
447
+ kind: subtask.kind,
448
+ covered,
449
+ evidenceRefIds: route.flatMap((node) => node.evidenceRefs),
450
+ reason: covered ? undefined : 'learning_route_nodes_missing_or_unordered',
451
+ };
452
+ }
453
+ const covered = normalize(answer).length >= 12;
454
+ return {
455
+ subtaskId: subtask.subtaskId,
456
+ kind: subtask.kind,
457
+ covered,
458
+ evidenceRefIds: [],
459
+ reason: covered ? undefined : 'answer_empty',
460
+ };
461
+ });
462
+ const required = coverage.filter((entry) => subtasks.find((subtask) => subtask.subtaskId === entry.subtaskId)?.required);
463
+ const covered = required.filter((entry) => entry.covered);
464
+ return {
465
+ passed: required.every((entry) => entry.covered),
466
+ applicable: subtasks.some((subtask) => subtask.required && subtask.kind === 'learning_route') || subtasks.length > 1,
467
+ coveredSubtaskIds: covered.map((entry) => entry.subtaskId),
468
+ missingRequiredSubtaskIds: required.filter((entry) => !entry.covered).map((entry) => entry.subtaskId),
469
+ subtaskCoverage: coverage,
470
+ learningRouteNodeCount: route.length,
471
+ coverageScore: required.length > 0 ? Number((covered.length / required.length).toFixed(4)) : 1,
472
+ };
473
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });