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
@@ -249,3 +249,52 @@ input[type="checkbox"] {
249
249
  align-items: flex-start;
250
250
  }
251
251
  }
252
+
253
+ /* ── Agent Tools ── */
254
+ .badge {
255
+ background: var(--accent);
256
+ color: var(--bg-0);
257
+ font-size: 0.75rem;
258
+ padding: 0.15em 0.5em;
259
+ border-radius: 8px;
260
+ margin-left: 0.5em;
261
+ vertical-align: middle;
262
+ }
263
+ .agent-tool-card {
264
+ background: var(--card);
265
+ border: 1px solid var(--border);
266
+ border-radius: 8px;
267
+ padding: 0.6em 0.9em;
268
+ margin: 0.3em 0;
269
+ display: flex;
270
+ flex-direction: column;
271
+ gap: 0.25em;
272
+ }
273
+ .agent-tool-card.auto-exec {
274
+ border-left: 3px solid #4caf50;
275
+ }
276
+ .agent-tool-header {
277
+ display: flex;
278
+ justify-content: space-between;
279
+ align-items: center;
280
+ }
281
+ .agent-tool-name {
282
+ font-weight: 600;
283
+ font-size: 0.85rem;
284
+ }
285
+ .agent-tool-level {
286
+ font-size: 0.65rem;
287
+ padding: 0.1em 0.4em;
288
+ border-radius: 4px;
289
+ text-transform: uppercase;
290
+ opacity: 0.85;
291
+ }
292
+ .level-safe { background: #1b5e20; color: #a5d6a7; }
293
+ .level-requires-active-file { background: #0d47a1; color: #90caf9; }
294
+ .level-requires-selection { background: #e65100; color: #ffcc80; }
295
+ .level-interactive-ui { background: #4a148c; color: #ce93d8; }
296
+ .agent-tool-params {
297
+ font-size: 0.7rem;
298
+ opacity: 0.6;
299
+ font-family: monospace;
300
+ }
@@ -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'; style-src 'self' 'unsafe-inline'; connect-src 'self' http://127.0.0.1:* http://localhost:* tauri://localhost http://tauri.localhost; object-src 'none'; base-uri 'self'; frame-ancestors 'self'; form-action 'self';"
8
+ content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; connect-src 'self' ipc: http://127.0.0.1:* http://localhost:* http://ipc.localhost https://ipc.localhost tauri://localhost http://tauri.localhost https://tauri.localhost; object-src 'none'; base-uri 'self'; form-action 'self';"
9
9
  />
10
10
  <title>NoteMD Workspace</title>
11
11
  <link rel="stylesheet" href="notemd.css" />
@@ -146,6 +146,12 @@
146
146
  </div>
147
147
  </section>
148
148
 
149
+ <section class="panel" id="agent-tools-panel">
150
+ <h2>Agent Tools <span class="badge" id="agent-op-count"></span></h2>
151
+ <p class="subtitle">Auto-discovered operations from the Notemd CLI registry. Safe operations can be auto-executed by the Agent Workspace.</p>
152
+ <div class="grid two" id="agent-tools-grid"></div>
153
+ </section>
154
+
149
155
  <section class="panel">
150
156
  <h2>Logs</h2>
151
157
  <pre id="log-output" class="log-output"></pre>
@@ -801,4 +801,68 @@
801
801
  );
802
802
  }
803
803
  });
