synabun 2.0.9 → 2.0.10

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 (252) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +1 -1
  3. package/THIRD-PARTY-LICENSES.md +46 -4
  4. package/launcher.mjs +9 -3
  5. package/lib/start-launcher.js +6 -1
  6. package/mcp-server/package-lock.json +2 -2
  7. package/mcp-server/package.json +1 -1
  8. package/neural-interface/i18n/en.json +218 -7
  9. package/neural-interface/i18n/pt-BR.json +220 -9
  10. package/neural-interface/lib/account-usage.js +5 -3
  11. package/neural-interface/lib/app-controls-api.js +161 -0
  12. package/neural-interface/lib/assistant-api.js +21 -7
  13. package/neural-interface/lib/assistant-brains/opencode.js +13 -1
  14. package/neural-interface/lib/assistant-brains/opencode2-browser-policy/index.js +44 -0
  15. package/neural-interface/lib/assistant-brains/opencode2-route-gate/index.js +57 -0
  16. package/neural-interface/lib/assistant-catalog.js +17 -2
  17. package/neural-interface/lib/assistant-dispatch.js +3 -0
  18. package/neural-interface/lib/assistant-envelope.js +19 -1
  19. package/neural-interface/lib/assistant-runtime.js +127 -8
  20. package/neural-interface/lib/claude-model-catalog.js +64 -14
  21. package/neural-interface/lib/codex-settings-schema.js +109 -47
  22. package/neural-interface/lib/editor-completion-opencode.js +132 -35
  23. package/neural-interface/lib/exec-loop-command.js +8 -1
  24. package/neural-interface/lib/launch-cache.js +293 -0
  25. package/neural-interface/lib/login-start.js +524 -0
  26. package/neural-interface/lib/native-loop-providers.js +18 -3
  27. package/neural-interface/lib/native-loop-runtime.js +19 -0
  28. package/neural-interface/lib/opencode-db-schema.js +75 -0
  29. package/neural-interface/lib/opencode-history.js +16 -1
  30. package/neural-interface/lib/opencode-protocol.js +173 -0
  31. package/neural-interface/lib/opencode-provider-view.js +81 -0
  32. package/neural-interface/lib/opencode-runtime-config.js +10 -3
  33. package/neural-interface/lib/opencode-serve-records.js +606 -0
  34. package/neural-interface/lib/opencode-v2-client.js +33 -6
  35. package/neural-interface/lib/opencode-v2-ws-requests.js +19 -5
  36. package/neural-interface/lib/opencode-worker-activity.js +229 -0
  37. package/neural-interface/lib/opencode2-client.js +760 -0
  38. package/neural-interface/lib/opencode2-proxy.js +116 -0
  39. package/neural-interface/lib/opencode2-translate.js +1008 -0
  40. package/neural-interface/lib/process-identity.js +361 -0
  41. package/neural-interface/lib/session-cache-builder.js +26 -5
  42. package/neural-interface/lib/session-title-generator.js +18 -0
  43. package/neural-interface/lib/style-guide/api.js +4 -3
  44. package/neural-interface/lib/untrusted-file-headers.js +27 -0
  45. package/neural-interface/package-lock.json +1343 -45
  46. package/neural-interface/package.json +5 -1
  47. package/neural-interface/public/index.html +2 -2
  48. package/neural-interface/public/shared/agent-runtime-options.js +55 -11
  49. package/neural-interface/public/shared/assistant/asst-agents-dock.js +172 -17
  50. package/neural-interface/public/shared/assistant/asst-api.js +11 -3
  51. package/neural-interface/public/shared/assistant/asst-brain-picker.js +195 -80
  52. package/neural-interface/public/shared/assistant/asst-composer.js +1 -1
  53. package/neural-interface/public/shared/assistant/asst-hosts.js +49 -2
  54. package/neural-interface/public/shared/assistant/asst-menu.js +77 -6
  55. package/neural-interface/public/shared/assistant/asst-panel.js +197 -33
  56. package/neural-interface/public/shared/assistant/asst-rack-styles.js +28 -10
  57. package/neural-interface/public/shared/assistant/asst-redact.js +186 -0
  58. package/neural-interface/public/shared/assistant/asst-render.js +382 -36
  59. package/neural-interface/public/shared/assistant/asst-run-stage.js +231 -0
  60. package/neural-interface/public/shared/assistant/asst-sanitize.js +193 -3
  61. package/neural-interface/public/shared/assistant/asst-scene-styles.js +273 -0
  62. package/neural-interface/public/shared/assistant/asst-scenes.js +528 -0
  63. package/neural-interface/public/shared/assistant/asst-sidepanel-styles.js +3 -15
  64. package/neural-interface/public/shared/assistant/asst-state.js +14 -0
  65. package/neural-interface/public/shared/assistant/asst-styles.js +43 -0
  66. package/neural-interface/public/shared/assistant/asst-tool-kinds.js +13 -1
  67. package/neural-interface/public/shared/cc-dropdown.js +480 -0
  68. package/neural-interface/public/shared/cdx/cdx-panel.js +13 -1
  69. package/neural-interface/public/shared/cdx/cdx-render.js +15 -3
  70. package/neural-interface/public/shared/cdx/cdx-styles.js +4 -0
  71. package/neural-interface/public/shared/cdx/cdx-tabs.js +149 -35
  72. package/neural-interface/public/shared/cp/cp-markdown.js +4 -57
  73. package/neural-interface/public/shared/data-cache.js +223 -0
  74. package/neural-interface/public/shared/desktop-bridge.js +11 -0
  75. package/neural-interface/public/shared/desktop-titlebar-view.js +78 -1
  76. package/neural-interface/public/shared/desktop-titlebar.js +214 -28
  77. package/neural-interface/public/shared/desktop-update-view.js +15 -5
  78. package/neural-interface/public/shared/file-links.js +73 -8
  79. package/neural-interface/public/shared/html-shell.js +74 -80
  80. package/neural-interface/public/shared/launch-prefetch.js +59 -0
  81. package/neural-interface/public/shared/ocp-v2/ocp-v2-caps.js +3 -2
  82. package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +7 -2
  83. package/neural-interface/public/shared/ocp-v2/ocp-v2-modelpicker.js +54 -17
  84. package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +93 -2
  85. package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +3 -2
  86. package/neural-interface/public/shared/ocp-v2/ocp-v2-providers.js +11 -9
  87. package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +15 -4
  88. package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +1 -1
  89. package/neural-interface/public/shared/ocp-v2/ocp-v2-send-logic.js +401 -0
  90. package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +16 -9
  91. package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +60 -0
  92. package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +48 -19
  93. package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +195 -19
  94. package/neural-interface/public/shared/opencode-providers.js +39 -0
  95. package/neural-interface/public/shared/schedules-view.js +318 -0
  96. package/neural-interface/public/shared/settings/settings-app-pane.js +335 -0
  97. package/neural-interface/public/shared/settings/settings-app.js +243 -0
  98. package/neural-interface/public/shared/settings/settings-data.js +88 -0
  99. package/neural-interface/public/shared/settings/settings-ia.js +17 -0
  100. package/neural-interface/public/shared/sidepanel-session-status.js +49 -0
  101. package/neural-interface/public/shared/styles.css +540 -371
  102. package/neural-interface/public/shared/ui-assistant.js +27 -5
  103. package/neural-interface/public/shared/ui-automation-studio.js +67 -27
  104. package/neural-interface/public/shared/ui-bookmarks.js +2 -1
  105. package/neural-interface/public/shared/ui-claude-panel.js +76 -8
  106. package/neural-interface/public/shared/ui-codex-panel.js +1 -0
  107. package/neural-interface/public/shared/ui-detail.js +6 -6
  108. package/neural-interface/public/shared/ui-file-links.js +1 -0
  109. package/neural-interface/public/shared/ui-image-gallery.js +6 -5
  110. package/neural-interface/public/shared/ui-invite.js +18 -2
  111. package/neural-interface/public/shared/ui-link.js +9 -9
  112. package/neural-interface/public/shared/ui-menubar.js +232 -33
  113. package/neural-interface/public/shared/ui-native-loop-router.js +2 -0
  114. package/neural-interface/public/shared/ui-opencode-panel-v2.js +1 -0
  115. package/neural-interface/public/shared/ui-schedules-studio.js +2099 -869
  116. package/neural-interface/public/shared/ui-sessions.js +15 -4
  117. package/neural-interface/public/shared/ui-settings.js +87 -36
  118. package/neural-interface/public/shared/ui-sidebar.js +4 -4
  119. package/neural-interface/public/shared/ui-sidepanel-session-entry.js +13 -0
  120. package/neural-interface/public/shared/ui-sidepanel-sessions.js +55 -4
  121. package/neural-interface/public/shared/ui-sidepanel-tray.js +84 -8
  122. package/neural-interface/public/shared/ui-skills.js +70 -12
  123. package/neural-interface/public/shared/ui-sync.js +7 -0
  124. package/neural-interface/public/shared/ui-terminal.js +36 -20
  125. package/neural-interface/public/shared/ui-trash.js +8 -1
  126. package/neural-interface/public/shared/ui-tutorial-steps.js +7 -3
  127. package/neural-interface/public/shared/ui-tutorial.js +15 -5
  128. package/neural-interface/public/shared/ui-update.js +83 -14
  129. package/neural-interface/public/shared/ui-whiteboard.js +2 -1
  130. package/neural-interface/public/variant/2d/main.js +4 -1
  131. package/neural-interface/public/variant/3d/main.js +3 -0
  132. package/neural-interface/public/vendor/highlight/LICENSE +29 -0
  133. package/neural-interface/public/vendor/highlight/github-dark-dimmed-11.12.0.min.css +9 -0
  134. package/neural-interface/public/vendor/highlight/highlight-11.12.0.min.js +1262 -0
  135. package/neural-interface/public/vendor/highlight/manifest.json +5 -0
  136. package/neural-interface/public/vendor/html2canvas/LICENSE +22 -0
  137. package/neural-interface/public/vendor/html2canvas/html2canvas-1.4.1.min.js +20 -0
  138. package/neural-interface/public/vendor/html2canvas/manifest.json +4 -0
  139. package/neural-interface/public/vendor/marked/LICENSE.md +44 -0
  140. package/neural-interface/public/vendor/marked/manifest.json +4 -0
  141. package/neural-interface/public/vendor/marked/marked-14.1.4.esm.js +2502 -0
  142. package/neural-interface/public/vendor/mermaid/LICENSE +21 -0
  143. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/abnfDiagram-PAR5IXJI.mjs +1 -0
  144. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/architecture-7GRP2DOG-M7G3SWCO.mjs +1 -0
  145. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/architectureDiagram-2PNWDENW.mjs +36 -0
  146. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/blockDiagram-PUWGUBOA.mjs +129 -0
  147. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/c4Diagram-3NLNHZP5.mjs +38 -0
  148. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-2NMSUPJH.mjs +1 -0
  149. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-32MCUW2P.mjs +206 -0
  150. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-3NPNU5GP.mjs +1 -0
  151. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-3SMGFRGC.mjs +1 -0
  152. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-4CAJECRU.mjs +14 -0
  153. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-4OADUZ5Q.mjs +10 -0
  154. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5IMINLNL.mjs +1 -0
  155. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5IQCK5RY.mjs +3 -0
  156. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5MVFYWFU.mjs +1 -0
  157. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-AQ6EADP3.mjs +1 -0
  158. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-AZZRMDJM.mjs +15 -0
  159. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-CLS4B6BI.mjs +168 -0
  160. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-DZP67EKU.mjs +70 -0
  161. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-EICP7K5X.mjs +1 -0
  162. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-GDY2UAB4.mjs +1 -0
  163. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-H7VHZCWX.mjs +1 -0
  164. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-IJBDOHL6.mjs +1 -0
  165. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JFFVMJIA.mjs +1 -0
  166. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JQRUD6KW.mjs +1 -0
  167. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JZGDI5JK.mjs +1 -0
  168. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-KD6SPIPN.mjs +2 -0
  169. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-NF366YI6.mjs +231 -0
  170. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-NUDPKBEF.mjs +32 -0
  171. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-OJINMHTS.mjs +1 -0
  172. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-Q6NGPIAH.mjs +2 -0
  173. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-QJSWEUOL.mjs +132 -0
  174. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-R7JDMUKV.mjs +1 -0
  175. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-RCXAM2GK.mjs +1 -0
  176. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-RT4MAWR3.mjs +1 -0
  177. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-SFMINX4W.mjs +1 -0
  178. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-SLDQ463B.mjs +88 -0
  179. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-STOV2HOB.mjs +1 -0
  180. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-T5OCTHI4.mjs +1 -0
  181. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-TCEHX7R3.mjs +1 -0
  182. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VQC2EELJ.mjs +1 -0
  183. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VRZKL3EH.mjs +1 -0
  184. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VTHDQ7BV.mjs +1 -0
  185. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VY2OSTJR.mjs +2 -0
  186. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-WUBWJARI.mjs +1 -0
  187. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-YBMQ5JGJ.mjs +2 -0
  188. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-YDMLL4PJ.mjs +1 -0
  189. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-Z6V44ARX.mjs +62 -0
  190. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZJJ7VQJP.mjs +339 -0
  191. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZNLK7HRR.mjs +1 -0
  192. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZQN7UHIL.mjs +1 -0
  193. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZS6VBONO.mjs +174 -0
  194. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZUNWM646.mjs +1 -0
  195. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/classDiagram-FGAMPOII.mjs +1 -0
  196. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/classDiagram-v2-AI5RJEK4.mjs +1 -0
  197. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cose-bilkent-Q72C2OJ3.mjs +1 -0
  198. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cynefin-OW5HDTMX-6OCTWOGG.mjs +1 -0
  199. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cynefinDiagram-2OOWUY4M.mjs +62 -0
  200. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/dagre-MPVFI544.mjs +4 -0
  201. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-AE4NWXFW.mjs +24 -0
  202. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-BUJID5UG.mjs +41 -0
  203. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-C44CZ5NI.mjs +24 -0
  204. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-EYOLEXXS.mjs +30 -0
  205. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-P7B6PWOJ.mjs +3 -0
  206. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ebnfDiagram-FTPZ3PV6.mjs +1 -0
  207. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/erDiagram-H3ERR26V.mjs +99 -0
  208. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/eventmodeling-NTZA5JFV-WKSWQHFS.mjs +1 -0
  209. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/flowDiagram-YHGXBVSY.mjs +1 -0
  210. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ganttDiagram-RWFTB7ED.mjs +292 -0
  211. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/gitGraph-4MIJSDKK-JH2HKYUO.mjs +1 -0
  212. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/gitGraphDiagram-MAR6GKOP.mjs +106 -0
  213. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/info-A6RAGUB7-3TX3OFWW.mjs +1 -0
  214. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/infoDiagram-LV547AFH.mjs +2 -0
  215. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ishikawaDiagram-PUJQGNDS.mjs +70 -0
  216. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/journeyDiagram-EW5QJT4W.mjs +139 -0
  217. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/kanban-definition-JSQERAZB.mjs +89 -0
  218. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/katex-CZ4GXH2S.mjs +257 -0
  219. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/mindmap-definition-VBJCLQLM.mjs +96 -0
  220. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/packet-AYTQ26CC-MKII6P3Y.mjs +1 -0
  221. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pegDiagram-7WILOQTJ.mjs +1 -0
  222. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pie-WAS4IAKB-6B4OPMJ5.mjs +1 -0
  223. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pieDiagram-EFA7CBSB.mjs +39 -0
  224. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/quadrantDiagram-WARVYA7P.mjs +7 -0
  225. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/radar-RG4KPBEZ-UPTR3XUL.mjs +1 -0
  226. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-74A4TZTK-MEFUPFMS.mjs +1 -0
  227. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-abnf-HS5TGJTU-R5YG2S5D.mjs +1 -0
  228. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-ebnf-LZEXJU2U-G5QEX2L6.mjs +1 -0
  229. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-peg-WCYAUIDC-H5I2ZRY2.mjs +1 -0
  230. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroadDiagram-5NIQVNLQ.mjs +1 -0
  231. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/requirementDiagram-SXREGOKZ.mjs +84 -0
  232. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sankeyDiagram-VV74M2VP.mjs +40 -0
  233. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sequenceDiagram-52ZFIFDL.mjs +162 -0
  234. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sizeCapture-FGA5AGYP.mjs +1 -0
  235. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/stateDiagram-3QAKPIVI.mjs +1 -0
  236. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/stateDiagram-v2-HN2P4RDZ.mjs +1 -0
  237. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/swimlanes-QLVP42QD.mjs +1 -0
  238. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/swimlanesDiagram-JKPDBFCN.mjs +8 -0
  239. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/timeline-definition-GS45XAXW.mjs +120 -0
  240. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/treeView-Q6P3EWNA-ZRJGANNQ.mjs +1 -0
  241. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/treemap-WGGIJYW6-K64VN5AS.mjs +1 -0
  242. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/vennDiagram-QIQU2ZRJ.mjs +34 -0
  243. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/wardley-WFR3VGLG-D67OWCCH.mjs +1 -0
  244. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/wardleyDiagram-U6YNM66N.mjs +78 -0
  245. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/xychartDiagram-XJAZEDNM.mjs +7 -0
  246. package/neural-interface/public/vendor/mermaid/manifest.json +4 -0
  247. package/neural-interface/public/vendor/mermaid/mermaid-11.17.2.esm.min.mjs +14 -0
  248. package/neural-interface/scripts/build-vendor.mjs +84 -3
  249. package/neural-interface/server.js +1099 -286
  250. package/npm-shrinkwrap.json +2 -2
  251. package/package.json +1 -1
  252. package/skills/synabun/modules/schedule.md +1 -1
