synabun 1.3.0 → 2.0.0-beta

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 (1153) hide show
  1. package/CHANGELOG.md +197 -662
  2. package/LICENSE-COMMERCIAL.md +33 -0
  3. package/NOTICE +17 -0
  4. package/README.md +175 -853
  5. package/THIRD-PARTY-LICENSES.md +131 -0
  6. package/benchmarks/browser-live-results.json +79 -0
  7. package/benchmarks/browser-v2-results.json +258 -0
  8. package/benchmarks/fixtures/browser/README.md +57 -0
  9. package/benchmarks/fixtures/browser/page-state.json +132 -0
  10. package/benchmarks/fixtures/browser/social.json +92 -0
  11. package/benchmarks/fixtures/browser/target.json +319 -0
  12. package/benchmarks/fixtures/desktop/README.md +58 -0
  13. package/benchmarks/fixtures/desktop/abstention.json +59 -0
  14. package/benchmarks/fixtures/desktop/adversarial.json +22 -0
  15. package/benchmarks/fixtures/desktop/forbidden.json +93 -0
  16. package/benchmarks/fixtures/desktop/generate.mjs +1023 -0
  17. package/benchmarks/fixtures/desktop/target.json +136 -0
  18. package/bin/synabun.js +30 -0
  19. package/docs/browser-v2.md +109 -0
  20. package/docs/hook-integrity.md +89 -0
  21. package/docs/judgments.md +182 -0
  22. package/docs/style-guide.md +246 -0
  23. package/docs/whatsapp.md +325 -0
  24. package/hooks/claude-code/post-plan.mjs +613 -391
  25. package/hooks/claude-code/post-remember.mjs +246 -122
  26. package/hooks/claude-code/pre-compact.mjs +171 -110
  27. package/hooks/claude-code/pre-task.mjs +133 -0
  28. package/hooks/claude-code/pre-websearch.mjs +15 -4
  29. package/hooks/claude-code/prompt-origin.mjs +94 -0
  30. package/hooks/claude-code/prompt-submit.mjs +1244 -861
  31. package/hooks/claude-code/session-start.mjs +114 -156
  32. package/hooks/claude-code/shared.mjs +1228 -368
  33. package/hooks/claude-code/state.mjs +167 -0
  34. package/hooks/claude-code/stop.mjs +515 -140
  35. package/hooks/claude-code/subagent-start.mjs +154 -0
  36. package/hooks/claude-code/subagent-stop.mjs +102 -0
  37. package/hooks/claude-code/task-gate.mjs +150 -0
  38. package/lib/claude-hooks.js +84 -0
  39. package/lib/claude-usage-audit.js +141 -0
  40. package/lib/client-config-repair.js +144 -0
  41. package/lib/data-home-migration.js +498 -0
  42. package/lib/first-launch-protection.js +240 -0
  43. package/lib/paths.d.ts +21 -0
  44. package/lib/paths.js +103 -0
  45. package/mcp-server/dist/config.d.ts +22 -0
  46. package/mcp-server/dist/config.d.ts.map +1 -0
  47. package/mcp-server/dist/config.js +109 -0
  48. package/mcp-server/dist/config.js.map +1 -0
  49. package/mcp-server/dist/http.d.ts +30 -0
  50. package/mcp-server/dist/http.d.ts.map +1 -0
  51. package/mcp-server/dist/http.js +276 -0
  52. package/mcp-server/dist/http.js.map +1 -0
  53. package/mcp-server/dist/index.d.ts +48 -0
  54. package/mcp-server/dist/index.d.ts.map +1 -0
  55. package/mcp-server/dist/index.js +538 -0
  56. package/mcp-server/dist/index.js.map +1 -0
  57. package/mcp-server/dist/preload-http.d.ts +3 -0
  58. package/mcp-server/dist/preload-http.d.ts.map +1 -0
  59. package/mcp-server/dist/preload-http.js +28 -0
  60. package/mcp-server/dist/preload-http.js.map +1 -0
  61. package/mcp-server/dist/preload.d.ts +3 -0
  62. package/mcp-server/dist/preload.d.ts.map +1 -0
  63. package/mcp-server/dist/preload.js +32 -0
  64. package/mcp-server/dist/preload.js.map +1 -0
  65. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts +19 -0
  66. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts.map +1 -0
  67. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js +403 -0
  68. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js.map +1 -0
  69. package/mcp-server/dist/scripts/setup-embeddings.d.ts +3 -0
  70. package/mcp-server/dist/scripts/setup-embeddings.d.ts.map +1 -0
  71. package/mcp-server/dist/scripts/setup-embeddings.js +15 -0
  72. package/mcp-server/dist/scripts/setup-embeddings.js.map +1 -0
  73. package/mcp-server/dist/services/assistant-judgments.d.ts +79 -0
  74. package/mcp-server/dist/services/assistant-judgments.d.ts.map +1 -0
  75. package/mcp-server/dist/services/assistant-judgments.js +128 -0
  76. package/mcp-server/dist/services/assistant-judgments.js.map +1 -0
  77. package/mcp-server/dist/services/browser-assist-gate.d.ts +314 -0
  78. package/mcp-server/dist/services/browser-assist-gate.d.ts.map +1 -0
  79. package/mcp-server/dist/services/browser-assist-gate.js +344 -0
  80. package/mcp-server/dist/services/browser-assist-gate.js.map +1 -0
  81. package/mcp-server/dist/services/browser-assist.d.ts +104 -0
  82. package/mcp-server/dist/services/browser-assist.d.ts.map +1 -0
  83. package/mcp-server/dist/services/browser-assist.js +282 -0
  84. package/mcp-server/dist/services/browser-assist.js.map +1 -0
  85. package/mcp-server/dist/services/browser-bench.d.ts +772 -0
  86. package/mcp-server/dist/services/browser-bench.d.ts.map +1 -0
  87. package/mcp-server/dist/services/browser-bench.js +424 -0
  88. package/mcp-server/dist/services/browser-bench.js.map +1 -0
  89. package/mcp-server/dist/services/browser-judgments.d.ts +196 -0
  90. package/mcp-server/dist/services/browser-judgments.d.ts.map +1 -0
  91. package/mcp-server/dist/services/browser-judgments.js +363 -0
  92. package/mcp-server/dist/services/browser-judgments.js.map +1 -0
  93. package/mcp-server/dist/services/browser-risk.d.ts +166 -0
  94. package/mcp-server/dist/services/browser-risk.d.ts.map +1 -0
  95. package/mcp-server/dist/services/browser-risk.js +458 -0
  96. package/mcp-server/dist/services/browser-risk.js.map +1 -0
  97. package/mcp-server/dist/services/categories.d.ts +61 -0
  98. package/mcp-server/dist/services/categories.d.ts.map +1 -0
  99. package/mcp-server/dist/services/categories.js +377 -0
  100. package/mcp-server/dist/services/categories.js.map +1 -0
  101. package/mcp-server/dist/services/codex-config-heal.d.ts +49 -0
  102. package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -0
  103. package/mcp-server/dist/services/codex-config-heal.js +346 -0
  104. package/mcp-server/dist/services/codex-config-heal.js.map +1 -0
  105. package/mcp-server/dist/services/desktop-assist-gate.d.ts +198 -0
  106. package/mcp-server/dist/services/desktop-assist-gate.d.ts.map +1 -0
  107. package/mcp-server/dist/services/desktop-assist-gate.js +202 -0
  108. package/mcp-server/dist/services/desktop-assist-gate.js.map +1 -0
  109. package/mcp-server/dist/services/desktop-assist.d.ts +104 -0
  110. package/mcp-server/dist/services/desktop-assist.d.ts.map +1 -0
  111. package/mcp-server/dist/services/desktop-assist.js +266 -0
  112. package/mcp-server/dist/services/desktop-assist.js.map +1 -0
  113. package/mcp-server/dist/services/desktop-bench.d.ts +553 -0
  114. package/mcp-server/dist/services/desktop-bench.d.ts.map +1 -0
  115. package/mcp-server/dist/services/desktop-bench.js +311 -0
  116. package/mcp-server/dist/services/desktop-bench.js.map +1 -0
  117. package/mcp-server/dist/services/desktop-client.d.ts +23 -0
  118. package/mcp-server/dist/services/desktop-client.d.ts.map +1 -0
  119. package/mcp-server/dist/services/desktop-client.js +79 -0
  120. package/mcp-server/dist/services/desktop-client.js.map +1 -0
  121. package/mcp-server/dist/services/desktop-judgments.d.ts +125 -0
  122. package/mcp-server/dist/services/desktop-judgments.d.ts.map +1 -0
  123. package/mcp-server/dist/services/desktop-judgments.js +177 -0
  124. package/mcp-server/dist/services/desktop-judgments.js.map +1 -0
  125. package/mcp-server/dist/services/desktop-risk.d.ts +283 -0
  126. package/mcp-server/dist/services/desktop-risk.d.ts.map +1 -0
  127. package/mcp-server/dist/services/desktop-risk.js +605 -0
  128. package/mcp-server/dist/services/desktop-risk.js.map +1 -0
  129. package/mcp-server/dist/services/discord.d.ts +112 -0
  130. package/mcp-server/dist/services/discord.d.ts.map +1 -0
  131. package/mcp-server/dist/services/discord.js +477 -0
  132. package/mcp-server/dist/services/discord.js.map +1 -0
  133. package/mcp-server/dist/services/edit-stale.d.ts +81 -0
  134. package/mcp-server/dist/services/edit-stale.d.ts.map +1 -0
  135. package/mcp-server/dist/services/edit-stale.js +358 -0
  136. package/mcp-server/dist/services/edit-stale.js.map +1 -0
  137. package/mcp-server/dist/services/embedding-service.d.ts +16 -0
  138. package/mcp-server/dist/services/embedding-service.d.ts.map +1 -0
  139. package/mcp-server/dist/services/embedding-service.js +126 -0
  140. package/mcp-server/dist/services/embedding-service.js.map +1 -0
  141. package/mcp-server/dist/services/embedding-worker.d.ts +2 -0
  142. package/mcp-server/dist/services/embedding-worker.d.ts.map +1 -0
  143. package/mcp-server/dist/services/embedding-worker.js +52 -0
  144. package/mcp-server/dist/services/embedding-worker.js.map +1 -0
  145. package/mcp-server/dist/services/fb-regions.d.ts +71 -0
  146. package/mcp-server/dist/services/fb-regions.d.ts.map +1 -0
  147. package/mcp-server/dist/services/fb-regions.js +211 -0
  148. package/mcp-server/dist/services/fb-regions.js.map +1 -0
  149. package/mcp-server/dist/services/file-checksums.d.ts +22 -0
  150. package/mcp-server/dist/services/file-checksums.d.ts.map +1 -0
  151. package/mcp-server/dist/services/file-checksums.js +55 -0
  152. package/mcp-server/dist/services/file-checksums.js.map +1 -0
  153. package/mcp-server/dist/services/file-excerpt.d.ts +24 -0
  154. package/mcp-server/dist/services/file-excerpt.d.ts.map +1 -0
  155. package/mcp-server/dist/services/file-excerpt.js +65 -0
  156. package/mcp-server/dist/services/file-excerpt.js.map +1 -0
  157. package/mcp-server/dist/services/identity.d.ts +124 -0
  158. package/mcp-server/dist/services/identity.d.ts.map +1 -0
  159. package/mcp-server/dist/services/identity.js +241 -0
  160. package/mcp-server/dist/services/identity.js.map +1 -0
  161. package/mcp-server/dist/services/local-embeddings.d.ts +2 -0
  162. package/mcp-server/dist/services/local-embeddings.d.ts.map +1 -0
  163. package/mcp-server/dist/services/local-embeddings.js +3 -0
  164. package/mcp-server/dist/services/local-embeddings.js.map +1 -0
  165. package/mcp-server/dist/services/memory-client.d.ts +4 -0
  166. package/mcp-server/dist/services/memory-client.d.ts.map +1 -0
  167. package/mcp-server/dist/services/memory-client.js +27 -0
  168. package/mcp-server/dist/services/memory-client.js.map +1 -0
  169. package/mcp-server/dist/services/memory-judge-backfill.d.ts +135 -0
  170. package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -0
  171. package/mcp-server/dist/services/memory-judge-backfill.js +510 -0
  172. package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -0
  173. package/mcp-server/dist/services/memory-judgments.d.ts +362 -0
  174. package/mcp-server/dist/services/memory-judgments.d.ts.map +1 -0
  175. package/mcp-server/dist/services/memory-judgments.js +674 -0
  176. package/mcp-server/dist/services/memory-judgments.js.map +1 -0
  177. package/mcp-server/dist/services/memory-maintenance.d.ts +108 -0
  178. package/mcp-server/dist/services/memory-maintenance.d.ts.map +1 -0
  179. package/mcp-server/dist/services/memory-maintenance.js +403 -0
  180. package/mcp-server/dist/services/memory-maintenance.js.map +1 -0
  181. package/mcp-server/dist/services/memory-retrieval.d.ts +66 -0
  182. package/mcp-server/dist/services/memory-retrieval.d.ts.map +1 -0
  183. package/mcp-server/dist/services/memory-retrieval.js +412 -0
  184. package/mcp-server/dist/services/memory-retrieval.js.map +1 -0
  185. package/mcp-server/dist/services/memory-schema.d.ts +16 -0
  186. package/mcp-server/dist/services/memory-schema.d.ts.map +1 -0
  187. package/mcp-server/dist/services/memory-schema.js +282 -0
  188. package/mcp-server/dist/services/memory-schema.js.map +1 -0
  189. package/mcp-server/dist/services/memory-sessions.d.ts +24 -0
  190. package/mcp-server/dist/services/memory-sessions.d.ts.map +1 -0
  191. package/mcp-server/dist/services/memory-sessions.js +110 -0
  192. package/mcp-server/dist/services/memory-sessions.js.map +1 -0
  193. package/mcp-server/dist/services/memory-triage.d.ts +60 -0
  194. package/mcp-server/dist/services/memory-triage.d.ts.map +1 -0
  195. package/mcp-server/dist/services/memory-triage.js +189 -0
  196. package/mcp-server/dist/services/memory-triage.js.map +1 -0
  197. package/mcp-server/dist/services/memory-verification.d.ts +24 -0
  198. package/mcp-server/dist/services/memory-verification.d.ts.map +1 -0
  199. package/mcp-server/dist/services/memory-verification.js +92 -0
  200. package/mcp-server/dist/services/memory-verification.js.map +1 -0
  201. package/mcp-server/dist/services/memory-writer.d.ts +26 -0
  202. package/mcp-server/dist/services/memory-writer.d.ts.map +1 -0
  203. package/mcp-server/dist/services/memory-writer.js +126 -0
  204. package/mcp-server/dist/services/memory-writer.js.map +1 -0
  205. package/mcp-server/dist/services/neural-interface.d.ts +439 -0
  206. package/mcp-server/dist/services/neural-interface.d.ts.map +1 -0
  207. package/mcp-server/dist/services/neural-interface.js +1135 -0
  208. package/mcp-server/dist/services/neural-interface.js.map +1 -0
  209. package/mcp-server/dist/services/profiles.d.ts +120 -0
  210. package/mcp-server/dist/services/profiles.d.ts.map +1 -0
  211. package/mcp-server/dist/services/profiles.js +387 -0
  212. package/mcp-server/dist/services/profiles.js.map +1 -0
  213. package/mcp-server/dist/services/secret-gate.d.ts +29 -0
  214. package/mcp-server/dist/services/secret-gate.d.ts.map +1 -0
  215. package/mcp-server/dist/services/secret-gate.js +43 -0
  216. package/mcp-server/dist/services/secret-gate.js.map +1 -0
  217. package/mcp-server/dist/services/server-instructions.d.ts +10 -0
  218. package/mcp-server/dist/services/server-instructions.d.ts.map +1 -0
  219. package/mcp-server/dist/services/server-instructions.js +101 -0
  220. package/mcp-server/dist/services/server-instructions.js.map +1 -0
  221. package/mcp-server/dist/services/sqlite.d.ts +235 -0
  222. package/mcp-server/dist/services/sqlite.d.ts.map +1 -0
  223. package/mcp-server/dist/services/sqlite.js +1185 -0
  224. package/mcp-server/dist/services/sqlite.js.map +1 -0
  225. package/mcp-server/dist/services/typesafe-bench.d.ts +99 -0
  226. package/mcp-server/dist/services/typesafe-bench.d.ts.map +1 -0
  227. package/mcp-server/dist/services/typesafe-bench.js +218 -0
  228. package/mcp-server/dist/services/typesafe-bench.js.map +1 -0
  229. package/mcp-server/dist/services/typesafe-config.d.ts +342 -0
  230. package/mcp-server/dist/services/typesafe-config.d.ts.map +1 -0
  231. package/mcp-server/dist/services/typesafe-config.js +746 -0
  232. package/mcp-server/dist/services/typesafe-config.js.map +1 -0
  233. package/mcp-server/dist/services/typesafe.d.ts +213 -0
  234. package/mcp-server/dist/services/typesafe.d.ts.map +1 -0
  235. package/mcp-server/dist/services/typesafe.js +330 -0
  236. package/mcp-server/dist/services/typesafe.js.map +1 -0
  237. package/mcp-server/dist/services/vector-cache.d.ts +68 -0
  238. package/mcp-server/dist/services/vector-cache.d.ts.map +1 -0
  239. package/mcp-server/dist/services/vector-cache.js +271 -0
  240. package/mcp-server/dist/services/vector-cache.js.map +1 -0
  241. package/mcp-server/dist/services/whiteboard-geometry.d.ts +305 -0
  242. package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -0
  243. package/mcp-server/dist/services/whiteboard-geometry.js +666 -0
  244. package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -0
  245. package/mcp-server/dist/tools/agents.d.ts +212 -0
  246. package/mcp-server/dist/tools/agents.d.ts.map +1 -0
  247. package/mcp-server/dist/tools/agents.js +407 -0
  248. package/mcp-server/dist/tools/agents.js.map +1 -0
  249. package/mcp-server/dist/tools/bluesky.d.ts +39 -0
  250. package/mcp-server/dist/tools/bluesky.d.ts.map +1 -0
  251. package/mcp-server/dist/tools/bluesky.js +1144 -0
  252. package/mcp-server/dist/tools/bluesky.js.map +1 -0
  253. package/mcp-server/dist/tools/browser-advanced.d.ts +58 -0
  254. package/mcp-server/dist/tools/browser-advanced.d.ts.map +1 -0
  255. package/mcp-server/dist/tools/browser-advanced.js +106 -0
  256. package/mcp-server/dist/tools/browser-advanced.js.map +1 -0
  257. package/mcp-server/dist/tools/browser-batch.d.ts +99 -0
  258. package/mcp-server/dist/tools/browser-batch.d.ts.map +1 -0
  259. package/mcp-server/dist/tools/browser-batch.js +187 -0
  260. package/mcp-server/dist/tools/browser-batch.js.map +1 -0
  261. package/mcp-server/dist/tools/browser-cheatsheet.d.ts +21 -0
  262. package/mcp-server/dist/tools/browser-cheatsheet.d.ts.map +1 -0
  263. package/mcp-server/dist/tools/browser-cheatsheet.js +144 -0
  264. package/mcp-server/dist/tools/browser-cheatsheet.js.map +1 -0
  265. package/mcp-server/dist/tools/browser-interact.d.ts +239 -0
  266. package/mcp-server/dist/tools/browser-interact.d.ts.map +1 -0
  267. package/mcp-server/dist/tools/browser-interact.js +300 -0
  268. package/mcp-server/dist/tools/browser-interact.js.map +1 -0
  269. package/mcp-server/dist/tools/browser-navigate.d.ts +90 -0
  270. package/mcp-server/dist/tools/browser-navigate.d.ts.map +1 -0
  271. package/mcp-server/dist/tools/browser-navigate.js +142 -0
  272. package/mcp-server/dist/tools/browser-navigate.js.map +1 -0
  273. package/mcp-server/dist/tools/browser-observe.d.ts +561 -0
  274. package/mcp-server/dist/tools/browser-observe.d.ts.map +1 -0
  275. package/mcp-server/dist/tools/browser-observe.js +2009 -0
  276. package/mcp-server/dist/tools/browser-observe.js.map +1 -0
  277. package/mcp-server/dist/tools/browser.d.ts +34 -0
  278. package/mcp-server/dist/tools/browser.d.ts.map +1 -0
  279. package/mcp-server/dist/tools/browser.js +112 -0
  280. package/mcp-server/dist/tools/browser.js.map +1 -0
  281. package/mcp-server/dist/tools/card-tools.d.ts +82 -0
  282. package/mcp-server/dist/tools/card-tools.d.ts.map +1 -0
  283. package/mcp-server/dist/tools/card-tools.js +137 -0
  284. package/mcp-server/dist/tools/card-tools.js.map +1 -0
  285. package/mcp-server/dist/tools/card.d.ts +8 -0
  286. package/mcp-server/dist/tools/card.d.ts.map +1 -0
  287. package/mcp-server/dist/tools/card.js +16 -0
  288. package/mcp-server/dist/tools/card.js.map +1 -0
  289. package/mcp-server/dist/tools/category.d.ts +32 -0
  290. package/mcp-server/dist/tools/category.d.ts.map +1 -0
  291. package/mcp-server/dist/tools/category.js +290 -0
  292. package/mcp-server/dist/tools/category.js.map +1 -0
  293. package/mcp-server/dist/tools/choice.d.ts +160 -0
  294. package/mcp-server/dist/tools/choice.d.ts.map +1 -0
  295. package/mcp-server/dist/tools/choice.js +80 -0
  296. package/mcp-server/dist/tools/choice.js.map +1 -0
  297. package/mcp-server/dist/tools/computer.d.ts +71 -0
  298. package/mcp-server/dist/tools/computer.d.ts.map +1 -0
  299. package/mcp-server/dist/tools/computer.js +174 -0
  300. package/mcp-server/dist/tools/computer.js.map +1 -0
  301. package/mcp-server/dist/tools/discord-channel.d.ts +44 -0
  302. package/mcp-server/dist/tools/discord-channel.d.ts.map +1 -0
  303. package/mcp-server/dist/tools/discord-channel.js +236 -0
  304. package/mcp-server/dist/tools/discord-channel.js.map +1 -0
  305. package/mcp-server/dist/tools/discord-guild.d.ts +20 -0
  306. package/mcp-server/dist/tools/discord-guild.d.ts.map +1 -0
  307. package/mcp-server/dist/tools/discord-guild.js +138 -0
  308. package/mcp-server/dist/tools/discord-guild.js.map +1 -0
  309. package/mcp-server/dist/tools/discord-member.d.ts +26 -0
  310. package/mcp-server/dist/tools/discord-member.d.ts.map +1 -0
  311. package/mcp-server/dist/tools/discord-member.js +122 -0
  312. package/mcp-server/dist/tools/discord-member.js.map +1 -0
  313. package/mcp-server/dist/tools/discord-message.d.ts +36 -0
  314. package/mcp-server/dist/tools/discord-message.d.ts.map +1 -0
  315. package/mcp-server/dist/tools/discord-message.js +184 -0
  316. package/mcp-server/dist/tools/discord-message.js.map +1 -0
  317. package/mcp-server/dist/tools/discord-onboarding.d.ts +32 -0
  318. package/mcp-server/dist/tools/discord-onboarding.d.ts.map +1 -0
  319. package/mcp-server/dist/tools/discord-onboarding.js +179 -0
  320. package/mcp-server/dist/tools/discord-onboarding.js.map +1 -0
  321. package/mcp-server/dist/tools/discord-role.d.ts +34 -0
  322. package/mcp-server/dist/tools/discord-role.d.ts.map +1 -0
  323. package/mcp-server/dist/tools/discord-role.js +178 -0
  324. package/mcp-server/dist/tools/discord-role.js.map +1 -0
  325. package/mcp-server/dist/tools/discord-thread.d.ts +28 -0
  326. package/mcp-server/dist/tools/discord-thread.d.ts.map +1 -0
  327. package/mcp-server/dist/tools/discord-thread.js +88 -0
  328. package/mcp-server/dist/tools/discord-thread.js.map +1 -0
  329. package/mcp-server/dist/tools/discord-webhook.d.ts +32 -0
  330. package/mcp-server/dist/tools/discord-webhook.d.ts.map +1 -0
  331. package/mcp-server/dist/tools/discord-webhook.js +154 -0
  332. package/mcp-server/dist/tools/discord-webhook.js.map +1 -0
  333. package/mcp-server/dist/tools/discord.d.ts +7 -0
  334. package/mcp-server/dist/tools/discord.d.ts.map +1 -0
  335. package/mcp-server/dist/tools/discord.js +25 -0
  336. package/mcp-server/dist/tools/discord.js.map +1 -0
  337. package/mcp-server/dist/tools/fb-groups.d.ts +98 -0
  338. package/mcp-server/dist/tools/fb-groups.d.ts.map +1 -0
  339. package/mcp-server/dist/tools/fb-groups.js +369 -0
  340. package/mcp-server/dist/tools/fb-groups.js.map +1 -0
  341. package/mcp-server/dist/tools/forget.d.ts +14 -0
  342. package/mcp-server/dist/tools/forget.d.ts.map +1 -0
  343. package/mcp-server/dist/tools/forget.js +26 -0
  344. package/mcp-server/dist/tools/forget.js.map +1 -0
  345. package/mcp-server/dist/tools/git-tools.d.ts +24 -0
  346. package/mcp-server/dist/tools/git-tools.d.ts.map +1 -0
  347. package/mcp-server/dist/tools/git-tools.js +107 -0
  348. package/mcp-server/dist/tools/git-tools.js.map +1 -0
  349. package/mcp-server/dist/tools/git.d.ts +7 -0
  350. package/mcp-server/dist/tools/git.d.ts.map +1 -0
  351. package/mcp-server/dist/tools/git.js +11 -0
  352. package/mcp-server/dist/tools/git.js.map +1 -0
  353. package/mcp-server/dist/tools/gsc/experience.d.ts +135 -0
  354. package/mcp-server/dist/tools/gsc/experience.d.ts.map +1 -0
  355. package/mcp-server/dist/tools/gsc/experience.js +351 -0
  356. package/mcp-server/dist/tools/gsc/experience.js.map +1 -0
  357. package/mcp-server/dist/tools/gsc/helpers.d.ts +78 -0
  358. package/mcp-server/dist/tools/gsc/helpers.d.ts.map +1 -0
  359. package/mcp-server/dist/tools/gsc/helpers.js +258 -0
  360. package/mcp-server/dist/tools/gsc/helpers.js.map +1 -0
  361. package/mcp-server/dist/tools/gsc/indexing.d.ts +121 -0
  362. package/mcp-server/dist/tools/gsc/indexing.d.ts.map +1 -0
  363. package/mcp-server/dist/tools/gsc/indexing.js +357 -0
  364. package/mcp-server/dist/tools/gsc/indexing.js.map +1 -0
  365. package/mcp-server/dist/tools/gsc/inspect.d.ts +78 -0
  366. package/mcp-server/dist/tools/gsc/inspect.d.ts.map +1 -0
  367. package/mcp-server/dist/tools/gsc/inspect.js +321 -0
  368. package/mcp-server/dist/tools/gsc/inspect.js.map +1 -0
  369. package/mcp-server/dist/tools/gsc/navigate.d.ts +44 -0
  370. package/mcp-server/dist/tools/gsc/navigate.d.ts.map +1 -0
  371. package/mcp-server/dist/tools/gsc/navigate.js +197 -0
  372. package/mcp-server/dist/tools/gsc/navigate.js.map +1 -0
  373. package/mcp-server/dist/tools/gsc/performance.d.ts +84 -0
  374. package/mcp-server/dist/tools/gsc/performance.d.ts.map +1 -0
  375. package/mcp-server/dist/tools/gsc/performance.js +274 -0
  376. package/mcp-server/dist/tools/gsc/performance.js.map +1 -0
  377. package/mcp-server/dist/tools/gsc/settings.d.ts +153 -0
  378. package/mcp-server/dist/tools/gsc/settings.d.ts.map +1 -0
  379. package/mcp-server/dist/tools/gsc/settings.js +425 -0
  380. package/mcp-server/dist/tools/gsc/settings.js.map +1 -0
  381. package/mcp-server/dist/tools/gsc.d.ts +7 -0
  382. package/mcp-server/dist/tools/gsc.d.ts.map +1 -0
  383. package/mcp-server/dist/tools/gsc.js +51 -0
  384. package/mcp-server/dist/tools/gsc.js.map +1 -0
  385. package/mcp-server/dist/tools/image-tools.d.ts +24 -0
  386. package/mcp-server/dist/tools/image-tools.d.ts.map +1 -0
  387. package/mcp-server/dist/tools/image-tools.js +80 -0
  388. package/mcp-server/dist/tools/image-tools.js.map +1 -0
  389. package/mcp-server/dist/tools/image.d.ts +10 -0
  390. package/mcp-server/dist/tools/image.d.ts.map +1 -0
  391. package/mcp-server/dist/tools/image.js +14 -0
  392. package/mcp-server/dist/tools/image.js.map +1 -0
  393. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +97 -0
  394. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +1 -0
  395. package/mcp-server/dist/tools/leonardo-browser-tools.js +228 -0
  396. package/mcp-server/dist/tools/leonardo-browser-tools.js.map +1 -0
  397. package/mcp-server/dist/tools/leonardo.d.ts +13 -0
  398. package/mcp-server/dist/tools/leonardo.d.ts.map +1 -0
  399. package/mcp-server/dist/tools/leonardo.js +21 -0
  400. package/mcp-server/dist/tools/leonardo.js.map +1 -0
  401. package/mcp-server/dist/tools/loop.d.ts +30 -0
  402. package/mcp-server/dist/tools/loop.d.ts.map +1 -0
  403. package/mcp-server/dist/tools/loop.js +401 -0
  404. package/mcp-server/dist/tools/loop.js.map +1 -0
  405. package/mcp-server/dist/tools/memories.d.ts +56 -0
  406. package/mcp-server/dist/tools/memories.d.ts.map +1 -0
  407. package/mcp-server/dist/tools/memories.js +171 -0
  408. package/mcp-server/dist/tools/memories.js.map +1 -0
  409. package/mcp-server/dist/tools/morelogin.d.ts +24 -0
  410. package/mcp-server/dist/tools/morelogin.d.ts.map +1 -0
  411. package/mcp-server/dist/tools/morelogin.js +79 -0
  412. package/mcp-server/dist/tools/morelogin.js.map +1 -0
  413. package/mcp-server/dist/tools/profile.d.ts +17 -0
  414. package/mcp-server/dist/tools/profile.d.ts.map +1 -0
  415. package/mcp-server/dist/tools/profile.js +114 -0
  416. package/mcp-server/dist/tools/profile.js.map +1 -0
  417. package/mcp-server/dist/tools/recall.d.ts +71 -0
  418. package/mcp-server/dist/tools/recall.d.ts.map +1 -0
  419. package/mcp-server/dist/tools/recall.js +147 -0
  420. package/mcp-server/dist/tools/recall.js.map +1 -0
  421. package/mcp-server/dist/tools/reflect.d.ts +56 -0
  422. package/mcp-server/dist/tools/reflect.d.ts.map +1 -0
  423. package/mcp-server/dist/tools/reflect.js +157 -0
  424. package/mcp-server/dist/tools/reflect.js.map +1 -0
  425. package/mcp-server/dist/tools/remember.d.ts +62 -0
  426. package/mcp-server/dist/tools/remember.d.ts.map +1 -0
  427. package/mcp-server/dist/tools/remember.js +201 -0
  428. package/mcp-server/dist/tools/remember.js.map +1 -0
  429. package/mcp-server/dist/tools/response.d.ts +23 -0
  430. package/mcp-server/dist/tools/response.d.ts.map +1 -0
  431. package/mcp-server/dist/tools/response.js +24 -0
  432. package/mcp-server/dist/tools/response.js.map +1 -0
  433. package/mcp-server/dist/tools/restore.d.ts +14 -0
  434. package/mcp-server/dist/tools/restore.d.ts.map +1 -0
  435. package/mcp-server/dist/tools/restore.js +23 -0
  436. package/mcp-server/dist/tools/restore.js.map +1 -0
  437. package/mcp-server/dist/tools/style-guide-tools.d.ts +51 -0
  438. package/mcp-server/dist/tools/style-guide-tools.d.ts.map +1 -0
  439. package/mcp-server/dist/tools/style-guide-tools.js +231 -0
  440. package/mcp-server/dist/tools/style-guide-tools.js.map +1 -0
  441. package/mcp-server/dist/tools/style-guide.d.ts +8 -0
  442. package/mcp-server/dist/tools/style-guide.d.ts.map +1 -0
  443. package/mcp-server/dist/tools/style-guide.js +12 -0
  444. package/mcp-server/dist/tools/style-guide.js.map +1 -0
  445. package/mcp-server/dist/tools/sync.d.ts +20 -0
  446. package/mcp-server/dist/tools/sync.d.ts.map +1 -0
  447. package/mcp-server/dist/tools/sync.js +156 -0
  448. package/mcp-server/dist/tools/sync.js.map +1 -0
  449. package/mcp-server/dist/tools/tictactoe-tools.d.ts +18 -0
  450. package/mcp-server/dist/tools/tictactoe-tools.d.ts.map +1 -0
  451. package/mcp-server/dist/tools/tictactoe-tools.js +78 -0
  452. package/mcp-server/dist/tools/tictactoe-tools.js.map +1 -0
  453. package/mcp-server/dist/tools/tictactoe.d.ts +7 -0
  454. package/mcp-server/dist/tools/tictactoe.d.ts.map +1 -0
  455. package/mcp-server/dist/tools/tictactoe.js +11 -0
  456. package/mcp-server/dist/tools/tictactoe.js.map +1 -0
  457. package/mcp-server/dist/tools/utils.d.ts +19 -0
  458. package/mcp-server/dist/tools/utils.d.ts.map +1 -0
  459. package/mcp-server/dist/tools/utils.js +54 -0
  460. package/mcp-server/dist/tools/utils.js.map +1 -0
  461. package/mcp-server/dist/tools/whiteboard-format.d.ts +88 -0
  462. package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -0
  463. package/mcp-server/dist/tools/whiteboard-format.js +337 -0
  464. package/mcp-server/dist/tools/whiteboard-format.js.map +1 -0
  465. package/mcp-server/dist/tools/whiteboard-tools.d.ts +326 -0
  466. package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -0
  467. package/mcp-server/dist/tools/whiteboard-tools.js +222 -0
  468. package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -0
  469. package/mcp-server/dist/tools/whiteboard.d.ts +8 -0
  470. package/mcp-server/dist/tools/whiteboard.d.ts.map +1 -0
  471. package/mcp-server/dist/tools/whiteboard.js +16 -0
  472. package/mcp-server/dist/tools/whiteboard.js.map +1 -0
  473. package/mcp-server/dist/tools/youtube/analytics.d.ts +46 -0
  474. package/mcp-server/dist/tools/youtube/analytics.d.ts.map +1 -0
  475. package/mcp-server/dist/tools/youtube/analytics.js +83 -0
  476. package/mcp-server/dist/tools/youtube/analytics.js.map +1 -0
  477. package/mcp-server/dist/tools/youtube/dedup.d.ts +35 -0
  478. package/mcp-server/dist/tools/youtube/dedup.d.ts.map +1 -0
  479. package/mcp-server/dist/tools/youtube/dedup.js +56 -0
  480. package/mcp-server/dist/tools/youtube/dedup.js.map +1 -0
  481. package/mcp-server/dist/tools/youtube/download.d.ts +31 -0
  482. package/mcp-server/dist/tools/youtube/download.d.ts.map +1 -0
  483. package/mcp-server/dist/tools/youtube/download.js +30 -0
  484. package/mcp-server/dist/tools/youtube/download.js.map +1 -0
  485. package/mcp-server/dist/tools/youtube/helpers.d.ts +66 -0
  486. package/mcp-server/dist/tools/youtube/helpers.d.ts.map +1 -0
  487. package/mcp-server/dist/tools/youtube/helpers.js +143 -0
  488. package/mcp-server/dist/tools/youtube/helpers.js.map +1 -0
  489. package/mcp-server/dist/tools/youtube/media.d.ts +43 -0
  490. package/mcp-server/dist/tools/youtube/media.d.ts.map +1 -0
  491. package/mcp-server/dist/tools/youtube/media.js +97 -0
  492. package/mcp-server/dist/tools/youtube/media.js.map +1 -0
  493. package/mcp-server/dist/tools/youtube/metadata.d.ts +33 -0
  494. package/mcp-server/dist/tools/youtube/metadata.d.ts.map +1 -0
  495. package/mcp-server/dist/tools/youtube/metadata.js +106 -0
  496. package/mcp-server/dist/tools/youtube/metadata.js.map +1 -0
  497. package/mcp-server/dist/tools/youtube/navigate.d.ts +30 -0
  498. package/mcp-server/dist/tools/youtube/navigate.d.ts.map +1 -0
  499. package/mcp-server/dist/tools/youtube/navigate.js +71 -0
  500. package/mcp-server/dist/tools/youtube/navigate.js.map +1 -0
  501. package/mcp-server/dist/tools/youtube/playlist.d.ts +29 -0
  502. package/mcp-server/dist/tools/youtube/playlist.d.ts.map +1 -0
  503. package/mcp-server/dist/tools/youtube/playlist.js +128 -0
  504. package/mcp-server/dist/tools/youtube/playlist.js.map +1 -0
  505. package/mcp-server/dist/tools/youtube/schedule.d.ts +31 -0
  506. package/mcp-server/dist/tools/youtube/schedule.d.ts.map +1 -0
  507. package/mcp-server/dist/tools/youtube/schedule.js +147 -0
  508. package/mcp-server/dist/tools/youtube/schedule.js.map +1 -0
  509. package/mcp-server/dist/tools/youtube/source.d.ts +36 -0
  510. package/mcp-server/dist/tools/youtube/source.d.ts.map +1 -0
  511. package/mcp-server/dist/tools/youtube/source.js +85 -0
  512. package/mcp-server/dist/tools/youtube/source.js.map +1 -0
  513. package/mcp-server/dist/tools/youtube/upload.d.ts +53 -0
  514. package/mcp-server/dist/tools/youtube/upload.d.ts.map +1 -0
  515. package/mcp-server/dist/tools/youtube/upload.js +255 -0
  516. package/mcp-server/dist/tools/youtube/upload.js.map +1 -0
  517. package/mcp-server/dist/tools/youtube.d.ts +12 -0
  518. package/mcp-server/dist/tools/youtube.d.ts.map +1 -0
  519. package/mcp-server/dist/tools/youtube.js +38 -0
  520. package/mcp-server/dist/tools/youtube.js.map +1 -0
  521. package/mcp-server/dist/tui.d.ts +3 -0
  522. package/mcp-server/dist/tui.d.ts.map +1 -0
  523. package/mcp-server/dist/tui.js +806 -0
  524. package/mcp-server/dist/tui.js.map +1 -0
  525. package/mcp-server/dist/types.d.ts +77 -0
  526. package/mcp-server/dist/types.d.ts.map +1 -0
  527. package/mcp-server/dist/types.js +2 -0
  528. package/mcp-server/dist/types.js.map +1 -0
  529. package/mcp-server/package-lock.json +4798 -0
  530. package/mcp-server/package.json +55 -38
  531. package/mcp-server/run.mjs +12 -2
  532. package/mcp-server/src/config.ts +48 -3
  533. package/mcp-server/src/http.ts +296 -93
  534. package/mcp-server/src/index.ts +546 -203
  535. package/mcp-server/src/preload-http.ts +19 -18
  536. package/mcp-server/src/preload.ts +19 -18
  537. package/mcp-server/src/scripts/setup-embeddings.ts +9 -0
  538. package/mcp-server/src/services/assistant-judgments.ts +157 -0
  539. package/mcp-server/src/services/browser-assist-gate.ts +383 -0
  540. package/mcp-server/src/services/browser-assist.ts +267 -0
  541. package/mcp-server/src/services/browser-bench.ts +477 -0
  542. package/mcp-server/src/services/browser-judgments.ts +414 -0
  543. package/mcp-server/src/services/browser-risk.ts +484 -0
  544. package/mcp-server/src/services/categories.ts +36 -19
  545. package/mcp-server/src/services/codex-config-heal.ts +403 -0
  546. package/mcp-server/src/services/desktop-assist-gate.ts +251 -0
  547. package/mcp-server/src/services/desktop-assist.ts +308 -0
  548. package/mcp-server/src/services/desktop-bench.ts +372 -0
  549. package/mcp-server/src/services/desktop-client.ts +76 -0
  550. package/mcp-server/src/services/desktop-judgments.ts +218 -0
  551. package/mcp-server/src/services/desktop-risk.ts +743 -0
  552. package/mcp-server/src/services/edit-stale.ts +299 -0
  553. package/mcp-server/src/services/embedding-service.ts +108 -0
  554. package/mcp-server/src/services/embedding-worker.ts +46 -0
  555. package/mcp-server/src/services/fb-regions.ts +221 -0
  556. package/mcp-server/src/services/file-checksums.ts +26 -9
  557. package/mcp-server/src/services/file-excerpt.ts +59 -0
  558. package/mcp-server/src/services/identity.ts +291 -0
  559. package/mcp-server/src/services/local-embeddings.ts +2 -77
  560. package/mcp-server/src/services/memory-client.ts +23 -0
  561. package/mcp-server/src/services/memory-judge-backfill.ts +462 -0
  562. package/mcp-server/src/services/memory-judgments.ts +901 -0
  563. package/mcp-server/src/services/memory-maintenance.ts +360 -0
  564. package/mcp-server/src/services/memory-retrieval.ts +349 -0
  565. package/mcp-server/src/services/memory-schema.ts +280 -0
  566. package/mcp-server/src/services/memory-sessions.ts +87 -0
  567. package/mcp-server/src/services/memory-triage.ts +182 -0
  568. package/mcp-server/src/services/memory-verification.ts +68 -0
  569. package/mcp-server/src/services/memory-writer.ts +125 -0
  570. package/mcp-server/src/services/neural-interface.ts +1217 -73
  571. package/mcp-server/src/services/profiles.ts +428 -0
  572. package/mcp-server/src/services/secret-gate.ts +52 -0
  573. package/mcp-server/src/services/server-instructions.ts +122 -0
  574. package/mcp-server/src/services/sqlite.ts +1456 -823
  575. package/mcp-server/src/services/typesafe-bench.ts +247 -0
  576. package/mcp-server/src/services/typesafe-config.ts +790 -0
  577. package/mcp-server/src/services/typesafe.ts +390 -0
  578. package/mcp-server/src/services/vector-cache.ts +255 -0
  579. package/mcp-server/src/services/whiteboard-geometry.ts +711 -0
  580. package/mcp-server/src/tools/agents.ts +539 -0
  581. package/mcp-server/src/tools/bluesky.ts +1186 -0
  582. package/mcp-server/src/tools/browser-advanced.ts +15 -6
  583. package/mcp-server/src/tools/browser-batch.ts +178 -0
  584. package/mcp-server/src/tools/browser-cheatsheet.ts +155 -0
  585. package/mcp-server/src/tools/browser-interact.ts +362 -255
  586. package/mcp-server/src/tools/browser-navigate.ts +164 -77
  587. package/mcp-server/src/tools/browser-observe.ts +2222 -1330
  588. package/mcp-server/src/tools/browser.ts +181 -107
  589. package/mcp-server/src/tools/card.ts +7 -5
  590. package/mcp-server/src/tools/choice.ts +103 -0
  591. package/mcp-server/src/tools/computer.ts +190 -0
  592. package/mcp-server/src/tools/discord.ts +10 -23
  593. package/mcp-server/src/tools/fb-groups.ts +387 -0
  594. package/mcp-server/src/tools/forget.ts +1 -1
  595. package/mcp-server/src/tools/git.ts +3 -1
  596. package/mcp-server/src/tools/gsc/experience.ts +440 -0
  597. package/mcp-server/src/tools/gsc/helpers.ts +288 -0
  598. package/mcp-server/src/tools/gsc/indexing.ts +495 -0
  599. package/mcp-server/src/tools/gsc/inspect.ts +391 -0
  600. package/mcp-server/src/tools/gsc/navigate.ts +236 -0
  601. package/mcp-server/src/tools/gsc/performance.ts +352 -0
  602. package/mcp-server/src/tools/gsc/settings.ts +564 -0
  603. package/mcp-server/src/tools/gsc.ts +95 -0
  604. package/mcp-server/src/tools/image.ts +3 -1
  605. package/mcp-server/src/tools/leonardo-browser-tools.ts +47 -37
  606. package/mcp-server/src/tools/leonardo.ts +7 -5
  607. package/mcp-server/src/tools/loop.ts +118 -25
  608. package/mcp-server/src/tools/memories.ts +65 -5
  609. package/mcp-server/src/tools/morelogin.ts +81 -0
  610. package/mcp-server/src/tools/profile.ts +122 -0
  611. package/mcp-server/src/tools/recall.ts +105 -261
  612. package/mcp-server/src/tools/reflect.ts +171 -145
  613. package/mcp-server/src/tools/remember.ts +223 -115
  614. package/mcp-server/src/tools/style-guide-tools.ts +250 -0
  615. package/mcp-server/src/tools/style-guide.ts +16 -0
  616. package/mcp-server/src/tools/sync.ts +66 -9
  617. package/mcp-server/src/tools/tictactoe.ts +3 -1
  618. package/mcp-server/src/tools/utils.ts +22 -0
  619. package/mcp-server/src/tools/whiteboard-format.ts +394 -0
  620. package/mcp-server/src/tools/whiteboard-tools.ts +191 -183
  621. package/mcp-server/src/tools/whiteboard.ts +7 -5
  622. package/mcp-server/src/tools/youtube/analytics.ts +106 -0
  623. package/mcp-server/src/tools/youtube/dedup.ts +57 -0
  624. package/mcp-server/src/tools/youtube/download.ts +41 -0
  625. package/mcp-server/src/tools/youtube/helpers.ts +183 -0
  626. package/mcp-server/src/tools/youtube/media.ts +109 -0
  627. package/mcp-server/src/tools/youtube/metadata.ts +112 -0
  628. package/mcp-server/src/tools/youtube/navigate.ts +81 -0
  629. package/mcp-server/src/tools/youtube/playlist.ts +134 -0
  630. package/mcp-server/src/tools/youtube/schedule.ts +158 -0
  631. package/mcp-server/src/tools/youtube/source.ts +101 -0
  632. package/mcp-server/src/tools/youtube/upload.ts +296 -0
  633. package/mcp-server/src/tools/youtube.ts +47 -0
  634. package/mcp-server/src/tui.ts +8 -9
  635. package/neural-interface/games/TicTacToe/1.svg +1 -0
  636. package/neural-interface/games/TicTacToe/2.svg +1 -0
  637. package/neural-interface/games/TicTacToe/3.svg +1 -0
  638. package/neural-interface/games/TicTacToe/4.svg +1 -0
  639. package/neural-interface/games/TicTacToe/5.svg +1 -0
  640. package/neural-interface/games/TicTacToe/6.svg +1 -0
  641. package/neural-interface/games/TicTacToe/7.svg +1 -0
  642. package/neural-interface/games/TicTacToe/8.svg +1 -0
  643. package/neural-interface/games/TicTacToe/9.svg +1 -0
  644. package/neural-interface/games/TicTacToe/Board.svg +1 -0
  645. package/neural-interface/games/TicTacToe/Circle.svg +1 -0
  646. package/neural-interface/games/TicTacToe/Cross.svg +1 -0
  647. package/neural-interface/i18n/en.json +6983 -0
  648. package/neural-interface/i18n/pt-BR.json +6987 -0
  649. package/neural-interface/lib/assistant-api.js +1005 -0
  650. package/neural-interface/lib/assistant-attachments.js +121 -0
  651. package/neural-interface/lib/assistant-brains/claude.js +207 -0
  652. package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +43 -0
  653. package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +56 -0
  654. package/neural-interface/lib/assistant-brains/codex.js +213 -0
  655. package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +47 -0
  656. package/neural-interface/lib/assistant-brains/opencode-route-gate.js +62 -0
  657. package/neural-interface/lib/assistant-brains/opencode.js +320 -0
  658. package/neural-interface/lib/assistant-budget.js +318 -0
  659. package/neural-interface/lib/assistant-catalog.js +731 -0
  660. package/neural-interface/lib/assistant-clarify.js +664 -0
  661. package/neural-interface/lib/assistant-config.js +232 -0
  662. package/neural-interface/lib/assistant-dispatch.js +2744 -0
  663. package/neural-interface/lib/assistant-envelope.js +579 -0
  664. package/neural-interface/lib/assistant-evidence.js +236 -0
  665. package/neural-interface/lib/assistant-hidden-models.js +272 -0
  666. package/neural-interface/lib/assistant-jev.js +117 -0
  667. package/neural-interface/lib/assistant-judgments.js +111 -0
  668. package/neural-interface/lib/assistant-media.js +335 -0
  669. package/neural-interface/lib/assistant-memory.js +398 -0
  670. package/neural-interface/lib/assistant-persona.js +444 -0
  671. package/neural-interface/lib/assistant-plan-permissions.js +448 -0
  672. package/neural-interface/lib/assistant-playbooks/design.md +87 -0
  673. package/neural-interface/lib/assistant-playbooks.js +72 -0
  674. package/neural-interface/lib/assistant-pricing.js +159 -0
  675. package/neural-interface/lib/assistant-route-gate-codex.js +163 -0
  676. package/neural-interface/lib/assistant-route-gate.js +212 -0
  677. package/neural-interface/lib/assistant-router.js +1324 -0
  678. package/neural-interface/lib/assistant-runtime.js +3337 -0
  679. package/neural-interface/lib/assistant-task-prompt.js +472 -0
  680. package/neural-interface/lib/assistant-usage.js +1688 -0
  681. package/neural-interface/lib/augmented-path.js +50 -0
  682. package/neural-interface/lib/automation-storage-migration.js +54 -0
  683. package/neural-interface/lib/backup-service.js +851 -0
  684. package/neural-interface/lib/backup-zip-reader.js +262 -0
  685. package/neural-interface/lib/browser-assist-api.js +41 -0
  686. package/neural-interface/lib/browser-console.js +176 -0
  687. package/neural-interface/lib/browser-execution.js +241 -0
  688. package/neural-interface/lib/browser-extraction.js +191 -0
  689. package/neural-interface/lib/browser-screenshot.js +399 -0
  690. package/neural-interface/lib/browser-semantic-context.js +639 -0
  691. package/neural-interface/lib/browser-snapshots.js +192 -0
  692. package/neural-interface/lib/browser-tab-recovery.js +119 -0
  693. package/neural-interface/lib/browser-targets.js +70 -0
  694. package/neural-interface/lib/browser-tool-policy.js +926 -0
  695. package/neural-interface/lib/claude-accounts.js +230 -0
  696. package/neural-interface/lib/claude-agent-bridge.js +3296 -0
  697. package/neural-interface/lib/claude-bypass-policy.js +99 -0
  698. package/neural-interface/lib/claude-history.js +429 -0
  699. package/neural-interface/lib/claude-model-catalog.js +483 -0
  700. package/neural-interface/lib/claude-panel-requests.js +165 -0
  701. package/neural-interface/lib/claude-panel-session.js +272 -0
  702. package/neural-interface/lib/claude-permission-rules.js +153 -0
  703. package/neural-interface/lib/claude-session-cleanup.js +71 -0
  704. package/neural-interface/lib/claude-session-list.js +82 -0
  705. package/neural-interface/lib/claude-session-ops.js +140 -0
  706. package/neural-interface/lib/claude-settings-view.js +51 -0
  707. package/neural-interface/lib/claude-skin-connect.js +79 -0
  708. package/neural-interface/lib/claude-stall-policy.js +7 -0
  709. package/neural-interface/lib/claude-temporary.js +435 -0
  710. package/neural-interface/lib/cli-update-planner.js +312 -0
  711. package/neural-interface/lib/codex-capabilities.d.ts +41 -0
  712. package/neural-interface/lib/codex-capabilities.js +148 -0
  713. package/neural-interface/lib/codex-collaboration-mode.js +17 -0
  714. package/neural-interface/lib/codex-compat-rpc.js +241 -0
  715. package/neural-interface/lib/codex-mcp-approvals.js +56 -0
  716. package/neural-interface/lib/codex-mcp-apps.js +47 -0
  717. package/neural-interface/lib/codex-model-context.js +202 -0
  718. package/neural-interface/lib/codex-plan-store.js +71 -0
  719. package/neural-interface/lib/codex-request-journal.js +242 -0
  720. package/neural-interface/lib/codex-runtime-path.js +213 -0
  721. package/neural-interface/lib/codex-session-catalog.js +231 -0
  722. package/neural-interface/lib/codex-session-settings.js +46 -0
  723. package/neural-interface/lib/codex-sidepanel-permissions.js +110 -0
  724. package/neural-interface/lib/codex-thread-history.js +165 -0
  725. package/neural-interface/lib/codex-user-verification.js +34 -0
  726. package/neural-interface/lib/codex-writer-lifecycle.js +152 -0
  727. package/neural-interface/lib/confined-fs.js +256 -0
  728. package/neural-interface/lib/db.js +922 -0
  729. package/neural-interface/lib/design-md.js +9 -0
  730. package/neural-interface/lib/desktop/api.js +92 -0
  731. package/neural-interface/lib/desktop/audit.js +62 -0
  732. package/neural-interface/lib/desktop/build.js +423 -0
  733. package/neural-interface/lib/desktop/config.js +606 -0
  734. package/neural-interface/lib/desktop/coords.js +76 -0
  735. package/neural-interface/lib/desktop/fake-helper.js +1192 -0
  736. package/neural-interface/lib/desktop/frames.js +77 -0
  737. package/neural-interface/lib/desktop/grants.js +84 -0
  738. package/neural-interface/lib/desktop/guards.js +170 -0
  739. package/neural-interface/lib/desktop/helper/SynabunDesktop.swift +3056 -0
  740. package/neural-interface/lib/desktop/lease.js +51 -0
  741. package/neural-interface/lib/desktop/manager.js +545 -0
  742. package/neural-interface/lib/desktop/press-contexts.js +103 -0
  743. package/neural-interface/lib/desktop/protocol.js +495 -0
  744. package/neural-interface/lib/desktop/service.js +1202 -0
  745. package/neural-interface/lib/effort-levels.js +148 -0
  746. package/neural-interface/lib/event-loop-monitor.js +67 -0
  747. package/neural-interface/lib/exec-loop-command.js +209 -0
  748. package/neural-interface/lib/folder-picker.ps1 +77 -0
  749. package/neural-interface/lib/http-guards.js +287 -0
  750. package/neural-interface/lib/jsonl-lines.js +94 -0
  751. package/neural-interface/lib/loop-logger.js +127 -0
  752. package/neural-interface/lib/mcp-client-config.js +133 -0
  753. package/neural-interface/lib/mcp-installer.js +487 -0
  754. package/neural-interface/lib/mcp-profile-refresh-coordinator.js +78 -0
  755. package/neural-interface/lib/mcp-profile-servers.js +120 -0
  756. package/neural-interface/lib/memo-cache.js +84 -0
  757. package/neural-interface/lib/memory-api.js +758 -0
  758. package/neural-interface/lib/memory-map-api.js +1150 -0
  759. package/neural-interface/lib/memory-map-layout.js +872 -0
  760. package/neural-interface/lib/memory-map-worker.js +165 -0
  761. package/neural-interface/lib/memory-session-capture.js +81 -0
  762. package/neural-interface/lib/memory-timers.js +62 -0
  763. package/neural-interface/lib/morelogin.js +301 -0
  764. package/neural-interface/lib/native-binary-runtime.js +650 -0
  765. package/neural-interface/lib/native-loop-goal.js +33 -0
  766. package/neural-interface/lib/native-loop-providers.js +1016 -0
  767. package/neural-interface/lib/native-loop-runtime.js +747 -0
  768. package/neural-interface/lib/opencode-hidden-models.js +113 -0
  769. package/neural-interface/lib/opencode-history.js +253 -0
  770. package/neural-interface/lib/opencode-runtime-config.js +58 -0
  771. package/neural-interface/lib/opencode-v2-client.js +486 -0
  772. package/neural-interface/lib/opencode-v2-ws-requests.js +955 -0
  773. package/neural-interface/lib/path-confine.js +213 -0
  774. package/neural-interface/lib/plugin-installer.js +264 -0
  775. package/neural-interface/lib/project-storage.js +766 -0
  776. package/neural-interface/lib/pty-host/core.js +603 -0
  777. package/neural-interface/lib/pty-host/flow.js +43 -0
  778. package/neural-interface/lib/pty-host/host.js +47 -0
  779. package/neural-interface/lib/pty-host/manager.js +360 -0
  780. package/neural-interface/lib/pty-host/protocol.js +81 -0
  781. package/neural-interface/lib/pty-host/snapshot.js +133 -0
  782. package/neural-interface/lib/remote-policy.js +582 -0
  783. package/neural-interface/lib/rulesets/api.js +175 -0
  784. package/neural-interface/lib/rulesets/fs-safe.js +245 -0
  785. package/neural-interface/lib/rulesets/installer.js +1453 -0
  786. package/neural-interface/lib/rulesets/json-edit.js +186 -0
  787. package/neural-interface/lib/rulesets/lock.js +170 -0
  788. package/neural-interface/lib/rulesets/managed-text.js +314 -0
  789. package/neural-interface/lib/rulesets/normalise.js +24 -0
  790. package/neural-interface/lib/rulesets/render.js +84 -0
  791. package/neural-interface/lib/schedule-launch-intent.js +40 -0
  792. package/neural-interface/lib/session-cache-builder.js +524 -0
  793. package/neural-interface/lib/session-chunker.js +344 -0
  794. package/neural-interface/lib/session-indexer.js +327 -0
  795. package/neural-interface/lib/session-title-generator.js +227 -0
  796. package/neural-interface/lib/skill-prompt-bridge.js +11 -0
  797. package/neural-interface/lib/style-guide/api.js +375 -0
  798. package/neural-interface/lib/style-guide/color.js +352 -0
  799. package/neural-interface/lib/style-guide/export-css.js +99 -0
  800. package/neural-interface/lib/style-guide/export-dtcg.js +209 -0
  801. package/neural-interface/lib/style-guide/export-tailwind.js +102 -0
  802. package/neural-interface/lib/style-guide/fonts.json +227 -0
  803. package/neural-interface/lib/style-guide/import.js +1268 -0
  804. package/neural-interface/lib/style-guide/pointers.js +103 -0
  805. package/neural-interface/lib/style-guide/presets.js +232 -0
  806. package/neural-interface/lib/style-guide/render-design-md.js +319 -0
  807. package/neural-interface/lib/style-guide/schema.js +848 -0
  808. package/neural-interface/lib/style-guide/security.js +43 -0
  809. package/neural-interface/lib/style-guide/store.js +491 -0
  810. package/neural-interface/lib/style-guide/summary.js +106 -0
  811. package/neural-interface/lib/style-guide/tokens.js +170 -0
  812. package/neural-interface/lib/synabun-update-plan.js +305 -0
  813. package/neural-interface/lib/synabun-version.js +179 -0
  814. package/neural-interface/lib/system-restore.js +99 -0
  815. package/neural-interface/lib/terminal-env.js +86 -0
  816. package/neural-interface/lib/ui-blob-store.js +106 -0
  817. package/neural-interface/lib/vector-cache.js +2 -0
  818. package/neural-interface/lib/virtual-socket.js +60 -0
  819. package/neural-interface/lib/whatsapp/api.js +146 -0
  820. package/neural-interface/lib/whatsapp/auth-store.js +389 -0
  821. package/neural-interface/lib/whatsapp/baileys-adapter.js +457 -0
  822. package/neural-interface/lib/whatsapp/brain.js +128 -0
  823. package/neural-interface/lib/whatsapp/bridge.js +1499 -0
  824. package/neural-interface/lib/whatsapp/cards.js +519 -0
  825. package/neural-interface/lib/whatsapp/commands.js +92 -0
  826. package/neural-interface/lib/whatsapp/config.js +291 -0
  827. package/neural-interface/lib/whatsapp/connector/entry.mjs +25 -0
  828. package/neural-interface/lib/whatsapp/connector/manifest.json +6 -0
  829. package/neural-interface/lib/whatsapp/connector/npm-shrinkwrap.json +717 -0
  830. package/neural-interface/lib/whatsapp/connector/package.json +8 -0
  831. package/neural-interface/lib/whatsapp/fake-baileys.js +444 -0
  832. package/neural-interface/lib/whatsapp/format.js +552 -0
  833. package/neural-interface/lib/whatsapp/host-core.js +1225 -0
  834. package/neural-interface/lib/whatsapp/host.js +119 -0
  835. package/neural-interface/lib/whatsapp/identity.js +288 -0
  836. package/neural-interface/lib/whatsapp/inbound.js +149 -0
  837. package/neural-interface/lib/whatsapp/installer.js +562 -0
  838. package/neural-interface/lib/whatsapp/manager.js +638 -0
  839. package/neural-interface/lib/whatsapp/paths.js +81 -0
  840. package/neural-interface/lib/whatsapp/protocol.js +327 -0
  841. package/neural-interface/lib/whatsapp/qr-svg.js +57 -0
  842. package/neural-interface/lib/whatsapp/redact.js +130 -0
  843. package/neural-interface/lib/whatsapp/service.js +1305 -0
  844. package/neural-interface/lib/whatsapp/vendor/qrcodegen.js +848 -0
  845. package/neural-interface/package-lock.json +4682 -0
  846. package/neural-interface/package.json +58 -27
  847. package/neural-interface/public/apple-touch-icon.png +0 -0
  848. package/neural-interface/public/category-logos/synabun.png +0 -0
  849. package/neural-interface/public/claude.svg +1 -0
  850. package/neural-interface/public/favicon-16x16.png +0 -0
  851. package/neural-interface/public/favicon-32x32.png +0 -0
  852. package/neural-interface/public/icon-192.png +0 -0
  853. package/neural-interface/public/icon-512.png +0 -0
  854. package/neural-interface/public/index.html +32 -182
  855. package/neural-interface/public/index2d.html +2 -2
  856. package/neural-interface/public/logo-synabun.png +0 -0
  857. package/neural-interface/public/logoHD.png +0 -0
  858. package/neural-interface/public/mcp.svg +4 -0
  859. package/neural-interface/public/offline.html +335 -299
  860. package/neural-interface/public/onboarding.html +692 -155
  861. package/neural-interface/public/opencode-logo-dark-square.svg +1 -0
  862. package/neural-interface/public/shared/agent-runtime-options.js +596 -0
  863. package/neural-interface/public/shared/api.js +339 -28
  864. package/neural-interface/public/shared/assistant/asst-accounts.js +318 -0
  865. package/neural-interface/public/shared/assistant/asst-agents-dock.js +296 -0
  866. package/neural-interface/public/shared/assistant/asst-api.js +270 -0
  867. package/neural-interface/public/shared/assistant/asst-brain-picker.js +744 -0
  868. package/neural-interface/public/shared/assistant/asst-budget.js +333 -0
  869. package/neural-interface/public/shared/assistant/asst-composer.js +656 -0
  870. package/neural-interface/public/shared/assistant/asst-computer.js +803 -0
  871. package/neural-interface/public/shared/assistant/asst-control.js +1018 -0
  872. package/neural-interface/public/shared/assistant/asst-hosts.js +262 -0
  873. package/neural-interface/public/shared/assistant/asst-mascot.js +311 -0
  874. package/neural-interface/public/shared/assistant/asst-menu.js +375 -0
  875. package/neural-interface/public/shared/assistant/asst-panel.js +1845 -0
  876. package/neural-interface/public/shared/assistant/asst-rack-styles.js +589 -0
  877. package/neural-interface/public/shared/assistant/asst-render.js +3296 -0
  878. package/neural-interface/public/shared/assistant/asst-route.js +1653 -0
  879. package/neural-interface/public/shared/assistant/asst-roving.js +75 -0
  880. package/neural-interface/public/shared/assistant/asst-sanitize.js +117 -0
  881. package/neural-interface/public/shared/assistant/asst-sidepanel-styles.js +488 -0
  882. package/neural-interface/public/shared/assistant/asst-sidepanel.js +675 -0
  883. package/neural-interface/public/shared/assistant/asst-slash.js +258 -0
  884. package/neural-interface/public/shared/assistant/asst-state.js +727 -0
  885. package/neural-interface/public/shared/assistant/asst-styles.js +1684 -0
  886. package/neural-interface/public/shared/assistant/asst-tool-kinds.js +1017 -0
  887. package/neural-interface/public/shared/assistant/asst-usage.js +444 -0
  888. package/neural-interface/public/shared/assistant/asst-ws.js +175 -0
  889. package/neural-interface/public/shared/automation-context.js +75 -0
  890. package/neural-interface/public/shared/blob-store.js +99 -0
  891. package/neural-interface/public/shared/cdx/cdx-capabilities.js +118 -0
  892. package/neural-interface/public/shared/cdx/cdx-cards.js +37 -0
  893. package/neural-interface/public/shared/cdx/cdx-commands.js +171 -0
  894. package/neural-interface/public/shared/cdx/cdx-context-menu.js +402 -0
  895. package/neural-interface/public/shared/cdx/cdx-context-model.js +220 -0
  896. package/neural-interface/public/shared/cdx/cdx-features.js +408 -0
  897. package/neural-interface/public/shared/cdx/cdx-icons.js +89 -0
  898. package/neural-interface/public/shared/cdx/cdx-mcp-app-host.js +414 -0
  899. package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.html +6 -0
  900. package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.js +56 -0
  901. package/neural-interface/public/shared/cdx/cdx-mcp-app.js +178 -0
  902. package/neural-interface/public/shared/cdx/cdx-model-catalog.js +120 -0
  903. package/neural-interface/public/shared/cdx/cdx-output-model.js +261 -0
  904. package/neural-interface/public/shared/cdx/cdx-output.js +382 -0
  905. package/neural-interface/public/shared/cdx/cdx-panel.js +1372 -0
  906. package/neural-interface/public/shared/cdx/cdx-plan.js +266 -0
  907. package/neural-interface/public/shared/cdx/cdx-protocol.js +682 -0
  908. package/neural-interface/public/shared/cdx/cdx-render.js +3381 -0
  909. package/neural-interface/public/shared/cdx/cdx-requests.js +1136 -0
  910. package/neural-interface/public/shared/cdx/cdx-styles.js +3251 -0
  911. package/neural-interface/public/shared/cdx/cdx-tabs.js +7992 -0
  912. package/neural-interface/public/shared/cdx/cdx-ws.js +363 -0
  913. package/neural-interface/public/shared/cli-status.js +169 -0
  914. package/neural-interface/public/shared/constants.js +22 -5
  915. package/neural-interface/public/shared/cp/cp-agents.js +186 -0
  916. package/neural-interface/public/shared/cp/cp-bash.js +252 -0
  917. package/neural-interface/public/shared/cp/cp-compose.js +159 -0
  918. package/neural-interface/public/shared/cp/cp-context-menu.js +309 -0
  919. package/neural-interface/public/shared/cp/cp-context-model.js +157 -0
  920. package/neural-interface/public/shared/cp/cp-context-window.js +80 -0
  921. package/neural-interface/public/shared/cp/cp-ctx.js +11 -0
  922. package/neural-interface/public/shared/cp/cp-diff.js +255 -0
  923. package/neural-interface/public/shared/cp/cp-event-rows.js +637 -0
  924. package/neural-interface/public/shared/cp/cp-events.js +846 -0
  925. package/neural-interface/public/shared/cp/cp-markdown.js +104 -0
  926. package/neural-interface/public/shared/cp/cp-permission-model.js +905 -0
  927. package/neural-interface/public/shared/cp/cp-permissions.js +626 -0
  928. package/neural-interface/public/shared/cp/cp-rehydrate.js +113 -0
  929. package/neural-interface/public/shared/cp/cp-restore.js +224 -0
  930. package/neural-interface/public/shared/cp/cp-session-model.js +338 -0
  931. package/neural-interface/public/shared/cp/cp-session-settings.js +254 -0
  932. package/neural-interface/public/shared/cp/cp-sessions.js +227 -0
  933. package/neural-interface/public/shared/cp/cp-statusline.js +153 -0
  934. package/neural-interface/public/shared/cp/cp-styles.js +349 -0
  935. package/neural-interface/public/shared/cp/cp-tasks-model.js +282 -0
  936. package/neural-interface/public/shared/cp/cp-tasks.js +107 -0
  937. package/neural-interface/public/shared/cp/cp-temporary-view.js +56 -0
  938. package/neural-interface/public/shared/cp/cp-temporary.js +231 -0
  939. package/neural-interface/public/shared/cp/cp-tool-cards.js +326 -0
  940. package/neural-interface/public/shared/cp/cp-tool-results.js +618 -0
  941. package/neural-interface/public/shared/cp/cp-usage-model.js +124 -0
  942. package/neural-interface/public/shared/graph-activity.js +68 -0
  943. package/neural-interface/public/shared/html-shell.js +107 -12
  944. package/neural-interface/public/shared/i18n.js +132 -34
  945. package/neural-interface/public/shared/node-positions-store.js +44 -0
  946. package/neural-interface/public/shared/ocp-hidden-models.js +116 -0
  947. package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +355 -0
  948. package/neural-interface/public/shared/ocp-v2/ocp-v2-autoaccept-button.js +35 -0
  949. package/neural-interface/public/shared/ocp-v2/ocp-v2-automation-ownership.js +72 -0
  950. package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +280 -0
  951. package/neural-interface/public/shared/ocp-v2/ocp-v2-caps.js +67 -0
  952. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +179 -0
  953. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes.js +164 -0
  954. package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +725 -0
  955. package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +75 -0
  956. package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +1204 -0
  957. package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm-logic.js +117 -0
  958. package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm.js +59 -0
  959. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-gauge.js +252 -0
  960. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +478 -0
  961. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +179 -0
  962. package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +233 -0
  963. package/neural-interface/public/shared/ocp-v2/ocp-v2-icons.js +30 -0
  964. package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +1065 -0
  965. package/neural-interface/public/shared/ocp-v2/ocp-v2-mention-hints.js +182 -0
  966. package/neural-interface/public/shared/ocp-v2/ocp-v2-modelpicker.js +655 -0
  967. package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +2636 -0
  968. package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +601 -0
  969. package/neural-interface/public/shared/ocp-v2/ocp-v2-profile-inheritance.js +78 -0
  970. package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +649 -0
  971. package/neural-interface/public/shared/ocp-v2/ocp-v2-providers.js +35 -0
  972. package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +357 -0
  973. package/neural-interface/public/shared/ocp-v2/ocp-v2-render-logic.js +189 -0
  974. package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +1869 -0
  975. package/neural-interface/public/shared/ocp-v2/ocp-v2-select.js +42 -0
  976. package/neural-interface/public/shared/ocp-v2/ocp-v2-send-logic.js +117 -0
  977. package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +1714 -0
  978. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +468 -0
  979. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-widgets.js +63 -0
  980. package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +366 -0
  981. package/neural-interface/public/shared/ocp-v2/ocp-v2-settings-link.js +19 -0
  982. package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +343 -0
  983. package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +746 -0
  984. package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +347 -0
  985. package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +338 -0
  986. package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +3543 -0
  987. package/neural-interface/public/shared/ocp-v2/ocp-v2-subagents-logic.js +482 -0
  988. package/neural-interface/public/shared/ocp-v2/ocp-v2-tools-logic.js +351 -0
  989. package/neural-interface/public/shared/ocp-v2/ocp-v2-tools.js +168 -0
  990. package/neural-interface/public/shared/ocp-v2/ocp-v2-variantpicker.js +315 -0
  991. package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +545 -0
  992. package/neural-interface/public/shared/provider-icons.js +30 -0
  993. package/neural-interface/public/shared/session-title.js +100 -0
  994. package/neural-interface/public/shared/settings/settings-ia.js +389 -0
  995. package/neural-interface/public/shared/settings/settings-kit.js +234 -0
  996. package/neural-interface/public/shared/settings/settings-search.js +463 -0
  997. package/neural-interface/public/shared/settings/settings-shell.js +570 -0
  998. package/neural-interface/public/shared/state.js +5 -0
  999. package/neural-interface/public/shared/storage.js +50 -7
  1000. package/neural-interface/public/shared/styleguide/sg-agents.js +42 -0
  1001. package/neural-interface/public/shared/styleguide/sg-brand.js +4 -0
  1002. package/neural-interface/public/shared/styleguide/sg-color-client.js +388 -0
  1003. package/neural-interface/public/shared/styleguide/sg-colors.js +148 -0
  1004. package/neural-interface/public/shared/styleguide/sg-components.js +35 -0
  1005. package/neural-interface/public/shared/styleguide/sg-history.js +41 -0
  1006. package/neural-interface/public/shared/styleguide/sg-icons-logo.js +38 -0
  1007. package/neural-interface/public/shared/styleguide/sg-imagery.js +4 -0
  1008. package/neural-interface/public/shared/styleguide/sg-import-export.js +47 -0
  1009. package/neural-interface/public/shared/styleguide/sg-kit.js +281 -0
  1010. package/neural-interface/public/shared/styleguide/sg-labels.js +318 -0
  1011. package/neural-interface/public/shared/styleguide/sg-layout.js +4 -0
  1012. package/neural-interface/public/shared/styleguide/sg-motion.js +5 -0
  1013. package/neural-interface/public/shared/styleguide/sg-panel.js +229 -0
  1014. package/neural-interface/public/shared/styleguide/sg-preview.js +138 -0
  1015. package/neural-interface/public/shared/styleguide/sg-rules.js +9 -0
  1016. package/neural-interface/public/shared/styleguide/sg-shape.js +24 -0
  1017. package/neural-interface/public/shared/styleguide/sg-state.js +132 -0
  1018. package/neural-interface/public/shared/styleguide/sg-typography.js +124 -0
  1019. package/neural-interface/public/shared/styles.css +7883 -1155
  1020. package/neural-interface/public/shared/synabun-mascot.js +1625 -0
  1021. package/neural-interface/public/shared/synabun-ticker.js +376 -0
  1022. package/neural-interface/public/shared/term-renderer.js +343 -0
  1023. package/neural-interface/public/shared/ui-assistant-panel.js +10 -0
  1024. package/neural-interface/public/shared/ui-assistant.js +77 -0
  1025. package/neural-interface/public/shared/ui-automation-studio.js +5105 -3573
  1026. package/neural-interface/public/shared/ui-claude-panel.js +11685 -6333
  1027. package/neural-interface/public/shared/ui-codex-panel.js +12 -0
  1028. package/neural-interface/public/shared/ui-cost-widget.js +55 -34
  1029. package/neural-interface/public/shared/ui-detail.js +77 -14
  1030. package/neural-interface/public/shared/ui-explorer.js +360 -181
  1031. package/neural-interface/public/shared/ui-file-explorer.js +485 -107
  1032. package/neural-interface/public/shared/ui-help.js +2 -2
  1033. package/neural-interface/public/shared/ui-image-gallery.js +45 -21
  1034. package/neural-interface/public/shared/ui-judgments.js +1346 -0
  1035. package/neural-interface/public/shared/ui-keybinds.js +3 -2
  1036. package/neural-interface/public/shared/ui-link.js +105 -51
  1037. package/neural-interface/public/shared/ui-loading.js +4 -4
  1038. package/neural-interface/public/shared/ui-memory-maintenance.js +111 -0
  1039. package/neural-interface/public/shared/ui-menubar.js +89 -4
  1040. package/neural-interface/public/shared/ui-native-loop-router-state.js +94 -0
  1041. package/neural-interface/public/shared/ui-native-loop-router.js +493 -0
  1042. package/neural-interface/public/shared/ui-native-window-id.js +7 -0
  1043. package/neural-interface/public/shared/ui-navbar.js +357 -222
  1044. package/neural-interface/public/shared/ui-notifications.js +58 -12
  1045. package/neural-interface/public/shared/ui-opencode-panel-v2.js +17 -0
  1046. package/neural-interface/public/shared/ui-panels.js +15 -7
  1047. package/neural-interface/public/shared/ui-resume.js +823 -653
  1048. package/neural-interface/public/shared/ui-schedule-queue.js +172 -0
  1049. package/neural-interface/public/shared/ui-schedules-studio.js +1882 -0
  1050. package/neural-interface/public/shared/ui-scroll-follow.js +194 -0
  1051. package/neural-interface/public/shared/ui-sessions.js +789 -34
  1052. package/neural-interface/public/shared/ui-settings.js +5793 -2190
  1053. package/neural-interface/public/shared/ui-sidepanel-layout.js +109 -0
  1054. package/neural-interface/public/shared/ui-sidepanel-runtime.js +19 -0
  1055. package/neural-interface/public/shared/ui-sidepanel-session-entry.js +40 -0
  1056. package/neural-interface/public/shared/ui-sidepanel-sessions.js +221 -0
  1057. package/neural-interface/public/shared/ui-sidepanel-state.js +131 -0
  1058. package/neural-interface/public/shared/ui-sidepanel-tray.js +547 -0
  1059. package/neural-interface/public/shared/ui-sidepanel-windows.js +387 -0
  1060. package/neural-interface/public/shared/ui-skills.js +18 -32
  1061. package/neural-interface/public/shared/ui-styleguide.js +35 -0
  1062. package/neural-interface/public/shared/ui-sync.js +87 -0
  1063. package/neural-interface/public/shared/ui-terminal.js +7877 -6385
  1064. package/neural-interface/public/shared/ui-tool-updates.js +292 -0
  1065. package/neural-interface/public/shared/ui-tooltip.js +156 -15
  1066. package/neural-interface/public/shared/ui-tutorial-draw.js +119 -683
  1067. package/neural-interface/public/shared/ui-tutorial-layout.js +135 -0
  1068. package/neural-interface/public/shared/ui-tutorial-steps.js +59 -2209
  1069. package/neural-interface/public/shared/ui-tutorial.css +102 -0
  1070. package/neural-interface/public/shared/ui-tutorial.js +557 -1076
  1071. package/neural-interface/public/shared/ui-update.js +420 -68
  1072. package/neural-interface/public/shared/ui-whatsapp.js +941 -0
  1073. package/neural-interface/public/shared/ui-whiteboard.js +1076 -233
  1074. package/neural-interface/public/shared/ui-workspaces.js +2 -1
  1075. package/neural-interface/public/shared/utils.js +58 -0
  1076. package/neural-interface/public/shared/vterm-buffer.js +15 -5
  1077. package/neural-interface/public/shared/whatsapp/wa-phone.js +65 -0
  1078. package/neural-interface/public/shared/whatsapp/wa-view.js +411 -0
  1079. package/neural-interface/public/sidepanel-session.html +18 -0
  1080. package/neural-interface/public/sw.js +8 -2
  1081. package/neural-interface/public/synabun.png +0 -0
  1082. package/neural-interface/public/variant/2d/graph.js +1707 -1635
  1083. package/neural-interface/public/variant/2d/lasso.js +2 -1
  1084. package/neural-interface/public/variant/2d/layout.js +595 -594
  1085. package/neural-interface/public/variant/2d/main.js +556 -521
  1086. package/neural-interface/public/variant/2d/settings-gfx.js +18 -24
  1087. package/neural-interface/public/variant/3d/main.js +516 -500
  1088. package/neural-interface/public/variant/3d/map-controls.js +144 -0
  1089. package/neural-interface/public/variant/3d/map-data.js +251 -0
  1090. package/neural-interface/public/variant/3d/map-labels.js +241 -0
  1091. package/neural-interface/public/variant/3d/map-pick.js +90 -0
  1092. package/neural-interface/public/variant/3d/map-renderer.js +521 -0
  1093. package/neural-interface/public/variant/3d/map-shaders.js +158 -0
  1094. package/neural-interface/public/variant/3d/map-view.js +618 -0
  1095. package/neural-interface/public/vendor/three/manifest.json +3 -0
  1096. package/neural-interface/public/vendor/three/three-0.169.0.min.js +3844 -0
  1097. package/neural-interface/public/vendor/xterm/manifest.json +3 -0
  1098. package/neural-interface/public/vendor/xterm/xterm-6.0.0.css +285 -0
  1099. package/neural-interface/public/vendor/xterm/xterm-6.0.0.min.js +192 -0
  1100. package/neural-interface/scripts/build-vendor.mjs +64 -0
  1101. package/neural-interface/scripts/codex-protocol-fixture.mjs +83 -0
  1102. package/neural-interface/scripts/rebuild-pty.js +37 -23
  1103. package/neural-interface/scripts/vendor-three-entry.js +24 -0
  1104. package/neural-interface/scripts/vendor-xterm-entry.js +8 -0
  1105. package/neural-interface/server.js +33948 -15000
  1106. package/neural-interface/skins/default/skin.css +90 -0
  1107. package/neural-interface/skins/default/skin.json +8 -0
  1108. package/neural-interface/templates/rulesets/README.md +9 -0
  1109. package/neural-interface/templates/rulesets/claude.md +3 -0
  1110. package/neural-interface/templates/rulesets/codex.md +2 -0
  1111. package/neural-interface/templates/rulesets/coexistence.md +6 -0
  1112. package/neural-interface/templates/rulesets/core.md +26 -0
  1113. package/neural-interface/templates/rulesets/cursor.md +2 -0
  1114. package/neural-interface/templates/rulesets/gemini.md +2 -0
  1115. package/neural-interface/templates/rulesets/legacy-hashes.json +227 -0
  1116. package/neural-interface/templates/rulesets/manifest.json +12 -0
  1117. package/neural-interface/templates/rulesets/opencode.md +2 -0
  1118. package/package.json +119 -53
  1119. package/postinstall.js +125 -26
  1120. package/preuninstall.js +187 -0
  1121. package/scripts/audit-claude-hook-usage.mjs +12 -0
  1122. package/scripts/audit-memory-duplicates.mjs +44 -0
  1123. package/scripts/measure-claude-hook-overhead.mjs +77 -0
  1124. package/scripts/recover-user-config.mjs +254 -0
  1125. package/scripts/restore-data-home-from-backup.mjs +239 -0
  1126. package/setup.js +804 -260
  1127. package/skills/leonardo/SKILL.md +19 -10
  1128. package/skills/leonardo/modules/image-prompter.md +18 -12
  1129. package/skills/leonardo/modules/video-prompter.md +19 -13
  1130. package/skills/synabun/SKILL.md +209 -185
  1131. package/skills/synabun/icon.png +0 -0
  1132. package/skills/synabun/modules/audit.md +380 -374
  1133. package/skills/synabun/modules/changelog.md +15 -6
  1134. package/skills/synabun/modules/idea.md +148 -144
  1135. package/skills/synabun/modules/memorize.md +13 -4
  1136. package/skills/synabun/modules/schedule.md +198 -0
  1137. package/skills/synabun/synabunicon.png +0 -0
  1138. package/updater.cmd +31 -0
  1139. package/updater.mjs +382 -0
  1140. package/updater.sh +29 -0
  1141. package/hooks/claude-code/test-user-learning.mjs +0 -531
  1142. package/neural-interface/public/claude-chat.css +0 -878
  1143. package/neural-interface/public/claude-chat.html +0 -92
  1144. package/neural-interface/public/claude-chat.js +0 -1168
  1145. package/neural-interface/public/index-legacy.html +0 -14677
  1146. package/neural-interface/public/index2d-legacy.html +0 -8193
  1147. package/neural-interface/public/shared/html-term-renderer.js +0 -1022
  1148. package/neural-interface/public/variant/3d/background.js +0 -884
  1149. package/neural-interface/public/variant/3d/camera.js +0 -661
  1150. package/neural-interface/public/variant/3d/gfx.js +0 -116
  1151. package/neural-interface/public/variant/3d/graph.js +0 -2399
  1152. package/neural-interface/public/variant/3d/settings-gfx.js +0 -228
  1153. package/neural-interface/templates/CLAUDE-template.md +0 -211
