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,1016 @@
1
+ import { detectProject as memoryProject } from '../../mcp-server/dist/config.js';
2
+ import { Codex } from '@openai/codex-sdk';
3
+ import { query as claudeQuery } from '@anthropic-ai/claude-agent-sdk';
4
+ import { CLAUDE_EFFORT_LEVELS, markAlignedClaudeExecutableFailed } from './claude-model-catalog.js';
5
+ import { claudeRuntime, isNativeBinaryLaunchFailure, resolveClaudeExecutableOverride } from './native-binary-runtime.js';
6
+ import { extractOpenCodeText } from './session-title-generator.js';
7
+ import { patchCodexLineSplitting } from './jsonl-lines.js';
8
+ import { dirname } from 'node:path';
9
+ import { codexReasoningEffort } from './effort-levels.js';
10
+ import { codexStreamMedia, collectCodexMedia, openCodeMediaPart, ownCodexImages } from './assistant-media.js';
11
+ import { browserToolDenial } from './browser-tool-policy.js';
12
+ import { CODEX_BROWSER_POLICY_UNTRUSTED_NOTE, codexBrowserPolicyHook } from './assistant-route-gate-codex.js';
13
+
14
+ function stringEnv(source) {
15
+ const out = {};
16
+ for (const [key, value] of Object.entries(source || {})) {
17
+ if (value !== undefined && value !== null) out[key] = String(value);
18
+ }
19
+ return out;
20
+ }
21
+
22
+ function cleanClaudeEnvironment(source = process.env) {
23
+ const env = {};
24
+ for (const [key, value] of Object.entries(source || {})) {
25
+ if (key === 'CLAUDECODE' || key === 'TERM_PROGRAM' || key === 'TERM_PROGRAM_VERSION') continue;
26
+ if (key.startsWith('VSCODE_')) continue;
27
+ env[key] = value;
28
+ }
29
+ env.ENABLE_TOOL_SEARCH = 'true';
30
+ return env;
31
+ }
32
+
33
+ async function settleWithin(promise, timeoutMs = 1500) {
34
+ let timer;
35
+ try {
36
+ return await Promise.race([
37
+ Promise.resolve(promise),
38
+ new Promise((resolveWait) => { timer = setTimeout(resolveWait, timeoutMs); }),
39
+ ]);
40
+ } finally {
41
+ clearTimeout(timer);
42
+ }
43
+ }
44
+
45
+ function createInputQueue() {
46
+ const values = [];
47
+ let wake = null;
48
+ let closed = false;
49
+ return {
50
+ push(value) {
51
+ if (closed) return false;
52
+ values.push(value);
53
+ if (wake) { const resolveWake = wake; wake = null; resolveWake(); }
54
+ return true;
55
+ },
56
+ close() {
57
+ closed = true;
58
+ if (wake) { const resolveWake = wake; wake = null; resolveWake(); }
59
+ },
60
+ async *[Symbol.asyncIterator]() {
61
+ while (!closed || values.length) {
62
+ while (values.length) yield values.shift();
63
+ if (closed) return;
64
+ await new Promise((resolveWake) => { wake = resolveWake; });
65
+ }
66
+ },
67
+ };
68
+ }
69
+
70
+ function asAbortError(reason = 'aborted') {
71
+ const error = new Error(reason);
72
+ error.name = 'AbortError';
73
+ return error;
74
+ }
75
+
76
+ function providerErrorMessage(error, fallback = 'Provider request failed') {
77
+ if (!error) return fallback;
78
+ if (typeof error === 'string') return error;
79
+ return error?.data?.message || error?.message || error?.name || fallback;
80
+ }
81
+
82
+ function codexFailureMessage(error) {
83
+ const raw = providerErrorMessage(error, 'Codex turn failed');
84
+ try {
85
+ const parsed = JSON.parse(raw);
86
+ return parsed?.error?.message || parsed?.message || raw;
87
+ } catch { return raw; }
88
+ }
89
+
90
+ /** Every level Codex accepts passes through unchanged (max stays max); off → undefined. */
91
+ export function normalizeCodexEffort(effort) {
92
+ return codexReasoningEffort(effort);
93
+ }
94
+
95
+ export function normalizeOpenCodeModel(model) {
96
+ if (!model) return undefined;
97
+ if (typeof model === 'object') return model;
98
+ const value = String(model).trim();
99
+ const slash = value.indexOf('/');
100
+ if (slash <= 0 || slash === value.length - 1) return undefined;
101
+ return { providerID: value.slice(0, slash), modelID: value.slice(slash + 1) };
102
+ }
103
+
104
+ // ── Task-mode (assistant dispatch) policy helpers ────────────────────────────
105
+ //
106
+ // permissionPolicy: 'auto' (unattended, today's behavior) | 'ask' (route
107
+ // permission prompts through a broker so the orchestrator/user can answer) |
108
+ // 'restricted' (unattended but sandboxed where the provider supports it).
109
+ // capability: 'read-only' | 'workspace' | 'full' — how much the worker may touch.
110
+
111
+ export const PERMISSION_POLICIES = new Set(['auto', 'ask', 'restricted']);
112
+ export const CAPABILITIES = new Set(['read-only', 'workspace', 'full']);
113
+ export const CLAUDE_READ_ONLY_DISALLOWED_TOOLS = ['Write', 'Edit', 'MultiEdit', 'NotebookEdit', 'Bash'];
114
+
115
+ export function normalizePermissionPolicy(policy) {
116
+ const value = String(policy || 'auto').trim().toLowerCase();
117
+ return PERMISSION_POLICIES.has(value) ? value : 'auto';
118
+ }
119
+
120
+ export function normalizeCapability(capability) {
121
+ const value = String(capability || 'full').trim().toLowerCase();
122
+ return CAPABILITIES.has(value) ? value : 'full';
123
+ }
124
+
125
+ export function codexSandboxModeFor({ permissionPolicy, capability } = {}) {
126
+ const cap = normalizeCapability(capability);
127
+ if (cap === 'read-only') return 'read-only';
128
+ if (cap === 'workspace' || normalizePermissionPolicy(permissionPolicy) === 'restricted') return 'workspace-write';
129
+ return 'danger-full-access';
130
+ }
131
+
132
+ function policyUnsupportedError(provider, policy) {
133
+ const error = new Error(`${provider} native adapter does not support permission policy "${policy}"`);
134
+ error.code = 'PERMISSION_POLICY_UNSUPPORTED';
135
+ return error;
136
+ }
137
+
138
+ /** Final assistant text carried by a Codex SDK stream event, or null. */
139
+ export function codexAgentMessageText(event) {
140
+ if (!event) return null;
141
+ if (event.type === 'item.completed' && event.item?.type === 'agent_message') {
142
+ const text = event.item.text ?? event.item.content;
143
+ return typeof text === 'string' ? text : null;
144
+ }
145
+ if (event.type === 'agent_message') {
146
+ const text = event.text ?? event.message;
147
+ return typeof text === 'string' ? text : null;
148
+ }
149
+ return null;
150
+ }
151
+
152
+ // ── Codex output schemas ─────────────────────────────────────────────────────
153
+ //
154
+ // Codex sends an output schema as a strict response_format: every object must
155
+ // set additionalProperties:false and list every property in `required`, or the
156
+ // turn fails in seconds with "Invalid schema for response_format".
157
+
158
+ const SCHEMA_UNIONS = ['anyOf', 'oneOf', 'allOf'];
159
+ const SCALAR_TYPES = new Set(['string', 'number', 'integer', 'boolean']);
160
+ const isSchema = (value) => !!value && typeof value === 'object' && !Array.isArray(value);
161
+
162
+ /** A schema that also accepts null: how a strict schema says a field may be left out. */
163
+ function nullableSchema(schema) {
164
+ if (!isSchema(schema)) return schema;
165
+ const types = Array.isArray(schema.type) ? schema.type : typeof schema.type === 'string' ? [schema.type] : null;
166
+ if (types?.includes('null')) return schema;
167
+ // A plain scalar widens its type. Anything else (an enum or const would still refuse null, an
168
+ // object, an array, a union) gets null as a branch of its own.
169
+ if (types && types.every((type) => SCALAR_TYPES.has(type)) && !('enum' in schema) && !('const' in schema)) return { ...schema, type: [...types, 'null'] };
170
+ if (!types && Array.isArray(schema.anyOf)) {
171
+ return schema.anyOf.some((branch) => branch?.type === 'null') ? schema : { ...schema, anyOf: [...schema.anyOf, { type: 'null' }] };
172
+ }
173
+ return { anyOf: [schema, { type: 'null' }] };
174
+ }
175
+
176
+ /**
177
+ * A copy of an output schema in the strict form Codex accepts: every object gets
178
+ * additionalProperties:false and requires all its properties, and a property the
179
+ * caller left optional also accepts null (see dropOptionalNulls). Recurses into
180
+ * properties, items, anyOf / oneOf / allOf and $defs. The caller's schema is not touched.
181
+ */
182
+ export function strictCodexSchema(schema) {
183
+ if (Array.isArray(schema)) return schema.map(strictCodexSchema);
184
+ if (!isSchema(schema)) return schema;
185
+ const out = { ...schema };
186
+ for (const key of SCHEMA_UNIONS) if (Array.isArray(out[key])) out[key] = out[key].map(strictCodexSchema);
187
+ if (out.items && typeof out.items === 'object') out.items = strictCodexSchema(out.items);
188
+ for (const key of ['$defs', 'definitions']) {
189
+ if (isSchema(out[key])) out[key] = Object.fromEntries(Object.entries(out[key]).map(([name, value]) => [name, strictCodexSchema(value)]));
190
+ }
191
+ const isObject = out.type === 'object' || (Array.isArray(out.type) && out.type.includes('object')) || isSchema(out.properties);
192
+ if (!isObject) return out;
193
+ const wasRequired = new Set(Array.isArray(schema.required) ? schema.required : []);
194
+ out.properties = Object.fromEntries(Object.entries(isSchema(schema.properties) ? schema.properties : {}).map(([name, value]) => {
195
+ const strict = strictCodexSchema(value);
196
+ return [name, wasRequired.has(name) ? strict : nullableSchema(strict)];
197
+ }));
198
+ out.required = Object.keys(out.properties);
199
+ out.additionalProperties = false;
200
+ return out;
201
+ }
202
+
203
+ /** The schema itself and every anyOf / oneOf / allOf branch under it: the shapes a value may have. */
204
+ function schemaBranches(schema) {
205
+ if (!isSchema(schema)) return [];
206
+ const out = [schema];
207
+ for (const key of SCHEMA_UNIONS) for (const branch of Array.isArray(schema[key]) ? schema[key] : []) out.push(...schemaBranches(branch));
208
+ return out;
209
+ }
210
+
211
+ /**
212
+ * A structured answer read back against the caller's own schema: a null in a field that schema
213
+ * left optional (strictCodexSchema made it required and nullable) means "left out", so the key
214
+ * is dropped. A null in a field the caller required stays.
215
+ */
216
+ export function dropOptionalNulls(value, schema) {
217
+ if (Array.isArray(value)) {
218
+ const items = schemaBranches(schema).map((branch) => branch.items).find(isSchema) || null;
219
+ return value.map((item) => dropOptionalNulls(item, items));
220
+ }
221
+ if (!value || typeof value !== 'object') return value;
222
+ const shapes = schemaBranches(schema).filter((branch) => isSchema(branch.properties));
223
+ const out = {};
224
+ for (const [key, item] of Object.entries(value)) {
225
+ const owners = shapes.filter((shape) => Object.hasOwn(shape.properties, key));
226
+ if (item === null && owners.length && owners.every((shape) => !(Array.isArray(shape.required) && shape.required.includes(key)))) continue;
227
+ out[key] = dropOptionalNulls(item, owners[0]?.properties[key] || null);
228
+ }
229
+ return out;
230
+ }
231
+
232
+ /** The final message of a turn that had an output schema, as the object it is (optional nulls dropped), else null. */
233
+ function codexStructuredOutput(text, schema) {
234
+ let value = null;
235
+ try { value = JSON.parse(String(text || '').trim()); } catch { return null; }
236
+ return value && typeof value === 'object' ? dropOptionalNulls(value, schema) : null;
237
+ }
238
+
239
+ /** Create one durable Codex SDK thread and reuse it for every loop iteration. */
240
+ export async function createCodexNativeLoopAdapter(options = {}) {
241
+ const {
242
+ runId, cwd, model, effort, codexHome, codexPath, browserSessionId,
243
+ browserTabId, mcpProfile, onIdentity = () => {}, onEvent = () => {},
244
+ CodexClass = Codex,
245
+ extraEnv = {}, permissionPolicy: rawPolicy = 'auto', capability: rawCapability = 'full',
246
+ outputSchema = null, desktopGrantProvider = null, modelContextWindow = null, contextMode = null,
247
+ // Image creation runs (assistant dispatch): 'image' → each turn returns the images it generated.
248
+ collectMedia = null,
249
+ // Assistant task runs: the browser policy's hook and the run's notes (a function: never in the state file).
250
+ runMode = 'loop', onNote = null, browserPolicyTrust = null,
251
+ } = options;
252
+ const permissionPolicy = normalizePermissionPolicy(rawPolicy);
253
+ const capability = normalizeCapability(rawCapability);
254
+ // "<id>[extended]" (the Assistant's extended-context row) runs <id> with the
255
+ // larger window the dispatcher read from the catalog; never silently at 272k.
256
+ const legacyExtended = /\[extended\]$/i.test(String(model || ''));
257
+ const extended = contextMode === 'extended' || legacyExtended;
258
+ const runModel = legacyExtended ? String(model).replace(/\[extended\]$/i, '') : model;
259
+ if (extended && !(Number(modelContextWindow) > 0)) throw new Error(`Extended context is unavailable for ${runModel}.`);
260
+ // The Codex SDK drives `codex exec`, which has no approval channel: an 'ask'
261
+ // policy would hang or fail mid-turn. Refuse up front so the dispatcher can
262
+ // offer 'restricted' instead.
263
+ if (permissionPolicy === 'ask') throw policyUnsupportedError('Codex', permissionPolicy);
264
+ // Assistant task runs: SynaBun's browser policy as a PreToolUse hook the
265
+ // user's Codex trusts (the brain's route-gate mechanism), and no web search
266
+ // of Codex's own. Without a trusted hook the policy is instructions only
267
+ // (the task prompt), and the run's notes say so.
268
+ const task = runMode === 'task';
269
+ let browserPolicy = null;
270
+ if (task) {
271
+ try { browserPolicy = await codexBrowserPolicyHook({ codexBin: codexPath || null, ...(browserPolicyTrust ? { trust: browserPolicyTrust } : {}) }); } catch { browserPolicy = null; }
272
+ if (!browserPolicy) { try { onNote?.(CODEX_BROWSER_POLICY_UNTRUSTED_NOTE); } catch {} }
273
+ }
274
+ const pins = stringEnv({
275
+ SYNABUN_TERMINAL_SESSION: runId,
276
+ SYNABUN_PROJECT: cwd ? memoryProject(cwd) : 'global',
277
+ SYNABUN_BROWSER_SESSION: browserSessionId,
278
+ SYNABUN_BROWSER_TAB: browserTabId,
279
+ SYNABUN_PROFILE: mcpProfile,
280
+ SYNABUN_TOOL_CATALOG_MODE: 'deferred',
281
+ // Computer-use workers: the grant unlocks the `computer` group in the MCP child.
282
+ SYNABUN_DESKTOP_GRANT: typeof desktopGrantProvider === 'function' ? desktopGrantProvider() || undefined : undefined,
283
+ });
284
+ const env = stringEnv({ ...process.env, ...pins, CODEX_HOME: codexHome, ...(browserPolicy ? { SYNABUN_BROWSER_POLICY_CWD: cwd || process.cwd() } : {}), ...stringEnv(extraEnv) });
285
+ const config = {};
286
+ if (Object.keys(pins).length) config.mcp_servers = { SynaBun: { env: pins } };
287
+ if (extended) config.model_context_window = Math.floor(Number(modelContextWindow));
288
+ if (browserPolicy) Object.assign(config, browserPolicy.config);
289
+ const codex = new CodexClass({
290
+ ...(codexPath ? { codexPathOverride: codexPath } : {}),
291
+ env,
292
+ config,
293
+ });
294
+ // The SDK reads `codex exec --json` with readline, which also breaks lines at
295
+ // U+2028 / U+2029: a command printing one ended the run with "Failed to parse item".
296
+ patchCodexLineSplitting(codex);
297
+ const parent = dirname(cwd || process.cwd());
298
+ const thread = codex.startThread({
299
+ workingDirectory: cwd || process.cwd(),
300
+ model: runModel || undefined,
301
+ modelReasoningEffort: normalizeCodexEffort(effort),
302
+ approvalPolicy: 'never',
303
+ sandboxMode: codexSandboxModeFor({ permissionPolicy, capability }),
304
+ skipGitRepoCheck: true,
305
+ networkAccessEnabled: true,
306
+ ...(task ? { webSearchMode: 'disabled' } : {}),
307
+ additionalDirectories: parent && parent !== cwd ? [parent] : undefined,
308
+ });
309
+ let alive = true;
310
+ let activeAbort = null;
311
+ let activeTurn = null;
312
+ // Every runTurn is its own `codex exec`, which numbers its items from item_0
313
+ // again: the sidepanel keys a turn's items by this sequence.
314
+ let providerTurn = 0;
315
+ // Generated images already returned by an earlier turn, and when the thread began (its rollout's day).
316
+ const mediaSeen = new Set();
317
+ let threadStartedMs = 0;
318
+
319
+ return {
320
+ identity: () => ({ providerThreadId: thread.id, providerSessionId: thread.id }),
321
+ isAlive: () => alive,
322
+ describe: () => ({
323
+ provider: 'codex', permissionPolicy, capability, sandboxMode: codexSandboxModeFor({ permissionPolicy, capability }),
324
+ ...(task ? { browserPolicy: browserPolicy ? 'hook' : 'instructions' } : {}),
325
+ }),
326
+ async runTurn(prompt, meta = {}) {
327
+ if (!alive) throw new Error('Codex native loop is closed');
328
+ if (activeTurn) throw new Error('Codex native loop already has an active turn');
329
+ providerTurn += 1;
330
+ const turn = providerTurn;
331
+ onEvent({
332
+ provider: 'codex',
333
+ runId,
334
+ iteration: meta.iteration,
335
+ providerTurn: turn,
336
+ event: { type: 'synabun.user_prompt', text: String(prompt || '') },
337
+ });
338
+ activeAbort = new AbortController();
339
+ activeTurn = (async () => {
340
+ const turnOptions = { signal: activeAbort.signal };
341
+ const schema = meta.outputSchema || outputSchema;
342
+ // Codex takes strict schemas only: it gets a strict copy, and the answer is read back
343
+ // against the caller's own.
344
+ if (schema && typeof schema === 'object') turnOptions.outputSchema = strictCodexSchema(schema);
345
+ const turnStartedMs = Date.now();
346
+ if (!threadStartedMs) threadStartedMs = turnStartedMs;
347
+ const streamed = await thread.runStreamed(prompt, turnOptions);
348
+ let failure = null;
349
+ let completed = false;
350
+ let text = '';
351
+ let usage = null;
352
+ const media = [];
353
+ try {
354
+ for await (const event of streamed.events) {
355
+ if (event?.type === 'thread.started' && event.thread_id) {
356
+ onIdentity({ providerThreadId: event.thread_id, providerSessionId: event.thread_id });
357
+ }
358
+ const agentText = codexAgentMessageText(event);
359
+ if (agentText !== null) text = agentText;
360
+ const saved = codexStreamMedia(event);
361
+ if (saved) media.push(saved);
362
+ if (event?.type === 'turn.failed') failure = codexFailureMessage(event.error);
363
+ if (event?.type === 'turn.completed') { completed = true; if (event.usage) usage = event.usage; }
364
+ if (event?.type === 'error') failure = codexFailureMessage(event);
365
+ onEvent({ provider: 'codex', runId, iteration: meta.iteration, providerTurn: turn, event });
366
+ }
367
+ } catch (error) {
368
+ if (failure) throw new Error(failure, { cause: error });
369
+ throw error;
370
+ }
371
+ if (failure) throw new Error(failure);
372
+ if (!completed) throw new Error('Codex stream ended before turn.completed');
373
+ const identity = { providerThreadId: thread.id, providerSessionId: thread.id };
374
+ onIdentity(identity);
375
+ // Image creation runs only. The stream carries no image tool items today (the rollout, or
376
+ // generated_images/, does); either way only this thread's own saved files count.
377
+ let found = [];
378
+ if (collectMedia && thread.id) {
379
+ try {
380
+ found = ownCodexImages({ codexHome, threadId: thread.id, items: media });
381
+ if (!found.length) found = await collectCodexMedia({ codexHome, threadId: thread.id, sinceMs: turnStartedMs - 1000, threadStartedMs });
382
+ } catch { found = []; }
383
+ }
384
+ const fresh = found.filter((item) => !mediaSeen.has(item.path));
385
+ for (const item of fresh) mediaSeen.add(item.path);
386
+ // With an output schema the final message is the JSON itself.
387
+ const structured = turnOptions.outputSchema ? codexStructuredOutput(text, schema) : null;
388
+ return { ...identity, text, usage, result: { text, usage }, ...(structured ? { structured } : {}), ...(fresh.length ? { media: fresh } : {}) };
389
+ })();
390
+ try { return await activeTurn; }
391
+ finally { activeTurn = null; activeAbort = null; }
392
+ },
393
+ async abort(reason = 'aborted') {
394
+ if (activeAbort) activeAbort.abort(asAbortError(reason));
395
+ return true;
396
+ },
397
+ async dispose() {
398
+ alive = false;
399
+ if (activeAbort) activeAbort.abort(asAbortError('disposed'));
400
+ },
401
+ };
402
+ }
403
+
404
+ /** Create one streaming-input Claude Agent SDK query for the whole loop. */
405
+ export async function createClaudeNativeLoopAdapter(options = {}) {
406
+ const {
407
+ runId, cwd, model, effort, browserSessionId, browserTabId,
408
+ mcpUrl, onIdentity = () => {}, onEvent = () => {}, queryFactory = claudeQuery,
409
+ sdkExecutable, includePartialMessages = process.platform !== 'win32',
410
+ // Fallback CLI + runtime probe, injectable for tests.
411
+ claudeBin = null, resolveRuntime = claudeRuntime, logWarn = console.warn,
412
+ // Installed CLI to run instead of the bundled one because it is newer — see
413
+ // alignedClaudeExecutable() in claude-model-catalog.js. null keeps bundled.
414
+ alignedClaudeBin = null,
415
+ // Task-mode options (assistant dispatch).
416
+ extraEnv = {}, permissionPolicy: rawPolicy = 'auto', permissionBroker = null,
417
+ capability: rawCapability = 'full', maxBudgetUsd = null, outputSchema = null, runMode = 'loop',
418
+ desktopGrantProvider = null,
419
+ } = options;
420
+ const permissionPolicy = normalizePermissionPolicy(rawPolicy);
421
+ const capability = normalizeCapability(rawCapability);
422
+ const askMode = permissionPolicy === 'ask' && typeof permissionBroker?.request === 'function';
423
+ const input = createInputQueue();
424
+ const abortController = new AbortController();
425
+ let alive = true;
426
+ let sessionId = null;
427
+ let activeTurn = null;
428
+ const env = stringEnv({
429
+ ...cleanClaudeEnvironment(),
430
+ SYNABUN_TERMINAL_SESSION: runId,
431
+ SYNABUN_PROJECT: cwd ? memoryProject(cwd) : 'global',
432
+ SYNABUN_PROFILE: 'full',
433
+ SYNABUN_BROWSER_SESSION: browserSessionId,
434
+ SYNABUN_BROWSER_TAB: browserTabId,
435
+ SYNABUN_RUN_MODE: runMode === 'task' ? 'task' : undefined,
436
+ ...stringEnv(extraEnv),
437
+ });
438
+ const brokerRequest = async (request) => {
439
+ try {
440
+ const reply = await permissionBroker.request({
441
+ runId, provider: 'claude-code', signal: abortController.signal, ...request,
442
+ });
443
+ return reply && typeof reply === 'object' ? reply : { behavior: 'deny' };
444
+ } catch (error) {
445
+ return { behavior: 'deny', message: providerErrorMessage(error, 'Permission request failed') };
446
+ }
447
+ };
448
+ const headers = stringEnv({
449
+ 'X-Synabun-Terminal': runId,
450
+ 'X-Synabun-Project': cwd ? memoryProject(cwd) : 'global',
451
+ 'X-Synabun-Memory-Session': runId,
452
+ 'X-Synabun-Browser-Session': browserSessionId,
453
+ 'X-Synabun-Browser-Tab': browserTabId,
454
+ // Computer-use workers: the grant unlocks the `computer` MCP group.
455
+ 'X-Synabun-Desktop-Grant': typeof desktopGrantProvider === 'function' ? desktopGrantProvider() || undefined : undefined,
456
+ });
457
+ // Under 'ask' the orchestrator answers permission prompts (and AskUserQuestion
458
+ // becomes a relayed question); otherwise the run is unattended and both
459
+ // interactive tools stay denied. ExitPlanMode is never useful for a worker.
460
+ const denyMatcher = askMode ? 'ExitPlanMode' : 'AskUserQuestion|ExitPlanMode';
461
+ const denyMessage = askMode
462
+ ? 'Dispatched workers do not use plan mode.'
463
+ : 'This unattended automation cannot wait for interactive input.';
464
+ const queryOptions = {
465
+ cwd: cwd || process.cwd(),
466
+ permissionMode: askMode ? 'default' : 'bypassPermissions',
467
+ ...(askMode ? {} : { allowDangerouslySkipPermissions: true }),
468
+ includePartialMessages: !!includePartialMessages,
469
+ systemPrompt: { type: 'preset', preset: 'claude_code' },
470
+ settingSources: ['user', 'project', 'local'],
471
+ hooks: {
472
+ PreToolUse: [{
473
+ matcher: denyMatcher,
474
+ hooks: [async () => ({
475
+ hookSpecificOutput: {
476
+ hookEventName: 'PreToolUse',
477
+ permissionDecision: 'deny',
478
+ permissionDecisionReason: denyMessage,
479
+ },
480
+ })],
481
+ },
482
+ // Assistant task runs: SynaBun's browser policy (browser-tool-policy.js)
483
+ // on every call, subagents' included, before the bypass and canUseTool.
484
+ ...(runMode === 'task' ? [{
485
+ hooks: [async (input) => {
486
+ const reason = browserToolDenial(input?.tool_name, input?.tool_input || {}, { host: 'claude', cwd: cwd || process.cwd() });
487
+ return reason ? { hookSpecificOutput: { hookEventName: 'PreToolUse', permissionDecision: 'deny', permissionDecisionReason: reason } } : {};
488
+ }],
489
+ }] : [])],
490
+ },
491
+ env,
492
+ abortController,
493
+ canUseTool: async (toolName, toolInput) => {
494
+ if (toolName === 'ExitPlanMode') return { behavior: 'deny', message: denyMessage };
495
+ if (toolName === 'AskUserQuestion') {
496
+ if (!askMode) return { behavior: 'deny', message: denyMessage };
497
+ const reply = await brokerRequest({ kind: 'ask', toolName, input: toolInput, questions: toolInput?.questions || [] });
498
+ if (reply.behavior === 'allow') {
499
+ const answers = reply.answers || reply.updatedInput?.answers || {};
500
+ return { behavior: 'allow', updatedInput: { ...(toolInput || {}), answers } };
501
+ }
502
+ return { behavior: 'deny', message: reply.message || 'The question was not answered.' };
503
+ }
504
+ // Computer use is fully autonomous: its guards live in the desktop service,
505
+ // so the orchestrator is never asked to approve individual actions.
506
+ if (askMode && /^mcp__SynaBun__computer(_apps|_ax|_status)?$/.test(String(toolName))) return { behavior: 'allow', updatedInput: toolInput };
507
+ if (askMode) {
508
+ const reply = await brokerRequest({ kind: 'tool', toolName, input: toolInput });
509
+ if (reply.behavior === 'allow') {
510
+ const allowed = { behavior: 'allow', updatedInput: reply.updatedInput || toolInput };
511
+ if (reply.updatedPermissions) allowed.updatedPermissions = reply.updatedPermissions;
512
+ return allowed;
513
+ }
514
+ return { behavior: 'deny', message: reply.message || 'Denied by the orchestrator.' };
515
+ }
516
+ return { behavior: 'allow', updatedInput: toolInput };
517
+ },
518
+ };
519
+ if (mcpUrl) queryOptions.mcpServers = { SynaBun: { type: 'http', url: mcpUrl, headers } };
520
+ if (model) queryOptions.model = model;
521
+ if (effort && CLAUDE_EFFORT_LEVELS.includes(effort)) queryOptions.effort = effort;
522
+ if (capability === 'read-only') queryOptions.disallowedTools = [...CLAUDE_READ_ONLY_DISALLOWED_TOOLS];
523
+ if (Number(maxBudgetUsd) > 0) queryOptions.maxBudgetUsd = Number(maxBudgetUsd);
524
+ if (outputSchema && typeof outputSchema === 'object') queryOptions.outputFormat = { type: 'json_schema', schema: outputSchema };
525
+ // The SDK uses pathToClaudeCodeExecutable verbatim with no validation, so vet
526
+ // the override first (a bare command name would ENOENT under shell:false).
527
+ // With no override, calling resolveRuntime() also restores the execute bit on
528
+ // the bundled binary — npm drops it, and this repo commits node_modules.
529
+ //
530
+ // Pre-flight only: unattended loops have no one to prompt, and retries are
531
+ // owned by native-loop-runtime.js. A bad runtime here means we pick the
532
+ // fallback CLI up front rather than failing mid-loop.
533
+ const override = resolveClaudeExecutableOverride(sdkExecutable);
534
+ // The installed CLI, when it is newer than the bundled one: the loop's model was
535
+ // picked from that CLI's list, and the bundled binary would resolve the same alias
536
+ // to an older model. Vetted with the same contract as any override.
537
+ const aligned = !override.path && alignedClaudeBin
538
+ ? resolveClaudeExecutableOverride(alignedClaudeBin)
539
+ : null;
540
+ const alignedPath = aligned?.ok && aligned.path ? aligned.path : null;
541
+ if (override.path) {
542
+ queryOptions.pathToClaudeCodeExecutable = override.path;
543
+ } else {
544
+ if (sdkExecutable) logWarn(`[native-loop] ignoring sdkExecutable override — ${override.reason}`);
545
+ if (alignedPath) {
546
+ queryOptions.pathToClaudeCodeExecutable = alignedPath;
547
+ } else {
548
+ const runtime = resolveRuntime();
549
+ if (!runtime.ok) {
550
+ const fallback = resolveClaudeExecutableOverride(claudeBin);
551
+ if (fallback.ok && fallback.path) {
552
+ queryOptions.pathToClaudeCodeExecutable = fallback.path;
553
+ logWarn(`[native-loop] bundled Claude binary unusable (${runtime.state}) — using ${fallback.path}`);
554
+ } else {
555
+ logWarn(`[native-loop] bundled Claude binary unusable (${runtime.state}) and no launchable `
556
+ + `fallback CLI: ${runtime.reason || fallback.reason || 'none configured'}`);
557
+ }
558
+ }
559
+ }
560
+ }
561
+
562
+ const q = queryFactory({ prompt: input, options: queryOptions });
563
+ const deltaBuffer = new Map();
564
+ const forwardEvent = (event) => onEvent({ provider: 'claude-code', runId, event });
565
+ const flushDelta = (key) => {
566
+ const slot = deltaBuffer.get(key);
567
+ if (!slot) return;
568
+ deltaBuffer.delete(key);
569
+ clearTimeout(slot.timer);
570
+ const inner = slot.event.event;
571
+ const delta = inner.delta?.type === 'thinking_delta'
572
+ ? { ...inner.delta, thinking: slot.text }
573
+ : { ...inner.delta, text: slot.text };
574
+ forwardEvent({ ...slot.event, event: { ...inner, delta } });
575
+ };
576
+ const flushDeltas = () => {
577
+ for (const key of [...deltaBuffer.keys()]) flushDelta(key);
578
+ };
579
+ const emitEvent = (event) => {
580
+ const inner = event?.type === 'stream_event' ? event.event : null;
581
+ const isDelta = inner?.type === 'content_block_delta'
582
+ && (inner.delta?.type === 'text_delta' || inner.delta?.type === 'thinking_delta');
583
+ if (!isDelta) {
584
+ flushDeltas();
585
+ forwardEvent(event);
586
+ return;
587
+ }
588
+ const key = `${event.parent_tool_use_id || ''}:${inner.index}`;
589
+ let slot = deltaBuffer.get(key);
590
+ if (!slot) {
591
+ slot = { event, text: '', timer: null };
592
+ slot.timer = setTimeout(() => flushDelta(key), 40);
593
+ slot.timer.unref?.();
594
+ deltaBuffer.set(key, slot);
595
+ }
596
+ slot.text += inner.delta.type === 'thinking_delta'
597
+ ? (inner.delta.thinking || '')
598
+ : (inner.delta.text || '');
599
+ };
600
+ // total_cost_usd is this CLI process's running total, not the turn's charge:
601
+ // a warm task run reported $7.87 after turn 1 and $7.99 after a $0.12 turn 2.
602
+ // A turn resolves with its own charge (costUsd) beside the total.
603
+ let reportedCostUsd = 0;
604
+ const turnCost = (event) => {
605
+ const total = Number(event?.total_cost_usd);
606
+ if (!Number.isFinite(total) || total <= 0) return { costUsd: 0, totalCostUsd: reportedCostUsd };
607
+ // A smaller total is a fresh counter (a restarted process): it counts in full.
608
+ const costUsd = total >= reportedCostUsd ? total - reportedCostUsd : total;
609
+ reportedCostUsd = total;
610
+ return { costUsd: Number(costUsd.toFixed(8)), totalCostUsd: total };
611
+ };
612
+ let pumpError = null;
613
+ const pump = (async () => {
614
+ try {
615
+ for await (const event of q) {
616
+ if (!alive) break;
617
+ const eventSessionId = event?.session_id || null;
618
+ if (eventSessionId && eventSessionId !== sessionId) {
619
+ sessionId = eventSessionId;
620
+ onIdentity({ providerSessionId: sessionId });
621
+ }
622
+ emitEvent(event);
623
+ if (event?.type === 'result' && activeTurn) {
624
+ const turn = activeTurn;
625
+ activeTurn = null;
626
+ const cost = turnCost(event);
627
+ if (event.subtype === 'success') {
628
+ turn.resolve({
629
+ providerSessionId: sessionId,
630
+ result: event,
631
+ text: typeof event.result === 'string' ? event.result : '',
632
+ usage: event.usage || null,
633
+ costUsd: cost.costUsd,
634
+ totalCostUsd: cost.totalCostUsd,
635
+ structured: event.structured_output ?? null,
636
+ });
637
+ } else {
638
+ const error = new Error((event.errors && event.errors[0]) || event.error || event.result || 'Claude turn failed');
639
+ error.subtype = event.subtype || null;
640
+ if (event.subtype === 'error_max_budget_usd') error.code = 'BUDGET_CAP';
641
+ else if (event.subtype === 'error_max_turns') error.code = 'MAX_TURNS';
642
+ error.costUsd = cost.costUsd;
643
+ error.totalCostUsd = cost.totalCostUsd;
644
+ error.usage = event.usage || null;
645
+ turn.reject(error);
646
+ }
647
+ }
648
+ }
649
+ } catch (error) {
650
+ pumpError = error;
651
+ // The aligned CLI would not start. Later runs go back to the bundled runtime.
652
+ if (alignedPath && isNativeBinaryLaunchFailure(error)) markAlignedClaudeExecutableFailed(alignedPath);
653
+ } finally {
654
+ flushDeltas();
655
+ if (alive) {
656
+ alive = false;
657
+ input.close();
658
+ if (activeTurn) {
659
+ const turn = activeTurn; activeTurn = null;
660
+ turn.reject(pumpError || new Error('Claude session ended before the turn completed'));
661
+ }
662
+ }
663
+ }
664
+ if (pumpError) throw pumpError;
665
+ })();
666
+ pump.catch((error) => onEvent({
667
+ provider: 'claude-code',
668
+ runId,
669
+ event: { type: 'synabun.error', message: error?.message || String(error) },
670
+ }));
671
+
672
+ return {
673
+ identity: () => ({ providerSessionId: sessionId }),
674
+ isAlive: () => alive,
675
+ describe: () => ({ provider: 'claude-code', permissionPolicy, capability, askMode }),
676
+ runTurn(prompt, meta = {}) {
677
+ if (!alive) return Promise.reject(new Error('Claude native loop is closed'));
678
+ if (activeTurn) return Promise.reject(new Error('Claude native loop already has an active turn'));
679
+ onEvent({
680
+ provider: 'claude-code',
681
+ runId,
682
+ event: { type: 'synabun.user_prompt', text: String(prompt || ''), iteration: meta.iteration },
683
+ });
684
+ return new Promise((resolveTurn, rejectTurn) => {
685
+ activeTurn = { resolve: resolveTurn, reject: rejectTurn, iteration: meta.iteration };
686
+ const ok = input.push({
687
+ type: 'user',
688
+ message: { role: 'user', content: [{ type: 'text', text: prompt }] },
689
+ parent_tool_use_id: null,
690
+ session_id: sessionId || '',
691
+ });
692
+ if (!ok) {
693
+ activeTurn = null;
694
+ rejectTurn(new Error('Claude input stream is closed'));
695
+ }
696
+ });
697
+ },
698
+ async abort(reason = 'aborted') {
699
+ if (activeTurn) {
700
+ const turn = activeTurn; activeTurn = null;
701
+ turn.reject(asAbortError(reason));
702
+ }
703
+ if (!alive) return true;
704
+ try {
705
+ await Promise.race([
706
+ Promise.resolve(q.interrupt?.()),
707
+ new Promise((resolveWait) => setTimeout(resolveWait, 1000)),
708
+ ]);
709
+ } catch {}
710
+ return true;
711
+ },
712
+ async dispose() {
713
+ if (activeTurn) {
714
+ const turn = activeTurn; activeTurn = null;
715
+ turn.reject(asAbortError('disposed'));
716
+ }
717
+ alive = false;
718
+ input.close();
719
+ flushDeltas();
720
+ try { abortController.abort(asAbortError('disposed')); } catch {}
721
+ await Promise.race([pump, new Promise((resolveWait) => setTimeout(resolveWait, 1000))]).catch(() => {});
722
+ },
723
+ };
724
+ }
725
+
726
+ /** Use a loop-owned OpenCode serve while retaining one native session. */
727
+ export async function createOpenCodeNativeLoopAdapter(options = {}) {
728
+ const {
729
+ runId, cwd, title, model, client, release = async () => {},
730
+ onIdentity = () => {}, onEvent = () => {},
731
+ permissionPolicy: rawPolicy = 'auto', permissionBroker = null,
732
+ capability: rawCapability = 'full', outputSchema = null,
733
+ // Task mode: an explicit OpenCode agent and the effort as a model variant.
734
+ agent = null, effort = null, runMode = 'loop',
735
+ // Image / video creation runs: 'image' | 'video' → each turn returns the files its model generated.
736
+ collectMedia = null,
737
+ } = options;
738
+ if (!client?.session?.create || (!client?.session?.promptAsync && !client?.session?.prompt)) {
739
+ throw new Error('OpenCode native loop requires an isolated SDK client');
740
+ }
741
+ const permissionPolicy = normalizePermissionPolicy(rawPolicy);
742
+ const capability = normalizeCapability(rawCapability);
743
+ const askMode = permissionPolicy === 'ask' && typeof permissionBroker?.request === 'function';
744
+ let alive = true;
745
+ let activeAbort = null;
746
+ let activeTurn = null;
747
+ const eventSource = client.onEvent ? client : client.event;
748
+ let sessionId = null;
749
+ // Assistant text assembled from the SSE stream (message.updated gives roles,
750
+ // message.part.updated gives text parts keyed by message id).
751
+ const messageRoles = new Map();
752
+ const messageOrder = [];
753
+ const textParts = new Map(); // messageID → Map(partID → text)
754
+ const rememberMessage = (info) => {
755
+ if (!info?.id) return;
756
+ if (!messageRoles.has(info.id)) messageOrder.push(info.id);
757
+ if (info.role) messageRoles.set(info.id, info.role);
758
+ else if (!messageRoles.has(info.id)) messageRoles.set(info.id, null);
759
+ };
760
+ // Generated images / videos (`file` parts), kept only for image / video creation runs.
761
+ const mediaParts = new Map(); // partID → { messageID, media }
762
+ const mediaReturned = new Set();
763
+ const rememberPart = (part) => {
764
+ if (!part?.messageID) return;
765
+ if (part.type === 'file') {
766
+ const media = collectMedia ? openCodeMediaPart(part) : null;
767
+ if (media) mediaParts.set(part.id || `${part.messageID}:${mediaParts.size}`, { messageID: part.messageID, media });
768
+ return;
769
+ }
770
+ if (part.type !== 'text' || typeof part.text !== 'string') return;
771
+ if (!messageRoles.has(part.messageID)) rememberMessage({ id: part.messageID, role: null });
772
+ let parts = textParts.get(part.messageID);
773
+ if (!parts) { parts = new Map(); textParts.set(part.messageID, parts); }
774
+ parts.set(part.id || `${parts.size}`, part.text);
775
+ };
776
+ /** { media } with the generated files not returned yet (none: {}). */
777
+ const turnMedia = (extraParts = []) => {
778
+ for (const part of extraParts) rememberPart(part);
779
+ const media = [];
780
+ for (const [id, { messageID, media: item }] of mediaParts) {
781
+ if (mediaReturned.has(id) || messageRoles.get(messageID) === 'user') continue;
782
+ mediaReturned.add(id);
783
+ media.push(item);
784
+ }
785
+ return media.length ? { media } : {};
786
+ };
787
+ const latestAssistantText = () => {
788
+ for (let index = messageOrder.length - 1; index >= 0; index--) {
789
+ const id = messageOrder[index];
790
+ if (messageRoles.get(id) === 'user') continue;
791
+ const parts = textParts.get(id);
792
+ const text = parts ? [...parts.values()].join('\n').trim() : '';
793
+ if (text) return text;
794
+ }
795
+ return '';
796
+ };
797
+ const fetchAssistantText = async () => {
798
+ const local = latestAssistantText();
799
+ if (local || typeof client.session?.messages !== 'function') return local;
800
+ try {
801
+ const response = await settleWithin(client.session.messages({ sessionID: sessionId, directory: cwd || undefined }), 5000);
802
+ const rows = Array.isArray(response?.data) ? response.data : Array.isArray(response) ? response : [];
803
+ for (let index = rows.length - 1; index >= 0; index--) {
804
+ const row = rows[index];
805
+ if (row?.info?.role && row.info.role !== 'assistant') continue;
806
+ const text = extractOpenCodeText(row);
807
+ if (text) return text;
808
+ }
809
+ } catch {}
810
+ return '';
811
+ };
812
+ const brokerRequest = async (request) => {
813
+ try {
814
+ const reply = await permissionBroker.request({ runId, provider: 'opencode', signal: activeAbort?.signal, ...request });
815
+ return reply && typeof reply === 'object' ? reply : { behavior: 'deny' };
816
+ } catch (error) {
817
+ return { behavior: 'deny', message: providerErrorMessage(error, 'Permission request failed') };
818
+ }
819
+ };
820
+ const settleActiveTurn = (error = null, payload = null) => {
821
+ const turn = activeTurn;
822
+ if (!turn || turn.mode !== 'async' || turn.settled) return;
823
+ turn.settled = true;
824
+ if (error) turn.reject(error);
825
+ else turn.resolve({ providerSessionId: sessionId, ...(payload || {}) });
826
+ };
827
+ const finishTurnWithText = () => {
828
+ const turn = activeTurn;
829
+ if (!turn || turn.mode !== 'async' || turn.settled || turn.finishing) return;
830
+ turn.finishing = true;
831
+ fetchAssistantText()
832
+ .then((text) => settleActiveTurn(null, { text, result: { text }, ...turnMedia() }))
833
+ .catch(() => settleActiveTurn(null, { text: '', result: { text: '' }, ...turnMedia() }));
834
+ };
835
+ const unsubscribe = eventSource?.onEvent?.((envelope) => {
836
+ const event = envelope?.event || {};
837
+ const sid = event.sessionID || event.sessionId || event.part?.sessionID || event.info?.sessionID
838
+ || event.info?.id || event.session?.id || null;
839
+ const eventType = envelope?.eventType || '';
840
+ if (!sessionId) return;
841
+ if (sid && sid !== sessionId) {
842
+ // Another session on the run's own isolated serve is a child (a `task` sub-agent): its
843
+ // messages are forwarded for the usage meter only. Turn control, permissions and questions
844
+ // stay with the run's own session.
845
+ if (/^(message[.:]updated|session[.:](created|updated))$/i.test(eventType)) {
846
+ onEvent({ provider: 'opencode', runId, eventType, event, childSession: true });
847
+ }
848
+ return;
849
+ }
850
+ if (/^message[.:]updated$/i.test(eventType)) rememberMessage(event.info || event.message?.info || null);
851
+ if (/^message[.:]part[.:]updated$/i.test(eventType)) rememberPart(event.part || null);
852
+ if (/question\.asked/i.test(eventType)) {
853
+ const requestID = event.id || event.requestID;
854
+ if (requestID && askMode && client.question?.reply) {
855
+ brokerRequest({ kind: 'ask', toolName: 'question', input: event, questions: event.questions || [] })
856
+ .then((reply) => {
857
+ if (reply.behavior === 'allow') {
858
+ return client.question.reply({ requestID, answers: reply.answers || [], directory: cwd || undefined });
859
+ }
860
+ return client.question?.reject?.({ requestID, directory: cwd || undefined });
861
+ })
862
+ .catch(() => {});
863
+ } else if (requestID && client.question?.reject) {
864
+ client.question.reject({ requestID, directory: cwd || undefined }).catch(() => {});
865
+ }
866
+ }
867
+ if (/permission\.asked/i.test(eventType)) {
868
+ const requestID = event.id || event.requestID || event.permissionID;
869
+ if (requestID && askMode && client.permission?.reply) {
870
+ brokerRequest({ kind: 'tool', toolName: event.permission || event.type || 'permission', input: event })
871
+ .then((reply) => {
872
+ const decision = reply.behavior === 'allow' ? (reply.always ? 'always' : 'once') : 'reject';
873
+ return client.permission.reply({ requestID, reply: decision, directory: cwd || undefined });
874
+ })
875
+ .catch(() => {});
876
+ } else if (requestID && client.permission?.reply) {
877
+ client.permission.reply({ requestID, reply: 'always', directory: cwd || undefined }).catch(() => {});
878
+ }
879
+ }
880
+ // promptAsync acknowledges immediately, so the durable SSE stream is the
881
+ // source of truth for turn completion. This avoids holding a five-minute
882
+ // synchronous fetch open and misclassifying a long, healthy turn as
883
+ // `native:iteration-error | fetch failed`.
884
+ const ownsTurnEvent = !!sid && sid === sessionId;
885
+ if (ownsTurnEvent && /^session[.:]idle$/i.test(eventType)) finishTurnWithText();
886
+ if (ownsTurnEvent && /^session[.:]error$/i.test(eventType)) {
887
+ const detail = providerErrorMessage(
888
+ event.error || event.info?.error || event.data?.error || event,
889
+ 'OpenCode session failed',
890
+ );
891
+ settleActiveTurn(new Error(String(detail)));
892
+ }
893
+ onEvent({ provider: 'opencode', runId, eventType, event });
894
+ }) || (() => {});
895
+ try {
896
+ await client.waitUntilConnected?.(10_000);
897
+ const created = await client.session.create({ directory: cwd || undefined, title: title || 'SynaBun automation' });
898
+ sessionId = created?.data?.id || created?.data?.sessionID || created?.id || created?.sessionID;
899
+ if (!sessionId) throw new Error('OpenCode did not return a session id');
900
+ onIdentity({ providerSessionId: sessionId });
901
+ } catch (error) {
902
+ try { unsubscribe(); } catch {}
903
+ await release().catch(() => {});
904
+ throw error;
905
+ }
906
+
907
+ // What the serve stored, for the usage meter's reconcile at a turn's end (assistant-usage.js).
908
+ // A call that fails, times out or is missing on an older serve throws: the caller then knows
909
+ // the turn was not reconciled.
910
+ const storedRows = async (method, id) => {
911
+ if (typeof client.session?.[method] !== 'function') throw new Error(`OpenCode session.${method} is not available`);
912
+ const response = await settleWithin(client.session[method]({ sessionID: id, directory: cwd || undefined }), 5000);
913
+ if (!response || response.error) throw new Error(providerErrorMessage(response?.error, `OpenCode session.${method} did not answer`));
914
+ const rows = Array.isArray(response.data) ? response.data : Array.isArray(response) ? response : null;
915
+ if (!rows) throw new Error(`OpenCode session.${method} returned no list`);
916
+ return rows;
917
+ };
918
+
919
+ return {
920
+ identity: () => ({ providerSessionId: sessionId }),
921
+ isAlive: () => alive,
922
+ describe: () => ({ provider: 'opencode', permissionPolicy, capability, askMode }),
923
+ /** { children(sessionId) → sessions, messages(sessionId) → [{ info }] } on this run's own serve. */
924
+ usageFetchers: () => ({
925
+ children: (id) => storedRows('children', id),
926
+ messages: (id) => storedRows('messages', id),
927
+ }),
928
+ async runTurn(prompt, meta = {}) {
929
+ if (!alive) throw new Error('OpenCode native loop is closed');
930
+ if (activeTurn) throw new Error('OpenCode native loop already has an active turn');
931
+ await client.waitUntilConnected?.(10_000);
932
+ activeAbort = new AbortController();
933
+ const request = {
934
+ sessionID: sessionId,
935
+ parts: [{ type: 'text', text: prompt }],
936
+ model: normalizeOpenCodeModel(model),
937
+ agent: capability === 'read-only' ? 'plan' : (agent ? String(agent) : 'build'),
938
+ directory: cwd || undefined,
939
+ signal: activeAbort.signal,
940
+ };
941
+ // Loops predate variants and may carry Claude-style effort names; only
942
+ // assistant task runs (routed with catalog-validated efforts) send one.
943
+ if (effort && runMode === 'task') request.variant = String(effort);
944
+ const schema = meta.outputSchema || outputSchema;
945
+ if (schema && typeof schema === 'object') request.format = { type: 'json_schema', schema };
946
+ const validateResponse = (response) => {
947
+ const assistantError = response?.data?.info?.error;
948
+ if (response?.error || assistantError || (Number(response?.status) >= 400)) {
949
+ const detail = providerErrorMessage(
950
+ response?.error || assistantError || response?.data?.error,
951
+ `OpenCode prompt failed (${response?.status || 'unknown status'})`,
952
+ );
953
+ throw new Error(String(detail));
954
+ }
955
+ };
956
+
957
+ // Newer OpenCode serves expose promptAsync. Prefer it so an unattended
958
+ // browser turn can run for as long as its loop budget without sitting
959
+ // behind the SDK's synchronous fetch timeout. Retain the synchronous path
960
+ // for older installed OpenCode versions.
961
+ if (client.session.promptAsync) {
962
+ let resolveTurn;
963
+ let rejectTurn;
964
+ const completion = new Promise((resolve, reject) => {
965
+ resolveTurn = resolve;
966
+ rejectTurn = reject;
967
+ });
968
+ // Abort may arrive while promptAsync's acknowledgement is still in
969
+ // flight. Attach a handler immediately so that early rejection is not
970
+ // reported as an unhandled promise before runTurn begins awaiting it.
971
+ completion.catch(() => {});
972
+ const turn = {
973
+ mode: 'async', completion,
974
+ resolve: resolveTurn, reject: rejectTurn, settled: false,
975
+ };
976
+ activeTurn = turn;
977
+ try {
978
+ const response = await client.session.promptAsync(request);
979
+ validateResponse(response);
980
+ return await completion;
981
+ } finally {
982
+ if (activeTurn === turn) activeTurn = null;
983
+ activeAbort = null;
984
+ }
985
+ }
986
+
987
+ const turn = { mode: 'sync' };
988
+ activeTurn = turn;
989
+ try {
990
+ const response = await client.session.prompt(request);
991
+ validateResponse(response);
992
+ const text = extractOpenCodeText(response);
993
+ const replyParts = Array.isArray(response?.data?.parts) && response?.data?.info?.role !== 'user' ? response.data.parts : [];
994
+ return { providerSessionId: sessionId, text, result: { text }, ...turnMedia(replyParts) };
995
+ } finally {
996
+ if (activeTurn === turn) activeTurn = null;
997
+ activeAbort = null;
998
+ }
999
+ },
1000
+ async abort(reason = 'aborted') {
1001
+ if (activeAbort) activeAbort.abort(asAbortError(reason));
1002
+ settleActiveTurn(asAbortError(reason));
1003
+ try {
1004
+ await settleWithin(client.session.abort({ sessionID: sessionId, directory: cwd || undefined }));
1005
+ } catch {}
1006
+ return true;
1007
+ },
1008
+ async dispose() {
1009
+ alive = false;
1010
+ if (activeAbort) activeAbort.abort(asAbortError('disposed'));
1011
+ settleActiveTurn(asAbortError('disposed'));
1012
+ try { unsubscribe(); } catch {}
1013
+ await settleWithin(release());
1014
+ },
1015
+ };
1016
+ }