noteconnection 1.6.8 → 1.8.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 (212) hide show
  1. package/LICENSE +674 -21
  2. package/README.md +258 -64
  3. package/dist/src/agent_workspace.contract.parity.test.js +475 -0
  4. package/dist/src/agent_workspace.frontend.test.js +9989 -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/copy.assets.contract.test.js +130 -0
  8. package/dist/src/core/PathBridge.js +28 -3
  9. package/dist/src/export/WorkspaceExportBundle.js +1130 -0
  10. package/dist/src/export/WorkspaceExportBundle.test.js +1480 -0
  11. package/dist/src/export/index.js +18 -0
  12. package/dist/src/export/types.js +2 -0
  13. package/dist/src/fixrisk.issue.verifier.contract.test.js +3 -1
  14. package/dist/src/foundation.ann.runtime.contract.test.js +81 -0
  15. package/dist/src/foundation.release.evidence.contract.test.js +406 -0
  16. package/dist/src/foundation.sqlite.runtime.contract.test.js +82 -0
  17. package/dist/src/frontend/README.md +258 -64
  18. package/dist/src/frontend/agent_workspace.js +5353 -0
  19. package/dist/src/frontend/agent_workspace_runtime.js +4434 -0
  20. package/dist/src/frontend/analysis.js +31 -4
  21. package/dist/src/frontend/app.js +3597 -141
  22. package/dist/src/frontend/focus_mode_interactions.js +33 -0
  23. package/dist/src/frontend/godot_future_path_renderer.js +540 -0
  24. package/dist/src/frontend/godot_tree_interactions.js +178 -0
  25. package/dist/src/frontend/graph_state.mjs +105 -0
  26. package/dist/src/frontend/hosted_future_path_runtime.js +157 -0
  27. package/dist/src/frontend/i18n.mjs +186 -0
  28. package/dist/src/frontend/index.html +641 -266
  29. package/dist/src/frontend/layout_gpu.js +12 -4
  30. package/dist/src/frontend/locales/en.json +721 -5
  31. package/dist/src/frontend/locales/zh.json +721 -5
  32. package/dist/src/frontend/main.mjs +60 -0
  33. package/dist/src/frontend/markdown_runtime.js +827 -0
  34. package/dist/src/frontend/notemd.css +49 -0
  35. package/dist/src/frontend/notemd.html +7 -1
  36. package/dist/src/frontend/notemd.js +64 -0
  37. package/dist/src/frontend/path.html +107 -0
  38. package/dist/src/frontend/path_app.js +2189 -150
  39. package/dist/src/frontend/path_layout.mjs +143 -0
  40. package/dist/src/frontend/path_mermaid_utils.mjs +108 -0
  41. package/dist/src/frontend/path_modules_bridge.js +486 -0
  42. package/dist/src/frontend/path_state.mjs +118 -0
  43. package/dist/src/frontend/path_styles.css +146 -0
  44. package/dist/src/frontend/path_worker_bridge.mjs +85 -0
  45. package/dist/src/frontend/reader.js +522 -27
  46. package/dist/src/frontend/runtime_bridge.js +67 -54
  47. package/dist/src/frontend/runtime_bridge.mjs +279 -0
  48. package/dist/src/frontend/settings.js +130 -12
  49. package/dist/src/frontend/simulationWorker.js +241 -6
  50. package/dist/src/frontend/source_manager.js +190 -21
  51. package/dist/src/frontend/styles.css +2853 -72
  52. package/dist/src/frontend/workbench_state.mjs +101 -0
  53. package/dist/src/frontend/workspace_panes.js +10168 -0
  54. package/dist/src/frontend.locale.contract.test.js +62 -0
  55. package/dist/src/godot.sidecar.bootstrap.contract.test.js +244 -0
  56. package/dist/src/indexing/IndexLifecycle.js +195 -0
  57. package/dist/src/indexing/IndexLifecycle.test.js +49 -0
  58. package/dist/src/indexing/SegmentBuilder.js +64 -0
  59. package/dist/src/indexing/UnitBuilder.js +48 -0
  60. package/dist/src/indexing/types.js +2 -0
  61. package/dist/src/knowledge.api.contract.test.js +170 -0
  62. package/dist/src/learning/KnowledgeLearningPlatform.js +10386 -0
  63. package/dist/src/learning/KnowledgeLearningPlatform.persistence.test.js +327 -0
  64. package/dist/src/learning/KnowledgeLearningPlatform.program-f.test.js +99 -0
  65. package/dist/src/learning/KnowledgeLearningPlatform.test.js +2971 -0
  66. package/dist/src/learning/KnowledgeWorkspaceConversationRegression.js +2974 -0
  67. package/dist/src/learning/KnowledgeWorkspaceConversationRegression.test.js +3928 -0
  68. package/dist/src/learning/answerReleaseReview.js +4319 -0
  69. package/dist/src/learning/answerReleaseReview.test.js +2888 -0
  70. package/dist/src/learning/api.js +2 -0
  71. package/dist/src/learning/conversationComposer.js +1480 -0
  72. package/dist/src/learning/conversationComposer.test.js +1817 -0
  73. package/dist/src/learning/domains/ConversationManager.js +53 -0
  74. package/dist/src/learning/domains/KnowledgeIngestor.js +238 -0
  75. package/dist/src/learning/domains/KnowledgeQuerier.js +187 -0
  76. package/dist/src/learning/domains/MasteryEngine.js +387 -0
  77. package/dist/src/learning/domains/MemoryPolicyManager.js +408 -0
  78. package/dist/src/learning/domains/QualityEvaluator.js +307 -0
  79. package/dist/src/learning/domains/TutorRouter.js +313 -0
  80. package/dist/src/learning/domains/index.js +33 -0
  81. package/dist/src/learning/domains/types.js +7 -0
  82. package/dist/src/learning/errors.js +29 -0
  83. package/dist/src/learning/evidenceContextAssembler.js +1176 -0
  84. package/dist/src/learning/evidenceContextAssembler.test.js +6332 -0
  85. package/dist/src/learning/graphContextAssembler.js +870 -0
  86. package/dist/src/learning/graphContextAssembler.test.js +1033 -0
  87. package/dist/src/learning/index.js +28 -0
  88. package/dist/src/learning/queryBackend.js +1898 -0
  89. package/dist/src/learning/queryBackend.test.js +955 -0
  90. package/dist/src/learning/ragContextPack.js +257 -0
  91. package/dist/src/learning/ragContextPack.test.js +160 -0
  92. package/dist/src/learning/ragPublicText.js +38 -0
  93. package/dist/src/learning/ragSufficiencyJudge.js +161 -0
  94. package/dist/src/learning/ragSufficiencyJudge.test.js +177 -0
  95. package/dist/src/learning/ragSufficiencyProviderJudge.js +227 -0
  96. package/dist/src/learning/ragSufficiencyProviderJudge.test.js +156 -0
  97. package/dist/src/learning/requestNormalization.js +198 -0
  98. package/dist/src/learning/runtimeCapability.js +4677 -0
  99. package/dist/src/learning/runtimeCapability.test.js +3635 -0
  100. package/dist/src/learning/store.js +1240 -0
  101. package/dist/src/learning/store.test.js +1126 -0
  102. package/dist/src/learning/tutorAdapter.js +2 -0
  103. package/dist/src/learning/types.js +2 -0
  104. package/dist/src/learning/vectorAccelerationAdapter.js +942 -0
  105. package/dist/src/learning/vectorAccelerationAdapter.test.js +382 -0
  106. package/dist/src/lfs.asset.policy.contract.test.js +153 -0
  107. package/dist/src/license.policy.contract.test.js +66 -0
  108. package/dist/src/memory/MemoryGovernance.js +74 -0
  109. package/dist/src/memory/MemoryGovernance.test.js +46 -0
  110. package/dist/src/memory/types.js +2 -0
  111. package/dist/src/mermaid.frontend.guard.contract.test.js +77 -0
  112. package/dist/src/middleware/auth.js +17 -0
  113. package/dist/src/middleware/body-parser.js +45 -0
  114. package/dist/src/middleware/cors.js +44 -0
  115. package/dist/src/middleware/index.js +21 -0
  116. package/dist/src/middleware/request-trace.js +96 -0
  117. package/dist/src/notemd/AppConfigToml.js +6 -4
  118. package/dist/src/notemd/MermaidProcessor.js +400 -50
  119. package/dist/src/notemd/NotemdService.js +498 -13
  120. package/dist/src/notemd/PromptManager.js +15 -0
  121. package/dist/src/notemd/cli/commands.js +357 -0
  122. package/dist/src/notemd/cli/dispatcher.js +225 -0
  123. package/dist/src/notemd/cli/index.js +169 -0
  124. package/dist/src/notemd/cli/parser.js +68 -0
  125. package/dist/src/notemd/cli/types.js +2 -0
  126. package/dist/src/notemd/constants.js +43 -0
  127. package/dist/src/notemd/diagram/diagramGenerationService.js +78 -0
  128. package/dist/src/notemd/diagram/diagramSpec.js +79 -0
  129. package/dist/src/notemd/diagram/diagramSpecResponseParser.js +131 -0
  130. package/dist/src/notemd/diagram/intent.js +95 -0
  131. package/dist/src/notemd/diagram/planner.js +71 -0
  132. package/dist/src/notemd/diagram/prompts/diagramSpecPrompt.js +42 -0
  133. package/dist/src/notemd/diagram/types.js +18 -0
  134. package/dist/src/notemd/index.js +26 -0
  135. package/dist/src/notemd/operations/capabilityManifest.js +23 -0
  136. package/dist/src/notemd/operations/cliContracts.js +17 -0
  137. package/dist/src/notemd/operations/configProfileCommands.js +85 -0
  138. package/dist/src/notemd/operations/registry.contract.test.js +95 -0
  139. package/dist/src/notemd/operations/registry.js +991 -0
  140. package/dist/src/notemd/operations/types.js +2 -0
  141. package/dist/src/notemd/providerDiagnostics.js +220 -0
  142. package/dist/src/notemd/providerProfiles.js +42 -0
  143. package/dist/src/notemd/providerTemplates.js +231 -0
  144. package/dist/src/notemd/search/DuckDuckGoProvider.js +39 -0
  145. package/dist/src/notemd/search/SearchManager.js +13 -0
  146. package/dist/src/notemd/search/SearchProvider.js +2 -0
  147. package/dist/src/notemd/search/TavilyProvider.js +44 -0
  148. package/dist/src/notemd.agent.manifest.test.js +85 -0
  149. package/dist/src/notemd.api.contract.test.js +14 -1
  150. package/dist/src/notemd.app_config_toml.test.js +2 -1
  151. package/dist/src/notemd.batch.workflow.test.js +117 -0
  152. package/dist/src/notemd.cli.e2e.test.js +136 -0
  153. package/dist/src/notemd.core.test.js +51 -0
  154. package/dist/src/notemd.diagram.pipeline.test.js +233 -0
  155. package/dist/src/notemd.providerTemplates.test.js +34 -0
  156. package/dist/src/notemd.server.integration.test.js +143 -35
  157. package/dist/src/notemd.workflow.pipeline.test.js +162 -0
  158. package/dist/src/pathbridge.handshake.contract.test.js +16 -2
  159. package/dist/src/pathmode.background.contract.test.js +69 -0
  160. package/dist/src/pathmode.settings.api.contract.test.js +9 -0
  161. package/dist/src/pkg.sidecar.contract.test.js +9 -3
  162. package/dist/src/platform/ExportProfile.js +58 -0
  163. package/dist/src/platform/PlatformCapabilities.js +45 -0
  164. package/dist/src/platform/PlatformCapabilities.test.js +30 -0
  165. package/dist/src/platform/RenderMaterializer.js +33 -0
  166. package/dist/src/platform/RenderMaterializer.test.js +32 -0
  167. package/dist/src/query_backend.external_http.integration.test.js +410 -0
  168. package/dist/src/reader_renderer.js +404 -3
  169. package/dist/src/reader_renderer.test.js +87 -0
  170. package/dist/src/release.godot.mirror.contract.test.js +73 -0
  171. package/dist/src/resources/ResourceRegistry.js +223 -0
  172. package/dist/src/resources/ResourceRegistry.test.js +61 -0
  173. package/dist/src/resources/types.js +2 -0
  174. package/dist/src/routes/agentWorkspaceDiagnostics.js +173 -0
  175. package/dist/src/routes/data.js +267 -0
  176. package/dist/src/routes/diagnostics.js +51 -0
  177. package/dist/src/routes/index.js +23 -0
  178. package/dist/src/routes/knowledge.js +968 -0
  179. package/dist/src/routes/markdown.js +287 -0
  180. package/dist/src/routes/notemd.js +565 -0
  181. package/dist/src/routes/registry.contract.test.js +130 -0
  182. package/dist/src/routes/render.js +285 -0
  183. package/dist/src/routes/runtimeRunbookRouteOps.js +149 -0
  184. package/dist/src/routes/runtimeRunbookRouteOps.test.js +194 -0
  185. package/dist/src/routes/settings.js +6 -0
  186. package/dist/src/routes/staticFiles.js +94 -0
  187. package/dist/src/routes/types.js +2 -0
  188. package/dist/src/runtime.transport.adapter.contract.test.js +81 -0
  189. package/dist/src/server.js +11090 -1549
  190. package/dist/src/server.migration.test.js +193 -21
  191. package/dist/src/server.port.fallback.contract.test.js +63 -0
  192. package/dist/src/session/SessionStateStore.js +81 -0
  193. package/dist/src/session/SessionStateStore.test.js +58 -0
  194. package/dist/src/session/types.js +2 -0
  195. package/dist/src/settings.runtime.contract.test.js +50 -0
  196. package/dist/src/shared/types.contract.test.js +107 -0
  197. package/dist/src/shared/types.js +22 -0
  198. package/dist/src/sidecar.replacement.boundary.contract.test.js +128 -0
  199. package/dist/src/sidecar.supply.readiness.contract.test.js +144 -0
  200. package/dist/src/source_manager.loadflow.test.js +46 -0
  201. package/dist/src/startup.layout.snapshot.contract.test.js +57 -0
  202. package/dist/src/tauri.frontend.build.contract.test.js +60 -0
  203. package/dist/src/tauri.sidecar.cleanup.contract.test.js +21 -0
  204. package/dist/src/utils/RuntimePaths.js +4 -13
  205. package/dist/src/utils/platform.js +153 -0
  206. package/dist/src/workflows/WorkflowArtifactStore.js +96 -0
  207. package/dist/src/workflows/WorkflowArtifactStore.test.js +80 -0
  208. package/dist/src/workflows/types.js +2 -0
  209. package/dist/src/workspace/WorkspaceRegistry.js +122 -0
  210. package/dist/src/workspace/WorkspaceRegistry.test.js +29 -0
  211. package/dist/src/workspace/types.js +2 -0
  212. package/package.json +61 -10
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <meta
7
7
  http-equiv="Content-Security-Policy"
