@mindexec/cli 0.2.458 → 0.2.459

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 (41) hide show
  1. package/desktop-workspace-state.cjs +120 -0
  2. package/electron/main.cjs +17 -6
  3. package/electron/source-smoke.mjs +21 -0
  4. package/electron/windows-package-smoke.mjs +8 -2
  5. package/package.json +6 -5
  6. package/remote-fast/osx-arm64/mindexec-remote-fast.dll +0 -0
  7. package/remote-fast/osx-x64/mindexec-remote-fast.dll +0 -0
  8. package/remote-fast/win-x64/mindexec-remote-fast.dll +0 -0
  9. package/scripts/desktop-workspace-state-smoke.mjs +81 -0
  10. package/server.js +36 -16
  11. package/wwwroot/_content/MindExecution.Shared/js/mind-map-animated-image-preview.js +270 -0
  12. package/wwwroot/_content/MindExecution.Shared/js/mind-map-core.js +57 -53
  13. package/wwwroot/_content/MindExecution.Shared/js/mind-map-interactions.js +30 -26
  14. package/wwwroot/_content/MindExecution.Shared/js/mind-map-lod-renderer.js +94 -124
  15. package/wwwroot/_content/MindExecution.Shared/js/mind-map-menu-manager.js +43 -21
  16. package/wwwroot/_content/MindExecution.Shared/js/mind-map-nodes.js +45 -13
  17. package/wwwroot/_content/MindExecution.Shared/js/mind-map-render-plan.js +117 -1
  18. package/wwwroot/_content/MindExecution.Shared/js/mind-map-texture-factory.js +4 -1
  19. package/wwwroot/_framework/{MindExecution.Core.2ch68iyy8o.dll → MindExecution.Core.b973f5f64y.dll} +0 -0
  20. package/wwwroot/_framework/{MindExecution.Kernel.dh617xfv36.dll → MindExecution.Kernel.k4h9fvi9wb.dll} +0 -0
  21. package/wwwroot/_framework/{MindExecution.Plugins.Admin.0sm50hbae9.dll → MindExecution.Plugins.Admin.u2emae8cb5.dll} +0 -0
  22. package/wwwroot/_framework/{MindExecution.Plugins.Business.3wq01orrbu.dll → MindExecution.Plugins.Business.cysw4qtyke.dll} +0 -0
  23. package/wwwroot/_framework/{MindExecution.Plugins.Concept.z8yl28fa2a.dll → MindExecution.Plugins.Concept.8iehgvzjio.dll} +0 -0
  24. package/wwwroot/_framework/{MindExecution.Plugins.Directory.m7murp5oes.dll → MindExecution.Plugins.Directory.t621fsxq2i.dll} +0 -0
  25. package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.yuyrbpf0vh.dll → MindExecution.Plugins.PlanMaster.ft631uc7ki.dll} +0 -0
  26. package/wwwroot/_framework/{MindExecution.Plugins.YouTube.rwxvn00rm2.dll → MindExecution.Plugins.YouTube.arivgu92h1.dll} +0 -0
  27. package/wwwroot/_framework/{MindExecution.Shared.r9k48iyijb.dll → MindExecution.Shared.wm997st9eb.dll} +0 -0
  28. package/wwwroot/_framework/{MindExecution.Web.742aribkxm.dll → MindExecution.Web.osdbdrue4h.dll} +0 -0
  29. package/wwwroot/_framework/blazor.boot.json +21 -21
  30. package/wwwroot/app-icon-1024.png +0 -0
  31. package/wwwroot/apple-touch-icon.png +0 -0
  32. package/wwwroot/appsettings.json +81 -81
  33. package/wwwroot/favicon-32x32.png +0 -0
  34. package/wwwroot/favicon.ico +0 -0
  35. package/wwwroot/icon-192.png +0 -0
  36. package/wwwroot/icon-512.png +0 -0
  37. package/wwwroot/index.html +70 -46
  38. package/wwwroot/manifest.webmanifest +4 -4
  39. package/wwwroot/mindexec-favicon-v3.png +0 -0
  40. package/wwwroot/service-worker-assets.js +888 -880
  41. package/wwwroot/service-worker.js +1 -1
@@ -6,10 +6,13 @@
6
6
  const INITIAL_LINE_TEXTURE_ROWS = 1024;
7
7
  const GPU_WARM_RETRY_DELAY_MS = 120;
8
8
  const IMAGE_ATLAS_TILE_SIZE = 128;
9
+ const IMAGE_ATLAS_UPLOAD_SETTLE_MS = 1000;
10
+ const IMAGE_ATLAS_UPLOAD_MAX_WAIT_MS = 3500;
9
11
  const frameSampleStates = new WeakMap();
10
12
  const residentLinePrewarmStates = new WeakMap();