804
+
805
+ // ── Agent Tools: fetch & render CLI capability manifest ──
806
+ async function loadAgentTools() {
807
+ const grid = document.getElementById('agent-tools-grid');
808
+ const badge = document.getElementById('agent-op-count');
809
+ if (!grid || !badge) return;
810
+
811
+ try {
812
+ const res = await fetch('/api/notemd/agent-manifest');
813
+ if (!res.ok) throw new Error('agent-manifest fetch failed: ' + res.status);
814
+ const data = await res.json();
815
+ const manifest = data.manifest;
816
+ if (!manifest || !Array.isArray(manifest.operations)) return;
817
+
818
+ badge.textContent = manifest.agentExecutableCount + ' auto / ' + manifest.totalOperations + ' total';
819
+
820
+ const safeLabel = function (level) {
821
+ switch (level) {
822
+ case 'safe': return 'auto';
823
+ case 'requires-active-file': return 'file';
824
+ case 'requires-selection': return 'select';
825
+ case 'interactive-ui': return 'ui';
826
+ default: return level;
827
+ }
828
+ };
829
+
830
+ manifest.operations.forEach(function (op) {
831
+ var card = document.createElement('div');
832
+ card.className = 'agent-tool-card' + (op.agentAutoExecutable ? ' auto-exec' : '');
833
+ card.title = op.operationId + '\nContext: ' + op.requiredContext + '\nSide Effects: ' + op.sideEffectClass;
834
+
835
+ var header = document.createElement('div');
836
+ header.className = 'agent-tool-header';
837
+
838
+ var name = document.createElement('span');
839
+ name.className = 'agent-tool-name';
840
+ name.textContent = op.description;
841
+
842
+ var level = document.createElement('span');
843
+ level.className = 'agent-tool-level level-' + op.automationLevel;
844
+ level.textContent = safeLabel(op.automationLevel);
845
+
846
+ var params = document.createElement('div');
847
+ params.className = 'agent-tool-params';
848
+ if (op.requiredParams.length > 0) {
849
+ params.textContent = 'params: ' + op.requiredParams.join(', ');
850
+ } else {
851
+ params.textContent = 'no required params';
852
+ }
853
+
854
+ header.appendChild(name);
855
+ header.appendChild(level);
856
+ card.appendChild(header);
857
+ card.appendChild(params);
858
+ grid.appendChild(card);
859
+ });
860
+
861
+ appendLog('Agent Tools: loaded ' + manifest.totalOperations + ' operations (' + manifest.agentExecutableCount + ' auto-executable)', 'info');
862
+ } catch (error) {
863
+ appendLog('Agent Tools failed: ' + (error instanceof Error ? error.message : String(error)), 'warn');
864
+ }
865
+ }
866
+
867
+ loadAgentTools();
804
868
  })();
@@ -40,6 +40,12 @@
40
40
  </select>
41
41
  </div>
42
42
 
43
+ <div class="toolbar-group">
44
+ <button id="btn-toggle-learning-workbench" class="icon-btn" title="Toggle Learning Workbench">
45
+ Workbench
46
+ </button>
47
+ </div>
48
+
43
49
  <div class="toolbar-group right">
44
50
  <button id="btn-exit-path" class="icon-btn" title="Exit Path Mode">
45
51
  ❌ Exit
@@ -59,6 +65,106 @@
59
65
  </div>
60
66
  </div>
61
67
 