8
- content="default-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' data: https://fonts.gstatic.com; img-src 'self' data: blob:; connect-src 'self' http://127.0.0.1:* http://localhost:* ws://127.0.0.1:* ws://localhost:* tauri://localhost http://tauri.localhost https://tauri.localhost; worker-src 'self' blob:; object-src 'none'; base-uri 'self'; frame-ancestors 'none'; form-action 'self';"
8
+ content="default-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' data: https://fonts.gstatic.com; img-src 'self' data: blob:; connect-src 'self' ipc: http://127.0.0.1:* http://localhost:* http://ipc.localhost https://ipc.localhost ws://127.0.0.1:* ws://localhost:* tauri://localhost http://tauri.localhost https://tauri.localhost; worker-src 'self' blob:; object-src 'none'; base-uri 'self'; form-action 'self';"
9
9
  />
10
10
  <title>NoteConnection Knowledge Graph</title>
11
11
  <link
@@ -123,6 +123,20 @@
123
123
  >
124
124
  NoteMD
125
125
  </button>
126
+ <button
127
+ id="btn-open-agent-workspace"
128
+ style="
129
+ background: #744210;
130
+ color: #fff8e1;
131
+ border: 1px solid #a16207;
132
+ padding: 2px 8px;
133
+ cursor: pointer;
134
+ "
135
+ data-i18n="agentWorkspace.actions.openWorkspace"
136
+ title="Open Knowledge Workspace"
137
+ >
138
+ Knowledge Workspace
139
+ </button>
126
140
  <span
