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
@@ -1,10 +1,68 @@
1
1
  document.addEventListener('DOMContentLoaded', () => {
2
+ const hasExplicitBrowserRuntimeBootstrap = () => {
3
+ if (typeof window === 'undefined' || !window.__NC_SIDECAR_RUNTIME) {
4
+ return false;
5
+ }
6
+ const currentOrigin = String((window.location && window.location.origin) || '').trim().replace(/\/+$/, '');
7
+ const runtimeBaseUrl = String(window.__NC_SIDECAR_RUNTIME.baseUrl || '').trim().replace(/\/+$/, '');
8
+ return Boolean(currentOrigin && runtimeBaseUrl && currentOrigin === runtimeBaseUrl);
9
+ };
10
+
11
+ const isDetachedTauriCliPreviewPage = () =>
12
+ !window.__TAURI__ &&
13
+ Array.from(document.scripts || []).some((script) =>
14
+ /__tauri_cli/.test(String(script && (script.text || script.textContent) || ''))
15
+ );
16
+
17
+ const getRuntimeBaseOrigin = () => {
18
+ const bridge = (typeof window !== 'undefined') ? window.NoteConnectionRuntime : null;
19
+ const baseUrl = bridge && typeof bridge.getBaseUrl === 'function'
20
+ ? String(bridge.getBaseUrl() || '').trim()
21
+ : '';
22
+ if (!baseUrl) {
23
+ return '';
24
+ }
25
+ try {
26
+ return new URL(baseUrl).origin;
27
+ } catch (_error) {
28
+ return '';
29
+ }
30
+ };
31
+
32
+ const isDetachedPreviewWithoutRuntimeBootstrap = () =>
33
+ isDetachedTauriCliPreviewPage() && window.location.origin !== getRuntimeBaseOrigin();
34
+
35
+ const canUseBrowserRuntimeBackend = () => {
36
+ if (typeof window === 'undefined' || window.__TAURI__) {
37
+ return false;
38
+ }
39
+ if (isDetachedPreviewWithoutRuntimeBootstrap()) {
40
+ return false;
41
+ }
42
+ if (hasExplicitBrowserRuntimeBootstrap()) {
43
+ return true;
44
+ }
45
+ const origin = String((window.location && window.location.origin) || '').trim().toLowerCase();
46
+ return /^https?:\/\/(?:127\.0\.0\.1|localhost):3000$/.test(origin);
47
+ };
48
+
49
+ const isTauriRuntime = typeof window !== 'undefined' && Boolean(window.__TAURI__);
50
+ const initialBrowserRuntimeBackend = canUseBrowserRuntimeBackend();
2
51
  let runtimeCaps = {
3
52
  platform: 'web',
4
- supports_sidecar: true,
5
- supports_build: true,
6
- supports_content_api: true,
7
- supports_kb_runtime_change: true,
53
+ supports_sidecar: initialBrowserRuntimeBackend,
54
+ supports_build: initialBrowserRuntimeBackend,
55
+ supports_content_api: initialBrowserRuntimeBackend,
56
+ supports_kb_runtime_change: false,
57
+ supports_kb_import: false,
58
+ kb_import_mode: 'none',
59
+ supports_projection_store: true,
60
+ storage_requested_provider: isTauriRuntime || initialBrowserRuntimeBackend ? 'sqlite' : 'projection',
61
+ storage_resolved_provider: isTauriRuntime || initialBrowserRuntimeBackend ? 'unknown' : 'projection',
62
+ storage_fallback_reason: isTauriRuntime
63
+ ? 'runtime_capability_unavailable'
64
+ : initialBrowserRuntimeBackend ? '' : 'runtime_backend_unavailable',
65
+ supports_sqlite: initialBrowserRuntimeBackend,
8
66
  supports_native_pathmode: false,
9
67
  supports_mobile_wasm_compute: false,
10
68
  mobile_wasm_reason: 'non-mobile-runtime'
@@ -38,6 +96,11 @@ document.addEventListener('DOMContentLoaded', () => {
38
96
  return null;
39
97
  };
40
98
 
99
+ const isStandaloneFrontendPreviewRuntime = () =>
100
+ !window.__TAURI__ &&
101
+ !resolveCapacitorPlatform() &&
102
+ runtimeCaps.supports_sidecar !== true;
103
+
41
104
  const supportsCapacitorContentApi = () => {
42
105
  if (typeof window === 'undefined') {
43
106
  return false;
@@ -165,6 +228,25 @@ document.addEventListener('DOMContentLoaded', () => {
165
228
  return window.NoteConnectionStorage.createProvider({ runtimeCaps });
166
229
  };
167
230
 
231
+ const refreshStorageResolution = async () => {
232
+ const provider = getStorageProvider();
233
+ if (!provider || typeof provider.refreshStorageResolution !== 'function') {
234
+ return;
235
+ }
236
+ const resolution = await provider.refreshStorageResolution();
237
+ if (!resolution || typeof resolution !== 'object') {
238
+ return;
239
+ }
240
+ runtimeCaps = {
241
+ ...runtimeCaps,
242
+ storage_requested_provider: resolution.requestedProvider,
243
+ storage_resolved_provider: resolution.resolvedProvider,
244
+ storage_fallback_reason: resolution.fallbackReason || '',
245
+ supports_sqlite: resolution.supportsSqlite === true,
246
+ };
247
+ exposeRuntimeCaps();
248
+ };
249
+
168
250
  const resolveRuntimeCapabilities = async () => {
169
251
  if (!window.__TAURI__) {
170
252
  const capacitorPlatform = resolveCapacitorPlatform();
@@ -179,6 +261,13 @@ document.addEventListener('DOMContentLoaded', () => {
179
261
  supports_build: canBuildGraph,
180
262
  supports_content_api: canReadContent,
181
263
  supports_kb_runtime_change: false,
264
+ supports_kb_import: false,
265
+ kb_import_mode: 'app-local-only',
266
+ supports_projection_store: true,
267
+ storage_requested_provider: 'projection',
268
+ storage_resolved_provider: 'projection',
269
+ storage_fallback_reason: 'native_sqlite_runtime_unavailable',
270
+ supports_sqlite: false,
182
271
  supports_native_pathmode: false,
183
272
  supports_mobile_wasm_compute: mobileWasm.supported,
184
273
  mobile_wasm_reason: mobileWasm.reason,
@@ -190,6 +279,27 @@ document.addEventListener('DOMContentLoaded', () => {
190
279
  supports_mobile_wasm_compute: runtimeCaps.supports_mobile_wasm_compute,
191
280
  mobile_wasm_reason: runtimeCaps.mobile_wasm_reason
192
281
  });
282
+ } else {
283
+ const browserRuntimeBackend = canUseBrowserRuntimeBackend();
284
+ runtimeCaps = {
285
+ ...runtimeCaps,
286
+ platform: 'web',
287
+ supports_sidecar: browserRuntimeBackend,
288
+ supports_build: browserRuntimeBackend,
289
+ supports_content_api: browserRuntimeBackend,
290
+ supports_kb_runtime_change: false,
291
+ supports_kb_import: false,
292
+ kb_import_mode: 'none',
293
+ supports_projection_store: true,
294
+ storage_requested_provider: browserRuntimeBackend ? 'sqlite' : 'projection',
295
+ storage_resolved_provider: browserRuntimeBackend ? 'unknown' : 'projection',
296
+ storage_fallback_reason: browserRuntimeBackend ? '' : 'runtime_backend_unavailable',
297
+ supports_sqlite: browserRuntimeBackend,
298
+ supports_native_pathmode: false
299
+ };
300
+ if (!browserRuntimeBackend) {
301
+ console.log('[SourceManager] Frontend preview runtime detected: backend-dependent APIs disabled until a runtime bootstrap is provided.');
302
+ }
193
303
  }
194
304
  exposeRuntimeCaps();
195
305
  return;
@@ -247,8 +357,61 @@ document.addEventListener('DOMContentLoaded', () => {
247
357
  // 动态脚本加载器(缓存破坏与顺序保证)
248
358
  const loadGraphDataFromSidecar = async (src) => {
249
359
  const parseGraphDataPayload = (text) => {
360
+ const mobileRuntime = window.NoteConnectionMobileBudget && window.NoteConnectionMobileBudget.runtime;
361
+ if (mobileRuntime && Number.isInteger(mobileRuntime.maxProjectionBytes)) {
362
+ const payloadText = String(text || '');
363
+ const byteCounter = window.NoteConnectionStorage
364
+ && typeof window.NoteConnectionStorage.measureUtf8Bytes === 'function'
365
+ ? window.NoteConnectionStorage.measureUtf8Bytes
366
+ : null;
367
+ const payloadBytes = byteCounter
368
+ ? byteCounter(payloadText)
369
+ : (typeof TextEncoder === 'function'
370
+ ? new TextEncoder().encode(payloadText).length
371
+ : (typeof Buffer !== 'undefined' && typeof Buffer.byteLength === 'function'
372
+ ? Buffer.byteLength(payloadText, 'utf8')
373
+ : payloadText.length));
374
+ if (payloadBytes > mobileRuntime.maxProjectionBytes) {
375
+ throw new Error(
376
+ `Mobile graph projection exceeds ${mobileRuntime.maxProjectionBytes} bytes.`
377
+ );
378
+ }
379
+ }
250
380
  const trimmed = text.trim();
251
381
  let parsed = null;
382
+ const extractAssignedJson = (sourceText, equalsIndex) => {
383
+ const textAfterEquals = sourceText.slice(equalsIndex + 1);
384
+ const openingIndex = textAfterEquals.search(/[\[{]/);
385
+ if (openingIndex < 0) {
386
+ return '';
387
+ }
388
+ const startIndex = equalsIndex + 1 + openingIndex;
389
+ const openingChar = sourceText.charAt(startIndex);
390
+ const closingChar = openingChar === '{' ? '}' : ']';
391
+ let depth = 0;
392
+ let inString = false;
393
+
394
+ for (let cursor = startIndex; cursor < sourceText.length; cursor += 1) {
395
+ const char = sourceText.charAt(cursor);
396
+ const previous = sourceText.charAt(cursor - 1);
397
+ if (char === '"' && previous !== '\\') {
398
+ inString = !inString;
399
+ }
400
+ if (inString) {
401
+ continue;
402
+ }
403
+ if (char === openingChar) {
404
+ depth += 1;
405
+ } else if (char === closingChar) {
406
+ depth -= 1;
407
+ if (depth === 0) {
408
+ return sourceText.slice(startIndex, cursor + 1);
409
+ }
410
+ }
411
+ }
412
+
413
+ return '';
414
+ };
252
415
 
253
416
  // Expected format: const graphData = {...};
254
417
  if (
@@ -258,10 +421,7 @@ document.addEventListener('DOMContentLoaded', () => {
258
421
  ) {
259
422
  const eqPos = trimmed.indexOf('=');
260
423
  if (eqPos > -1) {
261
- let jsonText = trimmed.slice(eqPos + 1).trim();
262
- if (jsonText.endsWith(';')) {
263
- jsonText = jsonText.slice(0, -1);
264
- }
424
+ const jsonText = extractAssignedJson(trimmed, eqPos);
265
425
  parsed = JSON.parse(jsonText);
266
426
  }
267
427
  } else if (trimmed.startsWith('{') || trimmed.startsWith('[')) {
@@ -284,10 +444,7 @@ document.addEventListener('DOMContentLoaded', () => {
284
444
  if (equalsIndex < 0) {
285
445
  continue;
286
446
  }
287
- let candidateJson = trimmed.slice(equalsIndex + 1).trim();
288
- if (candidateJson.endsWith(';')) {
289
- candidateJson = candidateJson.slice(0, -1).trim();
290
- }
447
+ const candidateJson = extractAssignedJson(trimmed, equalsIndex);
291
448
  if (!candidateJson) {
292
449
  continue;
293
450
  }
@@ -324,6 +481,23 @@ document.addEventListener('DOMContentLoaded', () => {
324
481
  }
325
482
  }
326
483
 
484
+ if (isDetachedPreviewWithoutRuntimeBootstrap()) {
485
+ throw new Error('Detached preview runtime has no sidecar-backed graph asset bootstrap.');
486
+ }
487
+
488
+ if (!window.__TAURI__ && runtimeCaps.supports_sidecar !== true) {
489
+ const previewUrl = `${src}?v=${Date.now()}`;
490
+ const response = await fetch(previewUrl, { cache: 'no-store' });
491
+ if (!response.ok) {
492
+ throw new Error(`Failed to fetch ${src}: HTTP ${response.status}`);
493
+ }
494
+ const text = await response.text();
495
+ const parsed = parseGraphDataPayload(text);
496
+ window.graphData = parsed;
497
+ console.log(`[Loader] Loaded ${src} via frontend preview asset: ${parsed.nodes.length} nodes`);
498
+ return;
499
+ }
500
+
327
501
  // ─── Strategy 1: HTTP fetch from sidecar (works in browser, may fail in Tauri WebView) ───
328
502
  // 策略1:通过 HTTP 从 sidecar 获取(浏览器中有效,Tauri WebView 中可能因混合内容限制而失败)
329
503
  const maxAttempts = (window.__TAURI__ && runtimeCaps.supports_sidecar) ? 20 : 1;
@@ -379,10 +553,7 @@ document.addEventListener('DOMContentLoaded', () => {
379
553
 
380
554
  const loadScript = async (src) => {
381
555
  const isRuntimeGeneratedDataAsset = src.startsWith('data');
382
- const useRuntimeGeneratedAssetFlow = Boolean(
383
- isRuntimeGeneratedDataAsset &&
384
- (window.__TAURI__ || (typeof runtimeCaps.platform === 'string' && runtimeCaps.platform.startsWith('capacitor-')))
385
- );
556
+ const useRuntimeGeneratedAssetFlow = Boolean(isRuntimeGeneratedDataAsset);
386
557
  if (useRuntimeGeneratedAssetFlow) {
387
558
  await loadGraphDataFromSidecar(src);
388
559
  return;
@@ -452,6 +623,19 @@ document.addEventListener('DOMContentLoaded', () => {
452
623
  };
453
624
 
454
625
  const bootstrapScriptLoad = () => {
626
+ if (isDetachedPreviewWithoutRuntimeBootstrap()) {
627
+ console.log('[Loader] Detached preview runtime detected. Skipping runtime graph preload and loading app.js directly.');
628
+ triggerWelcomeModal(false);
629
+ loadScript('app.js')
630
+ .then(() => {
631
+ console.log('[Loader] app.js loaded successfully');
632
+ })
633
+ .catch(err => {
634
+ console.error('[Loader] Failed to load app.js (Critical Error):', err);
635
+ });
636
+ return;
637
+ }
638
+
455
639
  // Load data.js first (Critical Data), then app.js (Application Logic)
456
640
  loadScript('data.js')
457
641
  .then(() => {
@@ -492,7 +676,7 @@ document.addEventListener('DOMContentLoaded', () => {
492
676
 
493
677
  if (!folderSelect || !loadBtn) return;
494
678
  if (loadBtn.dataset.sourceManagerBound === '1') {
495
- console.warn('[SourceManager] Already initialized, skipping duplicate binding.');
679
+ console.log('[SourceManager] Duplicate binding guard triggered; skipping re-initialization.');
496
680
  return;
497
681
  }
498
682
  loadBtn.dataset.sourceManagerBound = '1';
@@ -610,6 +794,33 @@ document.addEventListener('DOMContentLoaded', () => {
610
794
  return await provider.checkCache(target);
611
795
  };
612
796
 
797
+ const ACTIVE_SOURCE_TARGET_EVENT = 'noteconnection:active-target-changed';
798
+
799
+ const normalizeActiveSourceTarget = (target) => {
800
+ const normalized = String(target || '').trim();
801
+ return normalized || 'ALL_FOLDERS';
802
+ };
803
+
804
+ const publishActiveSourceTarget = (target, source) => {
805
+ const normalizedTarget = normalizeActiveSourceTarget(target);
806
+ const payload = {
807
+ target: normalizedTarget,
808
+ source: String(source || 'source-manager').trim() || 'source-manager',
809
+ scope: normalizedTarget === 'ALL_FOLDERS'
810
+ ? null
811
+ : {
812
+ workspaceId: normalizedTarget.toLowerCase(),
813
+ corpusId: normalizedTarget.toLowerCase(),
814
+ sourcePathPrefixes: [`Knowledge_Base/${normalizedTarget}`],
815
+ },
816
+ };
817
+ window.__NC_ACTIVE_SOURCE_TARGET = payload;
818
+ if (typeof window.dispatchEvent === 'function' && typeof window.CustomEvent === 'function') {
819
+ window.dispatchEvent(new CustomEvent(ACTIVE_SOURCE_TARGET_EVENT, { detail: payload }));
820
+ }
821
+ return payload;
822
+ };
823
+
613
824
  const syncSidecarKbPath = async (kbPath) => {
614
825
  if (!kbPath) {
615
826
  return;
@@ -775,7 +986,13 @@ document.addEventListener('DOMContentLoaded', () => {
775
986
  let folders = [];
776
987
  const inCapacitorRuntime = isCapacitorNativeRuntime();
777
988
 
778
- if (inCapacitorRuntime) {
989
+ if (
990
+ isStandaloneFrontendPreviewRuntime() ||
991
+ isDetachedPreviewWithoutRuntimeBootstrap()
992
+ ) {
993
+ kbPath = t('source.previewPath');
994
+ folders = [];
995
+ } else if (inCapacitorRuntime) {
779
996
  kbPath = t('source.capacitor.bundlePath');
780
997
  const provider = getStorageProvider();
781
998
  let listedFolders = [];
@@ -868,6 +1085,17 @@ document.addEventListener('DOMContentLoaded', () => {
868
1085
  folderSelect.appendChild(packagedOption);
869
1086
  }
870
1087
 
1088
+ if (folderSelect.options.length === 0 && isStandaloneFrontendPreviewRuntime()) {
1089
+ const previewOption = document.createElement('option');
1090
+ previewOption.value = '';
1091
+ previewOption.disabled = true;
1092
+ previewOption.selected = true;
1093
+ previewOption.textContent = t('source.previewPath');
1094
+ folderSelect.appendChild(previewOption);
1095
+ loadBtn.disabled = true;
1096
+ return;
1097
+ }
1098
+
871
1099
  if (folderSelect.options.length === 0) {
872
1100
  const emptyOption = document.createElement('option');
873
1101
  emptyOption.value = '';
@@ -892,6 +1120,7 @@ document.addEventListener('DOMContentLoaded', () => {
892
1120
  } else {
893
1121
  folderSelect.value = folderSelect.options[0].value;
894
1122
  }
1123
+ publishActiveSourceTarget(folderSelect.value, 'folder-bootstrap');
895
1124
  console.log('[SourceManager] Folder dropdown populated with', folderSelect.options.length, 'options');
896
1125
 
897
1126
  } catch (err) {
@@ -913,10 +1142,11 @@ document.addEventListener('DOMContentLoaded', () => {
913
1142
  updateRuntimeCapabilityNotice();
914
1143
  updateKbPathControls();
915
1144
 
916
- // Start static graph/frontend bootstrap immediately so UI initialization
917
- // does not block on sidecar ping retries.
1145
+ if (window.__TAURI__ && runtimeCaps.supports_sidecar) {
1146
+ await waitForSidecarReady();
1147
+ }
1148
+ await refreshStorageResolution();
918
1149
  bootstrapScriptLoad();
919
- await waitForSidecarReady();
920
1150
 
921
1151
  if (window.i18n && window.i18n.isInitialized) {
922
1152
  await fetchFolders();
@@ -938,6 +1168,7 @@ document.addEventListener('DOMContentLoaded', () => {
938
1168
  if (folderSelect.value) {
939
1169
  localStorage.setItem(LAST_TARGET_KEY, folderSelect.value);
940
1170
  }
1171
+ publishActiveSourceTarget(folderSelect.value, 'folder-change');
941
1172
  });
942
1173
 
943
1174
  // Add refresh functionality (will be triggered by IPC event from main process)
@@ -959,6 +1190,47 @@ document.addEventListener('DOMContentLoaded', () => {
959
1190
  });
960
1191
  }
961
1192
 
1193
+ const requestKnowledgeBasePathChange = async () => {
1194
+ try {
1195
+ const request = await window.__TAURI__.core.invoke('request_kb_path_change');
1196
+ if (typeof request === 'string') {
1197
+ return request;
1198
+ }
1199
+ const status = String(request && request.status || '').trim().toLowerCase();
1200
+ if (status === 'completed') {
1201
+ return String(request.path || '').trim();
1202
+ }
1203
+ if (status !== 'pending') {
1204
+ return '';
1205
+ }
1206
+
1207
+ const deadline = Date.now() + 120000;
1208
+ while (Date.now() < deadline) {
1209
+ await new Promise((resolve) => setTimeout(resolve, 500));
1210
+ const result = await window.__TAURI__.core.invoke('poll_kb_path_change');
1211
+ const resultStatus = String(result && result.status || '').trim().toLowerCase();
1212
+ if (resultStatus === 'completed') {
1213
+ return String(result.path || '').trim();
1214
+ }
1215
+ if (resultStatus === 'cancelled') {
1216
+ return '';
1217
+ }
1218
+ if (resultStatus === 'failed' || resultStatus === 'unavailable') {
1219
+ const detail = String(result && result.detail || '').trim();
1220
+ throw new Error(detail || `Knowledge base picker ${resultStatus}.`);
1221
+ }
1222
+ }
1223
+ throw new Error('Timed out waiting for Android knowledge base import.');
1224
+ } catch (error) {
1225
+ // Older Tauri builds do not expose the additive request/poll commands.
1226
+ // Preserve their synchronous desktop picker contract as a fallback.
1227
+ if (/unknown command|not found|invalid command/i.test(String(error && error.message || error))) {
1228
+ return await window.__TAURI__.core.invoke('choose_kb_path');
1229
+ }
1230
+ throw error;
1231
+ }
1232
+ };
1233
+
962
1234
  if (changeKbPathBtn && window.__TAURI__) {
963
1235
  changeKbPathBtn.addEventListener('click', async () => {
964
1236
  if (!runtimeCaps.supports_kb_runtime_change) {
@@ -970,7 +1242,7 @@ document.addEventListener('DOMContentLoaded', () => {
970
1242
  if (resetKbPathBtn) resetKbPathBtn.disabled = true;
971
1243
 
972
1244
  try {
973
- const selectedPath = await window.__TAURI__.core.invoke('choose_kb_path');
1245
+ const selectedPath = await requestKnowledgeBasePathChange();
974
1246
  if (!selectedPath) {
975
1247
  return;
976
1248
  }
@@ -1039,6 +1311,7 @@ document.addEventListener('DOMContentLoaded', () => {
1039
1311
  return;
1040
1312
  }
1041
1313
  localStorage.setItem(LAST_TARGET_KEY, target);
1314
+ publishActiveSourceTarget(target, 'build-request');
1042
1315
 
1043
1316
  // Feature: Check for cached graph (Multi-Session Optimization)
1044
1317
  // Bridge-first runtime: sidecar HTTP path with Tauri IPC fallback.
@@ -1067,6 +1340,7 @@ document.addEventListener('DOMContentLoaded', () => {
1067
1340
  const restoreSuccess = await storageProvider.restoreCache(target);
1068
1341
 
1069
1342
  if (restoreSuccess) {
1343
+ publishActiveSourceTarget(target, 'cache-restore');
1070
1344
  keepLockedForReload = requestSafeReload('cache-restore', { force: true });
1071
1345
  return;
1072
1346
  }
@@ -1134,6 +1408,7 @@ document.addEventListener('DOMContentLoaded', () => {
1134
1408
  }
1135
1409
 
1136
1410
  if (success) {
1411
+ publishActiveSourceTarget(target, 'build-success');
1137
1412
  keepLockedForReload = true;
1138
1413
 
1139
1414
  // v1.0.1: Pre-verify data.js is accessible before triggering reload.