@mindexec/cli 0.2.185 → 0.2.186

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.185",
3
+ "version": "0.2.186",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
@@ -649,12 +649,18 @@ async function main() {
649
649
  fakeSupabase.broadcastChange('UPDATE');
650
650
 
651
651
  await waitFor(async () => {
652
- const result = await fetchJson(`${client.baseUrl}/api/remote/agent/status`);
653
- return result.payload?.running === false
654
- && String(result.payload?.lastError || '') === 'registry-inactive'
655
- ? result.payload
652
+ const status = await fetchJson(`${client.baseUrl}/api/status`);
653
+ const agent = await fetchJson(`${client.baseUrl}/api/remote/agent/status`);
654
+ return status.payload?.remoteRegistryFollower?.reason === 'registry-inactive-agent-kept'
655
+ && status.payload?.remoteRegistryFollower?.agentKept === true
656
+ && status.payload?.remoteRegistryFollower?.dataPlaneReady === true
657
+ && agent.payload?.running === true
658
+ && agent.payload?.ready === true
659
+ && String(agent.payload?.manager || '') === hostBEndpoint
660
+ && Number(agent.payload?.pid || 0) === Number(restartedAgent.pid || 0)
661
+ ? { status: status.payload.remoteRegistryFollower, agent: agent.payload }
656
662
  : null;
657
- }, 9000, `registry inactive stop\n${client.details()}`);
663
+ }, 9000, `registry inactive keeps ready data-plane agent\n${client.details()}`);
658
664
  const finalStatus = await fetchJson(`${client.baseUrl}/api/status`);
659
665
  assert.ok(finalStatus.payload?.remoteRegistryRealtime?.changes >= 2, JSON.stringify(finalStatus.payload?.remoteRegistryRealtime));
660
666
  assert.ok(finalStatus.payload?.remoteRegistryRealtime?.wakeups >= 2, JSON.stringify(finalStatus.payload?.remoteRegistryRealtime));
package/server.js CHANGED
@@ -3573,6 +3573,7 @@ function createRemoteAgentSyncReport(body = {}) {
3573
3573
  inactiveCount: Number(body.inactiveCount ?? body.InactiveCount ?? 0) || 0,
3574
3574
  inactiveElapsedMs: Number(body.inactiveElapsedMs ?? body.InactiveElapsedMs ?? 0) || 0,
3575
3575
  agentKept: body.agentKept === true || body.AgentKept === true,
3576
+ dataPlaneReady: body.dataPlaneReady === true || body.DataPlaneReady === true,
3576
3577
  updatedAt: new Date().toISOString()
3577
3578
  };
3578
3579
  }
@@ -4089,6 +4090,12 @@ function isRemoteAgentRunningButNotReadyStale() {
4089
4090
  && getRemoteAgentRunningAgeMs(remoteAgentState) >= REMOTE_AGENT_READY_STALE_MS;
4090
4091
  }
4091
4092
 