127
141
  id="kb-current-path"
128
142
  style="
@@ -140,6 +154,131 @@
140
154
  ></span>
141
155
  </div>
142
156
 
157
+ <div id="agent-workspace-backdrop" class="agent-workspace-backdrop" hidden></div>
158
+ <aside
159
+ id="agent-workspace-drawer"
160
+ class="agent-workspace-drawer"
161
+ aria-hidden="true"
162
+ data-open="false"
163
+ >
164
+ <div class="agent-workspace-drawer-frame">
165
+ <div class="agent-workspace-drawer-toolbar">
166
+ <div class="agent-workspace-drawer-heading">
167
+ <span class="agent-workspace-drawer-title" data-i18n="agentWorkspace.title">Knowledge Workspace</span>
168
+ <span class="agent-workspace-drawer-subtitle" data-i18n="agentWorkspace.subtitle">Grounded conversation, knowledge search, and guided learning</span>
169
+ </div>
170
+ <button
171
+ id="btn-close-agent-workspace"
172
+ type="button"
173
+ class="agent-workspace-drawer-close"
174
+ data-i18n="agentWorkspace.actions.closeWorkspace"
175
+ >
176
+ Close
177
+ </button>
178
+ </div>
179
+
180
+ <div id="agent-workspace-shell" class="agent-workspace-shell">
181
+ <section id="agent-chat-pane" class="agent-chat-pane">
182
+ <div class="agent-pane-header">
183
+ <h3 data-i18n="agentWorkspace.conversationTitle">Grounded Conversation</h3>
184
+ <span class="agent-pane-subtitle" data-i18n="agentWorkspace.conversationSubtitle">Scoped knowledge, citations, and guided learning actions</span>
185
+ </div>
186
+ <div class="agent-scope-control agent-scope-control--workspace">
187
+ <label for="agent-workspace-scope-select" data-i18n="agentWorkspace.scope.label">Knowledge Scope</label>
188
+ <select id="agent-workspace-scope-select" aria-describedby="agent-workspace-scope-summary"></select>
189
+ <div
190
+ id="agent-workspace-scope-summary"
191
+ class="agent-scope-summary"
192
+ data-i18n="agentWorkspace.scope.summaryAll"
193
+ >All folders</div>
194
+ </div>
195
+ <div class="agent-pane-field">
196
+ <label for="agent-workspace-user-id" data-i18n="agentWorkspace.userId">Learner ID</label>
197
+ <input id="agent-workspace-user-id" type="text" value="path_user_default" />
198
+ </div>
199
+ <div id="agent-workspace-chat-messages" class="agent-chat-messages"></div>
200
+ <div id="agent-workspace-knowledge-points" class="agent-knowledge-points">
201
+ <div class="agent-knowledge-empty" data-i18n="agentWorkspace.knowledge.emptyInitial">No scoped knowledge matches yet.</div>
202
+ </div>
203
+ <div class="agent-pane-field agent-chat-input-field">
204
+ <label for="agent-workspace-chat-input" data-i18n="agentWorkspace.inputLabel">Ask the scoped knowledge corpus</label>
205
+ <textarea
206
+ id="agent-workspace-chat-input"
207
+ rows="3"
208
+ placeholder="Ask about a concept, citation, prerequisite, or study step..."
209
+ data-i18n-placeholder="agentWorkspace.inputPlaceholder"
210
+ ></textarea>
211
+ </div>
212
+ <div class="agent-pane-actions">
213
+ <button id="btn-agent-workspace-send" type="button" data-i18n="agentWorkspace.actions.send">Send</button>
214
+ </div>
215
+ <div
216
+ id="agent-workspace-api-status"
217
+ class="agent-api-status"
218
+ data-api-state="idle"
219
+ aria-live="polite"
220
+ ></div>
221
+ </section>
222
+
223
+ <div id="agent-side-work-area" class="agent-side-work-area">
224
+ <section
225
+ id="agent-graph-focus-pane"
226
+ class="agent-workspace-pane"
227
+ data-open="false"
228
+ data-fullscreen="false"
229
+ >
230
+ <div class="agent-workspace-pane-header">
231
+ <h4 data-i18n="agentWorkspace.graphFocus.title">Knowledge Focus</h4>
232
+ <div class="agent-pane-controls">
233
+ <button id="btn-agent-graph-focus-fullscreen" type="button" data-i18n="agentWorkspace.actions.fullscreen">Fullscreen</button>
234
+ <button id="btn-agent-graph-focus-close" class="agent-pane-close-button" type="button" aria-label="Close pane">&times;</button>
235
+ </div>
236
+ </div>
237
+ <div id="agent-graph-focus-body" class="agent-workspace-pane-body">
238
+ <div class="agent-pane-empty" data-i18n="agentWorkspace.graphFocus.emptyIdle">Graph focus pane is idle.</div>
239
+ </div>
240
+ </section>
241
+
242
+ <section
243
+ id="agent-evidence-pane"
244
+ class="agent-workspace-pane"
245
+ data-open="false"
246
+ data-fullscreen="false"
247
+ >
248
+ <div class="agent-workspace-pane-header">
249
+ <h4 data-i18n="agentWorkspace.evidence.title">Evidence Inspector</h4>
250
+ <div class="agent-pane-controls">
251
+ <button id="btn-agent-evidence-fullscreen" type="button" data-i18n="agentWorkspace.actions.fullscreen">Fullscreen</button>
252
+ <button id="btn-agent-evidence-close" class="agent-pane-close-button" type="button" aria-label="Close pane">&times;</button>
253
+ </div>
254
+ </div>
255
+ <div id="agent-evidence-body" class="agent-workspace-pane-body">
256
+ <div class="agent-pane-empty" data-i18n="agentWorkspace.evidence.emptyIdle">Evidence pane is idle.</div>
257
+ </div>
258
+ </section>
259
+
260
+ <section
261
+ id="agent-learning-path-pane"
262
+ class="agent-workspace-pane"
263
+ data-open="false"
264
+ data-fullscreen="false"
265
+ >
266
+ <div class="agent-workspace-pane-header">
267
+ <h4 data-i18n="agentWorkspace.learningPath.title">Guided Learning</h4>
268
+ <div class="agent-pane-controls">
269
+ <button id="btn-agent-learning-path-fullscreen" type="button" data-i18n="agentWorkspace.actions.fullscreen">Fullscreen</button>
270
+ <button id="btn-agent-learning-path-close" class="agent-pane-close-button" type="button" aria-label="Close pane">&times;</button>
271
+ </div>
272
+ </div>
273
+ <div id="agent-learning-path-body" class="agent-workspace-pane-body">
274
+ <div class="agent-pane-empty" data-i18n="agentWorkspace.learningPath.emptyIdle">Learning path pane is idle.</div>
275
+ </div>
276
+ </section>
277
+ </div>
278
+ </div>
279
+ </div>
280
+ </aside>
281
+
143
282
  <div id="controls">
