synabun 1.3.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1163) hide show
  1. package/CHANGELOG.md +205 -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 +136 -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/whatsapp.md +325 -0
  20. package/hooks/claude-code/post-plan.mjs +613 -391
  21. package/hooks/claude-code/post-remember.mjs +246 -122
  22. package/hooks/claude-code/pre-compact.mjs +171 -110
  23. package/hooks/claude-code/pre-task.mjs +133 -0
  24. package/hooks/claude-code/pre-websearch.mjs +15 -4
  25. package/hooks/claude-code/prompt-origin.mjs +94 -0
  26. package/hooks/claude-code/prompt-submit.mjs +1244 -861
  27. package/hooks/claude-code/session-start.mjs +114 -156
  28. package/hooks/claude-code/shared.mjs +1228 -368
  29. package/hooks/claude-code/state.mjs +167 -0
  30. package/hooks/claude-code/stop.mjs +515 -140
  31. package/hooks/claude-code/subagent-start.mjs +154 -0
  32. package/hooks/claude-code/subagent-stop.mjs +102 -0
  33. package/hooks/claude-code/task-gate.mjs +150 -0
  34. package/launcher.mjs +40 -0
  35. package/lib/claude-hooks.js +137 -0
  36. package/lib/claude-usage-audit.js +141 -0
  37. package/lib/client-config-repair.js +145 -0
  38. package/lib/data-home-migration.js +502 -0
  39. package/lib/desktop-pwa.js +206 -0
  40. package/lib/external-tools.js +221 -0
  41. package/lib/first-launch-protection.js +245 -0
  42. package/lib/packaged-runtime.js +110 -0
  43. package/lib/paths.d.ts +21 -0
  44. package/lib/paths.js +103 -0
  45. package/lib/start-launcher.js +1309 -0
  46. package/mcp-server/dist/config.d.ts +22 -0
  47. package/mcp-server/dist/config.d.ts.map +1 -0
  48. package/mcp-server/dist/config.js +109 -0
  49. package/mcp-server/dist/config.js.map +1 -0
  50. package/mcp-server/dist/http.d.ts +30 -0
  51. package/mcp-server/dist/http.d.ts.map +1 -0
  52. package/mcp-server/dist/http.js +276 -0
  53. package/mcp-server/dist/http.js.map +1 -0
  54. package/mcp-server/dist/index.d.ts +48 -0
  55. package/mcp-server/dist/index.d.ts.map +1 -0
  56. package/mcp-server/dist/index.js +538 -0
  57. package/mcp-server/dist/index.js.map +1 -0
  58. package/mcp-server/dist/preload-http.d.ts +3 -0
  59. package/mcp-server/dist/preload-http.d.ts.map +1 -0
  60. package/mcp-server/dist/preload-http.js +28 -0
  61. package/mcp-server/dist/preload-http.js.map +1 -0
  62. package/mcp-server/dist/preload.d.ts +3 -0
  63. package/mcp-server/dist/preload.d.ts.map +1 -0
  64. package/mcp-server/dist/preload.js +32 -0
  65. package/mcp-server/dist/preload.js.map +1 -0
  66. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts +19 -0
  67. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts.map +1 -0
  68. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js +403 -0
  69. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js.map +1 -0
  70. package/mcp-server/dist/scripts/setup-embeddings.d.ts +3 -0
  71. package/mcp-server/dist/scripts/setup-embeddings.d.ts.map +1 -0
  72. package/mcp-server/dist/scripts/setup-embeddings.js +15 -0
  73. package/mcp-server/dist/scripts/setup-embeddings.js.map +1 -0
  74. package/mcp-server/dist/services/assistant-judgments.d.ts +79 -0
  75. package/mcp-server/dist/services/assistant-judgments.d.ts.map +1 -0
  76. package/mcp-server/dist/services/assistant-judgments.js +128 -0
  77. package/mcp-server/dist/services/assistant-judgments.js.map +1 -0
  78. package/mcp-server/dist/services/browser-assist-gate.d.ts +314 -0
  79. package/mcp-server/dist/services/browser-assist-gate.d.ts.map +1 -0
  80. package/mcp-server/dist/services/browser-assist-gate.js +344 -0
  81. package/mcp-server/dist/services/browser-assist-gate.js.map +1 -0
  82. package/mcp-server/dist/services/browser-assist.d.ts +104 -0
  83. package/mcp-server/dist/services/browser-assist.d.ts.map +1 -0
  84. package/mcp-server/dist/services/browser-assist.js +282 -0
  85. package/mcp-server/dist/services/browser-assist.js.map +1 -0
  86. package/mcp-server/dist/services/browser-bench.d.ts +772 -0
  87. package/mcp-server/dist/services/browser-bench.d.ts.map +1 -0
  88. package/mcp-server/dist/services/browser-bench.js +424 -0
  89. package/mcp-server/dist/services/browser-bench.js.map +1 -0
  90. package/mcp-server/dist/services/browser-judgments.d.ts +196 -0
  91. package/mcp-server/dist/services/browser-judgments.d.ts.map +1 -0
  92. package/mcp-server/dist/services/browser-judgments.js +363 -0
  93. package/mcp-server/dist/services/browser-judgments.js.map +1 -0
  94. package/mcp-server/dist/services/browser-risk.d.ts +166 -0
  95. package/mcp-server/dist/services/browser-risk.d.ts.map +1 -0
  96. package/mcp-server/dist/services/browser-risk.js +458 -0
  97. package/mcp-server/dist/services/browser-risk.js.map +1 -0
  98. package/mcp-server/dist/services/categories.d.ts +61 -0
  99. package/mcp-server/dist/services/categories.d.ts.map +1 -0
  100. package/mcp-server/dist/services/categories.js +377 -0
  101. package/mcp-server/dist/services/categories.js.map +1 -0
  102. package/mcp-server/dist/services/codex-config-heal.d.ts +49 -0
  103. package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -0
  104. package/mcp-server/dist/services/codex-config-heal.js +346 -0
  105. package/mcp-server/dist/services/codex-config-heal.js.map +1 -0
  106. package/mcp-server/dist/services/desktop-assist-gate.d.ts +198 -0
  107. package/mcp-server/dist/services/desktop-assist-gate.d.ts.map +1 -0
  108. package/mcp-server/dist/services/desktop-assist-gate.js +202 -0
  109. package/mcp-server/dist/services/desktop-assist-gate.js.map +1 -0
  110. package/mcp-server/dist/services/desktop-assist.d.ts +104 -0
  111. package/mcp-server/dist/services/desktop-assist.d.ts.map +1 -0
  112. package/mcp-server/dist/services/desktop-assist.js +266 -0
  113. package/mcp-server/dist/services/desktop-assist.js.map +1 -0
  114. package/mcp-server/dist/services/desktop-bench.d.ts +553 -0
  115. package/mcp-server/dist/services/desktop-bench.d.ts.map +1 -0
  116. package/mcp-server/dist/services/desktop-bench.js +311 -0
  117. package/mcp-server/dist/services/desktop-bench.js.map +1 -0
  118. package/mcp-server/dist/services/desktop-client.d.ts +23 -0
  119. package/mcp-server/dist/services/desktop-client.d.ts.map +1 -0
  120. package/mcp-server/dist/services/desktop-client.js +79 -0
  121. package/mcp-server/dist/services/desktop-client.js.map +1 -0
  122. package/mcp-server/dist/services/desktop-judgments.d.ts +125 -0
  123. package/mcp-server/dist/services/desktop-judgments.d.ts.map +1 -0
  124. package/mcp-server/dist/services/desktop-judgments.js +177 -0
  125. package/mcp-server/dist/services/desktop-judgments.js.map +1 -0
  126. package/mcp-server/dist/services/desktop-risk.d.ts +283 -0
  127. package/mcp-server/dist/services/desktop-risk.d.ts.map +1 -0
  128. package/mcp-server/dist/services/desktop-risk.js +605 -0
  129. package/mcp-server/dist/services/desktop-risk.js.map +1 -0
  130. package/mcp-server/dist/services/discord.d.ts +112 -0
  131. package/mcp-server/dist/services/discord.d.ts.map +1 -0
  132. package/mcp-server/dist/services/discord.js +477 -0
  133. package/mcp-server/dist/services/discord.js.map +1 -0
  134. package/mcp-server/dist/services/edit-stale.d.ts +81 -0
  135. package/mcp-server/dist/services/edit-stale.d.ts.map +1 -0
  136. package/mcp-server/dist/services/edit-stale.js +358 -0
  137. package/mcp-server/dist/services/edit-stale.js.map +1 -0
  138. package/mcp-server/dist/services/embedding-service.d.ts +16 -0
  139. package/mcp-server/dist/services/embedding-service.d.ts.map +1 -0
  140. package/mcp-server/dist/services/embedding-service.js +126 -0
  141. package/mcp-server/dist/services/embedding-service.js.map +1 -0
  142. package/mcp-server/dist/services/embedding-worker.d.ts +2 -0
  143. package/mcp-server/dist/services/embedding-worker.d.ts.map +1 -0
  144. package/mcp-server/dist/services/embedding-worker.js +52 -0
  145. package/mcp-server/dist/services/embedding-worker.js.map +1 -0
  146. package/mcp-server/dist/services/fb-regions.d.ts +71 -0
  147. package/mcp-server/dist/services/fb-regions.d.ts.map +1 -0
  148. package/mcp-server/dist/services/fb-regions.js +211 -0
  149. package/mcp-server/dist/services/fb-regions.js.map +1 -0
  150. package/mcp-server/dist/services/file-checksums.d.ts +22 -0
  151. package/mcp-server/dist/services/file-checksums.d.ts.map +1 -0
  152. package/mcp-server/dist/services/file-checksums.js +55 -0
  153. package/mcp-server/dist/services/file-checksums.js.map +1 -0
  154. package/mcp-server/dist/services/file-excerpt.d.ts +24 -0
  155. package/mcp-server/dist/services/file-excerpt.d.ts.map +1 -0
  156. package/mcp-server/dist/services/file-excerpt.js +65 -0
  157. package/mcp-server/dist/services/file-excerpt.js.map +1 -0
  158. package/mcp-server/dist/services/identity.d.ts +124 -0
  159. package/mcp-server/dist/services/identity.d.ts.map +1 -0
  160. package/mcp-server/dist/services/identity.js +241 -0
  161. package/mcp-server/dist/services/identity.js.map +1 -0
  162. package/mcp-server/dist/services/local-embeddings.d.ts +2 -0
  163. package/mcp-server/dist/services/local-embeddings.d.ts.map +1 -0
  164. package/mcp-server/dist/services/local-embeddings.js +3 -0
  165. package/mcp-server/dist/services/local-embeddings.js.map +1 -0
  166. package/mcp-server/dist/services/memory-client.d.ts +4 -0
  167. package/mcp-server/dist/services/memory-client.d.ts.map +1 -0
  168. package/mcp-server/dist/services/memory-client.js +27 -0
  169. package/mcp-server/dist/services/memory-client.js.map +1 -0
  170. package/mcp-server/dist/services/memory-judge-backfill.d.ts +135 -0
  171. package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -0
  172. package/mcp-server/dist/services/memory-judge-backfill.js +510 -0
  173. package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -0
  174. package/mcp-server/dist/services/memory-judgments.d.ts +362 -0
  175. package/mcp-server/dist/services/memory-judgments.d.ts.map +1 -0
  176. package/mcp-server/dist/services/memory-judgments.js +674 -0
  177. package/mcp-server/dist/services/memory-judgments.js.map +1 -0
  178. package/mcp-server/dist/services/memory-maintenance.d.ts +108 -0
  179. package/mcp-server/dist/services/memory-maintenance.d.ts.map +1 -0
  180. package/mcp-server/dist/services/memory-maintenance.js +403 -0
  181. package/mcp-server/dist/services/memory-maintenance.js.map +1 -0
  182. package/mcp-server/dist/services/memory-retrieval.d.ts +66 -0
  183. package/mcp-server/dist/services/memory-retrieval.d.ts.map +1 -0
  184. package/mcp-server/dist/services/memory-retrieval.js +412 -0
  185. package/mcp-server/dist/services/memory-retrieval.js.map +1 -0
  186. package/mcp-server/dist/services/memory-schema.d.ts +16 -0
  187. package/mcp-server/dist/services/memory-schema.d.ts.map +1 -0
  188. package/mcp-server/dist/services/memory-schema.js +282 -0
  189. package/mcp-server/dist/services/memory-schema.js.map +1 -0
  190. package/mcp-server/dist/services/memory-sessions.d.ts +24 -0
  191. package/mcp-server/dist/services/memory-sessions.d.ts.map +1 -0
  192. package/mcp-server/dist/services/memory-sessions.js +110 -0
  193. package/mcp-server/dist/services/memory-sessions.js.map +1 -0
  194. package/mcp-server/dist/services/memory-triage.d.ts +60 -0
  195. package/mcp-server/dist/services/memory-triage.d.ts.map +1 -0
  196. package/mcp-server/dist/services/memory-triage.js +189 -0
  197. package/mcp-server/dist/services/memory-triage.js.map +1 -0
  198. package/mcp-server/dist/services/memory-verification.d.ts +24 -0
  199. package/mcp-server/dist/services/memory-verification.d.ts.map +1 -0
  200. package/mcp-server/dist/services/memory-verification.js +92 -0
  201. package/mcp-server/dist/services/memory-verification.js.map +1 -0
  202. package/mcp-server/dist/services/memory-writer.d.ts +26 -0
  203. package/mcp-server/dist/services/memory-writer.d.ts.map +1 -0
  204. package/mcp-server/dist/services/memory-writer.js +126 -0
  205. package/mcp-server/dist/services/memory-writer.js.map +1 -0
  206. package/mcp-server/dist/services/neural-interface.d.ts +439 -0
  207. package/mcp-server/dist/services/neural-interface.d.ts.map +1 -0
  208. package/mcp-server/dist/services/neural-interface.js +1135 -0
  209. package/mcp-server/dist/services/neural-interface.js.map +1 -0
  210. package/mcp-server/dist/services/profiles.d.ts +120 -0
  211. package/mcp-server/dist/services/profiles.d.ts.map +1 -0
  212. package/mcp-server/dist/services/profiles.js +387 -0
  213. package/mcp-server/dist/services/profiles.js.map +1 -0
  214. package/mcp-server/dist/services/secret-gate.d.ts +29 -0
  215. package/mcp-server/dist/services/secret-gate.d.ts.map +1 -0
  216. package/mcp-server/dist/services/secret-gate.js +43 -0
  217. package/mcp-server/dist/services/secret-gate.js.map +1 -0
  218. package/mcp-server/dist/services/server-instructions.d.ts +10 -0
  219. package/mcp-server/dist/services/server-instructions.d.ts.map +1 -0
  220. package/mcp-server/dist/services/server-instructions.js +101 -0
  221. package/mcp-server/dist/services/server-instructions.js.map +1 -0
  222. package/mcp-server/dist/services/sqlite.d.ts +235 -0
  223. package/mcp-server/dist/services/sqlite.d.ts.map +1 -0
  224. package/mcp-server/dist/services/sqlite.js +1185 -0
  225. package/mcp-server/dist/services/sqlite.js.map +1 -0
  226. package/mcp-server/dist/services/typesafe-bench.d.ts +99 -0
  227. package/mcp-server/dist/services/typesafe-bench.d.ts.map +1 -0
  228. package/mcp-server/dist/services/typesafe-bench.js +218 -0
  229. package/mcp-server/dist/services/typesafe-bench.js.map +1 -0
  230. package/mcp-server/dist/services/typesafe-config.d.ts +342 -0
  231. package/mcp-server/dist/services/typesafe-config.d.ts.map +1 -0
  232. package/mcp-server/dist/services/typesafe-config.js +746 -0
  233. package/mcp-server/dist/services/typesafe-config.js.map +1 -0
  234. package/mcp-server/dist/services/typesafe.d.ts +213 -0
  235. package/mcp-server/dist/services/typesafe.d.ts.map +1 -0
  236. package/mcp-server/dist/services/typesafe.js +330 -0
  237. package/mcp-server/dist/services/typesafe.js.map +1 -0
  238. package/mcp-server/dist/services/vector-cache.d.ts +68 -0
  239. package/mcp-server/dist/services/vector-cache.d.ts.map +1 -0
  240. package/mcp-server/dist/services/vector-cache.js +271 -0
  241. package/mcp-server/dist/services/vector-cache.js.map +1 -0
  242. package/mcp-server/dist/services/whiteboard-geometry.d.ts +305 -0
  243. package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -0
  244. package/mcp-server/dist/services/whiteboard-geometry.js +666 -0
  245. package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -0
  246. package/mcp-server/dist/tools/agents.d.ts +212 -0
  247. package/mcp-server/dist/tools/agents.d.ts.map +1 -0
  248. package/mcp-server/dist/tools/agents.js +407 -0
  249. package/mcp-server/dist/tools/agents.js.map +1 -0
  250. package/mcp-server/dist/tools/bluesky.d.ts +39 -0
  251. package/mcp-server/dist/tools/bluesky.d.ts.map +1 -0
  252. package/mcp-server/dist/tools/bluesky.js +1144 -0
  253. package/mcp-server/dist/tools/bluesky.js.map +1 -0
  254. package/mcp-server/dist/tools/browser-advanced.d.ts +58 -0
  255. package/mcp-server/dist/tools/browser-advanced.d.ts.map +1 -0
  256. package/mcp-server/dist/tools/browser-advanced.js +106 -0
  257. package/mcp-server/dist/tools/browser-advanced.js.map +1 -0
  258. package/mcp-server/dist/tools/browser-batch.d.ts +99 -0
  259. package/mcp-server/dist/tools/browser-batch.d.ts.map +1 -0
  260. package/mcp-server/dist/tools/browser-batch.js +187 -0
  261. package/mcp-server/dist/tools/browser-batch.js.map +1 -0
  262. package/mcp-server/dist/tools/browser-cheatsheet.d.ts +21 -0
  263. package/mcp-server/dist/tools/browser-cheatsheet.d.ts.map +1 -0
  264. package/mcp-server/dist/tools/browser-cheatsheet.js +144 -0
  265. package/mcp-server/dist/tools/browser-cheatsheet.js.map +1 -0
  266. package/mcp-server/dist/tools/browser-interact.d.ts +239 -0
  267. package/mcp-server/dist/tools/browser-interact.d.ts.map +1 -0
  268. package/mcp-server/dist/tools/browser-interact.js +300 -0
  269. package/mcp-server/dist/tools/browser-interact.js.map +1 -0
  270. package/mcp-server/dist/tools/browser-navigate.d.ts +90 -0
  271. package/mcp-server/dist/tools/browser-navigate.d.ts.map +1 -0
  272. package/mcp-server/dist/tools/browser-navigate.js +142 -0
  273. package/mcp-server/dist/tools/browser-navigate.js.map +1 -0
  274. package/mcp-server/dist/tools/browser-observe.d.ts +561 -0
  275. package/mcp-server/dist/tools/browser-observe.d.ts.map +1 -0
  276. package/mcp-server/dist/tools/browser-observe.js +2009 -0
  277. package/mcp-server/dist/tools/browser-observe.js.map +1 -0
  278. package/mcp-server/dist/tools/browser.d.ts +34 -0
  279. package/mcp-server/dist/tools/browser.d.ts.map +1 -0
  280. package/mcp-server/dist/tools/browser.js +112 -0
  281. package/mcp-server/dist/tools/browser.js.map +1 -0
  282. package/mcp-server/dist/tools/card-tools.d.ts +82 -0
  283. package/mcp-server/dist/tools/card-tools.d.ts.map +1 -0
  284. package/mcp-server/dist/tools/card-tools.js +137 -0
  285. package/mcp-server/dist/tools/card-tools.js.map +1 -0
  286. package/mcp-server/dist/tools/card.d.ts +8 -0
  287. package/mcp-server/dist/tools/card.d.ts.map +1 -0
  288. package/mcp-server/dist/tools/card.js +16 -0
  289. package/mcp-server/dist/tools/card.js.map +1 -0
  290. package/mcp-server/dist/tools/category.d.ts +32 -0
  291. package/mcp-server/dist/tools/category.d.ts.map +1 -0
  292. package/mcp-server/dist/tools/category.js +290 -0
  293. package/mcp-server/dist/tools/category.js.map +1 -0
  294. package/mcp-server/dist/tools/choice.d.ts +160 -0
  295. package/mcp-server/dist/tools/choice.d.ts.map +1 -0
  296. package/mcp-server/dist/tools/choice.js +80 -0
  297. package/mcp-server/dist/tools/choice.js.map +1 -0
  298. package/mcp-server/dist/tools/computer.d.ts +71 -0
  299. package/mcp-server/dist/tools/computer.d.ts.map +1 -0
  300. package/mcp-server/dist/tools/computer.js +174 -0
  301. package/mcp-server/dist/tools/computer.js.map +1 -0
  302. package/mcp-server/dist/tools/discord-channel.d.ts +44 -0
  303. package/mcp-server/dist/tools/discord-channel.d.ts.map +1 -0
  304. package/mcp-server/dist/tools/discord-channel.js +236 -0
  305. package/mcp-server/dist/tools/discord-channel.js.map +1 -0
  306. package/mcp-server/dist/tools/discord-guild.d.ts +20 -0
  307. package/mcp-server/dist/tools/discord-guild.d.ts.map +1 -0
  308. package/mcp-server/dist/tools/discord-guild.js +138 -0
  309. package/mcp-server/dist/tools/discord-guild.js.map +1 -0
  310. package/mcp-server/dist/tools/discord-member.d.ts +26 -0
  311. package/mcp-server/dist/tools/discord-member.d.ts.map +1 -0
  312. package/mcp-server/dist/tools/discord-member.js +122 -0
  313. package/mcp-server/dist/tools/discord-member.js.map +1 -0
  314. package/mcp-server/dist/tools/discord-message.d.ts +36 -0
  315. package/mcp-server/dist/tools/discord-message.d.ts.map +1 -0
  316. package/mcp-server/dist/tools/discord-message.js +184 -0
  317. package/mcp-server/dist/tools/discord-message.js.map +1 -0
  318. package/mcp-server/dist/tools/discord-onboarding.d.ts +32 -0
  319. package/mcp-server/dist/tools/discord-onboarding.d.ts.map +1 -0
  320. package/mcp-server/dist/tools/discord-onboarding.js +179 -0
  321. package/mcp-server/dist/tools/discord-onboarding.js.map +1 -0
  322. package/mcp-server/dist/tools/discord-role.d.ts +34 -0
  323. package/mcp-server/dist/tools/discord-role.d.ts.map +1 -0
  324. package/mcp-server/dist/tools/discord-role.js +178 -0
  325. package/mcp-server/dist/tools/discord-role.js.map +1 -0
  326. package/mcp-server/dist/tools/discord-thread.d.ts +28 -0
  327. package/mcp-server/dist/tools/discord-thread.d.ts.map +1 -0
  328. package/mcp-server/dist/tools/discord-thread.js +88 -0
  329. package/mcp-server/dist/tools/discord-thread.js.map +1 -0
  330. package/mcp-server/dist/tools/discord-webhook.d.ts +32 -0
  331. package/mcp-server/dist/tools/discord-webhook.d.ts.map +1 -0
  332. package/mcp-server/dist/tools/discord-webhook.js +154 -0
  333. package/mcp-server/dist/tools/discord-webhook.js.map +1 -0
  334. package/mcp-server/dist/tools/discord.d.ts +7 -0
  335. package/mcp-server/dist/tools/discord.d.ts.map +1 -0
  336. package/mcp-server/dist/tools/discord.js +25 -0
  337. package/mcp-server/dist/tools/discord.js.map +1 -0
  338. package/mcp-server/dist/tools/fb-groups.d.ts +98 -0
  339. package/mcp-server/dist/tools/fb-groups.d.ts.map +1 -0
  340. package/mcp-server/dist/tools/fb-groups.js +369 -0
  341. package/mcp-server/dist/tools/fb-groups.js.map +1 -0
  342. package/mcp-server/dist/tools/forget.d.ts +14 -0
  343. package/mcp-server/dist/tools/forget.d.ts.map +1 -0
  344. package/mcp-server/dist/tools/forget.js +26 -0
  345. package/mcp-server/dist/tools/forget.js.map +1 -0
  346. package/mcp-server/dist/tools/git-tools.d.ts +24 -0
  347. package/mcp-server/dist/tools/git-tools.d.ts.map +1 -0
  348. package/mcp-server/dist/tools/git-tools.js +107 -0
  349. package/mcp-server/dist/tools/git-tools.js.map +1 -0
  350. package/mcp-server/dist/tools/git.d.ts +7 -0
  351. package/mcp-server/dist/tools/git.d.ts.map +1 -0
  352. package/mcp-server/dist/tools/git.js +11 -0
  353. package/mcp-server/dist/tools/git.js.map +1 -0
  354. package/mcp-server/dist/tools/gsc/experience.d.ts +135 -0
  355. package/mcp-server/dist/tools/gsc/experience.d.ts.map +1 -0
  356. package/mcp-server/dist/tools/gsc/experience.js +351 -0
  357. package/mcp-server/dist/tools/gsc/experience.js.map +1 -0
  358. package/mcp-server/dist/tools/gsc/helpers.d.ts +78 -0
  359. package/mcp-server/dist/tools/gsc/helpers.d.ts.map +1 -0
  360. package/mcp-server/dist/tools/gsc/helpers.js +258 -0
  361. package/mcp-server/dist/tools/gsc/helpers.js.map +1 -0
  362. package/mcp-server/dist/tools/gsc/indexing.d.ts +121 -0
  363. package/mcp-server/dist/tools/gsc/indexing.d.ts.map +1 -0
  364. package/mcp-server/dist/tools/gsc/indexing.js +357 -0
  365. package/mcp-server/dist/tools/gsc/indexing.js.map +1 -0
  366. package/mcp-server/dist/tools/gsc/inspect.d.ts +78 -0
  367. package/mcp-server/dist/tools/gsc/inspect.d.ts.map +1 -0
  368. package/mcp-server/dist/tools/gsc/inspect.js +321 -0
  369. package/mcp-server/dist/tools/gsc/inspect.js.map +1 -0
  370. package/mcp-server/dist/tools/gsc/navigate.d.ts +44 -0
  371. package/mcp-server/dist/tools/gsc/navigate.d.ts.map +1 -0
  372. package/mcp-server/dist/tools/gsc/navigate.js +197 -0
  373. package/mcp-server/dist/tools/gsc/navigate.js.map +1 -0
  374. package/mcp-server/dist/tools/gsc/performance.d.ts +84 -0
  375. package/mcp-server/dist/tools/gsc/performance.d.ts.map +1 -0
  376. package/mcp-server/dist/tools/gsc/performance.js +274 -0
  377. package/mcp-server/dist/tools/gsc/performance.js.map +1 -0
  378. package/mcp-server/dist/tools/gsc/settings.d.ts +153 -0
  379. package/mcp-server/dist/tools/gsc/settings.d.ts.map +1 -0
  380. package/mcp-server/dist/tools/gsc/settings.js +425 -0
  381. package/mcp-server/dist/tools/gsc/settings.js.map +1 -0
  382. package/mcp-server/dist/tools/gsc.d.ts +7 -0
  383. package/mcp-server/dist/tools/gsc.d.ts.map +1 -0
  384. package/mcp-server/dist/tools/gsc.js +51 -0
  385. package/mcp-server/dist/tools/gsc.js.map +1 -0
  386. package/mcp-server/dist/tools/image-tools.d.ts +24 -0
  387. package/mcp-server/dist/tools/image-tools.d.ts.map +1 -0
  388. package/mcp-server/dist/tools/image-tools.js +80 -0
  389. package/mcp-server/dist/tools/image-tools.js.map +1 -0
  390. package/mcp-server/dist/tools/image.d.ts +10 -0
  391. package/mcp-server/dist/tools/image.d.ts.map +1 -0
  392. package/mcp-server/dist/tools/image.js +14 -0
  393. package/mcp-server/dist/tools/image.js.map +1 -0
  394. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +97 -0
  395. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +1 -0
  396. package/mcp-server/dist/tools/leonardo-browser-tools.js +228 -0
  397. package/mcp-server/dist/tools/leonardo-browser-tools.js.map +1 -0
  398. package/mcp-server/dist/tools/leonardo.d.ts +13 -0
  399. package/mcp-server/dist/tools/leonardo.d.ts.map +1 -0
  400. package/mcp-server/dist/tools/leonardo.js +21 -0
  401. package/mcp-server/dist/tools/leonardo.js.map +1 -0
  402. package/mcp-server/dist/tools/loop.d.ts +30 -0
  403. package/mcp-server/dist/tools/loop.d.ts.map +1 -0
  404. package/mcp-server/dist/tools/loop.js +401 -0
  405. package/mcp-server/dist/tools/loop.js.map +1 -0
  406. package/mcp-server/dist/tools/memories.d.ts +56 -0
  407. package/mcp-server/dist/tools/memories.d.ts.map +1 -0
  408. package/mcp-server/dist/tools/memories.js +171 -0
  409. package/mcp-server/dist/tools/memories.js.map +1 -0
  410. package/mcp-server/dist/tools/morelogin.d.ts +24 -0
  411. package/mcp-server/dist/tools/morelogin.d.ts.map +1 -0
  412. package/mcp-server/dist/tools/morelogin.js +79 -0
  413. package/mcp-server/dist/tools/morelogin.js.map +1 -0
  414. package/mcp-server/dist/tools/profile.d.ts +17 -0
  415. package/mcp-server/dist/tools/profile.d.ts.map +1 -0
  416. package/mcp-server/dist/tools/profile.js +114 -0
  417. package/mcp-server/dist/tools/profile.js.map +1 -0
  418. package/mcp-server/dist/tools/recall.d.ts +71 -0
  419. package/mcp-server/dist/tools/recall.d.ts.map +1 -0
  420. package/mcp-server/dist/tools/recall.js +147 -0
  421. package/mcp-server/dist/tools/recall.js.map +1 -0
  422. package/mcp-server/dist/tools/reflect.d.ts +56 -0
  423. package/mcp-server/dist/tools/reflect.d.ts.map +1 -0
  424. package/mcp-server/dist/tools/reflect.js +157 -0
  425. package/mcp-server/dist/tools/reflect.js.map +1 -0
  426. package/mcp-server/dist/tools/remember.d.ts +62 -0
  427. package/mcp-server/dist/tools/remember.d.ts.map +1 -0
  428. package/mcp-server/dist/tools/remember.js +201 -0
  429. package/mcp-server/dist/tools/remember.js.map +1 -0
  430. package/mcp-server/dist/tools/response.d.ts +23 -0
  431. package/mcp-server/dist/tools/response.d.ts.map +1 -0
  432. package/mcp-server/dist/tools/response.js +24 -0
  433. package/mcp-server/dist/tools/response.js.map +1 -0
  434. package/mcp-server/dist/tools/restore.d.ts +14 -0
  435. package/mcp-server/dist/tools/restore.d.ts.map +1 -0
  436. package/mcp-server/dist/tools/restore.js +23 -0
  437. package/mcp-server/dist/tools/restore.js.map +1 -0
  438. package/mcp-server/dist/tools/style-guide-tools.d.ts +51 -0
  439. package/mcp-server/dist/tools/style-guide-tools.d.ts.map +1 -0
  440. package/mcp-server/dist/tools/style-guide-tools.js +231 -0
  441. package/mcp-server/dist/tools/style-guide-tools.js.map +1 -0
  442. package/mcp-server/dist/tools/style-guide.d.ts +8 -0
  443. package/mcp-server/dist/tools/style-guide.d.ts.map +1 -0
  444. package/mcp-server/dist/tools/style-guide.js +12 -0
  445. package/mcp-server/dist/tools/style-guide.js.map +1 -0
  446. package/mcp-server/dist/tools/sync.d.ts +20 -0
  447. package/mcp-server/dist/tools/sync.d.ts.map +1 -0
  448. package/mcp-server/dist/tools/sync.js +156 -0
  449. package/mcp-server/dist/tools/sync.js.map +1 -0
  450. package/mcp-server/dist/tools/tictactoe-tools.d.ts +18 -0
  451. package/mcp-server/dist/tools/tictactoe-tools.d.ts.map +1 -0
  452. package/mcp-server/dist/tools/tictactoe-tools.js +78 -0
  453. package/mcp-server/dist/tools/tictactoe-tools.js.map +1 -0
  454. package/mcp-server/dist/tools/tictactoe.d.ts +7 -0
  455. package/mcp-server/dist/tools/tictactoe.d.ts.map +1 -0
  456. package/mcp-server/dist/tools/tictactoe.js +11 -0
  457. package/mcp-server/dist/tools/tictactoe.js.map +1 -0
  458. package/mcp-server/dist/tools/utils.d.ts +19 -0
  459. package/mcp-server/dist/tools/utils.d.ts.map +1 -0
  460. package/mcp-server/dist/tools/utils.js +54 -0
  461. package/mcp-server/dist/tools/utils.js.map +1 -0
  462. package/mcp-server/dist/tools/whiteboard-format.d.ts +88 -0
  463. package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -0
  464. package/mcp-server/dist/tools/whiteboard-format.js +337 -0
  465. package/mcp-server/dist/tools/whiteboard-format.js.map +1 -0
  466. package/mcp-server/dist/tools/whiteboard-tools.d.ts +326 -0
  467. package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -0
  468. package/mcp-server/dist/tools/whiteboard-tools.js +222 -0
  469. package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -0
  470. package/mcp-server/dist/tools/whiteboard.d.ts +8 -0
  471. package/mcp-server/dist/tools/whiteboard.d.ts.map +1 -0
  472. package/mcp-server/dist/tools/whiteboard.js +16 -0
  473. package/mcp-server/dist/tools/whiteboard.js.map +1 -0
  474. package/mcp-server/dist/tools/youtube/analytics.d.ts +46 -0
  475. package/mcp-server/dist/tools/youtube/analytics.d.ts.map +1 -0
  476. package/mcp-server/dist/tools/youtube/analytics.js +83 -0
  477. package/mcp-server/dist/tools/youtube/analytics.js.map +1 -0
  478. package/mcp-server/dist/tools/youtube/dedup.d.ts +35 -0
  479. package/mcp-server/dist/tools/youtube/dedup.d.ts.map +1 -0
  480. package/mcp-server/dist/tools/youtube/dedup.js +56 -0
  481. package/mcp-server/dist/tools/youtube/dedup.js.map +1 -0
  482. package/mcp-server/dist/tools/youtube/download.d.ts +31 -0
  483. package/mcp-server/dist/tools/youtube/download.d.ts.map +1 -0
  484. package/mcp-server/dist/tools/youtube/download.js +30 -0
  485. package/mcp-server/dist/tools/youtube/download.js.map +1 -0
  486. package/mcp-server/dist/tools/youtube/helpers.d.ts +66 -0
  487. package/mcp-server/dist/tools/youtube/helpers.d.ts.map +1 -0
  488. package/mcp-server/dist/tools/youtube/helpers.js +143 -0
  489. package/mcp-server/dist/tools/youtube/helpers.js.map +1 -0
  490. package/mcp-server/dist/tools/youtube/media.d.ts +43 -0
  491. package/mcp-server/dist/tools/youtube/media.d.ts.map +1 -0
  492. package/mcp-server/dist/tools/youtube/media.js +97 -0
  493. package/mcp-server/dist/tools/youtube/media.js.map +1 -0
  494. package/mcp-server/dist/tools/youtube/metadata.d.ts +33 -0
  495. package/mcp-server/dist/tools/youtube/metadata.d.ts.map +1 -0
  496. package/mcp-server/dist/tools/youtube/metadata.js +106 -0
  497. package/mcp-server/dist/tools/youtube/metadata.js.map +1 -0
  498. package/mcp-server/dist/tools/youtube/navigate.d.ts +30 -0
  499. package/mcp-server/dist/tools/youtube/navigate.d.ts.map +1 -0
  500. package/mcp-server/dist/tools/youtube/navigate.js +71 -0
  501. package/mcp-server/dist/tools/youtube/navigate.js.map +1 -0
  502. package/mcp-server/dist/tools/youtube/playlist.d.ts +29 -0
  503. package/mcp-server/dist/tools/youtube/playlist.d.ts.map +1 -0
  504. package/mcp-server/dist/tools/youtube/playlist.js +128 -0
  505. package/mcp-server/dist/tools/youtube/playlist.js.map +1 -0
  506. package/mcp-server/dist/tools/youtube/schedule.d.ts +31 -0
  507. package/mcp-server/dist/tools/youtube/schedule.d.ts.map +1 -0
  508. package/mcp-server/dist/tools/youtube/schedule.js +147 -0
  509. package/mcp-server/dist/tools/youtube/schedule.js.map +1 -0
  510. package/mcp-server/dist/tools/youtube/source.d.ts +36 -0
  511. package/mcp-server/dist/tools/youtube/source.d.ts.map +1 -0
  512. package/mcp-server/dist/tools/youtube/source.js +85 -0
  513. package/mcp-server/dist/tools/youtube/source.js.map +1 -0
  514. package/mcp-server/dist/tools/youtube/upload.d.ts +53 -0
  515. package/mcp-server/dist/tools/youtube/upload.d.ts.map +1 -0
  516. package/mcp-server/dist/tools/youtube/upload.js +255 -0
  517. package/mcp-server/dist/tools/youtube/upload.js.map +1 -0
  518. package/mcp-server/dist/tools/youtube.d.ts +12 -0
  519. package/mcp-server/dist/tools/youtube.d.ts.map +1 -0
  520. package/mcp-server/dist/tools/youtube.js +38 -0
  521. package/mcp-server/dist/tools/youtube.js.map +1 -0
  522. package/mcp-server/dist/tui.d.ts +3 -0
  523. package/mcp-server/dist/tui.d.ts.map +1 -0
  524. package/mcp-server/dist/tui.js +806 -0
  525. package/mcp-server/dist/tui.js.map +1 -0
  526. package/mcp-server/dist/types.d.ts +77 -0
  527. package/mcp-server/dist/types.d.ts.map +1 -0
  528. package/mcp-server/dist/types.js +2 -0
  529. package/mcp-server/dist/types.js.map +1 -0
  530. package/mcp-server/package-lock.json +4798 -0
  531. package/mcp-server/package.json +55 -38
  532. package/mcp-server/run.mjs +12 -2
  533. package/mcp-server/src/config.ts +48 -3
  534. package/mcp-server/src/http.ts +296 -93
  535. package/mcp-server/src/index.ts +546 -203
  536. package/mcp-server/src/preload-http.ts +19 -18
  537. package/mcp-server/src/preload.ts +19 -18
  538. package/mcp-server/src/scripts/setup-embeddings.ts +9 -0
  539. package/mcp-server/src/services/assistant-judgments.ts +157 -0
  540. package/mcp-server/src/services/browser-assist-gate.ts +383 -0
  541. package/mcp-server/src/services/browser-assist.ts +267 -0
  542. package/mcp-server/src/services/browser-bench.ts +477 -0
  543. package/mcp-server/src/services/browser-judgments.ts +414 -0
  544. package/mcp-server/src/services/browser-risk.ts +484 -0
  545. package/mcp-server/src/services/categories.ts +36 -19
  546. package/mcp-server/src/services/codex-config-heal.ts +403 -0
  547. package/mcp-server/src/services/desktop-assist-gate.ts +251 -0
  548. package/mcp-server/src/services/desktop-assist.ts +308 -0
  549. package/mcp-server/src/services/desktop-bench.ts +372 -0
  550. package/mcp-server/src/services/desktop-client.ts +76 -0
  551. package/mcp-server/src/services/desktop-judgments.ts +218 -0
  552. package/mcp-server/src/services/desktop-risk.ts +743 -0
  553. package/mcp-server/src/services/edit-stale.ts +299 -0
  554. package/mcp-server/src/services/embedding-service.ts +108 -0
  555. package/mcp-server/src/services/embedding-worker.ts +46 -0
  556. package/mcp-server/src/services/fb-regions.ts +221 -0
  557. package/mcp-server/src/services/file-checksums.ts +26 -9
  558. package/mcp-server/src/services/file-excerpt.ts +59 -0
  559. package/mcp-server/src/services/identity.ts +291 -0
  560. package/mcp-server/src/services/local-embeddings.ts +2 -77
  561. package/mcp-server/src/services/memory-client.ts +23 -0
  562. package/mcp-server/src/services/memory-judge-backfill.ts +462 -0
  563. package/mcp-server/src/services/memory-judgments.ts +901 -0
  564. package/mcp-server/src/services/memory-maintenance.ts +360 -0
  565. package/mcp-server/src/services/memory-retrieval.ts +349 -0
  566. package/mcp-server/src/services/memory-schema.ts +280 -0
  567. package/mcp-server/src/services/memory-sessions.ts +87 -0
  568. package/mcp-server/src/services/memory-triage.ts +182 -0
  569. package/mcp-server/src/services/memory-verification.ts +68 -0
  570. package/mcp-server/src/services/memory-writer.ts +125 -0
  571. package/mcp-server/src/services/neural-interface.ts +1217 -73
  572. package/mcp-server/src/services/profiles.ts +428 -0
  573. package/mcp-server/src/services/secret-gate.ts +52 -0
  574. package/mcp-server/src/services/server-instructions.ts +122 -0
  575. package/mcp-server/src/services/sqlite.ts +1456 -823
  576. package/mcp-server/src/services/typesafe-bench.ts +247 -0
  577. package/mcp-server/src/services/typesafe-config.ts +790 -0
  578. package/mcp-server/src/services/typesafe.ts +390 -0
  579. package/mcp-server/src/services/vector-cache.ts +255 -0
  580. package/mcp-server/src/services/whiteboard-geometry.ts +711 -0
  581. package/mcp-server/src/tools/agents.ts +539 -0
  582. package/mcp-server/src/tools/bluesky.ts +1186 -0
  583. package/mcp-server/src/tools/browser-advanced.ts +15 -6
  584. package/mcp-server/src/tools/browser-batch.ts +178 -0
  585. package/mcp-server/src/tools/browser-cheatsheet.ts +155 -0
  586. package/mcp-server/src/tools/browser-interact.ts +362 -255
  587. package/mcp-server/src/tools/browser-navigate.ts +164 -77
  588. package/mcp-server/src/tools/browser-observe.ts +2222 -1330
  589. package/mcp-server/src/tools/browser.ts +181 -107
  590. package/mcp-server/src/tools/card.ts +7 -5
  591. package/mcp-server/src/tools/choice.ts +103 -0
  592. package/mcp-server/src/tools/computer.ts +190 -0
  593. package/mcp-server/src/tools/discord.ts +10 -23
  594. package/mcp-server/src/tools/fb-groups.ts +387 -0
  595. package/mcp-server/src/tools/forget.ts +1 -1
  596. package/mcp-server/src/tools/git.ts +3 -1
  597. package/mcp-server/src/tools/gsc/experience.ts +440 -0
  598. package/mcp-server/src/tools/gsc/helpers.ts +288 -0
  599. package/mcp-server/src/tools/gsc/indexing.ts +495 -0
  600. package/mcp-server/src/tools/gsc/inspect.ts +391 -0
  601. package/mcp-server/src/tools/gsc/navigate.ts +236 -0
  602. package/mcp-server/src/tools/gsc/performance.ts +352 -0
  603. package/mcp-server/src/tools/gsc/settings.ts +564 -0
  604. package/mcp-server/src/tools/gsc.ts +95 -0
  605. package/mcp-server/src/tools/image.ts +3 -1
  606. package/mcp-server/src/tools/leonardo-browser-tools.ts +47 -37
  607. package/mcp-server/src/tools/leonardo.ts +7 -5
  608. package/mcp-server/src/tools/loop.ts +118 -25
  609. package/mcp-server/src/tools/memories.ts +65 -5
  610. package/mcp-server/src/tools/morelogin.ts +81 -0
  611. package/mcp-server/src/tools/profile.ts +122 -0
  612. package/mcp-server/src/tools/recall.ts +105 -261
  613. package/mcp-server/src/tools/reflect.ts +171 -145
  614. package/mcp-server/src/tools/remember.ts +223 -115
  615. package/mcp-server/src/tools/style-guide-tools.ts +250 -0
  616. package/mcp-server/src/tools/style-guide.ts +16 -0
  617. package/mcp-server/src/tools/sync.ts +66 -9
  618. package/mcp-server/src/tools/tictactoe.ts +3 -1
  619. package/mcp-server/src/tools/utils.ts +22 -0
  620. package/mcp-server/src/tools/whiteboard-format.ts +394 -0
  621. package/mcp-server/src/tools/whiteboard-tools.ts +191 -183
  622. package/mcp-server/src/tools/whiteboard.ts +7 -5
  623. package/mcp-server/src/tools/youtube/analytics.ts +106 -0
  624. package/mcp-server/src/tools/youtube/dedup.ts +57 -0
  625. package/mcp-server/src/tools/youtube/download.ts +41 -0
  626. package/mcp-server/src/tools/youtube/helpers.ts +183 -0
  627. package/mcp-server/src/tools/youtube/media.ts +109 -0
  628. package/mcp-server/src/tools/youtube/metadata.ts +112 -0
  629. package/mcp-server/src/tools/youtube/navigate.ts +81 -0
  630. package/mcp-server/src/tools/youtube/playlist.ts +134 -0
  631. package/mcp-server/src/tools/youtube/schedule.ts +158 -0
  632. package/mcp-server/src/tools/youtube/source.ts +101 -0
  633. package/mcp-server/src/tools/youtube/upload.ts +296 -0
  634. package/mcp-server/src/tools/youtube.ts +47 -0
  635. package/mcp-server/src/tui.ts +8 -9
  636. package/neural-interface/games/TicTacToe/1.svg +1 -0
  637. package/neural-interface/games/TicTacToe/2.svg +1 -0
  638. package/neural-interface/games/TicTacToe/3.svg +1 -0
  639. package/neural-interface/games/TicTacToe/4.svg +1 -0
  640. package/neural-interface/games/TicTacToe/5.svg +1 -0
  641. package/neural-interface/games/TicTacToe/6.svg +1 -0
  642. package/neural-interface/games/TicTacToe/7.svg +1 -0
  643. package/neural-interface/games/TicTacToe/8.svg +1 -0
  644. package/neural-interface/games/TicTacToe/9.svg +1 -0
  645. package/neural-interface/games/TicTacToe/Board.svg +1 -0
  646. package/neural-interface/games/TicTacToe/Circle.svg +1 -0
  647. package/neural-interface/games/TicTacToe/Cross.svg +1 -0
  648. package/neural-interface/i18n/en.json +7022 -0
  649. package/neural-interface/i18n/pt-BR.json +7026 -0
  650. package/neural-interface/lib/assistant-api.js +1005 -0
  651. package/neural-interface/lib/assistant-attachments.js +121 -0
  652. package/neural-interface/lib/assistant-brains/claude.js +207 -0
  653. package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +43 -0
  654. package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +56 -0
  655. package/neural-interface/lib/assistant-brains/codex.js +213 -0
  656. package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +47 -0
  657. package/neural-interface/lib/assistant-brains/opencode-route-gate.js +62 -0
  658. package/neural-interface/lib/assistant-brains/opencode.js +320 -0
  659. package/neural-interface/lib/assistant-budget.js +318 -0
  660. package/neural-interface/lib/assistant-catalog.js +731 -0
  661. package/neural-interface/lib/assistant-clarify.js +664 -0
  662. package/neural-interface/lib/assistant-config.js +232 -0
  663. package/neural-interface/lib/assistant-dispatch.js +2744 -0
  664. package/neural-interface/lib/assistant-envelope.js +582 -0
  665. package/neural-interface/lib/assistant-evidence.js +236 -0
  666. package/neural-interface/lib/assistant-hidden-models.js +272 -0
  667. package/neural-interface/lib/assistant-jev.js +117 -0
  668. package/neural-interface/lib/assistant-judgments.js +111 -0
  669. package/neural-interface/lib/assistant-media.js +335 -0
  670. package/neural-interface/lib/assistant-memory.js +398 -0
  671. package/neural-interface/lib/assistant-persona.js +444 -0
  672. package/neural-interface/lib/assistant-plan-permissions.js +448 -0
  673. package/neural-interface/lib/assistant-playbooks/design.md +87 -0
  674. package/neural-interface/lib/assistant-playbooks.js +72 -0
  675. package/neural-interface/lib/assistant-pricing.js +159 -0
  676. package/neural-interface/lib/assistant-route-gate-codex.js +163 -0
  677. package/neural-interface/lib/assistant-route-gate.js +212 -0
  678. package/neural-interface/lib/assistant-router.js +1324 -0
  679. package/neural-interface/lib/assistant-runtime.js +3337 -0
  680. package/neural-interface/lib/assistant-task-prompt.js +472 -0
  681. package/neural-interface/lib/assistant-usage.js +1688 -0
  682. package/neural-interface/lib/augmented-path.js +70 -0
  683. package/neural-interface/lib/automation-storage-migration.js +54 -0
  684. package/neural-interface/lib/backup-service.js +851 -0
  685. package/neural-interface/lib/backup-zip-reader.js +262 -0
  686. package/neural-interface/lib/browser-assist-api.js +41 -0
  687. package/neural-interface/lib/browser-console.js +176 -0
  688. package/neural-interface/lib/browser-execution.js +241 -0
  689. package/neural-interface/lib/browser-extraction.js +191 -0
  690. package/neural-interface/lib/browser-language.js +83 -0
  691. package/neural-interface/lib/browser-screenshot.js +399 -0
  692. package/neural-interface/lib/browser-semantic-context.js +639 -0
  693. package/neural-interface/lib/browser-snapshots.js +192 -0
  694. package/neural-interface/lib/browser-tab-recovery.js +119 -0
  695. package/neural-interface/lib/browser-targets.js +70 -0
  696. package/neural-interface/lib/browser-tool-policy.js +926 -0
  697. package/neural-interface/lib/claude-accounts.js +230 -0
  698. package/neural-interface/lib/claude-agent-bridge.js +3203 -0
  699. package/neural-interface/lib/claude-bypass-policy.js +99 -0
  700. package/neural-interface/lib/claude-executable.js +241 -0
  701. package/neural-interface/lib/claude-history.js +429 -0
  702. package/neural-interface/lib/claude-model-catalog.js +444 -0
  703. package/neural-interface/lib/claude-panel-requests.js +165 -0
  704. package/neural-interface/lib/claude-panel-session.js +272 -0
  705. package/neural-interface/lib/claude-permission-rules.js +153 -0
  706. package/neural-interface/lib/claude-session-cleanup.js +71 -0
  707. package/neural-interface/lib/claude-session-list.js +82 -0
  708. package/neural-interface/lib/claude-session-ops.js +140 -0
  709. package/neural-interface/lib/claude-settings-view.js +51 -0
  710. package/neural-interface/lib/claude-skin-connect.js +79 -0
  711. package/neural-interface/lib/claude-stall-policy.js +7 -0
  712. package/neural-interface/lib/claude-temporary.js +435 -0
  713. package/neural-interface/lib/cli-update-planner.js +312 -0
  714. package/neural-interface/lib/codex-capabilities.d.ts +41 -0
  715. package/neural-interface/lib/codex-capabilities.js +148 -0
  716. package/neural-interface/lib/codex-collaboration-mode.js +17 -0
  717. package/neural-interface/lib/codex-compat-rpc.js +241 -0
  718. package/neural-interface/lib/codex-mcp-approvals.js +56 -0
  719. package/neural-interface/lib/codex-mcp-apps.js +47 -0
  720. package/neural-interface/lib/codex-model-context.js +202 -0
  721. package/neural-interface/lib/codex-plan-store.js +71 -0
  722. package/neural-interface/lib/codex-request-journal.js +242 -0
  723. package/neural-interface/lib/codex-runtime-path.js +213 -0
  724. package/neural-interface/lib/codex-session-catalog.js +231 -0
  725. package/neural-interface/lib/codex-session-settings.js +46 -0
  726. package/neural-interface/lib/codex-sidepanel-permissions.js +110 -0
  727. package/neural-interface/lib/codex-thread-history.js +165 -0
  728. package/neural-interface/lib/codex-user-verification.js +34 -0
  729. package/neural-interface/lib/codex-writer-lifecycle.js +152 -0
  730. package/neural-interface/lib/confined-fs.js +256 -0
  731. package/neural-interface/lib/db.js +922 -0
  732. package/neural-interface/lib/design-md.js +9 -0
  733. package/neural-interface/lib/desktop/api.js +92 -0
  734. package/neural-interface/lib/desktop/audit.js +62 -0
  735. package/neural-interface/lib/desktop/build.js +423 -0
  736. package/neural-interface/lib/desktop/config.js +606 -0
  737. package/neural-interface/lib/desktop/coords.js +76 -0
  738. package/neural-interface/lib/desktop/fake-helper.js +1192 -0
  739. package/neural-interface/lib/desktop/frames.js +77 -0
  740. package/neural-interface/lib/desktop/grants.js +84 -0
  741. package/neural-interface/lib/desktop/guards.js +170 -0
  742. package/neural-interface/lib/desktop/helper/SynabunDesktop.swift +3056 -0
  743. package/neural-interface/lib/desktop/lease.js +51 -0
  744. package/neural-interface/lib/desktop/manager.js +545 -0
  745. package/neural-interface/lib/desktop/press-contexts.js +103 -0
  746. package/neural-interface/lib/desktop/protocol.js +495 -0
  747. package/neural-interface/lib/desktop/service.js +1202 -0
  748. package/neural-interface/lib/effort-levels.js +148 -0
  749. package/neural-interface/lib/event-loop-monitor.js +67 -0
  750. package/neural-interface/lib/exec-loop-command.js +209 -0
  751. package/neural-interface/lib/folder-picker.ps1 +77 -0
  752. package/neural-interface/lib/http-guards.js +287 -0
  753. package/neural-interface/lib/jsonl-lines.js +94 -0
  754. package/neural-interface/lib/loop-logger.js +127 -0
  755. package/neural-interface/lib/mcp-client-config.js +133 -0
  756. package/neural-interface/lib/mcp-installer.js +487 -0
  757. package/neural-interface/lib/mcp-profile-refresh-coordinator.js +78 -0
  758. package/neural-interface/lib/mcp-profile-servers.js +120 -0
  759. package/neural-interface/lib/memo-cache.js +84 -0
  760. package/neural-interface/lib/memory-api.js +758 -0
  761. package/neural-interface/lib/memory-map-api.js +1150 -0
  762. package/neural-interface/lib/memory-map-layout.js +872 -0
  763. package/neural-interface/lib/memory-map-worker.js +165 -0
  764. package/neural-interface/lib/memory-session-capture.js +81 -0
  765. package/neural-interface/lib/memory-timers.js +62 -0
  766. package/neural-interface/lib/morelogin.js +301 -0
  767. package/neural-interface/lib/native-binary-runtime.js +382 -0
  768. package/neural-interface/lib/native-loop-goal.js +33 -0
  769. package/neural-interface/lib/native-loop-providers.js +1002 -0
  770. package/neural-interface/lib/native-loop-runtime.js +747 -0
  771. package/neural-interface/lib/offline-page.js +54 -0
  772. package/neural-interface/lib/opencode-hidden-models.js +113 -0
  773. package/neural-interface/lib/opencode-history.js +253 -0
  774. package/neural-interface/lib/opencode-runtime-config.js +58 -0
  775. package/neural-interface/lib/opencode-v2-client.js +486 -0
  776. package/neural-interface/lib/opencode-v2-ws-requests.js +955 -0
  777. package/neural-interface/lib/path-confine.js +213 -0
  778. package/neural-interface/lib/plugin-installer.js +264 -0
  779. package/neural-interface/lib/project-storage.js +766 -0
  780. package/neural-interface/lib/pty-host/core.js +603 -0
  781. package/neural-interface/lib/pty-host/flow.js +43 -0
  782. package/neural-interface/lib/pty-host/host.js +47 -0
  783. package/neural-interface/lib/pty-host/manager.js +360 -0
  784. package/neural-interface/lib/pty-host/protocol.js +81 -0
  785. package/neural-interface/lib/pty-host/snapshot.js +133 -0
  786. package/neural-interface/lib/remote-policy.js +582 -0
  787. package/neural-interface/lib/rulesets/api.js +175 -0
  788. package/neural-interface/lib/rulesets/fs-safe.js +245 -0
  789. package/neural-interface/lib/rulesets/installer.js +1453 -0
  790. package/neural-interface/lib/rulesets/json-edit.js +186 -0
  791. package/neural-interface/lib/rulesets/lock.js +170 -0
  792. package/neural-interface/lib/rulesets/managed-text.js +314 -0
  793. package/neural-interface/lib/rulesets/normalise.js +24 -0
  794. package/neural-interface/lib/rulesets/render.js +84 -0
  795. package/neural-interface/lib/schedule-launch-intent.js +40 -0
  796. package/neural-interface/lib/session-cache-builder.js +524 -0
  797. package/neural-interface/lib/session-chunker.js +344 -0
  798. package/neural-interface/lib/session-indexer.js +327 -0
  799. package/neural-interface/lib/session-title-generator.js +232 -0
  800. package/neural-interface/lib/skill-prompt-bridge.js +11 -0
  801. package/neural-interface/lib/style-guide/api.js +375 -0
  802. package/neural-interface/lib/style-guide/color.js +352 -0
  803. package/neural-interface/lib/style-guide/export-css.js +99 -0
  804. package/neural-interface/lib/style-guide/export-dtcg.js +209 -0
  805. package/neural-interface/lib/style-guide/export-tailwind.js +102 -0
  806. package/neural-interface/lib/style-guide/fonts.json +227 -0
  807. package/neural-interface/lib/style-guide/import.js +1268 -0
  808. package/neural-interface/lib/style-guide/pointers.js +103 -0
  809. package/neural-interface/lib/style-guide/presets.js +232 -0
  810. package/neural-interface/lib/style-guide/render-design-md.js +319 -0
  811. package/neural-interface/lib/style-guide/schema.js +848 -0
  812. package/neural-interface/lib/style-guide/security.js +43 -0
  813. package/neural-interface/lib/style-guide/store.js +491 -0
  814. package/neural-interface/lib/style-guide/summary.js +106 -0
  815. package/neural-interface/lib/style-guide/tokens.js +170 -0
  816. package/neural-interface/lib/synabun-update-plan.js +324 -0
  817. package/neural-interface/lib/synabun-version.js +179 -0
  818. package/neural-interface/lib/system-restore.js +99 -0
  819. package/neural-interface/lib/terminal-env.js +86 -0
  820. package/neural-interface/lib/ui-blob-store.js +106 -0
  821. package/neural-interface/lib/vector-cache.js +2 -0
  822. package/neural-interface/lib/virtual-socket.js +60 -0
  823. package/neural-interface/lib/whatsapp/api.js +146 -0
  824. package/neural-interface/lib/whatsapp/auth-store.js +389 -0
  825. package/neural-interface/lib/whatsapp/baileys-adapter.js +457 -0
  826. package/neural-interface/lib/whatsapp/brain.js +128 -0
  827. package/neural-interface/lib/whatsapp/bridge.js +1499 -0
  828. package/neural-interface/lib/whatsapp/cards.js +519 -0
  829. package/neural-interface/lib/whatsapp/commands.js +92 -0
  830. package/neural-interface/lib/whatsapp/config.js +291 -0
  831. package/neural-interface/lib/whatsapp/connector/entry.mjs +25 -0
  832. package/neural-interface/lib/whatsapp/connector/manifest.json +6 -0
  833. package/neural-interface/lib/whatsapp/connector/npm-shrinkwrap.json +717 -0
  834. package/neural-interface/lib/whatsapp/connector/package.json +8 -0
  835. package/neural-interface/lib/whatsapp/fake-baileys.js +444 -0
  836. package/neural-interface/lib/whatsapp/format.js +552 -0
  837. package/neural-interface/lib/whatsapp/host-core.js +1225 -0
  838. package/neural-interface/lib/whatsapp/host.js +119 -0
  839. package/neural-interface/lib/whatsapp/identity.js +288 -0
  840. package/neural-interface/lib/whatsapp/inbound.js +149 -0
  841. package/neural-interface/lib/whatsapp/installer.js +562 -0
  842. package/neural-interface/lib/whatsapp/manager.js +638 -0
  843. package/neural-interface/lib/whatsapp/paths.js +81 -0
  844. package/neural-interface/lib/whatsapp/protocol.js +327 -0
  845. package/neural-interface/lib/whatsapp/qr-svg.js +57 -0
  846. package/neural-interface/lib/whatsapp/redact.js +130 -0
  847. package/neural-interface/lib/whatsapp/service.js +1305 -0
  848. package/neural-interface/lib/whatsapp/vendor/qrcodegen.js +848 -0
  849. package/neural-interface/package-lock.json +4431 -0
  850. package/neural-interface/package.json +58 -27
  851. package/neural-interface/public/apple-touch-icon.png +0 -0
  852. package/neural-interface/public/category-logos/synabun.png +0 -0
  853. package/neural-interface/public/claude.svg +1 -0
  854. package/neural-interface/public/favicon-16x16.png +0 -0
  855. package/neural-interface/public/favicon-32x32.png +0 -0
  856. package/neural-interface/public/icon-192.png +0 -0
  857. package/neural-interface/public/icon-512.png +0 -0
  858. package/neural-interface/public/index.html +32 -182
  859. package/neural-interface/public/index2d.html +2 -2
  860. package/neural-interface/public/install-app.html +31 -0
  861. package/neural-interface/public/logo-synabun.png +0 -0
  862. package/neural-interface/public/logoHD.png +0 -0
  863. package/neural-interface/public/manifest.json +2 -0
  864. package/neural-interface/public/mcp.svg +4 -0
  865. package/neural-interface/public/offline.html +670 -299
  866. package/neural-interface/public/onboarding.html +804 -161
  867. package/neural-interface/public/opencode-logo-dark-square.svg +1 -0
  868. package/neural-interface/public/shared/agent-runtime-options.js +596 -0
  869. package/neural-interface/public/shared/api.js +339 -28
  870. package/neural-interface/public/shared/assistant/asst-accounts.js +318 -0
  871. package/neural-interface/public/shared/assistant/asst-agents-dock.js +296 -0
  872. package/neural-interface/public/shared/assistant/asst-api.js +270 -0
  873. package/neural-interface/public/shared/assistant/asst-brain-picker.js +744 -0
  874. package/neural-interface/public/shared/assistant/asst-budget.js +333 -0
  875. package/neural-interface/public/shared/assistant/asst-composer.js +656 -0
  876. package/neural-interface/public/shared/assistant/asst-computer.js +803 -0
  877. package/neural-interface/public/shared/assistant/asst-control.js +1018 -0
  878. package/neural-interface/public/shared/assistant/asst-hosts.js +262 -0
  879. package/neural-interface/public/shared/assistant/asst-mascot.js +313 -0
  880. package/neural-interface/public/shared/assistant/asst-menu.js +375 -0
  881. package/neural-interface/public/shared/assistant/asst-panel.js +1845 -0
  882. package/neural-interface/public/shared/assistant/asst-rack-styles.js +586 -0
  883. package/neural-interface/public/shared/assistant/asst-render.js +3305 -0
  884. package/neural-interface/public/shared/assistant/asst-route.js +1653 -0
  885. package/neural-interface/public/shared/assistant/asst-roving.js +75 -0
  886. package/neural-interface/public/shared/assistant/asst-sanitize.js +117 -0
  887. package/neural-interface/public/shared/assistant/asst-sidepanel-styles.js +488 -0
  888. package/neural-interface/public/shared/assistant/asst-sidepanel.js +675 -0
  889. package/neural-interface/public/shared/assistant/asst-slash.js +258 -0
  890. package/neural-interface/public/shared/assistant/asst-state.js +727 -0
  891. package/neural-interface/public/shared/assistant/asst-styles.js +1686 -0
  892. package/neural-interface/public/shared/assistant/asst-tool-kinds.js +1017 -0
  893. package/neural-interface/public/shared/assistant/asst-usage.js +444 -0
  894. package/neural-interface/public/shared/assistant/asst-ws.js +175 -0
  895. package/neural-interface/public/shared/automation-context.js +75 -0
  896. package/neural-interface/public/shared/blob-store.js +99 -0
  897. package/neural-interface/public/shared/cdx/cdx-capabilities.js +118 -0
  898. package/neural-interface/public/shared/cdx/cdx-cards.js +37 -0
  899. package/neural-interface/public/shared/cdx/cdx-commands.js +171 -0
  900. package/neural-interface/public/shared/cdx/cdx-context-menu.js +402 -0
  901. package/neural-interface/public/shared/cdx/cdx-context-model.js +220 -0
  902. package/neural-interface/public/shared/cdx/cdx-features.js +408 -0
  903. package/neural-interface/public/shared/cdx/cdx-icons.js +89 -0
  904. package/neural-interface/public/shared/cdx/cdx-mcp-app-host.js +414 -0
  905. package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.html +6 -0
  906. package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.js +56 -0
  907. package/neural-interface/public/shared/cdx/cdx-mcp-app.js +178 -0
  908. package/neural-interface/public/shared/cdx/cdx-model-catalog.js +120 -0
  909. package/neural-interface/public/shared/cdx/cdx-output-model.js +261 -0
  910. package/neural-interface/public/shared/cdx/cdx-output.js +382 -0
  911. package/neural-interface/public/shared/cdx/cdx-panel.js +1372 -0
  912. package/neural-interface/public/shared/cdx/cdx-plan.js +266 -0
  913. package/neural-interface/public/shared/cdx/cdx-protocol.js +682 -0
  914. package/neural-interface/public/shared/cdx/cdx-render.js +3381 -0
  915. package/neural-interface/public/shared/cdx/cdx-requests.js +1136 -0
  916. package/neural-interface/public/shared/cdx/cdx-styles.js +3251 -0
  917. package/neural-interface/public/shared/cdx/cdx-tabs.js +7992 -0
  918. package/neural-interface/public/shared/cdx/cdx-ws.js +363 -0
  919. package/neural-interface/public/shared/cli-status.js +169 -0
  920. package/neural-interface/public/shared/command-runner-model.js +30 -0
  921. package/neural-interface/public/shared/constants.js +22 -5
  922. package/neural-interface/public/shared/cp/cp-agents.js +186 -0
  923. package/neural-interface/public/shared/cp/cp-bash.js +252 -0
  924. package/neural-interface/public/shared/cp/cp-compose.js +159 -0
  925. package/neural-interface/public/shared/cp/cp-context-menu.js +309 -0
  926. package/neural-interface/public/shared/cp/cp-context-model.js +157 -0
  927. package/neural-interface/public/shared/cp/cp-context-window.js +80 -0
  928. package/neural-interface/public/shared/cp/cp-ctx.js +11 -0
  929. package/neural-interface/public/shared/cp/cp-diff.js +255 -0
  930. package/neural-interface/public/shared/cp/cp-event-rows.js +637 -0
  931. package/neural-interface/public/shared/cp/cp-events.js +846 -0
  932. package/neural-interface/public/shared/cp/cp-markdown.js +104 -0
  933. package/neural-interface/public/shared/cp/cp-permission-model.js +905 -0
  934. package/neural-interface/public/shared/cp/cp-permissions.js +626 -0
  935. package/neural-interface/public/shared/cp/cp-rehydrate.js +113 -0
  936. package/neural-interface/public/shared/cp/cp-restore.js +224 -0
  937. package/neural-interface/public/shared/cp/cp-session-model.js +338 -0
  938. package/neural-interface/public/shared/cp/cp-session-settings.js +254 -0
  939. package/neural-interface/public/shared/cp/cp-sessions.js +227 -0
  940. package/neural-interface/public/shared/cp/cp-statusline.js +153 -0
  941. package/neural-interface/public/shared/cp/cp-styles.js +349 -0
  942. package/neural-interface/public/shared/cp/cp-tasks-model.js +282 -0
  943. package/neural-interface/public/shared/cp/cp-tasks.js +107 -0
  944. package/neural-interface/public/shared/cp/cp-temporary-view.js +56 -0
  945. package/neural-interface/public/shared/cp/cp-temporary.js +231 -0
  946. package/neural-interface/public/shared/cp/cp-tool-cards.js +326 -0
  947. package/neural-interface/public/shared/cp/cp-tool-results.js +618 -0
  948. package/neural-interface/public/shared/cp/cp-usage-model.js +124 -0
  949. package/neural-interface/public/shared/graph-activity.js +68 -0
  950. package/neural-interface/public/shared/html-shell.js +116 -17
  951. package/neural-interface/public/shared/i18n.js +132 -34
  952. package/neural-interface/public/shared/node-positions-store.js +44 -0
  953. package/neural-interface/public/shared/ocp-hidden-models.js +116 -0
  954. package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +355 -0
  955. package/neural-interface/public/shared/ocp-v2/ocp-v2-autoaccept-button.js +35 -0
  956. package/neural-interface/public/shared/ocp-v2/ocp-v2-automation-ownership.js +72 -0
  957. package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +280 -0
  958. package/neural-interface/public/shared/ocp-v2/ocp-v2-caps.js +67 -0
  959. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +179 -0
  960. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes.js +164 -0
  961. package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +725 -0
  962. package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +75 -0
  963. package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +1204 -0
  964. package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm-logic.js +117 -0
  965. package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm.js +59 -0
  966. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-gauge.js +252 -0
  967. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +478 -0
  968. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +179 -0
  969. package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +233 -0
  970. package/neural-interface/public/shared/ocp-v2/ocp-v2-icons.js +30 -0
  971. package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +1065 -0
  972. package/neural-interface/public/shared/ocp-v2/ocp-v2-mention-hints.js +182 -0
  973. package/neural-interface/public/shared/ocp-v2/ocp-v2-modelpicker.js +655 -0
  974. package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +2636 -0
  975. package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +601 -0
  976. package/neural-interface/public/shared/ocp-v2/ocp-v2-profile-inheritance.js +78 -0
  977. package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +649 -0
  978. package/neural-interface/public/shared/ocp-v2/ocp-v2-providers.js +35 -0
  979. package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +357 -0
  980. package/neural-interface/public/shared/ocp-v2/ocp-v2-render-logic.js +189 -0
  981. package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +1869 -0
  982. package/neural-interface/public/shared/ocp-v2/ocp-v2-select.js +42 -0
  983. package/neural-interface/public/shared/ocp-v2/ocp-v2-send-logic.js +117 -0
  984. package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +1714 -0
  985. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +468 -0
  986. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-widgets.js +63 -0
  987. package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +366 -0
  988. package/neural-interface/public/shared/ocp-v2/ocp-v2-settings-link.js +19 -0
  989. package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +343 -0
  990. package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +746 -0
  991. package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +347 -0
  992. package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +338 -0
  993. package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +3543 -0
  994. package/neural-interface/public/shared/ocp-v2/ocp-v2-subagents-logic.js +482 -0
  995. package/neural-interface/public/shared/ocp-v2/ocp-v2-tools-logic.js +351 -0
  996. package/neural-interface/public/shared/ocp-v2/ocp-v2-tools.js +168 -0
  997. package/neural-interface/public/shared/ocp-v2/ocp-v2-variantpicker.js +315 -0
  998. package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +545 -0
  999. package/neural-interface/public/shared/provider-icons.js +30 -0
  1000. package/neural-interface/public/shared/pwa-install-page.js +34 -0
  1001. package/neural-interface/public/shared/pwa-install.css +12 -0
  1002. package/neural-interface/public/shared/pwa-install.js +28 -0
  1003. package/neural-interface/public/shared/session-title.js +100 -0
  1004. package/neural-interface/public/shared/settings/settings-ia.js +389 -0
  1005. package/neural-interface/public/shared/settings/settings-kit.js +234 -0
  1006. package/neural-interface/public/shared/settings/settings-rules.js +160 -0
  1007. package/neural-interface/public/shared/settings/settings-search.js +463 -0
  1008. package/neural-interface/public/shared/settings/settings-shell.js +570 -0
  1009. package/neural-interface/public/shared/start-bridge.js +583 -0
  1010. package/neural-interface/public/shared/state.js +5 -0
  1011. package/neural-interface/public/shared/storage.js +50 -7
  1012. package/neural-interface/public/shared/styleguide/sg-agents.js +42 -0
  1013. package/neural-interface/public/shared/styleguide/sg-brand.js +4 -0
  1014. package/neural-interface/public/shared/styleguide/sg-color-client.js +388 -0
  1015. package/neural-interface/public/shared/styleguide/sg-colors.js +151 -0
  1016. package/neural-interface/public/shared/styleguide/sg-components.js +35 -0
  1017. package/neural-interface/public/shared/styleguide/sg-history.js +41 -0
  1018. package/neural-interface/public/shared/styleguide/sg-icons-logo.js +38 -0
  1019. package/neural-interface/public/shared/styleguide/sg-imagery.js +4 -0
  1020. package/neural-interface/public/shared/styleguide/sg-import-export.js +48 -0
  1021. package/neural-interface/public/shared/styleguide/sg-kit.js +284 -0
  1022. package/neural-interface/public/shared/styleguide/sg-labels.js +318 -0
  1023. package/neural-interface/public/shared/styleguide/sg-layout.js +4 -0
  1024. package/neural-interface/public/shared/styleguide/sg-motion.js +5 -0
  1025. package/neural-interface/public/shared/styleguide/sg-panel.js +237 -0
  1026. package/neural-interface/public/shared/styleguide/sg-preview.js +138 -0
  1027. package/neural-interface/public/shared/styleguide/sg-rules.js +9 -0
  1028. package/neural-interface/public/shared/styleguide/sg-shape.js +24 -0
  1029. package/neural-interface/public/shared/styleguide/sg-state.js +132 -0
  1030. package/neural-interface/public/shared/styleguide/sg-typography.js +125 -0
  1031. package/neural-interface/public/shared/styles.css +8614 -1477
  1032. package/neural-interface/public/shared/synabun-mascot.js +1625 -0
  1033. package/neural-interface/public/shared/synabun-ticker.js +376 -0
  1034. package/neural-interface/public/shared/term-ready.js +307 -0
  1035. package/neural-interface/public/shared/term-renderer.js +343 -0
  1036. package/neural-interface/public/shared/ui-assistant-panel.js +10 -0
  1037. package/neural-interface/public/shared/ui-assistant.js +77 -0
  1038. package/neural-interface/public/shared/ui-automation-studio.js +5105 -3573
  1039. package/neural-interface/public/shared/ui-claude-panel.js +11685 -6333
  1040. package/neural-interface/public/shared/ui-codex-panel.js +12 -0
  1041. package/neural-interface/public/shared/ui-command-runner.js +251 -468
  1042. package/neural-interface/public/shared/ui-cost-widget.js +55 -34
  1043. package/neural-interface/public/shared/ui-detail.js +77 -14
  1044. package/neural-interface/public/shared/ui-explorer.js +360 -181
  1045. package/neural-interface/public/shared/ui-file-explorer.js +485 -107
  1046. package/neural-interface/public/shared/ui-help.js +2 -2
  1047. package/neural-interface/public/shared/ui-image-gallery.js +45 -21
  1048. package/neural-interface/public/shared/ui-judgments.js +1346 -0
  1049. package/neural-interface/public/shared/ui-keybinds.js +3 -2
  1050. package/neural-interface/public/shared/ui-link.js +105 -51
  1051. package/neural-interface/public/shared/ui-loading.js +222 -11
  1052. package/neural-interface/public/shared/ui-memory-maintenance.js +111 -0
  1053. package/neural-interface/public/shared/ui-menubar.js +100 -31
  1054. package/neural-interface/public/shared/ui-native-loop-router-state.js +94 -0
  1055. package/neural-interface/public/shared/ui-native-loop-router.js +493 -0
  1056. package/neural-interface/public/shared/ui-native-window-id.js +7 -0
  1057. package/neural-interface/public/shared/ui-navbar.js +357 -222
  1058. package/neural-interface/public/shared/ui-notifications.js +58 -12
  1059. package/neural-interface/public/shared/ui-opencode-panel-v2.js +17 -0
  1060. package/neural-interface/public/shared/ui-panels.js +15 -7
  1061. package/neural-interface/public/shared/ui-resume.js +823 -653
  1062. package/neural-interface/public/shared/ui-schedule-queue.js +172 -0
  1063. package/neural-interface/public/shared/ui-schedules-studio.js +1882 -0
  1064. package/neural-interface/public/shared/ui-scroll-follow.js +194 -0
  1065. package/neural-interface/public/shared/ui-sessions.js +789 -34
  1066. package/neural-interface/public/shared/ui-settings.js +5774 -2194
  1067. package/neural-interface/public/shared/ui-sidepanel-layout.js +109 -0
  1068. package/neural-interface/public/shared/ui-sidepanel-runtime.js +19 -0
  1069. package/neural-interface/public/shared/ui-sidepanel-session-entry.js +40 -0
  1070. package/neural-interface/public/shared/ui-sidepanel-sessions.js +221 -0
  1071. package/neural-interface/public/shared/ui-sidepanel-state.js +131 -0
  1072. package/neural-interface/public/shared/ui-sidepanel-tray.js +547 -0
  1073. package/neural-interface/public/shared/ui-sidepanel-windows.js +387 -0
  1074. package/neural-interface/public/shared/ui-skills.js +18 -32
  1075. package/neural-interface/public/shared/ui-styleguide.js +35 -0
  1076. package/neural-interface/public/shared/ui-sync.js +87 -0
  1077. package/neural-interface/public/shared/ui-terminal.js +7863 -6385
  1078. package/neural-interface/public/shared/ui-tool-updates.js +292 -0
  1079. package/neural-interface/public/shared/ui-tooltip.js +156 -15
  1080. package/neural-interface/public/shared/ui-tutorial-draw.js +119 -683
  1081. package/neural-interface/public/shared/ui-tutorial-layout.js +135 -0
  1082. package/neural-interface/public/shared/ui-tutorial-steps.js +59 -2209
  1083. package/neural-interface/public/shared/ui-tutorial.css +102 -0
  1084. package/neural-interface/public/shared/ui-tutorial.js +557 -1076
  1085. package/neural-interface/public/shared/ui-update.js +420 -68
  1086. package/neural-interface/public/shared/ui-whatsapp.js +941 -0
  1087. package/neural-interface/public/shared/ui-whiteboard.js +1076 -233
  1088. package/neural-interface/public/shared/ui-workspaces.js +2 -1
  1089. package/neural-interface/public/shared/utils.js +58 -0
  1090. package/neural-interface/public/shared/vterm-buffer.js +15 -5
  1091. package/neural-interface/public/shared/whatsapp/wa-phone.js +65 -0
  1092. package/neural-interface/public/shared/whatsapp/wa-view.js +411 -0
  1093. package/neural-interface/public/sidepanel-session.html +18 -0
  1094. package/neural-interface/public/sw.js +10 -2
  1095. package/neural-interface/public/synabun.png +0 -0
  1096. package/neural-interface/public/variant/2d/graph.js +1707 -1635
  1097. package/neural-interface/public/variant/2d/lasso.js +2 -1
  1098. package/neural-interface/public/variant/2d/layout.js +595 -594
  1099. package/neural-interface/public/variant/2d/main.js +557 -521
  1100. package/neural-interface/public/variant/2d/settings-gfx.js +18 -24
  1101. package/neural-interface/public/variant/3d/main.js +517 -500
  1102. package/neural-interface/public/variant/3d/map-controls.js +144 -0
  1103. package/neural-interface/public/variant/3d/map-data.js +251 -0
  1104. package/neural-interface/public/variant/3d/map-labels.js +241 -0
  1105. package/neural-interface/public/variant/3d/map-pick.js +90 -0
  1106. package/neural-interface/public/variant/3d/map-renderer.js +521 -0
  1107. package/neural-interface/public/variant/3d/map-shaders.js +158 -0
  1108. package/neural-interface/public/variant/3d/map-view.js +618 -0
  1109. package/neural-interface/public/vendor/three/manifest.json +3 -0
  1110. package/neural-interface/public/vendor/three/three-0.169.0.min.js +3844 -0
  1111. package/neural-interface/public/vendor/xterm/manifest.json +3 -0
  1112. package/neural-interface/public/vendor/xterm/xterm-6.0.0.css +285 -0
  1113. package/neural-interface/public/vendor/xterm/xterm-6.0.0.min.js +192 -0
  1114. package/neural-interface/scripts/build-vendor.mjs +64 -0
  1115. package/neural-interface/scripts/codex-protocol-fixture.mjs +83 -0
  1116. package/neural-interface/scripts/rebuild-pty.js +39 -22
  1117. package/neural-interface/scripts/vendor-three-entry.js +24 -0
  1118. package/neural-interface/scripts/vendor-xterm-entry.js +8 -0
  1119. package/neural-interface/server.js +33983 -15000
  1120. package/neural-interface/skins/default/skin.css +90 -0
  1121. package/neural-interface/skins/default/skin.json +8 -0
  1122. package/neural-interface/templates/rulesets/README.md +9 -0
  1123. package/neural-interface/templates/rulesets/claude.md +3 -0
  1124. package/neural-interface/templates/rulesets/codex.md +2 -0
  1125. package/neural-interface/templates/rulesets/coexistence.md +6 -0
  1126. package/neural-interface/templates/rulesets/core.md +26 -0
  1127. package/neural-interface/templates/rulesets/cursor.md +2 -0
  1128. package/neural-interface/templates/rulesets/gemini.md +2 -0
  1129. package/neural-interface/templates/rulesets/legacy-hashes.json +227 -0
  1130. package/neural-interface/templates/rulesets/manifest.json +12 -0
  1131. package/neural-interface/templates/rulesets/opencode.md +2 -0
  1132. package/package.json +131 -53
  1133. package/postinstall.js +55 -26
  1134. package/preuninstall.js +187 -0
  1135. package/scripts/restore-data-home-from-backup.mjs +239 -0
  1136. package/setup.js +872 -260
  1137. package/skills/leonardo/SKILL.md +19 -10
  1138. package/skills/leonardo/modules/image-prompter.md +18 -12
  1139. package/skills/leonardo/modules/video-prompter.md +19 -13
  1140. package/skills/synabun/SKILL.md +209 -185
  1141. package/skills/synabun/icon.png +0 -0
  1142. package/skills/synabun/modules/audit.md +380 -374
  1143. package/skills/synabun/modules/changelog.md +15 -6
  1144. package/skills/synabun/modules/idea.md +148 -144
  1145. package/skills/synabun/modules/memorize.md +13 -4
  1146. package/skills/synabun/modules/schedule.md +198 -0
  1147. package/skills/synabun/synabunicon.png +0 -0
  1148. package/updater.cmd +31 -0
  1149. package/updater.mjs +382 -0
  1150. package/updater.sh +29 -0
  1151. package/hooks/claude-code/test-user-learning.mjs +0 -531
  1152. package/neural-interface/public/claude-chat.css +0 -878
  1153. package/neural-interface/public/claude-chat.html +0 -92
  1154. package/neural-interface/public/claude-chat.js +0 -1168
  1155. package/neural-interface/public/index-legacy.html +0 -14677
  1156. package/neural-interface/public/index2d-legacy.html +0 -8193
  1157. package/neural-interface/public/shared/html-term-renderer.js +0 -1022
  1158. package/neural-interface/public/variant/3d/background.js +0 -884
  1159. package/neural-interface/public/variant/3d/camera.js +0 -661
  1160. package/neural-interface/public/variant/3d/gfx.js +0 -116
  1161. package/neural-interface/public/variant/3d/graph.js +0 -2399
  1162. package/neural-interface/public/variant/3d/settings-gfx.js +0 -228
  1163. package/neural-interface/templates/CLAUDE-template.md +0 -211