11
13
  const residentTransitionStates = new WeakMap();
12
14
  const cssMediaFrameDomStates = new WeakMap();
15
+ const imageAtlasUploadStates = new WeakMap();
13
16
  let cssMediaFrameDomReuseCount = 0;
14
17
  let cssMediaFrameDomApplyCount = 0;
15
18
  const RESIDENT_CSS_CACHE_TEXT_TYPES = new Set(['text', 'note', 'memo', 'markdown', 'code', 'csv-table']);
@@ -447,6 +450,108 @@
447
450
  return true;
448
451
  }
449
452
 
453
+ function prepareImageAtlasForEntries(renderer, entries) {
454
+ let imageCount = 0;
455
+ for (const entry of entries || []) {
456
+ const model = entry?.model || null;
457
+ const contentType = String(model?.contentType ?? model?.ContentType ?? '').toLowerCase();
458
+ if (contentType === 'video') {
459
+ imageCount++;
460
+ continue;
461
+ }
462
+ if (contentType === 'image') {
463
+ if (globalThis.MindMapNodes?.isAnimatedGifImageNodeModel?.(model) !== true) imageCount++;
464
+ continue;
465
+ }
466
+ if (contentType === 'embed') {
467
+ const urls = globalThis.MindMapNodes?.getNodeImageAssetUrls?.(model) || null;
468
+ if (urls?.thumbnailUrl || urls?.snapshotUrl || urls?.previewImageUrl) imageCount++;
469
+ }
470
+ }
471
+ return prepareImageAtlasCapacity(renderer, imageCount);
472
+ }
473
+
474
+ function uploadImageAtlasTile(renderer, slot, canvas) {
475
+ const webglRenderer = renderer?.renderer || null;
476
+ const gl = renderer?.gl || webglRenderer?.getContext?.() || null;
477
+ const texture = renderer?.imageAtlasTexture || null;
478
+ if (!webglRenderer?.initTexture || !gl || !texture || !canvas || !(slot?.slotIndex >= 0)) return false;
479
+
480
+ let savedTexture = null;
481
+ let savedFlipY = null;
482
+ let savedPremultiply = null;
483
+ let savedColorspace = null;
484
+ try {
485
+ webglRenderer.initTexture(texture);
486
+ const handle = webglRenderer.properties?.get?.(texture)?.__webglTexture || null;
487
+ if (!handle) return false;
488
+ savedTexture = gl.getParameter(gl.TEXTURE_BINDING_2D);
489
+ savedFlipY = gl.getParameter(gl.UNPACK_FLIP_Y_WEBGL);
490
+ savedPremultiply = gl.getParameter(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL);
491
+ savedColorspace = gl.getParameter(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL);
492
+ const columns = Math.max(1, Number(renderer.imageAtlasColumns || 1));
493
+ const x = (slot.slotIndex % columns) * IMAGE_ATLAS_TILE_SIZE;
494
+ const y = Math.floor(slot.slotIndex / columns) * IMAGE_ATLAS_TILE_SIZE;
495
+ gl.bindTexture(gl.TEXTURE_2D, handle);
496
+ gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
497
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
498
+ gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, gl.NONE);
499
+ gl.texSubImage2D(gl.TEXTURE_2D, 0, x, y, gl.RGBA, gl.UNSIGNED_BYTE, canvas);
500
+ renderer._imageAtlasTileUploadCount = Number(renderer._imageAtlasTileUploadCount || 0) + 1;
501
+ renderer._residentGpuWarmKey = '';
502
+ renderer._residentImageAtlasWarmVersion = -1;
503
+ return true;
504
+ } catch {
505
+ return false;
506
+ } finally {
507
+ if (savedFlipY !== null) gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, savedFlipY);
508
+ if (savedPremultiply !== null) gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, savedPremultiply);
509
+ if (savedColorspace !== null) gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, savedColorspace);
510
+ if (savedTexture !== null) gl.bindTexture(gl.TEXTURE_2D, savedTexture);
511
+ }
512
+ }
513
+
514
+ function scheduleImageAtlasUpload(renderer, module = renderer?._module) {
515
+ if (!renderer?.imageAtlasTexture || renderer?._disposed === true) return false;
516
+ const now = typeof performance !== 'undefined' ? performance.now() : Date.now();
517
+ let state = imageAtlasUploadStates.get(renderer);
518
+ if (!state) {
519
+ state = { timer: 0, startedAt: now, pending: false, epoch: 0 };
520
+ imageAtlasUploadStates.set(renderer, state);
521
+ }
522
+ state.pending = true;
523
+ state.epoch = Number(renderer._residentStaticPreviewEpoch || 0);
524
+ if (!(state.startedAt > 0)) state.startedAt = now;
525
+ if (state.timer) clearTimeout(state.timer);
526
+ const elapsedMs = Math.max(0, now - state.startedAt);
527
+ const delayMs = Math.max(0, Math.min(
528
+ IMAGE_ATLAS_UPLOAD_SETTLE_MS,
529
+ IMAGE_ATLAS_UPLOAD_MAX_WAIT_MS - elapsedMs
530
+ ));
531
+ state.timer = setTimeout(() => {
532
+ state.timer = 0;
533
+ if (!state.pending || renderer._disposed === true ||
534
+ state.epoch !== Number(renderer._residentStaticPreviewEpoch || 0)) return;
535
+ state.pending = false;
536
+ state.startedAt = 0;
537
+ if (!renderer.imageAtlasTexture) return;
538
+ renderer.imageAtlasTexture.needsUpdate = true;
539
+ renderer._imageAtlasTextureUploadCount = Number(renderer._imageAtlasTextureUploadCount || 0) + 1;
540
+ const activeModule = renderer._module || module;
541
+ if (activeModule) {
542
+ activeModule._forceUpdateFrames = Math.max(Number(activeModule._forceUpdateFrames || 0), 1);
543
+ activeModule.requestAnimationWake?.('image-atlas-texture-upload');
544
+ }
545
+ }, delayMs);
546
+ return true;
547
+ }
548
+
549
+ function clearScheduledImageAtlasUpload(renderer) {
550
+ const state = imageAtlasUploadStates.get(renderer);
551
+ if (state?.timer) clearTimeout(state.timer);
552
+ imageAtlasUploadStates.delete(renderer);
553
+ }
554
+
450
555
  function fallbackBatch(renderer, fallbackIds, limit = 12) {
451
556
  const ids = Array.from(fallbackIds || []);
452
557
  const safeLimit = Math.max(1, Number(limit || 1));
@@ -698,6 +803,12 @@
698
803
  return result === true;
699
804
  }
