synabun 1.3.0 → 2.0.0-beta

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