synabun 1.3.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1163) hide show
  1. package/CHANGELOG.md +205 -662
  2. package/LICENSE-COMMERCIAL.md +33 -0
  3. package/NOTICE +17 -0
  4. package/README.md +175 -853
  5. package/THIRD-PARTY-LICENSES.md +136 -0
  6. package/benchmarks/browser-live-results.json +79 -0
  7. package/benchmarks/browser-v2-results.json +258 -0
  8. package/benchmarks/fixtures/browser/README.md +57 -0
  9. package/benchmarks/fixtures/browser/page-state.json +132 -0
  10. package/benchmarks/fixtures/browser/social.json +92 -0
  11. package/benchmarks/fixtures/browser/target.json +319 -0
  12. package/benchmarks/fixtures/desktop/README.md +58 -0
  13. package/benchmarks/fixtures/desktop/abstention.json +59 -0
  14. package/benchmarks/fixtures/desktop/adversarial.json +22 -0
  15. package/benchmarks/fixtures/desktop/forbidden.json +93 -0
  16. package/benchmarks/fixtures/desktop/generate.mjs +1023 -0
  17. package/benchmarks/fixtures/desktop/target.json +136 -0
  18. package/bin/synabun.js +30 -0
  19. package/docs/whatsapp.md +325 -0
  20. package/hooks/claude-code/post-plan.mjs +613 -391
  21. package/hooks/claude-code/post-remember.mjs +246 -122
  22. package/hooks/claude-code/pre-compact.mjs +171 -110
  23. package/hooks/claude-code/pre-task.mjs +133 -0
  24. package/hooks/claude-code/pre-websearch.mjs +15 -4
  25. package/hooks/claude-code/prompt-origin.mjs +94 -0
  26. package/hooks/claude-code/prompt-submit.mjs +1244 -861
  27. package/hooks/claude-code/session-start.mjs +114 -156
  28. package/hooks/claude-code/shared.mjs +1228 -368
  29. package/hooks/claude-code/state.mjs +167 -0
  30. package/hooks/claude-code/stop.mjs +515 -140
  31. package/hooks/claude-code/subagent-start.mjs +154 -0
  32. package/hooks/claude-code/subagent-stop.mjs +102 -0
  33. package/hooks/claude-code/task-gate.mjs +150 -0
  34. package/launcher.mjs +40 -0
  35. package/lib/claude-hooks.js +137 -0
  36. package/lib/claude-usage-audit.js +141 -0
  37. package/lib/client-config-repair.js +145 -0
  38. package/lib/data-home-migration.js +502 -0
  39. package/lib/desktop-pwa.js +206 -0
  40. package/lib/external-tools.js +221 -0
  41. package/lib/first-launch-protection.js +245 -0
  42. package/lib/packaged-runtime.js +110 -0
  43. package/lib/paths.d.ts +21 -0
  44. package/lib/paths.js +103 -0
  45. package/lib/start-launcher.js +1309 -0
  46. package/mcp-server/dist/config.d.ts +22 -0
  47. package/mcp-server/dist/config.d.ts.map +1 -0
  48. package/mcp-server/dist/config.js +109 -0
  49. package/mcp-server/dist/config.js.map +1 -0
  50. package/mcp-server/dist/http.d.ts +30 -0
  51. package/mcp-server/dist/http.d.ts.map +1 -0
  52. package/mcp-server/dist/http.js +276 -0
  53. package/mcp-server/dist/http.js.map +1 -0
  54. package/mcp-server/dist/index.d.ts +48 -0
  55. package/mcp-server/dist/index.d.ts.map +1 -0
  56. package/mcp-server/dist/index.js +538 -0
  57. package/mcp-server/dist/index.js.map +1 -0
  58. package/mcp-server/dist/preload-http.d.ts +3 -0
  59. package/mcp-server/dist/preload-http.d.ts.map +1 -0
  60. package/mcp-server/dist/preload-http.js +28 -0
  61. package/mcp-server/dist/preload-http.js.map +1 -0
  62. package/mcp-server/dist/preload.d.ts +3 -0
  63. package/mcp-server/dist/preload.d.ts.map +1 -0
  64. package/mcp-server/dist/preload.js +32 -0
  65. package/mcp-server/dist/preload.js.map +1 -0
  66. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts +19 -0
  67. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts.map +1 -0
  68. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js +403 -0
  69. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js.map +1 -0
  70. package/mcp-server/dist/scripts/setup-embeddings.d.ts +3 -0
  71. package/mcp-server/dist/scripts/setup-embeddings.d.ts.map +1 -0
  72. package/mcp-server/dist/scripts/setup-embeddings.js +15 -0
  73. package/mcp-server/dist/scripts/setup-embeddings.js.map +1 -0
  74. package/mcp-server/dist/services/assistant-judgments.d.ts +79 -0
  75. package/mcp-server/dist/services/assistant-judgments.d.ts.map +1 -0
  76. package/mcp-server/dist/services/assistant-judgments.js +128 -0
  77. package/mcp-server/dist/services/assistant-judgments.js.map +1 -0
  78. package/mcp-server/dist/services/browser-assist-gate.d.ts +314 -0
  79. package/mcp-server/dist/services/browser-assist-gate.d.ts.map +1 -0
  80. package/mcp-server/dist/services/browser-assist-gate.js +344 -0
  81. package/mcp-server/dist/services/browser-assist-gate.js.map +1 -0
  82. package/mcp-server/dist/services/browser-assist.d.ts +104 -0
  83. package/mcp-server/dist/services/browser-assist.d.ts.map +1 -0
  84. package/mcp-server/dist/services/browser-assist.js +282 -0
  85. package/mcp-server/dist/services/browser-assist.js.map +1 -0
  86. package/mcp-server/dist/services/browser-bench.d.ts +772 -0
  87. package/mcp-server/dist/services/browser-bench.d.ts.map +1 -0
  88. package/mcp-server/dist/services/browser-bench.js +424 -0
  89. package/mcp-server/dist/services/browser-bench.js.map +1 -0
  90. package/mcp-server/dist/services/browser-judgments.d.ts +196 -0
  91. package/mcp-server/dist/services/browser-judgments.d.ts.map +1 -0
  92. package/mcp-server/dist/services/browser-judgments.js +363 -0
  93. package/mcp-server/dist/services/browser-judgments.js.map +1 -0
  94. package/mcp-server/dist/services/browser-risk.d.ts +166 -0
  95. package/mcp-server/dist/services/browser-risk.d.ts.map +1 -0
  96. package/mcp-server/dist/services/browser-risk.js +458 -0
  97. package/mcp-server/dist/services/browser-risk.js.map +1 -0
  98. package/mcp-server/dist/services/categories.d.ts +61 -0
  99. package/mcp-server/dist/services/categories.d.ts.map +1 -0
  100. package/mcp-server/dist/services/categories.js +377 -0
  101. package/mcp-server/dist/services/categories.js.map +1 -0
  102. package/mcp-server/dist/services/codex-config-heal.d.ts +49 -0
  103. package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -0
  104. package/mcp-server/dist/services/codex-config-heal.js +346 -0
  105. package/mcp-server/dist/services/codex-config-heal.js.map +1 -0
  106. package/mcp-server/dist/services/desktop-assist-gate.d.ts +198 -0
  107. package/mcp-server/dist/services/desktop-assist-gate.d.ts.map +1 -0
  108. package/mcp-server/dist/services/desktop-assist-gate.js +202 -0
  109. package/mcp-server/dist/services/desktop-assist-gate.js.map +1 -0
  110. package/mcp-server/dist/services/desktop-assist.d.ts +104 -0
  111. package/mcp-server/dist/services/desktop-assist.d.ts.map +1 -0
  112. package/mcp-server/dist/services/desktop-assist.js +266 -0
  113. package/mcp-server/dist/services/desktop-assist.js.map +1 -0
  114. package/mcp-server/dist/services/desktop-bench.d.ts +553 -0
  115. package/mcp-server/dist/services/desktop-bench.d.ts.map +1 -0
  116. package/mcp-server/dist/services/desktop-bench.js +311 -0
  117. package/mcp-server/dist/services/desktop-bench.js.map +1 -0
  118. package/mcp-server/dist/services/desktop-client.d.ts +23 -0
  119. package/mcp-server/dist/services/desktop-client.d.ts.map +1 -0
  120. package/mcp-server/dist/services/desktop-client.js +79 -0
  121. package/mcp-server/dist/services/desktop-client.js.map +1 -0
  122. package/mcp-server/dist/services/desktop-judgments.d.ts +125 -0
  123. package/mcp-server/dist/services/desktop-judgments.d.ts.map +1 -0
  124. package/mcp-server/dist/services/desktop-judgments.js +177 -0
  125. package/mcp-server/dist/services/desktop-judgments.js.map +1 -0
  126. package/mcp-server/dist/services/desktop-risk.d.ts +283 -0
  127. package/mcp-server/dist/services/desktop-risk.d.ts.map +1 -0
  128. package/mcp-server/dist/services/desktop-risk.js +605 -0
  129. package/mcp-server/dist/services/desktop-risk.js.map +1 -0
  130. package/mcp-server/dist/services/discord.d.ts +112 -0
  131. package/mcp-server/dist/services/discord.d.ts.map +1 -0
  132. package/mcp-server/dist/services/discord.js +477 -0
  133. package/mcp-server/dist/services/discord.js.map +1 -0
  134. package/mcp-server/dist/services/edit-stale.d.ts +81 -0
  135. package/mcp-server/dist/services/edit-stale.d.ts.map +1 -0
  136. package/mcp-server/dist/services/edit-stale.js +358 -0
  137. package/mcp-server/dist/services/edit-stale.js.map +1 -0
  138. package/mcp-server/dist/services/embedding-service.d.ts +16 -0
  139. package/mcp-server/dist/services/embedding-service.d.ts.map +1 -0
  140. package/mcp-server/dist/services/embedding-service.js +126 -0
  141. package/mcp-server/dist/services/embedding-service.js.map +1 -0
  142. package/mcp-server/dist/services/embedding-worker.d.ts +2 -0
  143. package/mcp-server/dist/services/embedding-worker.d.ts.map +1 -0
  144. package/mcp-server/dist/services/embedding-worker.js +52 -0
  145. package/mcp-server/dist/services/embedding-worker.js.map +1 -0
  146. package/mcp-server/dist/services/fb-regions.d.ts +71 -0
  147. package/mcp-server/dist/services/fb-regions.d.ts.map +1 -0
  148. package/mcp-server/dist/services/fb-regions.js +211 -0
  149. package/mcp-server/dist/services/fb-regions.js.map +1 -0
  150. package/mcp-server/dist/services/file-checksums.d.ts +22 -0
  151. package/mcp-server/dist/services/file-checksums.d.ts.map +1 -0
  152. package/mcp-server/dist/services/file-checksums.js +55 -0
  153. package/mcp-server/dist/services/file-checksums.js.map +1 -0
  154. package/mcp-server/dist/services/file-excerpt.d.ts +24 -0
  155. package/mcp-server/dist/services/file-excerpt.d.ts.map +1 -0
  156. package/mcp-server/dist/services/file-excerpt.js +65 -0
  157. package/mcp-server/dist/services/file-excerpt.js.map +1 -0
  158. package/mcp-server/dist/services/identity.d.ts +124 -0
  159. package/mcp-server/dist/services/identity.d.ts.map +1 -0
  160. package/mcp-server/dist/services/identity.js +241 -0
  161. package/mcp-server/dist/services/identity.js.map +1 -0
  162. package/mcp-server/dist/services/local-embeddings.d.ts +2 -0
  163. package/mcp-server/dist/services/local-embeddings.d.ts.map +1 -0
  164. package/mcp-server/dist/services/local-embeddings.js +3 -0
  165. package/mcp-server/dist/services/local-embeddings.js.map +1 -0
  166. package/mcp-server/dist/services/memory-client.d.ts +4 -0
  167. package/mcp-server/dist/services/memory-client.d.ts.map +1 -0
  168. package/mcp-server/dist/services/memory-client.js +27 -0
  169. package/mcp-server/dist/services/memory-client.js.map +1 -0
  170. package/mcp-server/dist/services/memory-judge-backfill.d.ts +135 -0
  171. package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -0
  172. package/mcp-server/dist/services/memory-judge-backfill.js +510 -0
  173. package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -0
  174. package/mcp-server/dist/services/memory-judgments.d.ts +362 -0
  175. package/mcp-server/dist/services/memory-judgments.d.ts.map +1 -0
  176. package/mcp-server/dist/services/memory-judgments.js +674 -0
  177. package/mcp-server/dist/services/memory-judgments.js.map +1 -0
  178. package/mcp-server/dist/services/memory-maintenance.d.ts +108 -0
  179. package/mcp-server/dist/services/memory-maintenance.d.ts.map +1 -0
  180. package/mcp-server/dist/services/memory-maintenance.js +403 -0
  181. package/mcp-server/dist/services/memory-maintenance.js.map +1 -0
  182. package/mcp-server/dist/services/memory-retrieval.d.ts +66 -0
  183. package/mcp-server/dist/services/memory-retrieval.d.ts.map +1 -0
  184. package/mcp-server/dist/services/memory-retrieval.js +412 -0
  185. package/mcp-server/dist/services/memory-retrieval.js.map +1 -0
  186. package/mcp-server/dist/services/memory-schema.d.ts +16 -0
  187. package/mcp-server/dist/services/memory-schema.d.ts.map +1 -0
  188. package/mcp-server/dist/services/memory-schema.js +282 -0
  189. package/mcp-server/dist/services/memory-schema.js.map +1 -0
  190. package/mcp-server/dist/services/memory-sessions.d.ts +24 -0
  191. package/mcp-server/dist/services/memory-sessions.d.ts.map +1 -0
  192. package/mcp-server/dist/services/memory-sessions.js +110 -0
  193. package/mcp-server/dist/services/memory-sessions.js.map +1 -0
  194. package/mcp-server/dist/services/memory-triage.d.ts +60 -0
  195. package/mcp-server/dist/services/memory-triage.d.ts.map +1 -0
  196. package/mcp-server/dist/services/memory-triage.js +189 -0
  197. package/mcp-server/dist/services/memory-triage.js.map +1 -0
  198. package/mcp-server/dist/services/memory-verification.d.ts +24 -0
  199. package/mcp-server/dist/services/memory-verification.d.ts.map +1 -0
  200. package/mcp-server/dist/services/memory-verification.js +92 -0
  201. package/mcp-server/dist/services/memory-verification.js.map +1 -0
  202. package/mcp-server/dist/services/memory-writer.d.ts +26 -0
  203. package/mcp-server/dist/services/memory-writer.d.ts.map +1 -0
  204. package/mcp-server/dist/services/memory-writer.js +126 -0
  205. package/mcp-server/dist/services/memory-writer.js.map +1 -0
  206. package/mcp-server/dist/services/neural-interface.d.ts +439 -0
  207. package/mcp-server/dist/services/neural-interface.d.ts.map +1 -0
  208. package/mcp-server/dist/services/neural-interface.js +1135 -0
  209. package/mcp-server/dist/services/neural-interface.js.map +1 -0
  210. package/mcp-server/dist/services/profiles.d.ts +120 -0
  211. package/mcp-server/dist/services/profiles.d.ts.map +1 -0
  212. package/mcp-server/dist/services/profiles.js +387 -0
  213. package/mcp-server/dist/services/profiles.js.map +1 -0
  214. package/mcp-server/dist/services/secret-gate.d.ts +29 -0
  215. package/mcp-server/dist/services/secret-gate.d.ts.map +1 -0
  216. package/mcp-server/dist/services/secret-gate.js +43 -0
  217. package/mcp-server/dist/services/secret-gate.js.map +1 -0
  218. package/mcp-server/dist/services/server-instructions.d.ts +10 -0
  219. package/mcp-server/dist/services/server-instructions.d.ts.map +1 -0
  220. package/mcp-server/dist/services/server-instructions.js +101 -0
  221. package/mcp-server/dist/services/server-instructions.js.map +1 -0
  222. package/mcp-server/dist/services/sqlite.d.ts +235 -0
  223. package/mcp-server/dist/services/sqlite.d.ts.map +1 -0
  224. package/mcp-server/dist/services/sqlite.js +1185 -0
  225. package/mcp-server/dist/services/sqlite.js.map +1 -0
  226. package/mcp-server/dist/services/typesafe-bench.d.ts +99 -0
  227. package/mcp-server/dist/services/typesafe-bench.d.ts.map +1 -0
  228. package/mcp-server/dist/services/typesafe-bench.js +218 -0
  229. package/mcp-server/dist/services/typesafe-bench.js.map +1 -0
  230. package/mcp-server/dist/services/typesafe-config.d.ts +342 -0
  231. package/mcp-server/dist/services/typesafe-config.d.ts.map +1 -0
  232. package/mcp-server/dist/services/typesafe-config.js +746 -0
  233. package/mcp-server/dist/services/typesafe-config.js.map +1 -0
  234. package/mcp-server/dist/services/typesafe.d.ts +213 -0
  235. package/mcp-server/dist/services/typesafe.d.ts.map +1 -0
  236. package/mcp-server/dist/services/typesafe.js +330 -0
  237. package/mcp-server/dist/services/typesafe.js.map +1 -0
  238. package/mcp-server/dist/services/vector-cache.d.ts +68 -0
  239. package/mcp-server/dist/services/vector-cache.d.ts.map +1 -0
  240. package/mcp-server/dist/services/vector-cache.js +271 -0
  241. package/mcp-server/dist/services/vector-cache.js.map +1 -0
  242. package/mcp-server/dist/services/whiteboard-geometry.d.ts +305 -0
  243. package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -0
  244. package/mcp-server/dist/services/whiteboard-geometry.js +666 -0
  245. package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -0
  246. package/mcp-server/dist/tools/agents.d.ts +212 -0
  247. package/mcp-server/dist/tools/agents.d.ts.map +1 -0
  248. package/mcp-server/dist/tools/agents.js +407 -0
  249. package/mcp-server/dist/tools/agents.js.map +1 -0
  250. package/mcp-server/dist/tools/bluesky.d.ts +39 -0
  251. package/mcp-server/dist/tools/bluesky.d.ts.map +1 -0
  252. package/mcp-server/dist/tools/bluesky.js +1144 -0
  253. package/mcp-server/dist/tools/bluesky.js.map +1 -0
  254. package/mcp-server/dist/tools/browser-advanced.d.ts +58 -0
  255. package/mcp-server/dist/tools/browser-advanced.d.ts.map +1 -0
  256. package/mcp-server/dist/tools/browser-advanced.js +106 -0
  257. package/mcp-server/dist/tools/browser-advanced.js.map +1 -0
  258. package/mcp-server/dist/tools/browser-batch.d.ts +99 -0
  259. package/mcp-server/dist/tools/browser-batch.d.ts.map +1 -0
  260. package/mcp-server/dist/tools/browser-batch.js +187 -0
  261. package/mcp-server/dist/tools/browser-batch.js.map +1 -0
  262. package/mcp-server/dist/tools/browser-cheatsheet.d.ts +21 -0
  263. package/mcp-server/dist/tools/browser-cheatsheet.d.ts.map +1 -0
  264. package/mcp-server/dist/tools/browser-cheatsheet.js +144 -0
  265. package/mcp-server/dist/tools/browser-cheatsheet.js.map +1 -0
  266. package/mcp-server/dist/tools/browser-interact.d.ts +239 -0
  267. package/mcp-server/dist/tools/browser-interact.d.ts.map +1 -0
  268. package/mcp-server/dist/tools/browser-interact.js +300 -0
  269. package/mcp-server/dist/tools/browser-interact.js.map +1 -0
  270. package/mcp-server/dist/tools/browser-navigate.d.ts +90 -0
  271. package/mcp-server/dist/tools/browser-navigate.d.ts.map +1 -0
  272. package/mcp-server/dist/tools/browser-navigate.js +142 -0
  273. package/mcp-server/dist/tools/browser-navigate.js.map +1 -0
  274. package/mcp-server/dist/tools/browser-observe.d.ts +561 -0
  275. package/mcp-server/dist/tools/browser-observe.d.ts.map +1 -0
  276. package/mcp-server/dist/tools/browser-observe.js +2009 -0
  277. package/mcp-server/dist/tools/browser-observe.js.map +1 -0
  278. package/mcp-server/dist/tools/browser.d.ts +34 -0
  279. package/mcp-server/dist/tools/browser.d.ts.map +1 -0
  280. package/mcp-server/dist/tools/browser.js +112 -0
  281. package/mcp-server/dist/tools/browser.js.map +1 -0
  282. package/mcp-server/dist/tools/card-tools.d.ts +82 -0
  283. package/mcp-server/dist/tools/card-tools.d.ts.map +1 -0
  284. package/mcp-server/dist/tools/card-tools.js +137 -0
  285. package/mcp-server/dist/tools/card-tools.js.map +1 -0
  286. package/mcp-server/dist/tools/card.d.ts +8 -0
  287. package/mcp-server/dist/tools/card.d.ts.map +1 -0
  288. package/mcp-server/dist/tools/card.js +16 -0
  289. package/mcp-server/dist/tools/card.js.map +1 -0
  290. package/mcp-server/dist/tools/category.d.ts +32 -0
  291. package/mcp-server/dist/tools/category.d.ts.map +1 -0
  292. package/mcp-server/dist/tools/category.js +290 -0
  293. package/mcp-server/dist/tools/category.js.map +1 -0
  294. package/mcp-server/dist/tools/choice.d.ts +160 -0
  295. package/mcp-server/dist/tools/choice.d.ts.map +1 -0
  296. package/mcp-server/dist/tools/choice.js +80 -0
  297. package/mcp-server/dist/tools/choice.js.map +1 -0
  298. package/mcp-server/dist/tools/computer.d.ts +71 -0
  299. package/mcp-server/dist/tools/computer.d.ts.map +1 -0
  300. package/mcp-server/dist/tools/computer.js +174 -0
  301. package/mcp-server/dist/tools/computer.js.map +1 -0
  302. package/mcp-server/dist/tools/discord-channel.d.ts +44 -0
  303. package/mcp-server/dist/tools/discord-channel.d.ts.map +1 -0
  304. package/mcp-server/dist/tools/discord-channel.js +236 -0
  305. package/mcp-server/dist/tools/discord-channel.js.map +1 -0
  306. package/mcp-server/dist/tools/discord-guild.d.ts +20 -0
  307. package/mcp-server/dist/tools/discord-guild.d.ts.map +1 -0
  308. package/mcp-server/dist/tools/discord-guild.js +138 -0
  309. package/mcp-server/dist/tools/discord-guild.js.map +1 -0
  310. package/mcp-server/dist/tools/discord-member.d.ts +26 -0
  311. package/mcp-server/dist/tools/discord-member.d.ts.map +1 -0
  312. package/mcp-server/dist/tools/discord-member.js +122 -0
  313. package/mcp-server/dist/tools/discord-member.js.map +1 -0
  314. package/mcp-server/dist/tools/discord-message.d.ts +36 -0
  315. package/mcp-server/dist/tools/discord-message.d.ts.map +1 -0
  316. package/mcp-server/dist/tools/discord-message.js +184 -0
  317. package/mcp-server/dist/tools/discord-message.js.map +1 -0
  318. package/mcp-server/dist/tools/discord-onboarding.d.ts +32 -0
  319. package/mcp-server/dist/tools/discord-onboarding.d.ts.map +1 -0
  320. package/mcp-server/dist/tools/discord-onboarding.js +179 -0
  321. package/mcp-server/dist/tools/discord-onboarding.js.map +1 -0
  322. package/mcp-server/dist/tools/discord-role.d.ts +34 -0
  323. package/mcp-server/dist/tools/discord-role.d.ts.map +1 -0
  324. package/mcp-server/dist/tools/discord-role.js +178 -0
  325. package/mcp-server/dist/tools/discord-role.js.map +1 -0
  326. package/mcp-server/dist/tools/discord-thread.d.ts +28 -0
  327. package/mcp-server/dist/tools/discord-thread.d.ts.map +1 -0
  328. package/mcp-server/dist/tools/discord-thread.js +88 -0
  329. package/mcp-server/dist/tools/discord-thread.js.map +1 -0
  330. package/mcp-server/dist/tools/discord-webhook.d.ts +32 -0
  331. package/mcp-server/dist/tools/discord-webhook.d.ts.map +1 -0
  332. package/mcp-server/dist/tools/discord-webhook.js +154 -0
  333. package/mcp-server/dist/tools/discord-webhook.js.map +1 -0
  334. package/mcp-server/dist/tools/discord.d.ts +7 -0
  335. package/mcp-server/dist/tools/discord.d.ts.map +1 -0
  336. package/mcp-server/dist/tools/discord.js +25 -0
  337. package/mcp-server/dist/tools/discord.js.map +1 -0
  338. package/mcp-server/dist/tools/fb-groups.d.ts +98 -0
  339. package/mcp-server/dist/tools/fb-groups.d.ts.map +1 -0
  340. package/mcp-server/dist/tools/fb-groups.js +369 -0
  341. package/mcp-server/dist/tools/fb-groups.js.map +1 -0
  342. package/mcp-server/dist/tools/forget.d.ts +14 -0
  343. package/mcp-server/dist/tools/forget.d.ts.map +1 -0
  344. package/mcp-server/dist/tools/forget.js +26 -0
  345. package/mcp-server/dist/tools/forget.js.map +1 -0
  346. package/mcp-server/dist/tools/git-tools.d.ts +24 -0
  347. package/mcp-server/dist/tools/git-tools.d.ts.map +1 -0
  348. package/mcp-server/dist/tools/git-tools.js +107 -0
  349. package/mcp-server/dist/tools/git-tools.js.map +1 -0
  350. package/mcp-server/dist/tools/git.d.ts +7 -0
  351. package/mcp-server/dist/tools/git.d.ts.map +1 -0
  352. package/mcp-server/dist/tools/git.js +11 -0
  353. package/mcp-server/dist/tools/git.js.map +1 -0
  354. package/mcp-server/dist/tools/gsc/experience.d.ts +135 -0
  355. package/mcp-server/dist/tools/gsc/experience.d.ts.map +1 -0
  356. package/mcp-server/dist/tools/gsc/experience.js +351 -0
  357. package/mcp-server/dist/tools/gsc/experience.js.map +1 -0
  358. package/mcp-server/dist/tools/gsc/helpers.d.ts +78 -0
  359. package/mcp-server/dist/tools/gsc/helpers.d.ts.map +1 -0
  360. package/mcp-server/dist/tools/gsc/helpers.js +258 -0
  361. package/mcp-server/dist/tools/gsc/helpers.js.map +1 -0
  362. package/mcp-server/dist/tools/gsc/indexing.d.ts +121 -0
  363. package/mcp-server/dist/tools/gsc/indexing.d.ts.map +1 -0
  364. package/mcp-server/dist/tools/gsc/indexing.js +357 -0
  365. package/mcp-server/dist/tools/gsc/indexing.js.map +1 -0
  366. package/mcp-server/dist/tools/gsc/inspect.d.ts +78 -0
  367. package/mcp-server/dist/tools/gsc/inspect.d.ts.map +1 -0
  368. package/mcp-server/dist/tools/gsc/inspect.js +321 -0
  369. package/mcp-server/dist/tools/gsc/inspect.js.map +1 -0
  370. package/mcp-server/dist/tools/gsc/navigate.d.ts +44 -0
  371. package/mcp-server/dist/tools/gsc/navigate.d.ts.map +1 -0
  372. package/mcp-server/dist/tools/gsc/navigate.js +197 -0
  373. package/mcp-server/dist/tools/gsc/navigate.js.map +1 -0
  374. package/mcp-server/dist/tools/gsc/performance.d.ts +84 -0
  375. package/mcp-server/dist/tools/gsc/performance.d.ts.map +1 -0
  376. package/mcp-server/dist/tools/gsc/performance.js +274 -0
  377. package/mcp-server/dist/tools/gsc/performance.js.map +1 -0
  378. package/mcp-server/dist/tools/gsc/settings.d.ts +153 -0
  379. package/mcp-server/dist/tools/gsc/settings.d.ts.map +1 -0
  380. package/mcp-server/dist/tools/gsc/settings.js +425 -0
  381. package/mcp-server/dist/tools/gsc/settings.js.map +1 -0
  382. package/mcp-server/dist/tools/gsc.d.ts +7 -0
  383. package/mcp-server/dist/tools/gsc.d.ts.map +1 -0
  384. package/mcp-server/dist/tools/gsc.js +51 -0
  385. package/mcp-server/dist/tools/gsc.js.map +1 -0
  386. package/mcp-server/dist/tools/image-tools.d.ts +24 -0
  387. package/mcp-server/dist/tools/image-tools.d.ts.map +1 -0
  388. package/mcp-server/dist/tools/image-tools.js +80 -0
  389. package/mcp-server/dist/tools/image-tools.js.map +1 -0
  390. package/mcp-server/dist/tools/image.d.ts +10 -0
  391. package/mcp-server/dist/tools/image.d.ts.map +1 -0
  392. package/mcp-server/dist/tools/image.js +14 -0
  393. package/mcp-server/dist/tools/image.js.map +1 -0
  394. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +97 -0
  395. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +1 -0
  396. package/mcp-server/dist/tools/leonardo-browser-tools.js +228 -0
  397. package/mcp-server/dist/tools/leonardo-browser-tools.js.map +1 -0
  398. package/mcp-server/dist/tools/leonardo.d.ts +13 -0
  399. package/mcp-server/dist/tools/leonardo.d.ts.map +1 -0
  400. package/mcp-server/dist/tools/leonardo.js +21 -0
  401. package/mcp-server/dist/tools/leonardo.js.map +1 -0
  402. package/mcp-server/dist/tools/loop.d.ts +30 -0
  403. package/mcp-server/dist/tools/loop.d.ts.map +1 -0
  404. package/mcp-server/dist/tools/loop.js +401 -0
  405. package/mcp-server/dist/tools/loop.js.map +1 -0
  406. package/mcp-server/dist/tools/memories.d.ts +56 -0
  407. package/mcp-server/dist/tools/memories.d.ts.map +1 -0
  408. package/mcp-server/dist/tools/memories.js +171 -0
  409. package/mcp-server/dist/tools/memories.js.map +1 -0
  410. package/mcp-server/dist/tools/morelogin.d.ts +24 -0
  411. package/mcp-server/dist/tools/morelogin.d.ts.map +1 -0
  412. package/mcp-server/dist/tools/morelogin.js +79 -0
  413. package/mcp-server/dist/tools/morelogin.js.map +1 -0
  414. package/mcp-server/dist/tools/profile.d.ts +17 -0
  415. package/mcp-server/dist/tools/profile.d.ts.map +1 -0
  416. package/mcp-server/dist/tools/profile.js +114 -0
  417. package/mcp-server/dist/tools/profile.js.map +1 -0
  418. package/mcp-server/dist/tools/recall.d.ts +71 -0
  419. package/mcp-server/dist/tools/recall.d.ts.map +1 -0
  420. package/mcp-server/dist/tools/recall.js +147 -0
  421. package/mcp-server/dist/tools/recall.js.map +1 -0
  422. package/mcp-server/dist/tools/reflect.d.ts +56 -0
  423. package/mcp-server/dist/tools/reflect.d.ts.map +1 -0
  424. package/mcp-server/dist/tools/reflect.js +157 -0
  425. package/mcp-server/dist/tools/reflect.js.map +1 -0
  426. package/mcp-server/dist/tools/remember.d.ts +62 -0
  427. package/mcp-server/dist/tools/remember.d.ts.map +1 -0
  428. package/mcp-server/dist/tools/remember.js +201 -0
  429. package/mcp-server/dist/tools/remember.js.map +1 -0
  430. package/mcp-server/dist/tools/response.d.ts +23 -0
  431. package/mcp-server/dist/tools/response.d.ts.map +1 -0
  432. package/mcp-server/dist/tools/response.js +24 -0
  433. package/mcp-server/dist/tools/response.js.map +1 -0
  434. package/mcp-server/dist/tools/restore.d.ts +14 -0
  435. package/mcp-server/dist/tools/restore.d.ts.map +1 -0
  436. package/mcp-server/dist/tools/restore.js +23 -0
  437. package/mcp-server/dist/tools/restore.js.map +1 -0
  438. package/mcp-server/dist/tools/style-guide-tools.d.ts +51 -0
  439. package/mcp-server/dist/tools/style-guide-tools.d.ts.map +1 -0
  440. package/mcp-server/dist/tools/style-guide-tools.js +231 -0
  441. package/mcp-server/dist/tools/style-guide-tools.js.map +1 -0
  442. package/mcp-server/dist/tools/style-guide.d.ts +8 -0
  443. package/mcp-server/dist/tools/style-guide.d.ts.map +1 -0
  444. package/mcp-server/dist/tools/style-guide.js +12 -0
  445. package/mcp-server/dist/tools/style-guide.js.map +1 -0
  446. package/mcp-server/dist/tools/sync.d.ts +20 -0
  447. package/mcp-server/dist/tools/sync.d.ts.map +1 -0
  448. package/mcp-server/dist/tools/sync.js +156 -0
  449. package/mcp-server/dist/tools/sync.js.map +1 -0
  450. package/mcp-server/dist/tools/tictactoe-tools.d.ts +18 -0
  451. package/mcp-server/dist/tools/tictactoe-tools.d.ts.map +1 -0
  452. package/mcp-server/dist/tools/tictactoe-tools.js +78 -0
  453. package/mcp-server/dist/tools/tictactoe-tools.js.map +1 -0
  454. package/mcp-server/dist/tools/tictactoe.d.ts +7 -0
  455. package/mcp-server/dist/tools/tictactoe.d.ts.map +1 -0
  456. package/mcp-server/dist/tools/tictactoe.js +11 -0
  457. package/mcp-server/dist/tools/tictactoe.js.map +1 -0
  458. package/mcp-server/dist/tools/utils.d.ts +19 -0
  459. package/mcp-server/dist/tools/utils.d.ts.map +1 -0
  460. package/mcp-server/dist/tools/utils.js +54 -0
  461. package/mcp-server/dist/tools/utils.js.map +1 -0
  462. package/mcp-server/dist/tools/whiteboard-format.d.ts +88 -0
  463. package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -0
  464. package/mcp-server/dist/tools/whiteboard-format.js +337 -0
  465. package/mcp-server/dist/tools/whiteboard-format.js.map +1 -0
  466. package/mcp-server/dist/tools/whiteboard-tools.d.ts +326 -0
  467. package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -0
  468. package/mcp-server/dist/tools/whiteboard-tools.js +222 -0
  469. package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -0
  470. package/mcp-server/dist/tools/whiteboard.d.ts +8 -0
  471. package/mcp-server/dist/tools/whiteboard.d.ts.map +1 -0
  472. package/mcp-server/dist/tools/whiteboard.js +16 -0
  473. package/mcp-server/dist/tools/whiteboard.js.map +1 -0
  474. package/mcp-server/dist/tools/youtube/analytics.d.ts +46 -0
  475. package/mcp-server/dist/tools/youtube/analytics.d.ts.map +1 -0
  476. package/mcp-server/dist/tools/youtube/analytics.js +83 -0
  477. package/mcp-server/dist/tools/youtube/analytics.js.map +1 -0
  478. package/mcp-server/dist/tools/youtube/dedup.d.ts +35 -0
  479. package/mcp-server/dist/tools/youtube/dedup.d.ts.map +1 -0
  480. package/mcp-server/dist/tools/youtube/dedup.js +56 -0
  481. package/mcp-server/dist/tools/youtube/dedup.js.map +1 -0
  482. package/mcp-server/dist/tools/youtube/download.d.ts +31 -0
  483. package/mcp-server/dist/tools/youtube/download.d.ts.map +1 -0
  484. package/mcp-server/dist/tools/youtube/download.js +30 -0
  485. package/mcp-server/dist/tools/youtube/download.js.map +1 -0
  486. package/mcp-server/dist/tools/youtube/helpers.d.ts +66 -0
  487. package/mcp-server/dist/tools/youtube/helpers.d.ts.map +1 -0
  488. package/mcp-server/dist/tools/youtube/helpers.js +143 -0
  489. package/mcp-server/dist/tools/youtube/helpers.js.map +1 -0
  490. package/mcp-server/dist/tools/youtube/media.d.ts +43 -0
  491. package/mcp-server/dist/tools/youtube/media.d.ts.map +1 -0
  492. package/mcp-server/dist/tools/youtube/media.js +97 -0
  493. package/mcp-server/dist/tools/youtube/media.js.map +1 -0
  494. package/mcp-server/dist/tools/youtube/metadata.d.ts +33 -0
  495. package/mcp-server/dist/tools/youtube/metadata.d.ts.map +1 -0
  496. package/mcp-server/dist/tools/youtube/metadata.js +106 -0
  497. package/mcp-server/dist/tools/youtube/metadata.js.map +1 -0
  498. package/mcp-server/dist/tools/youtube/navigate.d.ts +30 -0
  499. package/mcp-server/dist/tools/youtube/navigate.d.ts.map +1 -0
  500. package/mcp-server/dist/tools/youtube/navigate.js +71 -0
  501. package/mcp-server/dist/tools/youtube/navigate.js.map +1 -0
  502. package/mcp-server/dist/tools/youtube/playlist.d.ts +29 -0
  503. package/mcp-server/dist/tools/youtube/playlist.d.ts.map +1 -0
  504. package/mcp-server/dist/tools/youtube/playlist.js +128 -0
  505. package/mcp-server/dist/tools/youtube/playlist.js.map +1 -0
  506. package/mcp-server/dist/tools/youtube/schedule.d.ts +31 -0
  507. package/mcp-server/dist/tools/youtube/schedule.d.ts.map +1 -0
  508. package/mcp-server/dist/tools/youtube/schedule.js +147 -0
  509. package/mcp-server/dist/tools/youtube/schedule.js.map +1 -0
  510. package/mcp-server/dist/tools/youtube/source.d.ts +36 -0
  511. package/mcp-server/dist/tools/youtube/source.d.ts.map +1 -0
  512. package/mcp-server/dist/tools/youtube/source.js +85 -0
  513. package/mcp-server/dist/tools/youtube/source.js.map +1 -0
  514. package/mcp-server/dist/tools/youtube/upload.d.ts +53 -0
  515. package/mcp-server/dist/tools/youtube/upload.d.ts.map +1 -0
  516. package/mcp-server/dist/tools/youtube/upload.js +255 -0
  517. package/mcp-server/dist/tools/youtube/upload.js.map +1 -0
  518. package/mcp-server/dist/tools/youtube.d.ts +12 -0
  519. package/mcp-server/dist/tools/youtube.d.ts.map +1 -0
  520. package/mcp-server/dist/tools/youtube.js +38 -0
  521. package/mcp-server/dist/tools/youtube.js.map +1 -0
  522. package/mcp-server/dist/tui.d.ts +3 -0
  523. package/mcp-server/dist/tui.d.ts.map +1 -0
  524. package/mcp-server/dist/tui.js +806 -0
  525. package/mcp-server/dist/tui.js.map +1 -0
  526. package/mcp-server/dist/types.d.ts +77 -0
  527. package/mcp-server/dist/types.d.ts.map +1 -0
  528. package/mcp-server/dist/types.js +2 -0
  529. package/mcp-server/dist/types.js.map +1 -0
  530. package/mcp-server/package-lock.json +4798 -0
  531. package/mcp-server/package.json +55 -38
  532. package/mcp-server/run.mjs +12 -2
  533. package/mcp-server/src/config.ts +48 -3
  534. package/mcp-server/src/http.ts +296 -93
  535. package/mcp-server/src/index.ts +546 -203
  536. package/mcp-server/src/preload-http.ts +19 -18
  537. package/mcp-server/src/preload.ts +19 -18
  538. package/mcp-server/src/scripts/setup-embeddings.ts +9 -0
  539. package/mcp-server/src/services/assistant-judgments.ts +157 -0
  540. package/mcp-server/src/services/browser-assist-gate.ts +383 -0
  541. package/mcp-server/src/services/browser-assist.ts +267 -0
  542. package/mcp-server/src/services/browser-bench.ts +477 -0
  543. package/mcp-server/src/services/browser-judgments.ts +414 -0
  544. package/mcp-server/src/services/browser-risk.ts +484 -0
  545. package/mcp-server/src/services/categories.ts +36 -19
  546. package/mcp-server/src/services/codex-config-heal.ts +403 -0
  547. package/mcp-server/src/services/desktop-assist-gate.ts +251 -0
  548. package/mcp-server/src/services/desktop-assist.ts +308 -0
  549. package/mcp-server/src/services/desktop-bench.ts +372 -0
  550. package/mcp-server/src/services/desktop-client.ts +76 -0
  551. package/mcp-server/src/services/desktop-judgments.ts +218 -0
  552. package/mcp-server/src/services/desktop-risk.ts +743 -0
  553. package/mcp-server/src/services/edit-stale.ts +299 -0
  554. package/mcp-server/src/services/embedding-service.ts +108 -0
  555. package/mcp-server/src/services/embedding-worker.ts +46 -0
  556. package/mcp-server/src/services/fb-regions.ts +221 -0
  557. package/mcp-server/src/services/file-checksums.ts +26 -9
  558. package/mcp-server/src/services/file-excerpt.ts +59 -0
  559. package/mcp-server/src/services/identity.ts +291 -0
  560. package/mcp-server/src/services/local-embeddings.ts +2 -77
  561. package/mcp-server/src/services/memory-client.ts +23 -0
  562. package/mcp-server/src/services/memory-judge-backfill.ts +462 -0
  563. package/mcp-server/src/services/memory-judgments.ts +901 -0
  564. package/mcp-server/src/services/memory-maintenance.ts +360 -0
  565. package/mcp-server/src/services/memory-retrieval.ts +349 -0
  566. package/mcp-server/src/services/memory-schema.ts +280 -0
  567. package/mcp-server/src/services/memory-sessions.ts +87 -0
  568. package/mcp-server/src/services/memory-triage.ts +182 -0
  569. package/mcp-server/src/services/memory-verification.ts +68 -0
  570. package/mcp-server/src/services/memory-writer.ts +125 -0
  571. package/mcp-server/src/services/neural-interface.ts +1217 -73
  572. package/mcp-server/src/services/profiles.ts +428 -0
  573. package/mcp-server/src/services/secret-gate.ts +52 -0
  574. package/mcp-server/src/services/server-instructions.ts +122 -0
  575. package/mcp-server/src/services/sqlite.ts +1456 -823
  576. package/mcp-server/src/services/typesafe-bench.ts +247 -0
  577. package/mcp-server/src/services/typesafe-config.ts +790 -0
  578. package/mcp-server/src/services/typesafe.ts +390 -0
  579. package/mcp-server/src/services/vector-cache.ts +255 -0
  580. package/mcp-server/src/services/whiteboard-geometry.ts +711 -0
  581. package/mcp-server/src/tools/agents.ts +539 -0
  582. package/mcp-server/src/tools/bluesky.ts +1186 -0
  583. package/mcp-server/src/tools/browser-advanced.ts +15 -6
  584. package/mcp-server/src/tools/browser-batch.ts +178 -0
  585. package/mcp-server/src/tools/browser-cheatsheet.ts +155 -0
  586. package/mcp-server/src/tools/browser-interact.ts +362 -255
  587. package/mcp-server/src/tools/browser-navigate.ts +164 -77
  588. package/mcp-server/src/tools/browser-observe.ts +2222 -1330
  589. package/mcp-server/src/tools/browser.ts +181 -107
  590. package/mcp-server/src/tools/card.ts +7 -5
  591. package/mcp-server/src/tools/choice.ts +103 -0
  592. package/mcp-server/src/tools/computer.ts +190 -0
  593. package/mcp-server/src/tools/discord.ts +10 -23
  594. package/mcp-server/src/tools/fb-groups.ts +387 -0
  595. package/mcp-server/src/tools/forget.ts +1 -1
  596. package/mcp-server/src/tools/git.ts +3 -1
  597. package/mcp-server/src/tools/gsc/experience.ts +440 -0
  598. package/mcp-server/src/tools/gsc/helpers.ts +288 -0
  599. package/mcp-server/src/tools/gsc/indexing.ts +495 -0
  600. package/mcp-server/src/tools/gsc/inspect.ts +391 -0
  601. package/mcp-server/src/tools/gsc/navigate.ts +236 -0
  602. package/mcp-server/src/tools/gsc/performance.ts +352 -0
  603. package/mcp-server/src/tools/gsc/settings.ts +564 -0
  604. package/mcp-server/src/tools/gsc.ts +95 -0
  605. package/mcp-server/src/tools/image.ts +3 -1
  606. package/mcp-server/src/tools/leonardo-browser-tools.ts +47 -37
  607. package/mcp-server/src/tools/leonardo.ts +7 -5
  608. package/mcp-server/src/tools/loop.ts +118 -25
  609. package/mcp-server/src/tools/memories.ts +65 -5
  610. package/mcp-server/src/tools/morelogin.ts +81 -0
  611. package/mcp-server/src/tools/profile.ts +122 -0
  612. package/mcp-server/src/tools/recall.ts +105 -261
  613. package/mcp-server/src/tools/reflect.ts +171 -145
  614. package/mcp-server/src/tools/remember.ts +223 -115
  615. package/mcp-server/src/tools/style-guide-tools.ts +250 -0
  616. package/mcp-server/src/tools/style-guide.ts +16 -0
  617. package/mcp-server/src/tools/sync.ts +66 -9
  618. package/mcp-server/src/tools/tictactoe.ts +3 -1
  619. package/mcp-server/src/tools/utils.ts +22 -0
  620. package/mcp-server/src/tools/whiteboard-format.ts +394 -0
  621. package/mcp-server/src/tools/whiteboard-tools.ts +191 -183
  622. package/mcp-server/src/tools/whiteboard.ts +7 -5
  623. package/mcp-server/src/tools/youtube/analytics.ts +106 -0
  624. package/mcp-server/src/tools/youtube/dedup.ts +57 -0
  625. package/mcp-server/src/tools/youtube/download.ts +41 -0
  626. package/mcp-server/src/tools/youtube/helpers.ts +183 -0
  627. package/mcp-server/src/tools/youtube/media.ts +109 -0
  628. package/mcp-server/src/tools/youtube/metadata.ts +112 -0
  629. package/mcp-server/src/tools/youtube/navigate.ts +81 -0
  630. package/mcp-server/src/tools/youtube/playlist.ts +134 -0
  631. package/mcp-server/src/tools/youtube/schedule.ts +158 -0
  632. package/mcp-server/src/tools/youtube/source.ts +101 -0
  633. package/mcp-server/src/tools/youtube/upload.ts +296 -0
  634. package/mcp-server/src/tools/youtube.ts +47 -0
  635. package/mcp-server/src/tui.ts +8 -9
  636. package/neural-interface/games/TicTacToe/1.svg +1 -0
  637. package/neural-interface/games/TicTacToe/2.svg +1 -0
  638. package/neural-interface/games/TicTacToe/3.svg +1 -0
  639. package/neural-interface/games/TicTacToe/4.svg +1 -0
  640. package/neural-interface/games/TicTacToe/5.svg +1 -0
  641. package/neural-interface/games/TicTacToe/6.svg +1 -0
  642. package/neural-interface/games/TicTacToe/7.svg +1 -0
  643. package/neural-interface/games/TicTacToe/8.svg +1 -0
  644. package/neural-interface/games/TicTacToe/9.svg +1 -0
  645. package/neural-interface/games/TicTacToe/Board.svg +1 -0
  646. package/neural-interface/games/TicTacToe/Circle.svg +1 -0
  647. package/neural-interface/games/TicTacToe/Cross.svg +1 -0
  648. package/neural-interface/i18n/en.json +7022 -0
  649. package/neural-interface/i18n/pt-BR.json +7026 -0
  650. package/neural-interface/lib/assistant-api.js +1005 -0
  651. package/neural-interface/lib/assistant-attachments.js +121 -0
  652. package/neural-interface/lib/assistant-brains/claude.js +207 -0
  653. package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +43 -0
  654. package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +56 -0
  655. package/neural-interface/lib/assistant-brains/codex.js +213 -0
  656. package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +47 -0
  657. package/neural-interface/lib/assistant-brains/opencode-route-gate.js +62 -0
  658. package/neural-interface/lib/assistant-brains/opencode.js +320 -0
  659. package/neural-interface/lib/assistant-budget.js +318 -0
  660. package/neural-interface/lib/assistant-catalog.js +731 -0
  661. package/neural-interface/lib/assistant-clarify.js +664 -0
  662. package/neural-interface/lib/assistant-config.js +232 -0
  663. package/neural-interface/lib/assistant-dispatch.js +2744 -0
  664. package/neural-interface/lib/assistant-envelope.js +582 -0
  665. package/neural-interface/lib/assistant-evidence.js +236 -0
  666. package/neural-interface/lib/assistant-hidden-models.js +272 -0
  667. package/neural-interface/lib/assistant-jev.js +117 -0
  668. package/neural-interface/lib/assistant-judgments.js +111 -0
  669. package/neural-interface/lib/assistant-media.js +335 -0
  670. package/neural-interface/lib/assistant-memory.js +398 -0
  671. package/neural-interface/lib/assistant-persona.js +444 -0
  672. package/neural-interface/lib/assistant-plan-permissions.js +448 -0
  673. package/neural-interface/lib/assistant-playbooks/design.md +87 -0
  674. package/neural-interface/lib/assistant-playbooks.js +72 -0
  675. package/neural-interface/lib/assistant-pricing.js +159 -0
  676. package/neural-interface/lib/assistant-route-gate-codex.js +163 -0
  677. package/neural-interface/lib/assistant-route-gate.js +212 -0
  678. package/neural-interface/lib/assistant-router.js +1324 -0
  679. package/neural-interface/lib/assistant-runtime.js +3337 -0
  680. package/neural-interface/lib/assistant-task-prompt.js +472 -0
  681. package/neural-interface/lib/assistant-usage.js +1688 -0
  682. package/neural-interface/lib/augmented-path.js +70 -0
  683. package/neural-interface/lib/automation-storage-migration.js +54 -0
  684. package/neural-interface/lib/backup-service.js +851 -0
  685. package/neural-interface/lib/backup-zip-reader.js +262 -0
  686. package/neural-interface/lib/browser-assist-api.js +41 -0
  687. package/neural-interface/lib/browser-console.js +176 -0
  688. package/neural-interface/lib/browser-execution.js +241 -0
  689. package/neural-interface/lib/browser-extraction.js +191 -0
  690. package/neural-interface/lib/browser-language.js +83 -0
  691. package/neural-interface/lib/browser-screenshot.js +399 -0
  692. package/neural-interface/lib/browser-semantic-context.js +639 -0
  693. package/neural-interface/lib/browser-snapshots.js +192 -0
  694. package/neural-interface/lib/browser-tab-recovery.js +119 -0
  695. package/neural-interface/lib/browser-targets.js +70 -0
  696. package/neural-interface/lib/browser-tool-policy.js +926 -0
  697. package/neural-interface/lib/claude-accounts.js +230 -0
  698. package/neural-interface/lib/claude-agent-bridge.js +3203 -0
  699. package/neural-interface/lib/claude-bypass-policy.js +99 -0
  700. package/neural-interface/lib/claude-executable.js +241 -0
  701. package/neural-interface/lib/claude-history.js +429 -0
  702. package/neural-interface/lib/claude-model-catalog.js +444 -0
  703. package/neural-interface/lib/claude-panel-requests.js +165 -0
  704. package/neural-interface/lib/claude-panel-session.js +272 -0
  705. package/neural-interface/lib/claude-permission-rules.js +153 -0
  706. package/neural-interface/lib/claude-session-cleanup.js +71 -0
  707. package/neural-interface/lib/claude-session-list.js +82 -0
  708. package/neural-interface/lib/claude-session-ops.js +140 -0
  709. package/neural-interface/lib/claude-settings-view.js +51 -0
  710. package/neural-interface/lib/claude-skin-connect.js +79 -0
  711. package/neural-interface/lib/claude-stall-policy.js +7 -0
  712. package/neural-interface/lib/claude-temporary.js +435 -0
  713. package/neural-interface/lib/cli-update-planner.js +312 -0
  714. package/neural-interface/lib/codex-capabilities.d.ts +41 -0
  715. package/neural-interface/lib/codex-capabilities.js +148 -0
  716. package/neural-interface/lib/codex-collaboration-mode.js +17 -0
  717. package/neural-interface/lib/codex-compat-rpc.js +241 -0
  718. package/neural-interface/lib/codex-mcp-approvals.js +56 -0
  719. package/neural-interface/lib/codex-mcp-apps.js +47 -0
  720. package/neural-interface/lib/codex-model-context.js +202 -0
  721. package/neural-interface/lib/codex-plan-store.js +71 -0
  722. package/neural-interface/lib/codex-request-journal.js +242 -0
  723. package/neural-interface/lib/codex-runtime-path.js +213 -0
  724. package/neural-interface/lib/codex-session-catalog.js +231 -0
  725. package/neural-interface/lib/codex-session-settings.js +46 -0
  726. package/neural-interface/lib/codex-sidepanel-permissions.js +110 -0
  727. package/neural-interface/lib/codex-thread-history.js +165 -0
  728. package/neural-interface/lib/codex-user-verification.js +34 -0
  729. package/neural-interface/lib/codex-writer-lifecycle.js +152 -0
  730. package/neural-interface/lib/confined-fs.js +256 -0
  731. package/neural-interface/lib/db.js +922 -0
  732. package/neural-interface/lib/design-md.js +9 -0
  733. package/neural-interface/lib/desktop/api.js +92 -0
  734. package/neural-interface/lib/desktop/audit.js +62 -0
  735. package/neural-interface/lib/desktop/build.js +423 -0
  736. package/neural-interface/lib/desktop/config.js +606 -0
  737. package/neural-interface/lib/desktop/coords.js +76 -0
  738. package/neural-interface/lib/desktop/fake-helper.js +1192 -0
  739. package/neural-interface/lib/desktop/frames.js +77 -0
  740. package/neural-interface/lib/desktop/grants.js +84 -0
  741. package/neural-interface/lib/desktop/guards.js +170 -0
  742. package/neural-interface/lib/desktop/helper/SynabunDesktop.swift +3056 -0
  743. package/neural-interface/lib/desktop/lease.js +51 -0
  744. package/neural-interface/lib/desktop/manager.js +545 -0
  745. package/neural-interface/lib/desktop/press-contexts.js +103 -0
  746. package/neural-interface/lib/desktop/protocol.js +495 -0
  747. package/neural-interface/lib/desktop/service.js +1202 -0
  748. package/neural-interface/lib/effort-levels.js +148 -0
  749. package/neural-interface/lib/event-loop-monitor.js +67 -0
  750. package/neural-interface/lib/exec-loop-command.js +209 -0
  751. package/neural-interface/lib/folder-picker.ps1 +77 -0
  752. package/neural-interface/lib/http-guards.js +287 -0
  753. package/neural-interface/lib/jsonl-lines.js +94 -0
  754. package/neural-interface/lib/loop-logger.js +127 -0
  755. package/neural-interface/lib/mcp-client-config.js +133 -0
  756. package/neural-interface/lib/mcp-installer.js +487 -0
  757. package/neural-interface/lib/mcp-profile-refresh-coordinator.js +78 -0
  758. package/neural-interface/lib/mcp-profile-servers.js +120 -0
  759. package/neural-interface/lib/memo-cache.js +84 -0
  760. package/neural-interface/lib/memory-api.js +758 -0
  761. package/neural-interface/lib/memory-map-api.js +1150 -0
  762. package/neural-interface/lib/memory-map-layout.js +872 -0
  763. package/neural-interface/lib/memory-map-worker.js +165 -0
  764. package/neural-interface/lib/memory-session-capture.js +81 -0
  765. package/neural-interface/lib/memory-timers.js +62 -0
  766. package/neural-interface/lib/morelogin.js +301 -0
  767. package/neural-interface/lib/native-binary-runtime.js +382 -0
  768. package/neural-interface/lib/native-loop-goal.js +33 -0
  769. package/neural-interface/lib/native-loop-providers.js +1002 -0
  770. package/neural-interface/lib/native-loop-runtime.js +747 -0
  771. package/neural-interface/lib/offline-page.js +54 -0
  772. package/neural-interface/lib/opencode-hidden-models.js +113 -0
  773. package/neural-interface/lib/opencode-history.js +253 -0
  774. package/neural-interface/lib/opencode-runtime-config.js +58 -0
  775. package/neural-interface/lib/opencode-v2-client.js +486 -0
  776. package/neural-interface/lib/opencode-v2-ws-requests.js +955 -0
  777. package/neural-interface/lib/path-confine.js +213 -0
  778. package/neural-interface/lib/plugin-installer.js +264 -0
  779. package/neural-interface/lib/project-storage.js +766 -0
  780. package/neural-interface/lib/pty-host/core.js +603 -0
  781. package/neural-interface/lib/pty-host/flow.js +43 -0
  782. package/neural-interface/lib/pty-host/host.js +47 -0
  783. package/neural-interface/lib/pty-host/manager.js +360 -0
  784. package/neural-interface/lib/pty-host/protocol.js +81 -0
  785. package/neural-interface/lib/pty-host/snapshot.js +133 -0
  786. package/neural-interface/lib/remote-policy.js +582 -0
  787. package/neural-interface/lib/rulesets/api.js +175 -0
  788. package/neural-interface/lib/rulesets/fs-safe.js +245 -0
  789. package/neural-interface/lib/rulesets/installer.js +1453 -0
  790. package/neural-interface/lib/rulesets/json-edit.js +186 -0
  791. package/neural-interface/lib/rulesets/lock.js +170 -0
  792. package/neural-interface/lib/rulesets/managed-text.js +314 -0
  793. package/neural-interface/lib/rulesets/normalise.js +24 -0
  794. package/neural-interface/lib/rulesets/render.js +84 -0
  795. package/neural-interface/lib/schedule-launch-intent.js +40 -0
  796. package/neural-interface/lib/session-cache-builder.js +524 -0
  797. package/neural-interface/lib/session-chunker.js +344 -0
  798. package/neural-interface/lib/session-indexer.js +327 -0
  799. package/neural-interface/lib/session-title-generator.js +232 -0
  800. package/neural-interface/lib/skill-prompt-bridge.js +11 -0
  801. package/neural-interface/lib/style-guide/api.js +375 -0
  802. package/neural-interface/lib/style-guide/color.js +352 -0
  803. package/neural-interface/lib/style-guide/export-css.js +99 -0
  804. package/neural-interface/lib/style-guide/export-dtcg.js +209 -0
  805. package/neural-interface/lib/style-guide/export-tailwind.js +102 -0
  806. package/neural-interface/lib/style-guide/fonts.json +227 -0
  807. package/neural-interface/lib/style-guide/import.js +1268 -0
  808. package/neural-interface/lib/style-guide/pointers.js +103 -0
  809. package/neural-interface/lib/style-guide/presets.js +232 -0
  810. package/neural-interface/lib/style-guide/render-design-md.js +319 -0
  811. package/neural-interface/lib/style-guide/schema.js +848 -0
  812. package/neural-interface/lib/style-guide/security.js +43 -0
  813. package/neural-interface/lib/style-guide/store.js +491 -0
  814. package/neural-interface/lib/style-guide/summary.js +106 -0
  815. package/neural-interface/lib/style-guide/tokens.js +170 -0
  816. package/neural-interface/lib/synabun-update-plan.js +324 -0
  817. package/neural-interface/lib/synabun-version.js +179 -0
  818. package/neural-interface/lib/system-restore.js +99 -0
  819. package/neural-interface/lib/terminal-env.js +86 -0
  820. package/neural-interface/lib/ui-blob-store.js +106 -0
  821. package/neural-interface/lib/vector-cache.js +2 -0
  822. package/neural-interface/lib/virtual-socket.js +60 -0
  823. package/neural-interface/lib/whatsapp/api.js +146 -0
  824. package/neural-interface/lib/whatsapp/auth-store.js +389 -0
  825. package/neural-interface/lib/whatsapp/baileys-adapter.js +457 -0
  826. package/neural-interface/lib/whatsapp/brain.js +128 -0
  827. package/neural-interface/lib/whatsapp/bridge.js +1499 -0
  828. package/neural-interface/lib/whatsapp/cards.js +519 -0
  829. package/neural-interface/lib/whatsapp/commands.js +92 -0
  830. package/neural-interface/lib/whatsapp/config.js +291 -0
  831. package/neural-interface/lib/whatsapp/connector/entry.mjs +25 -0
  832. package/neural-interface/lib/whatsapp/connector/manifest.json +6 -0
  833. package/neural-interface/lib/whatsapp/connector/npm-shrinkwrap.json +717 -0
  834. package/neural-interface/lib/whatsapp/connector/package.json +8 -0
  835. package/neural-interface/lib/whatsapp/fake-baileys.js +444 -0
  836. package/neural-interface/lib/whatsapp/format.js +552 -0
  837. package/neural-interface/lib/whatsapp/host-core.js +1225 -0
  838. package/neural-interface/lib/whatsapp/host.js +119 -0
  839. package/neural-interface/lib/whatsapp/identity.js +288 -0
  840. package/neural-interface/lib/whatsapp/inbound.js +149 -0
  841. package/neural-interface/lib/whatsapp/installer.js +562 -0
  842. package/neural-interface/lib/whatsapp/manager.js +638 -0
  843. package/neural-interface/lib/whatsapp/paths.js +81 -0
  844. package/neural-interface/lib/whatsapp/protocol.js +327 -0
  845. package/neural-interface/lib/whatsapp/qr-svg.js +57 -0
  846. package/neural-interface/lib/whatsapp/redact.js +130 -0
  847. package/neural-interface/lib/whatsapp/service.js +1305 -0
  848. package/neural-interface/lib/whatsapp/vendor/qrcodegen.js +848 -0
  849. package/neural-interface/package-lock.json +4431 -0
  850. package/neural-interface/package.json +58 -27
  851. package/neural-interface/public/apple-touch-icon.png +0 -0
  852. package/neural-interface/public/category-logos/synabun.png +0 -0
  853. package/neural-interface/public/claude.svg +1 -0
  854. package/neural-interface/public/favicon-16x16.png +0 -0
  855. package/neural-interface/public/favicon-32x32.png +0 -0
  856. package/neural-interface/public/icon-192.png +0 -0
  857. package/neural-interface/public/icon-512.png +0 -0
  858. package/neural-interface/public/index.html +32 -182
  859. package/neural-interface/public/index2d.html +2 -2
  860. package/neural-interface/public/install-app.html +31 -0
  861. package/neural-interface/public/logo-synabun.png +0 -0
  862. package/neural-interface/public/logoHD.png +0 -0
  863. package/neural-interface/public/manifest.json +2 -0
  864. package/neural-interface/public/mcp.svg +4 -0
  865. package/neural-interface/public/offline.html +670 -299
  866. package/neural-interface/public/onboarding.html +804 -161
  867. package/neural-interface/public/opencode-logo-dark-square.svg +1 -0
  868. package/neural-interface/public/shared/agent-runtime-options.js +596 -0
  869. package/neural-interface/public/shared/api.js +339 -28
  870. package/neural-interface/public/shared/assistant/asst-accounts.js +318 -0
  871. package/neural-interface/public/shared/assistant/asst-agents-dock.js +296 -0
  872. package/neural-interface/public/shared/assistant/asst-api.js +270 -0
  873. package/neural-interface/public/shared/assistant/asst-brain-picker.js +744 -0
  874. package/neural-interface/public/shared/assistant/asst-budget.js +333 -0
  875. package/neural-interface/public/shared/assistant/asst-composer.js +656 -0
  876. package/neural-interface/public/shared/assistant/asst-computer.js +803 -0
  877. package/neural-interface/public/shared/assistant/asst-control.js +1018 -0
  878. package/neural-interface/public/shared/assistant/asst-hosts.js +262 -0
  879. package/neural-interface/public/shared/assistant/asst-mascot.js +313 -0
  880. package/neural-interface/public/shared/assistant/asst-menu.js +375 -0
  881. package/neural-interface/public/shared/assistant/asst-panel.js +1845 -0
  882. package/neural-interface/public/shared/assistant/asst-rack-styles.js +586 -0
  883. package/neural-interface/public/shared/assistant/asst-render.js +3305 -0
  884. package/neural-interface/public/shared/assistant/asst-route.js +1653 -0
  885. package/neural-interface/public/shared/assistant/asst-roving.js +75 -0
  886. package/neural-interface/public/shared/assistant/asst-sanitize.js +117 -0
  887. package/neural-interface/public/shared/assistant/asst-sidepanel-styles.js +488 -0
  888. package/neural-interface/public/shared/assistant/asst-sidepanel.js +675 -0
  889. package/neural-interface/public/shared/assistant/asst-slash.js +258 -0
  890. package/neural-interface/public/shared/assistant/asst-state.js +727 -0
  891. package/neural-interface/public/shared/assistant/asst-styles.js +1686 -0
  892. package/neural-interface/public/shared/assistant/asst-tool-kinds.js +1017 -0
  893. package/neural-interface/public/shared/assistant/asst-usage.js +444 -0
  894. package/neural-interface/public/shared/assistant/asst-ws.js +175 -0
  895. package/neural-interface/public/shared/automation-context.js +75 -0
  896. package/neural-interface/public/shared/blob-store.js +99 -0
  897. package/neural-interface/public/shared/cdx/cdx-capabilities.js +118 -0
  898. package/neural-interface/public/shared/cdx/cdx-cards.js +37 -0
  899. package/neural-interface/public/shared/cdx/cdx-commands.js +171 -0
  900. package/neural-interface/public/shared/cdx/cdx-context-menu.js +402 -0
  901. package/neural-interface/public/shared/cdx/cdx-context-model.js +220 -0
  902. package/neural-interface/public/shared/cdx/cdx-features.js +408 -0
  903. package/neural-interface/public/shared/cdx/cdx-icons.js +89 -0
  904. package/neural-interface/public/shared/cdx/cdx-mcp-app-host.js +414 -0
  905. package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.html +6 -0
  906. package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.js +56 -0
  907. package/neural-interface/public/shared/cdx/cdx-mcp-app.js +178 -0
  908. package/neural-interface/public/shared/cdx/cdx-model-catalog.js +120 -0
  909. package/neural-interface/public/shared/cdx/cdx-output-model.js +261 -0
  910. package/neural-interface/public/shared/cdx/cdx-output.js +382 -0
  911. package/neural-interface/public/shared/cdx/cdx-panel.js +1372 -0
  912. package/neural-interface/public/shared/cdx/cdx-plan.js +266 -0
  913. package/neural-interface/public/shared/cdx/cdx-protocol.js +682 -0
  914. package/neural-interface/public/shared/cdx/cdx-render.js +3381 -0
  915. package/neural-interface/public/shared/cdx/cdx-requests.js +1136 -0
  916. package/neural-interface/public/shared/cdx/cdx-styles.js +3251 -0
  917. package/neural-interface/public/shared/cdx/cdx-tabs.js +7992 -0
  918. package/neural-interface/public/shared/cdx/cdx-ws.js +363 -0
  919. package/neural-interface/public/shared/cli-status.js +169 -0
  920. package/neural-interface/public/shared/command-runner-model.js +30 -0
  921. package/neural-interface/public/shared/constants.js +22 -5
  922. package/neural-interface/public/shared/cp/cp-agents.js +186 -0
  923. package/neural-interface/public/shared/cp/cp-bash.js +252 -0
  924. package/neural-interface/public/shared/cp/cp-compose.js +159 -0
  925. package/neural-interface/public/shared/cp/cp-context-menu.js +309 -0
  926. package/neural-interface/public/shared/cp/cp-context-model.js +157 -0
  927. package/neural-interface/public/shared/cp/cp-context-window.js +80 -0
  928. package/neural-interface/public/shared/cp/cp-ctx.js +11 -0
  929. package/neural-interface/public/shared/cp/cp-diff.js +255 -0
  930. package/neural-interface/public/shared/cp/cp-event-rows.js +637 -0
  931. package/neural-interface/public/shared/cp/cp-events.js +846 -0
  932. package/neural-interface/public/shared/cp/cp-markdown.js +104 -0
  933. package/neural-interface/public/shared/cp/cp-permission-model.js +905 -0
  934. package/neural-interface/public/shared/cp/cp-permissions.js +626 -0
  935. package/neural-interface/public/shared/cp/cp-rehydrate.js +113 -0
  936. package/neural-interface/public/shared/cp/cp-restore.js +224 -0
  937. package/neural-interface/public/shared/cp/cp-session-model.js +338 -0
  938. package/neural-interface/public/shared/cp/cp-session-settings.js +254 -0
  939. package/neural-interface/public/shared/cp/cp-sessions.js +227 -0
  940. package/neural-interface/public/shared/cp/cp-statusline.js +153 -0
  941. package/neural-interface/public/shared/cp/cp-styles.js +349 -0
  942. package/neural-interface/public/shared/cp/cp-tasks-model.js +282 -0
  943. package/neural-interface/public/shared/cp/cp-tasks.js +107 -0
  944. package/neural-interface/public/shared/cp/cp-temporary-view.js +56 -0
  945. package/neural-interface/public/shared/cp/cp-temporary.js +231 -0
  946. package/neural-interface/public/shared/cp/cp-tool-cards.js +326 -0
  947. package/neural-interface/public/shared/cp/cp-tool-results.js +618 -0
  948. package/neural-interface/public/shared/cp/cp-usage-model.js +124 -0
  949. package/neural-interface/public/shared/graph-activity.js +68 -0
  950. package/neural-interface/public/shared/html-shell.js +116 -17
  951. package/neural-interface/public/shared/i18n.js +132 -34
  952. package/neural-interface/public/shared/node-positions-store.js +44 -0
  953. package/neural-interface/public/shared/ocp-hidden-models.js +116 -0
  954. package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +355 -0
  955. package/neural-interface/public/shared/ocp-v2/ocp-v2-autoaccept-button.js +35 -0
  956. package/neural-interface/public/shared/ocp-v2/ocp-v2-automation-ownership.js +72 -0
  957. package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +280 -0
  958. package/neural-interface/public/shared/ocp-v2/ocp-v2-caps.js +67 -0
  959. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +179 -0
  960. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes.js +164 -0
  961. package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +725 -0
  962. package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +75 -0
  963. package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +1204 -0
  964. package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm-logic.js +117 -0
  965. package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm.js +59 -0
  966. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-gauge.js +252 -0
  967. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +478 -0
  968. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +179 -0
  969. package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +233 -0
  970. package/neural-interface/public/shared/ocp-v2/ocp-v2-icons.js +30 -0
  971. package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +1065 -0
  972. package/neural-interface/public/shared/ocp-v2/ocp-v2-mention-hints.js +182 -0
  973. package/neural-interface/public/shared/ocp-v2/ocp-v2-modelpicker.js +655 -0
  974. package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +2636 -0
  975. package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +601 -0
  976. package/neural-interface/public/shared/ocp-v2/ocp-v2-profile-inheritance.js +78 -0
  977. package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +649 -0
  978. package/neural-interface/public/shared/ocp-v2/ocp-v2-providers.js +35 -0
  979. package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +357 -0
  980. package/neural-interface/public/shared/ocp-v2/ocp-v2-render-logic.js +189 -0
  981. package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +1869 -0
  982. package/neural-interface/public/shared/ocp-v2/ocp-v2-select.js +42 -0
  983. package/neural-interface/public/shared/ocp-v2/ocp-v2-send-logic.js +117 -0
  984. package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +1714 -0
  985. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +468 -0
  986. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-widgets.js +63 -0
  987. package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +366 -0
  988. package/neural-interface/public/shared/ocp-v2/ocp-v2-settings-link.js +19 -0
  989. package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +343 -0
  990. package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +746 -0
  991. package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +347 -0
  992. package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +338 -0
  993. package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +3543 -0
  994. package/neural-interface/public/shared/ocp-v2/ocp-v2-subagents-logic.js +482 -0
  995. package/neural-interface/public/shared/ocp-v2/ocp-v2-tools-logic.js +351 -0
  996. package/neural-interface/public/shared/ocp-v2/ocp-v2-tools.js +168 -0
  997. package/neural-interface/public/shared/ocp-v2/ocp-v2-variantpicker.js +315 -0
  998. package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +545 -0
  999. package/neural-interface/public/shared/provider-icons.js +30 -0
  1000. package/neural-interface/public/shared/pwa-install-page.js +34 -0
  1001. package/neural-interface/public/shared/pwa-install.css +12 -0
  1002. package/neural-interface/public/shared/pwa-install.js +28 -0
  1003. package/neural-interface/public/shared/session-title.js +100 -0
  1004. package/neural-interface/public/shared/settings/settings-ia.js +389 -0
  1005. package/neural-interface/public/shared/settings/settings-kit.js +234 -0
  1006. package/neural-interface/public/shared/settings/settings-rules.js +160 -0
  1007. package/neural-interface/public/shared/settings/settings-search.js +463 -0
  1008. package/neural-interface/public/shared/settings/settings-shell.js +570 -0
  1009. package/neural-interface/public/shared/start-bridge.js +583 -0
  1010. package/neural-interface/public/shared/state.js +5 -0
  1011. package/neural-interface/public/shared/storage.js +50 -7
  1012. package/neural-interface/public/shared/styleguide/sg-agents.js +42 -0
  1013. package/neural-interface/public/shared/styleguide/sg-brand.js +4 -0
  1014. package/neural-interface/public/shared/styleguide/sg-color-client.js +388 -0
  1015. package/neural-interface/public/shared/styleguide/sg-colors.js +151 -0
  1016. package/neural-interface/public/shared/styleguide/sg-components.js +35 -0
  1017. package/neural-interface/public/shared/styleguide/sg-history.js +41 -0
  1018. package/neural-interface/public/shared/styleguide/sg-icons-logo.js +38 -0
  1019. package/neural-interface/public/shared/styleguide/sg-imagery.js +4 -0
  1020. package/neural-interface/public/shared/styleguide/sg-import-export.js +48 -0
  1021. package/neural-interface/public/shared/styleguide/sg-kit.js +284 -0
  1022. package/neural-interface/public/shared/styleguide/sg-labels.js +318 -0
  1023. package/neural-interface/public/shared/styleguide/sg-layout.js +4 -0
  1024. package/neural-interface/public/shared/styleguide/sg-motion.js +5 -0
  1025. package/neural-interface/public/shared/styleguide/sg-panel.js +237 -0
  1026. package/neural-interface/public/shared/styleguide/sg-preview.js +138 -0
  1027. package/neural-interface/public/shared/styleguide/sg-rules.js +9 -0
  1028. package/neural-interface/public/shared/styleguide/sg-shape.js +24 -0
  1029. package/neural-interface/public/shared/styleguide/sg-state.js +132 -0
  1030. package/neural-interface/public/shared/styleguide/sg-typography.js +125 -0
  1031. package/neural-interface/public/shared/styles.css +8614 -1477
  1032. package/neural-interface/public/shared/synabun-mascot.js +1625 -0
  1033. package/neural-interface/public/shared/synabun-ticker.js +376 -0
  1034. package/neural-interface/public/shared/term-ready.js +307 -0
  1035. package/neural-interface/public/shared/term-renderer.js +343 -0
  1036. package/neural-interface/public/shared/ui-assistant-panel.js +10 -0
  1037. package/neural-interface/public/shared/ui-assistant.js +77 -0
  1038. package/neural-interface/public/shared/ui-automation-studio.js +5105 -3573
  1039. package/neural-interface/public/shared/ui-claude-panel.js +11685 -6333
  1040. package/neural-interface/public/shared/ui-codex-panel.js +12 -0
  1041. package/neural-interface/public/shared/ui-command-runner.js +251 -468
  1042. package/neural-interface/public/shared/ui-cost-widget.js +55 -34
  1043. package/neural-interface/public/shared/ui-detail.js +77 -14
  1044. package/neural-interface/public/shared/ui-explorer.js +360 -181
  1045. package/neural-interface/public/shared/ui-file-explorer.js +485 -107
  1046. package/neural-interface/public/shared/ui-help.js +2 -2
  1047. package/neural-interface/public/shared/ui-image-gallery.js +45 -21
  1048. package/neural-interface/public/shared/ui-judgments.js +1346 -0
  1049. package/neural-interface/public/shared/ui-keybinds.js +3 -2
  1050. package/neural-interface/public/shared/ui-link.js +105 -51
  1051. package/neural-interface/public/shared/ui-loading.js +222 -11
  1052. package/neural-interface/public/shared/ui-memory-maintenance.js +111 -0
  1053. package/neural-interface/public/shared/ui-menubar.js +100 -31
  1054. package/neural-interface/public/shared/ui-native-loop-router-state.js +94 -0
  1055. package/neural-interface/public/shared/ui-native-loop-router.js +493 -0
  1056. package/neural-interface/public/shared/ui-native-window-id.js +7 -0
  1057. package/neural-interface/public/shared/ui-navbar.js +357 -222
  1058. package/neural-interface/public/shared/ui-notifications.js +58 -12
  1059. package/neural-interface/public/shared/ui-opencode-panel-v2.js +17 -0
  1060. package/neural-interface/public/shared/ui-panels.js +15 -7
  1061. package/neural-interface/public/shared/ui-resume.js +823 -653
  1062. package/neural-interface/public/shared/ui-schedule-queue.js +172 -0
  1063. package/neural-interface/public/shared/ui-schedules-studio.js +1882 -0
  1064. package/neural-interface/public/shared/ui-scroll-follow.js +194 -0
  1065. package/neural-interface/public/shared/ui-sessions.js +789 -34
  1066. package/neural-interface/public/shared/ui-settings.js +5774 -2194
  1067. package/neural-interface/public/shared/ui-sidepanel-layout.js +109 -0
  1068. package/neural-interface/public/shared/ui-sidepanel-runtime.js +19 -0
  1069. package/neural-interface/public/shared/ui-sidepanel-session-entry.js +40 -0
  1070. package/neural-interface/public/shared/ui-sidepanel-sessions.js +221 -0
  1071. package/neural-interface/public/shared/ui-sidepanel-state.js +131 -0
  1072. package/neural-interface/public/shared/ui-sidepanel-tray.js +547 -0
  1073. package/neural-interface/public/shared/ui-sidepanel-windows.js +387 -0
  1074. package/neural-interface/public/shared/ui-skills.js +18 -32
  1075. package/neural-interface/public/shared/ui-styleguide.js +35 -0
  1076. package/neural-interface/public/shared/ui-sync.js +87 -0
  1077. package/neural-interface/public/shared/ui-terminal.js +7863 -6385
  1078. package/neural-interface/public/shared/ui-tool-updates.js +292 -0
  1079. package/neural-interface/public/shared/ui-tooltip.js +156 -15
  1080. package/neural-interface/public/shared/ui-tutorial-draw.js +119 -683
  1081. package/neural-interface/public/shared/ui-tutorial-layout.js +135 -0
  1082. package/neural-interface/public/shared/ui-tutorial-steps.js +59 -2209
  1083. package/neural-interface/public/shared/ui-tutorial.css +102 -0
  1084. package/neural-interface/public/shared/ui-tutorial.js +557 -1076
  1085. package/neural-interface/public/shared/ui-update.js +420 -68
  1086. package/neural-interface/public/shared/ui-whatsapp.js +941 -0
  1087. package/neural-interface/public/shared/ui-whiteboard.js +1076 -233
  1088. package/neural-interface/public/shared/ui-workspaces.js +2 -1
  1089. package/neural-interface/public/shared/utils.js +58 -0
  1090. package/neural-interface/public/shared/vterm-buffer.js +15 -5
  1091. package/neural-interface/public/shared/whatsapp/wa-phone.js +65 -0
  1092. package/neural-interface/public/shared/whatsapp/wa-view.js +411 -0
  1093. package/neural-interface/public/sidepanel-session.html +18 -0
  1094. package/neural-interface/public/sw.js +10 -2
  1095. package/neural-interface/public/synabun.png +0 -0
  1096. package/neural-interface/public/variant/2d/graph.js +1707 -1635
  1097. package/neural-interface/public/variant/2d/lasso.js +2 -1
  1098. package/neural-interface/public/variant/2d/layout.js +595 -594
  1099. package/neural-interface/public/variant/2d/main.js +557 -521
  1100. package/neural-interface/public/variant/2d/settings-gfx.js +18 -24
  1101. package/neural-interface/public/variant/3d/main.js +517 -500
  1102. package/neural-interface/public/variant/3d/map-controls.js +144 -0
  1103. package/neural-interface/public/variant/3d/map-data.js +251 -0
  1104. package/neural-interface/public/variant/3d/map-labels.js +241 -0
  1105. package/neural-interface/public/variant/3d/map-pick.js +90 -0
  1106. package/neural-interface/public/variant/3d/map-renderer.js +521 -0
  1107. package/neural-interface/public/variant/3d/map-shaders.js +158 -0
  1108. package/neural-interface/public/variant/3d/map-view.js +618 -0
  1109. package/neural-interface/public/vendor/three/manifest.json +3 -0
  1110. package/neural-interface/public/vendor/three/three-0.169.0.min.js +3844 -0
  1111. package/neural-interface/public/vendor/xterm/manifest.json +3 -0
  1112. package/neural-interface/public/vendor/xterm/xterm-6.0.0.css +285 -0
  1113. package/neural-interface/public/vendor/xterm/xterm-6.0.0.min.js +192 -0
  1114. package/neural-interface/scripts/build-vendor.mjs +64 -0
  1115. package/neural-interface/scripts/codex-protocol-fixture.mjs +83 -0
  1116. package/neural-interface/scripts/rebuild-pty.js +39 -22
  1117. package/neural-interface/scripts/vendor-three-entry.js +24 -0
  1118. package/neural-interface/scripts/vendor-xterm-entry.js +8 -0
  1119. package/neural-interface/server.js +33983 -15000
  1120. package/neural-interface/skins/default/skin.css +90 -0
  1121. package/neural-interface/skins/default/skin.json +8 -0
  1122. package/neural-interface/templates/rulesets/README.md +9 -0
  1123. package/neural-interface/templates/rulesets/claude.md +3 -0
  1124. package/neural-interface/templates/rulesets/codex.md +2 -0
  1125. package/neural-interface/templates/rulesets/coexistence.md +6 -0
  1126. package/neural-interface/templates/rulesets/core.md +26 -0
  1127. package/neural-interface/templates/rulesets/cursor.md +2 -0
  1128. package/neural-interface/templates/rulesets/gemini.md +2 -0
  1129. package/neural-interface/templates/rulesets/legacy-hashes.json +227 -0
  1130. package/neural-interface/templates/rulesets/manifest.json +12 -0
  1131. package/neural-interface/templates/rulesets/opencode.md +2 -0
  1132. package/package.json +131 -53
  1133. package/postinstall.js +55 -26
  1134. package/preuninstall.js +187 -0
  1135. package/scripts/restore-data-home-from-backup.mjs +239 -0
  1136. package/setup.js +872 -260
  1137. package/skills/leonardo/SKILL.md +19 -10
  1138. package/skills/leonardo/modules/image-prompter.md +18 -12
  1139. package/skills/leonardo/modules/video-prompter.md +19 -13
  1140. package/skills/synabun/SKILL.md +209 -185
  1141. package/skills/synabun/icon.png +0 -0
  1142. package/skills/synabun/modules/audit.md +380 -374
  1143. package/skills/synabun/modules/changelog.md +15 -6
  1144. package/skills/synabun/modules/idea.md +148 -144
  1145. package/skills/synabun/modules/memorize.md +13 -4
  1146. package/skills/synabun/modules/schedule.md +198 -0
  1147. package/skills/synabun/synabunicon.png +0 -0
  1148. package/updater.cmd +31 -0
  1149. package/updater.mjs +382 -0
  1150. package/updater.sh +29 -0
  1151. package/hooks/claude-code/test-user-learning.mjs +0 -531
  1152. package/neural-interface/public/claude-chat.css +0 -878
  1153. package/neural-interface/public/claude-chat.html +0 -92
  1154. package/neural-interface/public/claude-chat.js +0 -1168
  1155. package/neural-interface/public/index-legacy.html +0 -14677
  1156. package/neural-interface/public/index2d-legacy.html +0 -8193
  1157. package/neural-interface/public/shared/html-term-renderer.js +0 -1022
  1158. package/neural-interface/public/variant/3d/background.js +0 -884
  1159. package/neural-interface/public/variant/3d/camera.js +0 -661
  1160. package/neural-interface/public/variant/3d/gfx.js +0 -116
  1161. package/neural-interface/public/variant/3d/graph.js +0 -2399
  1162. package/neural-interface/public/variant/3d/settings-gfx.js +0 -228
  1163. package/neural-interface/templates/CLAUDE-template.md +0 -211
