@mindexec/cli 0.2.458 → 0.2.460

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 +106 -60
  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.oqju650dkd.dll} +0 -0
  20. package/wwwroot/_framework/{MindExecution.Kernel.dh617xfv36.dll → MindExecution.Kernel.7zjugdfmfg.dll} +0 -0
  21. package/wwwroot/_framework/{MindExecution.Plugins.Admin.0sm50hbae9.dll → MindExecution.Plugins.Admin.qln7lkmsnn.dll} +0 -0
  22. package/wwwroot/_framework/{MindExecution.Plugins.Business.3wq01orrbu.dll → MindExecution.Plugins.Business.rd6flxuebm.dll} +0 -0
  23. package/wwwroot/_framework/{MindExecution.Plugins.Concept.z8yl28fa2a.dll → MindExecution.Plugins.Concept.0qrgx3epss.dll} +0 -0
  24. package/wwwroot/_framework/{MindExecution.Plugins.Directory.m7murp5oes.dll → MindExecution.Plugins.Directory.4prauy9d1z.dll} +0 -0
  25. package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.yuyrbpf0vh.dll → MindExecution.Plugins.PlanMaster.cobfta1p3l.dll} +0 -0
  26. package/wwwroot/_framework/{MindExecution.Plugins.YouTube.rwxvn00rm2.dll → MindExecution.Plugins.YouTube.99bahbgkkr.dll} +0 -0
  27. package/wwwroot/_framework/{MindExecution.Shared.r9k48iyijb.dll → MindExecution.Shared.sevaa4rgkp.dll} +0 -0
  28. package/wwwroot/_framework/{MindExecution.Web.742aribkxm.dll → MindExecution.Web.coqh2ccnuk.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
@@ -1412,10 +1412,11 @@
1412
1412
  return normalizeImageAssetUrl(url).toLowerCase().includes('/assets/thumbs/');
1413
1413
  }
1414
1414
 
