noteconnection 1.7.0 → 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 (211) hide show
  1. package/LICENSE +674 -21
  2. package/README.md +242 -62
  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 +242 -62
  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 +2178 -62
  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 +2108 -130
  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 +393 -33
  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/source_manager.js +190 -21
  50. package/dist/src/frontend/styles.css +2720 -72
  51. package/dist/src/frontend/workbench_state.mjs +101 -0
  52. package/dist/src/frontend/workspace_panes.js +10168 -0
  53. package/dist/src/frontend.locale.contract.test.js +62 -0
  54. package/dist/src/godot.sidecar.bootstrap.contract.test.js +244 -0
  55. package/dist/src/indexing/IndexLifecycle.js +195 -0
  56. package/dist/src/indexing/IndexLifecycle.test.js +49 -0
  57. package/dist/src/indexing/SegmentBuilder.js +64 -0
  58. package/dist/src/indexing/UnitBuilder.js +48 -0
  59. package/dist/src/indexing/types.js +2 -0
  60. package/dist/src/knowledge.api.contract.test.js +170 -0
  61. package/dist/src/learning/KnowledgeLearningPlatform.js +10386 -0
  62. package/dist/src/learning/KnowledgeLearningPlatform.persistence.test.js +327 -0
  63. package/dist/src/learning/KnowledgeLearningPlatform.program-f.test.js +99 -0
  64. package/dist/src/learning/KnowledgeLearningPlatform.test.js +2971 -0
  65. package/dist/src/learning/KnowledgeWorkspaceConversationRegression.js +2974 -0
  66. package/dist/src/learning/KnowledgeWorkspaceConversationRegression.test.js +3928 -0
  67. package/dist/src/learning/answerReleaseReview.js +4319 -0
  68. package/dist/src/learning/answerReleaseReview.test.js +2888 -0
  69. package/dist/src/learning/api.js +2 -0
  70. package/dist/src/learning/conversationComposer.js +1480 -0
  71. package/dist/src/learning/conversationComposer.test.js +1817 -0
  72. package/dist/src/learning/domains/ConversationManager.js +53 -0
  73. package/dist/src/learning/domains/KnowledgeIngestor.js +238 -0
  74. package/dist/src/learning/domains/KnowledgeQuerier.js +187 -0
  75. package/dist/src/learning/domains/MasteryEngine.js +387 -0
  76. package/dist/src/learning/domains/MemoryPolicyManager.js +408 -0
  77. package/dist/src/learning/domains/QualityEvaluator.js +307 -0
  78. package/dist/src/learning/domains/TutorRouter.js +313 -0
  79. package/dist/src/learning/domains/index.js +33 -0
  80. package/dist/src/learning/domains/types.js +7 -0
  81. package/dist/src/learning/errors.js +29 -0
  82. package/dist/src/learning/evidenceContextAssembler.js +1176 -0
  83. package/dist/src/learning/evidenceContextAssembler.test.js +6332 -0
  84. package/dist/src/learning/graphContextAssembler.js +870 -0
  85. package/dist/src/learning/graphContextAssembler.test.js +1033 -0
  86. package/dist/src/learning/index.js +28 -0
  87. package/dist/src/learning/queryBackend.js +1898 -0
  88. package/dist/src/learning/queryBackend.test.js +955 -0
  89. package/dist/src/learning/ragContextPack.js +257 -0
  90. package/dist/src/learning/ragContextPack.test.js +160 -0
  91. package/dist/src/learning/ragPublicText.js +38 -0
  92. package/dist/src/learning/ragSufficiencyJudge.js +161 -0
  93. package/dist/src/learning/ragSufficiencyJudge.test.js +177 -0
  94. package/dist/src/learning/ragSufficiencyProviderJudge.js +227 -0
  95. package/dist/src/learning/ragSufficiencyProviderJudge.test.js +156 -0
  96. package/dist/src/learning/requestNormalization.js +198 -0
  97. package/dist/src/learning/runtimeCapability.js +4677 -0
  98. package/dist/src/learning/runtimeCapability.test.js +3635 -0
  99. package/dist/src/learning/store.js +1240 -0
  100. package/dist/src/learning/store.test.js +1126 -0
  101. package/dist/src/learning/tutorAdapter.js +2 -0
  102. package/dist/src/learning/types.js +2 -0
  103. package/dist/src/learning/vectorAccelerationAdapter.js +942 -0
  104. package/dist/src/learning/vectorAccelerationAdapter.test.js +382 -0
  105. package/dist/src/lfs.asset.policy.contract.test.js +153 -0
  106. package/dist/src/license.policy.contract.test.js +66 -0
  107. package/dist/src/memory/MemoryGovernance.js +74 -0
  108. package/dist/src/memory/MemoryGovernance.test.js +46 -0
  109. package/dist/src/memory/types.js +2 -0
  110. package/dist/src/mermaid.frontend.guard.contract.test.js +77 -0
  111. package/dist/src/middleware/auth.js +17 -0
  112. package/dist/src/middleware/body-parser.js +45 -0
  113. package/dist/src/middleware/cors.js +44 -0
  114. package/dist/src/middleware/index.js +21 -0
  115. package/dist/src/middleware/request-trace.js +96 -0
  116. package/dist/src/notemd/AppConfigToml.js +6 -4
  117. package/dist/src/notemd/MermaidProcessor.js +400 -50
  118. package/dist/src/notemd/NotemdService.js +498 -13
  119. package/dist/src/notemd/PromptManager.js +15 -0
  120. package/dist/src/notemd/cli/commands.js +357 -0
  121. package/dist/src/notemd/cli/dispatcher.js +225 -0
  122. package/dist/src/notemd/cli/index.js +169 -0
  123. package/dist/src/notemd/cli/parser.js +68 -0
  124. package/dist/src/notemd/cli/types.js +2 -0
  125. package/dist/src/notemd/constants.js +43 -0
  126. package/dist/src/notemd/diagram/diagramGenerationService.js +78 -0
  127. package/dist/src/notemd/diagram/diagramSpec.js +79 -0
  128. package/dist/src/notemd/diagram/diagramSpecResponseParser.js +131 -0
  129. package/dist/src/notemd/diagram/intent.js +95 -0
  130. package/dist/src/notemd/diagram/planner.js +71 -0
  131. package/dist/src/notemd/diagram/prompts/diagramSpecPrompt.js +42 -0
  132. package/dist/src/notemd/diagram/types.js +18 -0
  133. package/dist/src/notemd/index.js +26 -0
  134. package/dist/src/notemd/operations/capabilityManifest.js +23 -0
  135. package/dist/src/notemd/operations/cliContracts.js +17 -0
  136. package/dist/src/notemd/operations/configProfileCommands.js +85 -0
  137. package/dist/src/notemd/operations/registry.contract.test.js +95 -0
  138. package/dist/src/notemd/operations/registry.js +991 -0
  139. package/dist/src/notemd/operations/types.js +2 -0
  140. package/dist/src/notemd/providerDiagnostics.js +220 -0
  141. package/dist/src/notemd/providerProfiles.js +42 -0
  142. package/dist/src/notemd/providerTemplates.js +231 -0
  143. package/dist/src/notemd/search/DuckDuckGoProvider.js +39 -0
  144. package/dist/src/notemd/search/SearchManager.js +13 -0
  145. package/dist/src/notemd/search/SearchProvider.js +2 -0
  146. package/dist/src/notemd/search/TavilyProvider.js +44 -0
  147. package/dist/src/notemd.agent.manifest.test.js +85 -0
  148. package/dist/src/notemd.api.contract.test.js +14 -1
  149. package/dist/src/notemd.app_config_toml.test.js +2 -1
  150. package/dist/src/notemd.batch.workflow.test.js +117 -0
  151. package/dist/src/notemd.cli.e2e.test.js +136 -0
  152. package/dist/src/notemd.core.test.js +51 -0
  153. package/dist/src/notemd.diagram.pipeline.test.js +233 -0
  154. package/dist/src/notemd.providerTemplates.test.js +34 -0
  155. package/dist/src/notemd.server.integration.test.js +143 -35
  156. package/dist/src/notemd.workflow.pipeline.test.js +162 -0
  157. package/dist/src/pathbridge.handshake.contract.test.js +16 -2
  158. package/dist/src/pathmode.background.contract.test.js +69 -0
  159. package/dist/src/pathmode.settings.api.contract.test.js +9 -0
  160. package/dist/src/pkg.sidecar.contract.test.js +9 -3
  161. package/dist/src/platform/ExportProfile.js +58 -0
  162. package/dist/src/platform/PlatformCapabilities.js +45 -0
  163. package/dist/src/platform/PlatformCapabilities.test.js +30 -0
  164. package/dist/src/platform/RenderMaterializer.js +33 -0
  165. package/dist/src/platform/RenderMaterializer.test.js +32 -0
  166. package/dist/src/query_backend.external_http.integration.test.js +410 -0
  167. package/dist/src/reader_renderer.js +404 -3
  168. package/dist/src/reader_renderer.test.js +87 -0
  169. package/dist/src/release.godot.mirror.contract.test.js +73 -0
  170. package/dist/src/resources/ResourceRegistry.js +223 -0
  171. package/dist/src/resources/ResourceRegistry.test.js +61 -0
  172. package/dist/src/resources/types.js +2 -0
  173. package/dist/src/routes/agentWorkspaceDiagnostics.js +173 -0
  174. package/dist/src/routes/data.js +267 -0
  175. package/dist/src/routes/diagnostics.js +51 -0
  176. package/dist/src/routes/index.js +23 -0
  177. package/dist/src/routes/knowledge.js +968 -0
  178. package/dist/src/routes/markdown.js +287 -0
  179. package/dist/src/routes/notemd.js +565 -0
  180. package/dist/src/routes/registry.contract.test.js +130 -0
  181. package/dist/src/routes/render.js +285 -0
  182. package/dist/src/routes/runtimeRunbookRouteOps.js +149 -0
  183. package/dist/src/routes/runtimeRunbookRouteOps.test.js +194 -0
  184. package/dist/src/routes/settings.js +6 -0
  185. package/dist/src/routes/staticFiles.js +94 -0
  186. package/dist/src/routes/types.js +2 -0
  187. package/dist/src/runtime.transport.adapter.contract.test.js +81 -0
  188. package/dist/src/server.js +11090 -1549
  189. package/dist/src/server.migration.test.js +193 -21
  190. package/dist/src/server.port.fallback.contract.test.js +63 -0
  191. package/dist/src/session/SessionStateStore.js +81 -0
  192. package/dist/src/session/SessionStateStore.test.js +58 -0
  193. package/dist/src/session/types.js +2 -0
  194. package/dist/src/settings.runtime.contract.test.js +50 -0
  195. package/dist/src/shared/types.contract.test.js +107 -0
  196. package/dist/src/shared/types.js +22 -0
  197. package/dist/src/sidecar.replacement.boundary.contract.test.js +128 -0
  198. package/dist/src/sidecar.supply.readiness.contract.test.js +144 -0
  199. package/dist/src/source_manager.loadflow.test.js +46 -0
  200. package/dist/src/startup.layout.snapshot.contract.test.js +57 -0
  201. package/dist/src/tauri.frontend.build.contract.test.js +60 -0
  202. package/dist/src/tauri.sidecar.cleanup.contract.test.js +21 -0
  203. package/dist/src/utils/RuntimePaths.js +4 -13
  204. package/dist/src/utils/platform.js +153 -0
  205. package/dist/src/workflows/WorkflowArtifactStore.js +96 -0
  206. package/dist/src/workflows/WorkflowArtifactStore.test.js +80 -0
  207. package/dist/src/workflows/types.js +2 -0
  208. package/dist/src/workspace/WorkspaceRegistry.js +122 -0
  209. package/dist/src/workspace/WorkspaceRegistry.test.js +29 -0
  210. package/dist/src/workspace/types.js +2 -0
  211. package/package.json +53 -10