68
+ <!-- Learning Workbench Sidebar -->
69
+ <div
70
+ id="learning-workbench-sidebar"
71
+ class="path-sidebar workbench-sidebar"
72
+ style="display: none"
73
+ >
74
+ <div class="sidebar-header">
75
+ <h3>Learning Workbench</h3>
76
+ <button id="btn-close-learning-workbench" class="close-btn">&times;</button>
77
+ </div>
78
+ <div class="sidebar-content workbench-content">
79
+ <div class="workbench-field">
80
+ <label for="learning-user-id">Learner ID</label>
81
+ <input
82
+ id="learning-user-id"
83
+ type="text"
84
+ placeholder="path_user_default"
85
+ />
86
+ </div>
87
+ <div class="workbench-row">
88
+ <button id="btn-refresh-learning-workbench" class="btn-small">Refresh</button>
89
+ <button id="btn-ingest-focus-node" class="btn-small">Ingest Focus</button>
90
+ <button id="btn-run-learning-session" class="btn-small">Run Session</button>
91
+ <button id="btn-run-retest-session" class="btn-small">Run Retest</button>
92
+ </div>
93
+ <div id="learning-workbench-status" class="workbench-status">Ready.</div>
94
+ <div id="learning-workbench-updated-at" class="workbench-updated-at">Last updated: -</div>
95
+
96
+ <div class="workbench-section">
97
+ <h4>Quality Snapshot</h4>
98
+ <div class="workbench-row">
99
+ <button id="btn-set-quality-baseline" class="btn-small" type="button">Set Baseline</button>
100
+ <button id="btn-evaluate-quality-gates" class="btn-small" type="button">Evaluate Gates</button>
101
+ </div>
102
+ <ul id="learning-quality-summary" class="workbench-list">
103
+ <li class="muted">No quality snapshot yet.</li>
104
+ </ul>
105
+ <pre id="learning-quality-gates" class="workbench-feedback">No quality gate evaluation yet.</pre>
106
+ </div>
107
+
108
+ <div class="workbench-section">
109
+ <h4>Top Misconceptions</h4>
110
+ <ul id="learning-misconception-list" class="workbench-list">
111
+ <li class="muted">No recurring misconceptions detected.</li>
112
+ </ul>
113
+ </div>
114
+
115
+ <div class="workbench-section">
116
+ <h4>Session Actions</h4>
117
+ <ul id="learning-session-actions" class="workbench-list">
118
+ <li class="muted">No session actions yet.</li>
119
+ </ul>
120
+ </div>
121
+
122
+ <div class="workbench-section">
123
+ <h4>Tutor Feedback</h4>
124
+ <pre id="learning-tutor-feedback" class="workbench-feedback">No tutor feedback yet.</pre>
125
+ </div>
126
+
127
+ <div class="workbench-section">
128
+ <h4>Session Execution</h4>
129
+ <pre id="learning-session-execution" class="workbench-feedback">No session execution yet.</pre>
130
+ </div>
131
+
132
+ <div class="workbench-section">
133
+ <h4>Session History</h4>
134
+ <div class="workbench-row">
135
+ <label for="learning-history-kind-filter">Kind</label>
136
+ <select id="learning-history-kind-filter" class="control-select">
137
+ <option value="all">All</option>
138
+ <option value="session">Session</option>
139
+ <option value="retest">Retest</option>
140
+ <option value="custom">Custom</option>
141
+ </select>
142
+ <button id="btn-learning-history-prev" class="btn-small" type="button">Prev</button>
143
+ <button id="btn-learning-history-next" class="btn-small" type="button">Next</button>
144
+ <span id="learning-history-page" class="muted">Page 1/1</span>
145
+ </div>
146
+ <div class="workbench-row">
147
+ <label for="learning-history-from-date">From</label>
148
+ <input id="learning-history-from-date" type="date" class="control-input" />
149
+ <label for="learning-history-to-date">To</label>
150
+ <input id="learning-history-to-date" type="date" class="control-input" />
151
+ <button id="btn-learning-history-apply-range" class="btn-small" type="button">Apply</button>
152
+ <button id="btn-learning-history-clear-range" class="btn-small" type="button">Clear</button>
153
+ </div>
154
+ <div id="learning-session-history-summary" class="workbench-runtime">
155
+ History summary: unavailable
156
+ </div>
157
+ <ul id="learning-session-history" class="workbench-list">
158
+ <li class="muted">No session history yet.</li>
159
+ </ul>
160
+ </div>
161
+
162
+ <div id="learning-runtime-summary" class="workbench-runtime">
163
+ Runtime: unavailable
164
+ </div>
165
+ </div>
166
+ </div>
167
+
62
168
  <!-- Reading Mode Dependencies -->
63
169
  <script src="libs/marked.min.js"></script>
64
170
  <link rel="stylesheet" href="libs/katex/katex.min.css" />
@@ -97,6 +203,7 @@
97
203
 
98
204
  <!-- Scripts -->
99
205
  <script src="i18n.js"></script>
206
+ <script src="path_modules_bridge.js"></script>
100
207
  <script src="path_app.js"></script>
101
208
  </body>
102
209
  </html>