@mindexec/cli 0.2.500 → 0.2.501

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindexec/cli",
3
- "version": "0.2.500",
3
+ "version": "0.2.501",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
@@ -529,19 +529,15 @@ async function main() {
529
529
  assert.equal(quietRenewSetHost.payload?.ok, true, JSON.stringify(quietRenewSetHost.payload));
530
530
  assert.equal(quietRenewSetHost.payload?.active, true, JSON.stringify(quietRenewSetHost.payload));
531
531
  assert.equal(quietRenewSetHost.payload?.hostTargetTakeover, false, JSON.stringify(quietRenewSetHost.payload));
532
- const quietRenewPublish = fakeSupabase.requests
532
+ const quietRenewPublish = await waitFor(() => fakeSupabase.requests
533
533
  .filter(request =>
534
534
  request.method === 'POST'
535
535
  && request.pathname === '/rest/v1/rpc/set_remote_host_target')
536
536
  .slice(beforeQuietRenewPublishCount)
537
- .find(request => request.body?.p_node_id === 'remote-registry-renew-node');
537
+ .find(request => request.body?.p_node_id === 'remote-registry-renew-node') || null,
538
+ 8000,
539
+ `quiet host-target renew publish\n${renewHost.details()}`);
538
540
  assert.equal(quietRenewPublish?.body?.p_takeover, false, JSON.stringify(quietRenewPublish?.body));
539
- await waitFor(() => {
540
- const publishCount = fakeSupabase.requests.filter(request =>
541
- request.method === 'POST'
542
- && request.pathname === '/rest/v1/rpc/set_remote_host_target').length;
543
- return publishCount >= 2 ? publishCount : null;
544
- }, 8000, `host-target auto renew publish\n${renewHost.details()}`);
545
541
  const beforeResumePublishCount = fakeSupabase.requests.filter(request =>
546
542
  request.method === 'POST'
547
543
  && request.pathname === '/rest/v1/rpc/set_remote_host_target').length;
@@ -8,22 +8,22 @@
8
8
  */
9
9
 
10
10
  html[data-mindexec-native-desktop-stage="hybrid-compare"] {
11
- --mindexec-native-web-geometry-opacity: 1;
11
+ --mindexec-native-web-transferred-edge-opacity: 1;
12
12
  --mindexec-native-web-node-opacity: 1;
13
13
  }
14
14
 
15
15
  html[data-mindexec-native-desktop-stage="hybrid-compare"][data-mindexec-native-compare-layer="web"] {
16
- --mindexec-native-web-geometry-opacity: 1;
16
+ --mindexec-native-web-transferred-edge-opacity: 1;
17
17
  --mindexec-native-web-node-opacity: 1;
18
18
  }
19
19
 
20
20
  html[data-mindexec-native-desktop-stage="hybrid-compare"][data-mindexec-native-compare-layer="overlay"] {
21
- --mindexec-native-web-geometry-opacity: 0.34;
21
+ --mindexec-native-web-transferred-edge-opacity: 0.34;
22
22
  --mindexec-native-web-node-opacity: 0.78;
23
23
  }
24
24
 
25
25
  html[data-mindexec-native-desktop-stage="hybrid-compare"][data-mindexec-native-compare-layer="native"] {
26
- --mindexec-native-web-geometry-opacity: 0;
26
+ --mindexec-native-web-transferred-edge-opacity: 0;
27
27
  --mindexec-native-web-node-opacity: 1;
28
28
  }
29
29
 
@@ -34,7 +34,9 @@ html[data-mindexec-native-desktop-stage="hybrid-compare"][data-mindexec-native-c
34
34
  html[data-mindexec-native-desktop-stage="hybrid-compare"][data-mindexec-native-compare-layer="overlay"] #app-container,
35
35
  html[data-mindexec-native-desktop-stage="hybrid-compare"][data-mindexec-native-compare-layer="native"] #app-container,
36
36
  html[data-mindexec-native-desktop-stage="hybrid-compare"][data-mindexec-native-compare-layer="overlay"] #app,
37
- html[data-mindexec-native-desktop-stage="hybrid-compare"][data-mindexec-native-compare-layer="native"] #app {
37
+ html[data-mindexec-native-desktop-stage="hybrid-compare"][data-mindexec-native-compare-layer="native"] #app,
38
+ html[data-mindexec-native-desktop-stage="hybrid-compare"][data-mindexec-native-compare-layer="overlay"] #app > main.pointer-events-none,
39
+ html[data-mindexec-native-desktop-stage="hybrid-compare"][data-mindexec-native-compare-layer="native"] #app > main.pointer-events-none {
38
40
  background: transparent !important;
39
41
  background-color: transparent !important;
40
42
  }
@@ -46,10 +48,16 @@ html[data-mindexec-native-desktop-stage="hybrid-compare"][data-mindexec-native-c
46
48
  background-image: none !important;
47
49
  }
48
50
 
49
- html[data-mindexec-native-desktop-stage="hybrid-compare"] #mind-map-viewport > canvas,
50
- html[data-mindexec-native-desktop-stage="hybrid-compare"] #mind-map-viewport > svg,
51
- html[data-mindexec-native-desktop-stage="hybrid-compare"] #mind-map-viewport .mind-map-business-automation-edge-layer {
52
- opacity: var(--mindexec-native-web-geometry-opacity) !important;
51
+ /*
52
+ * MNR1 endpoint-v1 transfers the business-automation edge paint, but it does
53
+ * not transfer the complete WebGL scene. In particular, the single WebGL
54
+ * canvas also owns MID/FAR resident silhouettes, image-atlas proxies, ordinary
55
+ * connectors, grid hints, and selection visuals. Keep that canvas intact and
56
+ * fade only the exact transferred SVG paint.
57
+ */
58
+ html[data-mindexec-native-desktop-stage="hybrid-compare"]
59
+ #mind-map-viewport .mind-map-business-automation-edge-layer.is-visual {
60
+ opacity: var(--mindexec-native-web-transferred-edge-opacity) !important;
53
61
  }
