@mindexec/cli 0.2.184 → 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.184",
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;
@@ -1820,6 +1820,13 @@
1820
1820
  || wrapper.classList?.contains?.('node-type-video')
1821
1821
  || wrapper.classList?.contains?.('node-type-embed')
1822
1822
  );
1823
+ const isScrollableTextWrapper = !!(
1824
+ wrapper.classList?.contains?.('node-type-note')
1825
+ || wrapper.classList?.contains?.('node-type-text')
1826
+ || wrapper.classList?.contains?.('node-type-markdown')
1827
+ || wrapper.classList?.contains?.('node-type-code')
1828
+ || wrapper.classList?.contains?.('node-type-csv-table')
1829
+ );
1823
1830
 
1824
1831
  const resolutionScale = Math.max(1, Number(cssObject?.userData?.resolutionScale || CSS3D_RESOLUTION_SCALE || 1));
1825
1832
  const worldWidth = Math.max(1, Math.round(Number(width || 1)));
@@ -1905,13 +1912,32 @@
1905
1912
 
1906
1913
  const response = inner?.querySelector?.('.node-response') || null;
1907
1914
  if (response?.style) {
1915
+ const responseIsScrollableText = isScrollableTextWrapper || !!(
1916
+ response.classList?.contains?.('note-content')
1917
+ || response.classList?.contains?.('markdown-body')
1918
+ || response.classList?.contains?.('code-body')
1919
+ || response.classList?.contains?.('csv-table-scroll')
1920
+ );
1908
1921
  response.style.width = '100%';
1909
1922
  response.style.height = '100%';
1910
1923
  response.style.minWidth = isMediaWrapper ? '100%' : '0';
1911
1924
  response.style.minHeight = isMediaWrapper ? '100%' : '0';
1912
1925
  response.style.maxWidth = '100%';
1913
1926
  response.style.maxHeight = '100%';
1914
- response.style.overflow = 'hidden';
1927
+ if (responseIsScrollableText && !isMediaWrapper) {
1928
+ response.style.overflow = '';
1929
+ response.style.overflowX = response.classList?.contains?.('code-body') || response.classList?.contains?.('csv-table-scroll')
1930
+ ? 'auto'
1931
+ : 'hidden';
1932
+ response.style.overflowY = 'auto';
1933
+ response.style.scrollbarWidth = 'thin';
1934
+ response.style.scrollbarGutter = response.classList?.contains?.('csv-table-scroll')
1935
+ ? 'stable both-edges'
1936
+ : 'stable';
1937
+ response.style.pointerEvents = 'auto';
1938
+ } else {
1939
+ response.style.overflow = 'hidden';
1940
+ }
1915
1941
  if (hasContextSourcePins) {
1916
1942
  response.style.contain = 'none';
1917
1943
  response.style.contentVisibility = 'visible';
@@ -22123,9 +22149,10 @@
22123
22149
  flex: 1 1 auto;
22124
22150
  min-height: 0;
22125
22151
  overflow-y: auto;
22126
- pointer-events: none;
22152
+ pointer-events: auto;
22127
22153
  scrollbar-width: thin;
22128
22154
  scrollbar-color: rgba(0,0,0,0.2) transparent;
22155
+ scrollbar-gutter: stable;
22129
22156
  padding-right: 14px;
22130
22157
  `;
22131
22158
 
@@ -7,8 +7,8 @@
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
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260617-session-preserve-v610" />
11
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260617-session-preserve-v610" />
10
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260617-note-scroll-view-v611" />
11
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260617-note-scroll-view-v611" />
12
12
  <!-- ?�▼??Font Awesome (local) ?�▼??-->
13
13
  <link rel="stylesheet" href="_content/MindExecution.Shared/lib/font-awesome/css/all.min.css" />
14
14
  <!-- ?�▲??-->
@@ -579,7 +579,7 @@
579
579
  }
580
580
 
581
581
  const base = '_content/MindExecution.Shared/js/';
582
- const scriptVersion = '20260617-session-preserve-v610';
582
+ const scriptVersion = '20260617-note-scroll-view-v611';
583
583
  const scriptUrl = (script) => `${base}${script}?v=${scriptVersion}`;
584
584
  console.log(`[Script Loader] Shared JS version: ${scriptVersion}`);
585
585
  const criticalScripts = [
@@ -1,5 +1,5 @@
1
1
  self.assetsManifest = {
2
- "version": "txzRjXR+",
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-gBI36z4Y7+AjUkFA/hGi8vAMGy8n+P5UbYry3YiMhCw=",
89
+ "hash": "sha256-f5vcy6AIq6e21hjCQlnjZnjQQ3s7wfbK4K6iW5IdBjU=",
90
90
  "url": "_content/MindExecution.Shared/js/mind-map-css3d-manager.js"
91
91
  },
92
92
  {
@@ -834,7 +834,7 @@
834
834
  "url": "image-manifest.json"
835
835
  },
836
836
  {
837
- "hash": "sha256-mkaucN8+gWPpC7OgA7RsIQynHxqe1mlZCquEJdXEdsI=",
837
+ "hash": "sha256-lN61w54gvVeokmrGVYWF73NCi+cReoJ7J0/4myF8Fgk=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: txzRjXR+ */
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