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
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeGovernedMemoryType = normalizeGovernedMemoryType;
4
+ exports.normalizeGovernedMemoryPurpose = normalizeGovernedMemoryPurpose;
5
+ exports.classifyMemoryEntry = classifyMemoryEntry;
6
+ exports.computeGovernedMemoryWeight = computeGovernedMemoryWeight;
7
+ exports.buildMemoryAuditRecord = buildMemoryAuditRecord;
8
+ function normalizeGovernedMemoryType(value) {
9
+ const normalized = String(value || '').trim().toLowerCase();
10
+ if (normalized === 'study' || normalized === 'note' || normalized === 'system') {
11
+ return normalized;
12
+ }
13
+ return 'fact';
14
+ }
15
+ function normalizeGovernedMemoryPurpose(value) {
16
+ const normalized = String(value || '').trim().toLowerCase();
17
+ if (normalized === 'internalized' || normalized === 'supplementary' || normalized === 'systemic') {
18
+ return normalized;
19
+ }
20
+ return 'memorized';
21
+ }
22
+ function classifyMemoryEntry(entry) {
23
+ const tags = Array.isArray(entry.tags) ? entry.tags.map((tag) => String(tag || '').trim().toLowerCase()) : [];
24
+ const rawText = `${entry.key} ${entry.value} ${tags.join(' ')}`.toLowerCase();
25
+ const memoryType = normalizeGovernedMemoryType(entry.memoryType
26
+ || (tags.includes('study') || rawText.includes('quiz') || rawText.includes('review') ? 'study'
27
+ : tags.includes('note') || rawText.includes('note') ? 'note'
28
+ : tags.includes('system') ? 'system'
29
+ : 'fact'));
30
+ const memoryPurpose = normalizeGovernedMemoryPurpose(entry.memoryPurpose
31
+ || (memoryType === 'study' ? 'internalized'
32
+ : memoryType === 'system' ? 'systemic'
33
+ : memoryType === 'note' ? 'supplementary'
34
+ : 'memorized'));
35
+ return {
36
+ memoryType,
37
+ memoryPurpose,
38
+ classificationConfidence: Math.max(0.45, Math.min(0.98, Number(entry.confidence || 0.72))),
39
+ };
40
+ }
41
+ function computeGovernedMemoryWeight(entry) {
42
+ const { memoryType, memoryPurpose } = classifyMemoryEntry(entry);
43
+ const typeWeight = memoryType === 'study'
44
+ ? 1.25
45
+ : memoryType === 'note'
46
+ ? 1.1
47
+ : memoryType === 'system'
48
+ ? 0.7
49
+ : 1;
50
+ const purposeWeight = memoryPurpose === 'internalized'
51
+ ? 1.35
52
+ : memoryPurpose === 'supplementary'
53
+ ? 0.92
54
+ : memoryPurpose === 'systemic'
55
+ ? 0.75
56
+ : 1;
57
+ return Number((typeWeight * purposeWeight).toFixed(4));
58
+ }
59
+ function buildMemoryAuditRecord(nextId, params) {
60
+ const classification = classifyMemoryEntry(params.entry);
61
+ return {
62
+ auditId: nextId('memory_audit'),
63
+ userId: params.userId,
64
+ operation: params.operation,
65
+ layer: params.layer,
66
+ memoryKey: params.entry.key,
67
+ memoryType: classification.memoryType,
68
+ memoryPurpose: classification.memoryPurpose,
69
+ reason: params.reason,
70
+ scopeWorkspaceId: params.scopeWorkspaceId || null,
71
+ scopeCorpusId: params.scopeCorpusId || null,
72
+ recordedAt: params.recordedAt,
73
+ };
74
+ }
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const MemoryGovernance_1 = require("./MemoryGovernance");
4
+ describe('MemoryGovernance', () => {
5
+ test('classifies study memories and raises their retrieval weight', () => {
6
+ const entry = {
7
+ key: 'quiz_note',
8
+ value: 'Review this quiz correction before the next session.',
9
+ tags: ['study', 'review'],
10
+ confidence: 0.84,
11
+ references: ['atom_1'],
12
+ createdAt: '2026-05-26T00:00:00.000Z',
13
+ updatedAt: '2026-05-26T00:00:00.000Z',
14
+ };
15
+ const classification = (0, MemoryGovernance_1.classifyMemoryEntry)(entry);
16
+ expect(classification.memoryType).toBe('study');
17
+ expect(classification.memoryPurpose).toBe('internalized');
18
+ expect((0, MemoryGovernance_1.computeGovernedMemoryWeight)(entry)).toBeGreaterThan(1);
19
+ });
20
+ test('builds audit records with explicit scope fields', () => {
21
+ const entry = {
22
+ key: 'memory_1',
23
+ value: 'Scoped note',
24
+ tags: ['note'],
25
+ confidence: 0.7,
26
+ references: [],
27
+ scopeWorkspaceId: 'optics',
28
+ scopeCorpusId: 'optics',
29
+ createdAt: '2026-05-26T00:00:00.000Z',
30
+ updatedAt: '2026-05-26T00:00:00.000Z',
31
+ };
32
+ const audit = (0, MemoryGovernance_1.buildMemoryAuditRecord)((prefix = 'memory_audit') => `${prefix}_1`, {
33
+ userId: 'user_a',
34
+ operation: 'write',
35
+ layer: 'session',
36
+ entry,
37
+ reason: 'test',
38
+ scopeWorkspaceId: 'optics',
39
+ scopeCorpusId: 'optics',
40
+ recordedAt: '2026-05-26T00:01:00.000Z',
41
+ });
42
+ expect(audit.scopeWorkspaceId).toBe('optics');
43
+ expect(audit.scopeCorpusId).toBe('optics');
44
+ expect(audit.memoryKey).toBe('memory_1');
45
+ });
46
+ });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const fs = __importStar(require("fs"));
37
+ const path = __importStar(require("path"));
38
+ describe('mermaid frontend guard contract', () => {
39
+ const repoRoot = path.resolve(__dirname, '..');
40
+ const appPath = path.join(repoRoot, 'src', 'frontend', 'app.js');
41
+ const readerPath = path.join(repoRoot, 'src', 'frontend', 'reader.js');
42
+ const stylesPath = path.join(repoRoot, 'src', 'frontend', 'styles.css');
43
+ test('installs a global Mermaid artifact suppression observer for leaked error SVGs', () => {
44
+ const source = fs.readFileSync(appPath, 'utf8');
45
+ expect(source).toContain('function suppressMermaidErrorArtifacts(root, context = {})');
46
+ expect(source).toContain('function installMermaidErrorArtifactObserver()');
47
+ expect(source).toContain('function installMermaidRuntimeGuards()');
48
+ expect(source).toContain('function exposeMermaidDebugInterface()');
49
+ expect(source).toContain('installMermaidErrorArtifactObserver();');
50
+ expect(source).toContain("normalized.includes('syntax error in text')");
51
+ expect(source).toContain("normalized.includes('mermaid version')");
52
+ expect(source).toContain('captureRuntimeState: () => ({');
53
+ expect(source).toContain('function isProtectedMermaidSuppressionHost(host)');
54
+ expect(source).toContain('root !== document.body');
55
+ expect(source).toContain("host.id === 'reading-body'");
56
+ });
57
+ test('reader mermaid suppression never selects the page root as a removable host', () => {
58
+ const source = fs.readFileSync(readerPath, 'utf8');
59
+ expect(source).toContain('isProtectedMermaidSuppressionHost(host)');
60
+ expect(source).toContain('root !== document.body');
61
+ expect(source).toContain("host.id === 'graph-wrapper'");
62
+ expect(source).toContain('Reader Mermaid offscreen host mount root is unavailable.');
63
+ expect(source).toContain('ensureReaderStructure()');
64
+ expect(source).toContain("replacementBody.id = 'reading-body'");
65
+ expect(source).toContain('this.contentBox.appendChild(replacementBody);');
66
+ expect(source).toContain('lookupNodeDataById(nodeId)');
67
+ expect(source).toContain("typeof graphData !== 'undefined'");
68
+ expect(source).toContain('isReaderBodyVisiblyEmpty()');
69
+ expect(source).toContain('Markdown protocol path completed without visible content. Falling back to raw markdown render.');
70
+ });
71
+ test('ships compact inline and toast styles for suppressed Mermaid errors', () => {
72
+ const source = fs.readFileSync(stylesPath, 'utf8');
73
+ expect(source).toContain('.mermaid-inline-guard');
74
+ expect(source).toContain('.mermaid-error-toast-stack');
75
+ expect(source).toContain('.mermaid-error-toast');
76
+ });
77
+ });
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setSidecarAuthToken = setSidecarAuthToken;
4
+ exports.isAuthorizedRequest = isAuthorizedRequest;
5
+ let sidecarAuthToken = null;
6
+ function setSidecarAuthToken(token) {
7
+ sidecarAuthToken = token;
8
+ }
9
+ function isAuthorizedRequest(req) {
10
+ if (!sidecarAuthToken)
11
+ return true;
12
+ const authHeader = req.headers.authorization || '';
13
+ if (authHeader.startsWith('Bearer ')) {
14
+ return authHeader.slice(7) === sidecarAuthToken;
15
+ }
16
+ return true;
17
+ }
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.readRequestBody = readRequestBody;
4
+ exports.parseJsonBody = parseJsonBody;
5
+ exports.sendJson = sendJson;
6
+ exports.sendError = sendError;
7
+ const MAX_BODY_SIZE = 50 * 1024 * 1024; // 50MB
8
+ async function readRequestBody(req) {
9
+ return new Promise((resolve, reject) => {
10
+ const chunks = [];
11
+ let totalSize = 0;
12
+ req.on('data', (chunk) => {
13
+ totalSize += chunk.length;
14
+ if (totalSize > MAX_BODY_SIZE) {
15
+ req.destroy();
16
+ reject(new Error('Request body exceeds maximum size'));
17
+ return;
18
+ }
19
+ chunks.push(chunk);
20
+ });
21
+ req.on('end', () => {
22
+ resolve(Buffer.concat(chunks).toString('utf8'));
23
+ });
24
+ req.on('error', reject);
25
+ });
26
+ }
27
+ async function parseJsonBody(req) {
28
+ const raw = await readRequestBody(req);
29
+ if (!raw.trim())
30
+ return {};
31
+ return JSON.parse(raw);
32
+ }
33
+ function sendJson(res, statusCode, data) {
34
+ res.writeHead(statusCode, { 'Content-Type': 'application/json' });
35
+ res.end(JSON.stringify(data));
36
+ }
37
+ function sendError(res, statusCode, error, errorCode) {
38
+ if (errorCode) {
39
+ res.setHeader('x-nc-error-code', errorCode);
40
+ }
41
+ sendJson(res, statusCode, {
42
+ success: false,
43
+ error: error instanceof Error ? error.message : String(error),
44
+ });
45
+ }
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.applyCorsHeaders = applyCorsHeaders;
4
+ const ALLOWED_ORIGINS = new Set([
5
+ 'http://localhost:3000',
6
+ 'http://127.0.0.1:3000',
7
+ 'http://localhost:5173',
8
+ 'http://127.0.0.1:5173',
9
+ 'tauri://localhost',
10
+ 'https://tauri.localhost',
11
+ ]);
12
+ const ALLOWED_HEADER_NAMES = [
13
+ 'Content-Type',
14
+ 'Authorization',
15
+ 'X-Request-Id',
16
+ 'X-NoteConnection-Token',
17
+ 'X-Agent-Conversation-Turn-Id',
18
+ 'X-Agent-Conversation-Resume-Turn-Id',
19
+ ];
20
+ const EXPOSED_HEADER_NAMES = [
21
+ 'X-Request-Id',
22
+ 'X-Error-Code',
23
+ 'X-Agent-Conversation-Turn-Id',
24
+ 'X-Agent-Conversation-Replay',
25
+ ];
26
+ function applyCorsHeaders(req, res) {
27
+ const origin = req.headers.origin;
28
+ if (!origin) {
29
+ res.setHeader('Access-Control-Allow-Origin', '*');
30
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
31
+ res.setHeader('Access-Control-Allow-Headers', ALLOWED_HEADER_NAMES.join(', '));
32
+ res.setHeader('Access-Control-Expose-Headers', EXPOSED_HEADER_NAMES.join(', '));
33
+ return true;
34
+ }
35
+ if (ALLOWED_ORIGINS.has(origin)) {
36
+ res.setHeader('Access-Control-Allow-Origin', origin);
37
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
38
+ res.setHeader('Access-Control-Allow-Headers', ALLOWED_HEADER_NAMES.join(', '));
39
+ res.setHeader('Access-Control-Expose-Headers', EXPOSED_HEADER_NAMES.join(', '));
40
+ res.setHeader('Vary', 'Origin');
41
+ return true;
42
+ }
43
+ return false;
44
+ }
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sendError = exports.sendJson = exports.parseJsonBody = exports.readRequestBody = exports.ERROR_CODE_HEADER = exports.appendRuntimeApiRequestTrace = exports.getRuntimeRequestTrace = exports.normalizeApiErrorCodeToken = exports.finishRequestTrace = exports.startRequestTraceHandler = exports.resolveRequestId = exports.setSidecarAuthToken = exports.isAuthorizedRequest = exports.applyCorsHeaders = void 0;
4
+ var cors_1 = require("./cors");
5
+ Object.defineProperty(exports, "applyCorsHeaders", { enumerable: true, get: function () { return cors_1.applyCorsHeaders; } });
6
+ var auth_1 = require("./auth");
7
+ Object.defineProperty(exports, "isAuthorizedRequest", { enumerable: true, get: function () { return auth_1.isAuthorizedRequest; } });
8
+ Object.defineProperty(exports, "setSidecarAuthToken", { enumerable: true, get: function () { return auth_1.setSidecarAuthToken; } });
9
+ var request_trace_1 = require("./request-trace");
10
+ Object.defineProperty(exports, "resolveRequestId", { enumerable: true, get: function () { return request_trace_1.resolveRequestId; } });
11
+ Object.defineProperty(exports, "startRequestTraceHandler", { enumerable: true, get: function () { return request_trace_1.startRequestTraceHandler; } });
12
+ Object.defineProperty(exports, "finishRequestTrace", { enumerable: true, get: function () { return request_trace_1.finishRequestTrace; } });
13
+ Object.defineProperty(exports, "normalizeApiErrorCodeToken", { enumerable: true, get: function () { return request_trace_1.normalizeApiErrorCodeToken; } });
14
+ Object.defineProperty(exports, "getRuntimeRequestTrace", { enumerable: true, get: function () { return request_trace_1.getRuntimeRequestTrace; } });
15
+ Object.defineProperty(exports, "appendRuntimeApiRequestTrace", { enumerable: true, get: function () { return request_trace_1.appendRuntimeApiRequestTrace; } });
16
+ Object.defineProperty(exports, "ERROR_CODE_HEADER", { enumerable: true, get: function () { return request_trace_1.ERROR_CODE_HEADER; } });
17
+ var body_parser_1 = require("./body-parser");
18
+ Object.defineProperty(exports, "readRequestBody", { enumerable: true, get: function () { return body_parser_1.readRequestBody; } });
19
+ Object.defineProperty(exports, "parseJsonBody", { enumerable: true, get: function () { return body_parser_1.parseJsonBody; } });
20
+ Object.defineProperty(exports, "sendJson", { enumerable: true, get: function () { return body_parser_1.sendJson; } });
21
+ Object.defineProperty(exports, "sendError", { enumerable: true, get: function () { return body_parser_1.sendError; } });
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ERROR_CODE_HEADER = void 0;
37
+ exports.resolveRequestId = resolveRequestId;
38
+ exports.normalizeApiErrorCodeToken = normalizeApiErrorCodeToken;
39
+ exports.appendRuntimeApiRequestTrace = appendRuntimeApiRequestTrace;
40
+ exports.getRuntimeRequestTrace = getRuntimeRequestTrace;
41
+ exports.startRequestTraceHandler = startRequestTraceHandler;
42
+ exports.finishRequestTrace = finishRequestTrace;
43
+ const crypto = __importStar(require("crypto"));
44
+ const ERROR_CODE_HEADER = 'x-nc-error-code';
45
+ exports.ERROR_CODE_HEADER = ERROR_CODE_HEADER;
46
+ const MAX_TRACE_RECORDS = 5000;
47
+ const traceRecords = [];
48
+ function resolveRequestId(req) {
49
+ return req.headers['x-request-id'] || crypto.randomUUID();
50
+ }
51
+ function normalizeApiErrorCodeToken(value, fallback) {
52
+ if (typeof value === 'string')
53
+ return value.trim();
54
+ return fallback;
55
+ }
56
+ function appendRuntimeApiRequestTrace(record) {
57
+ traceRecords.push(record);
58
+ while (traceRecords.length > MAX_TRACE_RECORDS) {
59
+ traceRecords.shift();
60
+ }
61
+ }
62
+ function getRuntimeRequestTrace(requestId) {
63
+ if (requestId) {
64
+ return traceRecords.filter((r) => r.requestId === requestId);
65
+ }
66
+ return traceRecords.slice(-100);
67
+ }
68
+ function startRequestTraceHandler(req, res) {
69
+ const requestId = resolveRequestId(req);
70
+ const requestStartedAtMs = Date.now();
71
+ const requestStartedAt = new Date(requestStartedAtMs).toISOString();
72
+ res.setHeader('X-Request-Id', requestId);
73
+ return { requestId, requestStartedAtMs, requestStartedAt };
74
+ }
75
+ function finishRequestTrace(req, res, requestId, requestStartedAtMs, requestStartedAt, requestPath, ERROR_CODE_HEADER) {
76
+ const responseContentLengthHeader = Number(res.getHeader('content-length'));
77
+ const responseContentLength = Number.isFinite(responseContentLengthHeader)
78
+ ? Math.max(0, Math.floor(responseContentLengthHeader))
79
+ : null;
80
+ const responseErrorCode = normalizeApiErrorCodeToken(res.getHeader(ERROR_CODE_HEADER), '');
81
+ appendRuntimeApiRequestTrace({
82
+ requestId,
83
+ method: String(req.method || 'GET').trim().toUpperCase(),
84
+ path: requestPath,
85
+ statusCode: Number(res.statusCode || 0),
86
+ errorCode: responseErrorCode || undefined,
87
+ durationMs: Number((Date.now() - requestStartedAtMs).toFixed(4)),
88
+ startedAt: requestStartedAt,
89
+ finishedAt: new Date().toISOString(),
90
+ responseContentType: String(res.getHeader('content-type') || '').trim(),
91
+ responseContentLength,
92
+ requestContentLength: null,
93
+ remoteAddress: String(req.socket?.remoteAddress || '').trim(),
94
+ userAgent: String(req.headers['user-agent'] || '').trim().slice(0, 180),
95
+ });
96
+ }
@@ -48,6 +48,7 @@ const os = __importStar(require("os"));
48
48
  const path = __importStar(require("path"));
