@mindexec/cli 0.2.44 → 0.2.46

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 (25) hide show
  1. package/codex-runtime.js +75 -3
  2. package/package.json +1 -1
  3. package/remote-hub.js +119 -12
  4. package/scripts/remote-http-smoke.mjs +54 -0
  5. package/scripts/remote-hub-smoke.mjs +42 -0
  6. package/server.js +115 -23
  7. package/wwwroot/_content/MindExecution.Shared/css/app.css +1 -1
  8. package/wwwroot/_content/MindExecution.Shared/css/mind-map-overrides.css +19 -0
  9. package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-manager.js +249 -22
  10. package/wwwroot/_content/MindExecution.Shared/js/mind-map-nodes.js +2 -0
  11. package/wwwroot/_framework/MindExecution.Core.xg9yy9l5dz.dll +0 -0
  12. package/wwwroot/_framework/{MindExecution.Kernel.z56elxihok.dll → MindExecution.Kernel.erg96341xf.dll} +0 -0
  13. package/wwwroot/_framework/{MindExecution.Plugins.Admin.p5cs4ap87v.dll → MindExecution.Plugins.Admin.11j9vpdm9u.dll} +0 -0
  14. package/wwwroot/_framework/{MindExecution.Plugins.Business.s35og5uz44.dll → MindExecution.Plugins.Business.oyskf08knn.dll} +0 -0
  15. package/wwwroot/_framework/{MindExecution.Plugins.Concept.ueuo23qx6f.dll → MindExecution.Plugins.Concept.keia4ox68c.dll} +0 -0
  16. package/wwwroot/_framework/{MindExecution.Plugins.Directory.y74f55e8x3.dll → MindExecution.Plugins.Directory.7pus9p63ym.dll} +0 -0
  17. package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.lhbyievfnk.dll → MindExecution.Plugins.PlanMaster.wr3pupzfyo.dll} +0 -0
  18. package/wwwroot/_framework/{MindExecution.Plugins.YouTube.y87u77w5nn.dll → MindExecution.Plugins.YouTube.kpfew1eggc.dll} +0 -0
  19. package/wwwroot/_framework/{MindExecution.Shared.3kkptsi9lw.dll → MindExecution.Shared.kzibxbai3y.dll} +0 -0
  20. package/wwwroot/_framework/MindExecution.Web.6fjnkr9ty4.dll +0 -0
  21. package/wwwroot/_framework/blazor.boot.json +21 -21
  22. package/wwwroot/service-worker-assets.js +26 -26
  23. package/wwwroot/service-worker.js +1 -1
  24. package/wwwroot/_framework/MindExecution.Core.6rfnfdndxq.dll +0 -0
  25. package/wwwroot/_framework/MindExecution.Web.4ddj83yo5w.dll +0 -0
@@ -227,6 +227,14 @@ body.is-resizing .css3d-resolution-wrapper {
227
227
  transition: none !important;
228
228
  }
229
229
 
230
+ html.mindcanvas-platform-apple body.is-zooming .css3d-resolution-wrapper.selected,
231
+ html.mindcanvas-platform-apple body.is-panning .css3d-resolution-wrapper.selected,
232
+ html.mindcanvas-platform-apple body.mindcanvas-is-moving .css3d-resolution-wrapper.selected,
233
+ html.mindcanvas-platform-apple body.mindcanvas-is-dense .css3d-resolution-wrapper.selected {
234
+ -webkit-filter: none !important;
235
+ filter: none !important;
236
+ }
237
+
230
238
  body.is-zooming .node-menu-wrapper,
231
239
  body.is-panning .node-menu-wrapper,
232
240
  body.is-zooming .map-node-memo__icon-popover,
@@ -1102,6 +1110,17 @@ body.is-resizing .css3d-resolution-wrapper.node-type-embed.selected {
1102
1110
  filter: saturate(1.08) !important;
1103
1111
  }
1104
1112
 
