@mindexec/cli 0.2.204 → 0.2.206
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/server.js +82 -1
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-core.js +85 -0
- package/wwwroot/_framework/{MindExecution.Shared.qigwoeeqrt.dll → MindExecution.Shared.p86iw1fhns.dll} +0 -0
- package/wwwroot/_framework/blazor.boot.json +3 -3
- package/wwwroot/index.html +3 -3
- package/wwwroot/service-worker-assets.js +6 -6
- package/wwwroot/service-worker.js +1 -1
package/package.json
CHANGED
package/server.js
CHANGED
|
@@ -3771,6 +3771,24 @@ function isRemoteAgentOutputReconnectSignal(text) {
|
|
|
3771
3771
|
}
|
|
3772
3772
|
|
|
3773
3773
|
function rememberRemoteAgentSyncReport(report) {
|
|
3774
|
+
if (report?.authenticated !== true
|
|
3775
|
+
&& isRemoteAgentRegistryOwned()
|
|
3776
|
+
&& isRemoteAgentProcessRunning()
|
|
3777
|
+
&& /^(registry-auth-pending-agent-kept|registry-not-authenticated-agent-kept|session-expired-agent-kept)$/i.test(String(report.reason || ''))) {
|
|
3778
|
+
const now = Date.now();
|
|
3779
|
+
const key = `ignored-unauth|${report.reason || ''}|${remoteAgentState.manager || ''}|${remoteAgentState.leaseId || ''}`;
|
|
3780
|
+
if (key !== remoteAgentSyncReportLogKey
|
|
3781
|
+
|| now - remoteAgentSyncReportLogAt >= REMOTE_AGENT_SYNC_REPORT_LOG_REPEAT_MS) {
|
|
3782
|
+
remoteAgentSyncReportLogKey = key;
|
|
3783
|
+
remoteAgentSyncReportLogAt = now;
|
|
3784
|
+
logEvent(
|
|
3785
|
+
'remote',
|
|
3786
|
+
`registry sync ignored stale unauth report ${formatKeyValue('reason', report.reason || '-')} ${formatKeyValue('target', remoteAgentState.manager || '-')} ${formatKeyValue('auth', 'kept')}`,
|
|
3787
|
+
'remote');
|
|
3788
|
+
}
|
|
3789
|
+
return false;
|
|
3790
|
+
}
|
|
3791
|
+
|
|
3774
3792
|
remoteAgentSyncReportState = report;
|
|
3775
3793
|
const reason = report.reason || report.error || (report.ok ? 'ok' : 'failed');
|
|
3776
3794
|
const status = report.connected
|
|
@@ -3807,6 +3825,7 @@ function rememberRemoteAgentSyncReport(report) {
|
|
|
3807
3825
|
'remote',
|
|
3808
3826
|
`registry sync ${status} ${formatKeyValue('reason', reason)} ${formatKeyValue('target', report.targetEndpoint || '-')} ${formatKeyValue('auth', report.authenticated ? 'yes' : 'no')}`,
|
|
3809
3827
|
'remote');
|
|
3828
|
+
return true;
|
|
3810
3829
|
}
|
|
3811
3830
|
|
|
3812
3831
|
function appendRemoteAgentOutput(stream, chunk, stateConnectionKey = '') {
|
|
@@ -5841,6 +5860,28 @@ async function readFreshSupabaseSessionForRegistry(config, reason = 'registry')
|
|
|
5841
5860
|
}
|
|
5842
5861
|
}
|
|
5843
5862
|
|
|
5863
|
+
async function refreshSupabaseSessionAfterRegistryAuthFailure(config, trigger = 'registry-auth-failure') {
|
|
5864
|
+
if (!config?.url || !config?.key) {
|
|
5865
|
+
return {
|
|
5866
|
+
ok: false,
|
|
5867
|
+
reason: 'supabase-config-missing'
|
|
5868
|
+
};
|
|
5869
|
+
}
|
|
5870
|
+
|
|
5871
|
+
const sessionPayload = await readStableAuthSessionPayload();
|
|
5872
|
+
if (!sessionPayload.found) {
|
|
5873
|
+
return {
|
|
5874
|
+
ok: false,
|
|
5875
|
+
reason: 'registry-not-authenticated'
|
|
5876
|
+
};
|
|
5877
|
+
}
|
|
5878
|
+
|
|
5879
|
+
return await refreshSupabaseSessionForRegistry(
|
|
5880
|
+
config,
|
|
5881
|
+
sessionPayload,
|
|
5882
|
+
`registry-auth-failure-${safeRemoteAgentField(trigger || 'timer', 80)}`);
|
|
5883
|
+
}
|
|
5884
|
+
|
|
5844
5885
|
function readRegistryTargetField(target, ...keys) {
|
|
5845
5886
|
for (const key of keys) {
|
|
5846
5887
|
const value = target?.[key];
|
|
@@ -6595,8 +6636,9 @@ async function runRemoteRegistryFollowerOnce(trigger = 'timer') {
|
|
|
6595
6636
|
|
|
6596
6637
|
remoteRegistryFollowerInFlight = true;
|
|
6597
6638
|
const attemptedAt = new Date().toISOString();
|
|
6639
|
+
let config = null;
|
|
6598
6640
|
try {
|
|
6599
|
-
|
|
6641
|
+
config = readSupabaseRuntimeConfig();
|
|
6600
6642
|
if (!config.url || !config.key) {
|
|
6601
6643
|
closeRemoteRegistryRealtime('supabase-config-missing');
|
|
6602
6644
|
updateRemoteRegistryFollowerState({
|
|
@@ -6968,6 +7010,45 @@ async function runRemoteRegistryFollowerOnce(trigger = 'timer') {
|
|
|
6968
7010
|
return serializeRemoteRegistryFollowerState();
|
|
6969
7011
|
} catch (error) {
|
|
6970
7012
|
const transientAuth = error?.statusCode === 401 || error?.statusCode === 403;
|
|
7013
|
+
if (transientAuth) {
|
|
7014
|
+
const agentKept = isRemoteAgentRegistryOwned() && isRemoteAgentProcessRunning();
|
|
7015
|
+
const keptManager = agentKept ? safeRemoteAgentField(remoteAgentState.manager, 160) : '';
|
|
7016
|
+
const keptCandidates = agentKept ? normalizeRemoteManagerEndpointList(remoteAgentState.managerCandidates, remoteAgentState.manager) : [];
|
|
7017
|
+
const refreshed = await refreshSupabaseSessionAfterRegistryAuthFailure(config, trigger).catch(refreshError => ({
|
|
7018
|
+
ok: false,
|
|
7019
|
+
reason: refreshError?.message || String(refreshError || 'auth-refresh-failed')
|
|
7020
|
+
}));
|
|
7021
|
+
|
|
7022
|
+
if (refreshed?.ok === true && refreshed.session) {
|
|
7023
|
+
updateRemoteRegistryFollowerState({
|
|
7024
|
+
status: 'auth-refreshed',
|
|
7025
|
+
reason: agentKept ? 'registry-auth-refreshed-agent-kept' : 'registry-auth-refreshed',
|
|
7026
|
+
authenticated: true,
|
|
7027
|
+
lastAttemptAt: attemptedAt,
|
|
7028
|
+
lastError: '',
|
|
7029
|
+
targetEndpoint: keptManager,
|
|
7030
|
+
targetEndpointCandidates: keptCandidates,
|
|
7031
|
+
targetLeaseId: agentKept ? safeRemoteAgentField(remoteAgentState.leaseId, 128) : '',
|
|
7032
|
+
targetNodeId: agentKept ? safeRemoteAgentField(remoteAgentState.nodeId, 128) : '',
|
|
7033
|
+
agentKept
|
|
7034
|
+
});
|
|
7035
|
+
await reportRemoteRegistryFollowerSync({
|
|
7036
|
+
ok: true,
|
|
7037
|
+
skipped: true,
|
|
7038
|
+
reason: agentKept ? 'registry-auth-refreshed-agent-kept' : 'registry-auth-refreshed',
|
|
7039
|
+
trigger,
|
|
7040
|
+
authenticated: true,
|
|
7041
|
+
targetEndpoint: keptManager,
|
|
7042
|
+
targetEndpointCandidates: keptCandidates,
|
|
7043
|
+
targetLeaseId: agentKept ? remoteAgentState.leaseId : '',
|
|
7044
|
+
targetNodeId: agentKept ? remoteAgentState.nodeId : '',
|
|
7045
|
+
agentKept
|
|
7046
|
+
});
|
|
7047
|
+
scheduleRemoteRegistryFollower(0, 'auth-refreshed');
|
|
7048
|
+
return serializeRemoteRegistryFollowerState();
|
|
7049
|
+
}
|
|
7050
|
+
}
|
|
7051
|
+
|
|
6971
7052
|
updateRemoteRegistryFollowerState({
|
|
6972
7053
|
status: transientAuth ? 'auth-pending' : 'error',
|
|
6973
7054
|
reason: transientAuth ? 'registry-auth-pending' : 'registry-sync-failed',
|
|
@@ -6068,6 +6068,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
6068
6068
|
if (sourceWidth <= 1 || sourceHeight <= 1) {
|
|
6069
6069
|
return null;
|
|
6070
6070
|
}
|
|
6071
|
+
const liveNodeCount = Number(this.nodeObjectsById?.size || 0);
|
|
6071
6072
|
|
|
6072
6073
|
try {
|
|
6073
6074
|
this.camera.updateProjectionMatrix?.();
|
|
@@ -6118,6 +6119,90 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
|
|
|
6118
6119
|
return null;
|
|
6119
6120
|
}
|
|
6120
6121
|
|
|
6122
|
+
const drawProjectedNodeFrames = () => {
|
|
6123
|
+
if (!this.nodeObjectsById || liveNodeCount <= 0 || !this.container) {
|
|
6124
|
+
return 0;
|
|
6125
|
+
}
|
|
6126
|
+
|
|
6127
|
+
const containerWidth = Math.max(1, Number(this.container.clientWidth || sourceCanvas.clientWidth || sourceWidth || 1));
|
|
6128
|
+
const containerHeight = Math.max(1, Number(this.container.clientHeight || sourceCanvas.clientHeight || sourceHeight || 1));
|
|
6129
|
+
const canvasScaleX = sourceWidth / containerWidth;
|
|
6130
|
+
const canvasScaleY = sourceHeight / containerHeight;
|
|
6131
|
+
let drawn = 0;
|
|
6132
|
+
|
|
6133
|
+
const getStyle = (contentType) => {
|
|
6134
|
+
switch (String(contentType || '').trim().toLowerCase()) {
|
|
6135
|
+
case 'image': return { fill: 'rgba(219, 234, 254, 0.92)', stroke: 'rgba(37, 99, 235, 0.85)' };
|
|
6136
|
+
case 'video': return { fill: 'rgba(237, 233, 254, 0.92)', stroke: 'rgba(124, 58, 237, 0.82)' };
|
|
6137
|
+
case 'pdf': return { fill: 'rgba(254, 226, 226, 0.92)', stroke: 'rgba(220, 38, 38, 0.78)' };
|
|
6138
|
+
case 'memo': return { fill: 'rgba(254, 243, 199, 0.94)', stroke: 'rgba(217, 119, 6, 0.82)' };
|
|
6139
|
+
case 'agent':
|
|
6140
|
+
case 'ai':
|
|
6141
|
+
case 'ai-task': return { fill: 'rgba(220, 252, 231, 0.92)', stroke: 'rgba(22, 163, 74, 0.80)' };
|
|
6142
|
+
case 'remote-fleet':
|
|
6143
|
+
case 'remote-device':
|
|
6144
|
+
case 'multi-desktop-monitor': return { fill: 'rgba(224, 231, 255, 0.92)', stroke: 'rgba(79, 70, 229, 0.78)' };
|
|
6145
|
+
case 'template':
|
|
6146
|
+
case 'templatelauncher': return { fill: 'rgba(204, 251, 241, 0.92)', stroke: 'rgba(13, 148, 136, 0.78)' };
|
|
6147
|
+
case 'csv-table': return { fill: 'rgba(240, 253, 244, 0.92)', stroke: 'rgba(21, 128, 61, 0.78)' };
|
|
6148
|
+
default: return { fill: 'rgba(224, 242, 254, 0.92)', stroke: 'rgba(2, 132, 199, 0.80)' };
|
|
6149
|
+
}
|
|
6150
|
+
};
|
|
6151
|
+
|
|
6152
|
+
const drawRoundRect = (x, y, w, h, r) => {
|
|
6153
|
+
const radius = Math.max(1, Math.min(r, w / 2, h / 2));
|
|
6154
|
+
ctx.beginPath();
|
|
6155
|
+
ctx.moveTo(x + radius, y);
|
|
6156
|
+
ctx.lineTo(x + w - radius, y);
|
|
6157
|
+
ctx.quadraticCurveTo(x + w, y, x + w, y + radius);
|
|
6158
|
+
ctx.lineTo(x + w, y + h - radius);
|
|
6159
|
+
ctx.quadraticCurveTo(x + w, y + h, x + w - radius, y + h);
|
|
6160
|
+
ctx.lineTo(x + radius, y + h);
|
|
6161
|
+
ctx.quadraticCurveTo(x, y + h, x, y + h - radius);
|
|
6162
|
+
ctx.lineTo(x, y + radius);
|
|
6163
|
+
ctx.quadraticCurveTo(x, y, x + radius, y);
|
|
6164
|
+
ctx.closePath();
|
|
6165
|
+
};
|
|
6166
|
+
|
|
6167
|
+
this.nodeObjectsById.forEach((entry) => {
|
|
6168
|
+
const rect = projectNodeFrameDebugModelRect(this, entry);
|
|
6169
|
+
if (!rect) return;
|
|
6170
|
+
|
|
6171
|
+
const sourceLeft = rect.left * canvasScaleX;
|
|
6172
|
+
const sourceTop = rect.top * canvasScaleY;
|
|
6173
|
+
const sourceRight = rect.right * canvasScaleX;
|
|
6174
|
+
const sourceBottom = rect.bottom * canvasScaleY;
|
|
6175
|
+
const destLeft = ((sourceLeft - sx) / sw) * width;
|
|
6176
|
+
const destTop = ((sourceTop - sy) / sh) * height;
|
|
6177
|
+
const destRight = ((sourceRight - sx) / sw) * width;
|
|
6178
|
+
const destBottom = ((sourceBottom - sy) / sh) * height;
|
|
6179
|
+
const clippedLeft = Math.max(0, Math.min(width, destLeft));
|
|
6180
|
+
const clippedTop = Math.max(0, Math.min(height, destTop));
|
|
6181
|
+
const clippedRight = Math.max(0, Math.min(width, destRight));
|
|
6182
|
+
const clippedBottom = Math.max(0, Math.min(height, destBottom));
|
|
6183
|
+
const nodeWidth = clippedRight - clippedLeft;
|
|
6184
|
+
const nodeHeight = clippedBottom - clippedTop;
|
|
6185
|
+
if (nodeWidth < 3 || nodeHeight < 3) return;
|
|
6186
|
+
|
|
6187
|
+
const model = entry?.model || {};
|
|
6188
|
+
const style = getStyle(model.contentType ?? model.ContentType);
|
|
6189
|
+
ctx.fillStyle = style.fill;
|
|
6190
|
+
ctx.strokeStyle = style.stroke;
|
|
6191
|
+
ctx.lineWidth = Math.max(0.8, Math.min(2, Math.min(width, height) / 180));
|
|
6192
|
+
drawRoundRect(clippedLeft, clippedTop, nodeWidth, nodeHeight, Math.min(8, Math.max(2, Math.min(nodeWidth, nodeHeight) * 0.08)));
|
|
6193
|
+
ctx.fill();
|
|
6194
|
+
ctx.stroke();
|
|
6195
|
+
drawn += 1;
|
|
6196
|
+
});
|
|
6197
|
+
|
|
6198
|
+
return drawn;
|
|
6199
|
+
};
|
|
6200
|
+
|
|
6201
|
+
const projectedNodeFrameCount = drawProjectedNodeFrames();
|
|
6202
|
+
if (liveNodeCount > 0 && projectedNodeFrameCount <= 0) {
|
|
6203
|
+
return null;
|
|
6204
|
+
}
|
|
6205
|
+
|
|
6121
6206
|
if (options?.minimumVariance !== false) {
|
|
6122
6207
|
try {
|
|
6123
6208
|
const sample = ctx.getImageData(0, 0, width, height).data;
|
|
Binary file
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"mainAssemblyName": "MindExecution.Web",
|
|
3
3
|
"resources": {
|
|
4
|
-
"hash": "sha256-
|
|
4
|
+
"hash": "sha256-Ny3t+3+wMEcLBIrH8PviSLxWnIKH3h8bXWdrXi8ESDY=",
|
|
5
5
|
"fingerprinting": {
|
|
6
6
|
"Google.Protobuf.9h59ukbel7.dll": "Google.Protobuf.dll",
|
|
7
7
|
"Markdig.d1j7v41cl1.dll": "Markdig.dll",
|
|
@@ -131,7 +131,7 @@
|
|
|
131
131
|
"MindExecution.Plugins.Directory.k4hx7g84qs.dll": "MindExecution.Plugins.Directory.dll",
|
|
132
132
|
"MindExecution.Plugins.PlanMaster.kibqg6rvqh.dll": "MindExecution.Plugins.PlanMaster.dll",
|
|
133
133
|
"MindExecution.Plugins.YouTube.089r64n2hv.dll": "MindExecution.Plugins.YouTube.dll",
|
|
134
|
-
"MindExecution.Shared.
|
|
134
|
+
"MindExecution.Shared.p86iw1fhns.dll": "MindExecution.Shared.dll",
|
|
135
135
|
"MindExecution.Web.aj117i28hy.dll": "MindExecution.Web.dll",
|
|
136
136
|
"dotnet.js": "dotnet.js",
|
|
137
137
|
"dotnet.native.qc8g39g30v.js": "dotnet.native.js",
|
|
@@ -283,7 +283,7 @@
|
|
|
283
283
|
"MindExecution.Plugins.Business.asckvekct8.dll": "sha256-ujRTVA1cvwBWDAdHqxU8oyTnOyjgvsr0ynsQjjxJxcY=",
|
|
284
284
|
"MindExecution.Plugins.Concept.u9kzsgf64o.dll": "sha256-Yp38m6zHe8EBxtm480N4LfcHRpzFZRhYpr1RsCgnlK8=",
|
|
285
285
|
"MindExecution.Plugins.PlanMaster.kibqg6rvqh.dll": "sha256-NOtEHR8Y0rO8BguFvD1soa8jfB4YVQFydten0SzqBEg=",
|
|
286
|
-
"MindExecution.Shared.
|
|
286
|
+
"MindExecution.Shared.p86iw1fhns.dll": "sha256-GeQGsY17FMYu6beNS1RDR7yJ/nNgfiix6rjORzhXnCY=",
|
|
287
287
|
"MindExecution.Web.aj117i28hy.dll": "sha256-+jKjBygtNF6dsjwsyJ+O2NId2p7HeQk4rYksxd+SqPA="
|
|
288
288
|
},
|
|
289
289
|
"lazyAssembly": {
|
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=20260618-
|
|
11
|
-
<link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260618-
|
|
10
|
+
<link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260618-project-thumbnail-nodes-v622-x1" />
|
|
11
|
+
<link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260618-project-thumbnail-nodes-v622-x1" />
|
|
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 = '20260618-
|
|
582
|
+
const scriptVersion = '20260618-project-thumbnail-nodes-v622-x1';
|
|
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": "SaOJ/F0w",
|
|
3
3
|
"assets": [
|
|
4
4
|
{
|
|
5
5
|
"hash": "sha256-+CSYMcqLNTsq3VnH11jgYyOCCdxvHzL74CBmo4sCmMU=",
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
"url": "_content/MindExecution.Shared/js/marked.min.js"
|
|
79
79
|
},
|
|
80
80
|
{
|
|
81
|
-
"hash": "sha256-
|
|
81
|
+
"hash": "sha256-5pU2z888/VshyV2A52dlTj5jip67W5Bwp/HlMmzblKg=",
|
|
82
82
|
"url": "_content/MindExecution.Shared/js/mind-map-core.js"
|
|
83
83
|
},
|
|
84
84
|
{
|
|
@@ -442,8 +442,8 @@
|
|
|
442
442
|
"url": "_framework/MindExecution.Plugins.YouTube.089r64n2hv.dll"
|
|
443
443
|
},
|
|
444
444
|
{
|
|
445
|
-
"hash": "sha256-
|
|
446
|
-
"url": "_framework/MindExecution.Shared.
|
|
445
|
+
"hash": "sha256-GeQGsY17FMYu6beNS1RDR7yJ/nNgfiix6rjORzhXnCY=",
|
|
446
|
+
"url": "_framework/MindExecution.Shared.p86iw1fhns.dll"
|
|
447
447
|
},
|
|
448
448
|
{
|
|
449
449
|
"hash": "sha256-+jKjBygtNF6dsjwsyJ+O2NId2p7HeQk4rYksxd+SqPA=",
|
|
@@ -770,7 +770,7 @@
|
|
|
770
770
|
"url": "_framework/Websocket.Client.vapounvmnl.dll"
|
|
771
771
|
},
|
|
772
772
|
{
|
|
773
|
-
"hash": "sha256-
|
|
773
|
+
"hash": "sha256-txW3qdrqdJhTHyMMLK0IDsdhphqslC5BjXEhWNo5jpM=",
|
|
774
774
|
"url": "_framework/blazor.boot.json"
|
|
775
775
|
},
|
|
776
776
|
{
|
|
@@ -834,7 +834,7 @@
|
|
|
834
834
|
"url": "image-manifest.json"
|
|
835
835
|
},
|
|
836
836
|
{
|
|
837
|
-
"hash": "sha256-
|
|
837
|
+
"hash": "sha256-Yu4ksyC2qYgyh+5LJ62eR6plaNLjBTF/pRVH4shitOE=",
|
|
838
838
|
"url": "index.html"
|
|
839
839
|
},
|
|
840
840
|
{
|