synabun 2.0.9 → 2.1.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 (679) hide show
  1. package/CHANGELOG.md +115 -0
  2. package/README.md +25 -2
  3. package/THIRD-PARTY-LICENSES.md +68 -4
  4. package/bin/synabun.js +71 -24
  5. package/docs/whatsapp.md +2 -2
  6. package/hooks/claude-code/pre-websearch.mjs +12 -1
  7. package/hooks/claude-code/shared.mjs +5 -0
  8. package/hooks/claude-code/stop.mjs +1 -1
  9. package/launcher.mjs +9 -3
  10. package/lib/claude-hooks.js +172 -18
  11. package/lib/client-config-repair.js +17 -8
  12. package/lib/desktop-app.js +7 -1
  13. package/lib/external-tools.js +1 -1
  14. package/lib/first-launch-protection.js +57 -12
  15. package/lib/mcp-dist.js +176 -0
  16. package/lib/release-npm-ci.mjs +138 -0
  17. package/lib/release-publish.mjs +91 -0
  18. package/lib/release-scan.mjs +50 -0
  19. package/lib/server-crash-record.js +123 -0
  20. package/lib/server-exit.js +318 -0
  21. package/lib/server-supervisor.js +508 -0
  22. package/lib/start-launcher.js +43 -5
  23. package/lib/tools-cli.js +45 -0
  24. package/lib/update-snapshot.js +228 -0
  25. package/lib/virustotal.mjs +192 -0
  26. package/lib/windows-crash-event.js +269 -0
  27. package/mcp-server/dist/http.d.ts +20 -1
  28. package/mcp-server/dist/http.d.ts.map +1 -1
  29. package/mcp-server/dist/http.js +59 -12
  30. package/mcp-server/dist/http.js.map +1 -1
  31. package/mcp-server/dist/index.d.ts +33 -27
  32. package/mcp-server/dist/index.d.ts.map +1 -1
  33. package/mcp-server/dist/index.js +128 -143
  34. package/mcp-server/dist/index.js.map +1 -1
  35. package/mcp-server/dist/preload.js +1 -1
  36. package/mcp-server/dist/preload.js.map +1 -1
  37. package/mcp-server/dist/services/codex-config-heal.d.ts +6 -2
  38. package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -1
  39. package/mcp-server/dist/services/codex-config-heal.js +81 -28
  40. package/mcp-server/dist/services/codex-config-heal.js.map +1 -1
  41. package/mcp-server/dist/services/memory-judge-backfill.d.ts +6 -0
  42. package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -1
  43. package/mcp-server/dist/services/memory-judge-backfill.js +7 -1
  44. package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -1
  45. package/mcp-server/dist/services/neural-interface.d.ts +16 -10
  46. package/mcp-server/dist/services/neural-interface.d.ts.map +1 -1
  47. package/mcp-server/dist/services/neural-interface.js +67 -11
  48. package/mcp-server/dist/services/neural-interface.js.map +1 -1
  49. package/mcp-server/dist/services/server-instructions.d.ts +7 -2
  50. package/mcp-server/dist/services/server-instructions.d.ts.map +1 -1
  51. package/mcp-server/dist/services/server-instructions.js +20 -62
  52. package/mcp-server/dist/services/server-instructions.js.map +1 -1
  53. package/mcp-server/dist/services/tool-catalog.d.ts +120 -0
  54. package/mcp-server/dist/services/tool-catalog.d.ts.map +1 -0
  55. package/mcp-server/dist/services/tool-catalog.js +339 -0
  56. package/mcp-server/dist/services/tool-catalog.js.map +1 -0
  57. package/mcp-server/dist/services/tool-list-refresh-barrier.d.ts +12 -0
  58. package/mcp-server/dist/services/tool-list-refresh-barrier.d.ts.map +1 -0
  59. package/mcp-server/dist/services/tool-list-refresh-barrier.js +40 -0
  60. package/mcp-server/dist/services/tool-list-refresh-barrier.js.map +1 -0
  61. package/mcp-server/dist/services/tool-list.d.ts +108 -0
  62. package/mcp-server/dist/services/tool-list.d.ts.map +1 -0
  63. package/mcp-server/dist/services/tool-list.js +334 -0
  64. package/mcp-server/dist/services/tool-list.js.map +1 -0
  65. package/mcp-server/dist/services/tool-runtime.d.ts +161 -0
  66. package/mcp-server/dist/services/tool-runtime.d.ts.map +1 -0
  67. package/mcp-server/dist/services/tool-runtime.js +400 -0
  68. package/mcp-server/dist/services/tool-runtime.js.map +1 -0
  69. package/mcp-server/dist/services/whiteboard-geometry.d.ts +26 -2
  70. package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -1
  71. package/mcp-server/dist/services/whiteboard-geometry.js +91 -8
  72. package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -1
  73. package/mcp-server/dist/tools/agents.d.ts +10 -10
  74. package/mcp-server/dist/tools/agents.d.ts.map +1 -1
  75. package/mcp-server/dist/tools/agents.js +22 -13
  76. package/mcp-server/dist/tools/agents.js.map +1 -1
  77. package/mcp-server/dist/tools/browser-batch.d.ts +3 -3
  78. package/mcp-server/dist/tools/image-tools.d.ts +1 -1
  79. package/mcp-server/dist/tools/image-tools.js +1 -1
  80. package/mcp-server/dist/tools/skill-tools.d.ts +505 -0
  81. package/mcp-server/dist/tools/skill-tools.d.ts.map +1 -0
  82. package/mcp-server/dist/tools/skill-tools.js +639 -0
  83. package/mcp-server/dist/tools/skill-tools.js.map +1 -0
  84. package/mcp-server/dist/tools/skill.d.ts +7 -0
  85. package/mcp-server/dist/tools/skill.d.ts.map +1 -0
  86. package/mcp-server/dist/tools/skill.js +11 -0
  87. package/mcp-server/dist/tools/skill.js.map +1 -0
  88. package/mcp-server/dist/tools/tool-groups.d.ts +68 -0
  89. package/mcp-server/dist/tools/tool-groups.d.ts.map +1 -0
  90. package/mcp-server/dist/tools/tool-groups.js +147 -0
  91. package/mcp-server/dist/tools/tool-groups.js.map +1 -0
  92. package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -1
  93. package/mcp-server/dist/tools/whiteboard-format.js +7 -4
  94. package/mcp-server/dist/tools/whiteboard-format.js.map +1 -1
  95. package/mcp-server/dist/tools/whiteboard-tools.d.ts +64 -13
  96. package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -1
  97. package/mcp-server/dist/tools/whiteboard-tools.js +30 -5
  98. package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -1
  99. package/mcp-server/package-lock.json +2 -2
  100. package/mcp-server/package.json +1 -1
  101. package/mcp-server/src/http.ts +75 -12
  102. package/mcp-server/src/index.ts +147 -154
  103. package/mcp-server/src/preload.ts +12 -12
  104. package/mcp-server/src/services/codex-config-heal.ts +80 -29
  105. package/mcp-server/src/services/memory-judge-backfill.ts +7 -1
  106. package/mcp-server/src/services/neural-interface.ts +79 -20
  107. package/mcp-server/src/services/server-instructions.ts +27 -63
  108. package/mcp-server/src/services/tool-catalog.ts +403 -0
  109. package/mcp-server/src/services/tool-list-refresh-barrier.ts +33 -0
  110. package/mcp-server/src/services/tool-list.ts +410 -0
  111. package/mcp-server/src/services/tool-runtime.ts +457 -0
  112. package/mcp-server/src/services/whiteboard-geometry.ts +94 -9
  113. package/mcp-server/src/tools/agents.ts +22 -14
  114. package/mcp-server/src/tools/image-tools.ts +1 -1
  115. package/mcp-server/src/tools/skill-tools.ts +589 -0
  116. package/mcp-server/src/tools/skill.ts +13 -0
  117. package/mcp-server/src/tools/tool-groups.ts +164 -0
  118. package/mcp-server/src/tools/whiteboard-format.ts +9 -3
  119. package/mcp-server/src/tools/whiteboard-tools.ts +39 -5
  120. package/neural-interface/i18n/en.json +3680 -206
  121. package/neural-interface/i18n/pt-BR.json +3628 -157
  122. package/neural-interface/lib/account-usage.js +5 -3
  123. package/neural-interface/lib/app-controls-api.js +161 -0
  124. package/neural-interface/lib/assistant-api.js +148 -35
  125. package/neural-interface/lib/assistant-brains/claude.js +4 -3
  126. package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +12 -2
  127. package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +32 -9
  128. package/neural-interface/lib/assistant-brains/codex.js +9 -5
  129. package/neural-interface/lib/assistant-brains/opencode.js +122 -44
  130. package/neural-interface/lib/assistant-brains/opencode2-browser-policy/index.js +59 -0
  131. package/neural-interface/lib/assistant-brains/opencode2-route-gate/index.js +97 -0
  132. package/neural-interface/lib/assistant-catalog.js +23 -9
  133. package/neural-interface/lib/assistant-dispatch.js +874 -156
  134. package/neural-interface/lib/assistant-envelope.js +22 -2
  135. package/neural-interface/lib/assistant-persona.js +80 -11
  136. package/neural-interface/lib/assistant-plan-permissions.js +10 -9
  137. package/neural-interface/lib/assistant-route-gate-codex.js +3 -0
  138. package/neural-interface/lib/assistant-route-gate.js +6 -4
  139. package/neural-interface/lib/assistant-router.js +13 -8
  140. package/neural-interface/lib/assistant-runtime.js +183 -26
  141. package/neural-interface/lib/assistant-task-prompt.js +78 -14
  142. package/neural-interface/lib/assistant-tools.js +51 -0
  143. package/neural-interface/lib/backup-service.js +620 -3
  144. package/neural-interface/lib/backup-zip-reader.js +10 -5
  145. package/neural-interface/lib/backup-zip-writer.js +257 -0
  146. package/neural-interface/lib/browser-execution.js +10 -2
  147. package/neural-interface/lib/browser-guard-cdp.js +83 -0
  148. package/neural-interface/lib/browser-network-guard.js +284 -0
  149. package/neural-interface/lib/browser-policy-roots.js +64 -0
  150. package/neural-interface/lib/browser-tool-policy.js +186 -31
  151. package/neural-interface/lib/claude-agent-bridge.js +4 -2
  152. package/neural-interface/lib/claude-hooks-status.js +103 -0
  153. package/neural-interface/lib/claude-model-catalog.js +64 -14
  154. package/neural-interface/lib/claude-temporary.js +5 -11
  155. package/neural-interface/lib/cli-install.js +18 -138
  156. package/neural-interface/lib/cli-resolver.js +4 -1
  157. package/neural-interface/lib/cli-update-planner.js +32 -31
  158. package/neural-interface/lib/cloudflared/tunnel.js +42 -2
  159. package/neural-interface/lib/codex-mcp-approvals.js +11 -0
  160. package/neural-interface/lib/codex-settings-schema.js +109 -47
  161. package/neural-interface/lib/codex-worker-app-server.js +172 -0
  162. package/neural-interface/lib/confined-fs.js +30 -3
  163. package/neural-interface/lib/crash-notice-api.js +98 -0
  164. package/neural-interface/lib/editor-completion-opencode.js +164 -67
  165. package/neural-interface/lib/exec-loop-command.js +4 -1
  166. package/neural-interface/lib/http-guards.js +8 -2
  167. package/neural-interface/lib/install-details.js +4 -1
  168. package/neural-interface/lib/launch-cache.js +293 -0
  169. package/neural-interface/lib/login-start.js +524 -0
  170. package/neural-interface/lib/mcp-agent-servers.js +67 -0
  171. package/neural-interface/lib/mcp-client-config.js +0 -29
  172. package/neural-interface/lib/mcp-external-servers.js +323 -0
  173. package/neural-interface/lib/{mcp-profile-refresh-coordinator.js → mcp-tools-refresh-coordinator.js} +4 -4
  174. package/neural-interface/lib/morelogin.js +30 -0
  175. package/neural-interface/lib/native-loop-providers.js +565 -50
  176. package/neural-interface/lib/native-loop-runtime.js +287 -41
  177. package/neural-interface/lib/opencode-config.js +557 -0
  178. package/neural-interface/lib/opencode-db-schema.js +58 -0
  179. package/neural-interface/lib/opencode-history.js +49 -204
  180. package/neural-interface/lib/opencode-mcp-ready.js +108 -0
  181. package/neural-interface/lib/opencode-native-boundary.js +44 -0
  182. package/neural-interface/lib/opencode-protocol.js +310 -0
  183. package/neural-interface/lib/opencode-provider-view.js +81 -0
  184. package/neural-interface/lib/opencode-runtime-config.js +32 -15
  185. package/neural-interface/lib/opencode-serve-records.js +624 -0
  186. package/neural-interface/lib/opencode-v2-client.js +53 -131
  187. package/neural-interface/lib/opencode-v2-ws-requests.js +35 -195
  188. package/neural-interface/lib/opencode-worker-activity.js +229 -0
  189. package/neural-interface/lib/opencode-worker-data.js +27 -0
  190. package/neural-interface/lib/opencode2-client.js +796 -0
  191. package/neural-interface/lib/opencode2-proxy.js +76 -0
  192. package/neural-interface/lib/opencode2-translate.js +1057 -0
  193. package/neural-interface/lib/owner-authority.js +249 -0
  194. package/neural-interface/lib/page-session.js +275 -0
  195. package/neural-interface/lib/peer-identity.js +763 -0
  196. package/neural-interface/lib/process-identity.js +361 -0
  197. package/neural-interface/lib/request-gate.js +17 -2
  198. package/neural-interface/lib/rulesets/api.js +1 -1
  199. package/neural-interface/lib/rulesets/fs-safe.js +1 -1
  200. package/neural-interface/lib/rulesets/installer.js +92 -27
  201. package/neural-interface/lib/rulesets/json-edit.js +1 -1
  202. package/neural-interface/lib/session-cache-builder.js +18 -10
  203. package/neural-interface/lib/session-title-generator.js +58 -18
  204. package/neural-interface/lib/skills/api-v2.js +495 -0
  205. package/neural-interface/lib/skills/bundle.js +418 -0
  206. package/neural-interface/lib/skills/catalog.js +294 -0
  207. package/neural-interface/lib/skills/creation-api.js +191 -0
  208. package/neural-interface/lib/skills/creation-brief.js +247 -0
  209. package/neural-interface/lib/skills/creation-sources.js +267 -0
  210. package/neural-interface/lib/skills/creation.js +843 -0
  211. package/neural-interface/lib/skills/deploy.js +564 -0
  212. package/neural-interface/lib/skills/digest.js +119 -0
  213. package/neural-interface/lib/skills/discover.js +111 -0
  214. package/neural-interface/lib/skills/draft-confinement.js +214 -0
  215. package/neural-interface/lib/skills/eval-confinement.js +397 -0
  216. package/neural-interface/lib/skills/eval-sandbox.js +280 -0
  217. package/neural-interface/lib/skills/eval-trace.js +119 -0
  218. package/neural-interface/lib/skills/evals-api.js +212 -0
  219. package/neural-interface/lib/skills/evals.js +1573 -0
  220. package/neural-interface/lib/skills/export.js +200 -0
  221. package/neural-interface/lib/skills/frontmatter.js +64 -0
  222. package/neural-interface/lib/skills/health.js +75 -0
  223. package/neural-interface/lib/skills/json-edit.js +165 -0
  224. package/neural-interface/lib/skills/known-bridge-digests.json +387 -0
  225. package/neural-interface/lib/skills/known-bridges.js +96 -0
  226. package/neural-interface/lib/skills/library.js +823 -0
  227. package/neural-interface/lib/skills/local-store.js +21 -0
  228. package/neural-interface/lib/skills/migration.js +433 -0
  229. package/neural-interface/lib/skills/operations.js +45 -0
  230. package/neural-interface/lib/skills/ownership.js +427 -0
  231. package/neural-interface/lib/skills/packages.js +88 -0
  232. package/neural-interface/lib/skills/reviews.js +212 -0
  233. package/neural-interface/lib/skills/revision.js +80 -0
  234. package/neural-interface/lib/skills/roots.js +262 -0
  235. package/neural-interface/lib/skills/runtime-checks.js +355 -0
  236. package/neural-interface/lib/skills/scan-assets.js +252 -0
  237. package/neural-interface/lib/skills/scan-context.js +26 -0
  238. package/neural-interface/lib/skills/scan-shell.js +324 -0
  239. package/neural-interface/lib/skills/scan.js +364 -0
  240. package/neural-interface/lib/skills/scanners.js +54 -0
  241. package/neural-interface/lib/skills/service.js +522 -0
  242. package/neural-interface/lib/skills/telemetry.js +113 -0
  243. package/neural-interface/lib/sqlite-integrity-worker.js +22 -0
  244. package/neural-interface/lib/style-guide/api.js +4 -3
  245. package/neural-interface/lib/tool-lists.js +124 -0
  246. package/neural-interface/lib/untrusted-file-headers.js +27 -0
  247. package/neural-interface/lib/whatsapp/bridge.js +6 -3
  248. package/neural-interface/lib/worker-confinement.js +1192 -0
  249. package/neural-interface/lib/worker-guard-setting.js +56 -0
  250. package/neural-interface/lib/worker-mcp-channel.js +175 -0
  251. package/neural-interface/lib/worker-relay-ports.js +227 -0
  252. package/neural-interface/lib/worker-resume.js +229 -0
  253. package/neural-interface/lib/worker-sandbox.js +299 -0
  254. package/neural-interface/package-lock.json +1354 -50
  255. package/neural-interface/package.json +6 -2
  256. package/neural-interface/public/index.html +5 -3
  257. package/neural-interface/public/index2d.html +19 -11
  258. package/neural-interface/public/onboarding.html +2 -2
  259. package/neural-interface/public/shared/account-menu.js +8 -5
  260. package/neural-interface/public/shared/agent-runtime-options.js +76 -16
  261. package/neural-interface/public/shared/api.js +1527 -1336
  262. package/neural-interface/public/shared/app-frame.js +192 -0
  263. package/neural-interface/public/shared/assistant/asst-agents-dock.js +205 -19
  264. package/neural-interface/public/shared/assistant/asst-api.js +11 -3
  265. package/neural-interface/public/shared/assistant/asst-ask-styles.js +270 -0
  266. package/neural-interface/public/shared/assistant/asst-ask-tail.js +118 -0
  267. package/neural-interface/public/shared/assistant/asst-ask.js +397 -0
  268. package/neural-interface/public/shared/assistant/asst-brain-picker.js +241 -112
  269. package/neural-interface/public/shared/assistant/asst-composer.js +1 -1
  270. package/neural-interface/public/shared/assistant/asst-control.js +157 -26
  271. package/neural-interface/public/shared/assistant/asst-followups-card.js +383 -0
  272. package/neural-interface/public/shared/assistant/asst-followups.js +417 -0
  273. package/neural-interface/public/shared/assistant/asst-hosts.js +49 -2
  274. package/neural-interface/public/shared/assistant/asst-limit-dock.js +40 -0
  275. package/neural-interface/public/shared/assistant/asst-limit-wait.js +294 -0
  276. package/neural-interface/public/shared/assistant/asst-limit.js +168 -0
  277. package/neural-interface/public/shared/assistant/asst-mascot.js +49 -12
  278. package/neural-interface/public/shared/assistant/asst-menu.js +84 -12
  279. package/neural-interface/public/shared/assistant/asst-panel.js +303 -44
  280. package/neural-interface/public/shared/assistant/asst-rack-styles.js +93 -58
  281. package/neural-interface/public/shared/assistant/asst-redact.js +186 -0
  282. package/neural-interface/public/shared/assistant/asst-render.js +770 -100
  283. package/neural-interface/public/shared/assistant/asst-route.js +83 -12
  284. package/neural-interface/public/shared/assistant/asst-run-stage.js +231 -0
  285. package/neural-interface/public/shared/assistant/asst-sanitize.js +193 -3
  286. package/neural-interface/public/shared/assistant/asst-scene-styles.js +273 -0
  287. package/neural-interface/public/shared/assistant/asst-scenes.js +530 -0
  288. package/neural-interface/public/shared/assistant/asst-sidepanel-styles.js +3 -15
  289. package/neural-interface/public/shared/assistant/asst-sidepanel.js +67 -4
  290. package/neural-interface/public/shared/assistant/asst-slash.js +9 -7
  291. package/neural-interface/public/shared/assistant/asst-state.js +25 -15
  292. package/neural-interface/public/shared/assistant/asst-stop.js +127 -0
  293. package/neural-interface/public/shared/assistant/asst-styles.js +102 -21
  294. package/neural-interface/public/shared/assistant/asst-tool-kinds.js +165 -13
  295. package/neural-interface/public/shared/automation-context.js +5 -2
  296. package/neural-interface/public/shared/cc-dropdown.js +550 -0
  297. package/neural-interface/public/shared/cdx/cdx-context-menu.js +10 -9
  298. package/neural-interface/public/shared/cdx/cdx-copy.js +16 -0
  299. package/neural-interface/public/shared/cdx/cdx-output-model.js +22 -1
  300. package/neural-interface/public/shared/cdx/cdx-output.js +8 -7
  301. package/neural-interface/public/shared/cdx/cdx-panel.js +58 -150
  302. package/neural-interface/public/shared/cdx/cdx-protocol.js +28 -1
  303. package/neural-interface/public/shared/cdx/cdx-render.js +62 -32
  304. package/neural-interface/public/shared/cdx/cdx-requests.js +3 -3
  305. package/neural-interface/public/shared/cdx/cdx-skill-hints.js +54 -0
  306. package/neural-interface/public/shared/cdx/cdx-styles.js +15 -3
  307. package/neural-interface/public/shared/cdx/cdx-tabs.js +201 -74
  308. package/neural-interface/public/shared/cdx/cdx-ws.js +0 -1
  309. package/neural-interface/public/shared/cli-install-view.js +4 -8
  310. package/neural-interface/public/shared/cli-status.js +2 -2
  311. package/neural-interface/public/shared/constants.js +2 -2
  312. package/neural-interface/public/shared/context-menu-areas.js +34 -0
  313. package/neural-interface/public/shared/context-menu-logic.js +243 -0
  314. package/neural-interface/public/shared/context-menu-model.js +366 -0
  315. package/neural-interface/public/shared/context-menu.js +372 -0
  316. package/neural-interface/public/shared/cp/cp-context-menu.js +10 -9
  317. package/neural-interface/public/shared/cp/cp-markdown.js +4 -57
  318. package/neural-interface/public/shared/crash-notice-view.js +168 -0
  319. package/neural-interface/public/shared/data-cache.js +223 -0
  320. package/neural-interface/public/shared/desktop-bridge.js +11 -0
  321. package/neural-interface/public/shared/desktop-titlebar-view.js +78 -1
  322. package/neural-interface/public/shared/desktop-titlebar.js +214 -28
  323. package/neural-interface/public/shared/desktop-update-view.js +35 -5
  324. package/neural-interface/public/shared/editor/editor-panel-logic.js +2 -2
  325. package/neural-interface/public/shared/file-links.js +73 -8
  326. package/neural-interface/public/shared/html-shell.js +78 -86
  327. package/neural-interface/public/shared/i18n.js +2 -0
  328. package/neural-interface/public/shared/launch-prefetch.js +59 -0
  329. package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +7 -7
  330. package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +4 -4
  331. package/neural-interface/public/shared/ocp-v2/ocp-v2-caps.js +3 -2
  332. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +3 -101
  333. package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +9 -2
  334. package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +1 -3
  335. package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +2 -6
  336. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +11 -11
  337. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +0 -3
  338. package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +8 -4
  339. package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +7 -7
  340. package/neural-interface/public/shared/ocp-v2/ocp-v2-modelpicker.js +54 -17
  341. package/neural-interface/public/shared/ocp-v2/ocp-v2-outcome-notifications.js +16 -0
  342. package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +140 -254
  343. package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +1 -2
  344. package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +97 -203
  345. package/neural-interface/public/shared/ocp-v2/ocp-v2-providers.js +11 -9
  346. package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +15 -4
  347. package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +7 -22
  348. package/neural-interface/public/shared/ocp-v2/ocp-v2-send-logic.js +401 -0
  349. package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +20 -13
  350. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +8 -61
  351. package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +53 -82
  352. package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +16 -15
  353. package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +8 -21
  354. package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +1 -99
  355. package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +5 -35
  356. package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +48 -40
  357. package/neural-interface/public/shared/ocp-v2/{ocp-v2-profile-inheritance.js → ocp-v2-tools-inheritance.js} +16 -16
  358. package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +205 -62
  359. package/neural-interface/public/shared/opencode-providers.js +39 -0
  360. package/neural-interface/public/shared/page-session.js +96 -0
  361. package/neural-interface/public/shared/registry.js +5 -3
  362. package/neural-interface/public/shared/retired-2d.js +3 -0
  363. package/neural-interface/public/shared/schedules-view.js +452 -0
  364. package/neural-interface/public/shared/settings/settings-app-pane.js +335 -0
  365. package/neural-interface/public/shared/settings/settings-app.js +243 -0
  366. package/neural-interface/public/shared/settings/settings-claude-hooks.js +135 -0
  367. package/neural-interface/public/shared/settings/settings-data.js +90 -0
  368. package/neural-interface/public/shared/settings/settings-ia.js +23 -6
  369. package/neural-interface/public/shared/settings/settings-opencode.js +89 -0
  370. package/neural-interface/public/shared/settings/settings-skill-folders-pane.js +265 -0
  371. package/neural-interface/public/shared/settings/settings-skill-folders.js +130 -0
  372. package/neural-interface/public/shared/settings/settings-worker-guard.js +72 -0
  373. package/neural-interface/public/shared/sidepanel-session-status.js +49 -0
  374. package/neural-interface/public/shared/skills/ss-args.js +96 -0
  375. package/neural-interface/public/shared/skills/ss-creation.js +219 -0
  376. package/neural-interface/public/shared/skills/ss-dialog.js +130 -0
  377. package/neural-interface/public/shared/skills/ss-doc.js +173 -0
  378. package/neural-interface/public/shared/skills/ss-eval-adapters.js +269 -0
  379. package/neural-interface/public/shared/skills/ss-eval-grade.js +359 -0
  380. package/neural-interface/public/shared/skills/ss-eval-optimise.js +153 -0
  381. package/neural-interface/public/shared/skills/ss-eval-plan.js +315 -0
  382. package/neural-interface/public/shared/skills/ss-evals.js +417 -0
  383. package/neural-interface/public/shared/skills/ss-form.js +159 -0
  384. package/neural-interface/public/shared/skills/ss-frontmatter.js +376 -0
  385. package/neural-interface/public/shared/skills/ss-ids.js +32 -0
  386. package/neural-interface/public/shared/skills/ss-lint.js +141 -0
  387. package/neural-interface/public/shared/skills/ss-presets.js +117 -0
  388. package/neural-interface/public/shared/skills/ss-profiles.js +475 -0
  389. package/neural-interface/public/shared/skills/ss-resources.js +165 -0
  390. package/neural-interface/public/shared/skills/ss-review-view.js +190 -0
  391. package/neural-interface/public/shared/skills/ss-tabs.js +79 -0
  392. package/neural-interface/public/shared/skills/ss-unicode.js +135 -0
  393. package/neural-interface/public/shared/skills/studio/sx-actions.js +222 -0
  394. package/neural-interface/public/shared/skills/studio/sx-cm.js +101 -0
  395. package/neural-interface/public/shared/skills/studio/sx-create-ai-view.js +749 -0
  396. package/neural-interface/public/shared/skills/studio/sx-create-ai.js +236 -0
  397. package/neural-interface/public/shared/skills/studio/sx-create-view.js +254 -0
  398. package/neural-interface/public/shared/skills/studio/sx-create.js +126 -0
  399. package/neural-interface/public/shared/skills/studio/sx-diff-view.js +43 -0
  400. package/neural-interface/public/shared/skills/studio/sx-diff.js +133 -0
  401. package/neural-interface/public/shared/skills/studio/sx-docs.js +480 -0
  402. package/neural-interface/public/shared/skills/studio/sx-dom.js +229 -0
  403. package/neural-interface/public/shared/skills/studio/sx-edit-view.js +848 -0
  404. package/neural-interface/public/shared/skills/studio/sx-editor-model.js +193 -0
  405. package/neural-interface/public/shared/skills/studio/sx-errors.js +22 -0
  406. package/neural-interface/public/shared/skills/studio/sx-geometry.js +82 -0
  407. package/neural-interface/public/shared/skills/studio/sx-import.js +262 -0
  408. package/neural-interface/public/shared/skills/studio/sx-inspector.js +308 -0
  409. package/neural-interface/public/shared/skills/studio/sx-install-flow.js +279 -0
  410. package/neural-interface/public/shared/skills/studio/sx-install.js +296 -0
  411. package/neural-interface/public/shared/skills/studio/sx-library-view.js +639 -0
  412. package/neural-interface/public/shared/skills/studio/sx-library.js +475 -0
  413. package/neural-interface/public/shared/skills/studio/sx-main.js +681 -0
  414. package/neural-interface/public/shared/skills/studio/sx-operations-view.js +98 -0
  415. package/neural-interface/public/shared/skills/studio/sx-operations.js +11 -0
  416. package/neural-interface/public/shared/skills/studio/sx-plan.js +158 -0
  417. package/neural-interface/public/shared/skills/studio/sx-publish-view.js +621 -0
  418. package/neural-interface/public/shared/skills/studio/sx-review-view.js +369 -0
  419. package/neural-interface/public/shared/skills/studio/sx-review.js +148 -0
  420. package/neural-interface/public/shared/skills/studio/sx-scan.js +35 -0
  421. package/neural-interface/public/shared/skills/studio/sx-snippets.js +96 -0
  422. package/neural-interface/public/shared/skills/studio/sx-subject.js +248 -0
  423. package/neural-interface/public/shared/skills/studio/sx-test-view.js +994 -0
  424. package/neural-interface/public/shared/skills/studio/sx-test.js +328 -0
  425. package/neural-interface/public/shared/skills/studio/sx-versions-view.js +241 -0
  426. package/neural-interface/public/shared/skills/studio/sx-workspace-view.js +425 -0
  427. package/neural-interface/public/shared/styleguide/sg-panel.js +4 -2
  428. package/neural-interface/public/shared/styles.css +2065 -2150
  429. package/neural-interface/public/shared/synabun-mascot.js +1115 -9
  430. package/neural-interface/public/shared/tool-list-picker.js +55 -0
  431. package/neural-interface/public/shared/tool-list-storage.js +24 -0
  432. package/neural-interface/public/shared/tool-list-view.js +112 -0
  433. package/neural-interface/public/shared/tour/tour-actor.js +268 -0
  434. package/neural-interface/public/shared/tour/tour-beats.js +336 -0
  435. package/neural-interface/public/shared/tour/tour-engine.js +884 -0
  436. package/neural-interface/public/shared/tour/tour-ink.js +390 -0
  437. package/neural-interface/public/shared/tour/tour-stage.js +440 -0
  438. package/neural-interface/public/shared/tour/tour-state.js +40 -0
  439. package/neural-interface/public/shared/tour/tour-tips.js +99 -0
  440. package/neural-interface/public/shared/tour/tour.css +144 -0
  441. package/neural-interface/public/shared/ui-assistant.js +27 -5
  442. package/neural-interface/public/shared/ui-automation-studio.js +155 -152
  443. package/neural-interface/public/shared/ui-bookmarks.js +2 -1
  444. package/neural-interface/public/shared/ui-claude-panel.js +153 -13
  445. package/neural-interface/public/shared/ui-codex-panel.js +1 -0
  446. package/neural-interface/public/shared/ui-command-runner.js +6 -3
  447. package/neural-interface/public/shared/ui-context-menu.js +295 -0
  448. package/neural-interface/public/shared/ui-cost-widget.js +57 -59
  449. package/neural-interface/public/shared/ui-crash-notice.js +187 -0
  450. package/neural-interface/public/shared/ui-detail.js +21 -9
  451. package/neural-interface/public/shared/ui-file-links.js +1 -0
  452. package/neural-interface/public/shared/ui-image-gallery.js +56 -52
  453. package/neural-interface/public/shared/ui-invite.js +18 -2
  454. package/neural-interface/public/shared/ui-keybinds.js +26 -1
  455. package/neural-interface/public/shared/ui-link.js +9 -9
  456. package/neural-interface/public/shared/ui-menubar.js +229 -40
  457. package/neural-interface/public/shared/ui-native-loop-router-state.js +5 -0
  458. package/neural-interface/public/shared/ui-native-loop-router.js +9 -1
  459. package/neural-interface/public/shared/ui-navbar.js +4 -24
  460. package/neural-interface/public/shared/ui-opencode-panel-v2.js +1 -0
  461. package/neural-interface/public/shared/ui-panels.js +96 -65
  462. package/neural-interface/public/shared/ui-schedules-studio.js +2267 -953
  463. package/neural-interface/public/shared/ui-sessions.js +20 -7
  464. package/neural-interface/public/shared/ui-settings.js +679 -496
  465. package/neural-interface/public/shared/ui-sidebar.js +4 -4
  466. package/neural-interface/public/shared/ui-sidepanel-session-entry.js +13 -0
  467. package/neural-interface/public/shared/ui-sidepanel-sessions.js +56 -5
  468. package/neural-interface/public/shared/ui-sidepanel-state.js +23 -12
  469. package/neural-interface/public/shared/ui-sidepanel-tray.js +84 -8
  470. package/neural-interface/public/shared/ui-sidepanel-windows.js +16 -11
  471. package/neural-interface/public/shared/ui-skills.js +42 -2781
  472. package/neural-interface/public/shared/ui-styleguide.js +5 -2
  473. package/neural-interface/public/shared/ui-sync.js +22 -5
  474. package/neural-interface/public/shared/ui-terminal.js +159 -199
  475. package/neural-interface/public/shared/ui-tool-updates.js +3 -1
  476. package/neural-interface/public/shared/ui-tooltip.js +10 -5
  477. package/neural-interface/public/shared/ui-trash.js +14 -5
  478. package/neural-interface/public/shared/ui-tutorial-layout.js +3 -117
  479. package/neural-interface/public/shared/ui-tutorial-preview.js +103 -0
  480. package/neural-interface/public/shared/ui-tutorial-steps.js +3 -61
  481. package/neural-interface/public/shared/ui-tutorial.css +47 -100
  482. package/neural-interface/public/shared/ui-tutorial.js +285 -499
  483. package/neural-interface/public/shared/ui-update.js +121 -16
  484. package/neural-interface/public/shared/ui-whiteboard.js +313 -59
  485. package/neural-interface/public/shared/ui-worker-end.js +4 -0
  486. package/neural-interface/public/shared/ui-workspaces.js +3 -2
  487. package/neural-interface/public/shared/view-variant.js +66 -0
  488. package/neural-interface/public/shared/whatsapp/wa-view.js +1 -1
  489. package/neural-interface/public/shared/whiteboard-list.js +172 -0
  490. package/neural-interface/public/shared/worker-end.js +10 -3
  491. package/neural-interface/public/shared/worker-restart.js +12 -0
  492. package/neural-interface/public/sidepanel-session.html +1 -1
  493. package/neural-interface/public/variant/2d/background.js +2 -1
  494. package/neural-interface/public/variant/2d/context-menu.js +8 -2
  495. package/neural-interface/public/variant/2d/graph.js +42 -20
  496. package/neural-interface/public/variant/2d/hulls.js +14 -9
  497. package/neural-interface/public/variant/2d/lasso.js +11 -7
  498. package/neural-interface/public/variant/2d/main.js +36 -2
  499. package/neural-interface/public/variant/2d/minimap.js +11 -13
  500. package/neural-interface/public/variant/3d/main.js +72 -6
  501. package/neural-interface/public/variant/3d/map-controls.js +24 -9
  502. package/neural-interface/public/vendor/caveat/OFL.txt +93 -0
  503. package/neural-interface/public/vendor/caveat/caveat-latin-400-normal.woff2 +0 -0
  504. package/neural-interface/public/vendor/caveat/caveat-latin-700-normal.woff2 +0 -0
  505. package/neural-interface/public/vendor/caveat/caveat.css +17 -0
  506. package/neural-interface/public/vendor/caveat/manifest.json +12 -0
  507. package/neural-interface/public/vendor/highlight/LICENSE +29 -0
  508. package/neural-interface/public/vendor/highlight/github-dark-dimmed-11.12.0.min.css +9 -0
  509. package/neural-interface/public/vendor/highlight/highlight-11.12.0.min.js +1262 -0
  510. package/neural-interface/public/vendor/highlight/manifest.json +5 -0
  511. package/neural-interface/public/vendor/html2canvas/LICENSE +22 -0
  512. package/neural-interface/public/vendor/html2canvas/html2canvas-1.4.1.min.js +20 -0
  513. package/neural-interface/public/vendor/html2canvas/manifest.json +4 -0
  514. package/neural-interface/public/vendor/marked/LICENSE.md +44 -0
  515. package/neural-interface/public/vendor/marked/manifest.json +4 -0
  516. package/neural-interface/public/vendor/marked/marked-14.1.4.esm.js +2502 -0
  517. package/neural-interface/public/vendor/mermaid/LICENSE +21 -0
  518. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/abnfDiagram-PAR5IXJI.mjs +1 -0
  519. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/architecture-7GRP2DOG-M7G3SWCO.mjs +1 -0
  520. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/architectureDiagram-2PNWDENW.mjs +36 -0
  521. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/blockDiagram-PUWGUBOA.mjs +129 -0
  522. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/c4Diagram-3NLNHZP5.mjs +38 -0
  523. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-2NMSUPJH.mjs +1 -0
  524. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-32MCUW2P.mjs +206 -0
  525. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-3NPNU5GP.mjs +1 -0
  526. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-3SMGFRGC.mjs +1 -0
  527. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-4CAJECRU.mjs +14 -0
  528. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-4OADUZ5Q.mjs +10 -0
  529. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5IMINLNL.mjs +1 -0
  530. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5IQCK5RY.mjs +3 -0
  531. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5MVFYWFU.mjs +1 -0
  532. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-AQ6EADP3.mjs +1 -0
  533. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-AZZRMDJM.mjs +15 -0
  534. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-CLS4B6BI.mjs +168 -0
  535. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-DZP67EKU.mjs +70 -0
  536. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-EICP7K5X.mjs +1 -0
  537. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-GDY2UAB4.mjs +1 -0
  538. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-H7VHZCWX.mjs +1 -0
  539. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-IJBDOHL6.mjs +1 -0
  540. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JFFVMJIA.mjs +1 -0
  541. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JQRUD6KW.mjs +1 -0
  542. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JZGDI5JK.mjs +1 -0
  543. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-KD6SPIPN.mjs +2 -0
  544. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-NF366YI6.mjs +231 -0
  545. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-NUDPKBEF.mjs +32 -0
  546. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-OJINMHTS.mjs +1 -0
  547. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-Q6NGPIAH.mjs +2 -0
  548. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-QJSWEUOL.mjs +132 -0
  549. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-R7JDMUKV.mjs +1 -0
  550. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-RCXAM2GK.mjs +1 -0
  551. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-RT4MAWR3.mjs +1 -0
  552. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-SFMINX4W.mjs +1 -0
  553. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-SLDQ463B.mjs +88 -0
  554. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-STOV2HOB.mjs +1 -0
  555. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-T5OCTHI4.mjs +1 -0
  556. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-TCEHX7R3.mjs +1 -0
  557. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VQC2EELJ.mjs +1 -0
  558. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VRZKL3EH.mjs +1 -0
  559. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VTHDQ7BV.mjs +1 -0
  560. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VY2OSTJR.mjs +2 -0
  561. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-WUBWJARI.mjs +1 -0
  562. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-YBMQ5JGJ.mjs +2 -0
  563. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-YDMLL4PJ.mjs +1 -0
  564. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-Z6V44ARX.mjs +62 -0
  565. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZJJ7VQJP.mjs +339 -0
  566. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZNLK7HRR.mjs +1 -0
  567. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZQN7UHIL.mjs +1 -0
  568. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZS6VBONO.mjs +174 -0
  569. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZUNWM646.mjs +1 -0
  570. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/classDiagram-FGAMPOII.mjs +1 -0
  571. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/classDiagram-v2-AI5RJEK4.mjs +1 -0
  572. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cose-bilkent-Q72C2OJ3.mjs +1 -0
  573. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cynefin-OW5HDTMX-6OCTWOGG.mjs +1 -0
  574. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cynefinDiagram-2OOWUY4M.mjs +62 -0
  575. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/dagre-MPVFI544.mjs +4 -0
  576. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-AE4NWXFW.mjs +24 -0
  577. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-BUJID5UG.mjs +41 -0
  578. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-C44CZ5NI.mjs +24 -0
  579. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-EYOLEXXS.mjs +30 -0
  580. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-P7B6PWOJ.mjs +3 -0
  581. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ebnfDiagram-FTPZ3PV6.mjs +1 -0
  582. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/erDiagram-H3ERR26V.mjs +99 -0
  583. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/eventmodeling-NTZA5JFV-WKSWQHFS.mjs +1 -0
  584. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/flowDiagram-YHGXBVSY.mjs +1 -0
  585. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ganttDiagram-RWFTB7ED.mjs +292 -0
  586. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/gitGraph-4MIJSDKK-JH2HKYUO.mjs +1 -0
  587. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/gitGraphDiagram-MAR6GKOP.mjs +106 -0
  588. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/info-A6RAGUB7-3TX3OFWW.mjs +1 -0
  589. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/infoDiagram-LV547AFH.mjs +2 -0
  590. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ishikawaDiagram-PUJQGNDS.mjs +70 -0
  591. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/journeyDiagram-EW5QJT4W.mjs +139 -0
  592. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/kanban-definition-JSQERAZB.mjs +89 -0
  593. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/katex-CZ4GXH2S.mjs +257 -0
  594. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/mindmap-definition-VBJCLQLM.mjs +96 -0
  595. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/packet-AYTQ26CC-MKII6P3Y.mjs +1 -0
  596. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pegDiagram-7WILOQTJ.mjs +1 -0
  597. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pie-WAS4IAKB-6B4OPMJ5.mjs +1 -0
  598. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pieDiagram-EFA7CBSB.mjs +39 -0
  599. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/quadrantDiagram-WARVYA7P.mjs +7 -0
  600. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/radar-RG4KPBEZ-UPTR3XUL.mjs +1 -0
  601. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-74A4TZTK-MEFUPFMS.mjs +1 -0
  602. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-abnf-HS5TGJTU-R5YG2S5D.mjs +1 -0
  603. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-ebnf-LZEXJU2U-G5QEX2L6.mjs +1 -0
  604. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-peg-WCYAUIDC-H5I2ZRY2.mjs +1 -0
  605. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroadDiagram-5NIQVNLQ.mjs +1 -0
  606. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/requirementDiagram-SXREGOKZ.mjs +84 -0
  607. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sankeyDiagram-VV74M2VP.mjs +40 -0
  608. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sequenceDiagram-52ZFIFDL.mjs +162 -0
  609. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sizeCapture-FGA5AGYP.mjs +1 -0
  610. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/stateDiagram-3QAKPIVI.mjs +1 -0
  611. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/stateDiagram-v2-HN2P4RDZ.mjs +1 -0
  612. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/swimlanes-QLVP42QD.mjs +1 -0
  613. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/swimlanesDiagram-JKPDBFCN.mjs +8 -0
  614. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/timeline-definition-GS45XAXW.mjs +120 -0
  615. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/treeView-Q6P3EWNA-ZRJGANNQ.mjs +1 -0
  616. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/treemap-WGGIJYW6-K64VN5AS.mjs +1 -0
  617. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/vennDiagram-QIQU2ZRJ.mjs +34 -0
  618. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/wardley-WFR3VGLG-D67OWCCH.mjs +1 -0
  619. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/wardleyDiagram-U6YNM66N.mjs +78 -0
  620. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/xychartDiagram-XJAZEDNM.mjs +7 -0
  621. package/neural-interface/public/vendor/mermaid/manifest.json +4 -0
  622. package/neural-interface/public/vendor/mermaid/mermaid-11.17.2.esm.min.mjs +14 -0
  623. package/neural-interface/public/vendor/yaml/LICENSE +13 -0
  624. package/neural-interface/public/vendor/yaml/manifest.json +4 -0
  625. package/neural-interface/public/vendor/yaml/yaml-2.9.1.min.js +137 -0
  626. package/neural-interface/scripts/build-vendor.mjs +116 -3
  627. package/neural-interface/server.js +4834 -2541
  628. package/neural-interface/templates/rulesets/core.md +1 -1
  629. package/neural-interface/templates/rulesets/legacy-hashes.json +18 -0
  630. package/neural-interface/templates/rulesets/manifest.json +8 -8
  631. package/npm-shrinkwrap.json +18 -12
  632. package/package.json +16 -3
  633. package/postinstall.js +9 -4
  634. package/preuninstall.js +1 -1
  635. package/setup.js +97 -322
  636. package/skills/skill-forge/SKILL.md +177 -0
  637. package/skills/skill-forge/evals/evals.json +54 -0
  638. package/skills/skill-forge/references/package.md +105 -0
  639. package/skills/skill-forge/references/review-and-recovery.md +63 -0
  640. package/skills/skill-forge/references/runtime-profiles.md +20 -0
  641. package/skills/skill-forge/references/sources-and-capabilities.md +51 -0
  642. package/skills/synabun/SKILL.md +10 -7
  643. package/skills/synabun/modules/audit.md +1 -5
  644. package/skills/synabun/modules/changelog.md +1 -5
  645. package/skills/synabun/modules/idea.md +1 -1
  646. package/skills/synabun/modules/memorize.md +6 -9
  647. package/skills/synabun/modules/schedule.md +5 -5
  648. package/mcp-server/dist/services/profiles.d.ts +0 -120
  649. package/mcp-server/dist/services/profiles.d.ts.map +0 -1
  650. package/mcp-server/dist/services/profiles.js +0 -387
  651. package/mcp-server/dist/services/profiles.js.map +0 -1
  652. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +0 -97
  653. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +0 -1
  654. package/mcp-server/dist/tools/leonardo-browser-tools.js +0 -228
  655. package/mcp-server/dist/tools/leonardo-browser-tools.js.map +0 -1
  656. package/mcp-server/dist/tools/leonardo.d.ts +0 -13
  657. package/mcp-server/dist/tools/leonardo.d.ts.map +0 -1
  658. package/mcp-server/dist/tools/leonardo.js +0 -21
  659. package/mcp-server/dist/tools/leonardo.js.map +0 -1
  660. package/mcp-server/dist/tools/profile.d.ts +0 -17
  661. package/mcp-server/dist/tools/profile.d.ts.map +0 -1
  662. package/mcp-server/dist/tools/profile.js +0 -114
  663. package/mcp-server/dist/tools/profile.js.map +0 -1
  664. package/mcp-server/src/services/profiles.ts +0 -428
  665. package/mcp-server/src/tools/leonardo-browser-tools.ts +0 -291
  666. package/mcp-server/src/tools/leonardo.ts +0 -30
  667. package/mcp-server/src/tools/profile.ts +0 -122
  668. package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +0 -47
  669. package/neural-interface/lib/assistant-brains/opencode-route-gate.js +0 -62
  670. package/neural-interface/lib/mcp-profile-servers.js +0 -120
  671. package/neural-interface/public/shared/ui-tutorial-draw.js +0 -311
  672. package/skills/leonardo/SKILL.md +0 -168
  673. package/skills/leonardo/icon.svg +0 -1
  674. package/skills/leonardo/modules/browser-guide.md +0 -378
  675. package/skills/leonardo/modules/image-prompter.md +0 -283
  676. package/skills/leonardo/modules/model-advisor.md +0 -100
  677. package/skills/leonardo/modules/prompt-library.md +0 -110
  678. package/skills/leonardo/modules/style-guide.md +0 -186
  679. package/skills/leonardo/modules/video-prompter.md +0 -317