@@ -0,0 +1,1065 @@
1
+ // ─────────────────────────────────────────────────────────────────────────────
2
+ // OpenCode V2 — Multi-panel manager
3
+ // Tracks the primary OCP v2 panel and the sub-agent panels of its sessions.
4
+ // Sub-agent rules (ocp-v2-subagents-logic.js has them without the DOM):
5
+ // • One panel and one pill per sub-agent session, at any depth (a sub-agent
6
+ // of a sub-agent too). A new sub-agent never destroys or reuses another
7
+ // one's panel, and there is no cap.
8
+ // • All of them stay live: a panel that is off screen follows its session.
9
+ // • Spawned MINIMIZED — a sub-agent appears as a tray pill; nothing opens
10
+ // by itself. An automation's sub-agents get neither pill nor panel.
11
+ // • The pills and panels belong to their parent session: the tray shows the
12
+ // set of the session the main panel is on, and keeps the others.
13
+ // • Which OpenCode panel is on screen is decided in one function
14
+ // (decideVisibility), applied here by requestOpencodeView().
15
+ // • A sub-agent costs what its pill needs (its run state and the requests
16
+ // that wait for the user) until its panel is first shown: then its
17
+ // session is read whole.
18
+ // ─────────────────────────────────────────────────────────────────────────────
19
+
20
+ import {
21
+ subscribeSessionCreated, subscribeSession, onEvent, api, hasSessionStore, supports,
22
+ onReconnect, isDescendantSession, rememberSessionParent, handOverRequests,
23
+ } from './ocp-v2-ws.js';
24
+ import { rehydratePanelSession, rehydrateSessionState } from './ocp-v2-rehydrate.js';
25
+ import { captureBinding, latestOnly } from './ocp-v2-binding.js';
26
+ import { storage } from '../storage.js';
27
+ import { on } from '../state.js';
28
+ import { setSidepanelVisible } from '../ui-sidepanel-windows.js';
29
+ import { createPanelStore } from './ocp-v2-state.js';
30
+ import { createChildPanel } from './ocp-v2-childpanel.js';
31
+ import { inheritChildPanelMcpProfile } from './ocp-v2-profile-inheritance.js';
32
+ import { notify as uiNotify, NOTIF_TYPE } from '../ui-notifications.js';
33
+ import {
34
+ isAutomationSession, onAutomationSessionRegistered, shouldMaterializeChildPanel,
35
+ } from './ocp-v2-automation-ownership.js';
36
+ import {
37
+ MAIN_VIEW, decideVisibility, createSubagentRegistry, placeSubagent, descendantsOf, trayPills,
38
+ createClosedSubagents, createShownSubagent, createLimiter, trayGroupHeight, trayGroupScrolls,
39
+ lineageOf, entriesUnder, createUnsentPrompts, unsentSubagentNotice,
40
+ } from './ocp-v2-subagents-logic.js';
41
+
42
+ export { MAIN_VIEW };
43
+
44
+ const AGENT_TOOL_NAMES = new Set([
45
+ 'task', 'agent', 'Task', 'Agent',
46
+ // OpenCode SDK variants observed in the wild — the spawn tool name has
47
+ // drifted across SDK versions. Keep the set permissive so a renamed tool
48
+ // still spawns the child pill.
49
+ 'invoke', 'Invoke', 'subagent', 'Subagent', 'sub_agent', 'spawn', 'Spawn',
50
+ 'explore', 'Explore', 'plan', 'Plan',
51
+ ]);
52
+
53
+ function readParentID(info) {
54
+ if (!info) return '';
55
+ return (
56
+ info.parentID || info.parentId || info.parent_id ||
57
+ info.session?.parentID || info.session?.parentId ||
58
+ info.properties?.info?.parentID || info.properties?.info?.parentId ||
59
+ ''
60
+ );
61
+ }
62
+
63
+ let _primary = null; // { panelId, store, getSessionId, ownsSession, keepPrompts }
64
+ let _mainView = null; // { owner, isVisible }: the main panel in the shared slot
65
+ let _started = false;
66
+ let _primaryWsUnsub = null;
67
+ // Every sub-agent panel: sessionId → { panelId, sessionId, parentSessionId,
68
+ // rootSessionId, depth, startedAt, store, instance, wsUnsub, runSub }.
69
+ const _panels = createSubagentRegistry();
70
+ // child session → parent session, learned from session events and from the
71
+ // children the server listed: how a sub-agent of a sub-agent finds its set.
72
+ const _parentOf = new Map();
73
+ // One orphan scan at a time counts: a newer one (the next binding, a rescan)
74
+ // takes over from the one still waiting for its answer.
75
+ const _orphanScans = latestOnly();
76
+ // Transcripts of sub-agent panels are read a few at a time.
77
+ const _hydrations = createLimiter(4);
78
+ // Prompts that were on their way to a sub-agent when its panel went away, and
79
+ // whose send then failed: kept for that sub-agent until its panel is opened again.
80
+ const _unsent = createUnsentPrompts();
81
+ // Sub-agents that were announced before the chain of their parents reached a
82
+ // tab (a parent whose own parent link arrives later, with session.updated):
83
+ // child → { parentSid, childInfo, taskInfo }, the newest UNPLACED_MAX. Each is
84
+ // placed when its parent gets its panel (placeWaitingChildren).
85
+ const UNPLACED_MAX = 256;
86
+ const _unplaced = new Map();
87
+ // The sub-agents whose panel the user closed (one list for every window, kept
88
+ // across reloads): nothing but "Open sub-agent" brings one back.
89
+ const STOR_CLOSED = 'opencode-v2-subagents-closed';
90
+ const _closed = createClosedSubagents({
91
+ load: () => JSON.parse(storage.getItem(STOR_CLOSED) || '{}'),
92
+ save: (entries) => {
93
+ if (Object.keys(entries).length) storage.setItem(STOR_CLOSED, JSON.stringify(entries));
94
+ else storage.removeItem(STOR_CLOSED);
95
+ },
96
+ });
97
+ // The sub-agent panel that is on screen, for this window, across a reload.
98
+ const STOR_SHOWN = 'ocp-v2-subagent-shown';
99
+ const _shown = createShownSubagent({
100
+ load: () => JSON.parse(sessionStorage.getItem(STOR_SHOWN) || 'null'),
101
+ save: (view) => {
102
+ if (view) sessionStorage.setItem(STOR_SHOWN, JSON.stringify(view));
103
+ else sessionStorage.removeItem(STOR_SHOWN);
104
+ },
105
+ });
106
+
107
+ // The main panel says where it is in the shared slot (before it boots: it can
108
+ // be shown before it is registered as the primary).
109
+ export function registerMainView({ owner, isVisible }) {
110
+ _mainView = { owner, isVisible };
111
+ }
112
+
113
+ // ownsSession(id) is this session a tab of the main panel? (its
114
+ // sub-agents get panels here; another window's do not)
115
+ // keepPrompts(items, label)
116
+ // prompts that were waiting in a sub-agent panel that
117
+ // went away by itself: kept for the user on notices
118
+ export function registerPrimaryPanel({ panelId, store, getSessionId, ownsSession, keepPrompts }) {
119
+ _primary = { panelId, store, getSessionId, ownsSession, keepPrompts };
120
+ startManager();
121
+ syncSubagentTray();
122
+ // Retroactive scan: sub-agent sessions may already exist server-side
123
+ // (created before this panel registered, or surviving a page reload).
124
+ // Without this, their tray pills never appear.
125
+ scanForOrphanChildren().catch((err) => {
126
+ console.warn('[ocp-v2-manager] initial orphan scan failed', err);
127
+ });
128
+ }
129
+
130
+ export function bindPrimarySession(store, sessionId) {
131
+ if (_primaryWsUnsub) { try { _primaryWsUnsub(); } catch {} _primaryWsUnsub = null; }
132
+ if (sessionId) _primaryWsUnsub = subscribeSession(sessionId, store);
133
+ // The pills in the tray are those of the session the main panel is on. A
134
+ // sub-agent panel of another session does not stay on screen over it.
135
+ const shown = visibleEntry();
136
+ if (shown && shown.rootSessionId !== (sessionId || '')) requestOpencodeView({ hide: shown.panelId });
137
+ syncSubagentTray();
138
+ // Whenever the primary's active session changes, re-scan: the new active
139
+ // session may already have sub-agents server-side.
140
+ if (sessionId) {
141
+ scanForOrphanChildren().catch((err) => {
142
+ console.warn('[ocp-v2-manager] bind-time orphan scan failed', err);
143
+ });
144
+ }
145
+ }
146
+
147
+ const listOf = (res) => (Array.isArray(res?.data) ? res.data : (res?.data?.sessions || []));
148
+
149
+ async function scanForOrphanChildren() {
150
+ if (!_primary) return;
151
+ const parentSid = _primary.getSessionId?.();
152
+ if (!parentSid || isAutomationSession(parentSid)) return;
153
+ // The scan is for the session the primary panel is on now. Its answer may
154
+ // spawn child panels only while the panel is still on that binding and no
155
+ // newer scan was started.
156
+ const at = captureBinding(_primary.store, { sessionId: parentSid });
157
+ const latest = _orphanScans.begin();
158
+ let sessions = [];
159
+ try {
160
+ // session.children is the direct question, asked for the session and then
161
+ // for every child it lists (sub-agents of sub-agents); a server without it
162
+ // lists every session and descendantsOf picks the tree out.
163
+ if (supports('session:children')) sessions = await readChildTree(parentSid, () => latest() && at.isCurrent());
164
+ else sessions = descendantsOf(listOf(await api.sessionList()), parentSid);
165
+ } catch (err) {
166
+ console.warn('[ocp-v2-manager] child session lookup for orphan scan failed', err);
167
+ return;
168
+ }
169
+ // Ownership can arrive from the native event socket while session:list is
170
+ // in flight. Recheck before materializing anything from the response.
171
+ if (isAutomationSession(parentSid)) return;
172
+ // So can a session switch: a child of the session the panel has left is not
173
+ // materialized under the one it is on now.
174
+ if (!latest() || !at.isCurrent()) return;
175
+ // Every sub-agent of the session gets its panel and its pill back, in the
176
+ // order they were started (the user's closes excepted). Nothing is shown,
177
+ // and nothing is announced: these did not just start.
178
+ for (const session of sessions) {
179
+ const childSid = session?.id || session?.sessionID;
180
+ if (!childSid || !readParentID(session)) continue;
181
+ _parentOf.set(childSid, readParentID(session));
182
+ // The server listed this link: requests are routed and auto-accept is
183
+ // inherited along it, as along one that a session event carried.
184
+ rememberSessionParent(childSid, readParentID(session));
185
+ }
186
+ for (const session of sessions) {
187
+ const childSid = session?.id || session?.sessionID;
188
+ const parent = readParentID(session);
189
+ if (!childSid || !parent) continue;
190
+ ensureChildSpawn(parent, childSid, session, null, lookupParentTaskInfo(childSid, parent), { announce: false });
191
+ }
192
+ _scanned.add(parentSid);
193
+ restoreShown();
194
+ noteShown();
195
+ }
196
+
197
+ // After a reload: the sub-agent panel that was on screen is on screen again.
198
+ // Once, when the user has the main panel on screen on the session it belonged
199
+ // to and that session's children were read (nothing opens by itself: a panel
200
+ // an automation booted waits for the user to open OpenCode).
201
+ const _scanned = new Set(); // sessions whose children were read since the page loaded
202
+ function restoreShown() {
203
+ const root = _primary?.getSessionId?.() || '';
204
+ if (!root) return;
205
+ const was = _shown.restoreFor(root, { mainVisible: !!_mainView?.isVisible?.(), ready: _scanned.has(root) });
206
+ const entry = was ? _panels.get(was) : null;
207
+ if (entry && entry.rootSessionId === root) requestOpencodeView({ show: entry.panelId });
208
+ }
209
+
210
+ function startManager() {
211
+ if (_started) return;
212
+ _started = true;
213
+ // The primary panel heals itself on a reconnect; the sub-agent panels are
214
+ // re-read here, or they would come back without their cards or stay "running".
215
+ onReconnect(() => {
216
+ for (const entry of _panels.all()) {
217
+ // (A few at a time, like the first read: there can be many of them.)
218
+ _hydrations(() => hydrateChildPanel(entry.store, entry.sessionId))
219
+ .then((out) => {
220
+ // Its header said "reconnecting" since the socket closed.
221
+ // (A panel that was never shown had what its pill needs read, and no transcript.)
222
+ if ((out.transcript || out.pill) && _panels.get(entry.sessionId)?.store === entry.store) entry.store.setServerStatus({ status: 'ready' });
223
+ })
224
+ .catch((err) => console.warn('[ocp-v2-manager] child rehydrate after reconnect failed', err));
225
+ }
226
+ });
227
+ onAutomationSessionRegistered(({ sessionId }) => {
228
+ destroyPanelsOf(sessionId);
229
+ });
230
+ // The main panel went on or off screen: the pills dock to its pill or stand alone.
231
+ // (The restore after a reload is tried once the main panel's own show is over.)
232
+ on('opencode-panel:visibility', (visible) => {
233
+ syncSubagentTray();
234
+ noteShown();
235
+ if (visible) setTimeout(() => { restoreShown(); noteShown(); }, 0);
236
+ });
237
+ // The room under the group changes with the window.
238
+ if (typeof window !== 'undefined') window.addEventListener('resize', () => { _groupLayoutKey = ''; scheduleTraySync(); });
239
+ subscribeSessionCreated((event) => {
240
+ const info = event?.info || event?.properties?.info || event;
241
+ const childId = info?.id || event?.id || event?.sessionID || event?.sessionId;
242
+ const parentID = readParentID(info) || readParentID(event);
243
+ if (!childId || !parentID) return;
244
+ ensureChildSpawn(parentID, childId, info, null, lookupParentTaskInfo(childId, parentID));
245
+ });
246
+
247
+ onEvent((eventType, ev) => {
248
+ if (!_primary) return;
249
+ // Some OpenCode SDK builds emit `session.created` WITHOUT parentID first,
250
+ // then a `session.updated` enriches the info object. Catch the linkage on
251
+ // updates too — without this, a sub-agent whose parentID arrives late is
252
+ // never paired with its parent and the pill never spawns.
253
+ if (eventType === 'session.updated') {
254
+ const info = ev?.info || ev?.session || ev;
255
+ const childId = info?.id || ev?.sessionID || ev?.sessionId;
256
+ const parentID = readParentID(info) || readParentID(ev);
257
+ if (!childId || !parentID) return;
258
+ if (childId === _primary.getSessionId?.()) return;
259
+ if (_panels.has(childId)) return;
260
+ // (The sub-agents that named this session as their parent before its own
261
+ // parent was known are placed with it: placeWaitingChildren.)
262
+ ensureChildSpawn(parentID, childId, info, null, lookupParentTaskInfo(childId, parentID));
263
+ return;
264
+ }
265
+ // A sub-agent session OpenCode deleted takes its panel with it. (The
266
+ // session in the main panel is the main panel's to close: releaseSubagentPanels.)
267
+ if (eventType === 'session.deleted') {
268
+ const gone = ev?.info?.id || ev?.sessionID || ev?.sessionId;
269
+ if (!gone) return;
270
+ _parentOf.delete(gone);
271
+ _unplaced.delete(gone);
272
+ _closed.forget(gone);
273
+ const entry = _panels.get(gone);
274
+ // (Its requests went with the session: none is handed to a parent's panel.)
275
+ if (entry) destroyPanel(entry, { lost: true, requests: false });
276
+ }
277
+ });
278
+
279
+ // Fallback: many OpenCode SDK builds emit `session.created` for sub-agents
280
+ // either late or without `parentID`. Also detect child-session ids from the
281
+ // agent tool's metadata on `message.part.updated`. Without this fallback, a
282
+ // Task tool can run to completion while the child panel never spawns.
283
+ onEvent((eventType, ev) => {
284
+ if (!_primary) return;
285
+ if (eventType !== 'message.part.updated') return;
286
+ // The spawn is tied to the session the tool ran in (the session in the
287
+ // main panel, another tab, or a sub-agent), not to the one on screen.
288
+ const parentSid = ev?.sessionID || ev?.sessionId;
289
+ if (!parentSid) return;
290
+
291
+ const part = ev.part || {};
292
+ if (part.type !== 'tool') return;
293
+ const toolName = part.tool || part.name || '';
294
+ const childSid = part?.state?.metadata?.sessionId
295
+ || part?.state?.metadata?.sessionID
296
+ || part?.metadata?.sessionId
297
+ || part?.metadata?.sessionID
298
+ || part?.state?.input?.sessionId
299
+ || part?.state?.input?.sessionID
300
+ || '';
301
+ const replayPart = part;
302
+ if (!childSid) return;
303
+ // If the tool name isn't a known agent tool, only continue when the
304
+ // session id metadata is present AND it differs from the parent (which
305
+ // means it really is a child session id, not noise).
306
+ const isKnownAgent = AGENT_TOOL_NAMES.has(toolName);
307
+ if (!isKnownAgent && (childSid === parentSid)) return;
308
+ // The triggering event was already dispatched by the WS layer BEFORE the
309
+ // child store was registered, so per-session fanout dropped it. Replay
310
+ // into the child store after spawn so the agent-tool input/output isn't
311
+ // lost from the child transcript.
312
+ const replay = replayPart ? (store) => store.upsertPart(replayPart) : null;
313
+ // Pull the task brief from the parent's tool input so the child header can
314
+ // show "explore · do X" instead of an opaque "idle".
315
+ const taskInfo = describeAgentTask(replayPart, ev, toolName);
316
+ ensureChildSpawn(parentSid, childSid, null, replay, taskInfo, { inferred: true });
317
+ });
318
+ }
319
+
320
+ // The descendants of `rootSid` as the server lists them: its children, then
321
+ // the children of each of those. `wanted()` turns false once the scan was
322
+ // overtaken; nothing more is asked then.
323
+ async function readChildTree(rootSid, wanted) {
324
+ const out = [];
325
+ const seen = new Set([rootSid]);
326
+ let level = [rootSid];
327
+ for (let depth = 0; depth < 12 && level.length; depth += 1) {
328
+ const next = [];
329
+ for (const parent of level) {
330
+ if (!wanted()) return out;
331
+ const children = listOf(await api.sessionChildren({ sessionId: parent }))
332
+ .filter((s) => readParentID(s) === parent);
333
+ for (const child of children) {
334
+ const id = child?.id || child?.sessionID;
335
+ if (!id || seen.has(id)) continue;
336
+ seen.add(id);
337
+ out.push(child);
338
+ next.push(id);
339
+ }
340
+ }
341
+ level = next;
342
+ }
343
+ return descendantsOf([{ id: rootSid }, ...out], rootSid);
344
+ }
345
+
346
+ function describeAgentTask(part, ev, toolName) {
347
+ const input = part?.state?.input || part?.input || ev?.state?.input || ev?.input || {};
348
+ const description = String(input.description || '').trim();
349
+ const prompt = String(input.prompt || '').trim();
350
+ const subagentType = String(input.subagent_type || input.agent || input.agentType || '').trim();
351
+ const summary = description || (prompt ? prompt.split(/\r?\n/, 1)[0] : '');
352
+ return {
353
+ subagentType: subagentType || toolName || '',
354
+ summary: summary || '',
355
+ };
356
+ }
357
+
358
+ // When a child arrives via session.created (no tool part attached), scan the
359
+ // parent's recent message parts for the agent-tool call whose metadata points
360
+ // to this child's sessionId. Lets the header show "explore · do X" even when
361
+ // the spawn was reported through the SDK's session events rather than the
362
+ // tool-call replay path.
363
+ // The task card is in the transcript of the session that started the
364
+ // sub-agent: the main panel's for a sub-agent of the session it is on, the
365
+ // parent's own panel for a sub-agent of a sub-agent.
366
+ function lookupParentTaskInfo(childSid, parentSid = _parentOf.get(childSid)) {
367
+ if (!childSid) return null;
368
+ for (const store of [_panels.get(parentSid)?.store, _primary?.store]) {
369
+ const found = store ? taskInfoIn(store.getState(), childSid) : null;
370
+ if (found) return found;
371
+ }
372
+ return null;
373
+ }
374
+
375
+ function taskInfoIn(s, childSid) {
376
+ const order = s.messageOrder || [];
377
+ for (let i = order.length - 1; i >= 0; i--) {
378
+ const msg = s.messages?.get?.(order[i]);
379
+ if (!msg?.parts) continue;
380
+ for (const part of msg.parts.values()) {
381
+ if (part?.type !== 'tool') continue;
382
+ const toolName = part.tool || part.name || '';
383
+ const metaSid =
384
+ part?.state?.metadata?.sessionId ||
385
+ part?.state?.metadata?.sessionID ||
386
+ part?.metadata?.sessionId ||
387
+ part?.metadata?.sessionID ||
388
+ part?.state?.input?.sessionId ||
389
+ part?.state?.input?.sessionID ||
390
+ '';
391
+ if (metaSid !== childSid) continue;
392
+ return describeAgentTask(part, null, toolName);
393
+ }
394
+ }
395
+ return null;
396
+ }
397
+
398
+ // A session whose sub-agents get their panels here: the one the main panel is
399
+ // on, or another of its tabs.
400
+ function isRootSession(sessionId) {
401
+ if (!_primary || !sessionId) return false;
402
+ if (sessionId === _primary.getSessionId?.()) return true;
403
+ try { return _primary.ownsSession?.(sessionId) === true; } catch { return false; }
404
+ }
405
+
406
+ // The automation's session that `sessionId` is, or is below, at any depth
407
+ // ('' when there is none).
408
+ // chain the parents its panel was made with, should a link be forgotten
409
+ function automationOver(sessionId, chain = []) {
410
+ return [...lineageOf(sessionId, _parentOf), ...chain].find((id) => isAutomationSession(id)) || '';
411
+ }
412
+
413
+ // A sub-agent whose chain of parents does not reach a tab (yet).
414
+ function waitForParent(childSid, { parentSid, childInfo, taskInfo }) {
415
+ const was = _unplaced.get(childSid);
416
+ _unplaced.delete(childSid);
417
+ _unplaced.set(childSid, { parentSid, childInfo: childInfo || was?.childInfo || null, taskInfo: taskInfo || was?.taskInfo || null });
418
+ while (_unplaced.size > UNPLACED_MAX) _unplaced.delete(_unplaced.keys().next().value);
419
+ }
420
+
421
+ // A sub-agent got its panel: the sub-agents that named it as their parent
422
+ // before its own parent link was known are placed now, and theirs after them.
423
+ function placeWaitingChildren(parentSid, { announce }) {
424
+ for (const [childSid, was] of [..._unplaced]) {
425
+ if (was.parentSid !== parentSid || !_unplaced.has(childSid)) continue;
426
+ _unplaced.delete(childSid);
427
+ ensureChildSpawn(parentSid, childSid, was.childInfo, null, was.taskInfo || lookupParentTaskInfo(childSid, parentSid), { announce });
428
+ }
429
+ }
430
+
431
+ // The panel of `childSid`, made when it has none. Returns its entry, or null
432
+ // when the sub-agent gets no panel: its lineage does not lead to a tab of this
433
+ // panel, an automation owns it, or the user closed it (`reopen` lifts that).
434
+ // announce a sub-agent that just started (a toast, the pill's entrance)
435
+ // inferred the parent is what a task tool's part, a task card or a crumb
436
+ // says, not what the server reported for the session
437
+ function ensureChildSpawn(parentSid, childSid, childInfo, replay, taskInfo, { announce = true, reopen = false, inferred = false } = {}) {
438
+ if (!_primary || !parentSid || !childSid || parentSid === childSid) return null;
439
+ // A link that is only inferred never replaces a known one: a sub-agent
440
+ // stays where its session says it is, and an automation's sub-agent stays
441
+ // an automation's, whatever names it as its own.
442
+ const known = _parentOf.get(childSid);
443
+ if (inferred && known && known !== parentSid) parentSid = known;
444
+ _parentOf.set(childSid, parentSid);
445
+ if (!shouldMaterializeChildPanel(parentSid, childSid)) {
446
+ destroyPanelsOf(parentSid);
447
+ return null;
448
+ }
449
+ // A session an automation owns has no pill and no panel here, and neither
450
+ // has anything below it, at any depth. Checked on the whole chain of
451
+ // parents, whatever announced the sub-agent, and for one that has a panel
452
+ // as for a new one: a session can become an automation's at any moment.
453
+ const existing = _panels.get(childSid);
454
+ const owner = automationOver(childSid, existing?.chain);
455
+ if (owner) {
456
+ destroyPanelsOf(owner);
457
+ return null;
458
+ }
459
+ if (existing) {
460
+ if (typeof replay === 'function') {
461
+ try { replay(existing.store); } catch (err) {
462
+ console.warn('[ocp-v2-manager] child event replay failed', err);
463
+ }
464
+ }
465
+ if (taskInfo && existing.instance?.setTaskInfo) {
466
+ try {
467
+ existing.instance.setTaskInfo(taskInfo);
468
+ if (taskInfo.subagentType || taskInfo.summary) existing.briefed = true;
469
+ } catch {}
470
+ }
471
+ return existing;
472
+ }
473
+ const placed = placeSubagent({ parentSessionId: parentSid, childSessionId: childSid, parentOf: _parentOf, isRoot: isRootSession });
474
+ if (!placed) {
475
+ // The chain of its parents does not reach a tab (yet). When the link that
476
+ // is missing arrives, the sub-agent is placed with its parent.
477
+ waitForParent(childSid, { parentSid, childInfo, taskInfo });
478
+ return null;
479
+ }
480
+ // An automation's sub-agents stay inside its one tab, at every depth.
481
+ if (placed.chain.some((sessionId) => isAutomationSession(sessionId))) return null;
482
+ // The user closed this sub-agent's panel: no event and no scan brings it back.
483
+ if (!reopen && _closed.isClosed(childSid)) return null;
484
+ _closed.reopen(childSid);
485
+ return spawnChildPanel({
486
+ childSessionId: childSid,
487
+ childInfo,
488
+ parentPanelId: _primary.panelId,
489
+ parentSessionId: parentSid,
490
+ rootSessionId: placed.rootSessionId,
491
+ chain: placed.chain,
492
+ parentTitle: parentTitleFor(_primary, parentSid),
493
+ replay,
494
+ taskInfo,
495
+ announce,
496
+ });
497
+ }
498
+
499
+ // The title of the session that spawned the sub-agent. A sub-agent that has
500
+ // sub-agents itself is known by its own panel. Else the primary panel's store
501
+ // knows it while it is bound to that session; a child of a session the
502
+ // panel is not on (a spawn that arrives after a tab switch) gets that
503
+ // session's own title from what the store has seen of it, never the title of
504
+ // the session on screen.
505
+ function parentTitleFor(reg, parentSid) {
506
+ try {
507
+ const own = _panels.get(parentSid);
508
+ if (own) return own.instance.title();
509
+ const s = reg.store?.getState?.();
510
+ const bound = reg.getSessionId?.() || '';
511
+ const info = !parentSid || parentSid === bound ? s?.sessionInfo : s?.knownSessions?.get?.(parentSid);
512
+ return String(info?.title || info?.slug || (parentSid || bound).slice(0, 8) || 'parent').trim() || 'parent';
513
+ } catch { return 'parent'; }
514
+ }
515
+
516
+ // The tool profile the user chose for a session (the project bar saves it
517
+ // under this key): what a sub-agent of a session that is not on screen inherits.
518
+ const MCP_SESSION_PROFILE_KEY = 'synabun-opencode-session-mcp-profiles';
519
+ function savedSessionProfile(sessionId) {
520
+ try {
521
+ const parsed = JSON.parse(storage.getItem(MCP_SESSION_PROFILE_KEY) || '{}');
522
+ return (parsed && typeof parsed === 'object' && parsed[sessionId]) || null;
523
+ } catch { return null; }
524
+ }
525
+
526
+ function spawnChildPanel({ childSessionId, childInfo, parentPanelId, parentSessionId, rootSessionId, chain, parentTitle, replay, taskInfo, announce }) {
527
+ const panelId = `ocp-v2-child-${childSessionId.slice(0, 8)}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 6)}`;
528
+ const store = createPanelStore();
529
+ store.setSession(childSessionId, childInfo || null);
530
+ store.setParentSession(parentSessionId, parentPanelId);
531
+ // The parent's profile: the primary store's only while it is bound to that
532
+ // parent (see inheritChildPanelMcpProfile).
533
+ inheritChildPanelMcpProfile(store, _primary?.store, childInfo, { parentSessionId, savedProfile: savedSessionProfile });
534
+
535
+ const wsUnsub = subscribeSession(childSessionId, store);
536
+
537
+ // Replay must run AFTER subscribe so the part lands in the child store; the
538
+ // store de-dupes by id, so a later WS event for the same part is harmless.
539
+ if (typeof replay === 'function') {
540
+ try { replay(store); } catch (err) {
541
+ console.warn('[ocp-v2-manager] initial child event replay failed', err);
542
+ }
543
+ }
544
+
545
+ // Surface a toast so the user gets immediate visual feedback that a
546
+ // sub-agent spawned — the tray pill alone is easy to miss when the user
547
+ // is looking at the panel content. (Not for the pills a reload rebuilds.)
548
+ if (announce) {
549
+ try {
550
+ uiNotify('panel', NOTIF_TYPE.ACTION, `↳ Sub-agent of ${parentTitle}`, {
551
+ panel: 'opencode',
552
+ provider: 'opencode',
553
+ });
554
+ } catch (err) {
555
+ console.warn('[ocp-v2-manager] spawn notification failed', err);
556
+ }
557
+ }
558
+
559
+ // When this sub-agent has just become idle, re-poke the parent's plan
560
+ // lifecycle so a PLAN COMPLETE deferred by an in-flight sub-agent finalizes
561
+ // now. Lazy import avoids a static cycle (plan.js → manager.js → plan.js).
562
+ const childRunSub = store.subscribe((event, state) => {
563
+ if (event?.type !== 'running:set' || state.running) return;
564
+ if (!_primary?.store) return;
565
+ // The plan turn this sub-agent was part of is its parent's: when the
566
+ // primary panel is on another session, that session's plan is not poked.
567
+ if (_primary.getSessionId?.() !== parentSessionId) return;
568
+ if (!_primary.store.getState().planTurnActive) return;
569
+ const at = captureBinding(_primary.store);
570
+ // ...and it is that plan turn that is poked, not one begun after it.
571
+ const planTurn = _primary.store.getState().planTurnId;
572
+ import('./ocp-v2-plan.js').then(({ maybeFinalizePlanTurn }) => {
573
+ if (!at.isCurrent()) return;
574
+ maybeFinalizePlanTurn('child:idle', _primary.store, { lenient: true, planTurn }).catch(() => {});
575
+ }).catch(() => {});
576
+ });
577
+
578
+ const entry = {
579
+ panelId,
580
+ sessionId: childSessionId,
581
+ parentSessionId,
582
+ rootSessionId,
583
+ chain,
584
+ depth: Math.max(0, chain.length - 1),
585
+ startedAt: Number(childInfo?.time?.created) || Date.now(),
586
+ // Its session was read whole (the panel was shown once); its brief is known.
587
+ hydrated: false,
588
+ hydration: null,
589
+ briefed: !!(taskInfo && (taskInfo.subagentType || taskInfo.summary)),
590
+ store,
591
+ instance: null,
592
+ wsUnsub,
593
+ runSub: childRunSub,
594
+ };
595
+ entry.instance = createChildPanel({
596
+ panelId,
597
+ sessionId: childSessionId,
598
+ store,
599
+ parentPanelId,
600
+ parentSessionId,
601
+ rootSessionId,
602
+ parentTitle,
603
+ depth: entry.depth,
604
+ getChain: () => chain.map((sessionId) => ({ sessionId, title: parentTitleFor(_primary, sessionId) })),
605
+ taskInfo,
606
+ announce,
607
+ // Rebuilt from the server's list, not just started: it ran before.
608
+ started: !announce,
609
+ onUndelivered: (item, detail) => keepUnsent(entry, item, detail),
610
+ takeUnsent: () => _unsent.take(childSessionId),
611
+ onRequestView: (request) => requestOpencodeView(request),
612
+ onVisibility: (visible) => onChildVisibility(entry, visible),
613
+ onOpenAncestor: (sessionId) => openChildSession(_parentOf.get(sessionId) || rootSessionId, sessionId),
614
+ onOpenChild: (grandchildSid) => openChildSession(childSessionId, grandchildSid),
615
+ onStateChange: scheduleTraySync,
616
+ onClose: (id, detail) => onChildClosed(entry, detail),
617
+ });
618
+ _panels.add(entry);
619
+ _unplaced.delete(childSessionId);
620
+ syncSubagentTray();
621
+
622
+ // What its pill needs is read now; its transcript when its panel is first
623
+ // shown (showsFirstTime).
624
+ readPillState(entry);
625
+ // Sub-agents of this one that were announced before it could be placed.
626
+ placeWaitingChildren(childSessionId, { announce });
627
+ return entry;
628
+ }
629
+
630
+ // A prompt was on its way to a sub-agent when its panel went away (the user
631
+ // closed it, its parent's tab was closed, its session was deleted somewhere
632
+ // else), and the send then failed. It is kept for that sub-agent: back in its
633
+ // compose box when its panel is opened again, or now, when it already is
634
+ // open again. The main panel says so, once.
635
+ function keepUnsent(entry, item, { error = '' } = {}) {
636
+ if (!_unsent.keep(entry.sessionId, item)) return;
637
+ let label = '';
638
+ try { label = entry.instance?.title?.() || ''; } catch { label = ''; }
639
+ const { sessionId, parentSessionId } = entry;
640
+ try {
641
+ _primary?.store?.pushError({
642
+ message: unsentSubagentNotice({ item, label, error }),
643
+ notice: true,
644
+ // The way to it, whatever became of its task card. (A notice that
645
+ // offers something goes when that is chosen.)
646
+ actions: [{
647
+ label: 'Open sub-agent',
648
+ run: (err) => { if (openWithUnsent({ sessionId, parentSessionId, label })) _primary?.store?.dismissError?.(err.id); },
649
+ }],
650
+ });
651
+ } catch (err) { console.warn('[ocp-v2-manager] reporting an unsent sub-agent prompt failed', err); }
652
+ const now = _panels.get(entry.sessionId);
653
+ if (now && now !== entry) { try { now.instance?.restoreUnsent?.(); } catch {} }
654
+ }
655
+
656
+ // "Open sub-agent" on that notice: its panel, with the prompt back in its
657
+ // compose box. A sub-agent that cannot have a panel any more (its parent is
658
+ // no tab of this window now, or an automation owns it) has what was kept for
659
+ // it moved to notices of the main panel (Put back / Discard): nothing stays
660
+ // where nobody can get at it. False when neither could be done.
661
+ function openWithUnsent({ sessionId, parentSessionId, label }) {
662
+ if (openChildSession(parentSessionId, sessionId) || _panels.has(sessionId)) return true;
663
+ const items = _unsent.peek(sessionId);
664
+ if (!items.length) return true;
665
+ if (typeof _primary?.keepPrompts !== 'function') return false;
666
+ try { _primary.keepPrompts(items, label); } catch (err) {
667
+ console.warn('[ocp-v2-manager] keeping an unsent sub-agent prompt failed', err);
668
+ return false;
669
+ }
670
+ _unsent.take(sessionId);
671
+ return true;
672
+ }
673
+
674
+ // The panel is gone (the user closed it, or destroyPanel took it down).
675
+ function onChildClosed(entry, { byUser = false, waiting = [], label = '' } = {}) {
676
+ if (_panels.get(entry.sessionId) !== entry) return;
677
+ _panels.remove(entry.sessionId);
678
+ try { entry.wsUnsub?.(); } catch {}
679
+ try { entry.runSub?.(); } catch {}
680
+ // A request that was waiting for the user in this panel still waits in
681
+ // OpenCode: it shows in the nearest parent that has a panel, at once.
682
+ if (entry.handRequestsOver !== false) {
683
+ try { handOverRequests(entry.store, { within: entry.rootSessionId }); } catch (err) { console.warn('[ocp-v2-manager] handing over a closed panel\'s requests failed', err); }
684
+ }
685
+ // Closed by the user: it stays closed. Gone with its session or its parent's
686
+ // tab (`released`): nothing to remember.
687
+ if (byUser && !entry.released) _closed.close(entry.sessionId, entry.rootSessionId);
688
+ // Nobody was asked about what was still unsent in its compose box: kept for the user.
689
+ if (!byUser && waiting.length) {
690
+ try { _primary?.keepPrompts?.(waiting, label); } catch (err) { console.warn('[ocp-v2-manager] keeping a closed sub-agent panel\'s prompts failed', err); }
691
+ }
692
+ requestOpencodeView({ removed: entry.panelId });
693
+ }
694
+
695
+ // Takes a sub-agent panel down because its session, or its parent's, went.
696
+ // lost nobody closed it by hand: what was waiting in it is kept (onChildClosed)
697
+ // requests false when the sessions themselves are gone (deleted, or their
698
+ // tab was closed): no request of theirs is handed to a parent
699
+ function destroyPanel(entry, { lost = true, requests = true } = {}) {
700
+ if (!entry || _panels.get(entry.sessionId) !== entry) return;
701
+ entry.released = true;
702
+ if (!requests) entry.handRequestsOver = false;
703
+ try { entry.instance?.unmount?.({ byUser: !lost }); } catch (err) { console.warn('[ocp-v2-manager] closing a sub-agent panel failed', err); }
704
+ // (unmount reports through onClose; this is for a panel that threw on the way.)
705
+ if (_panels.get(entry.sessionId) === entry) onChildClosed(entry, { byUser: !lost });
706
+ }
707
+
708
+ // The panel of `sessionId` and every panel below it go, at any depth: the
709
+ // session became an automation's (or is one).
710
+ function destroyPanelsOf(sessionId) {
711
+ if (!sessionId) return;
712
+ for (const entry of entriesUnder(_panels.all(), sessionId, _parentOf)) destroyPanel(entry, { lost: true });
713
+ }
714
+
715
+ /**
716
+ * The parent session left the main panel for good: its tab was closed or its
717
+ * session is gone. Its sub-agents' panels and pills go with it.
718
+ * lost it went by itself (deleted somewhere else, lost by OpenCode): the
719
+ * user could not be asked, so what was still unsent in those panels
720
+ * is kept on notices. A tab the user closed was asked about it
721
+ * (subagentPromptsWaiting is part of that question).
722
+ */
723
+ export function releaseSubagentPanels(rootSessionId, { lost = false } = {}) {
724
+ if (!rootSessionId) return;
725
+ for (const entry of _panels.ofRoot(rootSessionId)) destroyPanel(entry, { lost, requests: false });
726
+ _closed.forgetRoot(rootSessionId);
727
+ syncSubagentTray();
728
+ }
729
+
730
+ /** What is still unsent in the sub-agent panels of `rootSessionId` (their queues and drafts). */
731
+ export function subagentPromptsWaiting(rootSessionId) {
732
+ const waiting = [];
733
+ for (const entry of _panels.ofRoot(rootSessionId)) {
734
+ try { waiting.push(...(entry.instance?.waiting?.() || [])); } catch { /* a panel that cannot say holds nothing */ }
735
+ }
736
+ return waiting;
737
+ }
738
+
739
+ // ── Which panel is on screen ────────────────────────────────────────────────
740
+
741
+ function visibleEntry() {
742
+ return _panels.all().find((entry) => entry.instance?.isVisible?.()) || null;
743
+ }
744
+
745
+ // True while requestOpencodeView applies its own decision: a panel that goes
746
+ // off screen then was told to, and is not reported as yielded.
747
+ let _applying = false;
748
+
749
+ /**
750
+ * The one way an OpenCode panel goes on or off screen: the main panel, every
751
+ * sub-agent panel, the pills, the breadcrumbs, the task cards and the navbar
752
+ * button ask here, and decideVisibility (ocp-v2-subagents-logic.js) answers.
753
+ * Showing a panel goes through the shared side panel controller, which takes
754
+ * the slot from whatever other provider (Claude, Codex) had it.
755
+ */
756
+ export function requestOpencodeView(request) {
757
+ const entries = _panels.all();
758
+ const views = [MAIN_VIEW, ...entries.map((entry) => entry.panelId)];
759
+ const visible = [
760
+ ...(_mainView?.isVisible?.() ? [MAIN_VIEW] : []),
761
+ ...entries.filter((entry) => entry.instance?.isVisible?.()).map((entry) => entry.panelId),
762
+ ];
763
+ const plan = decideVisibility({ views, visible, request });
764
+ const apply = (id, next) => {
765
+ if (id === MAIN_VIEW) { if (_mainView?.owner) setSidepanelVisible(_mainView.owner, next); return; }
766
+ try { _panels.byPanelId(id)?.instance?.applyRequested?.(next); } catch (err) { console.warn('[ocp-v2-manager] sub-agent panel visibility failed', err); }
767
+ };
768
+ const was = _applying;
769
+ _applying = true;
770
+ try {
771
+ for (const id of plan.hide) apply(id, false);
772
+ for (const id of plan.show) apply(id, true);
773
+ } finally { _applying = was; }
774
+ syncSubagentTray();
775
+ noteShown();
776
+ return plan;
777
+ }
778
+
779
+ // The shared controller put a sub-agent panel on or off screen. Off, and not
780
+ // by a decision made here: another provider's panel has the slot now.
781
+ function onChildVisibility(entry, visible) {
782
+ if (visible) showsFirstTime(entry);
783
+ if (!visible && !_applying && _panels.get(entry.sessionId) === entry) requestOpencodeView({ yielded: entry.panelId });
784
+ else scheduleTraySync();
785
+ }
786
+
787
+ // The session of a sub-agent's panel, read whole (info, transcript, run
788
+ // state, requests, todos): once, the first time the panel is on screen. From
789
+ // then on the panel follows its session as the main panel does, also across
790
+ // a reconnect. Until then the sub-agent costs what its pill needs (readPillState).
791
+ function hydrateEntry(entry) {
792
+ if (!entry.hydration) {
793
+ entry.hydrated = true;
794
+ entry.hydration = _hydrations(() => hydrateChildPanel(entry.store, entry.sessionId)).catch((err) => {
795
+ console.warn('[ocp-v2-manager] hydrate child panel failed', err);
796
+ return null;
797
+ });
798
+ }
799
+ return entry.hydration;
800
+ }
801
+
802
+ function showsFirstTime(entry) {
803
+ if (_panels.get(entry.sessionId) !== entry) return;
804
+ hydrateEntry(entry);
805
+ resolveTaskInfo(entry).catch((err) => console.warn('[ocp-v2-manager] looking up a sub-agent\'s brief failed', err));
806
+ }
807
+
808
+ // The brief of a sub-agent is on the task card in its parent's transcript. A
809
+ // parent that is a sub-agent itself has its transcript read when its own
810
+ // panel is first shown, so the brief of a sub-agent below it may not be known
811
+ // when its pill is made: it is looked up when its own panel is shown, after
812
+ // the parent's transcript was read for it.
813
+ async function resolveTaskInfo(entry) {
814
+ if (entry.briefed) return;
815
+ const lookup = () => lookupParentTaskInfo(entry.sessionId, entry.parentSessionId);
816
+ let info = lookup();
817
+ const parent = _panels.get(entry.parentSessionId);
818
+ if (!info && parent) {
819
+ await hydrateEntry(parent);
820
+ info = lookup();
821
+ }
822
+ // (The panel may have been closed, or told its brief by an event, meanwhile.)
823
+ if (!info || entry.briefed || _panels.get(entry.sessionId) !== entry) return;
824
+ entry.briefed = true;
825
+ try { entry.instance?.setTaskInfo?.(info); } catch {}
826
+ }
827
+
828
+ // Remembers the sub-agent panel that is on screen, for the reload.
829
+ function noteShown() {
830
+ const entry = visibleEntry();
831
+ _shown.note(entry ? { rootSessionId: entry.rootSessionId, sessionId: entry.sessionId } : null);
832
+ }
833
+
834
+ // ── The tray ────────────────────────────────────────────────────────────────
835
+
836
+ let _groupEl = null; // the pills of the session the main panel is on
837
+ let _summaryEl = null;
838
+ let _traySyncQueued = false;
839
+ let _groupLayoutKey = ''; // what the group's height was last measured for
840
+ let _groupHeight; // the height the group may take (trayGroupHeight), once measured
841
+
842
+ // Store events come in bursts (every streamed token): one tray pass per tick.
843
+ function scheduleTraySync() {
844
+ if (_traySyncQueued) return;
845
+ _traySyncQueued = true;
846
+ setTimeout(() => { _traySyncQueued = false; syncSubagentTray(); }, 0);
847
+ }
848
+
849
+ function tabPillOf(tray, sessionId) {
850
+ for (const node of tray.children || []) {
851
+ if (node?.dataset?.sessionId !== sessionId) continue;
852
+ if (String(node.dataset.owner || '').startsWith('ocp-v2-child-')) continue;
853
+ if (node.classList?.contains('ocpv2-session-pill')) return node;
854
+ }
855
+ return null;
856
+ }
857
+
858
+ /**
859
+ * Brings the tray in line with the sub-agent panels: the pills of the session
860
+ * the main panel is on, in the order the sub-agents were started, in one
861
+ * bounded group under that session's pill; a count once the group scrolls; and
862
+ * on every parent session's pill whether its sub-agents run or wait. The pills
863
+ * of other sessions' sub-agents are kept out of the tray, as they are.
864
+ */
865
+ export function syncSubagentTray() {
866
+ const tray = typeof document !== 'undefined' ? document.getElementById('term-minimized-tray') : null;
867
+ if (!tray) return;
868
+ const shownRoot = _primary?.getSessionId?.() || '';
869
+ const entries = _panels.all();
870
+ const byId = new Map(entries.map((entry) => [entry.sessionId, entry]));
871
+ const plan = trayPills({
872
+ entries,
873
+ shownRoot,
874
+ visiblePanelId: visibleEntry()?.panelId || '',
875
+ stateOf: (entry) => entry.instance?.pillState?.() || { state: 'idle' },
876
+ });
877
+
878
+ if (!_groupEl) {
879
+ _groupEl = document.createElement('div');
880
+ _groupEl.classList.add('ocpv2-subagent-pills');
881
+ _summaryEl = document.createElement('div');
882
+ _summaryEl.classList.add('ocpv2-subagent-summary');
883
+ _summaryEl.hidden = true;
884
+ _groupEl.appendChild(_summaryEl);
885
+ }
886
+
887
+ // The pills of this session, in order; every other pill leaves the group.
888
+ const wanted = plan.pills.map((pill) => byId.get(pill.sessionId)?.instance?.pill).filter(Boolean);
889
+ for (const node of [...(_groupEl.children || [])]) {
890
+ if (node !== _summaryEl && !wanted.includes(node)) node.remove();
891
+ }
892
+ wanted.forEach((pill, index) => {
893
+ if (_groupEl.children[index + 1] !== pill) _groupEl.insertBefore(pill, _groupEl.children[index + 1] || null);
894
+ });
895
+
896
+ if (_summaryEl.textContent !== plan.summary.text) _summaryEl.textContent = plan.summary.text;
897
+ _summaryEl.classList.toggle('ocpv2-summary-waiting', plan.summary.waiting > 0);
898
+
899
+ // The group sits right under its parent session's pill (or stands alone
900
+ // while that pill is hidden because the main panel is on screen).
901
+ const parentPill = shownRoot ? tabPillOf(tray, shownRoot) : null;
902
+ if (!wanted.length) {
903
+ if (_groupEl.parentNode) _groupEl.remove();
904
+ } else if (parentPill) {
905
+ if (parentPill.nextSibling !== _groupEl) tray.insertBefore(_groupEl, parentPill.nextSibling);
906
+ } else if (_groupEl.parentNode !== tray) {
907
+ tray.appendChild(_groupEl);
908
+ }
909
+ const docked = !!wanted.length && !!parentPill && parentPill.style?.display !== 'none';
910
+ _groupEl.classList.toggle('ocpv2-pills-docked', docked);
911
+ // The tray ends inside the window: the group takes the room the other pills
912
+ // leave (trayGroupHeight), however little that is, and scrolls inside it.
913
+ // Measured when the pills or their place changed, not on every state change
914
+ // of a sub-agent.
915
+ const layoutKey = `${wanted.length}|${shownRoot}|${docked}|${tray.children.length}`;
916
+ if (wanted.length && layoutKey !== _groupLayoutKey) {
917
+ _groupLayoutKey = layoutKey;
918
+ try {
919
+ const trayBox = tray.getBoundingClientRect();
920
+ _groupHeight = trayGroupHeight({ trayTop: trayBox.top, othersHeight: trayBox.height - _groupEl.getBoundingClientRect().height, viewportHeight: window.innerHeight });
921
+ _groupEl.style.maxHeight = `${_groupHeight}px`;
922
+ } catch { /* the stylesheet's bound holds */ }
923
+ }
924
+ // More pills than the group shows at once (its rows, or the room it got):
925
+ // it scrolls, and the count line says how many there are and how many wait.
926
+ const scrolls = plan.scrolls || trayGroupScrolls({ count: wanted.length, height: _groupHeight });
927
+ _summaryEl.hidden = !scrolls;
928
+ wanted.forEach((pill, index) => pill.classList.toggle('ocpv2-pill-docked', docked && index === 0 && !scrolls));
929
+
930
+ // What each parent session's own pill says about its sub-agents.
931
+ for (const node of tray.children || []) {
932
+ const sessionId = node?.dataset?.sessionId;
933
+ if (!sessionId || node === _groupEl || String(node.dataset.owner || '').startsWith('ocp-v2-child-')) continue;
934
+ if (!node.classList?.contains('ocpv2-session-pill')) continue;
935
+ const flags = plan.parents.get(sessionId) || { hasChild: false, running: false, waiting: false };
936
+ node.classList.toggle('ocpv2-pill-has-child', flags.hasChild);
937
+ node.classList.toggle('ocpv2-pill-child-running', flags.running && !flags.waiting);
938
+ node.classList.toggle('ocpv2-pill-child-waiting', flags.waiting);
939
+ node.classList.toggle('ocpv2-pill-parent-docked', docked && sessionId === shownRoot && !scrolls);
940
+ }
941
+
942
+ // A sub-agent that waits for an answer is brought into view inside the group.
943
+ const waitingPill = plan.firstWaiting ? byId.get(plan.firstWaiting)?.instance?.pill : null;
944
+ if (waitingPill && waitingPill !== _lastWaitingPill && scrolls) {
945
+ try {
946
+ const top = waitingPill.offsetTop - (_summaryEl.offsetHeight || 0) - 4;
947
+ if (top < _groupEl.scrollTop || top + waitingPill.offsetHeight > _groupEl.scrollTop + _groupEl.clientHeight) _groupEl.scrollTop = Math.max(0, top);
948
+ } catch { /* no layout */ }
949
+ }
950
+ _lastWaitingPill = waitingPill || null;
951
+ }
952
+ let _lastWaitingPill = null;
953
+
954
+ // What a pill needs of its session: is it running, and which requests wait
955
+ // for the user (the events before the pill was made reached no store). Read
956
+ // when the pill is made and again after the socket came back. Not its
957
+ // transcript, its session info or its todos: those are the panel's, read
958
+ // when it is first shown.
959
+ const PILL_API = {
960
+ sessionStatus: (args) => api.sessionStatus(args),
961
+ permissionList: (args) => api.permissionList(args),
962
+ questionList: (args) => api.questionList(args),
963
+ };
964
+
965
+ // The directory a sub-agent's session runs in: its own, else its parent session's.
966
+ function directoryOf(entry) {
967
+ const s = entry.store.getState();
968
+ if (s.cwd || s.sessionInfo?.directory) return s.cwd || s.sessionInfo.directory;
969
+ const main = _primary?.store?.getState?.();
970
+ if (!main) return undefined;
971
+ if (_primary.getSessionId?.() === entry.rootSessionId) return main.cwd || main.sessionInfo?.directory || undefined;
972
+ return main.knownSessions?.get?.(entry.rootSessionId)?.directory || undefined;
973
+ }
974
+
975
+ function pillRead(entry) {
976
+ return rehydrateSessionState(entry.store, PILL_API, {
977
+ sessionId: entry.sessionId,
978
+ cwd: directoryOf(entry),
979
+ hasPanel: hasSessionStore,
980
+ isDescendant: isDescendantSession,
981
+ isCurrent: () => _panels.get(entry.sessionId)?.store === entry.store,
982
+ });
983
+ }
984
+
985
+ function readPillState(entry) {
986
+ return _hydrations(() => {
987
+ // Closed meanwhile, or shown: then the panel's own read covers it.
988
+ if (_panels.get(entry.sessionId) !== entry || entry.hydrated) return null;
989
+ return pillRead(entry);
990
+ }).catch((err) => {
991
+ console.warn('[ocp-v2-manager] reading what a sub-agent\'s pill needs failed', err);
992
+ return null;
993
+ });
994
+ }
995
+
996
+ // Session info, transcript, run state and the sub-agent's own pending approvals,
997
+ // read from the server (for a panel that was never shown: what its pill
998
+ // needs, see above). Runs when the panel is first shown and again after
999
+ // the socket came back: a permission request or the end of the turn that
1000
+ // happened during the outage reached no panel. Answers that arrive after the
1001
+ // panel was closed are dropped (`isCurrent`).
1002
+ function hydrateChildPanel(store, sessionId, { refreshInfo = true } = {}) {
1003
+ const entry = _panels.get(sessionId);
1004
+ if (entry && entry.store === store && !entry.hydrated) {
1005
+ return pillRead(entry).then((live) => ({ info: false, transcript: false, pill: true, live, moved: false, unavailable: false, error: '' }));
1006
+ }
1007
+ return rehydratePanelSession(store, api, {
1008
+ sessionId,
1009
+ refreshInfo,
1010
+ hasPanel: hasSessionStore,
1011
+ isDescendant: isDescendantSession,
1012
+ isCurrent: () => _panels.get(sessionId)?.store === store,
1013
+ });
1014
+ }
1015
+
1016
+ // A task card's "Open sub-agent", or a crumb: show the child session's panel,
1017
+ // making it when it has none (also one the user had closed). Returns true when
1018
+ // a panel was shown.
1019
+ export function openChildSession(parentSessionId, childSessionId) {
1020
+ if (!parentSessionId || !childSessionId) return false;
1021
+ const entry = ensureChildSpawn(parentSessionId, childSessionId, null, null, lookupParentTaskInfo(childSessionId, parentSessionId), { announce: false, reopen: true, inferred: true });
1022
+ if (!entry) return false;
1023
+ requestOpencodeView({ show: entry.panelId });
1024
+ return !!entry.instance?.isVisible?.();
1025
+ }
1026
+
1027
+ /** Every sub-agent panel, in the order the sub-agents were started. */
1028
+ export function getChildPanels() {
1029
+ return _panels.all().map((entry) => ({
1030
+ panelId: entry.panelId,
1031
+ sessionId: entry.sessionId,
1032
+ parentSessionId: entry.parentSessionId,
1033
+ rootSessionId: entry.rootSessionId,
1034
+ visible: !!entry.instance?.isVisible?.(),
1035
+ }));
1036
+ }
1037
+
1038
+ /** The panel of one sub-agent session, or null. */
1039
+ export function getChildPanel(sessionId) {
1040
+ return _panels.get(sessionId)?.instance || null;
1041
+ }
1042
+
1043
+ // True when a sub-agent of `parentSessionId` (the session in the main panel)
1044
+ // is still running. Used by the plan lifecycle to defer PLAN COMPLETE
1045
+ // finalization until the sub-agents have reported back.
1046
+ export function hasRunningChildForParent(parentSessionId) {
1047
+ if (!parentSessionId) return false;
1048
+ if (!_primary || _primary.getSessionId?.() !== parentSessionId) return false;
1049
+ return _panels.ofRoot(parentSessionId).some((entry) => {
1050
+ try { return !!entry.store?.getState?.().running; } catch { return false; }
1051
+ });
1052
+ }
1053
+
1054
+ export function isChildPanelOpen() {
1055
+ return !!visibleEntry();
1056
+ }
1057
+
1058
+ export function getVisibleChildPanel() {
1059
+ return visibleEntry()?.instance || null;
1060
+ }
1061
+
1062
+ export function destroyChildPanelById(panelId) {
1063
+ const entry = _panels.byPanelId(panelId);
1064
+ if (entry) destroyPanel(entry, { lost: true });
1065
+ }