@@ -46,6 +46,20 @@ describe('path bridge handshake and transport verification contracts', () => {
46
46
  const pathModeUiPath = path.join(repoRoot, 'path_mode', 'scripts', 'path_mode_ui.gd');
47
47
  const readerRenderClientPath = path.join(repoRoot, 'path_mode', 'scripts', 'reader_render_client.gd');
48
48
  const pathRendererPath = path.join(repoRoot, 'path_mode', 'scripts', 'path_renderer.gd');
49
+ test('path bridge preserves explicit port zero for ephemeral bind fallback', async () => {
50
+ const bridge = new PathBridge_1.PathBridge({
51
+ port: 0,
52
+ host: '127.0.0.1',
53
+ });
54
+ try {
55
+ await bridge.waitUntilReady();
56
+ expect(bridge.getPort()).toBeGreaterThan(0);
57
+ expect(bridge.getPort()).not.toBe(9876);
58
+ }
59
+ finally {
60
+ bridge.close();
61
+ }
62
+ });
49
63
  test('path bridge supports explicit identify handshake and client tagging', () => {
50
64
  const bridge = fs.readFileSync(bridgePath, 'utf8');
51
65
  expect(bridge).toContain("case 'identify'");
@@ -149,7 +163,7 @@ describe('path bridge handshake and transport verification contracts', () => {
149
163
  const invalidConfigureBrightness = (0, PathBridge_1.parseBridgeInboundEnvelope)({
150
164
  type: 'configure',
151
165
  payload: {
152
- bg_brightness: 20,
166
+ bg_brightness: 0.2,
153
167
  },
154
168
  });
155
169
  expect(invalidConfigureBrightness.ok).toBe(false);
@@ -182,7 +196,7 @@ describe('path bridge handshake and transport verification contracts', () => {
182
196
  retain_history: true,
183
197
  focus_mode: false,
184
198
  background: 'belfast_sunset_puresky_4k.exr',
185
- bg_brightness: 1.2,
199
+ bg_brightness: 0.08,
186
200
  reading_mode: 'window',
187
201
  reader_render_mode: 'render',
188
202
  reader_toggle_source_shortcut: 'Ctrl+Shift+M',
@@ -0,0 +1,69 @@
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('pathmode background safety contract', () => {
39
+ const repoRoot = path.resolve(__dirname, '..');
40
+ const settingsPanelPath = path.join(repoRoot, 'path_mode', 'scripts', 'settings_panel.gd');
41
+ const pathRendererPath = path.join(repoRoot, 'path_mode', 'scripts', 'path_renderer.gd');
42
+ test('does not default path mode to a heavy HDR background at startup', () => {
43
+ const source = fs.readFileSync(settingsPanelPath, 'utf8');
44
+ expect(source).toContain('"background": ""');
45
+ expect(source).not.toContain('"background": "belfast_sunset_puresky_4k.exr"');
46
+ });
47
+ test('startup path-mode restore keeps runtime background values intact', () => {
48
+ const source = fs.readFileSync(pathRendererPath, 'utf8');
49
+ expect(source).toContain('func _filter_startup_settings(settings: Dictionary) -> Dictionary:');
50
+ expect(source).toContain('return settings.duplicate(true)');
51
+ });
52
+ test('desktop settings panel prefers runtime TOML over local cfg during load', () => {
53
+ const source = fs.readFileSync(settingsPanelPath, 'utf8');
54
+ expect(source).toContain('if not _runtime_base_url.is_empty():');
55
+ expect(source).toContain('call_deferred("_load_settings_from_runtime_async")');
56
+ expect(source).toContain('_load_settings_local()');
57
+ });
58
+ test('loads HDR backgrounds through the guarded resize-and-convert path', () => {
59
+ const source = fs.readFileSync(pathRendererPath, 'utf8');
60
+ expect(source).toContain('var _background_texture_cache: Dictionary = {}');
61
+ expect(source).toContain('var _last_applied_background_path: String = "__unset__"');
62
+ expect(source).toContain('func _load_hdr_background_safely(path: String) -> Texture2D:');
63
+ expect(source).toContain('var imported_tex = ResourceLoader.load(path)');
64
+ expect(source).toContain('var texture := imported_tex as Texture2D');
65
+ expect(source).not.toContain('MAX_SAFE_HDR_BACKGROUND_BYTES');
66
+ expect(source).not.toContain('(imported_tex as Texture2D).get_image()');
67
+ expect(source).not.toContain('var image_error := image.load(path)');
68
+ });
69
+ });
@@ -45,4 +45,13 @@ describe('Path Mode settings API contract', () => {
45
45
  expect(serverSource).toContain('extractPathModeSettingsFromAppConfig');
46
46
  expect(serverSource).toContain('applyPathModeSettingsToAppConfig');
47
47
  });
48
+ test('server path-mode settings loader does not short-circuit on stale in-memory cache', () => {
49
+ const loadStart = serverSource.indexOf('async function loadPathModeSettings(): Promise<PathModeSettings> {');
50
+ const loadEnd = serverSource.indexOf('async function persistPathModeSettings(settingsLike: unknown): Promise<PathModeSettings> {');
51
+ const loadSlice = serverSource.slice(loadStart, loadEnd);
52
+ expect(loadStart).toBeGreaterThanOrEqual(0);
53
+ expect(loadEnd).toBeGreaterThan(loadStart);
54
+ expect(loadSlice).toContain('const appConfig = await loadAppConfigToml();');
55
+ expect(loadSlice).not.toContain('if (cachedPathModeSettings)');
56
+ });
48
57
  });
@@ -48,10 +48,14 @@ describe('pkg sidecar packaging contract', () => {
48
48
  const pkg = packageJson.pkg || {};
49
49
  const pkgScripts = pkg.scripts || [];
50
50
  const pkgAssets = pkg.assets || [];
51
+ const scripts = packageJson.scripts || {};
51
52
  expect(pkgScripts).toContain('dist/src/backend/workers/**/*.js');
52
53
  expect(pkgAssets).toContain('dist/src/**/*');
53
- expect(pkgAssets).toContain('data.js');
54
- expect(pkgAssets).toContain('graph_data.json');
54
+ expect(pkgAssets).not.toContain('data.js');
55
+ expect(pkgAssets).not.toContain('graph_data.json');
56
+ expect(scripts['build:full']).toContain('--include-generated-graph-assets');
57
+ expect(scripts['tauri:build:full']).toContain('npm run build:full');
58
+ expect(scripts.prepublishOnly).toBe('npm run build');
55
59
  });
56
60
  test('retains hardened node22 sidecar build args and target mapping', () => {
57
61
  const buildSidecar = fs.readFileSync(buildSidecarPath, 'utf8');
@@ -61,6 +65,8 @@ describe('pkg sidecar packaging contract', () => {
61
65
  expect(buildSidecar).toContain("'--compress'");
62
66
  expect(buildSidecar).toContain("'Brotli'");
63
67
  expect(buildSidecar).toContain("'--no-bytecode'");
64
- expect(buildSidecar).toContain("'--public'");
68
+ expect(buildSidecar).toContain("'--public-packages'");
69
+ expect(buildSidecar).toContain('PKG_NO_BYTECODE_RETRY_PATTERN');
70
+ expect(buildSidecar).toContain('without --no-bytecode');
65
71
  });
66
72
  });
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getExportProfile = getExportProfile;
4
+ exports.listExportProfiles = listExportProfiles;
5
+ const EXPORT_PROFILES = {
6
+ 'desktop-full': {
7
+ id: 'desktop-full',
8
+ platformTarget: 'tauri',
9
+ description: 'Full desktop runtime with sidecar-backed retrieval, streaming, and indexing.',
10
+ supportsSidecar: true,
11
+ supportsBackgroundIndexing: true,
12
+ supportsConversationStreaming: true,
13
+ supportsSvgRenderArtifacts: true,
14
+ supportsPngRenderArtifacts: true,
15
+ preferredMermaidRenderer: 'auto',
16
+ },
17
+ 'desktop-reader': {
18
+ id: 'desktop-reader',
19
+ platformTarget: 'browser',
20
+ description: 'Reader-oriented desktop profile with lightweight retrieval and PNG-safe rendering.',
21
+ supportsSidecar: true,
22
+ supportsBackgroundIndexing: false,
23
+ supportsConversationStreaming: true,
24
+ supportsSvgRenderArtifacts: true,
25
+ supportsPngRenderArtifacts: true,
26
+ preferredMermaidRenderer: 'auto',
27
+ },
28
+ 'godot-path-mode': {
29
+ id: 'godot-path-mode',
30
+ platformTarget: 'godot',
31
+ description: 'Godot reader/profile with PNG-first render materialization and no SVG dependency.',
32
+ supportsSidecar: true,
33
+ supportsBackgroundIndexing: false,
34
+ supportsConversationStreaming: false,
35
+ supportsSvgRenderArtifacts: false,
36
+ supportsPngRenderArtifacts: true,
37
+ preferredMermaidRenderer: 'auto',
38
+ },
39
+ 'mobile-slim': {
40
+ id: 'mobile-slim',
41
+ platformTarget: 'mobile',
42
+ description: 'Slim mobile export with bounded memory footprint and PNG-only render artifacts.',
43
+ supportsSidecar: false,
44
+ supportsBackgroundIndexing: false,
45
+ supportsConversationStreaming: false,
46
+ supportsSvgRenderArtifacts: false,
47
+ supportsPngRenderArtifacts: true,
48
+ preferredMermaidRenderer: 'local',
49
+ },
50
+ };
51
+ function getExportProfile(profileId) {
52
+ const normalized = typeof profileId === 'string' ? profileId.trim().toLowerCase() : '';
53
+ const candidate = normalized;
54
+ return EXPORT_PROFILES[candidate] || EXPORT_PROFILES['desktop-full'];
55
+ }
56
+ function listExportProfiles() {
57
+ return Object.values(EXPORT_PROFILES).map((profile) => ({ ...profile }));
58
+ }
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolvePlatformCapabilities = resolvePlatformCapabilities;
4
+ const ExportProfile_1 = require("./ExportProfile");
5
+ function cloneProfile(profile) {
6
+ return { ...profile };
7
+ }
8
+ function resolvePlatformCapabilities(input = {}) {
9
+ let profile = cloneProfile((0, ExportProfile_1.getExportProfile)(input.exportProfileId));
10
+ const requestedTarget = typeof input.platformTarget === 'string'
11
+ ? input.platformTarget.trim().toLowerCase()
12
+ : '';
13
+ if (requestedTarget) {
14
+ const compatibleProfile = (requestedTarget === 'godot' ? (0, ExportProfile_1.getExportProfile)('godot-path-mode')
15
+ : requestedTarget === 'mobile' ? (0, ExportProfile_1.getExportProfile)('mobile-slim')
16
+ : requestedTarget === 'browser' ? (0, ExportProfile_1.getExportProfile)('desktop-reader')
17
+ : (0, ExportProfile_1.getExportProfile)('desktop-full'));
18
+ if (compatibleProfile.platformTarget === requestedTarget) {
19
+ profile = cloneProfile(compatibleProfile);
20
+ }
21
+ }
22
+ return {
23
+ exportProfileId: profile.id,
24
+ platformTarget: profile.platformTarget,
25
+ export: {
26
+ supportsWorkspaceBundles: true,
27
+ deterministicBundles: true,
28
+ bundlePackagingMode: profile.supportsSidecar ? 'full' : 'slim',
29
+ requiresIndexedReadiness: true,
30
+ },
31
+ render: {
32
+ supportsSvgArtifacts: profile.supportsSvgRenderArtifacts,
33
+ supportsPngArtifacts: profile.supportsPngRenderArtifacts,
34
+ preferredArtifact: profile.supportsSvgRenderArtifacts ? 'svg' : 'png',
35
+ preferredMermaidRenderer: profile.preferredMermaidRenderer,
36
+ },
37
+ retrieval: {
38
+ supportsSidecar: profile.supportsSidecar,
39
+ supportsBackgroundIndexing: profile.supportsBackgroundIndexing,
40
+ },
41
+ conversation: {
42
+ supportsStreaming: profile.supportsConversationStreaming,
43
+ },
44
+ };
45
+ }
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const PlatformCapabilities_1 = require("./PlatformCapabilities");
4
+ describe('PlatformCapabilities', () => {
5
+ test('resolves Godot profile as PNG-first and non-streaming', () => {
6
+ const capabilities = (0, PlatformCapabilities_1.resolvePlatformCapabilities)({ exportProfileId: 'godot-path-mode' });
7
+ expect(capabilities.platformTarget).toBe('godot');
8
+ expect(capabilities.export.supportsWorkspaceBundles).toBe(true);
9
+ expect(capabilities.export.bundlePackagingMode).toBe('full');
10
+ expect(capabilities.render.supportsSvgArtifacts).toBe(false);
11
+ expect(capabilities.render.preferredArtifact).toBe('png');
12
+ expect(capabilities.conversation.supportsStreaming).toBe(false);
13
+ });
14
+ test('resolves mobile slim profile as sidecar-free and PNG-only', () => {
15
+ const capabilities = (0, PlatformCapabilities_1.resolvePlatformCapabilities)({ exportProfileId: 'mobile-slim' });
16
+ expect(capabilities.platformTarget).toBe('mobile');
17
+ expect(capabilities.export.bundlePackagingMode).toBe('slim');
18
+ expect(capabilities.export.requiresIndexedReadiness).toBe(true);
19
+ expect(capabilities.retrieval.supportsSidecar).toBe(false);
20
+ expect(capabilities.render.supportsSvgArtifacts).toBe(false);
21
+ });
22
+ test('platform target override selects the compatible profile family', () => {
23
+ const capabilities = (0, PlatformCapabilities_1.resolvePlatformCapabilities)({
24
+ exportProfileId: 'desktop-full',
25
+ platformTarget: 'browser',
26
+ });
27
+ expect(capabilities.exportProfileId).toBe('desktop-reader');
28
+ expect(capabilities.platformTarget).toBe('browser');
29
+ });
30
+ });
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveRenderMaterializationDecision = resolveRenderMaterializationDecision;
4
+ const PlatformCapabilities_1 = require("./PlatformCapabilities");
5
+ function resolveRenderMaterializationDecision(input = {}) {
6
+ const capabilities = (0, PlatformCapabilities_1.resolvePlatformCapabilities)({
7
+ exportProfileId: input.exportProfileId,
8
+ platformTarget: input.platformTarget,
9
+ });
10
+ const requestedRenderer = typeof input.rendererPreference === 'string'
11
+ ? input.rendererPreference.trim().toLowerCase()
12
+ : '';
13
+ let rendererPreference = (requestedRenderer === 'local'
14
+ || requestedRenderer === 'frontend'
15
+ || requestedRenderer === 'auto')
16
+ ? requestedRenderer
17
+ : capabilities.render.preferredMermaidRenderer;
18
+ if (!capabilities.render.supportsSvgArtifacts && rendererPreference === 'frontend') {
19
+ rendererPreference = capabilities.render.preferredMermaidRenderer;
20
+ }
21
+ const includeStages = input.includeStages === true;
22
+ const includeSvgRequested = input.includeSvg === true || includeStages;
23
+ const includeSvg = capabilities.render.supportsSvgArtifacts && includeSvgRequested;
24
+ return {
25
+ exportProfileId: capabilities.exportProfileId,
26
+ platformTarget: capabilities.platformTarget,
27
+ includeSvg,
28
+ includeStages,
29
+ responseArtifact: capabilities.render.preferredArtifact,
30
+ rendererPreference,
31
+ vectorSuppressed: includeSvgRequested && !capabilities.render.supportsSvgArtifacts,
32
+ };
33
+ }
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const RenderMaterializer_1 = require("./RenderMaterializer");
4
+ describe('RenderMaterializer', () => {
5
+ test('suppresses SVG for Godot even when includeSvg is requested', () => {
6
+ const decision = (0, RenderMaterializer_1.resolveRenderMaterializationDecision)({
7
+ exportProfileId: 'godot-path-mode',
8
+ includeSvg: true,
9
+ });
10
+ expect(decision.includeSvg).toBe(false);
11
+ expect(decision.vectorSuppressed).toBe(true);
12
+ expect(decision.responseArtifact).toBe('png');
13
+ });
14
+ test('preserves SVG diagnostics for desktop-full profile', () => {
15
+ const decision = (0, RenderMaterializer_1.resolveRenderMaterializationDecision)({
16
+ exportProfileId: 'desktop-full',
17
+ includeSvg: true,
18
+ includeStages: true,
19
+ });
20
+ expect(decision.includeSvg).toBe(true);
21
+ expect(decision.includeStages).toBe(true);
22
+ expect(decision.vectorSuppressed).toBe(false);
23
+ });
24
+ test('falls back to local renderer for mobile slim profile', () => {
25
+ const decision = (0, RenderMaterializer_1.resolveRenderMaterializationDecision)({
26
+ exportProfileId: 'mobile-slim',
27
+ rendererPreference: 'frontend',
28
+ });
29
+ expect(decision.rendererPreference).toBe('local');
30
+ expect(decision.responseArtifact).toBe('png');
31
+ });
32
+ });