@mindexec/cli 0.2.175 → 0.2.177

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.
Files changed (19) hide show
  1. package/package.json +1 -1
  2. package/server.js +74 -14
  3. package/wwwroot/_framework/MindExecution.Core.y2ui6ei1zp.dll +0 -0
  4. package/wwwroot/_framework/{MindExecution.Kernel.cmj7iee8oy.dll → MindExecution.Kernel.48nxdn0o27.dll} +0 -0
  5. package/wwwroot/_framework/MindExecution.Plugins.Admin.kylq0fxv8c.dll +0 -0
  6. package/wwwroot/_framework/{MindExecution.Plugins.Business.a3bmsg1dnh.dll → MindExecution.Plugins.Business.cuw84oaz3q.dll} +0 -0
  7. package/wwwroot/_framework/{MindExecution.Plugins.Concept.f3d7tsclst.dll → MindExecution.Plugins.Concept.u70zp9qbvo.dll} +0 -0
  8. package/wwwroot/_framework/{MindExecution.Plugins.Directory.m7ysyihlbt.dll → MindExecution.Plugins.Directory.fy4gkll08b.dll} +0 -0
  9. package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.mww9fvjh3i.dll → MindExecution.Plugins.PlanMaster.cbsobbckk1.dll} +0 -0
  10. package/wwwroot/_framework/{MindExecution.Plugins.YouTube.u159gfop7k.dll → MindExecution.Plugins.YouTube.vlwj5eytol.dll} +0 -0
  11. package/wwwroot/_framework/{MindExecution.Shared.3jnqi404jm.dll → MindExecution.Shared.bi3agtnwsf.dll} +0 -0
  12. package/wwwroot/_framework/MindExecution.Web.nev8fm9057.dll +0 -0
  13. package/wwwroot/_framework/blazor.boot.json +21 -21
  14. package/wwwroot/index.html +55 -55
  15. package/wwwroot/service-worker-assets.js +23 -23
  16. package/wwwroot/service-worker.js +1 -1
  17. package/wwwroot/_framework/MindExecution.Core.2ftvuvqu67.dll +0 -0
  18. package/wwwroot/_framework/MindExecution.Plugins.Admin.5yrzrhtmmm.dll +0 -0
  19. package/wwwroot/_framework/MindExecution.Web.5n9ivfb5ug.dll +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindexec/cli",
3
- "version": "0.2.175",
3
+ "version": "0.2.177",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
package/server.js CHANGED
@@ -3382,6 +3382,9 @@ const REMOTE_HOST_TARGET_RENEW_MS = Math.max(
3382
3382
  Number(process.env.MINDEXEC_REMOTE_HOST_TARGET_RENEW_MS || 25000) || 25000));
3383
3383
  const REMOTE_HOST_TARGET_RENEW_LOG_REPEAT_MS = 60000;
3384
3384
  const REMOTE_HOST_TARGET_WAKE_RENEW_MS = Math.max(3000, Number(process.env.MINDEXEC_REMOTE_HOST_TARGET_WAKE_RENEW_MS || 5000) || 5000);
3385
+ const REMOTE_HOST_TARGET_EXPIRED_REVIVE_MS = Math.max(
3386
+ REMOTE_HOST_TARGET_LEASE_MS * 2,
3387
+ Number(process.env.MINDEXEC_REMOTE_HOST_TARGET_EXPIRED_REVIVE_MS || (12 * 60 * 60 * 1000)) || (12 * 60 * 60 * 1000));
3385
3388
  const REMOTE_SYSTEM_RESUME_CHECK_MS = Math.max(1000, Number(process.env.MINDEXEC_REMOTE_RESUME_CHECK_MS || 5000) || 5000);
3386
3389
  const REMOTE_SYSTEM_RESUME_DRIFT_MS = Math.max(
3387
3390
  REMOTE_SYSTEM_RESUME_CHECK_MS + 5000,
@@ -5882,6 +5885,32 @@ function stopRemoteHostTargetRenew(reason = 'stopped') {
5882
5885
  });
5883
5886
  }
5884
5887
 