54
62
 
55
63
  html[data-mindexec-native-desktop-stage="hybrid-compare"][data-mindexec-native-compare-layer="overlay"]
@@ -82,9 +90,8 @@ html[data-mindexec-native-desktop-stage="hybrid-compare"][data-mindexec-native-c
82
90
  }
83
91
 
84
92
  @media (prefers-reduced-motion: no-preference) {
85
- html[data-mindexec-native-desktop-stage="hybrid-compare"] #mind-map-viewport > canvas,
86
- html[data-mindexec-native-desktop-stage="hybrid-compare"] #mind-map-viewport > svg,
87
- html[data-mindexec-native-desktop-stage="hybrid-compare"] #mind-map-viewport .mind-map-business-automation-edge-layer,
93
+ html[data-mindexec-native-desktop-stage="hybrid-compare"]
94
+ #mind-map-viewport .mind-map-business-automation-edge-layer.is-visual,
88
95
  html[data-mindexec-native-desktop-stage="hybrid-compare"] #css3d-dom-wrapper .map-node {
89
96
  transition: opacity 120ms linear;
90
97
  }
@@ -425,6 +425,21 @@
425
425
  };
426
426
  }
427
427
 
428
+ _matchesRetainedSceneOwner(result, owner) {
429
+ const retained = result?.retainedSceneOwner;
430
+ return result?.attachmentRetained === true &&
431
+ result?.cameraRetryAllowed === true &&
432
+ retained?.boardId === owner.boardId &&
433
+ String(retained?.engineGeneration) === String(owner.engineGeneration) &&
434
+ String(retained?.boardEpoch) === String(owner.boardEpoch) &&
435
+ String(retained?.boardRevision) === String(owner.boardRevision) &&
436
+ this.attached &&
437
+ this.boardId === owner.boardId &&
438
+ this.engineGeneration === owner.engineGeneration &&
439
+ this.boardEpoch === owner.boardEpoch &&
440
+ this.boardRevision === owner.boardRevision;
441
+ }
442
+
428
443
  _assignHandle(map, id, kind) {
429
444
  let handle = map.get(id);
430
445
  if (handle) return handle;
@@ -523,6 +538,18 @@
523
538
  try {
524
539
  const result = await this.api.sendCamera({ owner, camera: this.latestCamera || copyCamera(this.module) });
525
540
  if (result?.accepted !== true) {
541
+ if (this._matchesRetainedSceneOwner(result, owner)) {
542
+ publishStatus({ ...result, mode: 'mirror', ready: true });
543
+ emit('native.render.camera.retryable', {
544
+ boardId: owner.boardId,
545
+ engineGeneration: owner.engineGeneration,
546
+ boardEpoch: owner.boardEpoch,
547
+ boardRevision: owner.boardRevision,
548
+ requestSequence: owner.requestSequence,
549
+ reason: String(result?.reason || 'native-render-camera-retryable')
550
+ });
551
+ return;
552
+ }
526
553
  throw new Error(result?.reason || result?.lastError || result?.lastRejected?.reason || 'native-render-camera-not-accepted');
527
554
  }
528
555
  publishStatus({ ...result, mode: 'mirror', ready: true });
@@ -1,7 +1,7 @@
1
1
  (function () {
2
2
  'use strict';
3
3
 
4
- const BUILD_ID = '20260831-native-render-webview2-v002';
4
+ const BUILD_ID = '20260831-native-render-webview2-v003';
5
5
  const WIRE_PREFIX = 'mindexec.native-render.v1';
6
6
  const PROTOCOL_MAGIC = 0x31524e4d;
7
7
  const PROTOCOL_VERSION = 1;
@@ -70,9 +70,10 @@
70
70
  let statusChecked = false;
71
71
  let disposed = false;
72
72
  let hasAcceptedSnapshot = false;
73
+ let acceptedSnapshotOwner = null;
73
74
  let viewportEpoch = 0;
74
75
  let viewportAcknowledgementRequired = false;
75
- let requestedCompareLayer = 'overlay';
76
+ let requestedCompareLayer = 'web';
76
77
  let effectiveCompareLayer = 'web';
77
78
  const status = {
78
79
  mode: 'mirror',
@@ -716,6 +717,7 @@
716
717
  const snapshot = {
717
718
  ...status,
718
719
  desktopStage: 'hybrid-compare',
720
+ requestedCompareLayer,
719
721
  compareLayer: effectiveCompareLayer
720
722
  };
721
723
  return extra ? { ...snapshot, ...extra } : snapshot;
@@ -748,10 +750,28 @@
748
750
 
749
751
  function requireWebFallback() {
750
752
  hasAcceptedSnapshot = false;
753
+ acceptedSnapshotOwner = null;
751
754
  viewportAcknowledgementRequired = false;
752
755
  writeCompareLayer('web');
753
756
  }
754
757
 
758
+ function sameSceneOwner(left, right) {
759
+ return left?.boardId === right?.boardId &&
760
+ left?.engineGeneration === right?.engineGeneration &&
761
+ left?.boardEpoch === right?.boardEpoch &&
762
+ left?.boardRevision === right?.boardRevision;
763
+ }
764
+
765
+ function retainedSceneOwner(owner) {
766
+ if (!owner) return null;
767
+ return {
768
+ boardId: owner.boardId,
769
+ engineGeneration: owner.engineGeneration.toString(),
770
+ boardEpoch: owner.boardEpoch.toString(),
771
+ boardRevision: owner.boardRevision.toString()
772
+ };
773
+ }
774
+
755
775
  function requireCameraAcknowledgement() {
756
776
  if (!hasAcceptedSnapshot) {
757
777
  requireWebFallback();
@@ -805,8 +825,19 @@
805
825
  }
806
826
 
807
827
  function settleFrameFailure(entry, reason, options = {}) {
828
+ const attachmentRetained = entry.requestType === REQUEST_TYPE.camera &&
829
+ hasAcceptedSnapshot &&
830
+ sameSceneOwner(acceptedSnapshotOwner, entry.owner);
808
831
  markFrameFailure(entry.requestType, reason, options);
809
- entry.resolve(currentStatus({ accepted: false, reason }));
832
+ entry.resolve(currentStatus({
833
+ accepted: false,
834
+ reason,
835
+ attachmentRetained,
836
+ cameraRetryAllowed: attachmentRetained,
837
+ retainedSceneOwner: attachmentRetained
838
+ ? retainedSceneOwner(acceptedSnapshotOwner)
839
+ : null
840
+ }));
810
841
  }
811
842
 
812
843
  function invalidateStatus(reason, entry = null) {
@@ -1087,6 +1118,7 @@
1087
1118
  status.lastError = '';
1088
1119
  if (entry.requestType === REQUEST_TYPE.snapshot) {
1089
1120
  hasAcceptedSnapshot = true;
1121
+ acceptedSnapshotOwner = entry.owner;
1090
1122
  if (entry.viewportEpoch === viewportEpoch) {
1091
1123
  viewportAcknowledgementRequired = false;
1092
1124
  }
@@ -13,7 +13,7 @@
13
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=20260822-selection-unified-v857" />
16
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/native-hybrid.css?v=20260830-hybrid-compare-v001" />
16
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/native-hybrid.css?v=20260830-hybrid-compare-v002" />
17
17
  <!-- ??좎뜦堉??Font Awesome (local) ??좎뜦堉??-->
18
18
  <link rel="stylesheet" href="_content/MindExecution.Shared/lib/font-awesome/css/all.min.css" />
19
19
  <!-- ??좎뜦堉??-->
@@ -615,7 +615,7 @@
615
615
  }
616
616
 
617
617
  const base = '_content/MindExecution.Shared/js/';
618
- const scriptVersion = '20260831-native-hybrid-resize-v995';
618
+ const scriptVersion = '20260831-native-hybrid-recovery-v996';
619
619
  const scriptUrl = (script) => `${base}${script}?v=${scriptVersion}`;
620
620
  console.log(`[Script Loader] Shared JS version: ${scriptVersion}`);
621
621
  const criticalScripts = [
@@ -1,5 +1,5 @@
1
1
  self.assetsManifest = {
2
- "version": "d+PosoWA",
2
+ "version": "33CyNy0Q",
3
3
  "assets": [
4
4
  {
5
5
  "hash": "sha256-+CSYMcqLNTsq3VnH11jgYyOCCdxvHzL74CBmo4sCmMU=",
@@ -46,7 +46,7 @@ self.assetsManifest = {
46
46
  "url": "_content/MindExecution.Shared/css/mind-map-overrides.css"
47
47
  },
48
48
  {
49
- "hash": "sha256-HoVxhfKIYYNZ05j2DMW154fu6beI9P0B9Kd1eV/VQbg=",
49
+ "hash": "sha256-+5BTiY9k1zt6KlLaHxQpAJMts+/PIBsEwDPYFLnI4uc=",
50
50
  "url": "_content/MindExecution.Shared/css/native-hybrid.css"
51
51
  },
52
52
  {
@@ -170,11 +170,11 @@ self.assetsManifest = {
170
170
  "url": "_content/MindExecution.Shared/js/mind-map-native-core-bridge.js"
171
171
  },
172
172
  {
173
- "hash": "sha256-csOI3j2czUP7f8OngCnnMHBfqPgnbKTodftYQyDLKt4=",
173
+ "hash": "sha256-IuLCMNtyd+B5dFijme/H72LTZ4krzbV8jFJJ10x1Z8U=",
174
174
  "url": "_content/MindExecution.Shared/js/mind-map-native-render-mirror.js"
175
175
  },
176
176
  {
177
- "hash": "sha256-Yc9hTbOJ/SKDez8BOFKE5saFfhnaNt7LPgW8BxaQsRE=",
177
+ "hash": "sha256-pdVa5FuUcNmIhb+NUBn/yNbqRpQXIeNDddOj/BbthVQ=",
178
178
  "url": "_content/MindExecution.Shared/js/mind-map-native-render-webview2.js"
179
179
  },
180
180
  {
@@ -966,7 +966,7 @@ self.assetsManifest = {
966
966
  "url": "icon-512.png"
967
967
  },
968
968
  {
969
- "hash": "sha256-3qKh7DlJjmFElF7cOE2HhJI4/8UHRhXBzLAZSjSD/jQ=",
969
+ "hash": "sha256-BUPjQ0zGJVybNJ7TRYs37u1X02hfMHQ/+CCDkenvv78=",
970
970
  "url": "index.html"
971
971
  },
972
972
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: d+PosoWA */
1
+ /* Manifest version: 33CyNy0Q */
2
2
  // Hosted deployments should prefer the network over stale offline caches.
3
3
  // This service worker immediately clears old Blazor offline caches and unregisters itself.
4
4