144
283
  <h3
145
284
  style="
@@ -828,304 +967,420 @@
828
967
  </button>
829
968
  </div>
830
969
  </div>
831
- <div id="reading-body" class="reading-body locked">
832
- <!-- Content injected here -->
970
+ <div class="reading-layout">
971
+ <div class="reading-main">
972
+ <div id="reading-diagnostics" class="reading-diagnostics">
973
+ <span class="reading-diagnostics-item" data-i18n="reader_loading">Reader loading...</span>
974
+ </div>
975
+ <div id="reading-body" class="reading-body locked">
976
+ <!-- Content injected here -->
977
+ </div>
978
+ </div>
979
+ <aside id="reading-outline" class="reading-outline" aria-label="Document outline">
980
+ <div class="reading-outline-header" data-i18n="reader_outline_title">Outline</div>
981
+ <div id="reading-outline-body" class="reading-outline-body">
982
+ <div class="reading-outline-empty" data-i18n="reader_outline_empty">No headings available.</div>
983
+ </div>
984
+ </aside>
833
985
  </div>
834
986
  </div>
835
987
  </div>
836
988
 
837
989
  <!-- Settings Modal -->
838
- <div id="settings-modal" class="modal-overlay" style="display: none">
839
- <div class="modal-content">
990
+ <div
991
+ id="settings-modal"
992
+ class="modal-overlay settings-modal-overlay"
993
+ style="display: none"
994
+ >
995
+ <div class="modal-content modal-content-settings">
840
996
  <div class="modal-header">
841
- <h2 data-i18n="settings_title">Settings</h2>
842
- <button class="modal-close">&times;</button>
843
- </div>
844
- <div class="modal-body">
845
- <div class="settings-group">
846
- <h3 data-i18n="grp_general">General</h3>
847
- <div class="setting-item">
848
- <label data-i18n="lbl_language">Language</label>
849
- <select
850
- id="set-language"
851
- style="
852
- background: #444;
853
- color: white;
854
- border: 1px solid #555;
855
- padding: 2px;
856
- "
857
- >
858
- <option value="en">English</option>
859
- <option value="zh">中文</option>
860
- </select>
861
- </div>
862
- </div>
863
-
864
- <div class="settings-group">
865
- <h3 data-i18n="grp_physics">Physics</h3>
866
- <div class="setting-item">
867
- <label data-i18n="lbl_repulsion">Repulsion Strength</label>
868
- <input
869
- type="range"
870
- id="set-charge"
871
- min="-1000"
872
- max="-50"
873
- step="50"
874
- />
875
- <span class="value-display" id="val-charge"></span>
876
- </div>
877
- <div class="setting-item">
878
- <label data-i18n="lbl_distance">Link Distance</label>
879
- <input
880
- type="range"
881
- id="set-distance"
882
- min="20"
883
- max="900"
884
- step="10"
885
- />
886
- <span class="value-display" id="val-distance"></span>
887
- </div>
888
- <div class="setting-item">
889
- <label data-i18n="lbl_collision">Collision Radius</label>
890
- <input
891
- type="range"
892
- id="set-collision"
893
- min="5"
894
- max="100"
895
- step="5"
896
- />
897
- <span class="value-display" id="val-collision"></span>
898
- </div>
997
+ <div class="modal-header-copy">
998
+ <h2 data-i18n="settings_title">Visualization Settings</h2>
999
+ <p class="settings-modal-subtitle" data-i18n="settings_subtitle">
1000
+ Keep graph, reading, and performance controls compact. Agent
1001
+ provider setup lives on its own page.
1002
+ </p>
899
1003
  </div>
900
-
901
- <div class="settings-group">
902
- <div class="setting-item">
903
- <label
904
- ><span data-i18n="lbl_inbound_count"
905
- >Inbound Count:</span
906
- ></label
907
- >
908
- <select
909
- id="set-degree-mode"
910
- style="
911
- background: #444;
912
- color: white;
913
- border: 1px solid #555;
914
- padding: 2px;
915
- "
916
- >
917
- <option value="visible" data-i18n="opt_visible">
918
- Visible Nodes (Default)
919
- </option>
920
- <option value="total" data-i18n="opt_total">
921
- Total Statistical
922
- </option>
923
- </select>
924
- </div>
925
-
926
- <h3 data-i18n="grp_performance">Performance</h3>
927
- <div class="setting-item">
928
- <label data-i18n="lbl_max_workers">Max Workers (Memory)</label>
929
- <div style="display: flex; gap: 10px; align-items: center">
930
- <input
931
- type="range"
932
- id="set-workers-slider"
933
- min="1"
934
- max="32"
935
- value="4"
936
- style="flex: 1"
937
- />
938
- <input
939
- type="number"
940
- id="set-workers-input"
941
- min="1"
942
- max="128"
943
- value="4"
944
- style="
945
- width: 50px;
946
- background: #333;
947
- color: white;
948
- border: 1px solid #555;
949
- "
950
- />
951
- </div>
952
- <div
953
- style="font-size: 0.75rem; color: #888; margin-top: 2px"
954
- data-i18n="desc_workers"
955
- >
956
- Lower this if Node.js runs out of memory.
1004
+ <button class="modal-close" data-settings-close="main">&times;</button>
1005
+ </div>
1006
+ <div class="modal-body settings-modal-body">
1007
+ <div class="settings-page-grid">
1008
+ <section class="settings-card">
1009
+ <div class="settings-group">
1010
+ <h3 data-i18n="grp_general">General</h3>
1011
+ <div class="setting-item">
1012
+ <label data-i18n="lbl_language">Language</label>
1013
+ <select id="set-language" class="settings-select">
1014
+ <option value="en">English</option>
1015
+ <option value="zh">中文</option>
1016
+ </select>
1017
+ </div>
957
1018
  </div>