@@ -1,3 +1,5 @@
1
+ import { retainExternalRefs } from './mcp-external-servers.js';
2
+ import { storedToolList, toolListRecord, readStoredToolListRecord } from './tool-lists.js';
1
3
  import { existsSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from 'node:fs';
2
4
  import { dirname, resolve } from 'node:path';
3
5
 
@@ -30,7 +32,9 @@ function cleanDescriptor(record) {
30
32
  contextMode: record.contextMode || null,
31
33
  modelContextWindow: record.modelContextWindow || null,
32
34
  effort: record.effort || null,
33
- mcpProfile: record.mcpProfile || null,
35
+ tools: storedToolList(record),
36
+ externalMcpVersion: 2,
37
+ ...(record.toolListError ? { toolListError: record.toolListError } : {}),
34
38
  accountId: record.accountId || null,
35
39
  currentIteration: record.currentIteration || 0,
36
40
  totalIterations: record.totalIterations || 0,
@@ -49,10 +53,22 @@ function cleanDescriptor(record) {
49
53
  // existing consumers (router, sidepanels, schedules) are unaffected.
50
54
  runMode: record.runMode || 'loop',
51
55
  turnState: record.turnState || null,
56
+ // What the last turn's result said (task mode: done, blocked or needs_input; the dispatcher's
57
+ // lastResult.status): an idle warm worker whose turn ended asking waits on the user.
58
+ outcome: record.outcome || null,
52
59
  assistantSessionId: record.assistantSessionId || null,
60
+ // A dispatched worker a server restart cut off (status 'suspended') waits for its resume on the next start;
61
+ // `resumes` counts how often it was resumed (assistant-dispatch.js resumeRun).
62
+ suspendedAt: record.suspendedAt || null,
63
+ suspendReason: record.suspendReason || null,
64
+ resumes: Number(record.resumes) || 0,
65
+ resumedAt: record.resumedAt || null,
53
66
  };
54
67
  }
55
68
 
69
+ /** Run statuses that hold a run in the ledger as live: it runs, or waits for its resume after a restart. */
70
+ const LIVE_STATUSES = new Set(['starting', 'running', 'suspended']);
71
+
56
72
  function readJson(path, fallback = null) {
57
73
  try { return JSON.parse(readFileSync(path, 'utf8')); }
58
74
  catch { return fallback; }
@@ -73,6 +89,7 @@ export class NativeLoopRuntime {
73
89
  constructor({
74
90
  stateDir,
75
91
  ledgerPath,
92
+ toolListOptions = () => ({}),
76
93
  providerFactories = {},
77
94
  buildPrompt,
78
95
  onEvent = () => {},
@@ -92,10 +109,14 @@ export class NativeLoopRuntime {
92
109
  // A truthy `met` ends the run early with stoppedReason 'goal_met'; the
93
110
  // iteration and time caps stay the fallback.
94
111
  judgeGoal = null,
112
+ // How long a dispatched worker the restart cut off waits, from this start, for its dispatcher to resume it
113
+ // (or end it) before it ends as interrupted by itself.
114
+ resumeHoldMs = 60_000,
95
115
  } = {}) {
96
116
  if (!stateDir) throw new Error('NativeLoopRuntime requires stateDir');
97
117
  if (typeof buildPrompt !== 'function') throw new Error('NativeLoopRuntime requires buildPrompt');
98
118
  this.stateDir = stateDir;
119
+ this.toolListOptions = toolListOptions;
99
120
  this.judgeGoal = typeof judgeGoal === 'function' ? judgeGoal : null;
100
121
  this.ledgerPath = ledgerPath || resolve(dirname(stateDir), 'native-loop-runs.json');
101
122
  this.providerFactories = { ...providerFactories };
@@ -110,6 +131,8 @@ export class NativeLoopRuntime {
110
131
  this.providerStartupTimeoutMs = providerStartupTimeoutMs;
111
132
  this.claimTtlMs = claimTtlMs;
112
133
  this.ledgerFlushMs = Math.max(50, Number(ledgerFlushMs) || 200);
134
+ this.resumeHoldMs = Math.max(1000, Number(resumeHoldMs) || 60_000);
135
+ this._holdTimers = new Map();
113
136
  this.records = new Map();
114
137
  this._pendingPersist = false;
115
138
  this._persistTimer = null;
@@ -161,13 +184,52 @@ export class NativeLoopRuntime {
161
184
  return this._emit('sidepanel:run-updated', record, { reason: 'turn-state' });
162
185
  }
163
186
 
187
+ /**
188
+ * Task-mode helper: records what the wrapper's last turn reported ('done' |
189
+ * 'blocked' | 'needs_input', the dispatcher's lastResult.status) and
190
+ * broadcasts it, so a panel can tell a warm worker that rests from one whose
191
+ * turn ended asking the user. No-op for unknown runs.
192
+ */
193
+ setOutcome(runId, outcome) {
194
+ const record = this.records.get(runId);
195
+ if (!record) return null;
196
+ const next = outcome ? String(outcome) : null;
197
+ if ((record.outcome || null) === next) return cleanDescriptor(record);
198
+ record.outcome = next;
199
+ return this._emit('sidepanel:run-updated', record, { reason: 'outcome' });
200
+ }
201
+
164
202
  _loadLedger() {
165
203
  const rows = readJson(this.ledgerPath, []);
166
204
  if (!Array.isArray(rows)) return;
167
205
  for (const row of rows) {
168
206
  if (!row?.runId) continue;
169
- const record = { ...row, adapter: null, timer: null, execution: null };
170
- if (record.status === 'starting' || record.status === 'running') {
207
+ let stored;
208
+ try { stored = readStoredToolListRecord(row, this.toolListOptions()); }
209
+ catch (error) {
210
+ // A historical run may name a custom preset the owner has since deleted. Refuse that
211
+ // run, preserve the original selection for diagnosis, and keep the rest of the server up.
212
+ stored = { ...row, tools: [], status: 'failed', stoppedReason: 'tools_invalid',
213
+ error: error.message, toolListError: { code: error.code, message: error.message,
214
+ original: row.tools ?? row.mcpProfile ?? null } };
215
+ delete stored.mcpProfile;
216
+ }
217
+ const record = { ...stored, adapter: null, timer: null, execution: null };
218
+ const cutOff = record.status === 'starting' || record.status === 'running' || record.status === 'suspended';
219
+ if (cutOff && record.runMode === 'task' && isNativeLoopProfile(record.provider)) {
220
+ // A dispatched Claude Code worker the restart cut off (suspended by the last shutdown, or left running by a
221
+ // crash): held for its dispatcher, which resumes it (assistant-dispatch.js resumeRun) or ends it. Its state file
222
+ // stays as it is. Nobody takes it within resumeHoldMs: it ends as interrupted, as every cut-off run did before.
223
+ record.status = 'suspended';
224
+ record.suspendedAt = record.suspendedAt || iso(this.now());
225
+ record.suspendReason = record.suspendReason || 'server_restart';
226
+ record.turnState = 'suspended';
227
+ record.stopping = false;
228
+ this.records.set(record.runId, record);
229
+ this._hold(record);
230
+ continue;
231
+ }
232
+ if (cutOff) {
171
233
  record.status = 'interrupted';
172
234
  record.stoppedReason = 'server_restart';
173
235
  record.completedAt = record.completedAt || iso(this.now());
@@ -190,9 +252,9 @@ export class NativeLoopRuntime {
190
252
 
191
253
  _writeLedgerNow() {
192
254
  const records = [...this.records.values()];
193
- const active = records.filter((record) => ['starting', 'running'].includes(record.status));
255
+ const active = records.filter((record) => LIVE_STATUSES.has(record.status));
194
256
  const terminal = records
195
- .filter((record) => !['starting', 'running'].includes(record.status))
257
+ .filter((record) => !LIVE_STATUSES.has(record.status))
196
258
  .sort((a, b) => String(b.startedAt || '').localeCompare(String(a.startedAt || '')));
197
259
  const retained = [...active, ...terminal.slice(0, Math.max(0, 500 - active.length))];
198
260
  const retainedIds = new Set(retained.map((record) => record.runId));
@@ -203,7 +265,7 @@ export class NativeLoopRuntime {
203
265
  }
204
266
  }
205
267
  const rows = retained
206
- .map(cleanDescriptor)
268
+ .map(record => toolListRecord(cleanDescriptor(record)))
207
269
  .sort((a, b) => String(b.startedAt || '').localeCompare(String(a.startedAt || '')));
208
270
  try { writeJsonAtomic(this.ledgerPath, rows); }
209
271
  catch (error) { this.log(null, 'ledger:error', error.message); }
@@ -247,11 +309,12 @@ export class NativeLoopRuntime {
247
309
 
248
310
  _readState(runId) {
249
311
  const path = this._statePath(runId);
250
- return existsSync(path) ? readJson(path, null) : null;
312
+ const state = existsSync(path) ? readJson(path, null) : null;
313
+ return state ? readStoredToolListRecord(state, this.toolListOptions()) : null;
251
314
  }
252
315
 
253
316
  _writeState(runId, state) {
254
- writeJsonAtomic(this._statePath(runId), state);
317
+ writeJsonAtomic(this._statePath(runId), toolListRecord(state, this.toolListOptions()));
255
318
  }
256
319
 
257
320
  _writeTerminalState(record, patch) {
@@ -267,8 +330,9 @@ export class NativeLoopRuntime {
267
330
  record.version = (Number(record.version) || 0) + 1;
268
331
  record.updatedAt = iso(this.now());
269
332
  // Force-flush on terminal transitions (a crash between throttled flushes
270
- // would otherwise leave the run listed as running after a restart).
271
- const terminal = ['completed', 'failed', 'stopped', 'interrupted'].includes(record.status);
333
+ // would otherwise leave the run listed as running after a restart), and on
334
+ // a suspension (the next start resumes the run from this ledger).
335
+ const terminal = ['completed', 'failed', 'stopped', 'interrupted', 'suspended'].includes(record.status);
272
336
  this._persistLedger({ force: terminal });
273
337
  const descriptor = cleanDescriptor(record);
274
338
  const message = { type, run: descriptor, ...extra };
@@ -315,7 +379,7 @@ export class NativeLoopRuntime {
315
379
  mkdirSync(this.stateDir, { recursive: true });
316
380
  const startedAt = state.startedAt || iso(this.now());
317
381
  const nativeState = {
318
- ...state,
382
+ ...toolListRecord(state, this.toolListOptions()),
319
383
  runId,
320
384
  terminalSessionId: runId,
321
385
  active: true,
@@ -343,7 +407,7 @@ export class NativeLoopRuntime {
343
407
  contextMode: state.contextMode || null,
344
408
  modelContextWindow: state.modelContextWindow || null,
345
409
  effort: state.effort || null,
346
- mcpProfile: state.mcpProfile || null,
410
+ tools: storedToolList(state, this.toolListOptions()),
347
411
  accountId: state.codexAccountId || null,
348
412
  currentIteration: Number(state.currentIteration) || 0,
349
413
  totalIterations: Number(state.totalIterations) || 1,
@@ -382,6 +446,24 @@ export class NativeLoopRuntime {
382
446
  record.timer.unref?.();
383
447
  }
384
448
 
449
+ this._bootstrap(record, factory, nativeState, { source, profile: state.profile });
450
+
451
+ // For back-compat: callers that awaited launch() to know whether the run was
452
+ // accepted can observe the descriptor. The failure (if any) is delivered via
453
+ // sidepanel:run-failed and via record.bootstrap rejecting with the original
454
+ // startup error. The descriptor itself resolves immediately with the
455
+ // 'starting' state so the HTTP caller is never gated on provider boot.
456
+ return cleanDescriptor(record);
457
+ }
458
+
459
+ /**
460
+ * Start the provider of a run whose record is in place (launch, resume) and drive it. Sets record.bootstrap: it
461
+ * resolves once the provider started and rejects with the startup error. A provider that cannot start ends the
462
+ * run as failed, or (`failAs: 'interrupted'`, a resume) as interrupted with the reason resume_failed.
463
+ */
464
+ _bootstrap(record, factory, nativeState, { source = record.source, profile = record.provider, failAs = 'failed' } = {}) {
465
+ const runId = record.runId;
466
+ const state = { profile };
385
467
  const startupSignal = record.startupAbortController.signal;
386
468
  const factoryPromise = Promise.resolve().then(() => factory({
387
469
  ...nativeState,
@@ -400,7 +482,8 @@ export class NativeLoopRuntime {
400
482
  if (!adapter || candidateCleaned) return;
401
483
  candidateCleaned = true;
402
484
  try { await adapter.abort?.(reason); } catch {}
403
- try { await adapter.dispose?.({ preserveSession: true }); } catch {}
485
+ // Suspended for a server shutdown while it started (suspend): its process is ended now, as a started one's is.
486
+ try { await adapter.dispose?.({ preserveSession: true, ...(record.status === 'suspended' ? { terminate: true } : {}) }); } catch {}
404
487
  };
405
488
  const finishBootstrap = async () => {
406
489
  clearTimeout(startupTimer);
@@ -461,6 +544,7 @@ export class NativeLoopRuntime {
461
544
  runId,
462
545
  emit: (event) => this._emitProviderEvent(record, event),
463
546
  setTurnState: (turnState) => this.setTurnState(runId, turnState),
547
+ setOutcome: (outcome) => this.setOutcome(runId, outcome),
464
548
  readState: () => this._readState(runId),
465
549
  })
466
550
  : adapter;
@@ -478,11 +562,15 @@ export class NativeLoopRuntime {
478
562
  if (candidate) await cleanupCandidate(candidate, error?.code || 'startup_failed');
479
563
  else factoryPromise.then((adapter) => cleanupCandidate(adapter, error?.code || 'startup_failed')).catch(() => {});
480
564
  }
481
- await this._fail(
482
- record,
483
- error,
484
- error?.code === 'NATIVE_LOOP_PROVIDER_START_TIMEOUT' ? 'provider_startup_timeout' : 'provider_error',
485
- );
565
+ if (failAs === 'interrupted') {
566
+ await this._fail(record, error, 'resume_failed', { status: 'interrupted' });
567
+ } else {
568
+ await this._fail(
569
+ record,
570
+ error,
571
+ error?.code === 'NATIVE_LOOP_PROVIDER_START_TIMEOUT' ? 'provider_startup_timeout' : 'provider_error',
572
+ );
573
+ }
486
574
  } finally {
487
575
  await finishBootstrap();
488
576
  // Re-throw so record.bootstrap rejects with the original startup error.
@@ -497,15 +585,146 @@ export class NativeLoopRuntime {
497
585
  // timer holds the process until cleanup. Swallow the unhandled rejection
498
586
  // here because callers that care must await record.bootstrap explicitly.
499
587
  bootstrap.catch(() => {});
588
+ return bootstrap;
589
+ }
500
590
 
501
- // For back-compat: callers that awaited launch() to know whether the run was
502
- // accepted can observe the descriptor. The failure (if any) is delivered via
503
- // sidepanel:run-failed and via record.bootstrap rejecting with the original
504
- // startup error. The descriptor itself resolves immediately with the
505
- // 'starting' state so the HTTP caller is never gated on provider boot.
591
+ /**
592
+ * Continue a suspended run (a dispatched worker a server restart cut off; assistant-dispatch.js resumeRun) as the
593
+ * same record: its runId, tab, claim, title and startedAt stay, its version keeps growing. The state file is written
594
+ * again at iteration 0 of 1, so the drive runs the run's one task iteration again (the dispatcher's wrapper decides
595
+ * what that turn sends), and the provider factory gets what `state` carries to continue the provider session
596
+ * (resumeSessionId, costBaseUsd). Resolves with the descriptor once the provider started; a provider that cannot
597
+ * start ends the run as interrupted (resume_failed) and the promise rejects with why.
598
+ */
599
+ async resume({ runId, state, buildPrompt = null, wrapAdapter = null } = {}) {
600
+ const record = this.records.get(runId);
601
+ if (!record) throw new Error(`Native loop ${runId} is not known`);
602
+ if (record.status !== 'suspended') throw new Error(`Native loop ${runId} is ${record.status}, not suspended`);
603
+ if (buildPrompt !== null && typeof buildPrompt !== 'function') throw new Error('Native loop buildPrompt override must be a function');
604
+ if (wrapAdapter !== null && typeof wrapAdapter !== 'function') throw new Error('Native loop wrapAdapter override must be a function');
605
+ if (!state?.profile || !isNativeLoopProfile(state.profile)) throw new Error(`Unsupported native loop profile: ${state?.profile || 'unknown'}`);
606
+ const factory = this.providerFactories[state.profile];
607
+ if (!factory) throw new Error(`Native provider unavailable: ${state.profile}`);
608
+ this._clearHold(record);
609
+ mkdirSync(this.stateDir, { recursive: true });
610
+ const totalIterations = Number(state.totalIterations) || 1;
611
+ const nativeState = {
612
+ ...toolListRecord(state, this.toolListOptions()),
613
+ runId,
614
+ terminalSessionId: runId,
615
+ active: true,
616
+ pending: false,
617
+ driverType: 'native',
618
+ runtimeType: 'native',
619
+ surface: 'sidepanel',
620
+ startedAt: record.startedAt || state.startedAt || iso(this.now()),
621
+ currentIteration: 0,
622
+ totalIterations,
623
+ };
624
+ this._writeState(runId, nativeState);
625
+ Object.assign(record, {
626
+ status: 'starting',
627
+ stoppedReason: null,
628
+ completedAt: null,
629
+ error: null,
630
+ adapter: null,
631
+ timer: null,
632
+ execution: null,
633
+ stopping: false,
634
+ startupAbortController: new AbortController(),
635
+ turnState: 'starting',
636
+ currentIteration: 0,
637
+ totalIterations,
638
+ browserSessionId: state.browserSessionId || null,
639
+ browserTabId: state.browserTabId || null,
640
+ suspendedAt: null,
641
+ suspendReason: null,
642
+ resumes: (Number(record.resumes) || 0) + 1,
643
+ resumedAt: iso(this.now()),
644
+ buildPrompt,
645
+ wrapAdapter,
646
+ });
647
+ record.identityPromise = new Promise((resolveIdentity) => { record._resolveIdentity = resolveIdentity; });
648
+ record.startupCancelPromise = new Promise((resolveCancel) => { record._cancelStartup = resolveCancel; });
649
+ this._emit('sidepanel:run-updated', record, { reason: 'resuming' });
650
+ await this._bootstrap(record, factory, nativeState, { profile: state.profile, failAs: 'interrupted' });
506
651
  return cleanDescriptor(record);
507
652
  }
508
653
 
654
+ /** The hold of a run the restart cut off: it ends as interrupted when nobody resumes it in time. */
655
+ _hold(record) {
656
+ this._clearHold(record);
657
+ const timer = setTimeout(() => {
658
+ this._holdTimers.delete(record.runId);
659
+ this.endSuspended(record.runId, record.suspendReason || 'server_restart').catch(() => {});
660
+ }, this.resumeHoldMs);
661
+ timer.unref?.();
662
+ this._holdTimers.set(record.runId, timer);
663
+ }
664
+
665
+ _clearHold(record) {
666
+ const timer = this._holdTimers.get(record?.runId);
667
+ if (timer) { clearTimeout(timer); this._holdTimers.delete(record.runId); }
668
+ }
669
+
670
+ /** Whether a run waits for its resume after a restart (suspended). */
671
+ isSuspended(runId) {
672
+ return this.records.get(runId)?.status === 'suspended';
673
+ }
674
+
675
+ /**
676
+ * The dispatcher takes a suspended run over (it resumes it or ends it itself): its hold no longer ends it.
677
+ * Returns whether the run is suspended.
678
+ */
679
+ keepSuspended(runId) {
680
+ const record = this.records.get(runId);
681
+ if (!record || record.status !== 'suspended') return false;
682
+ this._clearHold(record);
683
+ return true;
684
+ }
685
+
686
+ /**
687
+ * A suspended run that will not be resumed ends as interrupted (`reason`, by default why it was suspended), with an
688
+ * event, so a tab that waited for its resume shows how it ended. `error`: why it was not resumed.
689
+ */
690
+ async endSuspended(runId, reason = null, { error = null } = {}) {
691
+ const record = this.records.get(runId);
692
+ if (!record || record.status !== 'suspended') return false;
693
+ this._clearHold(record);
694
+ record.status = 'interrupted';
695
+ record.stoppedReason = reason || record.suspendReason || 'server_restart';
696
+ record.completedAt = iso(this.now());
697
+ if (error) record.error = String(error);
698
+ this._writeTerminalState(record, { active: false, pending: false, completedAt: record.completedAt, stoppedReason: record.stoppedReason, ...(error ? { error: record.error } : {}) });
699
+ this._releaseRuntimeRefs(record);
700
+ this._emit('sidepanel:run-stopped', record);
701
+ try { await this.onFinish(cleanDescriptor(record)); } catch {}
702
+ return true;
703
+ }
704
+
705
+ /**
706
+ * Suspend a running dispatched worker for a server shutdown (shutdown's `keep`): its CLI is ended (the adapter's
707
+ * dispose with terminate), its state file stays active, and the record waits as suspended for the next start to
708
+ * resume it. No run-stopped event and no end: a run-updated with the reason 'suspended'.
709
+ */
710
+ async suspend(runId, reason = 'server_shutdown') {
711
+ const record = this.records.get(runId);
712
+ if (!record || !['starting', 'running'].includes(record.status) || record.stopping) return false;
713
+ record.stopping = true;
714
+ clearTimeout(record.timer);
715
+ record.status = 'suspended';
716
+ record.suspendedAt = iso(this.now());
717
+ record.suspendReason = reason;
718
+ if (record._resolveIdentity) { record._resolveIdentity(null); record._resolveIdentity = null; }
719
+ try { record.startupAbortController?.abort(reason); } catch {}
720
+ if (record._cancelStartup) { record._cancelStartup(reason); record._cancelStartup = null; }
721
+ try { await record.adapter?.dispose?.({ preserveSession: true, terminate: true }); } catch {}
722
+ this._releaseRuntimeRefs(record, { turnState: 'suspended' });
723
+ record.stopping = false;
724
+ this._emit('sidepanel:run-updated', record, { reason: 'suspended' });
725
+ return true;
726
+ }
727
+
509
728
  async _drive(record) {
510
729
  let failures = 0;
511
730
  while (this.isAlive(record.runId)) {
@@ -599,7 +818,7 @@ export class NativeLoopRuntime {
599
818
  }
600
819
  }
601
820
 
602
- _releaseRuntimeRefs(record) {
821
+ _releaseRuntimeRefs(record, { turnState = 'terminal' } = {}) {
603
822
  if (!record) return;
604
823
  record.adapter = null;
605
824
  record.timer = null;
@@ -611,7 +830,8 @@ export class NativeLoopRuntime {
611
830
  record.startupAbortController = null;
612
831
  record.buildPrompt = null;
613
832
  record.wrapAdapter = null;
614
- if (record.turnState && record.turnState !== 'terminal') record.turnState = 'terminal';
833
+ if (turnState === 'suspended') record.turnState = 'suspended';
834
+ else if (record.turnState && record.turnState !== 'terminal') record.turnState = 'terminal';
615
835
  }
616
836
 
617
837
  async _complete(record, reason = 'completed') {
@@ -627,10 +847,11 @@ export class NativeLoopRuntime {
627
847
  try { await this.onFinish(cleanDescriptor(record)); } catch {}
628
848
  }
629
849
 
630
- async _fail(record, error, reason = 'provider_error') {
631
- if (!record || ['completed', 'failed', 'stopped', 'interrupted'].includes(record.status)) return;
850
+ /** `status`: 'failed', or 'interrupted' for a resume that could not start (reason resume_failed). */
851
+ async _fail(record, error, reason = 'provider_error', { status = 'failed' } = {}) {
852
+ if (!record || ['completed', 'failed', 'stopped', 'interrupted', 'suspended'].includes(record.status)) return;
632
853
  clearTimeout(record.timer);
633
- record.status = 'failed';
854
+ record.status = status === 'interrupted' ? 'interrupted' : 'failed';
634
855
  record.error = error?.message || String(error);
635
856
  record.stoppedReason = reason;
636
857
  record.completedAt = iso(this.now());
@@ -641,12 +862,27 @@ export class NativeLoopRuntime {
641
862
  try { await record.adapter?.abort?.(reason); } catch {}
642
863
  try { await record.adapter?.dispose?.({ preserveSession: true }); } catch {}
643
864
  this._releaseRuntimeRefs(record);
644
- this._emit('sidepanel:run-failed', record);
865
+ this._emit(record.status === 'interrupted' ? 'sidepanel:run-stopped' : 'sidepanel:run-failed', record);
645
866
  try { await this.onFinish(cleanDescriptor(record)); } catch {}
646
867
  }
647
868
 
648
- async stop(runId, reason = 'user') {
869
+ /**
870
+ * `terminate` (a server shutdown): the provider's process is ended at once (the Claude adapter's dispose), never
871
+ * left to finish its tool call after the server is gone. A suspended run (waiting for its resume) ends as stopped.
872
+ */
873
+ async stop(runId, reason = 'user', { terminate = false } = {}) {
649
874
  const record = this.records.get(runId);
875
+ if (record?.status === 'suspended' && !record.stopping) {
876
+ this._clearHold(record);
877
+ record.status = 'stopped';
878
+ record.stoppedReason = reason;
879
+ record.completedAt = iso(this.now());
880
+ this._writeTerminalState(record, { active: false, pending: false, completedAt: record.completedAt, stoppedReason: reason });
881
+ this._releaseRuntimeRefs(record);
882
+ this._emit('sidepanel:run-stopped', record);
883
+ try { await this.onFinish(cleanDescriptor(record)); } catch {}
884
+ return true;
885
+ }
650
886
  if (!record || !['starting', 'running'].includes(record.status) || record.stopping) return false;
651
887
  record.stopping = true;
652
888
  clearTimeout(record.timer);
@@ -658,7 +894,7 @@ export class NativeLoopRuntime {
658
894
  if (record._cancelStartup) { record._cancelStartup(reason); record._cancelStartup = null; }
659
895
  this._writeTerminalState(record, { active: false, pending: false, completedAt: record.completedAt, stoppedReason: reason });
660
896
  try { await record.adapter?.abort?.(reason); } catch {}
661
- try { await record.adapter?.dispose?.({ preserveSession: true }); } catch {}
897
+ try { await record.adapter?.dispose?.({ preserveSession: true, ...(terminate ? { terminate: true } : {}) }); } catch {}
662
898
  this._releaseRuntimeRefs(record);
663
899
  this._emit('sidepanel:run-stopped', record);
664
900
  try { await this.onFinish(cleanDescriptor(record)); } catch {}
@@ -716,19 +952,21 @@ export class NativeLoopRuntime {
716
952
  return released;
717
953
  }
718
954
 
719
- setMcpProfile(runId, profile) {
955
+ setTools(runId, tools) {
720
956
  const record = this.records.get(runId);
721
- const normalized = String(profile || '').toLowerCase().trim();
722
- if (!record || !normalized) return null;
723
- if (record.mcpProfile === normalized) return cleanDescriptor(record);
724
- record.mcpProfile = normalized;
957
+ if (!record) return null;
958
+ if (!Array.isArray(tools)) throw Object.assign(new Error('tools must be an array'), { code: 'TOOLS_INVALID', status: 400 });
959
+ const normalized = storedToolList({ tools: retainExternalRefs(tools, record.tools) });
960
+ if (JSON.stringify(record.tools) === JSON.stringify(normalized)) return cleanDescriptor(record);
961
+ record.tools = normalized;
962
+ delete record.mcpProfile;
725
963
  try {
726
964
  const state = this._readState(record.runId);
727
- if (state) this._writeState(record.runId, { ...state, mcpProfile: normalized });
965
+ if (state) this._writeState(record.runId, { ...state, tools: normalized });
728
966
  } catch (error) {
729
967
  this.log(record.runId, 'native:state-write-error', error?.message || String(error));
730
968
  }
731
- return this._emit('sidepanel:run-updated', record, { reason: 'mcp-profile' });
969
+ return this._emit('sidepanel:run-updated', record, { reason: 'mcp-tools' });
732
970
  }
733
971
 
734
972
  get(runId) {
@@ -738,15 +976,23 @@ export class NativeLoopRuntime {
738
976
 
739
977
  list({ activeOnly = false } = {}) {
740
978
  return [...this.records.values()]
741
- .filter((record) => !activeOnly || ['starting', 'running'].includes(record.status))
979
+ .filter((record) => !activeOnly || LIVE_STATUSES.has(record.status))
742
980
  .map(cleanDescriptor)
743
981
  .sort((a, b) => String(b.startedAt || '').localeCompare(String(a.startedAt || '')));
744
982
  }
745
983
 
746
- async shutdown(reason = 'server_shutdown') {
984
+ /**
985
+ * The server is going down. `keep`: the runs its dispatcher suspends to resume on the next start
986
+ * (assistant-dispatch.js suspendForShutdown); every other running run is stopped. Either way each provider process
987
+ * is ended now (terminate), so nothing outlives the server. A run still waiting for its resume stays suspended.
988
+ */
989
+ async shutdown(reason = 'server_shutdown', { keep = [] } = {}) {
990
+ const kept = new Set((Array.isArray(keep) ? keep : []).map(String));
747
991
  await Promise.allSettled([...this.records.values()]
748
992
  .filter((record) => ['starting', 'running'].includes(record.status))
749
- .map((record) => this.stop(record.runId, reason)));
993
+ .map((record) => (kept.has(record.runId) ? this.suspend(record.runId, reason) : this.stop(record.runId, reason, { terminate: true }))));
994
+ for (const timer of this._holdTimers.values()) clearTimeout(timer);
995
+ this._holdTimers.clear();
750
996
  this._persistLedger({ force: true });
751
997
  }
752
998
  }