@mindexec/cli 0.2.428 → 0.2.430

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 (74) hide show
  1. package/package.json +1 -1
  2. package/remote-fast/osx-arm64/mindexec-remote-fast.dll +0 -0
  3. package/remote-fast/osx-x64/mindexec-remote-fast.dll +0 -0
  4. package/remote-fast/win-x64/mindexec-remote-fast.dll +0 -0
  5. package/wwwroot/_content/MindExecution.Shared/css/app.css +1 -1
  6. package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-manager.js +280 -39
  7. package/wwwroot/_content/MindExecution.Shared/js/mind-map-interactions.js +109 -69
  8. package/wwwroot/_content/MindExecution.Shared/js/mind-map-menu-manager.js +20 -1
  9. package/wwwroot/_content/MindExecution.Shared/js/mind-map-nodes.js +129 -1
  10. package/wwwroot/_framework/MessagePack.7vlan1azj0.dll +0 -0
  11. package/wwwroot/_framework/{MessagePack.Annotations.l6qv48kgpt.dll → MessagePack.Annotations.py0sy1kn1f.dll} +0 -0
  12. package/wwwroot/_framework/{Microsoft.AspNetCore.Authorization.k7dsih5y5g.dll → Microsoft.AspNetCore.Authorization.htf46vkphd.dll} +0 -0
  13. package/wwwroot/_framework/Microsoft.AspNetCore.Components.933rwrwkzt.dll +0 -0
  14. package/wwwroot/_framework/{Microsoft.AspNetCore.Components.Authorization.iycd6unprw.dll → Microsoft.AspNetCore.Components.Authorization.tt4qeyggd5.dll} +0 -0
  15. package/wwwroot/_framework/{Microsoft.AspNetCore.Components.Web.487u3twia4.dll → Microsoft.AspNetCore.Components.Web.2s8gqxkpdl.dll} +0 -0
  16. package/wwwroot/_framework/{Microsoft.AspNetCore.Components.WebAssembly.d0gcnmlxxz.dll → Microsoft.AspNetCore.Components.WebAssembly.sarmn45nm8.dll} +0 -0
  17. package/wwwroot/_framework/{Microsoft.AspNetCore.Metadata.h4yevl9adi.dll → Microsoft.AspNetCore.Metadata.6782hrb6zt.dll} +0 -0
  18. package/wwwroot/_framework/Microsoft.Data.Sqlite.0gpx20ox73.dll +0 -0
  19. package/wwwroot/_framework/{Microsoft.EntityFrameworkCore.Abstractions.gocudnvz7b.dll → Microsoft.EntityFrameworkCore.Abstractions.8kg0ha5f3s.dll} +0 -0
  20. package/wwwroot/_framework/Microsoft.EntityFrameworkCore.Relational.iuncmsap8z.dll +0 -0
  21. package/wwwroot/_framework/Microsoft.EntityFrameworkCore.Sqlite.vsalww6xiy.dll +0 -0
  22. package/wwwroot/_framework/Microsoft.EntityFrameworkCore.xmbscya80j.dll +0 -0
  23. package/wwwroot/_framework/{Microsoft.Extensions.Caching.Abstractions.364t4jh3zz.dll → Microsoft.Extensions.Caching.Abstractions.6w6jliyj60.dll} +0 -0
  24. package/wwwroot/_framework/{Microsoft.Extensions.Caching.Memory.izlxhpzosu.dll → Microsoft.Extensions.Caching.Memory.puhvxafgju.dll} +0 -0
  25. package/wwwroot/_framework/{Microsoft.Extensions.Configuration.Json.duvlngw8i0.dll → Microsoft.Extensions.Configuration.Json.7fo28u9lzj.dll} +0 -0
  26. package/wwwroot/_framework/{Microsoft.Extensions.Configuration.8zq7hh41o7.dll → Microsoft.Extensions.Configuration.rczgmasvw2.dll} +0 -0
  27. package/wwwroot/_framework/{Microsoft.Extensions.DependencyInjection.n4tg99oy8l.dll → Microsoft.Extensions.DependencyInjection.8i0jefgzgz.dll} +0 -0
  28. package/wwwroot/_framework/{Microsoft.Extensions.DependencyInjection.Abstractions.t2hh9kvx0o.dll → Microsoft.Extensions.DependencyInjection.Abstractions.bmy2ykf9d2.dll} +0 -0
  29. package/wwwroot/_framework/{Microsoft.Extensions.DependencyModel.h0d06ixk3e.dll → Microsoft.Extensions.DependencyModel.y69407g5h0.dll} +0 -0
  30. package/wwwroot/_framework/{Microsoft.Extensions.Logging.Abstractions.rl32bkx2sd.dll → Microsoft.Extensions.Logging.Abstractions.xn41li608u.dll} +0 -0
  31. package/wwwroot/_framework/{Microsoft.Extensions.Logging.dlht1xei0t.dll → Microsoft.Extensions.Logging.sayb2u55jg.dll} +0 -0
  32. package/wwwroot/_framework/{Microsoft.Extensions.Options.qeunebioml.dll → Microsoft.Extensions.Options.iffq34v2x9.dll} +0 -0
  33. package/wwwroot/_framework/{Microsoft.JSInterop.WebAssembly.ryia5gxiad.dll → Microsoft.JSInterop.WebAssembly.rlz6wrl50x.dll} +0 -0
  34. package/wwwroot/_framework/{Microsoft.JSInterop.ew9vz9o332.dll → Microsoft.JSInterop.k3pogql4x4.dll} +0 -0
  35. package/wwwroot/_framework/{MindExecution.Core.fi1okngj1v.dll → MindExecution.Core.808jj176e1.dll} +0 -0
  36. package/wwwroot/_framework/{MindExecution.Kernel.88cfrq3n6f.dll → MindExecution.Kernel.75hxk08tt0.dll} +0 -0
  37. package/wwwroot/_framework/{MindExecution.Plugins.Admin.j8r53ny1yk.dll → MindExecution.Plugins.Admin.0zkmk8wahq.dll} +0 -0
  38. package/wwwroot/_framework/{MindExecution.Plugins.Business.dxnr51rpko.dll → MindExecution.Plugins.Business.vyw3769hrw.dll} +0 -0
  39. package/wwwroot/_framework/{MindExecution.Plugins.Concept.5wy4pksmui.dll → MindExecution.Plugins.Concept.hdpod01n2v.dll} +0 -0
  40. package/wwwroot/_framework/{MindExecution.Plugins.Directory.8on0qz60kp.dll → MindExecution.Plugins.Directory.jtw9q1dm9n.dll} +0 -0
  41. package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.0fb3d2by4x.dll → MindExecution.Plugins.PlanMaster.bcxkqs35nn.dll} +0 -0
  42. package/wwwroot/_framework/{MindExecution.Plugins.YouTube.8k0sthce42.dll → MindExecution.Plugins.YouTube.gg4bv7zo0e.dll} +0 -0
  43. package/wwwroot/_framework/{MindExecution.Shared.5azabuayvq.dll → MindExecution.Shared.acb35gyigd.dll} +0 -0
  44. package/wwwroot/_framework/{MindExecution.Web.d8y80arq4m.dll → MindExecution.Web.6grqlsq22z.dll} +0 -0
  45. package/wwwroot/_framework/SQLitePCLRaw.batteries_v2.sfbkwlzomg.dll +0 -0
  46. package/wwwroot/_framework/SQLitePCLRaw.core.uwwith8gy4.dll +0 -0
  47. package/wwwroot/_framework/SQLitePCLRaw.provider.e_sqlite3.48c2jqzyip.dll +0 -0
  48. package/wwwroot/_framework/{System.Memory.1k78n7wdxb.dll → System.Memory.l1cfybi1j0.dll} +0 -0
  49. package/wwwroot/_framework/{System.Numerics.Tensors.0c7z4mt3on.dll → System.Numerics.Tensors.dsa4b5t80k.dll} +0 -0
  50. package/wwwroot/_framework/System.Private.CoreLib.g6ztz7cmo2.dll +0 -0
  51. package/wwwroot/_framework/System.Runtime.v0r22684n1.dll +0 -0
  52. package/wwwroot/_framework/blazor.boot.json +91 -93
  53. package/wwwroot/_framework/blazor.webassembly.js +1 -1
  54. package/wwwroot/_framework/dotnet.native.566r55w3xu.js +16 -0
  55. package/wwwroot/_framework/dotnet.native.x6q5aixc38.wasm +0 -0
  56. package/wwwroot/_framework/netstandard.b50t77veor.dll +0 -0
  57. package/wwwroot/index.html +2 -2
  58. package/wwwroot/service-worker-assets.js +101 -105
  59. package/wwwroot/service-worker.js +1 -1
  60. package/wwwroot/_framework/MessagePack.eqoptzx9d5.dll +0 -0
  61. package/wwwroot/_framework/Microsoft.AspNetCore.Components.6nyje9sa0g.dll +0 -0
  62. package/wwwroot/_framework/Microsoft.Data.Sqlite.jdlxgv2jtg.dll +0 -0
  63. package/wwwroot/_framework/Microsoft.EntityFrameworkCore.4gjazp7kjf.dll +0 -0
  64. package/wwwroot/_framework/Microsoft.EntityFrameworkCore.Relational.lt4rsvinuo.dll +0 -0
  65. package/wwwroot/_framework/Microsoft.EntityFrameworkCore.Sqlite.69luj0fa9r.dll +0 -0
  66. package/wwwroot/_framework/SQLitePCLRaw.batteries_v2.rrd1nzawpp.dll +0 -0
  67. package/wwwroot/_framework/SQLitePCLRaw.core.1dxloztpfz.dll +0 -0
  68. package/wwwroot/_framework/SQLitePCLRaw.provider.e_sqlite3.oekyzl53i1.dll +0 -0
  69. package/wwwroot/_framework/System.Private.CoreLib.c1dbswx1b2.dll +0 -0
  70. package/wwwroot/_framework/System.Runtime.InteropServices.RuntimeInformation.l5rk496q70.dll +0 -0
  71. package/wwwroot/_framework/System.Runtime.h9cduidfkh.dll +0 -0
  72. package/wwwroot/_framework/dotnet.native.boem75ye5i.wasm +0 -0
  73. package/wwwroot/_framework/dotnet.native.qc8g39g30v.js +0 -16
  74. package/wwwroot/_framework/netstandard.yvr3prsx0x.dll +0 -0