958
- </div>
1019
+ </section>
959
1020
 
960
- <div class="setting-item">
961
- <label
962
- style="display: flex; align-items: center; cursor: pointer"
963
- >
964
- <input type="checkbox" id="set-gpu" checked />
965
- <span style="margin-left: 10px" data-i18n="lbl_gpu"
966
- >Enable GPU Acceleration</span
967
- >
968
- </label>
969
- <div
970
- style="font-size: 0.75rem; color: #888; margin-top: 2px"
971
- data-i18n="desc_gpu"
972
- >
973
- Use GPU for similarity calculation (Requires page reload).
1021
+ <section class="settings-card">
1022
+ <div class="settings-group">
1023
+ <h3 data-i18n="grp_visuals">Visuals</h3>
1024
+ <div class="setting-item">
1025
+ <label data-i18n="lbl_opacity">Edge Opacity</label>
1026
+ <input
1027
+ type="range"
1028
+ id="set-opacity"
1029
+ min="0.1"
1030
+ max="1.0"
1031
+ step="0.1"
1032
+ />
1033
+ <span class="value-display" id="val-opacity"></span>
1034
+ </div>
1035
+ <div class="setting-item">
1036
+ <label><span data-i18n="lbl_inbound_count">Inbound Count:</span></label>
1037
+ <select id="set-degree-mode" class="settings-select">
1038
+ <option value="visible" data-i18n="opt_visible">
1039
+ Visible Nodes (Default)
1040
+ </option>
1041
+ <option value="total" data-i18n="opt_total">
1042
+ Total Statistical
1043
+ </option>
1044
+ </select>
1045
+ </div>
974
1046
  </div>
975
- </div>
1047
+ </section>
976
1048
 
977
- <div class="setting-item">
978
- <label
979
- style="display: flex; align-items: center; cursor: pointer"
980
- >
981
- <input type="checkbox" id="set-memory-saving" />
982
- <span style="margin-left: 10px" data-i18n="lbl_memory_saving"
983
- >Large File Memory Saving Strategy</span
984
- >
985
- </label>
986
- <div
987
- style="font-size: 0.75rem; color: #888; margin-top: 2px"
988
- data-i18n="desc_memory_saving"
989
- >
990
- Use lower precision strategies to prevent OOM on large files.
1049
+ <section class="settings-card">
1050
+ <div class="settings-group">
1051
+ <h3 data-i18n="grp_physics">Physics</h3>
1052
+ <div class="setting-item">
1053
+ <label data-i18n="lbl_repulsion">Repulsion Strength</label>
1054
+ <input
1055
+ type="range"
1056
+ id="set-charge"
1057
+ min="-1000"
1058
+ max="-50"
1059
+ step="50"
1060
+ />
1061
+ <span class="value-display" id="val-charge"></span>
1062
+ </div>
1063
+ <div class="setting-item">
1064
+ <label data-i18n="lbl_distance">Link Distance</label>
1065
+ <input
1066
+ type="range"
1067
+ id="set-distance"
1068
+ min="20"
1069
+ max="900"
1070
+ step="10"
1071
+ />
1072
+ <span class="value-display" id="val-distance"></span>
1073
+ </div>
1074
+ <div class="setting-item">
1075
+ <label data-i18n="lbl_collision">Collision Radius</label>
1076
+ <input
1077
+ type="range"
1078
+ id="set-collision"
1079
+ min="5"
1080
+ max="100"
1081
+ step="5"
1082
+ />
1083
+ <span class="value-display" id="val-collision"></span>
1084
+ </div>
991
1085
  </div>
992
- </div>
1086
+ </section>
993
1087
 
994
- <div class="setting-item">
995
- <label
996
- style="display: flex; align-items: center; cursor: pointer"
997
- >
998
- <input type="checkbox" id="set-compact-mode" />
999
- <span style="margin-left: 10px" data-i18n="lbl_compact_mode"
1000
- >Compact Mode (Hide Edges)</span
1001
- >
1002
- </label>
1003
- <div
1004
- style="font-size: 0.75rem; color: #888; margin-top: 2px"
1005
- data-i18n="desc_compact_mode"
1006
- >
1007
- Don't load/render edges by default to improve performance for
1008
- >5k nodes.
1088
+ <section class="settings-card">
1089
+ <div class="settings-group">
1090
+ <h3 data-i18n="grp_performance">Performance</h3>
1091
+ <div class="setting-item setting-item-stack">
1092
+ <label data-i18n="lbl_max_workers">Max Workers (Memory)</label>
1093
+ <div class="settings-inline-row">
1094
+ <input
1095
+ type="range"
1096
+ id="set-workers-slider"
1097
+ min="1"
1098
+ max="32"
1099
+ value="4"
1100
+ style="flex: 1"
1101
+ />
1102
+ <input
1103
+ type="number"
1104
+ id="set-workers-input"
1105
+ min="1"
1106
+ max="128"
1107
+ value="4"
1108
+ class="settings-number"
1109
+ />
1110
+ </div>
1111
+ <div class="settings-helper-block" data-i18n="desc_workers">
1112
+ Lower this if Node.js runs out of memory.
1113
+ </div>
1114
+ </div>
1115
+
1116
+ <div class="setting-item setting-item-stack">
1117
+ <label class="settings-toggle">
1118
+ <input type="checkbox" id="set-gpu" checked />
1119
+ <span data-i18n="lbl_gpu">Enable GPU Acceleration</span>
1120
+ </label>
1121
+ <div class="settings-helper-block" data-i18n="desc_gpu">
1122
+ Use GPU for similarity calculation (Requires page reload).
1123
+ </div>
1124
+ </div>
1125
+
1126
+ <div class="setting-item setting-item-stack">
1127
+ <label class="settings-toggle">
1128
+ <input type="checkbox" id="set-memory-saving" />
1129
+ <span data-i18n="lbl_memory_saving">Large File Memory Saving Strategy</span>
1130
+ </label>
1131
+ <div class="settings-helper-block" data-i18n="desc_memory_saving">
1132
+ Use lower precision strategies to prevent OOM on large files.
1133
+ </div>
1134
+ </div>
1135
+
1136
+ <div class="setting-item setting-item-stack">
1137
+ <label class="settings-toggle">
1138
+ <input type="checkbox" id="set-compact-mode" />
1139
+ <span data-i18n="lbl_compact_mode">Compact Mode (Hide Edges)</span>
1140
+ </label>
1141
+ <div class="settings-helper-block" data-i18n="desc_compact_mode">
1142
+ Don't load/render edges by default to improve performance for >5k nodes.
1143
+ </div>
1144
+ </div>
1145
+
1146
+ <div class="setting-item setting-item-stack">
1147
+ <label class="settings-toggle">
1148
+ <input type="checkbox" id="set-static-mode" />
1149
+ <span data-i18n="lbl_static_mode">Static Mode</span>
1150
+ </label>
1151
+ <div class="settings-helper-block" data-i18n="desc_static_mode">
1152
+ Stop simulation after 2 seconds. Recommended for large graphs.
1153
+ </div>
1154
+ </div>
1155
+
1156
+ <div class="setting-item setting-item-stack">
1157
+ <label class="settings-toggle">
1158
+ <input type="checkbox" id="set-gpu-rendering" />
1159
+ <span data-i18n="lbl_gpu_rendering">GPU Optimised Rendering</span>
1160
+ </label>
1161
+ <div class="settings-helper-block" data-i18n="desc_gpu_rendering">
1162
+ Enable AMDGPU acceleration for loading and positioning.
1163
+ </div>
1164
+ </div>
1165
+
1166
+ <div class="setting-item setting-item-stack">
1167
+ <label class="settings-toggle">
1168
+ <input type="checkbox" id="set-deep-debug" />
1169
+ <span data-i18n="lbl_deep_debug">Developer Mode</span>
1170
+ </label>
1171
+ <div class="settings-helper-block" data-i18n="desc_deep_debug">
1172
+ Show backend diagnostics and relation details in advanced workspace panes.
1173
+ </div>
1174
+ </div>
1009
1175
  </div>