4093
+ function isRemoteAgentReadyDataPlaneAlive() {
4094
+ return isRemoteAgentRegistryOwned()
4095
+ && remoteAgentState.ready === true
4096
+ && remoteAgentState.needsReconnect !== true;
4097
+ }
4098
+
4092
4099
  function isRemoteAgentRegistryOwned() {
4093
4100
  return isRemoteAgentProcessRunning()
4094
4101
  && /registry/i.test(String(remoteAgentState.source || ''));
@@ -4138,13 +4145,15 @@ function rememberRemoteRegistryInactiveTarget(reason = 'no-active-target') {
4138
4145
 
4139
4146
  const elapsedMs = Math.max(0, now - remoteRegistryFollowerInactiveTargetFirstAt);
4140
4147
  const agentRunning = isRemoteAgentRegistryOwned();
4141
- const confirmedInactive = remoteRegistryFollowerConsecutiveInactiveTarget >= REMOTE_REGISTRY_FOLLOWER_INACTIVE_STOP_COUNT
4148
+ const keepReadyDataPlane = agentRunning && isRemoteAgentReadyDataPlaneAlive();
4149
+ const confirmedInactive = !keepReadyDataPlane
4150
+ && remoteRegistryFollowerConsecutiveInactiveTarget >= REMOTE_REGISTRY_FOLLOWER_INACTIVE_STOP_COUNT
4142
4151
  && elapsedMs >= REMOTE_REGISTRY_FOLLOWER_INACTIVE_GRACE_MS;
4143
4152
 
4144
4153
  if (agentRunning && !confirmedInactive) {
4145
4154
  logEvent(
4146
4155
  'remote',
4147
- `registry target temporarily inactive; keeping managed RemoteAgent ${formatKeyValue('reason', reason)} ${formatKeyValue('count', remoteRegistryFollowerConsecutiveInactiveTarget)} ${formatKeyValue('elapsedMs', elapsedMs)}`,
4156
+ `registry target temporarily inactive; keeping managed RemoteAgent ${formatKeyValue('reason', reason)} ${formatKeyValue('count', remoteRegistryFollowerConsecutiveInactiveTarget)} ${formatKeyValue('elapsedMs', elapsedMs)} ${formatKeyValue('dataPlane', keepReadyDataPlane ? 'ready' : 'pending')}`,
4148
4157
  'remote');
4149
4158
  }
4150
4159
 
@@ -4153,7 +4162,8 @@ function rememberRemoteRegistryInactiveTarget(reason = 'no-active-target') {
4153
4162
  elapsedMs,
4154
4163
  agentRunning,
4155
4164
  confirmedInactive,
4156
- agentKept: agentRunning && !confirmedInactive
4165
+ agentKept: agentRunning && !confirmedInactive,
4166
+ dataPlaneReady: keepReadyDataPlane
4157
4167
  };
4158
4168
  }
4159
4169
 
@@ -6470,6 +6480,7 @@ async function runRemoteRegistryFollowerOnce(trigger = 'timer') {
6470
6480
  inactiveCount: inactive.count,
6471
6481
  inactiveElapsedMs: inactive.elapsedMs,
6472
6482
  agentKept: inactive.agentKept,
6483
+ dataPlaneReady: inactive.dataPlaneReady,
6473
6484
  lastError: ''
6474
6485
  });
6475
6486
  await reportRemoteRegistryFollowerSync({
@@ -6484,7 +6495,8 @@ async function runRemoteRegistryFollowerOnce(trigger = 'timer') {
6484
6495
  targetNodeId: inactive.agentKept ? remoteAgentState.nodeId : '',
6485
6496
  inactiveCount: inactive.count,
6486
6497
  inactiveElapsedMs: inactive.elapsedMs,
6487
- agentKept: inactive.agentKept
6498
+ agentKept: inactive.agentKept,
6499
+ dataPlaneReady: inactive.dataPlaneReady
6488
6500
  });
6489
6501
  scheduleRemoteRegistryFollower(REMOTE_REGISTRY_FOLLOWER_POLL_MS, 'no-target');
6490
6502
  return serializeRemoteRegistryFollowerState();
@@ -3375,3 +3375,44 @@ body.mindcanvas-is-dense .css3d-resolution-wrapper.node-type-templatelauncher.se
3375
3375
  color: #93c5fd;
3376
3376
  }
3377
3377
  }