@@ -0,0 +1,743 @@
1
+ /**
2
+ * Deterministic risk of pressing a Mac control, and the candidate list Jev may
3
+ * be shown for a `computer_ax` intent.
4
+ *
5
+ * Pure: no AX, no sqlite, no TypeSafe client. The Neural Interface imports the
6
+ * compiled copy to classify what the helper's accessibility snapshot found and
7
+ * to re-check a candidate at press time; the MCP layer and the desktop bench
8
+ * run the same functions, so "may this be pressed by intent" has one
9
+ * definition everywhere. `lib/desktop/*` never imports this file: server.js
10
+ * injects it.
11
+ *
12
+ * `navigation` is an allow-list verdict, as in browser-risk.ts. A control
13
+ * earns it only by passing every clause; anything not positively recognised is
14
+ * `unknown`, and only `navigation` may ever be pressed by intent. Jev never
15
+ * sees this module's inputs beyond the Jev-bound candidate fields and cannot
16
+ * influence its output: no on-screen text can talk a control into it.
17
+ *
18
+ * What may leave the Neural Interface for Jev is `DesktopCandidate`: an opaque
19
+ * id, a plain role name, a kind, the visible label, a tooltip, the nearest
20
+ * labelled container and two flags. Never a value, a window title, an
21
+ * identifier, a ref, a frame, a bundle id, static text, a password field (not
22
+ * even its name) or web content from a browser. Everything else a candidate
23
+ * carries (`DesktopCandidateEntry`) stays on the server.
24
+ */
25
+
26
+ import { createHash } from 'node:crypto';
27
+ import { lexiconClass, addressesAgent, normalizeName, LEXICON_LANGS } from './browser-risk.js';
28
+
29
+ export type DesktopRisk =
30
+ | 'navigation' | 'payment' | 'authentication' | 'file' | 'publish' | 'destructive' | 'write'
31
+ | 'grant' | 'dialog' | 'web' | 'field' | 'toggle' | 'value' | 'menu' | 'selection' | 'window' | 'launch'
32
+ | 'restricted-app' | 'unknown';
33
+
34
+ /** What sort of control a candidate is, in the words Jev reads. */
35
+ export type DesktopKind = 'button' | 'link' | 'tab' | 'disclosure' | 'menu' | 'field' | 'toggle' | 'value' | 'item' | 'other';
36
+
37
+ export interface DesktopFrame { x: number; y: number; w: number; h: number }
38
+
39
+ /**
40
+ * One node of the helper's `ax_snapshot` (protocol 2). Travels helper → Neural
41
+ * Interface and stops there: it holds values, identifiers and every label
42
+ * source, so it is NEVER serialized to the MCP layer, to Jev or to a log.
43
+ */
44
+ export interface DesktopNode {
45
+ ref?: string;
46
+ parent?: string | null;
47
+ depth?: number;
48
+ role?: string | null;
49
+ subrole?: string | null;
50
+ title?: string | null;
51
+ description?: string | null;
52
+ value?: unknown;
53
+ secure?: boolean;
54
+ enabled?: boolean;
55
+ focused?: boolean;
56
+ actions?: string[];
57
+ frame?: DesktopFrame | null;
58
+ help?: string | null;
59
+ placeholder?: string | null;
60
+ identifier?: string | null;
61
+ /** Nearest labelled container, "<role without AX, lowercased> <label>"; never a window title. */
62
+ group?: string | null;
63
+ /** Under a sheet, a popover, or a dialog / modal window. */
64
+ modal?: boolean;
65
+ /** Under an AXWebArea. */
66
+ web?: boolean;
67
+ /** enrich only: AXValue or AXTitle of AXTitleUIElement. */
68
+ titleElement?: string | null;
69
+ /** enrich only: rows and cells without a title — the first static text within two levels. */
70
+ contentLabel?: string | null;
71
+ }
72
+
73
+ /** The helper's snapshot result, as far as this module reads it. */
74
+ export interface DesktopSnapshot {
75
+ snapshotId?: string;
76
+ app?: { pid?: number | null; bundleId?: string | null; name?: string | null; lang?: string | null } | null;
77
+ window?: { id?: number | null; title?: string | null; subrole?: string | null; modal?: boolean } | null;
78
+ nodes?: DesktopNode[];
79
+ /** enrich only: static texts, read here for text that addresses the agent and never forwarded. */
80
+ texts?: string[];
81
+ truncated?: boolean;
82
+ }
83
+
84
+ export interface DesktopRiskContext { bundleId?: string | null; lang?: string | null }
85
+ export interface DesktopRiskVerdict { risk: DesktopRisk; clause: string }
86
+
87
+ /**
88
+ * The only shape that may be sent to Jev for a candidate. `id` is opaque
89
+ * (`c1…cN`), never a ref.
90
+ */
91
+ export interface DesktopCandidate {
92
+ id: string;
93
+ role: string;
94
+ kind: DesktopKind;
95
+ name: string;
96
+ hint?: string;
97
+ group?: string;
98
+ disabled: boolean;
99
+ inDialog: boolean;
100
+ }
101
+
102
+ /**
103
+ * What the helper re-checks, inside the same queued command as AXPress, before
104
+ * it presses (protocol 2 `ax_action … verify`). Built from the snapshot's own
105
+ * node fields, trimmed; never sent to the MCP layer.
106
+ */
107
+ export interface DesktopVerifyFacts {
108
+ pid: number | null;
109
+ role: string | null;
110
+ subrole: string | null;
111
+ title: string | null;
112
+ description: string | null;
113
+ help: string | null;
114
+ identifier: string | null;
115
+ }
116
+
117
+ /** Server-only companion of a candidate. Stays in the Neural Interface. */
118
+ export interface DesktopCandidateEntry {
119
+ id: string;
120
+ ref: string;
121
+ candidate: DesktopCandidate;
122
+ risk: DesktopRisk;
123
+ clause: string;
124
+ pressable: boolean;
125
+ /** Intent tokens found in name, hint and group. */
126
+ lex: number;
127
+ weight: number;
128
+ /** Position in the snapshot (tree order). */
129
+ order: number;
130
+ verify: DesktopVerifyFacts;
131
+ context: { bundleId: string | null; lang: string; pid: number | null };
132
+ node: DesktopNode;
133
+ }
134
+
135
+ /**
136
+ * What the Neural Interface may hand to the MCP layer per candidate: the
137
+ * Jev-bound fields plus what the agent and the eligibility check need. The MCP
138
+ * layer strips it back to `DesktopCandidate` before anything is sent to Jev.
139
+ */
140
+ export interface DesktopCandidateView extends DesktopCandidate {
141
+ ref: string;
142
+ risk: DesktopRisk;
143
+ pressable: boolean;
144
+ weight: number;
145
+ lex: number;
146
+ }
147
+
148
+ export interface DesktopCandidateCounts {
149
+ /** Every node in the snapshot. */
150
+ nodes: number;
151
+ /** Named, invocable controls that could be offered: `ranked + notRanked`. */
152
+ considered: number;
153
+ ranked: number;
154
+ notRanked: number;
155
+ secure: number;
156
+ unnamed: number;
157
+ chrome: number;
158
+ web: number;
159
+ inert: number;
160
+ }
161
+
162
+ export interface DesktopCandidateSet {
163
+ snapshotId: string | null;
164
+ intent: string;
165
+ /** Jev-bound: the app's name and interface language, nothing else about it. */
166
+ app: { name: string; lang: string };
167
+ /** Jev-bound, tree order, `c1…cN`. */
168
+ candidates: DesktopCandidate[];
169
+ /** Server-only, the same order and ids. */
170
+ entries: DesktopCandidateEntry[];
171
+ dialogOpen: boolean;
172
+ /** Nodes and static texts whose text addresses an automated reader. */
173
+ agentText: number;
174
+ /** The helper cut the tree short, or ranking left controls out. */
175
+ truncated: boolean;
176
+ counts: DesktopCandidateCounts;
177
+ }
178
+
179
+ // --- Text normalisation ---
180
+
181
+ /** normalizeName plus diacritic folding, identical to browser-risk's, so both lexicons meet the same text. */
182
+ function fold(value: unknown): string {
183
+ return normalizeName(value).normalize('NFD').replace(/\p{M}+/gu, '').normalize('NFC').replace(/ı/g, 'i').replace(/ß/g, 'ss');
184
+ }
185
+
186
+ /** "d e l e t e" → "delete". Only when every token is a single letter. */
187
+ function despaced(folded: string): string | null {
188
+ return /^(?:\p{L}\s){3,}\p{L}$/u.test(folded) ? folded.replace(/\s/g, '') : null;
189
+ }
190
+
191
+ const clean = (value: unknown): string => (typeof value === 'string' ? value.replace(/\s+/g, ' ').trim() : '');
192
+ const clip = (value: string, max: number): string => (value.length > max ? `${value.slice(0, max - 1)}…` : value);
193
+ const hasAlnum = (value: string): boolean => /[\p{L}\p{N}]/u.test(value);
194
+ const trimmed = (value: unknown): string | null => (typeof value === 'string' && value.trim() ? value.trim() : null);
195
+
196
+ /** Primary subtag, lowercased: "pt-BR" → "pt". Anything else (Base, garbage, empty) → '' — no language, no navigation. */
197
+ export function normalizeLang(value: unknown): string {
198
+ const primary = String(value ?? '').trim().toLowerCase().split(/[-_]/)[0];
199
+ return /^[a-z]{2,3}$/.test(primary) ? primary : '';
200
+ }
201
+
202
+ // --- Vocabularies (dk1) ---
203
+
204
+ type DesktopTermClass = 'destructive' | 'grant' | 'dialog' | 'write' | 'publish';
205
+
206
+ /**
207
+ * Desktop command vocabulary in the eight interface languages the browser
208
+ * lexicon covers. Matched as whole words on a control's labels (and on the
209
+ * intent), after the same folding as the browser lexicon; up to two filler
210
+ * words may sit inside a multi-word entry. Checked in this order, first class
211
+ * wins. The browser lexicon (rk1) still applies after it; this adds what a Mac
212
+ * says that a web page does not.
213
+ */
214
+ const DESKTOP_TERMS: Record<DesktopTermClass, string[]> = {
215
+ destructive: [
216
+ "don't save", 'dont save', 'do not save', 'quit', 'force quit', 'replace', 'revert', 'revert to saved', 'overwrite',
217
+ 'move to trash', 'move to bin', 'empty trash', 'empty bin', 'erase', 'eject', 'restart', 'shut down', 'shutdown',
218
+ 'não salvar', 'não guardar', 'encerrar', 'forçar encerramento', 'substituir', 'reverter', 'mover para o lixo', 'esvaziar lixo', 'esvaziar o lixo', 'ejetar', 'reiniciar', 'desligar',
219
+ 'no guardar', 'salir', 'forzar salida', 'reemplazar', 'revertir', 'trasladar a la papelera', 'mover a la papelera', 'vaciar papelera', 'vaciar la papelera', 'expulsar', 'apagar',
220
+ 'ne pas enregistrer', 'quitter', 'forcer à quitter', 'remplacer', 'revenir à la version', 'placer dans la corbeille', 'mettre à la corbeille', 'vider la corbeille', 'éjecter', 'redémarrer', 'éteindre',
221
+ 'nicht sichern', 'nicht speichern', 'beenden', 'sofort beenden', 'ersetzen', 'in den papierkorb legen', 'papierkorb entleeren', 'auswerfen', 'neustart', 'neu starten', 'ausschalten',
222
+ 'non salvare', 'esci', 'uscita forzata', 'forza uscita', 'sostituisci', 'ripristina', 'sposta nel cestino', 'svuota il cestino', 'svuota cestino', 'inizializza', 'espelli', 'riavvia', 'spegni',
223
+ 'kaydetme', 'çık', 'çıkmaya zorla', 'zorla çık', 'değiştir', 'yerine koy', 'geri döndür', 'çöp sepetine taşı', 'çöp sepetini boşalt', 'çıkar', 'yeniden başlat', 'kapat', 'sistemi kapat',
224
+ '保存しない', '終了', '強制終了', '置き換え', '復帰', 'ゴミ箱に入れる', 'ゴミ箱を空にする', '取り出す', '再起動', 'システム終了', 'アーカイブ',
225
+ ],
226
+ grant: [
227
+ 'allow', "don't allow", 'always allow', 'deny', 'trust', 'open anyway', 'install', 'authorize', 'authorise',
228
+ 'permitir', 'não permitir', 'negar', 'confiar', 'abrir mesmo assim', 'instalar', 'autorizar',
229
+ 'no permitir', 'denegar', 'abrir igualmente', 'abrir de todos modos',
230
+ 'autoriser', 'ne pas autoriser', 'refuser', 'faire confiance', 'ouvrir quand même', 'installer',
231
+ 'erlauben', 'zulassen', 'nicht erlauben', 'ablehnen', 'vertrauen', 'trotzdem öffnen', 'installieren',
232
+ 'consenti', 'consentire', 'non consentire', 'rifiuta', 'autorizza', 'fidati', 'apri comunque', 'installa',
233
+ 'izin ver', 'izin verme', 'reddet', 'güven', 'yine de aç', 'yükle',
234
+ '許可', '拒否', '信頼', 'このまま開く', 'インストール',
235
+ ],
236
+ dialog: [
237
+ 'continue', 'cancel', 'done',
238
+ 'continuar', 'cancelar', 'concluído', 'concluir',
239
+ 'continuer', 'annuler', 'terminé',
240
+ 'fortfahren', 'abbrechen', 'fertig',
241
+ 'continua', 'annulla',
242
+ 'devam', 'devam et', 'vazgeç', 'iptal',
243
+ '続ける', 'キャンセル', '完了',
244
+ ],
245
+ write: [
246
+ 'new', 'paste', 'undo', 'redo', 'print', 'record', 'connect', 'compose', 'rotate', 'crop', 'insert', 'bold', 'italic', 'underline', 'strikethrough', 'checklist', 'run', 'execute', 'lock', 'unlock', 'sichern',
247
+ 'novo', 'nova', 'colar', 'desfazer', 'refazer', 'imprimir', 'gravar', 'conectar', 'escrever', 'girar', 'recortar', 'inserir', 'negrito', 'itálico', 'sublinhado', 'executar', 'desbloquear',
248
+ 'nuevo', 'nueva', 'pegar', 'deshacer', 'rehacer', 'grabar', 'redactar', 'insertar', 'negrita', 'cursiva', 'subrayado', 'ejecutar',
249
+ 'nouveau', 'nouvelle', 'coller', 'rétablir', 'imprimer', 'connecter', 'rédiger', 'faire pivoter', 'pivoter', 'rogner', 'insérer', 'gras', 'italique', 'souligné', 'exécuter', 'verrouiller', 'déverrouiller',
250
+ 'neu', 'neue', 'neuer', 'neues', 'einsetzen', 'einfügen', 'widerrufen', 'wiederholen', 'drucken', 'aufnehmen', 'verbinden', 'verfassen', 'drehen', 'beschneiden', 'zuschneiden', 'fett', 'kursiv', 'unterstrichen', 'ausführen', 'sperren', 'entsperren',
251
+ 'nuovo', 'nuova', 'incolla', 'ripeti', 'stampa', 'registra', 'connetti', 'componi', 'ruota', 'ritaglia', 'inserisci', 'grassetto', 'corsivo', 'sottolineato', 'esegui', 'sblocca',
252
+ 'yeni', 'yapıştır', 'geri al', 'yinele', 'yazdır', 'kaydı başlat', 'bağlan', 'döndür', 'kırp', 'kalın', 'italik', 'altı çizili', 'çalıştır', 'kilitle', 'kilidi aç',
253
+ '新規', 'ペースト', '貼り付け', '取り消す', 'やり直す', 'プリント', '印刷', '録音', '録画', '接続', '回転', 'トリミング', '挿入', '太字', '斜体', '下線', '実行', 'ロック',
254
+ ],
255
+ publish: [
256
+ 'call', 'facetime', 'forward', 'reply all', 'airdrop', 'decline', 'answer', 'start meeting', 'start call', 'video call', 'voice call', 'collaborate', 'dial',
257
+ 'ligar', 'encaminhar', 'responder a todos', 'recusar', 'atender', 'colaborar', 'chamada',
258
+ 'llamar', 'reenviar', 'rechazar', 'contestar',
259
+ 'appeler', 'transférer', 'répondre à tous', 'décrocher', 'collaborer',
260
+ 'anrufen', 'weiterleiten', 'allen antworten', 'annehmen', 'zusammenarbeiten',
261
+ 'chiama', 'chiamata', 'inoltra', 'rispondi a tutti', 'collabora',
262
+ 'ara', 'arama', 'ilet', 'yönlendir', 'tümünü yanıtla', 'cevapla', 'birlikte çalış',
263
+ '電話', '発信', '通話', '転送', '全員に返信', '応答', '共同制作',
264
+ ],
265
+ };
266
+
267
+ /** Short answers that mean a dialog button only when they are the whole label ("OK", "Não", "はい"). */
268
+ const DESKTOP_EXACT_TERMS: Record<'dialog', string[]> = {
269
+ dialog: ['ok', 'okay', 'yes', 'no', 'sim', 'não', 'sí', 'si', 'oui', 'non', 'ja', 'nein', 'sì', 'fine', 'fatto', 'evet', 'hayır', 'tamam', 'bitti', 'はい', 'いいえ'],
270
+ };
271
+
272
+ /**
273
+ * Matched on the intent only, never on labels: an intent to type into a field
274
+ * or to flip a switch. Pressing by intent never types or toggles, so such an
275
+ * intent is advised on and never pressed, whatever Jev picks.
276
+ */
277
+ const DESKTOP_INTENT_TERMS: Record<'field' | 'toggle', string[]> = {
278
+ field: [
279
+ 'type', 'write', 'fill', 'fill in', 'fill out', 'input', 'search for', 'look up',
280
+ 'digitar', 'digite', 'escreva', 'preencher', 'preencha', 'pesquisar', 'pesquise', 'buscar', 'busque', 'procurar', 'procure',
281
+ 'escribir', 'escribe', 'teclear', 'rellenar', 'rellena', 'introducir', 'introduce', 'busca',
282
+ 'taper', 'tape', 'saisir', 'saisis', 'écrire', 'écris', 'remplir', 'remplis', 'rechercher', 'recherche', 'chercher', 'cherche',
283
+ 'tippen', 'tippe', 'eingeben', 'gib ein', 'schreiben', 'schreibe', 'ausfüllen', 'fülle aus', 'suchen', 'suche',
284
+ 'digitare', 'digita', 'scrivere', 'scrivi', 'compilare', 'compila', 'inserire', 'cercare', 'cerca',
285
+ 'yaz', 'yazın', 'doldur', 'arat',
286
+ '入力', '記入', '書く', '書いて', '検索',
287
+ ],
288
+ toggle: [
289
+ 'toggle', 'tick', 'untick', 'uncheck', 'checkbox', 'check box', 'switch on', 'switch off', 'activate',
290
+ 'marcar', 'marque', 'desmarcar', 'desmarque', 'ligue', 'desligue',
291
+ 'marca', 'desmarca', 'encender', 'enciende', 'apaga',
292
+ 'cocher', 'coche', 'décocher', 'décoche', 'allumer',
293
+ 'ankreuzen', 'abhaken', 'einschalten', 'anschalten',
294
+ 'spuntare', 'spunta', 'accendere', 'accendi', 'spegnere',
295
+ 'işaretle', 'işareti kaldır',
296
+ 'チェック', 'オンにする', 'オフにする', '有効にする', '無効にする',
297
+ ],
298
+ };
299
+
300
+ const escapeRe = (s: string) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
301
+ const isCjk = (s: string) => /^[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}ー]+$/u.test(s);
302
+
303
+ /** The browser lexicon's matcher, rebuilt here because browser-risk does not export it. */
304
+ function lexicon(terms: string[]): RegExp {
305
+ const folded = [...new Set(terms.map(fold).filter(Boolean))].sort((a, b) => b.length - a.length);
306
+ const cjk = folded.filter(isCjk).map(escapeRe);
307
+ const words = folded.filter(t => !isCjk(t)).map(t => escapeRe(t).replace(/ /g, "(?:\\s+[\\p{L}\\p{N}']+){0,2}\\s+"));
308
+ const parts: string[] = [];
309
+ if (words.length) parts.push(`(?<![\\p{L}\\p{N}])(?:${words.join('|')})(?![\\p{L}\\p{N}])`);
310
+ if (cjk.length) parts.push(`(?:${cjk.join('|')})`);
311
+ return new RegExp(parts.join('|'), 'u');
312
+ }
313
+
314
+ const TERM_ORDER: DesktopTermClass[] = ['destructive', 'grant', 'dialog', 'write', 'publish'];
315
+ const TERM_RES = Object.fromEntries(TERM_ORDER.map(name => [name, lexicon(DESKTOP_TERMS[name])])) as Record<DesktopTermClass, RegExp>;
316
+ const INTENT_RES = { field: lexicon(DESKTOP_INTENT_TERMS.field), toggle: lexicon(DESKTOP_INTENT_TERMS.toggle) };
317
+ const EXACT_DIALOG = new Set(DESKTOP_EXACT_TERMS.dialog.map(fold));
318
+
319
+ function hits(re: RegExp, text: string): boolean {
320
+ const folded = fold(text);
321
+ if (!folded) return false;
322
+ if (re.test(folded)) return true;
323
+ const joined = despaced(folded);
324
+ return joined ? re.test(joined) : false;
325
+ }
326
+
327
+ /** The whole label, folded and stripped of punctuation: "OK…" → "ok". */
328
+ const bare = (value: unknown) => fold(value).replace(/[^\p{L}\p{N}\s]/gu, ' ').replace(/\s+/g, ' ').trim();
329
+
330
+ /**
331
+ * Desktop vocabulary class of a text: a control's labels, or an intent. Exact
332
+ * dialog answers are checked on each label on its own, so pass the labels as
333
+ * separate strings where there are several.
334
+ */
335
+ export function desktopTermClass(...texts: unknown[]): DesktopTermClass | null {
336
+ const strings = texts.filter((t): t is string => typeof t === 'string' && t.trim().length > 0);
337
+ if (!strings.length) return null;
338
+ const joined = strings.join(' \n ');
339
+ for (const name of TERM_ORDER) {
340
+ if (name === 'dialog' && strings.some(s => EXACT_DIALOG.has(bare(s)))) return 'dialog';
341
+ if (hits(TERM_RES[name], joined)) return name;
342
+ }
343
+ return null;
344
+ }
345
+
346
+ /** An intent to type or to toggle (intent vocabulary only). */
347
+ export function desktopIntentClass(intent: unknown): 'field' | 'toggle' | null {
348
+ const text = typeof intent === 'string' ? intent : '';
349
+ if (hits(INTENT_RES.field, text)) return 'field';
350
+ if (hits(INTENT_RES.toggle, text)) return 'toggle';
351
+ return null;
352
+ }
353
+
354
+ /**
355
+ * The class an intent names, if any: the shared browser lexicon, the desktop
356
+ * vocabulary, or the typing / toggling vocabulary. An intent that names one is
357
+ * advised on and never pressed.
358
+ */
359
+ export function intentClass(intent: unknown): string | null {
360
+ const text = typeof intent === 'string' ? intent : '';
361
+ if (!text.trim()) return null;
362
+ return lexiconClass(text) ?? desktopTermClass(text) ?? desktopIntentClass(text);
363
+ }
364
+
365
+ // --- Roles ---
366
+
367
+ /** Plain names Jev reads instead of AX roles. Unknown roles fall back to the role without "AX", spaced and lowercased. */
368
+ export const ROLE_NAMES: Record<string, string> = {
369
+ AXButton: 'button', AXLink: 'link', AXTab: 'tab', AXDisclosureTriangle: 'disclosure triangle',
370
+ AXCheckBox: 'checkbox', AXRadioButton: 'radio button', AXSwitch: 'switch',
371
+ AXTextField: 'text field', AXTextArea: 'text area', AXComboBox: 'combo box', AXSearchField: 'search field', AXSecureTextField: 'password field',
372
+ AXPopUpButton: 'pop-up button', AXMenuButton: 'menu button', AXMenuItem: 'menu item', AXMenuBarItem: 'menu bar item',
373
+ AXSlider: 'slider', AXIncrementor: 'stepper', AXColorWell: 'color well',
374
+ AXRow: 'row', AXCell: 'cell', AXOutlineRow: 'row', AXDockItem: 'dock item',
375
+ AXImage: 'image', AXStaticText: 'text', AXGroup: 'group', AXToolbar: 'toolbar',
376
+ };
377
+ /** Subrole overrides: a tab is a radio button to AX and a tab to a person. */
378
+ const SUBROLE_NAMES: Record<string, string> = { AXTabButton: 'tab', AXSearchField: 'search field', AXSecureTextField: 'password field', AXSwitch: 'switch' };
379
+
380
+ const TEXT_ROLES = ['AXTextField', 'AXTextArea', 'AXComboBox', 'AXSearchField', 'AXSecureTextField'];
381
+ const TOGGLE_ROLES = ['AXCheckBox', 'AXRadioButton', 'AXSwitch'];
382
+ const VALUE_ROLES = ['AXSlider', 'AXIncrementor', 'AXColorWell'];
383
+ const MENU_ROLES = ['AXMenuItem', 'AXMenuButton', 'AXPopUpButton', 'AXMenuBarItem'];
384
+ const SELECTION_ROLES = ['AXRow', 'AXCell', 'AXOutlineRow'];
385
+ const LAUNCH_ROLES = ['AXDockItem'];
386
+ /** Window chrome: never offered, and `window` risk if classified directly. */
387
+ const CHROME_ROLES = ['AXScrollBar', 'AXSplitter', 'AXGrowArea', 'AXValueIndicator', 'AXWindow', 'AXMenuBar', 'AXMenuBarItem'];
388
+ const CHROME_SUBROLES = ['AXCloseButton', 'AXMinimizeButton', 'AXZoomButton', 'AXFullScreenButton', 'AXToolbarButton', 'AXDecrementArrow', 'AXIncrementArrow', 'AXDecrementPage', 'AXIncrementPage'];
389
+ const TAB_SUBROLES = ['AXTabButton'];
390
+ /** Windows whose every control counts as inside a dialog. */
391
+ const DIALOG_WINDOW_SUBROLES = ['AXDialog', 'AXSystemDialog'];
392
+ /** Actions that make a node a control; `raise` and `scroll_into_view` alone do not. */
393
+ const INVOCABLE_ACTIONS = ['press', 'focus', 'set_value', 'toggle', 'expand', 'collapse', 'select', 'show_menu'];
394
+
395
+ const has = (list: string[], value: unknown) => typeof value === 'string' && list.includes(value);
396
+
397
+ function isSecure(node: DesktopNode): boolean {
398
+ return node.secure === true || node.subrole === 'AXSecureTextField' || node.role === 'AXSecureTextField';
399
+ }
400
+ function isChrome(node: DesktopNode): boolean {
401
+ return has(CHROME_ROLES, node.role) || has(CHROME_SUBROLES, node.subrole);
402
+ }
403
+ function isTextRole(node: DesktopNode): boolean {
404
+ return has(TEXT_ROLES, node.role) || has(TEXT_ROLES, node.subrole);
405
+ }
406
+ function isTab(node: DesktopNode): boolean {
407
+ return node.role === 'AXTab' || (node.role === 'AXRadioButton' && has(TAB_SUBROLES, node.subrole));
408
+ }
409
+
410
+ /** "AXButton" → "button"; "AXRadioButton" + AXTabButton → "tab"; "AXFooBar" → "foo bar". */
411
+ export function roleName(node: Pick<DesktopNode, 'role' | 'subrole'>): string {
412
+ if (typeof node.subrole === 'string' && SUBROLE_NAMES[node.subrole]) return SUBROLE_NAMES[node.subrole];
413
+ const role = typeof node.role === 'string' ? node.role : '';
414
+ if (ROLE_NAMES[role]) return ROLE_NAMES[role];
415
+ const plain = role.replace(/^AX/, '').replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase().trim();
416
+ return plain.slice(0, 24) || 'control';
417
+ }
418
+
419
+ export function kindOf(node: DesktopNode): DesktopKind {
420
+ if (isTab(node)) return 'tab';
421
+ if (isTextRole(node)) return 'field';
422
+ if (has(TOGGLE_ROLES, node.role) || node.subrole === 'AXSwitch') return 'toggle';
423
+ if (node.role === 'AXButton') return 'button';
424
+ if (node.role === 'AXLink') return 'link';
425
+ if (node.role === 'AXDisclosureTriangle') return 'disclosure';
426
+ if (has(MENU_ROLES, node.role)) return 'menu';
427
+ if (has(VALUE_ROLES, node.role)) return 'value';
428
+ if (has(SELECTION_ROLES, node.role)) return 'item';
429
+ return 'other';
430
+ }
431
+
432
+ // --- Names ---
433
+
434
+ /** Label sources in precedence order; the placeholder only names a text field. */
435
+ function labelSources(node: DesktopNode): string[] {
436
+ return [node.title, node.description, node.titleElement, node.contentLabel, node.help, isTextRole(node) ? node.placeholder : null].map(clean).filter(Boolean);
437
+ }
438
+
439
+ /** Every label a person could read on or about the control, for classification. Values are never read. */
440
+ function allLabels(node: DesktopNode): string[] {
441
+ return [node.title, node.description, node.titleElement, node.contentLabel, node.help, node.placeholder].map(clean).filter(Boolean);
442
+ }
443
+
444
+ /** The name a person would read: title → description → titleElement → contentLabel → help → placeholder (fields only). */
445
+ export function axName(node: DesktopNode): string {
446
+ return labelSources(node).find(hasAlnum) ?? '';
447
+ }
448
+
449
+ /** Latin mixed with Cyrillic or Greek is the homoglyph pattern ("Bаck" with a Cyrillic а). */
450
+ function mixedConfusableScripts(text: string): boolean {
451
+ return /\p{Script=Latin}/u.test(text) && /[\p{Script=Cyrillic}\p{Script=Greek}]/u.test(text);
452
+ }
453
+
454
+ /** A label that reads like a selector or markup is written for a tool, not a person. */
455
+ const MARKUP_RE = /(?:>>|["\][{}<>`\\]|\b(?:css|xpath|text|role)\s*=)/i;
456
+
457
+ // --- Money ---
458
+
459
+ /** A price: a currency marker next to digits, either side. Read on labels only. */
460
+ const CURRENCY_RE = /(?:US\$|R\$|A\$|C\$|NZ\$|HK\$|\$|€|£|¥|₺|₹|₩|₽|CHF|zł)\s?\d|\d(?:[\d.,'   ]*\d)?\s?(?:€|£|¥|₺|₹|₩|₽|CHF|zł|円|US\$|R\$|\$)/i;
461
+
462
+ /**
463
+ * Place names that the shared payment vocabulary misreads in a system app:
464
+ * the Portuguese Finder calls Downloads "Transferências", which the web
465
+ * lexicon rightly reads as money transfers. Exact, folded, full names only;
466
+ * rows and cells of the listed app only. Everything else about the node is
467
+ * still classified (a row stays `selection`, never pressable).
468
+ */
469
+ const SYSTEM_PLACE_NAMES: Record<string, string[]> = {
470
+ 'com.apple.finder': ['transferências'],
471
+ };
472
+
473
+ function isSystemPlace(node: DesktopNode, ctx: DesktopRiskContext): boolean {
474
+ const names = SYSTEM_PLACE_NAMES[String(ctx.bundleId ?? '').toLowerCase()];
475
+ if (!names || !has(SELECTION_ROLES, node.role)) return false;
476
+ const folded = names.map(fold);
477
+ const labels = allLabels(node);
478
+ return labels.length > 0 && labels.every(label => folded.includes(fold(label)));
479
+ }
480
+
481
+ // --- Apps ---
482
+
483
+ /** Browsers: the same list as neural-interface/lib/desktop/config.js BROWSER_BUNDLES. */
484
+ export const DESKTOP_BROWSER_BUNDLES = [
485
+ 'com.google.Chrome', 'com.google.chrome.for.testing', 'org.chromium.Chromium', 'com.apple.Safari', 'com.apple.SafariTechnologyPreview',
486
+ 'company.thebrowser.Browser', 'com.microsoft.edgemac', 'org.mozilla.firefox', 'com.brave.Browser', 'com.operasoftware.Opera', 'com.vivaldi.Vivaldi',
487
+ ] as const;
488
+ /** Installed web apps (config.js WEB_APP_BUNDLE_PREFIXES). Only the Safari prefix is verified; the Chromium ones follow Chromium's naming. */
489
+ export const DESKTOP_WEB_APP_PREFIXES = [
490
+ 'com.apple.Safari.WebApp.', 'com.google.Chrome.app.', 'com.google.Chrome.canary.app.', 'org.chromium.Chromium.app.',
491
+ 'com.microsoft.edgemac.app.', 'com.brave.Browser.app.', 'com.vivaldi.Vivaldi.app.',
492
+ ] as const;
493
+ /**
494
+ * Apps where a press can buy something, change the system, or act on a device
495
+ * or another machine. Everything in them is advice only. The browsers and web
496
+ * apps are added below.
497
+ */
498
+ const SYSTEM_RESTRICTED_BUNDLES = [
499
+ 'com.apple.systempreferences', 'com.apple.Settings', 'com.apple.AppStore', 'com.apple.Music', 'com.apple.TV', 'com.apple.iBooksX',
500
+ 'com.apple.Home', 'com.apple.findmy', 'com.apple.shortcuts', 'com.apple.DiskUtility', 'com.apple.installer',
501
+ 'com.apple.MigrateAssistant', 'com.apple.bootcampassistant', 'com.apple.ScreenSharing',
502
+ ];
503
+ export const RESTRICTED_APP_BUNDLES: readonly string[] = [...SYSTEM_RESTRICTED_BUNDLES, ...DESKTOP_BROWSER_BUNDLES];
504
+ export const RESTRICTED_APP_PREFIXES: readonly string[] = [...DESKTOP_WEB_APP_PREFIXES];
505
+
506
+ const lowerBundles = new Set(RESTRICTED_APP_BUNDLES.map(b => b.toLowerCase()));
507
+ const lowerBrowsers = new Set<string>(DESKTOP_BROWSER_BUNDLES.map(b => b.toLowerCase()));
508
+ const lowerPrefixes = RESTRICTED_APP_PREFIXES.map(p => p.toLowerCase());
509
+
510
+ /** Where a press is never made by intent: System Settings, stores, media stores, device and system tools, browsers, web apps. */
511
+ export function isRestrictedApp(bundleId: unknown): boolean {
512
+ const id = String(bundleId ?? '').trim().toLowerCase();
513
+ if (!id) return false;
514
+ return lowerBundles.has(id) || lowerPrefixes.some(prefix => id.startsWith(prefix));
515
+ }
516
+
517
+ /** A browser or an installed web app: its web content is dropped from the candidates altogether. */
518
+ export function isBrowserApp(bundleId: unknown): boolean {
519
+ const id = String(bundleId ?? '').trim().toLowerCase();
520
+ if (!id) return false;
521
+ return lowerBrowsers.has(id) || lowerPrefixes.some(prefix => id.startsWith(prefix));
522
+ }
523
+
524
+ // --- Classification ---
525
+
526
+ /** Why a control is not plain navigation, or null when every clause holds. */
527
+ function navigationFailure(node: DesktopNode, ctx: DesktopRiskContext): string | null {
528
+ const role = node.role ?? '';
529
+ const plainButton = role === 'AXButton' && !node.subrole;
530
+ if (!(plainButton || role === 'AXLink' || isTab(node) || role === 'AXDisclosureTriangle')) return 'N1 not a plain button, link, tab or disclosure triangle';
531
+ if (node.enabled === false) return 'N2 disabled';
532
+ if (!Array.isArray(node.actions) || !node.actions.includes('press')) return 'N2 has no press action';
533
+ const name = axName(node);
534
+ const normalized = normalizeName(name);
535
+ const letters = normalized.match(/\p{L}/gu)?.length ?? 0;
536
+ if (letters < 2 || normalized.length > 80 || mixedConfusableScripts(normalized)) return 'N3 name missing, overlong, or mixing confusable scripts';
537
+ if (MARKUP_RE.test(name)) return 'N3 name carries selector or markup syntax';
538
+ if (addressesAgent(name) || addressesAgent(node.help) || addressesAgent(node.group)) return 'N4 text addresses an automated reader';
539
+ if (!LEXICON_LANGS.has(normalizeLang(ctx.lang))) return 'N5 interface language not covered by the vocabularies';
540
+ return null;
541
+ }
542
+
543
+ /** First match wins; `navigation` has to be earned, everything unrecognised is `unknown`. */
544
+ export function explainDesktopTarget(node: DesktopNode, ctx: DesktopRiskContext = {}): DesktopRiskVerdict {
545
+ if (!node || typeof node !== 'object') return { risk: 'unknown', clause: 'D0 not a node' };
546
+ if (isSecure(node)) return { risk: 'authentication', clause: 'D1 password field' };
547
+ const labels = allLabels(node);
548
+ const text = labels.join(' \n ');
549
+ if (CURRENCY_RE.test(text.normalize('NFKC'))) return { risk: 'payment', clause: 'D2 a price next to a currency' };
550
+ const shared = lexiconClass(text);
551
+ if (shared === 'payment' && !isSystemPlace(node, ctx)) return { risk: 'payment', clause: 'D3 payment vocabulary' };
552
+ const term = desktopTermClass(...labels);
553
+ if (term) return { risk: term, clause: `D4 desktop ${term} vocabulary` };
554
+ if (shared && shared !== 'payment') return { risk: shared, clause: `D5 ${shared} vocabulary` };
555
+ const container = lexiconClass(clean(node.group));
556
+ if (container) return { risk: container, clause: `D6 ${container} vocabulary in the container label` };
557
+ if (node.modal === true) return { risk: 'dialog', clause: 'D7 inside a sheet, popover or dialog' };
558
+ if (node.web === true) return { risk: 'web', clause: 'D7 web content' };
559
+ if (isTextRole(node)) return { risk: 'field', clause: 'D8 text field' };
560
+ if (!isTab(node) && (has(TOGGLE_ROLES, node.role) || node.subrole === 'AXSwitch')) return { risk: 'toggle', clause: 'D8 checkbox, radio button or switch' };
561
+ if (has(VALUE_ROLES, node.role)) return { risk: 'value', clause: 'D8 slider, stepper or color well' };
562
+ if (has(MENU_ROLES, node.role)) return { risk: 'menu', clause: 'D8 menu, menu button or pop-up button' };
563
+ if (has(SELECTION_ROLES, node.role)) return { risk: 'selection', clause: 'D8 row or cell' };
564
+ if (isChrome(node)) return { risk: 'window', clause: 'D8 window chrome' };
565
+ if (has(LAUNCH_ROLES, node.role)) return { risk: 'launch', clause: 'D8 dock item' };
566
+ if (isRestrictedApp(ctx.bundleId)) return { risk: 'restricted-app', clause: 'D9 restricted app' };
567
+ const failure = navigationFailure(node, ctx);
568
+ return failure ? { risk: 'unknown', clause: failure } : { risk: 'navigation', clause: 'N1-N5 hold' };
569
+ }
570
+
571
+ export function classifyDesktopTarget(node: DesktopNode, ctx: DesktopRiskContext = {}): DesktopRisk {
572
+ return explainDesktopTarget(node, ctx).risk;
573
+ }
574
+
575
+ /** Tags the compact list shows after a control; risks without one show none. */
576
+ export const DESKTOP_RISK_TAGS: Partial<Record<DesktopRisk, string>> = {
577
+ payment: '[payment]', authentication: '[sign-in]', file: '[file]', publish: '[publish]', destructive: '[destructive]',
578
+ write: '[write]', grant: '[permission]', dialog: '[dialog]', web: '[web]',
579
+ };
580
+
581
+ // --- Candidates ---
582
+
583
+ /** Ranking and caps for the candidate list. Part of the dk1 hash: a different cut is a different experiment. */
584
+ export const DESKTOP_CANDIDATE_POLICY = {
585
+ candidates: 24,
586
+ minTokenChars: 3,
587
+ lexWeight: 10,
588
+ modalWeight: 3,
589
+ kindWeights: { button: 2, link: 2, tab: 2, disclosure: 1, menu: 1 } as Record<string, number>,
590
+ disabledPenalty: 2,
591
+ nameChars: 80,
592
+ hintChars: 60,
593
+ groupChars: 60,
594
+ appNameChars: 40,
595
+ intentChars: 120,
596
+ } as const;
597
+
598
+ /** NFKD, marks stripped, lowercased: what ranking compares. */
599
+ const rankFold = (value: unknown) => String(value ?? '').normalize('NFKD').replace(/\p{M}+/gu, '').toLowerCase().replace(/ı/g, 'i');
600
+
601
+ /** Intent words of three or more characters, folded, once each. */
602
+ export function intentTokens(intent: unknown): string[] {
603
+ return [...new Set(rankFold(intent).split(/[^\p{L}\p{N}]+/u).filter(t => [...t].length >= DESKTOP_CANDIDATE_POLICY.minTokenChars))];
604
+ }
605
+
606
+ function verifyFacts(node: DesktopNode, pid: number | null): DesktopVerifyFacts {
607
+ return {
608
+ pid, role: trimmed(node.role), subrole: trimmed(node.subrole), title: trimmed(node.title),
609
+ description: trimmed(node.description), help: trimmed(node.help), identifier: trimmed(node.identifier),
610
+ };
611
+ }
612
+
613
+ const textsOf = (node: DesktopNode) => [node.title, node.description, node.titleElement, node.contentLabel, node.help, node.placeholder, node.group];
614
+
615
+ /**
616
+ * Filter, classify and rank the controls of one snapshot for an intent.
617
+ *
618
+ * Dropped (and counted): password fields, window chrome, web content in a
619
+ * browser or web app, nodes with nothing to invoke, and controls with no
620
+ * letter or digit in their name. Disabled controls stay, marked. What is left
621
+ * is ranked by `lex*10 + modal 3 + kind weight − disabled 2`, cut to 24 (tree
622
+ * order breaks ties), put back in tree order and numbered `c1…cN`.
623
+ */
624
+ export function buildDesktopCandidates(snapshot: DesktopSnapshot, options: { intent: string; limit?: number }): DesktopCandidateSet {
625
+ const policy = DESKTOP_CANDIDATE_POLICY;
626
+ const nodes = Array.isArray(snapshot?.nodes) ? snapshot.nodes.filter(n => n && typeof n === 'object') : [];
627
+ const app = snapshot?.app ?? {};
628
+ const bundleId = typeof app.bundleId === 'string' && app.bundleId ? app.bundleId : null;
629
+ const lang = normalizeLang(app.lang);
630
+ const pid = typeof app.pid === 'number' && Number.isFinite(app.pid) ? app.pid : null;
631
+ const ctx: DesktopRiskContext = { bundleId, lang };
632
+ const browser = isBrowserApp(bundleId);
633
+ const intent = clip(clean(options.intent), policy.intentChars);
634
+ const tokens = intentTokens(intent);
635
+ const limit = Math.max(1, Math.min(Math.floor(Number(options.limit) || policy.candidates), policy.candidates));
636
+
637
+ let agentText = 0;
638
+ for (const node of nodes) if (textsOf(node).some(t => typeof t === 'string' && addressesAgent(t))) agentText++;
639
+ for (const text of Array.isArray(snapshot?.texts) ? snapshot.texts : []) if (typeof text === 'string' && addressesAgent(text)) agentText++;
640
+
641
+ const win = snapshot?.window ?? null;
642
+ const dialogOpen = nodes.some(n => n.modal === true) || has(DIALOG_WINDOW_SUBROLES, win?.subrole) || win?.modal === true;
643
+
644
+ const counts: DesktopCandidateCounts = { nodes: nodes.length, considered: 0, ranked: 0, notRanked: 0, secure: 0, unnamed: 0, chrome: 0, web: 0, inert: 0 };
645
+ const found: DesktopCandidateEntry[] = [];
646
+ nodes.forEach((node, order) => {
647
+ if (isSecure(node)) { counts.secure++; return; }
648
+ if (isChrome(node)) { counts.chrome++; return; }
649
+ if (node.web === true && browser) { counts.web++; return; }
650
+ if (!Array.isArray(node.actions) || !node.actions.some(a => INVOCABLE_ACTIONS.includes(a))) { counts.inert++; return; }
651
+ const name = axName(node);
652
+ if (!hasAlnum(name)) { counts.unnamed++; return; }
653
+ const verdict = explainDesktopTarget(node, ctx);
654
+ const disabled = node.enabled === false;
655
+ const inDialog = node.modal === true;
656
+ const kind = kindOf(node);
657
+ const help = clean(node.help);
658
+ const group = clean(node.group);
659
+ const candidate: DesktopCandidate = { id: '', role: roleName(node), kind, name: clip(name, policy.nameChars), disabled, inDialog };
660
+ if (help && hasAlnum(help) && normalizeName(help) !== normalizeName(name)) candidate.hint = clip(help, policy.hintChars);
661
+ if (group && hasAlnum(group)) candidate.group = clip(group, policy.groupChars);
662
+ const hay = rankFold(`${name} ${candidate.hint ?? ''} ${candidate.group ?? ''}`);
663
+ const lex = tokens.filter(t => hay.includes(t)).length;
664
+ const weight = lex * policy.lexWeight + (inDialog ? policy.modalWeight : 0) + (policy.kindWeights[kind] ?? 0) - (disabled ? policy.disabledPenalty : 0);
665
+ found.push({
666
+ id: '', ref: String(node.ref ?? ''), candidate, risk: verdict.risk, clause: verdict.clause,
667
+ pressable: verdict.risk === 'navigation' && !disabled, lex, weight, order,
668
+ verify: verifyFacts(node, pid), context: { bundleId, lang, pid }, node,
669
+ });
670
+ });
671
+ counts.considered = found.length;
672
+ const kept = found.length > limit
673
+ ? [...found].sort((a, b) => b.weight - a.weight || a.order - b.order).slice(0, limit).sort((a, b) => a.order - b.order)
674
+ : found;
675
+ kept.forEach((entry, index) => { entry.id = `c${index + 1}`; entry.candidate.id = entry.id; });
676
+ counts.ranked = kept.length;
677
+ counts.notRanked = found.length - kept.length;
678
+ return {
679
+ snapshotId: typeof snapshot?.snapshotId === 'string' ? snapshot.snapshotId : null,
680
+ intent,
681
+ app: { name: clip(clean(app.name) || 'app', policy.appNameChars), lang },
682
+ candidates: kept.map(entry => entry.candidate),
683
+ entries: kept,
684
+ dialogOpen,
685
+ agentText,
686
+ truncated: snapshot?.truncated === true || counts.notRanked > 0,
687
+ counts,
688
+ };
689
+ }
690
+
691
+ /** The per-candidate view the Neural Interface hands to the MCP layer (the Jev-bound fields plus ref, risk, pressability and rank). */
692
+ export function candidateViews(set: Pick<DesktopCandidateSet, 'entries'>): DesktopCandidateView[] {
693
+ return set.entries.map(entry => ({ ...entry.candidate, ref: entry.ref, risk: entry.risk, pressable: entry.pressable, weight: entry.weight, lex: entry.lex }));
694
+ }
695
+
696
+ /** Compact-list order: Jev's pick, then its alternatives, then the rest by word overlap, then tree order. */
697
+ export function displayOrder<T extends { id: string; lex: number; order?: number }>(entries: T[], pick?: string | null, alternatives: string[] = []): T[] {
698
+ const first = [pick, ...alternatives].filter((id): id is string => typeof id === 'string' && id.length > 0);
699
+ const position = (entry: T, index: number) => (typeof entry.order === 'number' ? entry.order : index);
700
+ const rest = entries.map((entry, index) => ({ entry, index })).filter(({ entry }) => !first.includes(entry.id))
701
+ .sort((a, b) => b.entry.lex - a.entry.lex || position(a.entry, a.index) - position(b.entry, b.index)).map(({ entry }) => entry);
702
+ const lead = first.map(id => entries.find(entry => entry.id === id)).filter((entry): entry is T => Boolean(entry));
703
+ return [...lead, ...rest];
704
+ }
705
+
706
+ /**
707
+ * Point of effect, in the Neural Interface: may this stored entry be pressed?
708
+ * Re-derived from the node the server kept, never from a flag that travelled
709
+ * anywhere: the risk must still be `navigation` under the rules loaded now,
710
+ * the control enabled with a press action, and the verify facts must still be
711
+ * the node's own.
712
+ */
713
+ export function pressableEntry(entry: unknown): boolean {
714
+ if (!entry || typeof entry !== 'object') return false;
715
+ const e = entry as Partial<DesktopCandidateEntry>;
716
+ const node = e.node;
717
+ if (!node || typeof node !== 'object' || typeof e.ref !== 'string' || !/^e\d+$/.test(e.ref) || node.ref !== e.ref) return false;
718
+ if (node.enabled === false || !Array.isArray(node.actions) || !node.actions.includes('press')) return false;
719
+ const context = e.context && typeof e.context === 'object' ? e.context : { bundleId: null, lang: '', pid: null };
720
+ if (explainDesktopTarget(node, { bundleId: context.bundleId, lang: context.lang }).risk !== 'navigation') return false;
721
+ const expected = verifyFacts(node, typeof context.pid === 'number' ? context.pid : null);
722
+ const verify = e.verify as DesktopVerifyFacts | undefined;
723
+ if (!verify || typeof verify !== 'object') return false;
724
+ return (Object.keys(expected) as (keyof DesktopVerifyFacts)[]).every(key => verify[key] === expected[key]);
725
+ }
726
+
727
+ // --- Identity of the rules ---
728
+
729
+ /**
730
+ * Identity of everything above, for the desktop benchmark basis. The
731
+ * classifier and the candidate cut decide what may be pressed as much as the
732
+ * model and the thresholds do, so a recorded pass stops vouching once a
733
+ * vocabulary, a role table, an app list or the ranking policy changes. The
734
+ * data is hashed; bump DESKTOP_RISK_RULES_VERSION for a change in logic the
735
+ * data cannot show (and for helper labelling changes, which live in Swift).
736
+ */
737
+ export const DESKTOP_RISK_RULES_VERSION = 'dk1';
738
+ export const DESKTOP_RISK_RULES_HASH = createHash('sha256').update(JSON.stringify([
739
+ DESKTOP_RISK_RULES_VERSION, DESKTOP_TERMS, DESKTOP_EXACT_TERMS, DESKTOP_INTENT_TERMS, TERM_ORDER,
740
+ ROLE_NAMES, SUBROLE_NAMES, TEXT_ROLES, TOGGLE_ROLES, VALUE_ROLES, MENU_ROLES, SELECTION_ROLES, LAUNCH_ROLES, CHROME_ROLES, CHROME_SUBROLES, TAB_SUBROLES,
741
+ DIALOG_WINDOW_SUBROLES, INVOCABLE_ACTIONS, CURRENCY_RE.source, MARKUP_RE.source, SYSTEM_PLACE_NAMES,
742
+ SYSTEM_RESTRICTED_BUNDLES, DESKTOP_BROWSER_BUNDLES, DESKTOP_WEB_APP_PREFIXES, DESKTOP_CANDIDATE_POLICY,
743
+ ])).digest('hex').slice(0, 12);