1010
- </div>
1176
+ </section>
1011
1177
 
1012
- <div class="setting-item">
1013
- <label
1014
- style="display: flex; align-items: center; cursor: pointer"
1015
- >
1016
- <input type="checkbox" id="set-static-mode" />
1017
- <span style="margin-left: 10px" data-i18n="lbl_static_mode"
1018
- >Static Mode</span
1019
- >
1020
- </label>
1021
- <div
1022
- style="font-size: 0.75rem; color: #888; margin-top: 2px"
1023
- data-i18n="desc_static_mode"
1024
- >
1025
- Stop simulation after 2 seconds. Recommended for large graphs.
1178
+ <section class="settings-card">
1179
+ <div class="settings-group">
1180
+ <h3 data-i18n="grp_reading">Reading</h3>
1181
+ <div class="setting-item">
1182
+ <label data-i18n="lbl_reading_mode">Open Mode</label>
1183
+ <select id="set-reading-mode" class="settings-select">
1184
+ <option value="window" data-i18n="opt_window">Window</option>
1185
+ <option value="fullscreen" data-i18n="opt_fullscreen">
1186
+ Full Screen
1187
+ </option>
1188
+ </select>
1189
+ </div>
1026
1190
  </div>
1027
- </div>
1028
1191
 
1029
- <div class="setting-item">
1030
- <label
1031
- style="display: flex; align-items: center; cursor: pointer"
1032
- >
1033
- <input type="checkbox" id="set-gpu-rendering" />
1034
- <span style="margin-left: 10px" data-i18n="lbl_gpu_rendering"
1035
- >GPU Optimised Rendering</span
1036
- >
1037
- </label>
1038
- <div
1039
- style="font-size: 0.75rem; color: #888; margin-top: 2px"
1040
- data-i18n="desc_gpu_rendering"
1041
- >
1042
- Enable AMDGPU acceleration for loading and positioning.
1192
+ <div class="settings-group">
1193
+ <h3 data-i18n="grp_path_mode">Path Mode</h3>
1194
+ <div class="setting-item setting-item-stack">
1195
+ <label class="settings-toggle">
1196
+ <input type="checkbox" id="set-retain-history" checked />
1197
+ <span data-i18n="lbl_retain_history">Retain Learning History</span>
1198
+ </label>
1199
+ <div class="settings-helper-block" data-i18n="desc_retain_history">
1200
+ Keep learned nodes state across sessions.
1201
+ </div>
1202
+ </div>
1043
1203
  </div>
1044
- </div>
1204
+ </section>
1045
1205
 
1046
- <div class="setting-item">
1047
- <label
1048
- style="display: flex; align-items: center; cursor: pointer"
1049
- >
1050
- <input type="checkbox" id="set-deep-debug" />
1051
- <span style="margin-left: 10px" data-i18n="lbl_deep_debug"
1052
- >Deep Debug</span
1206
+ <section class="settings-card settings-card-accent">
1207
+ <div class="settings-card-callout">
1208
+ <span class="settings-card-kicker" data-i18n="grp_ai_provider">AI Provider</span>
1209
+ <h3 class="settings-card-title" data-i18n="settings_agent_title">
1210
+ Agent Settings
1211
+ </h3>
1212
+ <p class="settings-card-copy" data-i18n="settings_agent_description">
1213
+ Provider presets, API keys, models, and TOML template actions are isolated on a dedicated page.
1214
+ </p>
1215
+ <button
1216
+ type="button"
1217
+ id="btn-open-agent-settings"
1218
+ class="btn btn-primary"
1219
+ data-i18n="settings_open_agent"
1053
1220
  >
1054
- </label>
1055
- <div
1056
- style="font-size: 0.75rem; color: #888; margin-top: 2px"
1057
- data-i18n="desc_deep_debug"
1058
- >
1059
- Enable detailed logging for debugging.
1221
+ Open Agent Settings
1222
+ </button>
1060
1223
  </div>
1061
- </div>
1224
+ </section>
1062
1225
  </div>
1226
+ </div>
1227
+ <div class="modal-footer modal-footer-settings">
1228
+ <button
1229
+ class="btn btn-secondary"
1230
+ id="btn-reset-settings"
1231
+ data-i18n="btn_reset"
1232
+ >
1233
+ Reset
1234
+ </button>
1235
+ <button
1236
+ class="btn btn-primary modal-close"
1237
+ data-settings-close="main"
1238
+ data-i18n="btn_done"
1239
+ >
1240
+ Done
1241
+ </button>
1242
+ </div>
1243
+ </div>
1244
+ </div>
1063
1245
 
1064
- <div class="settings-group">
1065
- <h3 data-i18n="grp_visuals">Visuals</h3>
1066
- <div class="setting-item">
1067
- <label data-i18n="lbl_opacity">Edge Opacity</label>
1068
- <input
1069
- type="range"
1070
- id="set-opacity"
1071
- min="0.1"
1072
- max="1.0"
1073
- step="0.1"
1074
- />
1075
- <span class="value-display" id="val-opacity"></span>
1246
+ <div
1247
+ id="agent-settings-modal"
1248
+ class="modal-overlay settings-modal-overlay"
1249
+ style="display: none"
1250
+ >
1251
+ <div class="modal-content modal-content-settings modal-content-agent-settings">
1252
+ <div class="modal-header">
1253
+ <div class="modal-header-copy">
1254
+ <div class="settings-breadcrumb-row">
1255
+ <button
1256
+ type="button"
1257
+ id="btn-agent-settings-back"
1258
+ class="btn btn-secondary btn-inline-nav"
1259
+ data-i18n="settings_back_to_general"
1260
+ >
1261
+ Back to Settings
1262
+ </button>
1076
1263
  </div>