3378
+
3379
+ /* Lightweight CSS3D motion path.
3380
+ Reference graph tools are useful here because they keep node DOM cheap:
3381
+ while the camera is moving, retain the canonical CSS3D surface but remove
3382
+ decorative compositor-heavy effects from every CSS3D node, including
3383
+ selected and agent-style nodes. */
3384
+ body.is-zooming .css3d-resolution-wrapper,
3385
+ body.is-panning .css3d-resolution-wrapper,
3386
+ body.is-node-dragging .css3d-resolution-wrapper,
3387
+ body.is-resizing .css3d-resolution-wrapper,
3388
+ body.mindcanvas-is-moving .css3d-resolution-wrapper,
3389
+ body.mindcanvas-is-dense .css3d-resolution-wrapper {
3390
+ -webkit-transition: none !important;
3391
+ transition: none !important;
3392
+ -webkit-filter: none !important;
3393
+ filter: none !important;
3394
+ -webkit-box-shadow: none !important;
3395
+ box-shadow: none !important;
3396
+ }
3397
+
3398
+ body.is-zooming .css3d-resolution-wrapper .css3d-dynamic-node,
3399
+ body.is-panning .css3d-resolution-wrapper .css3d-dynamic-node,
3400
+ body.is-node-dragging .css3d-resolution-wrapper .css3d-dynamic-node,
3401
+ body.is-resizing .css3d-resolution-wrapper .css3d-dynamic-node,
3402
+ body.mindcanvas-is-moving .css3d-resolution-wrapper .css3d-dynamic-node,
3403
+ body.mindcanvas-is-dense .css3d-resolution-wrapper .css3d-dynamic-node,
3404
+ body.is-zooming .css3d-resolution-wrapper [id^="css3d-node-"],
3405
+ body.is-panning .css3d-resolution-wrapper [id^="css3d-node-"],
3406
+ body.is-node-dragging .css3d-resolution-wrapper [id^="css3d-node-"],
3407
+ body.is-resizing .css3d-resolution-wrapper [id^="css3d-node-"],
3408
+ body.mindcanvas-is-moving .css3d-resolution-wrapper [id^="css3d-node-"],
3409
+ body.mindcanvas-is-dense .css3d-resolution-wrapper [id^="css3d-node-"] {
3410
+ -webkit-transition: none !important;
3411
+ transition: none !important;
3412
+ -webkit-filter: none !important;
3413
+ filter: none !important;
3414
+ -webkit-backdrop-filter: none !important;
3415
+ backdrop-filter: none !important;
3416
+ -webkit-box-shadow: none !important;
3417
+ box-shadow: none !important;
3418
+ }
@@ -795,26 +795,26 @@
795
795
  max-height: none !important;
796
796
  }
797
797
 
