@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 +1 -1
- package/scripts/remote-registry-follower-smoke.mjs +11 -5
- package/server.js +16 -4
- package/wwwroot/_content/MindExecution.Shared/css/mind-map-overrides.css +41 -0
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-manager.js +47 -20
- package/wwwroot/index.html +3 -3
- package/wwwroot/service-worker-assets.js +4 -4
- package/wwwroot/service-worker.js +1 -1
package/package.json
CHANGED
|
@@ -649,12 +649,18 @@ async function main() {
|
|
|
649
649
|
fakeSupabase.broadcastChange('UPDATE');
|
|
650
650
|
|
|
651
651
|
await waitFor(async () => {
|
|
652
|
-
const
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
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
|
|
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
|
|
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
|
-
/*
|
|
799
|
-
|
|
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
|
|
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
|
|
811
|
-
body.is-panning .css3d-resolution-wrapper
|
|
812
|
-
body.mindcanvas-is-moving .css3d-resolution-wrapper
|
|
813
|
-
body.mindcanvas-is-dense .css3d-resolution-wrapper
|
|
814
|
-
body.is-zooming .css3d-resolution-wrapper
|
|
815
|
-
body.is-panning .css3d-resolution-wrapper
|
|
816
|
-
body.mindcanvas-is-moving .css3d-resolution-wrapper
|
|
817
|
-
body.mindcanvas-is-dense .css3d-resolution-wrapper
|
|
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
|
|
899
|
-
body.is-panning .css3d-resolution-wrapper
|
|
900
|
-
body.mindcanvas-is-moving .css3d-resolution-wrapper
|
|
901
|
-
body.mindcanvas-is-dense .css3d-resolution-wrapper
|
|
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
|
-
|
|
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:
|
|
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
|
|
package/wwwroot/index.html
CHANGED
|
@@ -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-
|
|
11
|
-
<link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260617-
|
|
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-
|
|
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": "
|
|
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-
|
|
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-
|
|
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-
|
|
837
|
+
"hash": "sha256-lN61w54gvVeokmrGVYWF73NCi+cReoJ7J0/4myF8Fgk=",
|
|
838
838
|
"url": "index.html"
|
|
839
839
|
},
|
|
840
840
|
{
|