1264
+ <h2 data-i18n="settings_agent_title">Agent Settings</h2>
1265
+ <p class="settings-modal-subtitle" data-i18n="settings_agent_subtitle">
1266
+ Provider, model, API key, and TOML template controls for agent workflows.
1267
+ </p>
1077
1268
  </div>
1269
+ <button class="modal-close" data-settings-close="agent">&times;</button>
1270
+ </div>
1271
+ <div class="modal-body settings-modal-body">
1272
+ <div class="settings-page-grid settings-page-grid-single">
1273
+ <section class="settings-card settings-card-wide">
1274
+ <div class="settings-group">
1275
+ <h3 data-i18n="grp_ai_provider">AI Provider</h3>
1276
+ <div class="setting-item setting-item-stack">
1277
+ <label data-i18n="lbl_notemd_provider_template">Preset Template</label>
1278
+ <div class="settings-inline-row">
1279
+ <select id="set-notemd-provider-template" class="settings-select settings-select-grow"></select>
1280
+ <button
1281
+ type="button"
1282
+ id="btn-apply-notemd-provider-template"
1283
+ class="btn btn-secondary"
1284
+ data-i18n="btn_apply_provider_template"
1285
+ >
1286
+ Apply Preset
1287
+ </button>
1288
+ </div>
1289
+ <div
1290
+ id="set-notemd-provider-template-hint"
1291
+ class="settings-helper-block"
1292
+ ></div>
1293
+ </div>
1078
1294
 
1079
- <div class="settings-group">
1080
- <h3 data-i18n="grp_path_mode">Path Mode</h3>
1081
- <div class="setting-item">
1082
- <label
1083
- style="display: flex; align-items: center; cursor: pointer"
1084
- >
1085
- <input type="checkbox" id="set-retain-history" checked />
1086
- <span style="margin-left: 10px" data-i18n="lbl_retain_history"
1087
- >Retain Learning History</span
1295
+ <div class="setting-item setting-item-stack">
1296
+ <label data-i18n="lbl_notemd_active_provider">Active Provider</label>
1297
+ <select id="set-notemd-provider-name" class="settings-select"></select>
1298
+ </div>
1299
+
1300
+ <div class="setting-item setting-item-stack">
1301
+ <label data-i18n="lbl_notemd_provider_base_url">Base URL</label>
1302
+ <input type="text" id="set-notemd-provider-base-url" class="settings-text-input" />
1303
+ </div>
1304
+
1305
+ <div class="setting-item setting-item-stack">
1306
+ <label data-i18n="lbl_notemd_provider_model">Model</label>
1307
+ <input type="text" id="set-notemd-provider-model" class="settings-text-input" />
1308
+ </div>
1309
+
1310
+ <div class="setting-item setting-item-stack">
1311
+ <label data-i18n="lbl_notemd_provider_api_key">API Key</label>
1312
+ <input type="password" id="set-notemd-provider-api-key" class="settings-text-input" />
1313
+ </div>
1314
+
1315
+ <div
1316
+ class="setting-item setting-item-stack"
1317
+ id="set-notemd-provider-api-version-row"
1088
1318
  >
1089
- </label>
1090
- <div
1091
- style="font-size: 0.75rem; color: #888; margin-top: 2px"
1092
- data-i18n="desc_retain_history"
1093
- >
1094
- Keep learned nodes state across sessions.
1095
- </div>
1096
- </div>
1097
- </div>
1319
+ <label data-i18n="lbl_notemd_provider_api_version">API Version</label>
1320
+ <input type="text" id="set-notemd-provider-api-version" class="settings-text-input" />
1321
+ <div
1322
+ id="set-notemd-provider-api-version-hint"
1323
+ class="settings-helper-block"
1324
+ data-i18n="notemd_provider_api_version_optional"
1325
+ >
1326
+ Optional. Leave blank for standard OpenAI-compatible endpoints. This is mainly used by Azure OpenAI.
1327
+ </div>
1328
+ </div>
1098
1329
 
1099
- <div class="settings-group">
1100
- <h3 data-i18n="grp_reading">Reading</h3>
1101
- <div class="setting-item">
1102
- <label data-i18n="lbl_reading_mode">Open Mode</label>
1103
- <select
1104
- id="set-reading-mode"
1105
- style="
1106
- background: #444;
1107
- color: white;
1108
- border: 1px solid #555;
1109
- padding: 2px;
1110
- "
1111
- >
1112
- <option value="window" data-i18n="opt_window">Window</option>
1113
- <option value="fullscreen" data-i18n="opt_fullscreen">
1114
- Full Screen
1115
- </option>
1116
- </select>
1117
- </div>
1330
+ <div class="setting-item setting-item-stack">
1331
+ <div class="settings-inline-row">
1332
+ <button
1333
+ type="button"
1334
+ id="btn-test-notemd-provider"
1335
+ class="btn btn-secondary"
1336
+ data-i18n="btn_test_provider_connection"
1337
+ >
1338
+ Test Connection
1339
+ </button>
1340
+ <button
1341
+ type="button"
1342
+ id="btn-save-notemd-provider"
1343
+ class="btn btn-primary"
1344
+ data-i18n="btn_save_provider_config"
1345
+ >
1346
+ Save Provider
1347
+ </button>
1348
+ <button
1349
+ type="button"
1350
+ id="btn-materialize-notemd-provider-templates"
1351
+ class="btn btn-secondary"
1352
+ data-i18n="btn_write_provider_templates"
1353
+ >
1354
+ Write TOML Templates
1355
+ </button>
1356
+ </div>
1357
+ <div
1358
+ id="set-notemd-provider-status"
1359
+ class="settings-helper-block"
1360
+ ></div>
1361
+ <div
1362
+ id="set-notemd-provider-config-path"
1363
+ class="settings-helper-block settings-helper-code"
1364
+ ></div>
1365
+ </div>
1366
+ </div>
1367
+ </section>
1118
1368
  </div>
1119
1369
  </div>
1120
- <div class="modal-footer">
1370
+ <div class="modal-footer modal-footer-settings">
1121
1371
  <button
1372
+ type="button"
1373
+ id="btn-agent-settings-back-footer"
1122
1374
  class="btn btn-secondary"
1123
- id="btn-reset-settings"
1124
- data-i18n="btn_reset"
1375
+ data-i18n="settings_back_to_general"
1125
1376
  >
1126
- Reset
1377
+ Back to Settings
1127
1378
  </button>
1128
- <button class="btn btn-primary modal-close" data-i18n="btn_done">
1379
+ <button
1380
+ class="btn btn-primary modal-close"
1381
+ data-settings-close="agent"
1382
+ data-i18n="btn_done"
1383
+ >
1129
1384
  Done
1130
1385
  </button>
1131
1386
  </div>
@@ -1266,10 +1521,17 @@
1266
1521
  <script src="runtime_bridge.js"></script>
1267
1522
  <script src="storage_provider.js"></script>
1268
1523
  <script src="settings.js"></script>
1524
+ <script src="markdown_runtime.js"></script>
1269
1525
  <script src="reader.js"></script>