798
- /* Preserve agent memo chrome during camera motion so middle-button panning
799
- does not visibly weaken their glow or console surfaces. */
800
- body.is-zooming .css3d-resolution-wrapper:not(.selection-style-agent),
801
- body.is-panning .css3d-resolution-wrapper:not(.selection-style-agent),
802
- body.mindcanvas-is-moving .css3d-resolution-wrapper:not(.selection-style-agent),
803
- body.mindcanvas-is-dense .css3d-resolution-wrapper:not(.selection-style-agent) {
798
+ /* Keep CSS3D nodes readable during camera motion, but drop expensive
799
+ decorative effects consistently across selected and agent-style nodes. */
800
+ body.is-zooming .css3d-resolution-wrapper,
801
+ body.is-panning .css3d-resolution-wrapper,
802
+ body.mindcanvas-is-moving .css3d-resolution-wrapper,
803
+ body.mindcanvas-is-dense .css3d-resolution-wrapper {
804
804
  transition: none !important;
805
805
  -webkit-transition: none !important;
806
806
  filter: none !important;
807
807
  -webkit-filter: none !important;
808
808
  }
809
809
 
810
- body.is-zooming .css3d-resolution-wrapper:not(.selection-style-agent) .css3d-dynamic-node,
811
- body.is-panning .css3d-resolution-wrapper:not(.selection-style-agent) .css3d-dynamic-node,
812
- body.mindcanvas-is-moving .css3d-resolution-wrapper:not(.selection-style-agent) .css3d-dynamic-node,
813
- body.mindcanvas-is-dense .css3d-resolution-wrapper:not(.selection-style-agent) .css3d-dynamic-node,
814
- body.is-zooming .css3d-resolution-wrapper:not(.selection-style-agent) [id^="css3d-node-"],
815
- body.is-panning .css3d-resolution-wrapper:not(.selection-style-agent) [id^="css3d-node-"],
816
- body.mindcanvas-is-moving .css3d-resolution-wrapper:not(.selection-style-agent) [id^="css3d-node-"],
817
- body.mindcanvas-is-dense .css3d-resolution-wrapper:not(.selection-style-agent) [id^="css3d-node-"] {
810
+ body.is-zooming .css3d-resolution-wrapper .css3d-dynamic-node,
811
+ body.is-panning .css3d-resolution-wrapper .css3d-dynamic-node,
812
+ body.mindcanvas-is-moving .css3d-resolution-wrapper .css3d-dynamic-node,
813
+ body.mindcanvas-is-dense .css3d-resolution-wrapper .css3d-dynamic-node,
814
+ body.is-zooming .css3d-resolution-wrapper [id^="css3d-node-"],
815
+ body.is-panning .css3d-resolution-wrapper [id^="css3d-node-"],
816
+ body.mindcanvas-is-moving .css3d-resolution-wrapper [id^="css3d-node-"],
817
+ body.mindcanvas-is-dense .css3d-resolution-wrapper [id^="css3d-node-"] {
818
818
  box-shadow: none !important;
819
819
  filter: none !important;
820
820
  -webkit-filter: none !important;
@@ -895,10 +895,10 @@
895
895
  body.is-panning .ai-loading-row.ai-loading-row-media,
896
896
  body.mindcanvas-is-moving .ai-loading-row.ai-loading-row-media,
897
897
  body.mindcanvas-is-dense .ai-loading-row.ai-loading-row-media,
898
- body.is-zooming .css3d-resolution-wrapper:not(.selection-style-agent) .map-node-memo__agent-console-panel,
899
- body.is-panning .css3d-resolution-wrapper:not(.selection-style-agent) .map-node-memo__agent-console-panel,
900
- body.mindcanvas-is-moving .css3d-resolution-wrapper:not(.selection-style-agent) .map-node-memo__agent-console-panel,
901
- body.mindcanvas-is-dense .css3d-resolution-wrapper:not(.selection-style-agent) .map-node-memo__agent-console-panel {
898
+ body.is-zooming .css3d-resolution-wrapper .map-node-memo__agent-console-panel,
899
+ body.is-panning .css3d-resolution-wrapper .map-node-memo__agent-console-panel,
900
+ body.mindcanvas-is-moving .css3d-resolution-wrapper .map-node-memo__agent-console-panel,
901
+ body.mindcanvas-is-dense .css3d-resolution-wrapper .map-node-memo__agent-console-panel {
902
902
  box-shadow: none !important;
903
903
  backdrop-filter: none !important;
904
904
  -webkit-backdrop-filter: none !important;
@@ -1,5 +1,5 @@
1
1
  self.assetsManifest = {
2
- "version": "zdahFh/b",
2
+ "version": "RQBjk+TB",
3
3
  "assets": [
4
4
  {
5
5
  "hash": "sha256-+CSYMcqLNTsq3VnH11jgYyOCCdxvHzL74CBmo4sCmMU=",
@@ -42,7 +42,7 @@
42
42
  "url": "_content/MindExecution.Shared/css/app.css"
43
43
  },
44
44
  {
45
- "hash": "sha256-29ALhCvhp5pZs7AXAjTpX+UCuf7jQSP6SQCn0p9Wb4Y=",
45
+ "hash": "sha256-vy6wZFJwYl0hLFMMhAKU4de+TPg7CJ91jMwnXl8GBqk=",
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-VJQ48zNB42JJETm59vTBtxdXez0dwIui6LnZUisNTSo=",
89
+ "hash": "sha256-f5vcy6AIq6e21hjCQlnjZnjQQ3s7wfbK4K6iW5IdBjU=",
90
90
  "url": "_content/MindExecution.Shared/js/mind-map-css3d-manager.js"
91
91
  },
92
92
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: zdahFh/b */
1
+ /* Manifest version: RQBjk+TB */
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