@@ -0,0 +1,293 @@
1
+ // ═══════════════════════════════════════════
2
+ // SynaBun Neural Interface — launch cache
3
+ // ═══════════════════════════════════════════
4
+ // The last good answer of a slow lookup (a model list, a provider catalog, a
5
+ // CLI probe), given at once and asked for again in the background once it is
6
+ // old: stale-while-revalidate. One refresh at a time per entry, shared by every
7
+ // caller. A caller waits only when nothing was ever kept for its key, or when it
8
+ // asks for a fresh answer (`refresh`).
9
+ //
10
+ // Keys say what an answer depends on (an account, a provider, a binary and its
11
+ // version, a serve's credentials file): an answer is never given for another
12
+ // key. `markStale()` keeps an answer but has the next read refresh it (a serve
13
+ // restarted, a CLI may have been updated); `invalidate()` drops it, so the next
14
+ // read waits (the user changed what it answers).
15
+ //
16
+ // Never kept (`accept`): an error, a timeout, an empty answer a failure caused,
17
+ // a body that is not JSON. What is kept survives a restart in
18
+ // DATA_HOME/cache/launch/<name>.json: outside data/ (no backup carries a cache)
19
+ // and outside the package (an update replaces that). An answer read back from
20
+ // the file is served at once and asked for again on its first read.
21
+
22
+ import { mkdirSync, readFileSync } from 'node:fs';
23
+ import { mkdir, rename, rm, writeFile } from 'node:fs/promises';
24
+ import { join } from 'node:path';
25
+
26
+ const FILE_VERSION = 1;
27
+ const SAVE_DELAY_MS = 400;
28
+
29
+ /** The folder the caches of a data home live in. */
30
+ export function launchCacheDir(dataHome) {
31
+ return join(String(dataHome || '.'), 'cache', 'launch');
32
+ }
33
+
34
+ /**
35
+ * At most `limit` jobs at once, the rest in order behind them: what keeps a
36
+ * warm-up or a burst of probes from starting every process together.
37
+ */
38
+ export function createLimiter(limit = 1) {
39
+ let running = 0;
40
+ const waiting = [];
41
+ const pump = () => {
42
+ while (running < limit && waiting.length) {
43
+ const { job, resolve, reject } = waiting.shift();
44
+ running += 1;
45
+ Promise.resolve().then(job).then(resolve, reject).finally(() => { running -= 1; pump(); });
46
+ }
47
+ };
48
+ const run = (job) => new Promise((resolve, reject) => { waiting.push({ job, resolve, reject }); pump(); });
49
+ run.pending = () => waiting.length + running;
50
+ return run;
51
+ }
52
+
53
+ /**
54
+ * @param {object} o
55
+ * @param {string} o.name file name (and log tag) of this cache
56
+ * @param {(key:string)=>Promise<any>} o.load the slow lookup; throw (or return what `accept` refuses) on failure
57
+ * @param {number} o.ttlMs how long an answer is fresh
58
+ * @param {string|null} [o.dir] where it is kept across restarts (null: memory only)
59
+ * @param {(value:any, key:string)=>boolean} [o.accept] is this answer worth keeping
60
+ * @param {(a:any, b:any)=>boolean} [o.equals] same answer (no save, no change event)
61
+ * @param {(value:any)=>any} [o.persistValue] what is written for a value (default: the value)
62
+ * @param {(key:string, value:any, previous:any)=>void} [o.onChange] a refresh gave another answer
63
+ * @param {number} [o.maxEntries] keys kept (the oldest goes first)
64
+ */
65
+ export function createLaunchCache({
66
+ name,
67
+ load,
68
+ ttlMs,
69
+ dir = null,
70
+ accept = (value) => value !== undefined && value !== null,
71
+ equals = (a, b) => {
72
+ try { return JSON.stringify(a) === JSON.stringify(b); } catch { return false; }
73
+ },
74
+ persistValue = (value) => value,
75
+ onChange = null,
76
+ maxEntries = 16,
77
+ now = () => Date.now(),
78
+ log = () => {},
79
+ } = {}) {
80
+ if (typeof load !== 'function') throw new Error('createLaunchCache needs load');
81
+ const entries = new Map(); // key → { value, at, stale }
82
+ const inflight = new Map(); // key → promise of the load
83
+ const generations = new Map(); // key → bumped by invalidate(): a load begun before it is not kept
84
+ const file = dir ? join(dir, `${String(name).replace(/[^A-Za-z0-9._-]/g, '_')}.json`) : null;
85
+ let loadedFile = !file;
86
+ let saveTimer = null;
87
+ let saving = null;
88
+
89
+ function readFile() {
90
+ if (loadedFile) return;
91
+ loadedFile = true;
92
+ try {
93
+ const parsed = JSON.parse(readFileSync(file, 'utf8'));
94
+ if (parsed?.version !== FILE_VERSION || !Array.isArray(parsed.entries)) return;
95
+ for (const row of parsed.entries.slice(-maxEntries)) {
96
+ if (typeof row?.key !== 'string' || row.value === undefined) continue;
97
+ if (!safeAccept(row.value, row.key)) continue;
98
+ // From the last run: served at once, asked for again on its first read.
99
+ if (!entries.has(row.key)) entries.set(row.key, { value: row.value, at: Number(row.at) || 0, stale: true, restored: true });
100
+ }
101
+ } catch { /* no file yet, or one that cannot be read: an empty cache */ }
102
+ }
103
+
104
+ function safeAccept(value, key) {
105
+ try { return accept(value, key) === true; } catch { return false; }
106
+ }
107
+
108
+ function fresh(entry) {
109
+ return !!entry && !entry.stale && now() - entry.at < ttlMs;
110
+ }
111
+
112
+ function trim() {
113
+ while (entries.size > maxEntries) entries.delete(entries.keys().next().value);
114
+ }
115
+
116
+ function scheduleSave() {
117
+ if (!file) return;
118
+ if (saveTimer) return;
119
+ saveTimer = setTimeout(() => {
120
+ saveTimer = null;
121
+ saving = (saving || Promise.resolve()).then(saveNow).catch(() => {});
122
+ }, SAVE_DELAY_MS);
123
+ saveTimer.unref?.();
124
+ }
125
+
126
+ async function saveNow() {
127
+ const rows = [];
128
+ for (const [key, entry] of entries) {
129
+ let value;
130
+ try { value = persistValue(entry.value); } catch { continue; }
131
+ if (value === undefined) continue;
132
+ rows.push({ key, at: entry.at, value });
133
+ }
134
+ const body = JSON.stringify({ version: FILE_VERSION, name, savedAt: new Date(now()).toISOString(), entries: rows });
135
+ const tmp = `${file}.${process.pid}.tmp`;
136
+ try {
137
+ await mkdir(dir, { recursive: true });
138
+ await writeFile(tmp, body, 'utf8');
139
+ await rename(tmp, file);
140
+ } catch (error) {
141
+ log(`[launch-cache] ${name}: could not be saved (${error?.code || error?.message || error})`);
142
+ await rm(tmp, { force: true }).catch(() => {});
143
+ }
144
+ }
145
+
146
+ function store(key, value) {
147
+ const previous = entries.get(key);
148
+ const same = !!previous && equals(previous.value, value);
149
+ entries.delete(key);
150
+ entries.set(key, { value: same ? previous.value : value, at: now(), stale: false });
151
+ trim();
152
+ if (!same || previous?.restored) scheduleSave();
153
+ if (!same && previous && typeof onChange === 'function') {
154
+ try { onChange(key, value, previous.value); } catch { /* a listener's failure is its own */ }
155
+ }
156
+ return same ? previous.value : value;
157
+ }
158
+
159
+ /** One load for `key` at a time; what it gives is kept when it is worth keeping. */
160
+ function revalidate(key) {
161
+ if (inflight.has(key)) return inflight.get(key);
162
+ const generation = generations.get(key) || 0;
163
+ const job = (async () => {
164
+ try {
165
+ const value = await load(key);
166
+ if (safeAccept(value, key) && (generations.get(key) || 0) === generation) return { value: store(key, value), kept: true };
167
+ return { value, kept: false };
168
+ } finally {
169
+ if (inflight.get(key) === job) inflight.delete(key);
170
+ }
171
+ })();
172
+ inflight.set(key, job);
173
+ return job;
174
+ }
175
+
176
+ /**
177
+ * The answer for `key` and how it was obtained: `{ value, cached, stale, at }`.
178
+ * `refresh`: wait for a new answer (one shared load); without it a kept answer
179
+ * is given at once (and refreshed in the background when it is old).
180
+ */
181
+ async function read(key = '', { refresh = false } = {}) {
182
+ readFile();
183
+ const id = String(key);
184
+ const entry = entries.get(id);
185
+ if (!refresh && entry) {
186
+ const stale = !fresh(entry);
187
+ if (stale) revalidate(id).catch((error) => log(`[launch-cache] ${name}: background refresh failed (${error?.message || error})`));
188
+ return { value: entry.value, cached: true, stale, at: entry.at };
189
+ }
190
+ const result = await revalidate(id);
191
+ return { value: result.value, cached: false, stale: false, at: result.kept ? (entries.get(id)?.at || now()) : 0, kept: result.kept };
192
+ }
193
+
194
+ return {
195
+ name,
196
+ read,
197
+ async get(key = '', options = {}) { return (await read(key, options)).value; },
198
+ /** The kept answer for `key`, or undefined: never waits, never loads. */
199
+ peek(key = '') { readFile(); return entries.get(String(key))?.value; },
200
+ /** How old the kept answer is, and whether it is due for a refresh (undefined: none kept). */
201
+ info(key = '') {
202
+ readFile();
203
+ const entry = entries.get(String(key));
204
+ return entry ? { at: entry.at, stale: !fresh(entry), restored: !!entry.restored } : undefined;
205
+ },
206
+ /** Keep an answer obtained elsewhere (a route that already has it). */
207
+ set(key, value) { readFile(); if (safeAccept(value, String(key))) store(String(key), value); },
208
+ /** Ask for `key` again in the background (or every key): the kept answer is still given meanwhile. */
209
+ markStale(key = null) {
210
+ readFile();
211
+ if (key === null) { for (const entry of entries.values()) entry.stale = true; return; }
212
+ const entry = entries.get(String(key));
213
+ if (entry) entry.stale = true;
214
+ },
215
+ /** Drop `key` (or every key): the next read waits for a new answer, and a load already running is not kept. */
216
+ invalidate(key = null) {
217
+ readFile();
218
+ const ids = key === null ? [...new Set([...entries.keys(), ...inflight.keys()])] : [String(key)];
219
+ for (const id of ids) {
220
+ entries.delete(id);
221
+ generations.set(id, (generations.get(id) || 0) + 1);
222
+ // A load begun before this is not joined by later reads: its answer is from before the change.
223
+ inflight.delete(id);
224
+ }
225
+ scheduleSave();
226
+ },
227
+ /** Start a refresh of `key` now (warm-up, an event): resolves to its answer, never rejects. */
228
+ refresh(key = '') {
229
+ readFile();
230
+ return revalidate(String(key)).then((result) => result.value, () => undefined);
231
+ },
232
+ keys() { readFile(); return [...entries.keys()]; },
233
+ /** Write what is pending now (shutdown). */
234
+ async flush() {
235
+ if (saveTimer) { clearTimeout(saveTimer); saveTimer = null; await saveNow(); }
236
+ await saving?.catch?.(() => {});
237
+ },
238
+ };
239
+ }
240
+
241
+ /** Make the cache folder now (a first start), so the first save has nothing to create. */
242
+ export function ensureLaunchCacheDir(dir) {
243
+ try { mkdirSync(dir, { recursive: true }); } catch { /* the save creates it, or says why it cannot */ }
244
+ }
245
+
246
+ /**
247
+ * One value kept across restarts for a module that keeps its own cache (the
248
+ * Claude model list): `read()` gives what the last run saved (once, from the
249
+ * file), `write(value)` saves it a moment later, off the request.
250
+ */
251
+ export function createSnapshotStore({ dir, name, log = () => {} } = {}) {
252
+ const file = dir ? join(dir, `${String(name).replace(/[^A-Za-z0-9._-]/g, '_')}.json`) : null;
253
+ let cached;
254
+ let read = false;
255
+ let timer = null;
256
+ let pending;
257
+ let chain = Promise.resolve();
258
+ const save = async (value) => {
259
+ const tmp = `${file}.${process.pid}.tmp`;
260
+ try {
261
+ await mkdir(dir, { recursive: true });
262
+ await writeFile(tmp, JSON.stringify({ version: FILE_VERSION, name, value }), 'utf8');
263
+ await rename(tmp, file);
264
+ } catch (error) {
265
+ log(`[launch-cache] ${name}: could not be saved (${error?.code || error?.message || error})`);
266
+ await rm(tmp, { force: true }).catch(() => {});
267
+ }
268
+ };
269
+ return {
270
+ read() {
271
+ if (read || !file) return cached;
272
+ read = true;
273
+ try {
274
+ const parsed = JSON.parse(readFileSync(file, 'utf8'));
275
+ if (parsed?.version === FILE_VERSION) cached = parsed.value;
276
+ } catch { /* nothing saved yet */ }
277
+ return cached;
278
+ },
279
+ write(value) {
280
+ cached = value;
281
+ read = true;
282
+ if (!file) return;
283
+ pending = value;
284
+ if (timer) return;
285
+ timer = setTimeout(() => {
286
+ timer = null;
287
+ const next = pending;
288
+ chain = chain.then(() => save(next)).catch(() => {});
289
+ }, SAVE_DELAY_MS);
290
+ timer.unref?.();
291
+ },
292
+ };
293
+ }