5888
+ function getRecoverableRemoteHostTargetNodeId(reason = 'renew') {
5889
+ const nodeId = safeRemoteAgentField(remoteHostTargetRenewState.nodeId, 128);
5890
+ if (!nodeId) {
5891
+ return '';
5892
+ }
5893
+
5894
+ const stateReason = String(remoteHostTargetRenewState.reason || '').trim().toLowerCase();
5895
+ if (/^(host-target-cleared|host-target-inactive|host-target-superseded|local-host-superseded|bridge-shutdown|disabled)$/i.test(stateReason)) {
5896
+ return '';
5897
+ }
5898
+
5899
+ const lastSuccessMs = Date.parse(remoteHostTargetRenewState.lastSuccessAt || '') || 0;
5900
+ const lastAttemptMs = Date.parse(remoteHostTargetRenewState.lastAttemptAt || '') || 0;
5901
+ const expiresMs = Date.parse(remoteHostTargetRenewState.expiresAt || '') || 0;
5902
+ const anchorMs = Math.max(lastSuccessMs, lastAttemptMs, expiresMs);
5903
+ if (!anchorMs || Date.now() - anchorMs > REMOTE_HOST_TARGET_EXPIRED_REVIVE_MS) {
5904
+ return '';
5905
+ }
5906
+
5907
+ logEvent(
5908
+ 'remote',
5909
+ `host target revive candidate ${formatKeyValue('reason', reason)} ${formatKeyValue('node', nodeId)}`,
5910
+ 'remote');
5911
+ return nodeId;
5912
+ }
5913
+
5885
5914
  function disconnectRemoteHubDevicesForResume(reason = 'system-resume') {
5886
5915
  const devices = remoteHub.listDevices();
5887
5916
  let disconnected = 0;
@@ -5907,6 +5936,8 @@ async function reconcileRemoteAfterSystemResume(trigger = 'timer-drift', driftMs
5907
5936
  try {
5908
5937
  const localHub = remoteHub.getStatus({ includeSecrets: true });
5909
5938
  const isLocalHost = localHub?.hostTargetActive === true && !!localHub.hostTargetNodeId;
5939
+ const recoverableHostNodeId = isLocalHost ? '' : getRecoverableRemoteHostTargetNodeId('system-resume');
5940
+ const shouldRenewLocalHost = isLocalHost || !!recoverableHostNodeId;
5910
5941
  const wasRegistryAgentRunning = isRemoteAgentRegistryOwned();
5911
5942
  const disconnectedDevices = isLocalHost
5912
5943
  ? disconnectRemoteHubDevicesForResume('system-resume')
@@ -5919,14 +5950,14 @@ async function reconcileRemoteAfterSystemResume(trigger = 'timer-drift', driftMs
5919
5950
  lastDetectedAt: new Date().toISOString(),
5920
5951
  lastError: '',
5921
5952
  driftMs: Math.round(Number(driftMs) || 0),
5922
- localHost: isLocalHost,
5953
+ localHost: shouldRenewLocalHost,
5923
5954
  registryAgentRestarted: wasRegistryAgentRunning,
5924
5955
  disconnectedDevices
5925
5956
  });
5926
5957
 
5927
5958
  logEvent(
5928
5959
  'remote',
5929
- `system resume detected ${formatKeyValue('trigger', trigger)} ${formatKeyValue('driftMs', Math.round(Number(driftMs) || 0))} ${formatKeyValue('host', isLocalHost ? 'yes' : 'no')} ${formatKeyValue('agent', wasRegistryAgentRunning ? 'registry' : '-')}`,
5960
+ `system resume detected ${formatKeyValue('trigger', trigger)} ${formatKeyValue('driftMs', Math.round(Number(driftMs) || 0))} ${formatKeyValue('host', shouldRenewLocalHost ? 'yes' : 'no')} ${formatKeyValue('agent', wasRegistryAgentRunning ? 'registry' : '-')}`,
5930
5961
  'remote');
5931
5962
 
5932
5963
  closeRemoteRegistryRealtime('system-resume');
@@ -5935,16 +5966,16 @@ async function reconcileRemoteAfterSystemResume(trigger = 'timer-drift', driftMs
5935
5966
  await stopRemoteAgentConnection('system-resume-reconnect', { suppressRetry: false });
5936
5967
  }
5937
5968
 
5938
- if (isLocalHost) {
5969
+ if (shouldRenewLocalHost) {
5939
5970
  updateRemoteHostTargetRenewState({
5940
5971
  status: 'waking',
5941
5972
  reason: 'system-resume',
5942
- nodeId: localHub.hostTargetNodeId,
5943
- leaseId: localHub.hostTargetLeaseId,
5944
- hostInstanceId: localHub.hostTargetHostInstanceId || localHub.hostInstanceId,
5945
- endpoint: localHub.hostTargetEndpoint,
5946
- endpointCandidates: localHub.hostTargetEndpointCandidates || [],
5947
- expiresAt: localHub.hostTargetExpiresAt,
5973
+ nodeId: localHub.hostTargetNodeId || recoverableHostNodeId,
5974
+ leaseId: localHub.hostTargetLeaseId || remoteHostTargetRenewState.leaseId,
5975
+ hostInstanceId: localHub.hostTargetHostInstanceId || localHub.hostInstanceId || remoteHostTargetRenewState.hostInstanceId,
5976
+ endpoint: localHub.hostTargetEndpoint || remoteHostTargetRenewState.endpoint,
5977
+ endpointCandidates: localHub.hostTargetEndpointCandidates || remoteHostTargetRenewState.endpointCandidates || [],
5978
+ expiresAt: localHub.hostTargetExpiresAt || remoteHostTargetRenewState.expiresAt,
5948
5979
  lastError: ''
5949
5980
  });
5950
5981
  await runRemoteHostTargetRenewOnce('system-resume', { takeover: false });
@@ -5968,7 +5999,7 @@ async function reconcileRemoteAfterSystemResume(trigger = 'timer-drift', driftMs
5968
5999
  emitBridgeEvent('RemoteSystemResumeReconciled', {
5969
6000
  trigger,
5970
6001
  driftMs: Math.round(Number(driftMs) || 0),
5971
- localHost: isLocalHost,
6002
+ localHost: shouldRenewLocalHost,
5972
6003
  registryAgentRestarted: wasRegistryAgentRunning,
5973
6004
  disconnectedDevices
5974
6005
  });
@@ -6031,20 +6062,49 @@ async function runRemoteHostTargetRenewOnce(trigger = 'timer', options = {}) {
6031
6062
  try {
6032
6063
  const currentHub = remoteHub.getStatus({ includeSecrets: true });
6033
6064
  if (currentHub?.hostTargetActive !== true || !currentHub.hostTargetNodeId) {
6034
- stopRemoteHostTargetRenew('no-local-host-target');
6035
- return serializeRemoteHostTargetRenewState();
6065
+ const recoverableNodeId = getRecoverableRemoteHostTargetNodeId(trigger);
6066
+ if (!recoverableNodeId) {
6067
+ stopRemoteHostTargetRenew('no-local-host-target');
6068
+ return serializeRemoteHostTargetRenewState();
6069
+ }
6070
+
6071
+ updateRemoteHostTargetRenewState({
6072
+ status: 'reviving',
6073
+ reason: 'expired-local-host-target',
6074
+ nodeId: recoverableNodeId,
6075
+ lastAttemptAt: attemptedAt,
6076
+ lastError: ''
6077
+ });
6078
+ logRemoteHostTargetRenew('reviving', 'expired-local-host-target', remoteHostTargetRenewState.endpoint);
6079
+ const revived = remoteHub.setHostTarget({
6080
+ enabled: true,
6081
+ nodeId: recoverableNodeId,
6082
+ leaseMs: REMOTE_HOST_TARGET_LEASE_MS
6083
+ });
6084
+ if (revived?.ok !== true || revived?.active !== true) {
6085
+ updateRemoteHostTargetRenewState({
6086
+ status: 'error',
6087
+ reason: revived?.error || 'expired-local-host-revive-failed',
6088
+ nodeId: recoverableNodeId,
6089
+ lastAttemptAt: attemptedAt,
6090
+ lastError: revived?.error || 'expired-local-host-revive-failed'
6091
+ });
6092
+ scheduleRemoteHostTargetRenew(REMOTE_REGISTRY_FOLLOWER_FAST_RETRY_MS, 'revive-failed');
6093
+ return serializeRemoteHostTargetRenewState();
6094
+ }
6036
6095
  }
6037
6096
 
6097
+ const hostStatus = remoteHub.getStatus({ includeSecrets: true });
6038
6098
  const renewed = remoteHub.setHostTarget({
6039
6099
  enabled: true,
6040
- nodeId: currentHub.hostTargetNodeId,
6100
+ nodeId: hostStatus.hostTargetNodeId,
6041
6101
  leaseMs: REMOTE_HOST_TARGET_LEASE_MS
6042
6102
  });
6043
6103
  if (renewed?.ok !== true || renewed?.active !== true) {
6044
6104
  updateRemoteHostTargetRenewState({
6045
6105
  status: 'error',
6046
6106
  reason: renewed?.error || 'local-host-renew-failed',
6047
- nodeId: currentHub.hostTargetNodeId,
6107
+ nodeId: hostStatus.hostTargetNodeId,
6048
6108
  lastAttemptAt: attemptedAt,
6049
6109
  lastError: renewed?.error || 'local-host-renew-failed'
6050
6110
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "mainAssemblyName": "MindExecution.Web",
3
3
  "resources": {
4
- "hash": "sha256-4/Ti1YIaO2owKQKrd/GowgDqkv9GsYSi5JCY3HQsJ3w=",
4
+ "hash": "sha256-J42cMyhEPDUI5FMrpZaxLnKM8dAvsG124jdCZIbo40o=",
5
5
  "fingerprinting": {
6
6
  "Google.Protobuf.9h59ukbel7.dll": "Google.Protobuf.dll",
7
7
  "Markdig.d1j7v41cl1.dll": "Markdig.dll",
@@ -123,16 +123,16 @@
123
123
  "System.brmz7yk5qh.dll": "System.dll",
124
124
  "netstandard.yvr3prsx0x.dll": "netstandard.dll",
125
125
  "System.Private.CoreLib.c1dbswx1b2.dll": "System.Private.CoreLib.dll",
126
- "MindExecution.Core.2ftvuvqu67.dll": "MindExecution.Core.dll",
127
- "MindExecution.Kernel.cmj7iee8oy.dll": "MindExecution.Kernel.dll",
128
- "MindExecution.Plugins.Admin.5yrzrhtmmm.dll": "MindExecution.Plugins.Admin.dll",
129
- "MindExecution.Plugins.Business.a3bmsg1dnh.dll": "MindExecution.Plugins.Business.dll",
130
- "MindExecution.Plugins.Concept.f3d7tsclst.dll": "MindExecution.Plugins.Concept.dll",
131
- "MindExecution.Plugins.Directory.m7ysyihlbt.dll": "MindExecution.Plugins.Directory.dll",
132
- "MindExecution.Plugins.PlanMaster.mww9fvjh3i.dll": "MindExecution.Plugins.PlanMaster.dll",
133
- "MindExecution.Plugins.YouTube.u159gfop7k.dll": "MindExecution.Plugins.YouTube.dll",
134
- "MindExecution.Shared.3jnqi404jm.dll": "MindExecution.Shared.dll",
135
- "MindExecution.Web.5n9ivfb5ug.dll": "MindExecution.Web.dll",
126
+ "MindExecution.Core.y2ui6ei1zp.dll": "MindExecution.Core.dll",
127
+ "MindExecution.Kernel.48nxdn0o27.dll": "MindExecution.Kernel.dll",
128
+ "MindExecution.Plugins.Admin.kylq0fxv8c.dll": "MindExecution.Plugins.Admin.dll",
129
+ "MindExecution.Plugins.Business.cuw84oaz3q.dll": "MindExecution.Plugins.Business.dll",
130
+ "MindExecution.Plugins.Concept.u70zp9qbvo.dll": "MindExecution.Plugins.Concept.dll",
131
+ "MindExecution.Plugins.Directory.fy4gkll08b.dll": "MindExecution.Plugins.Directory.dll",
132
+ "MindExecution.Plugins.PlanMaster.cbsobbckk1.dll": "MindExecution.Plugins.PlanMaster.dll",
133
+ "MindExecution.Plugins.YouTube.vlwj5eytol.dll": "MindExecution.Plugins.YouTube.dll",
134
+ "MindExecution.Shared.bi3agtnwsf.dll": "MindExecution.Shared.dll",
135
+ "MindExecution.Web.nev8fm9057.dll": "MindExecution.Web.dll",
136
136
  "dotnet.js": "dotnet.js",
137
137
  "dotnet.native.qc8g39g30v.js": "dotnet.native.js",
138
138
  "dotnet.native.boem75ye5i.wasm": "dotnet.native.wasm",
@@ -278,18 +278,18 @@
278
278
  "System.Xml.XDocument.sn51jas17n.dll": "sha256-GNI2kFgFmPTwzuzwUn8gxK+AzGLUWRJFdg9JzIbrybQ=",
279
279
  "System.brmz7yk5qh.dll": "sha256-CfM2miyj1KHApFmqMdLYWio3S/jrdON2pW9Xr2nTwlo=",
280
280
  "netstandard.yvr3prsx0x.dll": "sha256-EksNn8Luo4bOWqJ6X7dIe9qG9oOqwOVzjH2xYyMNi+E=",
281
- "MindExecution.Core.2ftvuvqu67.dll": "sha256-roAm0R9R5EcvDmkddrRfPBxzes/NOMAywwP1kFGVHvM=",
282
- "MindExecution.Kernel.cmj7iee8oy.dll": "sha256-FIkseVYemh0/JXJjh3ylkXh1MdTOoIke4SAFlsdI/3E=",
283
- "MindExecution.Plugins.Business.a3bmsg1dnh.dll": "sha256-pg1rtZgWTHpigzwMuI6jMBjEyQA8EeCfjdkKJY0BYos=",
284
- "MindExecution.Plugins.Concept.f3d7tsclst.dll": "sha256-9ZTJEzv8S4CJ5DVIKEOIZTCa4qkDnQkSeszASZi4DqY=",
285
- "MindExecution.Plugins.PlanMaster.mww9fvjh3i.dll": "sha256-Kjbjzz2jABPuZFpu9bmODJM0yV90nHoQDSyr0cuLZNk=",
286
- "MindExecution.Shared.3jnqi404jm.dll": "sha256-YSThipxEHRmLDgxd6q31JBT+0FIUo3EoCFM96CHgEpY=",
287
- "MindExecution.Web.5n9ivfb5ug.dll": "sha256-r/Md6yuTERf4U5gZcpwpdtljZ5U8uEzB/iKBtbOkrPE="
281
+ "MindExecution.Core.y2ui6ei1zp.dll": "sha256-NnnP6h5xkSHjajgJ4B7IkMS/JYM03vzr+7Yc0jZdS60=",
282
+ "MindExecution.Kernel.48nxdn0o27.dll": "sha256-LCMiilpVJwnGj5g7tZgvDhrsAe99THu52bOhpDgF7nA=",
283
+ "MindExecution.Plugins.Business.cuw84oaz3q.dll": "sha256-vGMvEiUSNaG7Ct1Av7BHo87QEibrshiN5Y1/YvbTnhs=",
284
+ "MindExecution.Plugins.Concept.u70zp9qbvo.dll": "sha256-2shsnRsIbEhl8nk8mJIzUgV/oXmvxNKoe/xcxaZ3s0c=",
285
+ "MindExecution.Plugins.PlanMaster.cbsobbckk1.dll": "sha256-WFyqQ9i6a7lHkp1gJEF8/ZYcRaGkqf64FmlLPD3AJZ8=",
286
+ "MindExecution.Shared.bi3agtnwsf.dll": "sha256-vbsv8/SRhBHipHJYwc1X4lnat8FSgTR2OIP+Nfdx/4Q=",
287
+ "MindExecution.Web.nev8fm9057.dll": "sha256-AZhG5e+nE5LC2BKQHBTDdqUUdHddruUQp4hR/WvOKUo="
288
288
  },
289
289
  "lazyAssembly": {
290
- "MindExecution.Plugins.Admin.5yrzrhtmmm.dll": "sha256-Padus/RMWHdWsMVmnTLAfPB0wwRhGx5hGfEYfDbjEvg=",
291
- "MindExecution.Plugins.Directory.m7ysyihlbt.dll": "sha256-zim6x3zNF7DoFE2KXc1CLnsJ46NvM5s8VAZMdq/7fZY=",
292
- "MindExecution.Plugins.YouTube.u159gfop7k.dll": "sha256-LhJb8ig6PmbvtQ2hgOocBILOrSwvHQr/+AEZwtgh4ZI="
290
+ "MindExecution.Plugins.Admin.kylq0fxv8c.dll": "sha256-VKLartecp6S319WtR/dhvYXB4gCAkjaYx/mnIYe2VmY=",
291
+ "MindExecution.Plugins.Directory.fy4gkll08b.dll": "sha256-F9XrCtJY1RA/29pTV8bUURp/Ak1q/XJ739eFXJfVHwo=",
292
+ "MindExecution.Plugins.YouTube.vlwj5eytol.dll": "sha256-06gMhnZ17M8Hsao/Tyc7+iSn/dD2T1K1i2y03WLkGoI="
293
293
  }
294
294
  },
295
295
  "cacheBootResources": true,
@@ -1,17 +1,17 @@
1
- <!DOCTYPE html>
1
+ <!DOCTYPE html>
2
2
  <html lang="en">
3
3
 
4
4
  <head>
5
5
  <meta charset="utf-8" />
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
- <title>MindExec | Business Execution OS for solo builders</title>
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
- <base href="/" />
10
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260617-business-execution-os-v604" />
11
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260617-business-execution-os-v604" />
12
- <!-- ?쇄뼹??Font Awesome (local) ?쇄뼹??-->
7
+ <title>MindExec | Business Execution OS for solo builders</title>
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
+ <base href="/" />
10
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260617-smart-managed-margin-v606" />
11
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260617-smart-managed-margin-v606" />
12
+ <!-- ?�▼??Font Awesome (local) ?�▼??-->
13
13
  <link rel="stylesheet" href="_content/MindExecution.Shared/lib/font-awesome/css/all.min.css" />
14
- <!-- ?꿎뼯??-->
14
+ <!-- ?�▲??-->
15
15
  <style>
16
16
  #app {
17
17
  min-height: 100vh;
@@ -95,10 +95,10 @@
95
95
  <div id="app-container">
96
96
  <div id="app">
97
97
  <article class="app-static-fallback" id="app-static-fallback">
98
- <div class="app-static-fallback__eyebrow">MindExec</div>
99
- <h1>MindExec</h1>
100
- <p>Turn ideas into revenue execution. MindExec is a Business Execution OS that moves serious work into MindCanvas, where context, AI Tasks, execution Skills, media, and results stay connected.</p>
101
- <p><a href="/mindcanvas">Open MindCanvas</a> | <a href="/pricing">See pricing</a> | <a href="/tools">Browse free tools</a></p>
98
+ <div class="app-static-fallback__eyebrow">MindExec</div>
99
+ <h1>MindExec</h1>
100
+ <p>Turn ideas into revenue execution. MindExec is a Business Execution OS that moves serious work into MindCanvas, where context, AI Tasks, execution Skills, media, and results stay connected.</p>
101
+ <p><a href="/mindcanvas">Open MindCanvas</a> | <a href="/pricing">See pricing</a> | <a href="/tools">Browse free tools</a></p>
102
102
  <noscript>
103
103
  <p>JavaScript is required for the interactive tool experience.</p>
104
104
  </noscript>
@@ -180,7 +180,7 @@
180
180
  function adjustTextareaHeight(element) {
181
181
  if (!element) return;
182
182
 
183
- // ?쇄뼹??[Change] Add jitter-prevention logic ?쇄뼹??
183
+ // ?�▼??[Change] Add jitter-prevention logic ?�▼??
184
184
  // Compare the previous text length. When content grows, skip the 'auto' reset.
185
185
  // Only reset to 'auto' when shrinking (during deletion).
186
186
  const currentLength = element.value.length;
@@ -191,7 +191,7 @@
191
191
  }
192
192
 
193
193
  element.dataset.prevLength = currentLength; // store current length
194
- // ?꿎뼯??[Change] ?꿎뼯??
194
+ // ?�▲??[Change] ?�▲??
195
195
 
196
196
  const computedStyles = window.getComputedStyle(element);
197
197
  const lineHeight = parseFloat(computedStyles.lineHeight || '24') || 24;
@@ -225,39 +225,39 @@
225
225
  element.removeEventListener('keydown', element.__mindexecEnterHandler);
226
226
  }
227
227
 
228
- const handleKeyDown = (e) => {
229
- if (e.key === 'Enter') {
230
- if (e.shiftKey) {
231
- return;
232
- }
233
-
234
- if (e.repeat || e.isComposing || e.keyCode === 229) {
235
- return;
236
- }
237
-
238
- e.preventDefault();
239
- const now = performance.now();
240
- if (element.__mindexecLastEnterAt && now - element.__mindexecLastEnterAt < 650) {
241
- return;
242
- }
243
-
244
- const promptSnapshot = element.value || '';
245
- if (!promptSnapshot.trim()) {
246
- return;
247
- }
248
-
249
- element.__mindexecLastEnterAt = now;
250
- const submitId = `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;
251
- element.value = '';
252
- element.dispatchEvent(new Event('input', { bubbles: true }));
253
- resetTextareaHeight(element);
254
-
255
- if (dotNetRef && dotNetRef.invokeMethodAsync) {
256
- dotNetRef.invokeMethodAsync('OnGlobalInputEnterPressed', promptSnapshot, submitId)
257
- .catch((err) => console.warn('[GlobalInput] Enter submit failed:', err));
258
- }
259
- }
260
- };
228
+ const handleKeyDown = (e) => {
229
+ if (e.key === 'Enter') {
230
+ if (e.shiftKey) {
231
+ return;
232
+ }
233
+
234
+ if (e.repeat || e.isComposing || e.keyCode === 229) {
235
+ return;
236
+ }
237
+
238
+ e.preventDefault();
239
+ const now = performance.now();
240
+ if (element.__mindexecLastEnterAt && now - element.__mindexecLastEnterAt < 650) {
241
+ return;
242
+ }
243
+
244
+ const promptSnapshot = element.value || '';
245
+ if (!promptSnapshot.trim()) {
246
+ return;
247
+ }
248
+
249
+ element.__mindexecLastEnterAt = now;
250
+ const submitId = `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;
251
+ element.value = '';
252
+ element.dispatchEvent(new Event('input', { bubbles: true }));
253
+ resetTextareaHeight(element);
254
+
255
+ if (dotNetRef && dotNetRef.invokeMethodAsync) {
256
+ dotNetRef.invokeMethodAsync('OnGlobalInputEnterPressed', promptSnapshot, submitId)
257
+ .catch((err) => console.warn('[GlobalInput] Enter submit failed:', err));
258
+ }
259
+ }
260
+ };
261
261
 
262
262
  element.__mindexecEnterHandler = handleKeyDown;
263
263
  element.addEventListener('keydown', handleKeyDown);
@@ -284,11 +284,11 @@
284
284
  // Prevent default page-level DnD behavior
285
285
  document.addEventListener('dragover', (e) => {
286
286
  e.preventDefault();
287
- // ?쇄뼹??[Change] Remove/avoid stopPropagation (do not disrupt event flow) ?쇄뼹??
287
+ // ?�▼??[Change] Remove/avoid stopPropagation (do not disrupt event flow) ?�▼??
288
288
  // e.stopPropagation();
289
- // ?꿎뼯??[Change] ?꿎뼯??
289
+ // ?�▲??[Change] ?�▲??
290
290
 
291
- // ?쇄뼹??[Change] Default is 'none', but only apply when not handled by children ?쇄뼹??
291
+ // ?�▼??[Change] Default is 'none', but only apply when not handled by children ?�▼??
292
292
  // (If MindMapDnD handles it, this code won't run or will be ignored)
293
293
  // e.dataTransfer.dropEffect = 'none';
294
294
  }, false);
@@ -428,7 +428,7 @@
428
428
  window.__matchesMarketingToolHost(host, location.host || '')
429
429
  );
430
430
  </script>
431
- <!-- ?쇄뼹??[Upgrade] Three.js r168 via ESM ?쇄뼹??-->
431
+ <!-- ?�▼??[Upgrade] Three.js r168 via ESM ?�▼??-->
432
432
  <script type="importmap">
433
433
  {
434
434
  "imports": {
@@ -579,7 +579,7 @@
579
579
  }
580
580
 
581
581
  const base = '_content/MindExecution.Shared/js/';
582
- const scriptVersion = '20260617-business-execution-os-v604';
582
+ const scriptVersion = '20260617-smart-managed-margin-v606';
583
583
  const scriptUrl = (script) => `${base}${script}?v=${scriptVersion}`;
584
584
  console.log(`[Script Loader] Shared JS version: ${scriptVersion}`);
585
585
  const criticalScripts = [
@@ -590,7 +590,7 @@
590
590
  'background-themes.js',
591
591
  'mind-map-logic-workers.js',
592
592
  // Troika removed
593
- 'texture-worker-manager.js', // ??Web Worker ?띿뒪泥??앹꽦
593
+ 'texture-worker-manager.js', // ??Web Worker ?�스�??�성
594
594
  'mind-map-texture-factory.js',
595
595
  'mind-map-glow-shader.js', // ??SDF Glow (no textures, GPU only)
596
596
  'mind-map-css3d-manager.js',
@@ -603,7 +603,7 @@
603
603
  'mind-map-interactions.js',
604
604
  'mind-map-dnd.js',
605
605
  'mind-map-lod-renderer.js',
606
- 'mind-map-text-lod-system.js', // ??Text LOD ?쒖뒪??(?숈쟻 ?띿뒪泥??덉쭏)
606
+ 'mind-map-text-lod-system.js', // ??Text LOD ?�스??(?�적 ?�스�??�질)
607
607
  'mind-map-core.js',
608
608
  'mindmap-toolbar.js',
609
609
  'token-manager.js',
@@ -722,7 +722,7 @@
722
722
  window.showBlazorBootError('The page could not finish loading. Reload and try again.');
723
723
  });
724
724
  </script>
725
- <!-- ?꿎뼯??[Upgrade] ?꿎뼯??-->
725
+ <!-- ?�▲??[Upgrade] ?�▲??-->
726
726
  </body>
727
727
 
728
728
  </html>
@@ -1,5 +1,5 @@
1
1
  self.assetsManifest = {
2
- "version": "mIirfOBr",
2
+ "version": "TyBXbpiz",
3
3
  "assets": [
4
4
  {
5
5
  "hash": "sha256-+CSYMcqLNTsq3VnH11jgYyOCCdxvHzL74CBmo4sCmMU=",
@@ -410,44 +410,44 @@
410
410
  "url": "_framework/MimeMapping.og9ys58ylm.dll"
411
411
  },
412
412
  {
413
- "hash": "sha256-roAm0R9R5EcvDmkddrRfPBxzes/NOMAywwP1kFGVHvM=",
414
- "url": "_framework/MindExecution.Core.2ftvuvqu67.dll"
413
+ "hash": "sha256-NnnP6h5xkSHjajgJ4B7IkMS/JYM03vzr+7Yc0jZdS60=",
414
+ "url": "_framework/MindExecution.Core.y2ui6ei1zp.dll"
415
415
  },
416
416
  {
417
- "hash": "sha256-FIkseVYemh0/JXJjh3ylkXh1MdTOoIke4SAFlsdI/3E=",
418
- "url": "_framework/MindExecution.Kernel.cmj7iee8oy.dll"
417
+ "hash": "sha256-LCMiilpVJwnGj5g7tZgvDhrsAe99THu52bOhpDgF7nA=",
418
+ "url": "_framework/MindExecution.Kernel.48nxdn0o27.dll"
419
419
  },
420
420
  {
421
- "hash": "sha256-Padus/RMWHdWsMVmnTLAfPB0wwRhGx5hGfEYfDbjEvg=",
422
- "url": "_framework/MindExecution.Plugins.Admin.5yrzrhtmmm.dll"
421
+ "hash": "sha256-VKLartecp6S319WtR/dhvYXB4gCAkjaYx/mnIYe2VmY=",
422
+ "url": "_framework/MindExecution.Plugins.Admin.kylq0fxv8c.dll"
423
423
  },
424
424
  {
425
- "hash": "sha256-pg1rtZgWTHpigzwMuI6jMBjEyQA8EeCfjdkKJY0BYos=",
426
- "url": "_framework/MindExecution.Plugins.Business.a3bmsg1dnh.dll"
425
+ "hash": "sha256-vGMvEiUSNaG7Ct1Av7BHo87QEibrshiN5Y1/YvbTnhs=",
426
+ "url": "_framework/MindExecution.Plugins.Business.cuw84oaz3q.dll"
427
427
  },
428
428
  {
429
- "hash": "sha256-9ZTJEzv8S4CJ5DVIKEOIZTCa4qkDnQkSeszASZi4DqY=",
430
- "url": "_framework/MindExecution.Plugins.Concept.f3d7tsclst.dll"
429
+ "hash": "sha256-2shsnRsIbEhl8nk8mJIzUgV/oXmvxNKoe/xcxaZ3s0c=",
430
+ "url": "_framework/MindExecution.Plugins.Concept.u70zp9qbvo.dll"
431
431
  },
432
432
  {
433
- "hash": "sha256-zim6x3zNF7DoFE2KXc1CLnsJ46NvM5s8VAZMdq/7fZY=",
434
- "url": "_framework/MindExecution.Plugins.Directory.m7ysyihlbt.dll"
433
+ "hash": "sha256-F9XrCtJY1RA/29pTV8bUURp/Ak1q/XJ739eFXJfVHwo=",
434
+ "url": "_framework/MindExecution.Plugins.Directory.fy4gkll08b.dll"
435
435
  },
436
436
  {
437
- "hash": "sha256-Kjbjzz2jABPuZFpu9bmODJM0yV90nHoQDSyr0cuLZNk=",
438
- "url": "_framework/MindExecution.Plugins.PlanMaster.mww9fvjh3i.dll"
437
+ "hash": "sha256-WFyqQ9i6a7lHkp1gJEF8/ZYcRaGkqf64FmlLPD3AJZ8=",
438
+ "url": "_framework/MindExecution.Plugins.PlanMaster.cbsobbckk1.dll"
439
439
  },
440
440
  {
441
- "hash": "sha256-LhJb8ig6PmbvtQ2hgOocBILOrSwvHQr/+AEZwtgh4ZI=",
442
- "url": "_framework/MindExecution.Plugins.YouTube.u159gfop7k.dll"
441
+ "hash": "sha256-06gMhnZ17M8Hsao/Tyc7+iSn/dD2T1K1i2y03WLkGoI=",
442
+ "url": "_framework/MindExecution.Plugins.YouTube.vlwj5eytol.dll"
443
443
  },
444
444
  {
445
- "hash": "sha256-YSThipxEHRmLDgxd6q31JBT+0FIUo3EoCFM96CHgEpY=",
446
- "url": "_framework/MindExecution.Shared.3jnqi404jm.dll"
445
+ "hash": "sha256-vbsv8/SRhBHipHJYwc1X4lnat8FSgTR2OIP+Nfdx/4Q=",
446
+ "url": "_framework/MindExecution.Shared.bi3agtnwsf.dll"
447
447
  },
448
448
  {
449
- "hash": "sha256-r/Md6yuTERf4U5gZcpwpdtljZ5U8uEzB/iKBtbOkrPE=",
450
- "url": "_framework/MindExecution.Web.5n9ivfb5ug.dll"
449
+ "hash": "sha256-AZhG5e+nE5LC2BKQHBTDdqUUdHddruUQp4hR/WvOKUo=",
450
+ "url": "_framework/MindExecution.Web.nev8fm9057.dll"
451
451
  },
452
452
  {
453
453
  "hash": "sha256-IsZJ91/OW+fHzNqIgEc7Y072ns8z9dGritiSyvR9Wgc=",
@@ -770,7 +770,7 @@
770
770
  "url": "_framework/Websocket.Client.vapounvmnl.dll"
771
771
  },
772
772
  {
773
- "hash": "sha256-df9rWSDaHl414SYHZa7SrRfbkQMJBJ2/SvoEz7jZ0BY=",
773
+ "hash": "sha256-VzTy0MB++MzxH8769g4kft9KyFol6O8mnCgOtY9xtn0=",
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-a9d5TwibgvTP1dMLk0k50u9Gcj1DArMoZAK+cCYOViY=",
837
+ "hash": "sha256-zsAmcmUA5PZaoEXBiRqzPPmopDpFc+Hkz2Lq+vMpk3U=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: mIirfOBr */
1
+ /* Manifest version: TyBXbpiz */
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