@@ -1,594 +1,595 @@
1
- // ═══════════════════════════════════════════
2
- // SynaBun Neural Interface — 2D Orbital Layout
3
- // Computes hierarchical orbital positions:
4
- // Parent categories in a ring → child categories orbit parents →
5
- // memory cards orbit their category in concentric rings
6
- // Two-pass layout: compute radii first, then place with proper spacing
7
- // ═══════════════════════════════════════════
8
-
9
- import { gfx } from './gfx.js';
10
- import { state } from '../../shared/state.js';
11
- import { KEYS } from '../../shared/constants.js';
12
- import { storage } from '../../shared/storage.js';
13
-
14
- // ═══════════════════════════════════════════
15
- // CONSTANTS
16
- // ═══════════════════════════════════════════
17
-
18
- export const CARD_W = 180;
19
- export const CARD_H = 80;
20
-
21
- // ═══════════════════════════════════════════
22
- // PUBLIC API
23
- // ═══════════════════════════════════════════
24
-
25
- /**
26
- * Compute orbital layout for all visible nodes.
27
- * Uses a two-pass approach: first compute radii, then re-place with proper spacing.
28
- * @param {Array} nodes state.allNodes (filtered by activeCategories)
29
- * @param {Object} categoryMetadata state.categoryMetadata
30
- * @param {Set} activeCategories state.activeCategories
31
- * @returns {{ regions: CategoryRegion[], cards: CardPosition[] }}
32
- */
33
- export function computeLayout(nodes, categoryMetadata, activeCategories) {
34
- // ── 1. Group nodes by category hierarchy ──
35
- const tree = _buildCategoryTree(nodes, categoryMetadata, activeCategories);
36
-
37
- // ── 2. Pass 1: Temporary placement + compute radii ──
38
- _layoutParents(tree);
39
- for (const parent of tree) {
40
- _layoutChildren(parent);
41
- }
42
-
43
- // Layout cards (this sets region.radius for each region)
44
- const allCards = [];
45
- for (const parent of tree) {
46
- if (parent.memories.length > 0) {
47
- const cards = _layoutCards(parent, parent.memories, true);
48
- allCards.push(...cards);
49
- }
50
- for (const child of parent.children) {
51
- if (child.memories.length > 0) {
52
- const cards = _layoutCards(child, child.memories, false);
53
- allCards.push(...cards);
54
- }
55
- }
56
- }
57
-
58
- // ── 3. Pass 2: Re-position using actual radii ──
59
- // Snapshot old positions before re-layout
60
- const oldPositions = new Map();
61
- for (const parent of tree) {
62
- oldPositions.set(parent.name, { cx: parent.cx, cy: parent.cy });
63
- for (const child of parent.children) {
64
- oldPositions.set(child.name, { cx: child.cx, cy: child.cy });
65
- }
66
- }
67
-
68
- // Re-position children with actual radii (still orbiting old parent positions)
69
- for (const parent of tree) {
70
- _reLayoutChildren(parent);
71
- }
72
-
73
- // Re-position parents in a properly-spaced ring using actual cluster radii
74
- _reLayoutParentsWithRadii(tree);
75
-
76
- // Cascade parent ring movement to children — they must orbit the NEW parent center
77
- for (const parent of tree) {
78
- const old = oldPositions.get(parent.name);
79
- if (!old) continue;
80
- const dx = parent.cx - old.cx;
81
- const dy = parent.cy - old.cy;
82
- if (dx === 0 && dy === 0) continue;
83
- for (const child of parent.children) {
84
- child.cx += dx;
85
- child.cy += dy;
86
- }
87
- }
88
-
89
- // Propagate position deltas to cards
90
- _propagateDeltas(tree, allCards, oldPositions);
91
-
92
- // ── 4. Collision avoidance ──
93
- const preCollision = new Map();
94
- const allRegions = flattenRegions(tree);
95
- for (const r of allRegions) {
96
- preCollision.set(r.name, { cx: r.cx, cy: r.cy });
97
- }
98
-
99
- _resolveCollisions(tree);
100
-
101
- // Propagate collision deltas to cards
102
- _propagateDeltas(tree, allCards, preCollision);
103
-
104
- // ── 5. Restore saved positions (overrides computed ones) ──
105
- _restoreSavedPositions(tree, allCards);
106
-
107
- return { regions: tree, cards: allCards };
108
- }
109
-
110
- /**
111
- * Clear all saved positions and force a fresh orbital layout on next compute.
112
- */
113
- export function resetLayout() {
114
- try { storage.removeItem(KEYS.NODE_POS_2D); } catch (_) {}
115
- }
116
-
117
- /**
118
- * Get the flat list of all regions (parents + children) from a tree.
119
- * @param {Array} tree The top-level regions from computeLayout
120
- * @returns {Array}
121
- */
122
- export function flattenRegions(tree) {
123
- const flat = [];
124
- for (const parent of tree) {
125
- flat.push(parent);
126
- for (const child of parent.children) {
127
- flat.push(child);
128
- }
129
- }
130
- return flat;
131
- }
132
-
133
-
134
- // ═══════════════════════════════════════════
135
- // INTERNAL: Build category tree
136
- // ═══════════════════════════════════════════
137
-
138
- function _buildCategoryTree(nodes, categoryMetadata, activeCategories) {
139
- // Map: parentName → { name, cx, cy, radius, color, children[], memories[], isParent }
140
- const parentMap = new Map();
141
- const childMap = new Map(); // childName → { name, cx, cy, radius, color, memories[], parentName }
142
-
143
- // Discover parent/child structure from metadata
144
- for (const [name, meta] of Object.entries(categoryMetadata)) {
145
- if (!activeCategories.has(name)) continue;
146
-
147
- if (meta.is_parent) {
148
- if (!parentMap.has(name)) {
149
- parentMap.set(name, {
150
- name,
151
- cx: 0, cy: 0,
152
- radius: 0,
153
- color: meta.color || '#888',
154
- logoUrl: meta.logo || null,
155
- description: meta.description || '',
156
- children: [],
157
- memories: [],
158
- isParent: true,
159
- });
160
- }
161
- } else if (meta.parent) {
162
- // Ensure parent exists
163
- if (!parentMap.has(meta.parent)) {
164
- const parentMeta = categoryMetadata[meta.parent] || {};
165
- parentMap.set(meta.parent, {
166
- name: meta.parent,
167
- cx: 0, cy: 0,
168
- radius: 0,
169
- color: parentMeta.color || '#888',
170
- logoUrl: parentMeta.logo || null,
171
- description: parentMeta.description || '',
172
- children: [],
173
- memories: [],
174
- isParent: true,
175
- });
176
- }
177
- const child = {
178
- name,
179
- cx: 0, cy: 0,
180
- radius: 0,
181
- color: meta.color || '#888',
182
- logoUrl: meta.logo || null,
183
- description: meta.description || '',
184
- memories: [],
185
- parentName: meta.parent,
186
- isParent: false,
187
- };
188
- childMap.set(name, child);
189
- parentMap.get(meta.parent).children.push(child);
190
- } else {
191
- // Standalone category (no parent, not is_parent) — treat as its own parent
192
- if (!parentMap.has(name)) {
193
- parentMap.set(name, {
194
- name,
195
- cx: 0, cy: 0,
196
- radius: 0,
197
- color: meta.color || '#888',
198
- logoUrl: meta.logo || null,
199
- description: meta.description || '',
200
- children: [],
201
- memories: [],
202
- isParent: true,
203
- });
204
- }
205
- }
206
- }
207
-
208
- // Assign each node to its category
209
- for (const node of nodes) {
210
- const cat = node.payload?.category;
211
- if (!cat || !activeCategories.has(cat)) continue;
212
-
213
- if (childMap.has(cat)) {
214
- childMap.get(cat).memories.push(node);
215
- } else if (parentMap.has(cat)) {
216
- parentMap.get(cat).memories.push(node);
217
- } else {
218
- // Unknown category — create standalone parent
219
- const meta = categoryMetadata[cat] || {};
220
- const parent = {
221
- name: cat,
222
- cx: 0, cy: 0,
223
- radius: 0,
224
- color: meta.color || '#888',
225
- logoUrl: meta.logo || null,
226
- description: meta.description || '',
227
- children: [],
228
- memories: [node],
229
- isParent: true,
230
- };
231
- parentMap.set(cat, parent);
232
- }
233
- }
234
-
235
- // Filter out empty parents (no memories anywhere in tree)
236
- const tree = [];
237
- for (const parent of parentMap.values()) {
238
- const totalMemories = parent.memories.length +
239
- parent.children.reduce((sum, c) => sum + c.memories.length, 0);
240
- if (totalMemories > 0) {
241
- // Also filter out empty children
242
- parent.children = parent.children.filter(c => c.memories.length > 0);
243
- tree.push(parent);
244
- }
245
- }
246
-
247
- return tree;
248
- }
249
-
250
-
251
- // ═══════════════════════════════════════════
252
- // INTERNAL: Pass 1 — Temporary placement
253
- // ═══════════════════════════════════════════
254
-
255
- function _layoutParents(tree) {
256
- const n = tree.length;
257
- if (n === 0) return;
258
- if (n === 1) {
259
- tree[0].cx = 0;
260
- tree[0].cy = 0;
261
- return;
262
- }
263
-
264
- // Temporary tight ring — will be replaced in pass 2
265
- const baseRadius = gfx.parentOrbitRadius + n * 80;
266
-
267
- for (let i = 0; i < n; i++) {
268
- const angle = (2 * Math.PI * i) / n - Math.PI / 2; // start at top
269
- tree[i].cx = Math.cos(angle) * baseRadius;
270
- tree[i].cy = Math.sin(angle) * baseRadius;
271
- }
272
- }
273
-
274
- function _layoutChildren(parent) {
275
- const children = parent.children;
276
- const n = children.length;
277
- if (n === 0) return;
278
-
279
- // Temporary placement — will be replaced after radii are known
280
- const orbitRadius = gfx.childOrbitGap + n * 30;
281
-
282
- for (let i = 0; i < n; i++) {
283
- const angle = (2 * Math.PI * i) / n;
284
- children[i].cx = parent.cx + Math.cos(angle) * orbitRadius;
285
- children[i].cy = parent.cy + Math.sin(angle) * orbitRadius;
286
- }
287
- }
288
-
289
-
290
- // ═══════════════════════════════════════════
291
- // INTERNAL: Label exclusion zone
292
- // ═══════════════════════════════════════════
293
-
294
- /**
295
- * Compute the minimum orbital radius so no card can overlap the category label.
296
- * Uses Minkowski sum of label bounding box + card bounding box + margin,
297
- * then takes the diagonal — guarantees no overlap at ANY angle on the ring.
298
- *
299
- * Must mirror the label sizes in graph.js _drawCategoryLabel().
300
- */
301
- function _computeLabelExclusionRadius(region, isParent) {
302
- const name = region.name;
303
- const mul = state.labelSizeMultiplier || 1;
304
- const MARGIN = 35; // breathing room between label edge and nearest card edge
305
- const hasLogo = !!region.logoUrl;
306
-
307
- let halfLabelW, halfLabelH;
308
-
309
- if (isParent) {
310
- const fontSize = 38 * mul;
311
- if (hasLogo) {
312
- // Logo only — no name pill (matches graph.js parent label with logo)
313
- const logoH = 64 * mul;
314
- const logoAspect = 3; // conservative estimate for wide logos
315
- const logoW = logoH * logoAspect;
316
- const countH = fontSize * 0.45 + 10;
317
- const totalH = logoH + 6 + countH;
318
- halfLabelW = logoW / 2;
319
- halfLabelH = totalH / 2;
320
- } else {
321
- // Text only — name text + count
322
- const textW = name.length * fontSize * 0.65;
323
- const countH = fontSize * 0.45 + 10;
324
- const totalH = fontSize + 4 + countH;
325
- halfLabelW = textW / 2;
326
- halfLabelH = totalH / 2;
327
- }
328
- } else {
329
- const fontSize = 22 * mul;
330
- if (hasLogo) {
331
- // Logo only — no name text (matches graph.js child label with logo)
332
- const logoH = 32 * mul;
333
- const logoAspect = 3;
334
- const logoW = logoH * logoAspect;
335
- const countH = fontSize * 0.5 + 8;
336
- const totalH = logoH + 4 + countH;
337
- halfLabelW = logoW / 2;
338
- halfLabelH = totalH / 2;
339
- } else {
340
- // Text only — name text + count
341
- const textW = name.length * fontSize * 0.65;
342
- const countH = fontSize * 0.5 + 8;
343
- const totalH = fontSize + 4 + countH;
344
- halfLabelW = textW / 2;
345
- halfLabelH = totalH / 2;
346
- }
347
- }
348
-
349
- // Minkowski sum diagonal: guarantees no card at any ring angle can touch the label
350
- const expandedW = halfLabelW + CARD_W / 2 + MARGIN;
351
- const expandedH = halfLabelH + CARD_H / 2 + MARGIN;
352
- return Math.ceil(Math.sqrt(expandedW * expandedW + expandedH * expandedH));
353
- }
354
-
355
-
356
- // ═══════════════════════════════════════════
357
- // INTERNAL: Card orbital layout
358
- // ═══════════════════════════════════════════
359
-
360
- function _layoutCards(region, memories, isParent) {
361
- // Sort by importance descending (most important = innermost ring)
362
- const sorted = [...memories].sort((a, b) => {
363
- const impA = a.payload?.importance || 5;
364
- const impB = b.payload?.importance || 5;
365
- if (impB !== impA) return impB - impA;
366
- // Secondary: alphabetical content for stability
367
- const cA = (a.payload?.content || '').slice(0, 30);
368
- const cB = (b.payload?.content || '').slice(0, 30);
369
- return cA.localeCompare(cB);
370
- });
371
-
372
- const cards = [];
373
- const gap = gfx.cardGap;
374
- const ringGap = CARD_H + 20;
375
- // Dynamic inner radius based on actual label dimensions — no card can touch the label
376
- const innerRadius = _computeLabelExclusionRadius(region, isParent);
377
-
378
- let placed = 0;
379
- let ringIndex = 0;
380
-
381
- while (placed < sorted.length) {
382
- const ringRadius = innerRadius + ringIndex * ringGap;
383
- const circumference = 2 * Math.PI * ringRadius;
384
- const cardsInRing = Math.max(1, Math.floor(circumference / (CARD_W + gap)));
385
- const actualCount = Math.min(cardsInRing, sorted.length - placed);
386
-
387
- for (let i = 0; i < actualCount; i++) {
388
- const angle = (2 * Math.PI * i) / actualCount;
389
- const node = sorted[placed + i];
390
- const card = {
391
- node,
392
- x: region.cx + Math.cos(angle) * ringRadius,
393
- y: region.cy + Math.sin(angle) * ringRadius,
394
- pinned: false,
395
- };
396
- cards.push(card);
397
- }
398
-
399
- placed += actualCount;
400
- ringIndex++;
401
- }
402
-
403
- // Update region radius to encompass all rings
404
- region.radius = innerRadius + Math.max(0, ringIndex - 1) * ringGap + CARD_H;
405
-
406
- return cards;
407
- }
408
-
409
-
410
- // ═══════════════════════════════════════════
411
- // INTERNAL: Pass 2 — Re-position with actual radii
412
- // ═══════════════════════════════════════════
413
-
414
- /**
415
- * Re-position children using their actual radii so they don't overlap each other.
416
- */
417
- function _reLayoutChildren(parent) {
418
- const children = parent.children;
419
- const n = children.length;
420
- if (n === 0) return;
421
-
422
- // Determine orbit radius based on actual sizes
423
- const maxChildRadius = Math.max(...children.map(c => c.radius || 60));
424
- const parentRadius = parent.radius || 60;
425
-
426
- // Orbit = parent region edge + child region edge + gap
427
- const orbitRadius = parentRadius + maxChildRadius + 80;
428
-
429
- for (let i = 0; i < n; i++) {
430
- const angle = (2 * Math.PI * i) / n;
431
- children[i].cx = parent.cx + Math.cos(angle) * orbitRadius;
432
- children[i].cy = parent.cy + Math.sin(angle) * orbitRadius;
433
- }
434
- }
435
-
436
- /**
437
- * Re-position parents in a ring using their effective cluster radii
438
- * so adjacent parents have proper spacing.
439
- */
440
- function _reLayoutParentsWithRadii(tree) {
441
- const n = tree.length;
442
- if (n === 0) return;
443
- if (n === 1) {
444
- tree[0].cx = 0;
445
- tree[0].cy = 0;
446
- return;
447
- }
448
-
449
- // Calculate effective radius for each parent (includes child orbits)
450
- const effectiveRadii = tree.map(parent => {
451
- let maxExtent = parent.radius || 100;
452
- for (const child of parent.children) {
453
- const distFromParent = Math.sqrt(
454
- (child.cx - parent.cx) ** 2 + (child.cy - parent.cy) ** 2
455
- );
456
- const childExtent = distFromParent + (child.radius || 60);
457
- maxExtent = Math.max(maxExtent, childExtent);
458
- }
459
- return maxExtent;
460
- });
461
-
462
- // Ring radius: ensure adjacent clusters don't overlap
463
- // Sum of all effective diameters + gaps, divided by 2*PI
464
- const minGap = 120;
465
- const totalDiameter = effectiveRadii.reduce((sum, r) => sum + r * 2, 0);
466
- const totalGap = n * minGap;
467
- const ringRadius = Math.max(
468
- (totalDiameter + totalGap) / (2 * Math.PI),
469
- gfx.parentOrbitRadius
470
- );
471
-
472
- for (let i = 0; i < n; i++) {
473
- const angle = (2 * Math.PI * i) / n - Math.PI / 2; // start at top
474
- tree[i].cx = Math.cos(angle) * ringRadius;
475
- tree[i].cy = Math.sin(angle) * ringRadius;
476
- }
477
- }
478
-
479
-
480
- // ═══════════════════════════════════════════
481
- // INTERNAL: Delta propagation
482
- // ═══════════════════════════════════════════
483
-
484
- /**
485
- * After regions are moved (re-layout or collision), propagate
486
- * the position deltas to their cards.
487
- */
488
- function _propagateDeltas(tree, allCards, oldPositions) {
489
- // Build delta map: category name → { dx, dy }
490
- const deltas = new Map();
491
- for (const parent of tree) {
492
- const old = oldPositions.get(parent.name);
493
- if (old) deltas.set(parent.name, { dx: parent.cx - old.cx, dy: parent.cy - old.cy });
494
- for (const child of parent.children) {
495
- const oldC = oldPositions.get(child.name);
496
- if (oldC) deltas.set(child.name, { dx: child.cx - oldC.cx, dy: child.cy - oldC.cy });
497
- }
498
- }
499
-
500
- for (const card of allCards) {
501
- const cat = card.node.payload?.category;
502
- const delta = deltas.get(cat);
503
- if (delta) {
504
- card.x += delta.dx;
505
- card.y += delta.dy;
506
- }
507
- }
508
- }
509
-
510
-
511
- // ═══════════════════════════════════════════
512
- // INTERNAL: Collision avoidance
513
- // ═══════════════════════════════════════════
514
-
515
- function _resolveCollisions(tree) {
516
- const allRegions = flattenRegions(tree);
517
- if (allRegions.length < 2) return;
518
-
519
- // 6 passes with 80px padding, resolves cross-parent collisions
520
- for (let pass = 0; pass < 6; pass++) {
521
- for (let i = 0; i < allRegions.length; i++) {
522
- for (let j = i + 1; j < allRegions.length; j++) {
523
- const a = allRegions[i];
524
- const b = allRegions[j];
525
-
526
- // Skip parent-child pairs (children orbit their parent deliberately)
527
- if (a.isParent && !b.isParent && b.parentName === a.name) continue;
528
- if (b.isParent && !a.isParent && a.parentName === b.name) continue;
529
-
530
- const dx = b.cx - a.cx;
531
- const dy = b.cy - a.cy;
532
- const dist = Math.sqrt(dx * dx + dy * dy) || 1;
533
- const minDist = (a.radius || 100) + (b.radius || 100) + 80;
534
-
535
- if (dist < minDist) {
536
- const push = (minDist - dist) / 2;
537
- const nx = dx / dist;
538
- const ny = dy / dist;
539
-
540
- a.cx -= nx * push;
541
- a.cy -= ny * push;
542
- b.cx += nx * push;
543
- b.cy += ny * push;
544
-
545
- // If a parent moved, cascade to its children
546
- if (a.isParent) _moveChildrenBy(a, -nx * push, -ny * push);
547
- if (b.isParent) _moveChildrenBy(b, nx * push, ny * push);
548
- }
549
- }
550
- }
551
- }
552
- }
553
-
554
- function _moveChildrenBy(parent, dx, dy) {
555
- if (!parent.children) return;
556
- for (const child of parent.children) {
557
- child.cx += dx;
558
- child.cy += dy;
559
- }
560
- }
561
-
562
-
563
- // ═══════════════════════════════════════════
564
- // INTERNAL: Position persistence
565
- // ═══════════════════════════════════════════
566
-
567
- function _restoreSavedPositions(tree, cards) {
568
- let saved;
569
- try {
570
- saved = JSON.parse(storage.getItem(KEYS.NODE_POS_2D) || '{}');
571
- } catch { return; }
572
- if (!saved || typeof saved !== 'object') return;
573
-
574
- // Restore category positions
575
- const allRegions = flattenRegions(tree);
576
- for (const region of allRegions) {
577
- const key = `_cat_${region.name}`;
578
- const pos = saved[key];
579
- if (pos && pos.x != null && pos.y != null) {
580
- region.cx = pos.x;
581
- region.cy = pos.y;
582
- }
583
- }
584
-
585
- // Restore card positions
586
- for (const card of cards) {
587
- const pos = saved[card.node.id];
588
- if (pos && pos.x != null && pos.y != null) {
589
- card.x = pos.x;
590
- card.y = pos.y;
591
- card.pinned = pos.pinned || false;
592
- }
593
- }
594
- }
1
+ // ═══════════════════════════════════════════
2
+ // SynaBun Neural Interface — 2D Orbital Layout
3
+ // Computes hierarchical orbital positions:
4
+ // Parent categories in a ring → child categories orbit parents →
5
+ // memory cards orbit their category in concentric rings
6
+ // Two-pass layout: compute radii first, then place with proper spacing
7
+ // ═══════════════════════════════════════════
8
+
9
+ import { gfx } from './gfx.js';
10
+ import { state } from '../../shared/state.js';
11
+ import { KEYS } from '../../shared/constants.js';
12
+ import { storage } from '../../shared/storage.js';
13
+ import { posStore } from '../../shared/node-positions-store.js';
14
+
15
+ // ═══════════════════════════════════════════
16
+ // CONSTANTS
17
+ // ═══════════════════════════════════════════
18
+
19
+ export const CARD_W = 180;
20
+ export const CARD_H = 80;
21
+
22
+ // ═══════════════════════════════════════════
23
+ // PUBLIC API
24
+ // ═══════════════════════════════════════════
25
+
26
+ /**
27
+ * Compute orbital layout for all visible nodes.
28
+ * Uses a two-pass approach: first compute radii, then re-place with proper spacing.
29
+ * @param {Array} nodes state.allNodes (filtered by activeCategories)
30
+ * @param {Object} categoryMetadata state.categoryMetadata
31
+ * @param {Set} activeCategories state.activeCategories
32
+ * @returns {{ regions: CategoryRegion[], cards: CardPosition[] }}
33
+ */
34
+ export function computeLayout(nodes, categoryMetadata, activeCategories) {
35
+ // ── 1. Group nodes by category hierarchy ──
36
+ const tree = _buildCategoryTree(nodes, categoryMetadata, activeCategories);
37
+
38
+ // ── 2. Pass 1: Temporary placement + compute radii ──
39
+ _layoutParents(tree);
40
+ for (const parent of tree) {
41
+ _layoutChildren(parent);
42
+ }
43
+
44
+ // Layout cards (this sets region.radius for each region)
45
+ const allCards = [];
46
+ for (const parent of tree) {
47
+ if (parent.memories.length > 0) {
48
+ const cards = _layoutCards(parent, parent.memories, true);
49
+ allCards.push(...cards);
50
+ }
51
+ for (const child of parent.children) {
52
+ if (child.memories.length > 0) {
53
+ const cards = _layoutCards(child, child.memories, false);
54
+ allCards.push(...cards);
55
+ }
56
+ }
57
+ }
58
+
59
+ // ── 3. Pass 2: Re-position using actual radii ──
60
+ // Snapshot old positions before re-layout
61
+ const oldPositions = new Map();
62
+ for (const parent of tree) {
63
+ oldPositions.set(parent.name, { cx: parent.cx, cy: parent.cy });
64
+ for (const child of parent.children) {
65
+ oldPositions.set(child.name, { cx: child.cx, cy: child.cy });
66
+ }
67
+ }
68
+
69
+ // Re-position children with actual radii (still orbiting old parent positions)
70
+ for (const parent of tree) {
71
+ _reLayoutChildren(parent);
72
+ }
73
+
74
+ // Re-position parents in a properly-spaced ring using actual cluster radii
75
+ _reLayoutParentsWithRadii(tree);
76
+
77
+ // Cascade parent ring movement to children — they must orbit the NEW parent center
78
+ for (const parent of tree) {
79
+ const old = oldPositions.get(parent.name);
80
+ if (!old) continue;
81
+ const dx = parent.cx - old.cx;
82
+ const dy = parent.cy - old.cy;
83
+ if (dx === 0 && dy === 0) continue;
84
+ for (const child of parent.children) {
85
+ child.cx += dx;
86
+ child.cy += dy;
87
+ }
88
+ }
89
+
90
+ // Propagate position deltas to cards
91
+ _propagateDeltas(tree, allCards, oldPositions);
92
+
93
+ // ── 4. Collision avoidance ──
94
+ const preCollision = new Map();
95
+ const allRegions = flattenRegions(tree);
96
+ for (const r of allRegions) {
97
+ preCollision.set(r.name, { cx: r.cx, cy: r.cy });
98
+ }
99
+
100
+ _resolveCollisions(tree);
101
+
102
+ // Propagate collision deltas to cards
103
+ _propagateDeltas(tree, allCards, preCollision);
104
+
105
+ // ── 5. Restore saved positions (overrides computed ones) ──
106
+ _restoreSavedPositions(tree, allCards);
107
+
108
+ return { regions: tree, cards: allCards };
109
+ }
110
+
111
+ /**
112
+ * Clear all saved positions and force a fresh orbital layout on next compute.
113
+ */
114
+ export function resetLayout() {
115
+ try { posStore.removeItem(KEYS.NODE_POS_2D); } catch (_) {}
116
+ }
117
+
118
+ /**
119
+ * Get the flat list of all regions (parents + children) from a tree.
120
+ * @param {Array} tree The top-level regions from computeLayout
121
+ * @returns {Array}
122
+ */
123
+ export function flattenRegions(tree) {
124
+ const flat = [];
125
+ for (const parent of tree) {
126
+ flat.push(parent);
127
+ for (const child of parent.children) {
128
+ flat.push(child);
129
+ }
130
+ }
131
+ return flat;
132
+ }
133
+
134
+
135
+ // ═══════════════════════════════════════════
136
+ // INTERNAL: Build category tree
137
+ // ═══════════════════════════════════════════
138
+
139
+ function _buildCategoryTree(nodes, categoryMetadata, activeCategories) {
140
+ // Map: parentName → { name, cx, cy, radius, color, children[], memories[], isParent }
141
+ const parentMap = new Map();
142
+ const childMap = new Map(); // childName → { name, cx, cy, radius, color, memories[], parentName }
143
+
144
+ // Discover parent/child structure from metadata
145
+ for (const [name, meta] of Object.entries(categoryMetadata)) {
146
+ if (!activeCategories.has(name)) continue;
147
+
148
+ if (meta.is_parent) {
149
+ if (!parentMap.has(name)) {
150
+ parentMap.set(name, {
151
+ name,
152
+ cx: 0, cy: 0,
153
+ radius: 0,
154
+ color: meta.color || '#888',
155
+ logoUrl: meta.logo || null,
156
+ description: meta.description || '',
157
+ children: [],
158
+ memories: [],
159
+ isParent: true,
160
+ });
161
+ }
162
+ } else if (meta.parent) {
163
+ // Ensure parent exists
164
+ if (!parentMap.has(meta.parent)) {
165
+ const parentMeta = categoryMetadata[meta.parent] || {};
166
+ parentMap.set(meta.parent, {
167
+ name: meta.parent,
168
+ cx: 0, cy: 0,
169
+ radius: 0,
170
+ color: parentMeta.color || '#888',
171
+ logoUrl: parentMeta.logo || null,
172
+ description: parentMeta.description || '',
173
+ children: [],
174
+ memories: [],
175
+ isParent: true,
176
+ });
177
+ }
178
+ const child = {
179
+ name,
180
+ cx: 0, cy: 0,
181
+ radius: 0,
182
+ color: meta.color || '#888',
183
+ logoUrl: meta.logo || null,
184
+ description: meta.description || '',
185
+ memories: [],
186
+ parentName: meta.parent,
187
+ isParent: false,
188
+ };
189
+ childMap.set(name, child);
190
+ parentMap.get(meta.parent).children.push(child);
191
+ } else {
192
+ // Standalone category (no parent, not is_parent) — treat as its own parent
193
+ if (!parentMap.has(name)) {
194
+ parentMap.set(name, {
195
+ name,
196
+ cx: 0, cy: 0,
197
+ radius: 0,
198
+ color: meta.color || '#888',
199
+ logoUrl: meta.logo || null,
200
+ description: meta.description || '',
201
+ children: [],
202
+ memories: [],
203
+ isParent: true,
204
+ });
205
+ }
206
+ }
207
+ }
208
+
209
+ // Assign each node to its category
210
+ for (const node of nodes) {
211
+ const cat = node.payload?.category;
212
+ if (!cat || !activeCategories.has(cat)) continue;
213
+
214
+ if (childMap.has(cat)) {
215
+ childMap.get(cat).memories.push(node);
216
+ } else if (parentMap.has(cat)) {
217
+ parentMap.get(cat).memories.push(node);
218
+ } else {
219
+ // Unknown category — create standalone parent
220
+ const meta = categoryMetadata[cat] || {};
221
+ const parent = {
222
+ name: cat,
223
+ cx: 0, cy: 0,
224
+ radius: 0,
225
+ color: meta.color || '#888',
226
+ logoUrl: meta.logo || null,
227
+ description: meta.description || '',
228
+ children: [],
229
+ memories: [node],
230
+ isParent: true,
231
+ };
232
+ parentMap.set(cat, parent);
233
+ }
234
+ }
235
+
236
+ // Filter out empty parents (no memories anywhere in tree)
237
+ const tree = [];
238
+ for (const parent of parentMap.values()) {
239
+ const totalMemories = parent.memories.length +
240
+ parent.children.reduce((sum, c) => sum + c.memories.length, 0);
241
+ if (totalMemories > 0) {
242
+ // Also filter out empty children
243
+ parent.children = parent.children.filter(c => c.memories.length > 0);
244
+ tree.push(parent);
245
+ }
246
+ }
247
+
248
+ return tree;
249
+ }
250
+
251
+
252
+ // ═══════════════════════════════════════════
253
+ // INTERNAL: Pass 1 — Temporary placement
254
+ // ═══════════════════════════════════════════
255
+
256
+ function _layoutParents(tree) {
257
+ const n = tree.length;
258
+ if (n === 0) return;
259
+ if (n === 1) {
260
+ tree[0].cx = 0;
261
+ tree[0].cy = 0;
262
+ return;
263
+ }
264
+
265
+ // Temporary tight ring — will be replaced in pass 2
266
+ const baseRadius = gfx.parentOrbitRadius + n * 80;
267
+
268
+ for (let i = 0; i < n; i++) {
269
+ const angle = (2 * Math.PI * i) / n - Math.PI / 2; // start at top
270
+ tree[i].cx = Math.cos(angle) * baseRadius;
271
+ tree[i].cy = Math.sin(angle) * baseRadius;
272
+ }
273
+ }
274
+
275
+ function _layoutChildren(parent) {
276
+ const children = parent.children;
277
+ const n = children.length;
278
+ if (n === 0) return;
279
+
280
+ // Temporary placement — will be replaced after radii are known
281
+ const orbitRadius = gfx.childOrbitGap + n * 30;
282
+
283
+ for (let i = 0; i < n; i++) {
284
+ const angle = (2 * Math.PI * i) / n;
285
+ children[i].cx = parent.cx + Math.cos(angle) * orbitRadius;
286
+ children[i].cy = parent.cy + Math.sin(angle) * orbitRadius;
287
+ }
288
+ }
289
+
290
+
291
+ // ═══════════════════════════════════════════
292
+ // INTERNAL: Label exclusion zone
293
+ // ═══════════════════════════════════════════
294
+
295
+ /**
296
+ * Compute the minimum orbital radius so no card can overlap the category label.
297
+ * Uses Minkowski sum of label bounding box + card bounding box + margin,
298
+ * then takes the diagonal — guarantees no overlap at ANY angle on the ring.
299
+ *
300
+ * Must mirror the label sizes in graph.js _drawCategoryLabel().
301
+ */
302
+ function _computeLabelExclusionRadius(region, isParent) {
303
+ const name = region.name;
304
+ const mul = state.labelSizeMultiplier || 1;
305
+ const MARGIN = 35; // breathing room between label edge and nearest card edge
306
+ const hasLogo = !!region.logoUrl;
307
+
308
+ let halfLabelW, halfLabelH;
309
+
310
+ if (isParent) {
311
+ const fontSize = 38 * mul;
312
+ if (hasLogo) {
313
+ // Logo only — no name pill (matches graph.js parent label with logo)
314
+ const logoH = 64 * mul;
315
+ const logoAspect = 3; // conservative estimate for wide logos
316
+ const logoW = logoH * logoAspect;
317
+ const countH = fontSize * 0.45 + 10;
318
+ const totalH = logoH + 6 + countH;
319
+ halfLabelW = logoW / 2;
320
+ halfLabelH = totalH / 2;
321
+ } else {
322
+ // Text only — name text + count
323
+ const textW = name.length * fontSize * 0.65;
324
+ const countH = fontSize * 0.45 + 10;
325
+ const totalH = fontSize + 4 + countH;
326
+ halfLabelW = textW / 2;
327
+ halfLabelH = totalH / 2;
328
+ }
329
+ } else {
330
+ const fontSize = 22 * mul;
331
+ if (hasLogo) {
332
+ // Logo only — no name text (matches graph.js child label with logo)
333
+ const logoH = 32 * mul;
334
+ const logoAspect = 3;
335
+ const logoW = logoH * logoAspect;
336
+ const countH = fontSize * 0.5 + 8;
337
+ const totalH = logoH + 4 + countH;
338
+ halfLabelW = logoW / 2;
339
+ halfLabelH = totalH / 2;
340
+ } else {
341
+ // Text only — name text + count
342
+ const textW = name.length * fontSize * 0.65;
343
+ const countH = fontSize * 0.5 + 8;
344
+ const totalH = fontSize + 4 + countH;
345
+ halfLabelW = textW / 2;
346
+ halfLabelH = totalH / 2;
347
+ }
348
+ }
349
+
350
+ // Minkowski sum diagonal: guarantees no card at any ring angle can touch the label
351
+ const expandedW = halfLabelW + CARD_W / 2 + MARGIN;
352
+ const expandedH = halfLabelH + CARD_H / 2 + MARGIN;
353
+ return Math.ceil(Math.sqrt(expandedW * expandedW + expandedH * expandedH));
354
+ }
355
+
356
+
357
+ // ═══════════════════════════════════════════
358
+ // INTERNAL: Card orbital layout
359
+ // ═══════════════════════════════════════════
360
+
361
+ function _layoutCards(region, memories, isParent) {
362
+ // Sort by importance descending (most important = innermost ring)
363
+ const sorted = [...memories].sort((a, b) => {
364
+ const impA = a.payload?.importance || 5;
365
+ const impB = b.payload?.importance || 5;
366
+ if (impB !== impA) return impB - impA;
367
+ // Secondary: alphabetical content for stability
368
+ const cA = (a.payload?.content || '').slice(0, 30);
369
+ const cB = (b.payload?.content || '').slice(0, 30);
370
+ return cA.localeCompare(cB);
371
+ });
372
+
373
+ const cards = [];
374
+ const gap = gfx.cardGap;
375
+ const ringGap = CARD_H + 20;
376
+ // Dynamic inner radius based on actual label dimensions — no card can touch the label
377
+ const innerRadius = _computeLabelExclusionRadius(region, isParent);
378
+
379
+ let placed = 0;
380
+ let ringIndex = 0;
381
+
382
+ while (placed < sorted.length) {
383
+ const ringRadius = innerRadius + ringIndex * ringGap;
384
+ const circumference = 2 * Math.PI * ringRadius;
385
+ const cardsInRing = Math.max(1, Math.floor(circumference / (CARD_W + gap)));
386
+ const actualCount = Math.min(cardsInRing, sorted.length - placed);
387
+
388
+ for (let i = 0; i < actualCount; i++) {
389
+ const angle = (2 * Math.PI * i) / actualCount;
390
+ const node = sorted[placed + i];
391
+ const card = {
392
+ node,
393
+ x: region.cx + Math.cos(angle) * ringRadius,
394
+ y: region.cy + Math.sin(angle) * ringRadius,
395
+ pinned: false,
396
+ };
397
+ cards.push(card);
398
+ }
399
+
400
+ placed += actualCount;
401
+ ringIndex++;
402
+ }
403
+
404
+ // Update region radius to encompass all rings
405
+ region.radius = innerRadius + Math.max(0, ringIndex - 1) * ringGap + CARD_H;
406
+
407
+ return cards;
408
+ }
409
+
410
+
411
+ // ═══════════════════════════════════════════
412
+ // INTERNAL: Pass 2 — Re-position with actual radii
413
+ // ═══════════════════════════════════════════
414
+
415
+ /**
416
+ * Re-position children using their actual radii so they don't overlap each other.
417
+ */
418
+ function _reLayoutChildren(parent) {
419
+ const children = parent.children;
420
+ const n = children.length;
421
+ if (n === 0) return;
422
+
423
+ // Determine orbit radius based on actual sizes
424
+ const maxChildRadius = Math.max(...children.map(c => c.radius || 60));
425
+ const parentRadius = parent.radius || 60;
426
+
427
+ // Orbit = parent region edge + child region edge + gap
428
+ const orbitRadius = parentRadius + maxChildRadius + 80;
429
+
430
+ for (let i = 0; i < n; i++) {
431
+ const angle = (2 * Math.PI * i) / n;
432
+ children[i].cx = parent.cx + Math.cos(angle) * orbitRadius;
433
+ children[i].cy = parent.cy + Math.sin(angle) * orbitRadius;
434
+ }
435
+ }
436
+
437
+ /**
438
+ * Re-position parents in a ring using their effective cluster radii
439
+ * so adjacent parents have proper spacing.
440
+ */
441
+ function _reLayoutParentsWithRadii(tree) {
442
+ const n = tree.length;
443
+ if (n === 0) return;
444
+ if (n === 1) {
445
+ tree[0].cx = 0;
446
+ tree[0].cy = 0;
447
+ return;
448
+ }
449
+
450
+ // Calculate effective radius for each parent (includes child orbits)
451
+ const effectiveRadii = tree.map(parent => {
452
+ let maxExtent = parent.radius || 100;
453
+ for (const child of parent.children) {
454
+ const distFromParent = Math.sqrt(
455
+ (child.cx - parent.cx) ** 2 + (child.cy - parent.cy) ** 2
456
+ );
457
+ const childExtent = distFromParent + (child.radius || 60);
458
+ maxExtent = Math.max(maxExtent, childExtent);
459
+ }
460
+ return maxExtent;
461
+ });
462
+
463
+ // Ring radius: ensure adjacent clusters don't overlap
464
+ // Sum of all effective diameters + gaps, divided by 2*PI
465
+ const minGap = 120;
466
+ const totalDiameter = effectiveRadii.reduce((sum, r) => sum + r * 2, 0);
467
+ const totalGap = n * minGap;
468
+ const ringRadius = Math.max(
469
+ (totalDiameter + totalGap) / (2 * Math.PI),
470
+ gfx.parentOrbitRadius
471
+ );
472
+
473
+ for (let i = 0; i < n; i++) {
474
+ const angle = (2 * Math.PI * i) / n - Math.PI / 2; // start at top
475
+ tree[i].cx = Math.cos(angle) * ringRadius;
476
+ tree[i].cy = Math.sin(angle) * ringRadius;
477
+ }
478
+ }
479
+
480
+
481
+ // ═══════════════════════════════════════════
482
+ // INTERNAL: Delta propagation
483
+ // ═══════════════════════════════════════════
484
+
485
+ /**
486
+ * After regions are moved (re-layout or collision), propagate
487
+ * the position deltas to their cards.
488
+ */
489
+ function _propagateDeltas(tree, allCards, oldPositions) {
490
+ // Build delta map: category name → { dx, dy }
491
+ const deltas = new Map();
492
+ for (const parent of tree) {
493
+ const old = oldPositions.get(parent.name);
494
+ if (old) deltas.set(parent.name, { dx: parent.cx - old.cx, dy: parent.cy - old.cy });
495
+ for (const child of parent.children) {
496
+ const oldC = oldPositions.get(child.name);
497
+ if (oldC) deltas.set(child.name, { dx: child.cx - oldC.cx, dy: child.cy - oldC.cy });
498
+ }
499
+ }
500
+
501
+ for (const card of allCards) {
502
+ const cat = card.node.payload?.category;
503
+ const delta = deltas.get(cat);
504
+ if (delta) {
505
+ card.x += delta.dx;
506
+ card.y += delta.dy;
507
+ }
508
+ }
509
+ }
510
+
511
+
512
+ // ═══════════════════════════════════════════
513
+ // INTERNAL: Collision avoidance
514
+ // ═══════════════════════════════════════════
515
+
516
+ function _resolveCollisions(tree) {
517
+ const allRegions = flattenRegions(tree);
518
+ if (allRegions.length < 2) return;
519
+
520
+ // 6 passes with 80px padding, resolves cross-parent collisions
521
+ for (let pass = 0; pass < 6; pass++) {
522
+ for (let i = 0; i < allRegions.length; i++) {
523
+ for (let j = i + 1; j < allRegions.length; j++) {
524
+ const a = allRegions[i];
525
+ const b = allRegions[j];
526
+
527
+ // Skip parent-child pairs (children orbit their parent deliberately)
528
+ if (a.isParent && !b.isParent && b.parentName === a.name) continue;
529
+ if (b.isParent && !a.isParent && a.parentName === b.name) continue;
530
+
531
+ const dx = b.cx - a.cx;
532
+ const dy = b.cy - a.cy;
533
+ const dist = Math.sqrt(dx * dx + dy * dy) || 1;
534
+ const minDist = (a.radius || 100) + (b.radius || 100) + 80;
535
+
536
+ if (dist < minDist) {
537
+ const push = (minDist - dist) / 2;
538
+ const nx = dx / dist;
539
+ const ny = dy / dist;
540
+
541
+ a.cx -= nx * push;
542
+ a.cy -= ny * push;
543
+ b.cx += nx * push;
544
+ b.cy += ny * push;
545
+
546
+ // If a parent moved, cascade to its children
547
+ if (a.isParent) _moveChildrenBy(a, -nx * push, -ny * push);
548
+ if (b.isParent) _moveChildrenBy(b, nx * push, ny * push);
549
+ }
550
+ }
551
+ }
552
+ }
553
+ }
554
+
555
+ function _moveChildrenBy(parent, dx, dy) {
556
+ if (!parent.children) return;
557
+ for (const child of parent.children) {
558
+ child.cx += dx;
559
+ child.cy += dy;
560
+ }
561
+ }
562
+
563
+
564
+ // ═══════════════════════════════════════════
565
+ // INTERNAL: Position persistence
566
+ // ═══════════════════════════════════════════
567
+
568
+ function _restoreSavedPositions(tree, cards) {
569
+ let saved;
570
+ try {
571
+ saved = JSON.parse(posStore.getItem(KEYS.NODE_POS_2D) || '{}');
572
+ } catch { return; }
573
+ if (!saved || typeof saved !== 'object') return;
574
+
575
+ // Restore category positions
576
+ const allRegions = flattenRegions(tree);
577
+ for (const region of allRegions) {
578
+ const key = `_cat_${region.name}`;
579
+ const pos = saved[key];
580
+ if (pos && pos.x != null && pos.y != null) {
581
+ region.cx = pos.x;
582
+ region.cy = pos.y;
583
+ }
584
+ }
585
+
586
+ // Restore card positions
587
+ for (const card of cards) {
588
+ const pos = saved[card.node.id];
589
+ if (pos && pos.x != null && pos.y != null) {
590
+ card.x = pos.x;
591
+ card.y = pos.y;
592
+ card.pinned = pos.pinned || false;
593
+ }
594
+ }
595
+ }