49
49
  const TOML = __importStar(require("@iarna/toml"));
50
50
  const constants_1 = require("./constants");
51
+ const providerTemplates_1 = require("./providerTemplates");
51
52
  const NOTEMD_BOOLEAN_KEYS = [
52
53
  'developerMode',
53
54
  'useCustomConceptNoteFolder',
@@ -142,8 +143,8 @@ exports.DEFAULT_PATH_MODE_SETTINGS = {
142
143
  auto_reconstruct: true,
143
144
  retain_history: true,
144
145
  focus_mode: true,
145
- background: 'belfast_sunset_puresky_4k.exr',
146
- bg_brightness: 1.0,
146
+ background: '',
147
+ bg_brightness: 0.1,
147
148
  reading_mode: 'window',
148
149
  reader_render_mode: 'render',
149
150
  reader_toggle_source_shortcut: 'Ctrl+M',
@@ -382,7 +383,7 @@ function normalizePathModeSettingsValue(raw) {
382
383
  }
383
384
  const brightness = readNumber(section, 'bg_brightness');
384
385
  if (typeof brightness === 'number') {
385
- merged.bg_brightness = clampNumber(brightness, 0.01, 10.0);
386
+ merged.bg_brightness = clampNumber(brightness, 0.0, 0.1);
386
387
  }
387
388
  merged.reading_mode = normalizePathModeReadingMode(readString(section, 'reading_mode') || merged.reading_mode);
388
389
  merged.reader_render_mode = normalizePathModeRenderMode(readString(section, 'reader_render_mode') || merged.reader_render_mode);
@@ -597,7 +598,7 @@ function extractNotemdSettingsFromAppConfig(appConfig) {
597
598
  return mergedSettings;
598
599
  }
599
600
  function applyNotemdSettingsToAppConfig(appConfig, settings) {
600
- const nextNotemdSection = isObjectRecord(appConfig.notemd) ? { ...appConfig.notemd } : {};
601
+ let nextNotemdSection = isObjectRecord(appConfig.notemd) ? { ...appConfig.notemd } : {};
601
602
  const activeProvider = settings.providers.find((provider) => provider.name === settings.activeProvider) ||
602
603
  settings.providers[0] ||
603
604
  constants_1.DEFAULT_SETTINGS.providers[0];
@@ -656,6 +657,7 @@ function applyNotemdSettingsToAppConfig(appConfig, settings) {
656
657
  api_version: activeProvider.apiVersion || '',
657
658
  temperature: activeProvider.temperature,
658
659
  };
660
+ nextNotemdSection = (0, providerTemplates_1.mergeProviderTemplatesIntoNotemdSection)(nextNotemdSection);
659
661
  return {
660
662
  ...appConfig,
661
663
  notemd: nextNotemdSection,