@@ -776,9 +776,17 @@ window.MindMapInteractions = (function () {
776
776
  return agentId !== undefined && agentId !== null && String(agentId) !== '';
777
777
  }
778
778
 
779
+ function isBusinessAutomationNode(target) {
780
+ return getNodeSemanticType(target) === 'BusinessAutomationNode';
781
+ }
782
+
779
783
  function isInlineEditableNode(target) {
780
784
  const contentType = getNodeContentType(target);
781
- return contentType === 'note' || contentType === 'memo' || contentType === 'code' || isAgentNode(target);
785
+ return contentType === 'note'
786
+ || contentType === 'memo'
787
+ || contentType === 'code'
788
+ || isAgentNode(target)
789
+ || isBusinessAutomationNode(target);
782
790
  }
783
791
 
784
792
  function isReadOnlyTextSelectionNode(target) {
@@ -862,21 +870,32 @@ window.MindMapInteractions = (function () {
862
870
  const label = isAgentNode(nodeEntry) ? 'agent' : contentType;
863
871
  console.log(`[Interactions] Second click on ${label} node. Entering edit mode.`);
864
872
 
865
- if (window.mindMap?.editNode) {
866
- window.mindMap.editNode(nodeId);
873
+ const startInlineEdit = () => {
874
+ const refreshedEntry = module.nodeObjectsById?.get?.(nodeId) || nodeEntry;
875
+ if (refreshedEntry?.cssObject) {
876
+ startEditingNode(module, refreshedEntry);
877
+ return true;
878
+ }
879
+
880
+ return false;
881
+ };
882
+
883
+ if (nodeEntry.cssObject && (nodeEntry.currentType === 'CSS' || window.MindMapCss3DManager?.isCss3dOnlyNodeRendering?.() === true)) {
884
+ startInlineEdit();
867
885
  return;
868
886
  }
869
887
 
870
888
  const switchResult = window.MindMapNodes?.switchToCss3D?.(module, nodeId);
871
889
  if (switchResult && typeof switchResult.then === 'function') {
872
890
  switchResult.then(() => {
873
- const refreshedEntry = module.nodeObjectsById?.get(nodeId);
874
- if (refreshedEntry) {
875
- startEditingNode(module, refreshedEntry);
891
+ if (!startInlineEdit()) {
892
+ console.warn(`[Interactions] Unable to enter edit mode: CSS3D entry not available for ${nodeId}.`);
876
893
  }
877
894
  }).catch(err => console.warn('[Interactions] Failed to enter edit mode:', err));
878
895
  } else {
879
- startEditingNode(module, nodeEntry);
896
+ if (!startInlineEdit()) {
897
+ console.warn(`[Interactions] Unable to enter edit mode: CSS3D entry not available for ${nodeId}.`);
898
+ }
880
899
  }
881
900
  return;
882
901
  }
@@ -2895,7 +2914,10 @@ window.MindMapInteractions = (function () {
2895
2914
  function getGuardedTargetNodeId(module, target, event) {
2896
2915
  const nodeId = getTargetNodeId(target);
2897
2916
  if (!nodeId || !event) {
2898
- return nodeId;
2917
+ const topCssHit = event
2918
+ ? findCssNodeHitAtClientPoint(module, event.clientX, event.clientY)
2919
+ : null;
2920
+ return topCssHit?.nodeId || nodeId;
2899
2921
  }
2900
2922
 
2901
2923
  const topCssHit = findCssNodeHitAtClientPoint(module, event.clientX, event.clientY);
@@ -4032,11 +4054,27 @@ window.MindMapInteractions = (function () {
4032
4054
  e.target.classList.contains('markdown-body') ||
4033
4055
  e.target.classList.contains('csv-table-scroll') ||
4034
4056
  e.target.classList.contains('csv-table-cell') ||
4057
+ e.target.classList.contains('map-node-memo__body-view') ||
4058
+ e.target.classList.contains('map-node-memo__body') ||
4059
+ e.target.classList.contains('map-node-memo__title') ||
4035
4060
  e.target.closest('.code-body') ||
4036
4061
  e.target.closest('.node-response') ||
4037
4062
  e.target.closest('.text-content') ||
4038
4063
  e.target.closest('.markdown-body') ||
4039
- e.target.closest('.csv-table-scroll');
4064
+ e.target.closest('.csv-table-scroll') ||
4065
+ e.target.closest('.map-node-memo__body-view') ||
4066
+ e.target.closest('.map-node-memo__body') ||
4067
+ e.target.closest('.map-node-memo__title');
4068
+
4069
+ if (supportsTextInteraction &&
4070
+ isInlineEditableNode(nodeEntry) &&
4071
+ isClickOnContent &&
4072
+ !isMultiModifier &&
4073
+ isSelected &&
4074
+ !canNativeTextSelectionStart(module, nodeEntry, clickedNodeId)) {
4075
+ startNodeDrag(module, e, clickedNodeId, nodeEntry, nodeEntry.cssObject || nodeEntry.glObject);
4076
+ return;
4077
+ }
4040
4078
 
4041
4079
  // ▼▼▼ [2-Stage Click] text-based 노드가 이미 편집 모드(CSS3D)인 경우에만 텍스트 선택 허용 ▼▼▼
4042
4080
  if (supportsTextInteraction && isClickOnContent && !isMultiModifier && isSelected) {
@@ -4546,12 +4584,12 @@ window.MindMapInteractions = (function () {
4546
4584
 
4547
4585
  module.isShiftClick = isMultiModifier;
4548
4586
 
4549
- // ▼▼▼ [2-Stage Click] 선택된 text-based 노드는 onMouseDown에서 CSS3D 전환하지 않음 ▼▼▼
4550
- // onMouseUp에서 2차 클릭 시에만 편집 모드(CSS3D)로 전환
4551
- const isAlreadySelected = (module.selectedNodeIdJs === nodeId);
4552
- const isTextBasedNode = contentType === 'code' || contentType === 'text' || contentType === 'markdown';
4553
- // (isAlreadySelected && isTextBasedNode 케이스는 아래 startNodeDrag로 진행하여 onMouseUp에서 처리)
4554
- // ▲▲▲ [2-Stage Click] ▲▲▲
4587
+ // ▼▼▼ [2-Stage Click] 선택된 text-based 노드는 onMouseDown에서 CSS3D 전환하지 않음 ▼▼▼
4588
+ // onMouseUp에서 2차 클릭 시에만 편집 모드(CSS3D)로 전환
4589
+ const isAlreadySelected = (module.selectedNodeIdJs === nodeId);
4590
+ const isTextBasedNode = contentType === 'code' || contentType === 'text' || contentType === 'markdown';
4591
+ // (isAlreadySelected && isTextBasedNode 케이스는 아래 startNodeDrag로 진행하여 onMouseUp에서 처리)
4592
+ // ▲▲▲ [2-Stage Click] ▲▲▲
4555
4593
 
4556
4594
  // ▼▼▼ [Fix] 다중 선택 상태에서 다른 노드 클릭 시 해제 (드래그 시작 전) ▼▼▼
4557
4595
  // 단, 다중 선택된 노드 중 하나를 클릭한 경우는 해제하지 않음 (다중 드래그 허용)
@@ -4599,6 +4637,7 @@ window.MindMapInteractions = (function () {
4599
4637
  e.preventDefault();
4600
4638
 
4601
4639
  module.isShiftClick = e.shiftKey || e.ctrlKey || e.metaKey;
4640
+
4602
4641
  beginOverlayNodeDrag(module, e, cssFallbackHit.nodeId);
4603
4642
  return;
4604
4643
  }
@@ -5249,7 +5288,7 @@ window.MindMapInteractions = (function () {
5249
5288
  syncTextOverlaysNow(module);
5250
5289
  }
5251
5290
  } else {
5252
- if (nodeEntry && module.dotNetHelper) {
5291
+ if (nodeEntry) {
5253
5292
  const isAlreadySelected = module.selectedNodeIdJs === clickedNodeId;
5254
5293
  const isMultiSelecting = module.isShiftClick;
5255
5294
  // Check if link was clicked (to prevent edit on link click)
@@ -5308,7 +5347,7 @@ window.MindMapInteractions = (function () {
5308
5347
  module.selectionChangedInThisClick = true;
5309
5348
 
5310
5349
  if (nodeEntry.model.contentType === 'pdf') {
5311
- try { module.dotNetHelper.invokeMethodAsync('ShowPdfDialog', nodeEntry.model.response, nodeEntry.model.prompt); } catch { }
5350
+ try { module.dotNetHelper?.invokeMethodAsync?.('ShowPdfDialog', nodeEntry.model.response, nodeEntry.model.prompt); } catch { }
5312
5351
  }
5313
5352
  });
5314
5353
  }
@@ -5370,68 +5409,69 @@ window.MindMapInteractions = (function () {
5370
5409
  // --- end spatial grid refresh ---
5371
5410
  }
5372
5411
  } else {
5373
- if (clickedNodeId && module.dotNetHelper) {
5412
+ if (clickedNodeId) {
5374
5413
  const nodeEntry = module.nodeObjectsById.get(clickedNodeId);
5375
-
5376
- const isAlreadySelected = module.selectedNodeIdJs === clickedNodeId;
5377
- const isMultiSelecting = module.isShiftClick;
5378
-
5379
- if (isAlreadySelected && !isMultiSelecting && isInlineEditableNode(nodeEntry)) {
5380
- if (module.selectionChangedInThisClick) {
5381
- module.selectionChangedInThisClick = false;
5382
- finalizeSingleSelection(module, clickedNodeId, { notifyBlazor: false, bringToFront: true, showMenu: true });
5383
- } else if (consumePendingSelectedActivation(module, clickedNodeId)) {
5384
- finalizeSingleSelection(module, clickedNodeId, { notifyBlazor: false, bringToFront: true, showMenu: true });
5385
- } else {
5386
- const activationTarget = e.target;
5387
- postMouseUpActivation = () => handleSelectedNodeActivation(module, clickedNodeId, nodeEntry, { target: activationTarget });
5388
- }
5389
- } else {
5390
- schedulePrimaryClickAction(module, () => {
5391
- if (module.selectedNodeIdJs && module.selectedNodeIdJs !== clickedNodeId) {
5392
- switchPreviousSelectedNoteToWebGL(module, false);
5414
+ if (nodeEntry) {
5415
+ const isAlreadySelected = module.selectedNodeIdJs === clickedNodeId;
5416
+ const isMultiSelecting = module.isShiftClick;
5417
+
5418
+ if (isAlreadySelected && !isMultiSelecting && isInlineEditableNode(nodeEntry)) {
5419
+ if (module.selectionChangedInThisClick) {
5420
+ module.selectionChangedInThisClick = false;
5421
+ finalizeSingleSelection(module, clickedNodeId, { notifyBlazor: false, bringToFront: true, showMenu: true });
5422
+ } else if (consumePendingSelectedActivation(module, clickedNodeId)) {
5423
+ finalizeSingleSelection(module, clickedNodeId, { notifyBlazor: false, bringToFront: true, showMenu: true });
5424
+ } else {
5425
+ const activationTarget = e.target;
5426
+ postMouseUpActivation = () => handleSelectedNodeActivation(module, clickedNodeId, nodeEntry, { target: activationTarget });
5393
5427
  }
5394
-
5395
- if (isMultiSelecting) {
5396
- if (module.multiSelectedNodeIds.has(clickedNodeId)) {
5397
- module.multiSelectedNodeIds.delete(clickedNodeId);
5398
- window.MindMapNodes.updateNodeSelectionStyle(module, clickedNodeId, false, false);
5399
- } else {
5400
- module.multiSelectedNodeIds.add(clickedNodeId);
5401
- window.MindMapNodes.updateNodeSelectionStyle(module, clickedNodeId, true, false);
5428
+ } else {
5429
+ schedulePrimaryClickAction(module, () => {
5430
+ if (module.selectedNodeIdJs && module.selectedNodeIdJs !== clickedNodeId) {
5431
+ switchPreviousSelectedNoteToWebGL(module, false);
5402
5432
  }
5403
- syncSelectedIdFromMulti(module);
5404
- return;
5405
- }
5406
5433
 
5407
- if (isAlreadySelected) {
5408
- if (module.selectionChangedInThisClick) {
5409
- module.selectionChangedInThisClick = false;
5410
- finalizeSingleSelection(module, clickedNodeId, { notifyBlazor: false, bringToFront: true, showMenu: true });
5411
- } else if (consumePendingSelectedActivation(module, clickedNodeId)) {
5412
- finalizeSingleSelection(module, clickedNodeId, { notifyBlazor: false, bringToFront: true, showMenu: true });
5413
- } else {
5414
- handleSelectedNodeActivation(module, clickedNodeId, nodeEntry, { target: e.target });
5434
+ if (isMultiSelecting) {
5435
+ if (module.multiSelectedNodeIds.has(clickedNodeId)) {
5436
+ module.multiSelectedNodeIds.delete(clickedNodeId);
5437
+ window.MindMapNodes.updateNodeSelectionStyle(module, clickedNodeId, false, false);
5438
+ } else {
5439
+ module.multiSelectedNodeIds.add(clickedNodeId);
5440
+ window.MindMapNodes.updateNodeSelectionStyle(module, clickedNodeId, true, false);
5441
+ }
5442
+ syncSelectedIdFromMulti(module);
5443
+ return;
5415
5444
  }
5416
- return;
5417
- }
5418
5445
 
5419
- if (module.multiSelectedNodeIds?.size > 0) {
5420
- if (MindMapNodes.clearMultiSelection) {
5421
- MindMapNodes.clearMultiSelection(module);
5446
+ if (isAlreadySelected) {
5447
+ if (module.selectionChangedInThisClick) {
5448
+ module.selectionChangedInThisClick = false;
5449
+ finalizeSingleSelection(module, clickedNodeId, { notifyBlazor: false, bringToFront: true, showMenu: true });
5450
+ } else if (consumePendingSelectedActivation(module, clickedNodeId)) {
5451
+ finalizeSingleSelection(module, clickedNodeId, { notifyBlazor: false, bringToFront: true, showMenu: true });
5452
+ } else {
5453
+ handleSelectedNodeActivation(module, clickedNodeId, nodeEntry, { target: e.target });
5454
+ }
5455
+ return;
5422
5456
  }
5423
- module.multiSelectedNodeIds?.clear?.();
5424
- if (window.MindMapMultiSelect) {
5425
- window.MindMapMultiSelect.hide();
5457
+
5458
+ if (module.multiSelectedNodeIds?.size > 0) {
5459
+ if (MindMapNodes.clearMultiSelection) {
5460
+ MindMapNodes.clearMultiSelection(module);
5461
+ }
5462
+ module.multiSelectedNodeIds?.clear?.();
5463
+ if (window.MindMapMultiSelect) {
5464
+ window.MindMapMultiSelect.hide();
5465
+ }
5426
5466
  }
5427
- }
5428
5467
 
5429
- finalizeSingleSelection(module, clickedNodeId, { notifyBlazor: true, bringToFront: true, showMenu: true });
5468
+ finalizeSingleSelection(module, clickedNodeId, { notifyBlazor: true, bringToFront: true, showMenu: true });
5430
5469
 
5431
- if (nodeEntry.model.contentType === 'pdf') {
5432
- try { module.dotNetHelper.invokeMethodAsync('ShowPdfDialog', nodeEntry.model.response, nodeEntry.model.prompt); } catch { }
5433
- }
5434
- });
5470
+ if (nodeEntry.model.contentType === 'pdf') {
5471
+ try { module.dotNetHelper?.invokeMethodAsync?.('ShowPdfDialog', nodeEntry.model.response, nodeEntry.model.prompt); } catch { }
5472
+ }
5473
+ });
5474
+ }
5435
5475
  }
5436
5476
  }
5437
5477
  }
@@ -264,12 +264,31 @@
264
264
  return getNodeSemanticType(model) === BUSINESS_AUTOMATION_SEMANTIC_TYPE;
265
265
  }
266
266
 
267
+ function getBusinessAutomationNodeKind(model) {
268
+ const metadata = ensureMetadata(model);
269
+ return String(metadata.AutomationNodeKind || metadata.automationNodeKind || '').trim().toLowerCase();
270
+ }
271
+
272
+ function getBusinessAutomationNodeRole(model) {
273
+ const metadata = ensureMetadata(model);
274
+ return String(metadata.AutomationNodeRole || metadata.automationNodeRole || '').trim().toLowerCase();
275
+ }
276
+
277
+ function isBusinessAutomationRootAiTaskNode(model) {
278
+ if (!isBusinessAutomationNode(model) || getBusinessAutomationNodeKind(model) !== 'ai-task') {
279
+ return false;
280
+ }
281
+
282
+ const role = getBusinessAutomationNodeRole(model);
283
+ return role.length === 0 || role === 'root';
284
+ }
285
+
267
286
  function isRemoteFleetMonitorNode(model) {
268
287
  return getNodeSemanticType(model) === REMOTE_FLEET_SEMANTIC_TYPE;
269
288
  }
270
289
 
271
290
  function canRunExecutableNode(model) {
272
- return isBusinessAutomationNode(model);
291
+ return isBusinessAutomationRootAiTaskNode(model);
273
292
  }
274
293
 
275
294
  function isExecutableNodeRunning(model) {
@@ -38,6 +38,54 @@
38
38
  const NODE_TEXT_SELECTION_SELECTORS = '.node-response, .code-body, .text-content, .markdown-body, .csv-table-scroll, .csv-table-cell, textarea, .map-node-memo__title, .map-node-memo__body, .map-node-memo__body-view, .map-node-memo__body-view *';
39
39
  const NODE_INTERACTIVE_CONTENT_SELECTORS = `${NODE_TEXT_SELECTION_SELECTORS}, .embed-content, .embed-card, .embed-card *, .embed-action, .embed-play-button, iframe, .map-node-memo__icon-button, .map-node-memo__icon-option, .map-node-memo__icon-popover, .map-node-memo__agent-action, .map-node-memo__agent-result-link, .map-node-memo__agent-plan-panel, .map-node-memo__agent-plan-body, .map-node-memo__agent-plan-body *, .map-node-memo__agent-console-panel, .map-node-memo__agent-console-body, .map-node-memo__agent-console-body *, .map-node-memo__agent-console-resize, .map-node-memo__agent-console-resize *`;
40
40
  const MEMO_EDIT_ONLY_SELECTORS = '.map-node-memo__title, .map-node-memo__body, .map-node-memo__icon-button, .map-node-memo__icon-option, .map-node-memo__icon-popover';
41
+ const INLINE_EDITABLE_NODE_DRAG_EXCLUDED_SELECTOR = [
42
+ 'button',
43
+ 'a',
44
+ 'input',
45
+ 'textarea',
46
+ 'select',
47
+ '[contenteditable="true"]',
48
+ '.node-prompt-copy-button',
49
+ '.csv-table-header-button',
50
+ '.resize-handle',
51
+ '.css3d-resize-handle',
52
+ '.map-node-memo__icon-wrap',
53
+ '.map-node-memo__icon-button',
54
+ '.map-node-memo__icon-popover',
55
+ '.map-node-memo__icon-option',
56
+ '.map-node-memo__agent-role-select',
57
+ '.map-node-memo__agent-role-select-button',
58
+ '.map-node-memo__agent-role-menu',
59
+ '.map-node-memo__agent-role-option',
60
+ '.map-node-memo__agent-action',
61
+ '.map-node-memo__agent-actions',
62
+ '.map-node-memo__agent-plan-panel',
63
+ '.map-node-memo__agent-console-panel',
64
+ '.map-node-memo__agent-console-resize',
65
+ '.map-node-memo__agent-result-link',
66
+ '.map-node-memo__automation-pins',
67
+ '.map-node-memo__automation-pin',
68
+ '.map-node-memo__automation-pin-label',
69
+ '.map-node-memo__automation-pin-dot',
70
+ '.map-node-memo__automation-badges',
71
+ '.map-node-memo__automation-status',
72
+ '.map-node-memo__automation-intent'
73
+ ].join(', ');
74
+ const INLINE_EDITABLE_NODE_DRAG_SURFACE_SELECTOR = [
75
+ '.node-content-wrapper',
76
+ '.node-prompt-row',
77
+ '.node-prompt',
78
+ '.node-response',
79
+ '.note-content',
80
+ '.markdown-body',
81
+ '.code-body',
82
+ '.text-content',
83
+ '.map-node-memo',
84
+ '.map-node-memo__shell',
85
+ '.map-node-memo__header',
86
+ '.map-node-memo__title-wrap',
87
+ '.map-node-memo__body-view'
88
+ ].join(', ');
41
89
 
42
90
  function getNodeContentTypeLower(nodeModel) {
43
91
  return String(nodeModel?.contentType ?? nodeModel?.ContentType ?? '').trim().toLowerCase();
@@ -151,7 +199,11 @@
151
199
 
152
200
  function isInlineEditableNodeModel(nodeModel) {
153
201
  const contentType = String(nodeModel?.contentType ?? nodeModel?.ContentType ?? '').toLowerCase();
154
- return contentType === 'note' || contentType === 'memo' || contentType === 'code' || isAgentNodeModel(nodeModel);
202
+ return contentType === 'note'
203
+ || contentType === 'memo'
204
+ || contentType === 'code'
205
+ || isAgentNodeModel(nodeModel)
206
+ || getNodeSemanticType(nodeModel) === BUSINESS_AUTOMATION_SEMANTIC_TYPE;
155
207
  }
156
208
 
157
209
  function isReadOnlyTextSelectionNodeModel(nodeModel) {
@@ -159,6 +211,79 @@
159
211
  return (contentType === 'text' || contentType === 'markdown') && !isAgentNodeModel(nodeModel);
160
212
  }
161
213
 
214
+ function syncSelectedInlineEditableDomRouter(module, nodeId, entry, isSelected, isEditing) {
215
+ const cssElement = entry?.cssObject?.element || null;
216
+ const normalizedNodeId = String(nodeId || '').trim();
217
+ if (!cssElement || !normalizedNodeId) {
218
+ return;
219
+ }
220
+
221
+ const existingHandler = cssElement._selectedInlineEditableDomRouterHandler;
222
+ if (existingHandler &&
223
+ (cssElement._selectedInlineEditableDomRouterModule !== module ||
224
+ cssElement._selectedInlineEditableDomRouterNodeId !== normalizedNodeId)) {
225
+ cssElement.removeEventListener('mousedown', existingHandler, true);
226
+ cssElement._selectedInlineEditableDomRouterHandler = null;
227
+ }
228
+
229
+ const shouldAttach = !!isSelected && !isEditing && isInlineEditableNodeModel(entry?.model);
230
+ if (!shouldAttach) {
231
+ if (cssElement._selectedInlineEditableDomRouterHandler) {
232
+ cssElement.removeEventListener('mousedown', cssElement._selectedInlineEditableDomRouterHandler, true);
233
+ cssElement._selectedInlineEditableDomRouterHandler = null;
234
+ }
235
+ return;
236
+ }
237
+
238
+ if (cssElement._selectedInlineEditableDomRouterHandler) {
239
+ return;
240
+ }
241
+
242
+ const handler = event => {
243
+ if (!event || Number(event.button) !== 0 || event.defaultPrevented) {
244
+ return;
245
+ }
246
+
247
+ const target = event.target;
248
+ if (!(target instanceof Element) || !cssElement.contains(target)) {
249
+ return;
250
+ }
251
+
252
+ if (target.closest(INLINE_EDITABLE_NODE_DRAG_EXCLUDED_SELECTOR)) {
253
+ return;
254
+ }
255
+
256
+ const surface = target.closest(INLINE_EDITABLE_NODE_DRAG_SURFACE_SELECTOR);
257
+ if (!surface || !cssElement.contains(surface)) {
258
+ return;
259
+ }
260
+
261
+ const isStillSelected = String(module?.selectedNodeIdJs || '').trim() === normalizedNodeId ||
262
+ cssElement.classList?.contains?.('selected') === true ||
263
+ cssElement.querySelector?.('.map-node.selected, .map-node-note.selected, .map-node-memo.selected, .map-node-code.selected');
264
+ const isEditingDom = cssElement.classList?.contains?.('is-editing') === true ||
265
+ !!cssElement.querySelector?.('.is-editing');
266
+ if (!isStillSelected || isEditingDom) {
267
+ return;
268
+ }
269
+
270
+ const started = window.MindMapInteractions?.startNodeDragFromDom?.(
271
+ module,
272
+ event,
273
+ normalizedNodeId,
274
+ { source: 'selected-inline-editable-css3d' }
275
+ ) === true;
276
+ if (started) {
277
+ event.stopImmediatePropagation?.();
278
+ }
279
+ };
280
+
281
+ cssElement._selectedInlineEditableDomRouterModule = module;
282
+ cssElement._selectedInlineEditableDomRouterNodeId = normalizedNodeId;
283
+ cssElement._selectedInlineEditableDomRouterHandler = handler;
284
+ cssElement.addEventListener('mousedown', handler, true);
285
+ }
286
+
162
287
  function getSelectionBorderColorHex(nodeModel, isSelected) {
163
288
  if (String(nodeModel?.contentType ?? nodeModel?.ContentType ?? '').toLowerCase() !== 'memo') {
164
289
  return isSelected ? 0x7b7ff2 : 0x374151;
@@ -3631,6 +3756,9 @@
3631
3756
  }
3632
3757
  // ▲▲▲ [Fix] ▲▲▲
3633
3758
 
3759
+ const inlineEditableRouterEditing = !!(module.isEditingNote && module.selectedNodeIdJs === nodeId);
3760
+ syncSelectedInlineEditableDomRouter(module, nodeId, entry, isSelected, inlineEditableRouterEditing);
3761
+
3634
3762
  if (entry.isDeferredShell === true) {
3635
3763
  if (bringToFront && entry.cssObject) {
3636
3764
  bringNodeToFront(module, nodeId);