700
805
 
806
+ function hasActionableResidentLineDetails(renderer, module, lodBand) {
807
+ const nodeIds = renderer?.instanceData?.nodeIds || [];
808
+ return nodeIds.length > 0 && renderer?._hasPendingLineDetailRestore?.(lodBand) === true &&
809
+ areResidentLinesPrepared(renderer, module?.nodeObjectsById, nodeIds);
810
+ }
811
+
701
812
  function hasResidentDirtyWork(renderer, camera, module, resolveLodBand, buildSelectionKey, isAnimatedGifModel) {
702
813
  if (!renderer) return false;
703
814
  const lodBand = camera && typeof resolveLodBand === 'function'
@@ -710,7 +821,7 @@
710
821
  renderer._imageAtlasRebuildPending === true || Number(renderer._imageAtlasQueuedIds?.size || 0) > 0 ||
711
822
  Number(renderer._imageAtlasLoadingIds?.size || 0) > 0 || Number(renderer._imageAtlasBatchReadyIds?.size || 0) > 0 ||
712
823
  renderer._imageAtlasBatchActive === true || renderer._lodCleanupPending === true ||
713
- renderer._deferLineRestorePending === true || renderer._hasPendingLineDetailRestore?.(lodBand) === true ||
824
+ renderer._deferLineRestorePending === true || hasActionableResidentLineDetails(renderer, module, lodBand) ||
714
825
  Number(renderer._pendingLodVisibilityVersion ?? -1) >= 0 || renderer._fullResHandoffActive === true ||
715
826
  renderer.isLoading === true || module?.isLoading === true || renderer._hasResidentLodInstances?.() !== true;
716
827
  if (hasTypedResidentDirtyWork) {
@@ -1797,6 +1908,10 @@
1797
1908
  ensureLineTextureCapacity,
1798
1909
  renderResidentWarmScene,
1799
1910
  prepareImageAtlasCapacity,
1911
+ prepareImageAtlasForEntries,
1912
+ uploadImageAtlasTile,
1913
+ scheduleImageAtlasUpload,
1914
+ clearScheduledImageAtlasUpload,
1800
1915
  fallbackBatch,
1801
1916
  reuseCssMediaFrameDom,
1802
1917
  reuseStableVisibleCss,
@@ -1807,6 +1922,7 @@
1807
1922
  invalidateActiveCssMediaFallbackCountCache,
1808
1923
  markLodImageCssFallbacksChanged,
1809
1924
  createTrackedLodImageCssFallbackSet,
1925
+ hasActionableResidentLineDetails,
1810
1926
  hasResidentDirtyWork,
1811
1927
  hasPendingNearCssWarmup,
1812
1928
  reusePreparedImageInstances,
@@ -593,8 +593,11 @@
593
593
  preferOriginal !== true &&
594
594
  existingSourceKind === 'original' &&
595
595
  (matchesOriginalUrl || isThumbnailAssetUrl(normalizedRequestedUrl));
596
+ const canUseMatchingOriginal =
597
+ matchesOriginalUrl &&
598
+ (preferOriginal === true || options.allowOriginalReuseForPreview !== false);
596
599
 
597
- if (!(matchesRequestedUrl || matchesOriginalUrl || canUseOriginalForPreview)) {
600
+ if (!(matchesRequestedUrl || canUseMatchingOriginal || canUseOriginalForPreview)) {
598
601
  return false;
599
602
  }
600
603
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "mainAssemblyName": "MindExecution.Web",
3
3
  "resources": {
4
- "hash": "sha256-2nIeTn87ps7hCIDuMs8IMWpBJVZ9YCRuQ89zxygANvg=",
4
+ "hash": "sha256-k2itmZGSZI4/oLV1PZkSvmP5G7hZ+KnYz6N+kaFBt1I=",
5
5
  "fingerprinting": {
6
6
  "Google.Protobuf.9h59ukbel7.dll": "Google.Protobuf.dll",
7
7
  "Markdig.d1j7v41cl1.dll": "Markdig.dll",
@@ -122,16 +122,16 @@
122
122
  "System.brmz7yk5qh.dll": "System.dll",
123
123
  "netstandard.b50t77veor.dll": "netstandard.dll",
124
124
  "System.Private.CoreLib.g6ztz7cmo2.dll": "System.Private.CoreLib.dll",
125
- "MindExecution.Core.2ch68iyy8o.dll": "MindExecution.Core.dll",
126
- "MindExecution.Kernel.dh617xfv36.dll": "MindExecution.Kernel.dll",
127
- "MindExecution.Plugins.Admin.0sm50hbae9.dll": "MindExecution.Plugins.Admin.dll",
128
- "MindExecution.Plugins.Business.3wq01orrbu.dll": "MindExecution.Plugins.Business.dll",
129
- "MindExecution.Plugins.Concept.z8yl28fa2a.dll": "MindExecution.Plugins.Concept.dll",
130
- "MindExecution.Plugins.Directory.m7murp5oes.dll": "MindExecution.Plugins.Directory.dll",
131
- "MindExecution.Plugins.PlanMaster.yuyrbpf0vh.dll": "MindExecution.Plugins.PlanMaster.dll",
132
- "MindExecution.Plugins.YouTube.rwxvn00rm2.dll": "MindExecution.Plugins.YouTube.dll",
133
- "MindExecution.Shared.r9k48iyijb.dll": "MindExecution.Shared.dll",
134
- "MindExecution.Web.742aribkxm.dll": "MindExecution.Web.dll",
125
+ "MindExecution.Core.b973f5f64y.dll": "MindExecution.Core.dll",
126
+ "MindExecution.Kernel.k4h9fvi9wb.dll": "MindExecution.Kernel.dll",
127
+ "MindExecution.Plugins.Admin.u2emae8cb5.dll": "MindExecution.Plugins.Admin.dll",
128
+ "MindExecution.Plugins.Business.cysw4qtyke.dll": "MindExecution.Plugins.Business.dll",
129
+ "MindExecution.Plugins.Concept.8iehgvzjio.dll": "MindExecution.Plugins.Concept.dll",
130
+ "MindExecution.Plugins.Directory.t621fsxq2i.dll": "MindExecution.Plugins.Directory.dll",
131
+ "MindExecution.Plugins.PlanMaster.ft631uc7ki.dll": "MindExecution.Plugins.PlanMaster.dll",
132
+ "MindExecution.Plugins.YouTube.arivgu92h1.dll": "MindExecution.Plugins.YouTube.dll",
133
+ "MindExecution.Shared.wm997st9eb.dll": "MindExecution.Shared.dll",
134
+ "MindExecution.Web.osdbdrue4h.dll": "MindExecution.Web.dll",
135
135
  "dotnet.native.566r55w3xu.js": "dotnet.native.js",
136
136
  "dotnet.native.x6q5aixc38.wasm": "dotnet.native.wasm",
137
137
  "dotnet.js": "dotnet.js",
@@ -276,18 +276,18 @@
276
276
  "System.Xml.XDocument.sn51jas17n.dll": "sha256-GNI2kFgFmPTwzuzwUn8gxK+AzGLUWRJFdg9JzIbrybQ=",
277
277
  "System.brmz7yk5qh.dll": "sha256-CfM2miyj1KHApFmqMdLYWio3S/jrdON2pW9Xr2nTwlo=",
278
278
  "netstandard.b50t77veor.dll": "sha256-//jQGOXjb8ET8WtXgOJrAxLx6E7zDJ5RjRRutwkvmxo=",
279
- "MindExecution.Core.2ch68iyy8o.dll": "sha256-vjKyf+PwuPX3xAYHGRgYNF2KQYxm8xW7bcY6rgDAn0o=",
280
- "MindExecution.Kernel.dh617xfv36.dll": "sha256-7+11/qc2LDTbKax01MVqbO4Zx6VB7us6Ign0pLL05Ts=",
281
- "MindExecution.Plugins.Business.3wq01orrbu.dll": "sha256-3QYsNFB0xvz0qfSQXlLB4Z2Xs/navunyjLYzTVmNvyw=",
282
- "MindExecution.Plugins.Concept.z8yl28fa2a.dll": "sha256-o3JiuwvgNbMdnzEH4wE4xLbqckgYySvDC9P4VBu/fKM=",
283
- "MindExecution.Plugins.PlanMaster.yuyrbpf0vh.dll": "sha256-OsiswutNqeV0FT6Prvyrk0ylIbTneCeGRXHbG730E/8=",
284
- "MindExecution.Shared.r9k48iyijb.dll": "sha256-YZCQNctXtyPwDlxwi6SoFDAdgyBMei5ykzzqz83NrJU=",
285
- "MindExecution.Web.742aribkxm.dll": "sha256-N1w254EQYnkYsUY50OpUugN8M82bonsiT4d74S+srDE="
279
+ "MindExecution.Core.b973f5f64y.dll": "sha256-gaWEYZie3oGBsJ7KNcinPxikQw7nSHgJSBllq4YEZ38=",
280
+ "MindExecution.Kernel.k4h9fvi9wb.dll": "sha256-DJajefF5YNuFQ7hh7Y8750yzg5kXpdE91GuofhBtiIg=",
281
+ "MindExecution.Plugins.Business.cysw4qtyke.dll": "sha256-bCkYY5nsWdSGvLFYVjeMGh/SLIrhErscom7vq4WW1e8=",
282
+ "MindExecution.Plugins.Concept.8iehgvzjio.dll": "sha256-sD9g99bCcgFnUnIivPfe19mEYg7scZKgwdHuh5fT3wM=",
283
+ "MindExecution.Plugins.PlanMaster.ft631uc7ki.dll": "sha256-Q54/SRbdbUoRNPbJrN9ngcsNdAN2uqHK0Or2GVU7Vx8=",
284
+ "MindExecution.Shared.wm997st9eb.dll": "sha256-CABTI+PIZ9ZrDZ2VoLANJ5qvthYPX32AoKv2/qdpp0E=",
285
+ "MindExecution.Web.osdbdrue4h.dll": "sha256-mPMX7zmQgrN1cg8qclbhRZlRm5N45je5DzrRQrunlCw="
286
286
  },
287
287
  "lazyAssembly": {
288
- "MindExecution.Plugins.Admin.0sm50hbae9.dll": "sha256-kBZPshQAJw9eFT9ekAD5ZnvRqkuWzHMa3OnIGX11eZw=",
289
- "MindExecution.Plugins.Directory.m7murp5oes.dll": "sha256-DuX8c4uJBEXcR8Fx2YR3zYPQ8JVzKIBdRHuCH4IEeV4=",
290
- "MindExecution.Plugins.YouTube.rwxvn00rm2.dll": "sha256-a/TixIdXMDc8zcRNSZ0Laq/Vz1J5InSRaymyzTdWp94="
288
+ "MindExecution.Plugins.Admin.u2emae8cb5.dll": "sha256-xrK3EFbor2pEuhuKt/MXQSBJmTt22JYH68udxQLbEi4=",
289
+ "MindExecution.Plugins.Directory.t621fsxq2i.dll": "sha256-q0/3D7+gLKCW1xhY+wgOFGWCSh6AhKWfyZ0GwzanC14=",
290
+ "MindExecution.Plugins.YouTube.arivgu92h1.dll": "sha256-Sje33rNG7OWB8dP5QngdiqI2qWjCIfhQx7b+v8Y7AIU="
291
291
  }
292
292
  },
293
293
  "cacheBootResources": true,
Binary file
Binary file
@@ -1,83 +1,83 @@
1
1
  {
2
- "OpenRouter": {
3
- "ApiKey": ""
4
- },
5
- "Execution": {
6
- "Mode": "Concept",
7
- "Model": "openai/gpt-4o-mini"
8
- },
9
- "Supabase": {
10
- "Url": "https://otbyfkjxrkngvjziawki.supabase.co",
11
- "Key": "sb_publishable_NpUs0RDJH2YnllsqTKO6TQ_1jTdSsNQ"
12
- },
13
- "Bridge": {
14
- "Url": "app-origin",
15
- "FallbackPort": 5148,
16
- "AllowHostedLocalFallback": false
17
- },
18
- "ProjectStorage": {
19
- "Mode": "LocalOnly",
20
- "CloudProjectsEnabled": false
21
- },
22
- "CloudflareR2": {
23
- "ProxyUrl": "https://r2-auth-proxy.lovecrdm.workers.dev",
24
- "PublicBaseUrl": "https://r2-auth-proxy.lovecrdm.workers.dev/public",
25
- "PrivateSignUrl": "https://r2-auth-proxy.lovecrdm.workers.dev/sign",
26
- "PrivateBatchSignUrl": "https://r2-auth-proxy.lovecrdm.workers.dev/sign-batch",
27
- "PrivateUrlTtlSeconds": 900
28
- },
29
- "CloudflareWebCapture": {
30
- "EndpointUrl": "https://web-capture-worker.lovecrdm.workers.dev/capture",
31
- "RequestTimeoutMs": 45000
32
- },
33
- "Payments": {
34
- "Provider": "dodo"
35
- },
36
- "DodoPayments": {
37
- "DefaultProductId": "",
38
- "StandardPriceId": "dodo_pro_monthly_v1",
39
- "EarlyPriceId": "dodo_pro_monthly_v1",
40
- "LtdPriceId": "dodo_ltd_launch_v1",
41
- "ReturnUrl": "https://mindexec.pages.dev/pricing",
42
- "Environment": "test_mode"
43
- },
44
- "Paddle": {
45
- "ClientToken": "",
46
- "ProMonthlyPriceId": ""
47
- },
48
- "ProductProfile": {
49
- "VariantKey": "platform",
50
- "Slug": "mindexec",
51
- "BrandName": "MindExec",
52
- "ProductName": "MindCanvas",
53
- "AppTitle": "MindExec",
54
- "WorkspaceNounSingular": "canvas",
55
- "WorkspaceNounPlural": "canvases",
56
- "SignInTitle": "Welcome Back",
57
- "SignUpTitle": "Create Account",
58
- "SignInSubtitle": "Sign in to access your MindCanvas workspace.",
59
- "SignUpSubtitle": "Sign up to start organizing your ideas on a visual canvas.",
60
- "PrimaryCheckoutProvider": "dodo",
61
- "CanonicalHost": "localhost",
62
- "DodoCatalog": {
63
- "StandardPriceId": "dodo_pro_monthly_v1",
64
- "EarlyPriceId": "dodo_pro_monthly_v1",
65
- "LtdPriceId": "dodo_ltd_launch_v1"
66
- },
67
- "MarketingTool": {
68
- "Enabled": false,
69
- "HideAppChrome": true,
70
- "AllowMindCanvasRoute": false,
71
- "HomeRoute": "/",
72
- "ToolKey": "",
73
- "HeroEyebrow": "Free local tool",
74
- "HeroTitle": "",
75
- "HeroSubtitle": "",
76
- "PrimaryCtaText": "Open MindCanvas",
77
- "PrimaryCtaHref": "/mindcanvas",
78
- "SecondaryCtaText": "",
79
- "SecondaryCtaHref": "",
80
- "PrivacyNote": "Runs locally in your browser. No login. No database storage."
81
- }
82
- }
2
+ "OpenRouter": {
3
+ "ApiKey": ""
4
+ },
5
+ "Execution": {
6
+ "Mode": "Concept",
7
+ "Model": "openai/gpt-4o-mini"
8
+ },
9
+ "Supabase": {
10
+ "Url": "https://otbyfkjxrkngvjziawki.supabase.co",
11
+ "Key": "sb_publishable_NpUs0RDJH2YnllsqTKO6TQ_1jTdSsNQ"
12
+ },
13
+ "Bridge": {
14
+ "Url": "app-origin",
15
+ "FallbackPort": 5148,
16
+ "AllowHostedLocalFallback": false
17
+ },
18
+ "ProjectStorage": {
19
+ "Mode": "LocalOnly",
20
+ "CloudProjectsEnabled": false
21
+ },
22
+ "CloudflareR2": {
23
+ "ProxyUrl": "https://r2-auth-proxy.lovecrdm.workers.dev",
24
+ "PublicBaseUrl": "https://r2-auth-proxy.lovecrdm.workers.dev/public",
25
+ "PrivateSignUrl": "https://r2-auth-proxy.lovecrdm.workers.dev/sign",
26
+ "PrivateBatchSignUrl": "https://r2-auth-proxy.lovecrdm.workers.dev/sign-batch",
27
+ "PrivateUrlTtlSeconds": 900
28
+ },
29
+ "CloudflareWebCapture": {
30
+ "EndpointUrl": "https://web-capture-worker.lovecrdm.workers.dev/capture",
31
+ "RequestTimeoutMs": 45000
32
+ },
33
+ "Payments": {
34
+ "Provider": "dodo"
35
+ },
36
+ "DodoPayments": {
37
+ "DefaultProductId": "",
38
+ "StandardPriceId": "dodo_pro_monthly_v1",
39
+ "EarlyPriceId": "dodo_pro_monthly_v1",
40
+ "LtdPriceId": "dodo_ltd_launch_v1",
41
+ "ReturnUrl": "https://mindexec.pages.dev/pricing",
42
+ "Environment": "test_mode"
43
+ },
44
+ "Paddle": {
45
+ "ClientToken": "",
46
+ "ProMonthlyPriceId": ""
47
+ },
48
+ "ProductProfile": {
49
+ "VariantKey": "platform",
50
+ "Slug": "mindexec",
51
+ "BrandName": "MindExec",
52
+ "ProductName": "MindCanvas",
53
+ "AppTitle": "MindExec",
54
+ "WorkspaceNounSingular": "canvas",
55
+ "WorkspaceNounPlural": "canvases",
56
+ "SignInTitle": "Welcome Back",
57
+ "SignUpTitle": "Create Account",
58
+ "SignInSubtitle": "Sign in to access your MindCanvas workspace.",
59
+ "SignUpSubtitle": "Sign up to start organizing your ideas on a visual canvas.",
60
+ "PrimaryCheckoutProvider": "dodo",
61
+ "CanonicalHost": "localhost",
62
+ "DodoCatalog": {
63
+ "StandardPriceId": "dodo_pro_monthly_v1",
64
+ "EarlyPriceId": "dodo_pro_monthly_v1",
65
+ "LtdPriceId": "dodo_ltd_launch_v1"
66
+ },
67
+ "MarketingTool": {
68
+ "Enabled": false,
69
+ "HideAppChrome": true,
70
+ "AllowMindCanvasRoute": false,
71
+ "HomeRoute": "/",
72
+ "ToolKey": "",
73
+ "HeroEyebrow": "Free local tool",
74
+ "HeroTitle": "",
75
+ "HeroSubtitle": "",
76
+ "PrimaryCtaText": "Open MindCanvas",
77
+ "PrimaryCtaHref": "/mindcanvas",
78
+ "SecondaryCtaText": "",
79
+ "SecondaryCtaHref": "",
80
+ "PrivacyNote": "Runs locally in your browser. No login. No database storage."
81
+ }
82
+ }
83
83
  }
Binary file
Binary file
Binary file
Binary file
@@ -7,55 +7,85 @@
7
7
  <title>MindExec | Business Execution OS for solo builders</title>
8
8
  <meta name="description" content="MindExec is an AI business execution OS for solo builders who want to turn notes, research, assets, and repeatable execution Skills into revenue-producing work." />
9
9
  <base href="/" />
10
- <meta name="theme-color" content="#071a36" />
11
- <link rel="icon" type="image/png" sizes="32x32" href="/mindexec-favicon-v2.png" />
12
- <link rel="apple-touch-icon" sizes="180x180" href="apple-touch-icon.png?v=20260728-app-icon-v1" />
13
- <link rel="manifest" href="manifest.webmanifest?v=20260728-app-icon-v1" />
10
+ <meta name="theme-color" content="#f8fafc" />
11
+ <link rel="icon" type="image/png" sizes="32x32" href="/mindexec-favicon-v3.png" />
12
+ <link rel="apple-touch-icon" sizes="180x180" href="apple-touch-icon.png?v=20260815-app-icon-v2" />
13
+ <link rel="manifest" href="manifest.webmanifest?v=20260815-app-icon-v2" />
14
14
  <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260629-ai-task-flow-v863" />
15
15
  <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260629-mdm-shadow-v856" />
16
16
  <!-- ??좎뜦堉??Font Awesome (local) ??좎뜦堉??-->
17
17
  <link rel="stylesheet" href="_content/MindExecution.Shared/lib/font-awesome/css/all.min.css" />
18
18
  <!-- ??좎뜦堉??-->
19
19
  <style>
20
+ html,
21
+ body {
22
+ margin: 0;
23
+ background: #f8fafc;
24
+ }
25
+
20
26
  #app {
21
27
  min-height: 100vh;
22
28
  }
23
29
 
24
30
  .app-static-fallback {
25
- width: min(960px, calc(100% - 32px));
26
- margin: 0 auto;
27
- padding: 56px 0 48px;
28
- color: #0f172a;
29
- line-height: 1.7;
31
+ position: fixed;
32
+ inset: 0;
33
+ z-index: 10;
34
+ box-sizing: border-box;
35
+ display: flex;
36
+ align-items: center;
37
+ justify-content: center;
38
+ width: 100%;
39
+ margin: 0;
40
+ padding: 24px;
41
+ background: #f8fafc;
42
+ color: #64748b;
43
+ font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
30
44
  }
31
45
 
32
- .app-static-fallback__eyebrow {
33
- display: inline-flex;
34
- padding: 6px 10px;
35
- border-radius: 999px;
36
- background: rgba(255, 255, 255, 0.84);
37
- border: 1px solid rgba(148, 163, 184, 0.25);
38
- font-size: 12px;
39
- font-weight: 700;
40
- color: #334155;
46
+ .app-loading-shell {
47
+ display: flex;
48
+ flex-direction: column;
49
+ align-items: center;
50
+ gap: 14px;
51
+ text-align: center;
41
52
  }
42
53
 
43
- .app-static-fallback h1 {
44
- margin: 16px 0 0;
45
- font-size: clamp(30px, 4vw, 48px);
46
- line-height: 1.05;
47
- font-weight: 800;
54
+ .app-loading-shell__logo {
55
+ display: block;
56
+ width: 44px;
57
+ height: 44px;
48
58
  }
49
59
 
50
- .app-static-fallback p {
51
- max-width: 760px;
52
- margin: 16px 0 0;
53
- color: #475569;
60
+ .app-loading-spinner {
61
+ box-sizing: border-box;
62
+ width: 34px;
63
+ height: 34px;
64
+ border: 3px solid #dbe5f0;
65
+ border-top-color: #2563eb;
66
+ border-radius: 50%;
67
+ animation: app-loading-spin 720ms linear infinite;
54
68
  }
55
69
 
56
- .app-static-fallback a {
57
- color: #0f172a;
58
- font-weight: 700;
70
+ .app-loading-shell__label,
71
+ .app-loading-shell__noscript {
72
+ margin: 0;
73
+ font-size: 13px;
74
+ line-height: 1.4;
75
+ font-weight: 600;
76
+ letter-spacing: 0.01em;
77
+ }
78
+
79
+ @keyframes app-loading-spin {
80
+ to {
81
+ transform: rotate(360deg);
82
+ }
83
+ }
84
+
85
+ @media (prefers-reduced-motion: reduce) {
86
+ .app-loading-spinner {
87
+ animation-duration: 1600ms;
88
+ }
59
89
  }
60
90
 
61
91
  #blazor-error-ui {
@@ -99,13 +129,14 @@
99
129
  <div id="app-container">
100
130
  <div id="app">
101
131
  <article class="app-static-fallback" id="app-static-fallback">
102
- <div class="app-static-fallback__eyebrow">MindExec</div>
103
- <h1>MindExec</h1>
104
- <p>Turn ideas into revenue execution. MindExec is a Business Execution OS that moves serious work into MindCanvas, where context, AI Tasks, execution Skills, media, and results stay connected.</p>
105
- <p><a href="/mindcanvas">Open MindCanvas</a> | <a href="/pricing">See pricing</a> | <a href="/tools">Browse free tools</a></p>
106
- <noscript>
107
- <p>JavaScript is required for the interactive tool experience.</p>
108
- </noscript>
132
+ <div class="app-loading-shell" role="status" aria-live="polite" aria-label="Loading MindCanvas">
133
+ <img class="app-loading-shell__logo" src="icon-192.png?v=20260815-app-icon-v2" alt="" aria-hidden="true" />
134
+ <div class="app-loading-spinner" aria-hidden="true"></div>
135
+ <p class="app-loading-shell__label">Loading MindCanvas&hellip;</p>
136
+ <noscript>
137
+ <p class="app-loading-shell__noscript">JavaScript is required to start MindCanvas.</p>
138
+ </noscript>
139
+ </div>
109
140
  </article>
110
141
  </div>
111
142
  </div>
@@ -583,7 +614,7 @@
583
614
  }
584
615
 
585
616
  const base = '_content/MindExecution.Shared/js/';
586
- const scriptVersion = '20260806-thumbnail-agents-v964';
617
+ const scriptVersion = '20260815-canvas-coordinate-v972';
587
618
  const scriptUrl = (script) => `${base}${script}?v=${scriptVersion}`;
588
619
  console.log(`[Script Loader] Shared JS version: ${scriptVersion}`);
589
620
  const criticalScripts = [
@@ -604,6 +635,7 @@
604
635
  'mind-map-object-manager.js',
605
636
  'mind-map-pipeline.js',
606
637
  'mind-map-nodes.js',
638
+ 'mind-map-animated-image-preview.js',
607
639
  'mind-map-menu-manager.js',
608
640
  'mind-map-multi-select.js',
609
641
  'mind-map-interactions.js',
@@ -735,11 +767,3 @@
735
767
  </body>
736
768
 
737
769
  </html>
738
-
739
-
740
-
741
-
742
-
743
-
744
-
745
-