@mindexec/cli 0.2.0

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 (232) hide show
  1. package/README.md +275 -0
  2. package/codex-runtime.js +960 -0
  3. package/launch-bridge.cjs +162 -0
  4. package/package.json +61 -0
  5. package/port-guard.cjs +232 -0
  6. package/scripts/setup-tree-sitter-grammars.mjs +59 -0
  7. package/server.js +8422 -0
  8. package/start-bridge.bat +32 -0
  9. package/start-bridge.sh +81 -0
  10. package/tree-sitter-grammars/README.md +18 -0
  11. package/tree-sitter-grammars/tree-sitter-c_sharp.wasm +0 -0
  12. package/tree-sitter-grammars/tree-sitter-go.wasm +0 -0
  13. package/tree-sitter-grammars/tree-sitter-java.wasm +0 -0
  14. package/tree-sitter-grammars/tree-sitter-javascript.wasm +0 -0
  15. package/tree-sitter-grammars/tree-sitter-python.wasm +0 -0
  16. package/tree-sitter-grammars/tree-sitter-rust.wasm +0 -0
  17. package/tree-sitter-grammars/tree-sitter-tsx.wasm +0 -0
  18. package/tree-sitter-grammars/tree-sitter-typescript.wasm +0 -0
  19. package/wwwroot/MindExecution.Web.styles.css +3 -0
  20. package/wwwroot/_content/MindExecution.Plugins.Admin/css/admin-dashboard.css +546 -0
  21. package/wwwroot/_content/MindExecution.Plugins.Directory/MindExecution.Plugins.Directory.u7utcng611.bundle.scp.css +7 -0
  22. package/wwwroot/_content/MindExecution.Plugins.Directory/background.png +0 -0
  23. package/wwwroot/_content/MindExecution.Plugins.Directory/directory-manager.js +202 -0
  24. package/wwwroot/_content/MindExecution.Plugins.Directory/exampleJsInterop.js +6 -0
  25. package/wwwroot/_content/MindExecution.Plugins.YouTube/css/youtube-search.css +251 -0
  26. package/wwwroot/_content/MindExecution.Shared/MindExecution.Shared.wsano1j4wp.bundle.scp.css +4 -0
  27. package/wwwroot/_content/MindExecution.Shared/css/admin-dashboard.css +559 -0
  28. package/wwwroot/_content/MindExecution.Shared/css/app.css +1 -0
  29. package/wwwroot/_content/MindExecution.Shared/css/mind-map-overrides.css +2936 -0
  30. package/wwwroot/_content/MindExecution.Shared/fonts/NotoSansKR-Bold.ttf +0 -0
  31. package/wwwroot/_content/MindExecution.Shared/fonts/NotoSansKR-Regular.ttf +0 -0
  32. package/wwwroot/_content/MindExecution.Shared/js/agent-visualization.js +359 -0
  33. package/wwwroot/_content/MindExecution.Shared/js/background-themes.js +1721 -0
  34. package/wwwroot/_content/MindExecution.Shared/js/code-master.js +8316 -0
  35. package/wwwroot/_content/MindExecution.Shared/js/file-system-helper.js +639 -0
  36. package/wwwroot/_content/MindExecution.Shared/js/helpers/InfiniteGridHelper.js +109 -0
  37. package/wwwroot/_content/MindExecution.Shared/js/marked.min.js +69 -0
  38. package/wwwroot/_content/MindExecution.Shared/js/mind-map-core.js +7982 -0
  39. package/wwwroot/_content/MindExecution.Shared/js/mind-map-core.js.backup +1059 -0
  40. package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-manager.js +15803 -0
  41. package/wwwroot/_content/MindExecution.Shared/js/mind-map-dev-guards.js +325 -0
  42. package/wwwroot/_content/MindExecution.Shared/js/mind-map-dnd.js +1430 -0
  43. package/wwwroot/_content/MindExecution.Shared/js/mind-map-dnd.js.bak +434 -0
  44. package/wwwroot/_content/MindExecution.Shared/js/mind-map-glow-shader.js +260 -0
  45. package/wwwroot/_content/MindExecution.Shared/js/mind-map-interactions.js +7640 -0
  46. package/wwwroot/_content/MindExecution.Shared/js/mind-map-lod-plan-worker.js +160 -0
  47. package/wwwroot/_content/MindExecution.Shared/js/mind-map-lod-renderer.js +9923 -0
  48. package/wwwroot/_content/MindExecution.Shared/js/mind-map-logic-workers.js +977 -0
  49. package/wwwroot/_content/MindExecution.Shared/js/mind-map-menu-manager.js +1431 -0
  50. package/wwwroot/_content/MindExecution.Shared/js/mind-map-multi-select.js +1716 -0
  51. package/wwwroot/_content/MindExecution.Shared/js/mind-map-node-search-worker.js +553 -0
  52. package/wwwroot/_content/MindExecution.Shared/js/mind-map-nodes.js +4541 -0
  53. package/wwwroot/_content/MindExecution.Shared/js/mind-map-object-manager.js +489 -0
  54. package/wwwroot/_content/MindExecution.Shared/js/mind-map-object-manager.js.backup +372 -0
  55. package/wwwroot/_content/MindExecution.Shared/js/mind-map-pipeline.js +2075 -0
  56. package/wwwroot/_content/MindExecution.Shared/js/mind-map-text-lod-system.js +646 -0
  57. package/wwwroot/_content/MindExecution.Shared/js/mind-map-text-overlay-v2.js +4323 -0
  58. package/wwwroot/_content/MindExecution.Shared/js/mind-map-texture-factory.js +2260 -0
  59. package/wwwroot/_content/MindExecution.Shared/js/mind-map-texture-factory.js.backup +1258 -0
  60. package/wwwroot/_content/MindExecution.Shared/js/mind-map-visibility-worker.js +890 -0
  61. package/wwwroot/_content/MindExecution.Shared/js/mindmap-toolbar.js +594 -0
  62. package/wwwroot/_content/MindExecution.Shared/js/native-drop-handler.js +170 -0
  63. package/wwwroot/_content/MindExecution.Shared/js/plan-master.js +788 -0
  64. package/wwwroot/_content/MindExecution.Shared/js/renderers/CSS3DRenderer.js +50 -0
  65. package/wwwroot/_content/MindExecution.Shared/js/texture-worker-manager.js +188 -0
  66. package/wwwroot/_content/MindExecution.Shared/js/texture-worker.js +208 -0
  67. package/wwwroot/_content/MindExecution.Shared/js/three.min.js +6 -0
  68. package/wwwroot/_content/MindExecution.Shared/js/titlebar-handler.js +191 -0
  69. package/wwwroot/_content/MindExecution.Shared/js/token-manager.js +37 -0
  70. package/wwwroot/_content/MindExecution.Shared/js/token-worker.js +28 -0
  71. package/wwwroot/_content/MindExecution.Shared/js/troika-bundle.js +5626 -0
  72. package/wwwroot/_content/MindExecution.Shared/js/troika-bundle.js.map +7 -0
  73. package/wwwroot/_content/MindExecution.Shared/lib/font-awesome/css/all.min.css +9 -0
  74. package/wwwroot/_content/MindExecution.Shared/lib/font-awesome/webfonts/fa-brands-400.ttf +0 -0
  75. package/wwwroot/_content/MindExecution.Shared/lib/font-awesome/webfonts/fa-brands-400.woff2 +0 -0
  76. package/wwwroot/_content/MindExecution.Shared/lib/font-awesome/webfonts/fa-regular-400.ttf +0 -0
  77. package/wwwroot/_content/MindExecution.Shared/lib/font-awesome/webfonts/fa-regular-400.woff2 +0 -0
  78. package/wwwroot/_content/MindExecution.Shared/lib/font-awesome/webfonts/fa-solid-900.ttf +0 -0
  79. package/wwwroot/_content/MindExecution.Shared/lib/font-awesome/webfonts/fa-solid-900.woff2 +0 -0
  80. package/wwwroot/_content/MindExecution.Shared/models/all-MiniLM-L6-v2-quantized.onnx +0 -0
  81. package/wwwroot/_content/MindExecution.Shared/models/vocab.txt +30522 -0
  82. package/wwwroot/_framework/Google.Protobuf.9h59ukbel7.dll +0 -0
  83. package/wwwroot/_framework/Markdig.d1j7v41cl1.dll +0 -0
  84. package/wwwroot/_framework/MessagePack.Annotations.l6qv48kgpt.dll +0 -0
  85. package/wwwroot/_framework/MessagePack.eqoptzx9d5.dll +0 -0
  86. package/wwwroot/_framework/Microsoft.AspNetCore.Authorization.k7dsih5y5g.dll +0 -0
  87. package/wwwroot/_framework/Microsoft.AspNetCore.Components.6nyje9sa0g.dll +0 -0
  88. package/wwwroot/_framework/Microsoft.AspNetCore.Components.Authorization.iycd6unprw.dll +0 -0
  89. package/wwwroot/_framework/Microsoft.AspNetCore.Components.Web.487u3twia4.dll +0 -0
  90. package/wwwroot/_framework/Microsoft.AspNetCore.Components.WebAssembly.d0gcnmlxxz.dll +0 -0
  91. package/wwwroot/_framework/Microsoft.AspNetCore.Metadata.h4yevl9adi.dll +0 -0
  92. package/wwwroot/_framework/Microsoft.CSharp.qrvp77qmhs.dll +0 -0
  93. package/wwwroot/_framework/Microsoft.Data.Sqlite.jdlxgv2jtg.dll +0 -0
  94. package/wwwroot/_framework/Microsoft.EntityFrameworkCore.4gjazp7kjf.dll +0 -0
  95. package/wwwroot/_framework/Microsoft.EntityFrameworkCore.Abstractions.gocudnvz7b.dll +0 -0
  96. package/wwwroot/_framework/Microsoft.EntityFrameworkCore.Relational.lt4rsvinuo.dll +0 -0
  97. package/wwwroot/_framework/Microsoft.EntityFrameworkCore.Sqlite.69luj0fa9r.dll +0 -0
  98. package/wwwroot/_framework/Microsoft.Extensions.Caching.Abstractions.364t4jh3zz.dll +0 -0
  99. package/wwwroot/_framework/Microsoft.Extensions.Caching.Memory.izlxhpzosu.dll +0 -0
  100. package/wwwroot/_framework/Microsoft.Extensions.Configuration.8zq7hh41o7.dll +0 -0
  101. package/wwwroot/_framework/Microsoft.Extensions.Configuration.Abstractions.8if74zs6ea.dll +0 -0
  102. package/wwwroot/_framework/Microsoft.Extensions.Configuration.Json.duvlngw8i0.dll +0 -0
  103. package/wwwroot/_framework/Microsoft.Extensions.DependencyInjection.Abstractions.t2hh9kvx0o.dll +0 -0
  104. package/wwwroot/_framework/Microsoft.Extensions.DependencyInjection.n4tg99oy8l.dll +0 -0
  105. package/wwwroot/_framework/Microsoft.Extensions.DependencyModel.h0d06ixk3e.dll +0 -0
  106. package/wwwroot/_framework/Microsoft.Extensions.Logging.Abstractions.rl32bkx2sd.dll +0 -0
  107. package/wwwroot/_framework/Microsoft.Extensions.Logging.dlht1xei0t.dll +0 -0
  108. package/wwwroot/_framework/Microsoft.Extensions.Options.qeunebioml.dll +0 -0
  109. package/wwwroot/_framework/Microsoft.Extensions.Primitives.18cr6vnuuz.dll +0 -0
  110. package/wwwroot/_framework/Microsoft.IO.RecyclableMemoryStream.r915vovvw4.dll +0 -0
  111. package/wwwroot/_framework/Microsoft.IdentityModel.Abstractions.1ejljk3erv.dll +0 -0
  112. package/wwwroot/_framework/Microsoft.IdentityModel.JsonWebTokens.1596zr8gne.dll +0 -0
  113. package/wwwroot/_framework/Microsoft.IdentityModel.Logging.229uyvpgio.dll +0 -0
  114. package/wwwroot/_framework/Microsoft.IdentityModel.Tokens.9sibtajc9f.dll +0 -0
  115. package/wwwroot/_framework/Microsoft.JSInterop.17lq4j1j7g.dll +0 -0
  116. package/wwwroot/_framework/Microsoft.JSInterop.WebAssembly.ryia5gxiad.dll +0 -0
  117. package/wwwroot/_framework/Microsoft.ML.OnnxRuntime.w9deo1m5ss.dll +0 -0
  118. package/wwwroot/_framework/Microsoft.ML.Tokenizers.cm2vuv2z61.dll +0 -0
  119. package/wwwroot/_framework/Microsoft.NET.StringTools.3qbrf4v2ki.dll +0 -0
  120. package/wwwroot/_framework/MimeMapping.og9ys58ylm.dll +0 -0
  121. package/wwwroot/_framework/MindExecution.Core.1q1trifbuu.dll +0 -0
  122. package/wwwroot/_framework/MindExecution.Kernel.gwwc40sc45.dll +0 -0
  123. package/wwwroot/_framework/MindExecution.Plugins.Admin.0jgrn1sckv.dll +0 -0
  124. package/wwwroot/_framework/MindExecution.Plugins.Business.13mme2qcag.dll +0 -0
  125. package/wwwroot/_framework/MindExecution.Plugins.Concept.dfp2mdt45q.dll +0 -0
  126. package/wwwroot/_framework/MindExecution.Plugins.Directory.3w4t6n3se0.dll +0 -0
  127. package/wwwroot/_framework/MindExecution.Plugins.PlanMaster.s0qpntz420.dll +0 -0
  128. package/wwwroot/_framework/MindExecution.Plugins.YouTube.iu11fq8d16.dll +0 -0
  129. package/wwwroot/_framework/MindExecution.Shared.7j27dcqnrc.dll +0 -0
  130. package/wwwroot/_framework/MindExecution.Web.pq1ty8ov2v.dll +0 -0
  131. package/wwwroot/_framework/Newtonsoft.Json.a56zs13vug.dll +0 -0
  132. package/wwwroot/_framework/SQLitePCLRaw.batteries_v2.rrd1nzawpp.dll +0 -0
  133. package/wwwroot/_framework/SQLitePCLRaw.core.1dxloztpfz.dll +0 -0
  134. package/wwwroot/_framework/SQLitePCLRaw.provider.e_sqlite3.oekyzl53i1.dll +0 -0
  135. package/wwwroot/_framework/Supabase.Core.s1pkj4aj0l.dll +0 -0
  136. package/wwwroot/_framework/Supabase.Functions.qz4nu782sg.dll +0 -0
  137. package/wwwroot/_framework/Supabase.Gotrue.twah27pkik.dll +0 -0
  138. package/wwwroot/_framework/Supabase.Postgrest.gmuuv369ih.dll +0 -0
  139. package/wwwroot/_framework/Supabase.Realtime.ox3kchdy3w.dll +0 -0
  140. package/wwwroot/_framework/Supabase.Storage.fnjnepaowr.dll +0 -0
  141. package/wwwroot/_framework/Supabase.azmaw5pgcz.dll +0 -0
  142. package/wwwroot/_framework/System.Collections.Concurrent.y1zmvuyipi.dll +0 -0
  143. package/wwwroot/_framework/System.Collections.Immutable.ug3j698qms.dll +0 -0
  144. package/wwwroot/_framework/System.Collections.NonGeneric.h66hj3863h.dll +0 -0
  145. package/wwwroot/_framework/System.Collections.Specialized.umr3y27ntj.dll +0 -0
  146. package/wwwroot/_framework/System.Collections.x53e19vfsj.dll +0 -0
  147. package/wwwroot/_framework/System.ComponentModel.Annotations.tz6gnt4ebt.dll +0 -0
  148. package/wwwroot/_framework/System.ComponentModel.Primitives.j7tiphu4rg.dll +0 -0
  149. package/wwwroot/_framework/System.ComponentModel.TypeConverter.ujlztox1gx.dll +0 -0
  150. package/wwwroot/_framework/System.ComponentModel.x9xz0ojfb6.dll +0 -0
  151. package/wwwroot/_framework/System.Console.ijzpqmj7ne.dll +0 -0
  152. package/wwwroot/_framework/System.Data.Common.1r0sqffq1p.dll +0 -0
  153. package/wwwroot/_framework/System.Diagnostics.DiagnosticSource.9upoqwq09o.dll +0 -0
  154. package/wwwroot/_framework/System.Diagnostics.Process.m99azzntjm.dll +0 -0
  155. package/wwwroot/_framework/System.Diagnostics.TraceSource.pl7wv26myr.dll +0 -0
  156. package/wwwroot/_framework/System.Diagnostics.Tracing.crlhfx6tut.dll +0 -0
  157. package/wwwroot/_framework/System.Drawing.Primitives.22e4y9ikq9.dll +0 -0
  158. package/wwwroot/_framework/System.Drawing.mi7d8hwowb.dll +0 -0
  159. package/wwwroot/_framework/System.Formats.Asn1.jx23sjiqnn.dll +0 -0
  160. package/wwwroot/_framework/System.IO.Compression.6fyoii3uej.dll +0 -0
  161. package/wwwroot/_framework/System.IO.Pipelines.vg77t4cd4d.dll +0 -0
  162. package/wwwroot/_framework/System.IdentityModel.Tokens.Jwt.t67es60z5b.dll +0 -0
  163. package/wwwroot/_framework/System.Linq.1bkoxlqgmq.dll +0 -0
  164. package/wwwroot/_framework/System.Linq.Expressions.24xqiypwdt.dll +0 -0
  165. package/wwwroot/_framework/System.Linq.Queryable.hvd01d6rsa.dll +0 -0
  166. package/wwwroot/_framework/System.Memory.8dx3lwgym4.dll +0 -0
  167. package/wwwroot/_framework/System.Net.Http.Json.3mhdm9l1rf.dll +0 -0
  168. package/wwwroot/_framework/System.Net.Http.eitrz660my.dll +0 -0
  169. package/wwwroot/_framework/System.Net.NetworkInformation.3pkuofcv9r.dll +0 -0
  170. package/wwwroot/_framework/System.Net.Ping.8clj5pklrp.dll +0 -0
  171. package/wwwroot/_framework/System.Net.Primitives.qrp4wcjz1p.dll +0 -0
  172. package/wwwroot/_framework/System.Net.WebSockets.Client.2u6pv01g69.dll +0 -0
  173. package/wwwroot/_framework/System.Net.WebSockets.qp6u31zvm5.dll +0 -0
  174. package/wwwroot/_framework/System.Numerics.Tensors.0c7z4mt3on.dll +0 -0
  175. package/wwwroot/_framework/System.Numerics.Vectors.kc7ufp2j4l.dll +0 -0
  176. package/wwwroot/_framework/System.ObjectModel.qv82fot1ib.dll +0 -0
  177. package/wwwroot/_framework/System.Private.CoreLib.rkafq04oma.dll +0 -0
  178. package/wwwroot/_framework/System.Private.Uri.t9542hmr6j.dll +0 -0
  179. package/wwwroot/_framework/System.Private.Xml.Linq.n8n3ptrbwu.dll +0 -0
  180. package/wwwroot/_framework/System.Private.Xml.rxd3tytisn.dll +0 -0
  181. package/wwwroot/_framework/System.Reactive.t3fuon548l.dll +0 -0
  182. package/wwwroot/_framework/System.Reflection.Emit.9tjhp6y0j3.dll +0 -0
  183. package/wwwroot/_framework/System.Reflection.Emit.ILGeneration.stxyk8zoo1.dll +0 -0
  184. package/wwwroot/_framework/System.Reflection.Emit.Lightweight.6xrd5v8vg0.dll +0 -0
  185. package/wwwroot/_framework/System.Reflection.Primitives.wgn8fpwwvv.dll +0 -0
  186. package/wwwroot/_framework/System.Runtime.InteropServices.JavaScript.sliym526xh.dll +0 -0
  187. package/wwwroot/_framework/System.Runtime.InteropServices.RuntimeInformation.oji7zut14z.dll +0 -0
  188. package/wwwroot/_framework/System.Runtime.InteropServices.te07xr2we9.dll +0 -0
  189. package/wwwroot/_framework/System.Runtime.Intrinsics.507y4h8nzq.dll +0 -0
  190. package/wwwroot/_framework/System.Runtime.Loader.v7gk4bse0k.dll +0 -0
  191. package/wwwroot/_framework/System.Runtime.Numerics.eqy5xjv3nd.dll +0 -0
  192. package/wwwroot/_framework/System.Runtime.Serialization.Formatters.zpkrub8lab.dll +0 -0
  193. package/wwwroot/_framework/System.Runtime.Serialization.Primitives.vhkpnbxjip.dll +0 -0
  194. package/wwwroot/_framework/System.Runtime.jn319d5nyg.dll +0 -0
  195. package/wwwroot/_framework/System.Security.Claims.0ztig1q9vo.dll +0 -0
  196. package/wwwroot/_framework/System.Security.Cryptography.vttizqc9ho.dll +0 -0
  197. package/wwwroot/_framework/System.Text.Encoding.Extensions.utdd47ny8f.dll +0 -0
  198. package/wwwroot/_framework/System.Text.Encodings.Web.wah8r1zoe0.dll +0 -0
  199. package/wwwroot/_framework/System.Text.Json.kxlfxj0wrs.dll +0 -0
  200. package/wwwroot/_framework/System.Text.RegularExpressions.dbqn58klox.dll +0 -0
  201. package/wwwroot/_framework/System.Threading.42ao9vi047.dll +0 -0
  202. package/wwwroot/_framework/System.Threading.Channels.hfa7j0uv2w.dll +0 -0
  203. package/wwwroot/_framework/System.Threading.Thread.caul0pdqul.dll +0 -0
  204. package/wwwroot/_framework/System.Transactions.Local.fimi2hamzo.dll +0 -0
  205. package/wwwroot/_framework/System.Web.HttpUtility.gq8yz50p2e.dll +0 -0
  206. package/wwwroot/_framework/System.Xml.Linq.kitin4zjoj.dll +0 -0
  207. package/wwwroot/_framework/System.Xml.ReaderWriter.kzvw3qgxb0.dll +0 -0
  208. package/wwwroot/_framework/System.Xml.XDocument.c539ki6cuq.dll +0 -0
  209. package/wwwroot/_framework/System.m05i39uvk9.dll +0 -0
  210. package/wwwroot/_framework/Websocket.Client.vapounvmnl.dll +0 -0
  211. package/wwwroot/_framework/blazor.boot.json +305 -0
  212. package/wwwroot/_framework/blazor.webassembly.js +1 -0
  213. package/wwwroot/_framework/dotnet.js +4 -0
  214. package/wwwroot/_framework/dotnet.native.vz0adxojrz.wasm +0 -0
  215. package/wwwroot/_framework/dotnet.native.xsn1d6x2kd.js +16 -0
  216. package/wwwroot/_framework/dotnet.runtime.dstopyvqzi.js +4 -0
  217. package/wwwroot/_framework/icudt_CJK.tjcz0u77k5.dat +0 -0
  218. package/wwwroot/_framework/icudt_EFIGS.tptq2av103.dat +0 -0
  219. package/wwwroot/_framework/icudt_no_CJK.lfu7j35m59.dat +0 -0
  220. package/wwwroot/_framework/netstandard.0xet7jg7ky.dll +0 -0
  221. package/wwwroot/_headers +40 -0
  222. package/wwwroot/_redirects +1 -0
  223. package/wwwroot/appsettings.json +71 -0
  224. package/wwwroot/icon-192.png +0 -0
  225. package/wwwroot/icon-512.png +0 -0
  226. package/wwwroot/index.html +710 -0
  227. package/wwwroot/js/marketing-tool.js +180 -0
  228. package/wwwroot/manifest.webmanifest +22 -0
  229. package/wwwroot/robots.txt +4 -0
  230. package/wwwroot/service-worker-assets.js +857 -0
  231. package/wwwroot/service-worker.js +33 -0
  232. package/wwwroot/sitemap.xml +27 -0