1415
- function isAnimatedGifImageUrl(url) {
1415
+ function isAnimationCapableImageUrl(url) {
1416
1416
  const normalized = normalizeImageAssetUrl(url);
1417
1417
  if (!normalized) return false;
1418
- return normalized.split(/[?#]/)[0].toLowerCase().endsWith('.gif');
1418
+ const pathname = normalized.split(/[?#]/)[0].toLowerCase();
1419
+ return pathname.endsWith('.gif') || pathname.endsWith('.webp');
1419
1420
  }
1420
1421
 
1421
1422
  function getMetadataValueCaseInsensitive(metadata, ...keys) {
@@ -1441,6 +1442,34 @@
1441
1442
  return '';
1442
1443
  }
1443
1444
 
1445
+ function isAnimationCapableImageNodeModel(nodeModel) {
1446
+ if (!nodeModel || getNodeContentTypeLower(nodeModel) !== 'image') {
1447
+ return false;
1448
+ }
1449
+
1450
+ const metadata = getNodeMetadata(nodeModel) || {};
1451
+ const mimeType = getMetadataValueCaseInsensitive(
1452
+ metadata,
1453
+ 'fileMime',
1454
+ 'FileMime',
1455
+ 'mimeType',
1456
+ 'MimeType'
1457
+ ).toLowerCase();
1458
+ if (mimeType === 'image/gif' || mimeType === 'image/webp') {
1459
+ return true;
1460
+ }
1461
+
1462
+ return [
1463
+ nodeModel?.response,
1464
+ nodeModel?.Response,
1465
+ metadata?.OriginalPath,
1466
+ metadata?.OriginalUrl,
1467
+ metadata?.originalUrl,
1468
+ metadata?.ImageUrl,
1469
+ metadata?.imageUrl
1470
+ ].some(isAnimationCapableImageUrl);
1471
+ }
1472
+
1444
1473
  function isAnimatedGifImageNodeModel(nodeModel) {
1445
1474
  if (!nodeModel || getNodeContentTypeLower(nodeModel) !== 'image') {
1446
1475
  return false;
@@ -1466,7 +1495,7 @@
1466
1495
  metadata?.originalUrl,
1467
1496
  metadata?.ImageUrl,
1468
1497
  metadata?.imageUrl
1469
- ].some(isAnimatedGifImageUrl);
1498
+ ].some(url => normalizeImageAssetUrl(url).split(/[?#]/)[0].toLowerCase().endsWith('.gif'));
1470
1499
  }
1471
1500
 
1472
1501
  function getAnimatedGifOriginalReference(nodeModel, fallback = '') {
@@ -1683,9 +1712,9 @@
1683
1712
  const metadata = ensureNodeMetadataObject(nodeModel);
1684
1713
  const normalizedContent = normalizeImageAssetUrl(nextContent);
1685
1714
  const thumbnailUrl = normalizeImageAssetUrl(metadata?.ThumbnailUrl || metadata?.thumbnailUrl || '');
1686
- const isAnimatedGif = isAnimatedGifImageNodeModel(nodeModel);
1715
+ const isAnimatedImage = isAnimationCapableImageNodeModel(nodeModel);
1687
1716
 
1688
- if (isAnimatedGif) {
1717
+ if (isAnimatedImage) {
1689
1718
  const originalReference = getAnimatedGifOriginalReference(nodeModel, normalizedContent);
1690
1719
  if (originalReference) {
1691
1720
  setNodeImageOriginalReference(nodeModel, originalReference);
@@ -1697,7 +1726,7 @@
1697
1726
  setNodeImageOriginalReference(nodeModel, normalizedContent);
1698
1727
  }
1699
1728
 
1700
- if (thumbnailUrl && !isAnimatedGif) {
1729
+ if (thumbnailUrl && !isAnimatedImage) {
1701
1730
  setNodeImagePreviewUrl(nodeModel, thumbnailUrl);
1702
1731
  return normalizeImageAssetUrl(nodeModel.response ?? nodeModel.Response ?? '');
1703
1732
  }
@@ -1824,15 +1853,15 @@
1824
1853
  ''
1825
1854
  );
1826
1855
  const missingAssetUrl = normalizeImageAssetUrl(metadata?.MissingAssetUrl || '');
1827
- const isAnimatedGif = isAnimatedGifImageNodeModel(nodeModel);
1856
+ const isAnimatedImage = isAnimationCapableImageNodeModel(nodeModel);
1828
1857
  const responseFullResUrl = isImageContent && canUseAsFullResImageUrl(responseUrl) ? responseUrl : '';
1829
1858
  const missingFullResUrl = canUseAsFullResImageUrl(missingAssetUrl) ? missingAssetUrl : '';
1830
- const mediaPreviewUrl = isAnimatedGif ? '' : (thumbnailUrl || snapshotUrl || previewImageUrl);
1831
- const responsePreviewUrl = isImageContent && !isAnimatedGif ? responseUrl : '';
1859
+ const mediaPreviewUrl = isAnimatedImage ? '' : (thumbnailUrl || snapshotUrl || previewImageUrl);
1860
+ const responsePreviewUrl = isImageContent && !isAnimatedImage ? responseUrl : '';
1832
1861
  const fullResUrl = isImageContent
1833
1862
  ? (originalUrl || originalPath || responseFullResUrl || missingFullResUrl)
1834
1863
  : (originalUrl || originalPath || snapshotUrl || previewImageUrl || thumbnailUrl || missingFullResUrl);
1835
- const previewUrl = isAnimatedGif
1864
+ const previewUrl = isAnimatedImage
1836
1865
  ? (fullResUrl || responseUrl || originalPath || originalUrl || missingAssetUrl)
1837
1866
  : (mediaPreviewUrl || responsePreviewUrl || originalPath || originalUrl || missingAssetUrl);
1838
1867
 
@@ -1846,13 +1875,14 @@
1846
1875
  missingAssetUrl,
1847
1876
  previewUrl,
1848
1877
  fullResUrl,
1849
- animatedGif: isAnimatedGif
1878
+ animationCapable: isAnimatedImage,
1879
+ animatedGif: isAnimatedImage
1850
1880
  };
1851
1881
  }
1852
1882
 
1853
1883
  function hasNodeImagePreviewSource(assetUrls) {
1854
1884
  if (!assetUrls || typeof assetUrls !== 'object') return false;
1855
- if (assetUrls.animatedGif === true) return false;
1885
+ if (assetUrls.animationCapable === true || assetUrls.animatedGif === true) return false;
1856
1886
  return !!(
1857
1887
  assetUrls.thumbnailUrl ||
1858
1888
  (assetUrls.responseUrl && isThumbnailImageUrl(assetUrls.responseUrl))
@@ -1879,7 +1909,7 @@
1879
1909
  if (!assetUrls.previewUrl) {
1880
1910
  return;
1881
1911
  }
1882
- if (assetUrls.animatedGif === true) {
1912
+ if (assetUrls.animationCapable === true || assetUrls.animatedGif === true) {
1883
1913
  return;
1884
1914
  }
1885
1915
 
@@ -4570,6 +4600,7 @@
4570
4600
  bringNodeToFront: bringNodeToFront,
4571
4601
  updateNodeSelectionStyle: updateNodeSelectionStyle,
4572
4602
  applySingleSelection: applySingleSelection,
4603
+ moveCursorAfterNodePlacement: moveCursorAfterNodePlacement,
4573
4604
  resetState: resetState,
4574
4605
  captureDeleteSnapshot: captureDeleteSnapshot,
4575
4606
  // ▼▼▼ [New] Expose helper function for external callers ▼▼▼
@@ -4580,6 +4611,7 @@
4580
4611
  updateAnimatedImageStatusTextures: updateAnimatedImageStatusTextures,
4581
4612
  applyCanonicalNodeResponse: applyCanonicalNodeResponse,
4582
4613
  isGeneratedImageNodeModel: isGeneratedImageNodeModel,
4614
+ isAnimationCapableImageNodeModel: isAnimationCapableImageNodeModel,
4583
4615
  isAnimatedGifImageNodeModel: isAnimatedGifImageNodeModel,
4584
4616
  getNodeImageAssetUrls: getNodeImageAssetUrls,
4585
4617
  setNodeImageOriginalUrl: setNodeImageOriginalUrl,
@@ -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-j3+TOGBljyWZdYIgA9a2YYTlaG+Rt2EVMQ0fB5eRn8E=",
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.oqju650dkd.dll": "MindExecution.Core.dll",
126
+ "MindExecution.Kernel.7zjugdfmfg.dll": "MindExecution.Kernel.dll",
127
+ "MindExecution.Plugins.Admin.qln7lkmsnn.dll": "MindExecution.Plugins.Admin.dll",
128
+ "MindExecution.Plugins.Business.rd6flxuebm.dll": "MindExecution.Plugins.Business.dll",
129
+ "MindExecution.Plugins.Concept.0qrgx3epss.dll": "MindExecution.Plugins.Concept.dll",
130
+ "MindExecution.Plugins.Directory.4prauy9d1z.dll": "MindExecution.Plugins.Directory.dll",
131
+ "MindExecution.Plugins.PlanMaster.cobfta1p3l.dll": "MindExecution.Plugins.PlanMaster.dll",
132
+ "MindExecution.Plugins.YouTube.99bahbgkkr.dll": "MindExecution.Plugins.YouTube.dll",
133
+ "MindExecution.Shared.sevaa4rgkp.dll": "MindExecution.Shared.dll",
134
+ "MindExecution.Web.coqh2ccnuk.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.oqju650dkd.dll": "sha256-kAa63CfXtc76u8TyQM/hYA0BET+atu75fts3/mg4pTE=",
280
+ "MindExecution.Kernel.7zjugdfmfg.dll": "sha256-XWt7j9wlHb+PuYdstPVmPDLv15PcRahv3rNYrGzvI40=",
281
+ "MindExecution.Plugins.Business.rd6flxuebm.dll": "sha256-8XhddfNWrxDyHfFYmcDQutHhXIfGqfRKW3NVPyQ9Dbw=",
282
+ "MindExecution.Plugins.Concept.0qrgx3epss.dll": "sha256-WL1s5FZGLq9dOF3GDGasvY4ZU8559uF2t4a52KorOZw=",
283
+ "MindExecution.Plugins.PlanMaster.cobfta1p3l.dll": "sha256-JCKZ9S1jGO/aZ+Xfit+r+nFxc1JqkBQIxLugL3c0r+Y=",
284
+ "MindExecution.Shared.sevaa4rgkp.dll": "sha256-fLiquQIwsr+IVLW6w9+MdHQTNZzETBx1MJe0e8IbXHs=",
285
+ "MindExecution.Web.coqh2ccnuk.dll": "sha256-TBO6TdRrS5Z/M45nFXsJKGz8Y7oQ0loKUSbFd3JbkJE="
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.qln7lkmsnn.dll": "sha256-PthhAmI45Ysbmebc6FVPKp5YmQeb8ed0Spq5HUcwass=",
289
+ "MindExecution.Plugins.Directory.4prauy9d1z.dll": "sha256-uCBQe2vhbS85Awx84xfEJLmbvETRIv8o8eZsfnahtDg=",
290
+ "MindExecution.Plugins.YouTube.99bahbgkkr.dll": "sha256-g+tRUYc/SojxQ4PfQ2sswlIzY+dZBH0mtgtVSJetdys="
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