1113
+ html.mindcanvas-platform-apple .css3d-resolution-wrapper.selected,
1114
+ html.mindcanvas-platform-apple .css3d-resolution-wrapper.selection-style-agent.selected,
1115
+ html.mindcanvas-platform-apple .css3d-resolution-wrapper.node-type-note.selected,
1116
+ html.mindcanvas-platform-apple .css3d-resolution-wrapper.node-type-image.selected,
1117
+ html.mindcanvas-platform-apple .css3d-resolution-wrapper.node-type-video.selected,
1118
+ html.mindcanvas-platform-apple .css3d-resolution-wrapper.node-type-embed.selected,
1119
+ html.mindcanvas-platform-apple .css3d-resolution-wrapper.is-automation-relation-related:not(.selected) {
1120
+ -webkit-filter: none !important;
1121
+ filter: none !important;
1122
+ }
1123
+
1105
1124
  .css3d-resolution-wrapper.node-type-image {
1106
1125
  -webkit-box-shadow:
1107
1126
  0 0 6px rgba(15, 23, 42, 0.25),
@@ -32,6 +32,27 @@
32
32
  const REMOTE_FLEET_DISPLAY_NAME = 'Multi Desktop Monitor';
33
33
  const REMOTE_FLEET_LEGACY_DISPLAY_NAME = 'Remote Fleet Monitor';
34
34
  const _cssVideoProxyStateByVideo = new WeakMap();
35
+
36
+ function syncMindCanvasPlatformRenderClasses() {
37
+ try {
38
+ if (typeof document === 'undefined') return;
39
+ const nav = typeof navigator === 'object' ? navigator : null;
40
+ const uaDataPlatform = String(nav?.userAgentData?.platform || '');
41
+ const platform = String(nav?.platform || '');
42
+ const userAgent = String(nav?.userAgent || '');
43
+ const maxTouchPoints = Number(nav?.maxTouchPoints || 0);
44
+ const platformSignature = `${uaDataPlatform} ${platform} ${userAgent}`;
45
+ const isApplePlatform =
46
+ /\b(Mac|iPhone|iPad|iPod)\b/i.test(platformSignature) ||
47
+ (/Macintosh/i.test(userAgent) && maxTouchPoints > 1);
48
+
49
+ document.documentElement.classList.toggle('mindcanvas-platform-apple', isApplePlatform);
50
+ } catch {
51
+ // Platform hints are only a compositor workaround; ignore detection failures.
52
+ }
53
+ }
54
+
55
+ syncMindCanvasPlatformRenderClasses();
35
56
  // ▲▲▲ [Perf] ▲▲▲
36
57
 
37
58
  // ▼▼▼ [New] 기본 마크다운 스타일 주입 ▼▼▼
@@ -8453,6 +8474,12 @@
8453
8474
  let _businessAutomationPinDelegationBound = false;
8454
8475
  let _businessAutomationConnectionDraft = null;
8455
8476
  let _businessAutomationSelectedEdgeId = '';
8477
+ const BUSINESS_AUTOMATION_RELATION_CLASSES = [
8478
+ 'is-automation-relation-anchor',
8479
+ 'is-automation-relation-related',
8480
+ 'is-automation-relation-upstream',
8481
+ 'is-automation-relation-downstream'
8482
+ ];
8456
8483
 
8457
8484
  function ensureBusinessAutomationPinDelegation() {
8458
8485
  if (_businessAutomationPinDelegationBound || typeof document === 'undefined') {
@@ -8953,6 +8980,181 @@
8953
8980
  return edges;
8954
8981
  }
8955
8982
 
8983
+ function createEmptyBusinessAutomationSelectionContext(anchorNodeId = '') {
8984
+ return {
8985
+ anchorNodeId: String(anchorNodeId || '').trim(),
8986
+ edgeIds: new Set(),
8987
+ relatedNodeIds: new Set(),
8988
+ upstreamNodeIds: new Set(),
8989
+ downstreamNodeIds: new Set(),
8990
+ hasRelation: false,
8991
+ key: ''
8992
+ };
8993
+ }
8994
+
8995
+ function getSingleBusinessAutomationSelectionId(module) {
8996
+ const selectedId = String(module?.selectedNodeIdJs || '').trim();
8997
+ if (!selectedId) {
8998
+ return '';
8999
+ }
9000
+
9001
+ const multiIds = module?.multiSelectedNodeIds instanceof Set
9002
+ ? Array.from(module.multiSelectedNodeIds)
9003
+ .map(id => String(id || '').trim())
9004
+ .filter(Boolean)
9005
+ : [];
9006
+ const uniqueMultiIds = Array.from(new Set(multiIds));
9007
+ if (uniqueMultiIds.length > 1) {
9008
+ return '';
9009
+ }
9010
+
9011
+ if (uniqueMultiIds.length === 1 && uniqueMultiIds[0] !== selectedId) {
9012
+ return '';
9013
+ }
9014
+
9015
+ return selectedId;
9016
+ }
9017
+
9018
+ function isBusinessAutomationRelationHighlightEligible(module, nodeId) {
9019
+ const entry = module?.nodeObjectsById?.get?.(String(nodeId || '').trim()) || null;
9020
+ return isBusinessAutomationNode(entry?.model) || isBusinessAutomationContextSourceNode(entry?.model);
9021
+ }
9022
+
9023
+ function buildBusinessAutomationSelectionContextKey(context) {
9024
+ if (!context?.anchorNodeId || !context.hasRelation) {
9025
+ return '';
9026
+ }
9027
+
9028
+ const edgeIds = Array.from(context.edgeIds || []).sort().join(',');
9029
+ const relatedIds = Array.from(context.relatedNodeIds || []).sort().join(',');
9030
+ const upstreamIds = Array.from(context.upstreamNodeIds || []).sort().join(',');
9031
+ const downstreamIds = Array.from(context.downstreamNodeIds || []).sort().join(',');
9032
+ return [
9033
+ context.anchorNodeId,
9034
+ edgeIds,
9035
+ relatedIds,
9036
+ upstreamIds,
9037
+ downstreamIds
9038
+ ].join('|');
9039
+ }
9040
+
9041
+ function buildBusinessAutomationSelectionContext(module, edges = null) {
9042
+ const selectedId = getSingleBusinessAutomationSelectionId(module);
9043
+ const context = createEmptyBusinessAutomationSelectionContext(selectedId);
9044
+ if (!selectedId || !isBusinessAutomationRelationHighlightEligible(module, selectedId)) {
9045
+ return context;
9046
+ }
9047
+
9048
+ const sourceEdges = Array.isArray(edges) ? edges : collectBusinessAutomationEdges(module);
9049
+ sourceEdges.forEach(edge => {
9050
+ const edgeId = String(edge?.id || '').trim();
9051
+ const sourceNodeId = String(edge?.sourceNodeId || '').trim();
9052
+ const targetNodeId = String(edge?.targetNodeId || '').trim();
9053
+ if (!edgeId || !sourceNodeId || !targetNodeId) {
9054
+ return;
9055
+ }
9056
+
9057
+ if (sourceNodeId === selectedId) {
9058
+ context.edgeIds.add(edgeId);
9059
+ context.relatedNodeIds.add(targetNodeId);
9060
+ context.downstreamNodeIds.add(targetNodeId);
9061
+ return;
9062
+ }
9063
+
9064
+ if (targetNodeId === selectedId) {
9065
+ context.edgeIds.add(edgeId);
9066
+ context.relatedNodeIds.add(sourceNodeId);
9067
+ context.upstreamNodeIds.add(sourceNodeId);
9068
+ }
9069
+ });
9070
+
9071
+ context.hasRelation = context.edgeIds.size > 0 || context.relatedNodeIds.size > 0;
9072
+ context.key = buildBusinessAutomationSelectionContextKey(context);
9073
+ return context;
9074
+ }
9075
+
9076
+ function getBusinessAutomationRelationDomTargets(module, nodeId) {
9077
+ const normalizedId = String(nodeId || '').trim();
9078
+ const targets = [];
9079
+ if (!normalizedId) {
9080
+ return targets;
9081
+ }
9082
+
9083
+ const entry = module?.nodeObjectsById?.get?.(normalizedId) || null;
9084
+ const wrapper = entry?.cssObject?.element || null;
9085
+ if (wrapper?.classList) {
9086
+ targets.push(wrapper);
9087
+ const inner = wrapper.querySelector?.(
9088
+ '.map-node-automation, .map-node-automation-context-source, .map-node, .map-node-memo, .map-node-template-card'
9089
+ ) || null;
9090
+ if (inner?.classList) {
9091
+ targets.push(inner);
9092
+ }
9093
+ }
9094
+
9095
+ return Array.from(new Set(targets));
9096
+ }
9097
+
9098
+ function clearBusinessAutomationRelationClasses(module) {
9099
+ const nodes = module?.nodeObjectsById;
9100
+ if (nodes?.forEach) {
9101
+ nodes.forEach((entry, nodeId) => {
9102
+ getBusinessAutomationRelationDomTargets(module, nodeId)
9103
+ .forEach(element => element.classList.remove(...BUSINESS_AUTOMATION_RELATION_CLASSES));
9104
+ });
9105
+ return;
9106
+ }
9107
+
9108
+ module?.container?.querySelectorAll?.(
9109
+ BUSINESS_AUTOMATION_RELATION_CLASSES.map(className => `.${className}`).join(',')
9110
+ )?.forEach(element => element.classList.remove(...BUSINESS_AUTOMATION_RELATION_CLASSES));
9111
+ }
9112
+
9113
+ function applyBusinessAutomationRelationClasses(module, context) {
9114
+ clearBusinessAutomationRelationClasses(module);
9115
+ if (!context?.anchorNodeId || !context.hasRelation) {
9116
+ return;
9117
+ }
9118
+
9119
+ getBusinessAutomationRelationDomTargets(module, context.anchorNodeId)
9120
+ .forEach(element => element.classList.add('is-automation-relation-anchor'));
9121
+
9122
+ context.relatedNodeIds.forEach(nodeId => {
9123
+ getBusinessAutomationRelationDomTargets(module, nodeId)
9124
+ .forEach(element => element.classList.add('is-automation-relation-related'));
9125
+ });
9126
+
9127
+ context.upstreamNodeIds.forEach(nodeId => {
9128
+ getBusinessAutomationRelationDomTargets(module, nodeId)
9129
+ .forEach(element => element.classList.add('is-automation-relation-upstream'));
9130
+ });
9131
+
9132
+ context.downstreamNodeIds.forEach(nodeId => {
9133
+ getBusinessAutomationRelationDomTargets(module, nodeId)
9134
+ .forEach(element => element.classList.add('is-automation-relation-downstream'));
9135
+ });
9136
+ }
9137
+
9138
+ function syncBusinessAutomationSelectionContext(module = _module, options = {}) {
9139
+ if (!module) {
9140
+ return createEmptyBusinessAutomationSelectionContext();
9141
+ }
9142
+
9143
+ const context = buildBusinessAutomationSelectionContext(module, options.edges || null);
9144
+ const previousKey = String(module._businessAutomationSelectionContextKey || '');
9145
+ module._businessAutomationSelectionContext = context;
9146
+ if (options.force === true || previousKey !== context.key) {
9147
+ applyBusinessAutomationRelationClasses(module, context);
9148
+ module._businessAutomationSelectionContextKey = context.key;
9149
+ }
9150
+
9151
+ if (options.scheduleRender !== false) {
9152
+ scheduleBusinessAutomationEdgeRender(module);
9153
+ }
9154
+
9155
+ return context;
9156
+ }
9157
+
8956
9158
  function isBusinessAutomationContextEdge(edge) {
8957
9159
  const targetPinId = String(edge?.targetPinId || edge?.TargetPinId || '').trim().toLowerCase();
8958
9160
  const contract = String(edge?.contract || edge?.Contract || '').trim();
@@ -9634,6 +9836,10 @@
9634
9836
  }
9635
9837
 
9636
9838
  const edges = collectBusinessAutomationEdges(module);
9839
+ const relationContext = syncBusinessAutomationSelectionContext(module, {
9840
+ edges,
9841
+ scheduleRender: false
9842
+ });
9637
9843
  if (_businessAutomationSelectedEdgeId
9638
9844
  && !edges.some(edge => String(edge?.id || '') === _businessAutomationSelectedEdgeId)) {
9639
9845
  _businessAutomationSelectedEdgeId = '';
@@ -9711,6 +9917,7 @@
9711
9917
  : getAutomationPinTheme(sourceType);
9712
9918
  const pathData = buildBusinessAutomationEdgePathData(source, target);
9713
9919
  const isSelected = String(edge.id || '') === _businessAutomationSelectedEdgeId;
9920
+ const isRelationHighlighted = relationContext?.edgeIds?.has?.(String(edge.id || '').trim()) === true;
9714
9921
  const hitPointerEvents = _businessAutomationConnectionDraft ? 'none' : 'stroke';
9715
9922
  const hitPath = createBusinessAutomationSvgElement('path', {
9716
9923
  d: pathData,
@@ -9730,12 +9937,14 @@
9730
9937
 
9731
9938
  const path = createBusinessAutomationSvgElement('path', {
9732
9939
  d: pathData,
9733
- class: `mind-map-business-automation-edge-path${isSelected ? ' is-selected' : ''}`,
9940
+ class: `mind-map-business-automation-edge-path${isSelected ? ' is-selected' : ''}${isRelationHighlighted ? ' is-relation-highlight' : ''}`,
9734
9941
  stroke: theme.edge,
9735
- 'stroke-width': isSelected ? '3.6' : (isContextEdge ? '2.1' : '2.4'),
9736
- opacity: isSelected ? '0.96' : (isContextEdge ? '0.68' : '0.82'),
9942
+ 'stroke-width': isSelected ? '3.6' : (isRelationHighlighted ? (isContextEdge ? '2.8' : '3') : (isContextEdge ? '2.1' : '2.4')),
9943
+ opacity: isSelected ? '0.96' : (isRelationHighlighted ? '0.94' : (isContextEdge ? '0.68' : '0.82')),
9737
9944
  'stroke-dasharray': isContextEdge ? '7 7' : '',
9738
- filter: isSelected ? `drop-shadow(0 0 7px ${theme.edge})` : ''
9945
+ filter: isSelected
9946
+ ? `drop-shadow(0 0 7px ${theme.edge})`
9947
+ : (isRelationHighlighted ? `drop-shadow(0 0 5px ${theme.edge})` : '')
9739
9948
  });
9740
9949
  path.style.pointerEvents = 'none';
9741
9950
  path.dataset.edgeId = edge.id;
@@ -9744,21 +9953,21 @@
9744
9953
  const sourceDot = createBusinessAutomationSvgElement('circle', {
9745
9954
  cx: source.x.toFixed(1),
9746
9955
  cy: source.y.toFixed(1),
9747
- r: isSelected ? '4.2' : '3.2',
9956
+ r: (isSelected || isRelationHighlighted) ? '4.2' : '3.2',
9748
9957
  fill: '#ffffff',
9749
9958
  stroke: theme.edge,
9750
9959
  'stroke-width': '1.8',
9751
- opacity: isContextEdge ? '0.82' : '0.96'
9960
+ opacity: isRelationHighlighted ? '0.96' : (isContextEdge ? '0.82' : '0.96')
9752
9961
  });
9753
9962
  sourceDot.style.pointerEvents = 'none';
9754
9963
  const targetDot = createBusinessAutomationSvgElement('circle', {
9755
9964
  cx: target.x.toFixed(1),
9756
9965
  cy: target.y.toFixed(1),
9757
- r: isSelected ? '4.2' : '3.2',
9966
+ r: (isSelected || isRelationHighlighted) ? '4.2' : '3.2',
9758
9967
  fill: theme.edge,
9759
9968
  stroke: '#ffffff',
9760
9969
  'stroke-width': '1.4',
9761
- opacity: isContextEdge ? '0.82' : '0.96'
9970
+ opacity: isRelationHighlighted ? '0.96' : (isContextEdge ? '0.82' : '0.96')
9762
9971
  });
9763
9972
  targetDot.style.pointerEvents = 'none';
9764
9973
 
@@ -12748,13 +12957,30 @@
12748
12957
  }
12749
12958
 
12750
12959
  function hasRemoteFleetThumbnail(device) {
12751
- const dataUrl = String(getRemoteFleetDeviceField(device, 'thumbnailDataUrl', 'ThumbnailDataUrl', ''));
12752
- return /^data:image\/(png|jpe?g|webp|svg\+xml);base64,/i.test(dataUrl);
12960
+ return isRemoteFleetFrameSource(getRemoteFleetFrameSource(device, 'thumbnail'));
12753
12961
  }
12754
12962
 
12755
12963
  function hasRemoteFleetLiveFrame(device) {
12756
- const dataUrl = String(getRemoteFleetDeviceField(device, 'liveFrameDataUrl', 'LiveFrameDataUrl', ''));
12757
- return /^data:image\/(png|jpe?g|webp|svg\+xml);base64,/i.test(dataUrl);
12964
+ return isRemoteFleetFrameSource(getRemoteFleetFrameSource(device, 'live'));
12965
+ }
12966
+
12967
+ function isRemoteFleetFrameSource(value) {
12968
+ const source = String(value || '').trim();
12969
+ return /^data:image\/(png|jpe?g|webp|svg\+xml);base64,/i.test(source)
12970
+ || /^https?:\/\/(?:127(?:\.\d{1,3}){3}|localhost|\[::1\])(?::\d+)?\/api\/remote\//i.test(source)
12971
+ || /^\/api\/remote\//i.test(source);
12972
+ }
12973
+
12974
+ function getRemoteFleetFrameSource(device, frameKind) {
12975
+ if (frameKind === 'live') {
12976
+ return String(
12977
+ getRemoteFleetDeviceField(device, 'liveFrameUrl', 'LiveFrameUrl', '')
12978
+ || getRemoteFleetDeviceField(device, 'liveFrameDataUrl', 'LiveFrameDataUrl', ''));
12979
+ }
12980
+
12981
+ return String(
12982
+ getRemoteFleetDeviceField(device, 'thumbnailFrameUrl', 'ThumbnailFrameUrl', '')
12983
+ || getRemoteFleetDeviceField(device, 'thumbnailDataUrl', 'ThumbnailDataUrl', ''));
12758
12984
  }
12759
12985
 
12760
12986
  function isRemoteFleetLiveActive(device) {
@@ -13036,9 +13262,9 @@
13036
13262
  const liveStreamId = String(getRemoteFleetDeviceField(device, 'liveStreamId', 'LiveStreamId', ''));
13037
13263
  const hasLiveFrame = hasRemoteFleetLiveFrame(device);
13038
13264
  const hasThumbnail = hasRemoteFleetThumbnail(device);
13039
- const previewDataUrl = hasLiveFrame
13040
- ? String(getRemoteFleetDeviceField(device, 'liveFrameDataUrl', 'LiveFrameDataUrl', ''))
13041
- : String(getRemoteFleetDeviceField(device, 'thumbnailDataUrl', 'ThumbnailDataUrl', ''));
13265
+ const previewSource = hasLiveFrame
13266
+ ? getRemoteFleetFrameSource(device, 'live')
13267
+ : getRemoteFleetFrameSource(device, 'thumbnail');
13042
13268
  const previewAt = hasLiveFrame
13043
13269
  ? String(getRemoteFleetDeviceField(device, 'liveFrameReceivedAt', 'LiveFrameReceivedAt', ''))
13044
13270
  : String(getRemoteFleetDeviceField(device, 'thumbnailReceivedAt', 'ThumbnailReceivedAt',
@@ -13100,7 +13326,7 @@
13100
13326
  `;
13101
13327
  if (hasLiveFrame || hasThumbnail) {
13102
13328
  const image = document.createElement('img');
13103
- image.src = previewDataUrl;
13329
+ image.src = previewSource;
13104
13330
  image.alt = `${name} screen`;
13105
13331
  image.loading = 'lazy';
13106
13332
  image.decoding = 'async';
@@ -13895,7 +14121,7 @@
13895
14121
  const focusedId = getRemoteFleetDeviceId(focusedDevice);
13896
14122
  const focusedName = getRemoteFleetDeviceName(focusedDevice);
13897
14123
  const liveActive = isRemoteFleetLiveActive(focusedDevice);
13898
- const liveFrameDataUrl = String(getRemoteFleetDeviceField(focusedDevice, 'liveFrameDataUrl', 'LiveFrameDataUrl', ''));
14124
+ const liveFrameSource = getRemoteFleetFrameSource(focusedDevice, 'live');
13899
14125
  const liveFrameAt = String(getRemoteFleetDeviceField(focusedDevice, 'liveFrameReceivedAt', 'LiveFrameReceivedAt', ''));
13900
14126
  const liveStreamId = String(getRemoteFleetDeviceField(focusedDevice, 'liveStreamId', 'LiveStreamId', ''));
13901
14127
  const hasLiveFrame = hasRemoteFleetLiveFrame(focusedDevice);
@@ -13926,7 +14152,7 @@
13926
14152
  `;
13927
14153
  if (hasLiveFrame) {
13928
14154
  const image = document.createElement('img');
13929
- image.src = liveFrameDataUrl;
14155
+ image.src = liveFrameSource;
13930
14156
  image.alt = `${focusedName} live screen`;
13931
14157
  image.decoding = 'async';
13932
14158
  image.style.cssText = `
@@ -14029,13 +14255,13 @@
14029
14255
  const createDevicePreview = (device, mode = 'tile') => {
14030
14256
  const name = getRemoteFleetDeviceName(device);
14031
14257
  const connectedDevice = isRemoteFleetDeviceConnected(device);
14032
- const thumbnailDataUrl = String(device?.thumbnailDataUrl || device?.ThumbnailDataUrl || '');
14033
14258
  const thumbnailCapturedAt = String(device?.thumbnailCapturedAt || device?.ThumbnailCapturedAt || '');
14034
- const liveFrameDataUrl = String(device?.liveFrameDataUrl || device?.LiveFrameDataUrl || '');
14035
14259
  const liveFrameReceivedAt = String(device?.liveFrameReceivedAt || device?.LiveFrameReceivedAt || '');
14036
14260
  const hasThumbnail = hasRemoteFleetThumbnail(device);
14037
14261
  const hasLiveFrame = hasRemoteFleetLiveFrame(device);
14038
- const previewDataUrl = hasLiveFrame ? liveFrameDataUrl : thumbnailDataUrl;
14262
+ const previewSource = hasLiveFrame
14263
+ ? getRemoteFleetFrameSource(device, 'live')
14264
+ : getRemoteFleetFrameSource(device, 'thumbnail');
14039
14265
  const previewAt = hasLiveFrame ? liveFrameReceivedAt : thumbnailCapturedAt;
14040
14266
  const isDetail = mode === 'detail';
14041
14267
 
@@ -14053,7 +14279,7 @@
14053
14279
 
14054
14280
  if (hasLiveFrame || hasThumbnail) {
14055
14281
  const image = document.createElement('img');
14056
- image.src = previewDataUrl;
14282
+ image.src = previewSource;
14057
14283
  image.alt = hasLiveFrame ? `${name} live frame` : `${name} thumbnail`;
14058
14284
  image.loading = 'lazy';
14059
14285
  image.decoding = 'async';
@@ -19043,6 +19269,7 @@
19043
19269
  renderRemoteFleetDeviceForTest: renderRemoteFleetDevice,
19044
19270
  renderBusinessAutomationEdges: renderBusinessAutomationEdges,
19045
19271
  scheduleBusinessAutomationEdgeRender: scheduleBusinessAutomationEdgeRender,
19272
+ syncBusinessAutomationSelectionContext: syncBusinessAutomationSelectionContext,
19046
19273
  hideBusinessAutomationFloatingTooltipForNode: hideBusinessAutomationFloatingTooltipForNode,
19047
19274
  update: update // Export
19048
19275
  };
@@ -3822,6 +3822,7 @@
3822
3822
  });
3823
3823
  module._lastLodSelectionIds = currentIds;
3824
3824
  }
3825
+ window.MindMapCss3DManager?.syncBusinessAutomationSelectionContext?.(module);
3825
3826
  return;
3826
3827
  }
3827
3828
 
@@ -3863,6 +3864,7 @@
3863
3864
  } else {
3864
3865
  lodRenderer._lastAppliedLodSelectionKey = `${primarySelectionId}|${Array.from(multiSelectedIds).sort().join(',')}`;
3865
3866
  }
3867
+ window.MindMapCss3DManager?.syncBusinessAutomationSelectionContext?.(module);
3866
3868
  module._forceUpdateFrames = Math.max(module._forceUpdateFrames || 0, 1);
3867
3869
  }
3868
3870
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "mainAssemblyName": "MindExecution.Web",
3
3
  "resources": {
4
- "hash": "sha256-jXfPV9AYZMlykPHUo794QDvPpBGhbtqzZGV9iYG1x2I=",
4
+ "hash": "sha256-85uTc0gcvy3kY8SBQJxkQmIrLfblhTpX8tZWjJP3QnE=",
5
5
  "fingerprinting": {
6
6
  "Google.Protobuf.9h59ukbel7.dll": "Google.Protobuf.dll",
7
7
  "Markdig.d1j7v41cl1.dll": "Markdig.dll",
@@ -123,16 +123,16 @@
123
123
  "System.brmz7yk5qh.dll": "System.dll",
124
124
  "netstandard.yvr3prsx0x.dll": "netstandard.dll",
125
125
  "System.Private.CoreLib.ns29bor93l.dll": "System.Private.CoreLib.dll",
126
- "MindExecution.Core.6rfnfdndxq.dll": "MindExecution.Core.dll",
127
- "MindExecution.Kernel.z56elxihok.dll": "MindExecution.Kernel.dll",
128
- "MindExecution.Plugins.Admin.p5cs4ap87v.dll": "MindExecution.Plugins.Admin.dll",
129
- "MindExecution.Plugins.Business.s35og5uz44.dll": "MindExecution.Plugins.Business.dll",
130
- "MindExecution.Plugins.Concept.ueuo23qx6f.dll": "MindExecution.Plugins.Concept.dll",
131
- "MindExecution.Plugins.Directory.y74f55e8x3.dll": "MindExecution.Plugins.Directory.dll",
132
- "MindExecution.Plugins.PlanMaster.lhbyievfnk.dll": "MindExecution.Plugins.PlanMaster.dll",
133
- "MindExecution.Plugins.YouTube.y87u77w5nn.dll": "MindExecution.Plugins.YouTube.dll",
134
- "MindExecution.Shared.3kkptsi9lw.dll": "MindExecution.Shared.dll",
135
- "MindExecution.Web.4ddj83yo5w.dll": "MindExecution.Web.dll",
126
+ "MindExecution.Core.xg9yy9l5dz.dll": "MindExecution.Core.dll",
127
+ "MindExecution.Kernel.erg96341xf.dll": "MindExecution.Kernel.dll",
128
+ "MindExecution.Plugins.Admin.11j9vpdm9u.dll": "MindExecution.Plugins.Admin.dll",
129
+ "MindExecution.Plugins.Business.oyskf08knn.dll": "MindExecution.Plugins.Business.dll",
130
+ "MindExecution.Plugins.Concept.keia4ox68c.dll": "MindExecution.Plugins.Concept.dll",
131
+ "MindExecution.Plugins.Directory.7pus9p63ym.dll": "MindExecution.Plugins.Directory.dll",
132
+ "MindExecution.Plugins.PlanMaster.wr3pupzfyo.dll": "MindExecution.Plugins.PlanMaster.dll",
133
+ "MindExecution.Plugins.YouTube.kpfew1eggc.dll": "MindExecution.Plugins.YouTube.dll",
134
+ "MindExecution.Shared.kzibxbai3y.dll": "MindExecution.Shared.dll",
135
+ "MindExecution.Web.6fjnkr9ty4.dll": "MindExecution.Web.dll",
136
136
  "dotnet.js": "dotnet.js",
137
137
  "dotnet.native.qc8g39g30v.js": "dotnet.native.js",
138
138
  "dotnet.native.boem75ye5i.wasm": "dotnet.native.wasm",
@@ -278,18 +278,18 @@
278
278
  "System.Xml.XDocument.sn51jas17n.dll": "sha256-GNI2kFgFmPTwzuzwUn8gxK+AzGLUWRJFdg9JzIbrybQ=",
279
279
  "System.brmz7yk5qh.dll": "sha256-CfM2miyj1KHApFmqMdLYWio3S/jrdON2pW9Xr2nTwlo=",
280
280
  "netstandard.yvr3prsx0x.dll": "sha256-EksNn8Luo4bOWqJ6X7dIe9qG9oOqwOVzjH2xYyMNi+E=",
281
- "MindExecution.Core.6rfnfdndxq.dll": "sha256-giL4rreoKsQoQ5gkLusNx7oL3w1l2UH52TYY1KBoIfQ=",
282
- "MindExecution.Kernel.z56elxihok.dll": "sha256-STATJelRGcW9SDGgsw6YmQi6tkQje52dy4lyT3QU4qs=",
283
- "MindExecution.Plugins.Concept.ueuo23qx6f.dll": "sha256-9r1Eze1dN+plEEgAtS0IVai8KSWXGIGQ26QFwZORIoo=",
284
- "MindExecution.Plugins.PlanMaster.lhbyievfnk.dll": "sha256-qWha6wYFxlBwSmW+vJEKbN7ejyJNfQ1vrwrRWYZPwwA=",
285
- "MindExecution.Shared.3kkptsi9lw.dll": "sha256-U8F3nPAtdikrJoBmdM1sOTEXB7J96tdm8GAQkfv+/IE=",
286
- "MindExecution.Web.4ddj83yo5w.dll": "sha256-aN41fuZMAQNHAMTr0xw7CCl0gpG5X+E6i3x7m465+tE="
281
+ "MindExecution.Core.xg9yy9l5dz.dll": "sha256-cRrcPtFn2SUkdgWA68l7+CQbGso1QWczG5az1KYpLUU=",
282
+ "MindExecution.Kernel.erg96341xf.dll": "sha256-5hDopeSFSFHb5tDeLFj0jrSt6XRq4SYxB8nyFJ6H9RQ=",
283
+ "MindExecution.Plugins.Concept.keia4ox68c.dll": "sha256-rO8bWy0n6NZKqMzFpcIjy/p1kG8mPSuTUZ+UMTWugf8=",
284
+ "MindExecution.Plugins.PlanMaster.wr3pupzfyo.dll": "sha256-pE7MM4cMUkHzg5wTQtq8Vgk+RSjlQtO44T9AwQsYDqw=",
285
+ "MindExecution.Shared.kzibxbai3y.dll": "sha256-4CE9pNlfu9pIL+wwsbaU4ARQLcYelkl2sqkwAJD9sD4=",
286
+ "MindExecution.Web.6fjnkr9ty4.dll": "sha256-7o2Y3AvthOWiFF9+lHnqahGmcN/0tDuBtJhxGdcMN44="
287
287
  },
288
288
  "lazyAssembly": {
289
- "MindExecution.Plugins.Admin.p5cs4ap87v.dll": "sha256-jahiJxaiE8hwMyRcg6rZGo4WBhBGFyAHYhOqlKjawWg=",
290
- "MindExecution.Plugins.Business.s35og5uz44.dll": "sha256-KOyk9eC6E/Gyfz2uWucHQmAayMQbShhLTqEymZFleh4=",
291
- "MindExecution.Plugins.Directory.y74f55e8x3.dll": "sha256-4gMuhIPLiX31U+jwhDT83rSPqZINONadmW+cvujfq1g=",
292
- "MindExecution.Plugins.YouTube.y87u77w5nn.dll": "sha256-MqPf5zOQVvBAhjkz6H0ZLJzBqgsyedruWWKyYwjvi3Y="
289
+ "MindExecution.Plugins.Admin.11j9vpdm9u.dll": "sha256-lZvp68Zm2iFwt93gRGlHDKVnywJT2hHxA3JHu4Z3PfA=",
290
+ "MindExecution.Plugins.Business.oyskf08knn.dll": "sha256-oL53lWZ8Lp8lZuqc3UP+qIGSEVKJvVvfov+2xyQ3INg=",
291
+ "MindExecution.Plugins.Directory.7pus9p63ym.dll": "sha256-a1eUvklwiLwuCPBk05omRoirn1tRqVgjogVW8/UAAuc=",
292
+ "MindExecution.Plugins.YouTube.kpfew1eggc.dll": "sha256-COvvpOYO8nsEePBr3CCF4Wv0CWfvvOAoXn54tmikwwc="
293
293
  }
294
294
  },
295
295
  "cacheBootResources": true,
@@ -1,5 +1,5 @@
1
1
  self.assetsManifest = {
2
- "version": "g30EAOUn",
2
+ "version": "nO5c8M3Z",
3
3
  "assets": [
4
4
  {
5
5
  "hash": "sha256-+CSYMcqLNTsq3VnH11jgYyOCCdxvHzL74CBmo4sCmMU=",
@@ -38,11 +38,11 @@
38
38
  "url": "_content/MindExecution.Shared/css/admin-dashboard.css"
39
39
  },
40
40
  {
41
- "hash": "sha256-dzjc3j3RtOqc6FJikAZowcpishOgwCLWoLJNNDyPUEA=",
41
+ "hash": "sha256-nHPgHOJ41KrOimOUx38PS5DOTCfNmV/nMcE3kxw34CQ=",
42
42
  "url": "_content/MindExecution.Shared/css/app.css"
43
43
  },
44
44
  {
45
- "hash": "sha256-BQdCDRJQX7PiT/7AaeT11SXri099O+sl5lQoyjpQ+Q0=",
45
+ "hash": "sha256-bM3TPSd4WDlrAJjzMh91OLXSpkFX5/3qUs84piTAEKA=",
46
46
  "url": "_content/MindExecution.Shared/css/mind-map-overrides.css"
47
47
  },
48
48
  {
@@ -86,7 +86,7 @@
86
86
  "url": "_content/MindExecution.Shared/js/mind-map-core.js.backup"
87
87
  },
88
88
  {
89
- "hash": "sha256-ND0uIe74ihHrov6X2hCc7vJxwdSCqNNbheseulkitXA=",
89
+ "hash": "sha256-2LFL3oGey+usyB7lpywzpKYMhBmlMhrXi9IZdtdUJZU=",
90
90
  "url": "_content/MindExecution.Shared/js/mind-map-css3d-manager.js"
91
91
  },
92
92
  {
@@ -134,7 +134,7 @@
134
134
  "url": "_content/MindExecution.Shared/js/mind-map-node-search-worker.js"
135
135
  },
136
136
  {
137
- "hash": "sha256-tcCpe0R8MVaT0B7nTN9owN5u6Nv547c0UTMGKnfiXpo=",
137
+ "hash": "sha256-E2IUENogOw5hzGtSFknt06j0env1GvNAc3XcEaTvGdE=",
138
138
  "url": "_content/MindExecution.Shared/js/mind-map-nodes.js"
139
139
  },
140
140
  {
@@ -410,44 +410,44 @@
410
410
  "url": "_framework/MimeMapping.og9ys58ylm.dll"
411
411
  },
412
412
  {
413
- "hash": "sha256-giL4rreoKsQoQ5gkLusNx7oL3w1l2UH52TYY1KBoIfQ=",
414
- "url": "_framework/MindExecution.Core.6rfnfdndxq.dll"
413
+ "hash": "sha256-cRrcPtFn2SUkdgWA68l7+CQbGso1QWczG5az1KYpLUU=",
414
+ "url": "_framework/MindExecution.Core.xg9yy9l5dz.dll"
415
415
  },
416
416
  {
417
- "hash": "sha256-STATJelRGcW9SDGgsw6YmQi6tkQje52dy4lyT3QU4qs=",
418
- "url": "_framework/MindExecution.Kernel.z56elxihok.dll"
417
+ "hash": "sha256-5hDopeSFSFHb5tDeLFj0jrSt6XRq4SYxB8nyFJ6H9RQ=",
418
+ "url": "_framework/MindExecution.Kernel.erg96341xf.dll"
419
419
  },
420
420
  {
421
- "hash": "sha256-jahiJxaiE8hwMyRcg6rZGo4WBhBGFyAHYhOqlKjawWg=",
422
- "url": "_framework/MindExecution.Plugins.Admin.p5cs4ap87v.dll"
421
+ "hash": "sha256-lZvp68Zm2iFwt93gRGlHDKVnywJT2hHxA3JHu4Z3PfA=",
422
+ "url": "_framework/MindExecution.Plugins.Admin.11j9vpdm9u.dll"
423
423
  },
424
424
  {
425
- "hash": "sha256-KOyk9eC6E/Gyfz2uWucHQmAayMQbShhLTqEymZFleh4=",
426
- "url": "_framework/MindExecution.Plugins.Business.s35og5uz44.dll"
425
+ "hash": "sha256-oL53lWZ8Lp8lZuqc3UP+qIGSEVKJvVvfov+2xyQ3INg=",
426
+ "url": "_framework/MindExecution.Plugins.Business.oyskf08knn.dll"
427
427
  },
428
428
  {
429
- "hash": "sha256-9r1Eze1dN+plEEgAtS0IVai8KSWXGIGQ26QFwZORIoo=",
430
- "url": "_framework/MindExecution.Plugins.Concept.ueuo23qx6f.dll"
429
+ "hash": "sha256-rO8bWy0n6NZKqMzFpcIjy/p1kG8mPSuTUZ+UMTWugf8=",
430
+ "url": "_framework/MindExecution.Plugins.Concept.keia4ox68c.dll"
431
431
  },
432
432
  {
433
- "hash": "sha256-4gMuhIPLiX31U+jwhDT83rSPqZINONadmW+cvujfq1g=",
434
- "url": "_framework/MindExecution.Plugins.Directory.y74f55e8x3.dll"
433
+ "hash": "sha256-a1eUvklwiLwuCPBk05omRoirn1tRqVgjogVW8/UAAuc=",
434
+ "url": "_framework/MindExecution.Plugins.Directory.7pus9p63ym.dll"
435
435
  },
436
436
  {
437
- "hash": "sha256-qWha6wYFxlBwSmW+vJEKbN7ejyJNfQ1vrwrRWYZPwwA=",
438
- "url": "_framework/MindExecution.Plugins.PlanMaster.lhbyievfnk.dll"
437
+ "hash": "sha256-pE7MM4cMUkHzg5wTQtq8Vgk+RSjlQtO44T9AwQsYDqw=",
438
+ "url": "_framework/MindExecution.Plugins.PlanMaster.wr3pupzfyo.dll"
439
439
  },
440
440
  {
441
- "hash": "sha256-MqPf5zOQVvBAhjkz6H0ZLJzBqgsyedruWWKyYwjvi3Y=",
442
- "url": "_framework/MindExecution.Plugins.YouTube.y87u77w5nn.dll"
441
+ "hash": "sha256-COvvpOYO8nsEePBr3CCF4Wv0CWfvvOAoXn54tmikwwc=",
442
+ "url": "_framework/MindExecution.Plugins.YouTube.kpfew1eggc.dll"
443
443
  },
444
444
  {
445
- "hash": "sha256-U8F3nPAtdikrJoBmdM1sOTEXB7J96tdm8GAQkfv+/IE=",
446
- "url": "_framework/MindExecution.Shared.3kkptsi9lw.dll"
445
+ "hash": "sha256-4CE9pNlfu9pIL+wwsbaU4ARQLcYelkl2sqkwAJD9sD4=",
446
+ "url": "_framework/MindExecution.Shared.kzibxbai3y.dll"
447
447
  },
448
448
  {
449
- "hash": "sha256-aN41fuZMAQNHAMTr0xw7CCl0gpG5X+E6i3x7m465+tE=",
450
- "url": "_framework/MindExecution.Web.4ddj83yo5w.dll"
449
+ "hash": "sha256-7o2Y3AvthOWiFF9+lHnqahGmcN/0tDuBtJhxGdcMN44=",
450
+ "url": "_framework/MindExecution.Web.6fjnkr9ty4.dll"
451
451
  },
452
452
  {
453
453
  "hash": "sha256-IsZJ91/OW+fHzNqIgEc7Y072ns8z9dGritiSyvR9Wgc=",
@@ -770,7 +770,7 @@
770
770
  "url": "_framework/Websocket.Client.vapounvmnl.dll"
771
771
  },
772
772
  {
773
- "hash": "sha256-NExJUL4soeLY8eXpSu4TdIix/a0K3jcKlVgy+sbEYls=",
773
+ "hash": "sha256-ZSebVg6+73YAEhmuXnGeKZGeTBILK2WJbFuyP6Ydv2Q=",
774
774
  "url": "_framework/blazor.boot.json"
775
775
  },
776
776
  {