@@ -0,0 +1,372 @@
1
+ // File: mind-map-object-manager.js
2
+ // [Refactor] Creates and updates WebGL node groups (THREE.Group / THREE.Mesh).
3
+ (function () {
4
+ 'use strict';
5
+
6
+ function createRoundedRectGeometry(width, height, radius) {
7
+ const shape = new THREE.Shape();
8
+ const x = -width / 2;
9
+ const y = -height / 2;
10
+
11
+ // Start at bottom-left, go clockwise
12
+ shape.moveTo(x, y + radius);
13
+ shape.quadraticCurveTo(x, y, x + radius, y);
14
+
15
+ shape.lineTo(x + width - radius, y);
16
+ shape.quadraticCurveTo(x + width, y, x + width, y + radius);
17
+
18
+ shape.lineTo(x + width, y + height - radius);
19
+ shape.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);
20
+
21
+ shape.lineTo(x + radius, y + height);
22
+ shape.quadraticCurveTo(x, y + height, x, y + height - radius);
23
+
24
+ shape.lineTo(x, y + radius);
25
+
26
+ const points = shape.getPoints();
27
+ return new THREE.BufferGeometry().setFromPoints(points);
28
+ }
29
+
30
+ // ▲▲▲ [Change] ▲▲▲
31
+
32
+ // ▼▼▼ [Atlas] Shared materials for Atlas mode (created lazily) ▼▼▼
33
+ let atlasBodyMaterial = null;
34
+ let atlasBodyMaterials = []; // Array of materials (one per atlas page)
35
+ // ▲▲▲ [Atlas] ▲▲▲
36
+
37
+ async function createOrUpdateCanvasTextureNode(module, nodeModel, existingGroup = null, zPos = 0, textures, width, height, atlasResult = null) {
38
+ // ▼▼▼ [Atlas] Check if this is Atlas mode ▼▼▼
39
+ const isAtlasMode = atlasResult?.isAtlasMode === true;
40
+
41
+ if (isAtlasMode) {
42
+ // Atlas mode uses shared materials - textures.default.body is null
43
+ // We need to create/update the mesh differently
44
+ console.log(`[ObjectManager] Creating node ${nodeModel.id} in ATLAS mode`);
45
+ }
46
+ // ▲▲▲ [Atlas] ▲▲▲
47
+
48
+ // For non-Atlas mode, validate textures
49
+ if (!isAtlasMode && (!textures || !textures.default || !textures.selected)) {
50
+ console.error(`[MindMapObjectManager] Cannot create node ${nodeModel.id}: Invalid textures object provided.`);
51
+ return null;
52
+ }
53
+
54
+ const TAIL_HEIGHT = 12;
55
+ const HANDLE_SIZE = 24;
56
+ const CORNER_RADIUS = 20; // value chosen to visually match the texture corner radius
57
+ const DEFAULT_OUTLINE_COLOR = 0x374151;
58
+ const SELECTED_OUTLINE_COLOR = 0x2563eb;
59
+ const isSelected = module.multiSelectedNodeIds.has(nodeModel.id);
60
+ const outlineColor = isSelected ? SELECTED_OUTLINE_COLOR : DEFAULT_OUTLINE_COLOR;
61
+ const OUTLINE_SHRINK = 2;
62
+ const OUTLINE_RADIUS = Math.max(1, CORNER_RADIUS - 1);
63
+
64
+ if (existingGroup) {
65
+ const bodyMesh = existingGroup.getObjectByName('body');
66
+ const tailMesh = existingGroup.getObjectByName('tail');
67
+ const glowMesh = existingGroup.getObjectByName('glow');
68
+ let outline = existingGroup.getObjectByName('outline');
69
+ let baseRenderOrder = existingGroup.userData?.baseRenderOrder;
70
+ if (baseRenderOrder === undefined) {
71
+ baseRenderOrder = bodyMesh?.renderOrder ?? module.nodeZCounter++;
72
+ existingGroup.userData = {
73
+ ...(existingGroup.userData || {}),
74
+ baseRenderOrder
75
+ };
76
+ }
77
+
78
+ if (bodyMesh) {
79
+ const gp = bodyMesh.geometry && bodyMesh.geometry.parameters;
80
+ if (!gp || gp.width !== width || gp.height !== height) {
81
+ bodyMesh.geometry.dispose();
82
+ bodyMesh.geometry = new THREE.PlaneGeometry(width, height);
83
+
84
+ if (outline) {
85
+ outline.geometry.dispose();
86
+ outline.geometry = createRoundedRectGeometry(
87
+ width - OUTLINE_SHRINK,
88
+ height - OUTLINE_SHRINK,
89
+ OUTLINE_RADIUS
90
+ );
91
+ }
92
+ }
93
+ bodyMesh.position.set(width / 2, -height / 2, 0);
94
+ if (outline) {
95
+ outline.position.copy(bodyMesh.position);
96
+ outline.position.z = 0.1; // place slightly in front of body to avoid Z-fighting
97
+ outline.visible = isSelected;
98
+ if (outline.material) {
99
+ outline.material.color.setHex(isSelected ? SELECTED_OUTLINE_COLOR : DEFAULT_OUTLINE_COLOR);
100
+ outline.material.opacity = isSelected ? 1.0 : 0.5;
101
+ }
102
+ }
103
+ }
104
+ if (tailMesh) {
105
+ tailMesh.position.set(width / 2, -height - (TAIL_HEIGHT / 2), 0);
106
+ }
107
+ // ▼▼▼ [Changed] Update eight resize handles (4 corners + 4 edges with geometry) ▼▼▼
108
+ if (nodeModel.contentType !== 'pdf') {
109
+ const edgeWidthLength = Math.max(10, width - HANDLE_SIZE * 2);
110
+ const edgeHeightLength = Math.max(10, height - HANDLE_SIZE * 2);
111
+ const handleConfigs = {
112
+ // Corners (square, no geometry update needed)
113
+ 'resizeHandle_TL': { x: HANDLE_SIZE / 2, y: -HANDLE_SIZE / 2, w: HANDLE_SIZE, h: HANDLE_SIZE, z: 1.1 },
114
+ 'resizeHandle_TR': { x: width - HANDLE_SIZE / 2, y: -HANDLE_SIZE / 2, w: HANDLE_SIZE, h: HANDLE_SIZE, z: 1.1 },
115
+ 'resizeHandle_BL': { x: HANDLE_SIZE / 2, y: -height + HANDLE_SIZE / 2, w: HANDLE_SIZE, h: HANDLE_SIZE, z: 1.1 },
116
+ 'resizeHandle_BR': { x: width - HANDLE_SIZE / 2, y: -height + HANDLE_SIZE / 2, w: HANDLE_SIZE, h: HANDLE_SIZE, z: 1.1 },
117
+ // Edges (dynamic length, need geometry update)
118
+ 'resizeHandle_T': { x: width / 2, y: -HANDLE_SIZE / 2, w: edgeWidthLength, h: HANDLE_SIZE, z: 1 },
119
+ 'resizeHandle_B': { x: width / 2, y: -height + HANDLE_SIZE / 2, w: edgeWidthLength, h: HANDLE_SIZE, z: 1 },
120
+ 'resizeHandle_L': { x: HANDLE_SIZE / 2, y: -height / 2, w: HANDLE_SIZE, h: edgeHeightLength, z: 1 },
121
+ 'resizeHandle_R': { x: width - HANDLE_SIZE / 2, y: -height / 2, w: HANDLE_SIZE, h: edgeHeightLength, z: 1 }
122
+ };
123
+ Object.entries(handleConfigs).forEach(([name, cfg]) => {
124
+ const handle = existingGroup.getObjectByName(name);
125
+ if (handle) {
126
+ handle.position.set(cfg.x, cfg.y, cfg.z);
127
+ // Update geometry for edge handles (they change size with node size)
128
+ const gp = handle.geometry?.parameters;
129
+ if (gp && (gp.width !== cfg.w || gp.height !== cfg.h)) {
130
+ handle.geometry.dispose();
131
+ handle.geometry = new THREE.PlaneGeometry(cfg.w, cfg.h);
132
+ }
133
+ }
134
+ });
135
+ }
136
+ // ▲▲▲ [Changed] ▲▲▲
137
+
138
+ const active = isSelected ? textures.selected : textures.default;
139
+ if (bodyMesh && bodyMesh.material) { bodyMesh.material.map = active.body; bodyMesh.material.needsUpdate = true; }
140
+ if (tailMesh && tailMesh.material) { tailMesh.material.map = active.tail; tailMesh.material.needsUpdate = true; }
141
+
142
+ const glowColor = isSelected ? 0x2563eb : 0x000000;
143
+ const glowOpacity = isSelected ? 0.6 : 0.3;
144
+ if (textures.glow) {
145
+ const gData = textures.glow;
146
+ const gWidth = gData.width / 2;
147
+ const gHeight = gData.height / 2;
148
+ if (!glowMesh) {
149
+ const gGeo = new THREE.PlaneGeometry(gWidth, gHeight);
150
+ const gMat = new THREE.MeshBasicMaterial({
151
+ map: gData.texture,
152
+ transparent: true,
153
+ opacity: glowOpacity,
154
+ color: glowColor,
155
+ depthWrite: false,
156
+ depthTest: true
157
+ });
158
+ const glow = new THREE.Mesh(gGeo, gMat);
159
+ glow.name = 'glow';
160
+ glow.position.set(width / 2, -height / 2, -0.1);
161
+ glow.renderOrder = baseRenderOrder - 5;
162
+ glow.raycast = () => { };
163
+ existingGroup.add(glow);
164
+ } else {
165
+ if (glowMesh.geometry) glowMesh.geometry.dispose();
166
+ glowMesh.geometry = new THREE.PlaneGeometry(gWidth, gHeight);
167
+ glowMesh.material.map = gData.texture;
168
+ glowMesh.material.color.setHex(glowColor);
169
+ glowMesh.material.opacity = glowOpacity;
170
+ glowMesh.position.set(width / 2, -height / 2, -0.1);
171
+ glowMesh.renderOrder = baseRenderOrder - 5;
172
+ glowMesh.raycast = () => { };
173
+ glowMesh.material.needsUpdate = true;
174
+ }
175
+ }
176
+
177
+ existingGroup.userData.worldWidth = width;
178
+ existingGroup.userData.worldHeight = height;
179
+ existingGroup.userData.baseRenderOrder = baseRenderOrder;
180
+
181
+ return existingGroup;
182
+
183
+ } else {
184
+ // --- Create new group ---
185
+ const group = new THREE.Group();
186
+ const baseRenderOrder = module.nodeZCounter++;
187
+ // ▼▼▼ [Atlas] Safe access for Atlas mode where textures.selected/default may have null body ▼▼▼
188
+ const active = isSelected ? (textures?.selected || {}) : (textures?.default || {});
189
+ // ▲▲▲ [Atlas] ▲▲▲
190
+
191
+ // ▼▼▼ [Atlas] Glow handling - may be null in Atlas mode ▼▼▼
192
+ if (textures?.glow && textures.glow.texture) {
193
+ const glowData = textures.glow;
194
+ const gWidth = glowData.width / 2;
195
+ const gHeight = glowData.height / 2;
196
+ const gGeo = new THREE.PlaneGeometry(gWidth, gHeight);
197
+ const gMat = new THREE.MeshBasicMaterial({
198
+ map: glowData.texture,
199
+ transparent: true,
200
+ opacity: isSelected ? 0.6 : 0.3,
201
+ color: isSelected ? 0x2563eb : 0x000000,
202
+ depthWrite: false,
203
+ depthTest: true
204
+ });
205
+ const glowMesh = new THREE.Mesh(gGeo, gMat);
206
+ glowMesh.name = 'glow';
207
+ glowMesh.position.set(width / 2, -height / 2, -0.1);
208
+ glowMesh.renderOrder = baseRenderOrder - 5;
209
+ glowMesh.raycast = () => { };
210
+ group.add(glowMesh);
211
+ } else if (!isAtlasMode) {
212
+ // Non-atlas mode without glow - create a placeholder glow
213
+ const gWidth = (width + 40);
214
+ const gHeight = (height + 40);
215
+ const gGeo = new THREE.PlaneGeometry(gWidth, gHeight);
216
+ const gMat = new THREE.MeshBasicMaterial({
217
+ color: 0x000000,
218
+ transparent: true,
219
+ opacity: 0.3,
220
+ depthWrite: false,
221
+ depthTest: true
222
+ });
223
+ const glowMesh = new THREE.Mesh(gGeo, gMat);
224
+ glowMesh.name = 'glow';
225
+ glowMesh.position.set(width / 2, -height / 2, -0.1);
226
+ glowMesh.renderOrder = baseRenderOrder - 5;
227
+ glowMesh.raycast = () => { };
228
+ group.add(glowMesh);
229
+ }
230
+ // ▲▲▲ [Atlas] ▲▲▲
231
+
232
+ // Body
233
+ const bodyGeometry = new THREE.PlaneGeometry(width, height);
234
+ let bodyMaterial;
235
+
236
+ // ▼▼▼ [Atlas] Use atlas texture or individual texture ▼▼▼
237
+ if (isAtlasMode && atlasResult?.uvMap?.body) {
238
+ // Get the atlas texture from the manager
239
+ const uvRect = atlasResult.uvMap.body;
240
+ const atlasTexture = module.atlasManager.getAtlasTexture('body', uvRect.atlasIndex);
241
+
242
+ if (atlasTexture) {
243
+ // Create a material that samples from the atlas
244
+ // For now, use a standard material with a placeholder (full atlas)
245
+ // TODO: Implement proper UV-mapped instanced rendering
246
+ bodyMaterial = new THREE.MeshBasicMaterial({
247
+ map: atlasTexture,
248
+ transparent: true,
249
+ depthWrite: false,
250
+ depthTest: false
251
+ });
252
+
253
+ // Store UV info for potential shader-based rendering later
254
+ bodyGeometry.userData = { uvRect };
255
+
256
+ // Modify UVs to sample only the node's region from the atlas
257
+ const uvAttr = bodyGeometry.attributes.uv;
258
+ for (let i = 0; i < uvAttr.count; i++) {
259
+ const u = uvAttr.getX(i);
260
+ const v = uvAttr.getY(i);
261
+ uvAttr.setXY(
262
+ i,
263
+ uvRect.u + u * uvRect.w,
264
+ uvRect.v + (1 - v) * uvRect.h // Flip V for WebGL coordinates
265
+ );
266
+ }
267
+ uvAttr.needsUpdate = true;
268
+
269
+ console.log(`[ObjectManager] Atlas body UV applied for ${nodeModel.id}: u=${uvRect.u.toFixed(3)}, v=${uvRect.v.toFixed(3)}, w=${uvRect.w.toFixed(3)}, h=${uvRect.h.toFixed(3)}`);
270
+ } else {
271
+ // Fallback to placeholder if atlas texture not ready
272
+ console.warn(`[ObjectManager] Atlas texture not available for ${nodeModel.id}, using placeholder`);
273
+ bodyMaterial = new THREE.MeshBasicMaterial({ color: 0x333333, transparent: true, opacity: 0.5, depthWrite: false, depthTest: false });
274
+ }
275
+ } else {
276
+ // Standard mode: use individual texture
277
+ bodyMaterial = new THREE.MeshBasicMaterial({ map: active.body, transparent: true, depthWrite: false, depthTest: false });
278
+ }
279
+ // ▲▲▲ [Atlas] ▲▲▲
280
+
281
+ const bodyMesh = new THREE.Mesh(bodyGeometry, bodyMaterial);
282
+ bodyMesh.renderOrder = baseRenderOrder;
283
+ bodyMesh.name = 'body';
284
+ bodyMesh.position.set(width / 2, -height / 2, 0);
285
+ bodyMesh.userData.nodeId = nodeModel.id;
286
+ if (isAtlasMode) {
287
+ bodyMesh.userData.isAtlasMode = true;
288
+ bodyMesh.userData.atlasUVRect = atlasResult?.uvMap?.body;
289
+ }
290
+ group.add(bodyMesh);
291
+
292
+ const outlineGeometry = createRoundedRectGeometry(
293
+ width - OUTLINE_SHRINK,
294
+ height - OUTLINE_SHRINK,
295
+ OUTLINE_RADIUS
296
+ );
297
+ const outlineMaterial = new THREE.LineBasicMaterial({
298
+ color: outlineColor,
299
+ transparent: true,
300
+ opacity: 0.5
301
+ });
302
+ const outline = new THREE.LineLoop(outlineGeometry, outlineMaterial);
303
+ outline.name = 'outline';
304
+ outline.position.copy(bodyMesh.position);
305
+ outline.position.z = 0.1;
306
+ outline.visible = isSelected;
307
+ outline.renderOrder = baseRenderOrder + 1;
308
+ group.add(outline);
309
+
310
+ // Tail
311
+ const tailGeometry = new THREE.PlaneGeometry(TAIL_HEIGHT * 2, TAIL_HEIGHT);
312
+ // ▼▼▼ [Atlas] Handle atlas mode where tail texture may not be individual ▼▼▼
313
+ let tailMaterial;
314
+ if (isAtlasMode && !active?.tail) {
315
+ // For atlas mode, use a solid color or atlas tail texture
316
+ tailMaterial = new THREE.MeshBasicMaterial({ color: 0xfefefe, transparent: true, opacity: 0.9, depthWrite: false, depthTest: false });
317
+ } else {
318
+ tailMaterial = new THREE.MeshBasicMaterial({ map: active?.tail, transparent: true, depthWrite: false, depthTest: false });
319
+ }
320
+ // ▲▲▲ [Atlas] ▲▲▲
321
+ const tailMesh = new THREE.Mesh(tailGeometry, tailMaterial);
322
+ tailMesh.renderOrder = baseRenderOrder;
323
+ tailMesh.name = 'tail';
324
+ tailMesh.position.set(width / 2, -height - (TAIL_HEIGHT / 2), 0);
325
+ // ▼▼▼ [New] Add flags for tail click/hover hit-testing ▼▼▼
326
+ tailMesh.userData = { nodeId: nodeModel.id, isTailHandle: true };
327
+ // ▲▲▲ [New] ▲▲▲
328
+ group.add(tailMesh);
329
+
330
+ // ▼▼▼ [Changed] Add eight resize handles (4 corners + 4 edges spanning full length) ▼▼▼
331
+ if (nodeModel.contentType !== 'pdf') {
332
+ // Edge handles span from corner to corner (minus corner handle size)
333
+ const edgeWidthLength = Math.max(10, width - HANDLE_SIZE * 2); // horizontal edge length
334
+ const edgeHeightLength = Math.max(10, height - HANDLE_SIZE * 2); // vertical edge length
335
+ const handles = [
336
+ // Edges first (lower renderOrder, so corners have priority)
337
+ { name: 'resizeHandle_T', corner: 'T', x: width / 2, y: -HANDLE_SIZE / 2, w: edgeWidthLength, h: HANDLE_SIZE, order: 0 },
338
+ { name: 'resizeHandle_B', corner: 'B', x: width / 2, y: -height + HANDLE_SIZE / 2, w: edgeWidthLength, h: HANDLE_SIZE, order: 0 },
339
+ { name: 'resizeHandle_L', corner: 'L', x: HANDLE_SIZE / 2, y: -height / 2, w: HANDLE_SIZE, h: edgeHeightLength, order: 0 },
340
+ { name: 'resizeHandle_R', corner: 'R', x: width - HANDLE_SIZE / 2, y: -height / 2, w: HANDLE_SIZE, h: edgeHeightLength, order: 0 },
341
+ // Corners last (higher renderOrder, overlays edges)
342
+ { name: 'resizeHandle_TL', corner: 'TL', x: HANDLE_SIZE / 2, y: -HANDLE_SIZE / 2, w: HANDLE_SIZE, h: HANDLE_SIZE, order: 1 },
343
+ { name: 'resizeHandle_TR', corner: 'TR', x: width - HANDLE_SIZE / 2, y: -HANDLE_SIZE / 2, w: HANDLE_SIZE, h: HANDLE_SIZE, order: 1 },
344
+ { name: 'resizeHandle_BL', corner: 'BL', x: HANDLE_SIZE / 2, y: -height + HANDLE_SIZE / 2, w: HANDLE_SIZE, h: HANDLE_SIZE, order: 1 },
345
+ { name: 'resizeHandle_BR', corner: 'BR', x: width - HANDLE_SIZE / 2, y: -height + HANDLE_SIZE / 2, w: HANDLE_SIZE, h: HANDLE_SIZE, order: 1 }
346
+ ];
347
+ handles.forEach(c => {
348
+ const handleGeom = new THREE.PlaneGeometry(c.w, c.h);
349
+ const handleMat = new THREE.MeshBasicMaterial({ color: 0xff0000, transparent: true, opacity: 0.0, depthWrite: false, depthTest: false });
350
+ const handleMesh = new THREE.Mesh(handleGeom, handleMat);
351
+ handleMesh.name = c.name;
352
+ handleMesh.userData = { nodeId: nodeModel.id, isResizeHandle: true, corner: c.corner };
353
+ handleMesh.renderOrder = baseRenderOrder + 1 + c.order; // corners get +2, edges get +1
354
+ handleMesh.position.set(c.x, c.y, 1 + c.order * 0.1); // corners slightly in front
355
+ group.add(handleMesh);
356
+ });
357
+ }
358
+ // ▲▲▲ [Changed] ▲▲▲
359
+
360
+ group.position.set(nodeModel.positionX, nodeModel.positionY, zPos);
361
+ group.userData = { worldWidth: width, worldHeight: height, nodeId: nodeModel.id, baseRenderOrder };
362
+ return group;
363
+ }
364
+ }
365
+
366
+ // Expose MindMapObjectManager globally
367
+ window.MindMapObjectManager = {
368
+ createOrUpdateCanvasTextureNode: createOrUpdateCanvasTextureNode
369
+ };
370
+
371
+ console.log('✅ mind-map-object-manager.js loaded (Rounded Outline)');
372
+ })();