1270
1526
  <!-- app.js removed for dynamic loading after data.js -->
1271
1527
  <script src="analysis.js"></script>
1272
1528
  <script src="loading.js"></script>
1529
+ <script src="focus_mode_interactions.js"></script>
1530
+ <script src="godot_tree_interactions.js"></script>
1531
+ <script src="godot_future_path_renderer.js"></script>
1532
+ <script src="hosted_future_path_runtime.js"></script>
1533
+ <script src="workspace_panes.js"></script>
1534
+ <script src="agent_workspace.js"></script>
1273
1535
  <script src="source_manager.js"></script>
1274
1536
  <script src="welcome.js"></script>
1275
1537
  <!-- Path Mode Container (Hidden by default) -->
@@ -1345,6 +1607,16 @@
1345
1607
  </button>
1346
1608
  </div>
1347
1609
 
1610
+ <div class="toolbar-group">
1611
+ <button
1612
+ id="btn-toggle-learning-workbench"
1613
+ class="icon-btn"
1614
+ title="Toggle Learning Workbench"
1615
+ >
1616
+ <span>Workbench</span>
1617
+ </button>
1618
+ </div>
1619
+
1348
1620
  <div class="toolbar-group right">
1349
1621
  <button id="btn-exit-path" class="icon-btn" title="Exit Path Mode">
1350
1622
  <i class="fas fa-times"></i> <span data-i18n="btn_exit">Exit</span>
@@ -1396,6 +1668,106 @@
1396
1668
  </div>
1397
1669
  </div>
1398
1670
 
1671
+ <!-- Learning Workbench Sidebar -->
1672
+ <div
1673
+ id="learning-workbench-sidebar"
1674
+ class="path-sidebar workbench-sidebar"
1675
+ style="display: none"
1676
+ >
1677
+ <div class="sidebar-header">
1678
+ <h3>Learning Workbench</h3>
1679
+ <button id="btn-close-learning-workbench" class="close-btn">&times;</button>
1680
+ </div>
1681
+ <div class="sidebar-content workbench-content">
1682
+ <div class="workbench-field">
1683
+ <label for="learning-user-id">Learner ID</label>
1684
+ <input
1685
+ id="learning-user-id"
1686
+ type="text"
1687
+ placeholder="path_user_default"
1688
+ />
1689
+ </div>
1690
+ <div class="workbench-row">
1691
+ <button id="btn-refresh-learning-workbench" class="btn-small">Refresh</button>
1692
+ <button id="btn-ingest-focus-node" class="btn-small">Ingest Focus</button>
1693
+ <button id="btn-run-learning-session" class="btn-small">Run Session</button>
1694
+ <button id="btn-run-retest-session" class="btn-small">Run Retest</button>
1695
+ </div>
1696
+ <div id="learning-workbench-status" class="workbench-status">Ready.</div>
1697
+ <div id="learning-workbench-updated-at" class="workbench-updated-at">Last updated: -</div>
1698
+
1699
+ <div class="workbench-section">
1700
+ <h4>Quality Snapshot</h4>
1701
+ <div class="workbench-row">
1702
+ <button id="btn-set-quality-baseline" class="btn-small" type="button">Set Baseline</button>
1703
+ <button id="btn-evaluate-quality-gates" class="btn-small" type="button">Evaluate Gates</button>
1704
+ </div>
1705
+ <ul id="learning-quality-summary" class="workbench-list">
1706
+ <li class="muted">No quality snapshot yet.</li>
1707
+ </ul>
1708
+ <pre id="learning-quality-gates" class="workbench-feedback">No quality gate evaluation yet.</pre>
1709
+ </div>
1710
+
1711
+ <div class="workbench-section">
1712
+ <h4>Top Misconceptions</h4>
1713
+ <ul id="learning-misconception-list" class="workbench-list">
1714
+ <li class="muted">No recurring misconceptions detected.</li>
1715
+ </ul>
1716
+ </div>
1717
+
1718
+ <div class="workbench-section">
1719
+ <h4>Session Actions</h4>
1720
+ <ul id="learning-session-actions" class="workbench-list">
1721
+ <li class="muted">No session actions yet.</li>
1722
+ </ul>
1723
+ </div>
1724
+
1725
+ <div class="workbench-section">
1726
+ <h4>Tutor Feedback</h4>
1727
+ <pre id="learning-tutor-feedback" class="workbench-feedback">No tutor feedback yet.</pre>
1728
+ </div>
1729
+
1730
+ <div class="workbench-section">
1731
+ <h4>Session Execution</h4>
1732
+ <pre id="learning-session-execution" class="workbench-feedback">No session execution yet.</pre>
1733
+ </div>
1734
+
1735
+ <div class="workbench-section">
1736
+ <h4>Session History</h4>
1737
+ <div class="workbench-row">
1738
+ <label for="learning-history-kind-filter">Kind</label>
1739
+ <select id="learning-history-kind-filter" class="control-select">
1740
+ <option value="all">All</option>
1741
+ <option value="session">Session</option>
1742
+ <option value="retest">Retest</option>
1743
+ <option value="custom">Custom</option>
1744
+ </select>
1745
+ <button id="btn-learning-history-prev" class="btn-small" type="button">Prev</button>
1746
+ <button id="btn-learning-history-next" class="btn-small" type="button">Next</button>
1747
+ <span id="learning-history-page" class="muted">Page 1/1</span>
1748
+ </div>
1749
+ <div class="workbench-row">
1750
+ <label for="learning-history-from-date">From</label>
1751
+ <input id="learning-history-from-date" type="date" class="control-input" />
1752
+ <label for="learning-history-to-date">To</label>
1753
+ <input id="learning-history-to-date" type="date" class="control-input" />
1754
+ <button id="btn-learning-history-apply-range" class="btn-small" type="button">Apply</button>
1755
+ <button id="btn-learning-history-clear-range" class="btn-small" type="button">Clear</button>
1756
+ </div>
1757
+ <div id="learning-session-history-summary" class="workbench-runtime">
1758
+ History summary: unavailable
1759
+ </div>
1760
+ <ul id="learning-session-history" class="workbench-list">
1761
+ <li class="muted">No session history yet.</li>
1762
+ </ul>
1763
+ </div>
1764
+
1765
+ <div id="learning-runtime-summary" class="workbench-runtime">
1766
+ Runtime: unavailable
1767
+ </div>
1768
+ </div>
1769
+ </div>
1770
+
1399
1771
  <!-- Node Selector Modal for Diffusion Mode -->
1400
1772
  <div id="node-select-modal" class="modal-overlay" style="display: none">
1401
1773
  <div class="modal-content" style="max-width: 500px">
@@ -1431,7 +1803,10 @@
1431
1803
 
1432
1804
  <!-- Path Mode Scripts -->
1433
1805
  <script src="libs/path_core.js"></script>
1806
+ <script src="path_modules_bridge.js"></script>
1434
1807
  <script src="path_app.js"></script>
1808
+
1809
+ <!-- ES Module Entry (Vite dev/build) - loads after legacy scripts for backward compat -->
1810
+ <script type="module" src="./main.mjs"></script>
1435
1811
  </body>
1436
1812
  </html>
1437
-