clay-server 5.2.0-beta.1 → 5.2.0-beta.11

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 (608) hide show
  1. package/README.md +0 -4
  2. package/lib/account-auth-socket.js +1 -0
  3. package/lib/builtin-mates.js +19 -16
  4. package/lib/bundled-skills/clay-agent-browser/SKILL.md +6 -2
  5. package/lib/canonical-clay-record-authority.js +15 -0
  6. package/lib/canonical-clay-scheduling-authority.js +19 -0
  7. package/lib/claude-hook-installer.js +1 -239
  8. package/lib/claude-jsonl-watcher.js +1 -204
  9. package/lib/clay-control-presentation-binding.js +96 -0
  10. package/lib/clay-control-presentation.js +128 -0
  11. package/lib/clay-control-target-projection.js +26 -0
  12. package/lib/clay-mate-chat-receipts.js +26 -0
  13. package/lib/clay-mate-chat.js +88 -0
  14. package/lib/clay-mate-knowledge-input.js +26 -0
  15. package/lib/clay-mate-knowledge.js +95 -0
  16. package/lib/clay-mate-lifecycle.js +95 -0
  17. package/lib/clay-product-control-input.js +33 -0
  18. package/lib/clay-product-control-tools.js +52 -0
  19. package/lib/clay-product-control.js +250 -0
  20. package/lib/clay-project-lifecycle.js +154 -0
  21. package/lib/clay-project-record-input.js +44 -0
  22. package/lib/clay-project-records.js +84 -0
  23. package/lib/clay-scheduling-input.js +21 -0
  24. package/lib/clay-scheduling-receipts.js +26 -0
  25. package/lib/clay-scheduling.js +119 -0
  26. package/lib/clay-screen-controls.js +104 -0
  27. package/lib/clay-skill-install.js +1 -33
  28. package/lib/clay-vendor-usage.js +44 -0
  29. package/lib/clay-workspace-controls.js +84 -0
  30. package/lib/clay-workspace-input.js +17 -0
  31. package/lib/clay-workspace-receipts.js +26 -0
  32. package/lib/cli-sessions.js +1 -300
  33. package/lib/codex-defaults.js +1 -28
  34. package/lib/context-usage.js +3 -2
  35. package/lib/contextual-screen-snapshot.js +38 -0
  36. package/lib/daemon-project-access.js +11 -0
  37. package/lib/daemon-project-lifecycle-callbacks.js +15 -0
  38. package/lib/daemon-project-lifecycle.js +262 -0
  39. package/lib/daemon-projects.js +1 -1
  40. package/lib/daemon.js +78 -276
  41. package/lib/default-ai-runtime.js +4 -8
  42. package/lib/dm-digest-cursor.js +120 -0
  43. package/lib/email-mcp-server.js +1 -1
  44. package/lib/github-star-count.js +147 -0
  45. package/lib/issues-service.js +29 -15
  46. package/lib/kiro-defaults.js +1 -22
  47. package/lib/knowledge-db-import-validation.js +46 -0
  48. package/lib/knowledge-db-import.js +99 -0
  49. package/lib/knowledge-db-service.js +24 -33
  50. package/lib/knowledge-db-storage-nedb-maintenance.js +99 -0
  51. package/lib/knowledge-db-storage-nedb.js +66 -0
  52. package/lib/knowledge-db-storage.js +72 -0
  53. package/lib/knowledge-db-validation.js +0 -0
  54. package/lib/knowledge-document-index.js +2 -1
  55. package/lib/knowledge-file-store.js +7 -1
  56. package/lib/knowledge-product-operations.js +46 -0
  57. package/lib/mate-avatar-catalog.js +12 -0
  58. package/lib/mate-avatar-migration.js +41 -0
  59. package/lib/mate-context-service.js +138 -0
  60. package/lib/mate-context-tools.js +21 -0
  61. package/lib/mate-creation-mcp-server.js +2 -0
  62. package/lib/mate-knowledge-canonical-access.js +10 -0
  63. package/lib/mate-knowledge-mate-bound.js +53 -0
  64. package/lib/mate-knowledge-mcp-server.js +55 -8
  65. package/lib/mate-knowledge-service.js +16 -34
  66. package/lib/mate-knowledge-text-tools.js +106 -0
  67. package/lib/mate-lifecycle-service.js +94 -0
  68. package/lib/mate-message-delivery.js +43 -0
  69. package/lib/mate-ready-creation.js +9 -1
  70. package/lib/mate-schedule-input.js +29 -0
  71. package/lib/mate-schedule-lifecycle.js +151 -0
  72. package/lib/mate-scheduling.js +103 -0
  73. package/lib/mates.js +18 -6
  74. package/lib/mcp-agent-tools.js +117 -0
  75. package/lib/mcp-connection-store.js +119 -15
  76. package/lib/mcp-import-credentials.js +31 -0
  77. package/lib/mcp-local-transport.js +13 -0
  78. package/lib/mcp-oauth.js +8 -6
  79. package/lib/mcp-proxy.js +2 -32
  80. package/lib/mcp-query-bridge.js +30 -0
  81. package/lib/mcp-remote-connections.js +74 -20
  82. package/lib/mcp-source-adapters.js +1 -0
  83. package/lib/mcp-source-context.js +1 -0
  84. package/lib/mcp-source-discovery.js +1 -0
  85. package/lib/mcp-source-plugins.js +1 -0
  86. package/lib/mcp-source-restrictions.js +1 -0
  87. package/lib/mcp-tool-policy.js +9 -0
  88. package/lib/notes-checklist.js +92 -0
  89. package/lib/notes.js +51 -4
  90. package/lib/os-user-diagnostics.js +2 -4
  91. package/lib/os-users.js +24 -70
  92. package/lib/pane-pending-interactions.js +20 -0
  93. package/lib/pane-session-activation.js +114 -0
  94. package/lib/pane-session-transport.js +26 -0
  95. package/lib/project-admin-overview.js +51 -0
  96. package/lib/project-ask-user.js +8 -4
  97. package/lib/project-connection.js +14 -10
  98. package/lib/project-control-git-view.js +12 -0
  99. package/lib/project-debate.js +1 -0
  100. package/lib/project-delegated-follow-up.js +2 -1
  101. package/lib/project-directory-claim.js +65 -0
  102. package/lib/project-file-operations.js +61 -0
  103. package/lib/project-filesystem.js +15 -85
  104. package/lib/project-full-access.js +23 -2
  105. package/lib/project-http.js +7 -4
  106. package/lib/project-knowledge.js +32 -18
  107. package/lib/project-lifecycle-operations.js +98 -0
  108. package/lib/project-lifecycle-process-witness.js +32 -0
  109. package/lib/project-lifecycle-runtime.js +50 -0
  110. package/lib/project-linux-access.js +22 -0
  111. package/lib/project-logs-canonical-clay.js +27 -0
  112. package/lib/project-logs-clay-query.js +16 -0
  113. package/lib/project-logs-schema.js +4 -2
  114. package/lib/project-logs-service.js +8 -7
  115. package/lib/project-logs.js +1 -0
  116. package/lib/project-loop.js +1 -0
  117. package/lib/project-mate-chat-control.js +55 -0
  118. package/lib/project-mate-creation-proposal.js +18 -3
  119. package/lib/project-mate-interaction.js +40 -62
  120. package/lib/project-mcp.js +54 -16
  121. package/lib/project-models.js +14 -31
  122. package/lib/project-notifications.js +76 -17
  123. package/lib/project-ownership.js +77 -0
  124. package/lib/project-pair-result-delivery.js +14 -3
  125. package/lib/project-pair-usage.js +12 -13
  126. package/lib/project-pending-message-queue.js +4 -1
  127. package/lib/project-product-control.js +89 -0
  128. package/lib/project-product-session-queue.js +46 -0
  129. package/lib/project-push-access.js +28 -0
  130. package/lib/project-scheduled-message-queue.js +30 -0
  131. package/lib/project-scheduled-messages.js +67 -68
  132. package/lib/project-scheduled-task-control.js +83 -0
  133. package/lib/project-scheduled-tasks.js +13 -2
  134. package/lib/project-scheduling-access.js +10 -0
  135. package/lib/project-session-actions.js +65 -0
  136. package/lib/project-session-delete.js +8 -1
  137. package/lib/project-session-document.js +27 -7
  138. package/lib/project-session-github.js +63 -19
  139. package/lib/project-session-history-actions.js +167 -0
  140. package/lib/project-session-linear.js +14 -6
  141. package/lib/project-session-notes.js +40 -11
  142. package/lib/project-session-pair.js +1 -1
  143. package/lib/project-session-runtime-actions.js +64 -0
  144. package/lib/project-session-spawn.js +2 -3
  145. package/lib/project-session-vendor.js +55 -0
  146. package/lib/project-sessions.js +160 -290
  147. package/lib/project-shared-browser.js +78 -17
  148. package/lib/project-start-protocol.js +29 -0
  149. package/lib/project-studio-presentation.js +58 -0
  150. package/lib/project-user-message.js +67 -1
  151. package/lib/project-vendor-login.js +8 -36
  152. package/lib/project-workspace-operations.js +126 -0
  153. package/lib/project-workspace-query.js +19 -2
  154. package/lib/project.js +181 -45
  155. package/lib/public/app.js +71 -17
  156. package/lib/public/appearance-bootstrap.js +16 -0
  157. package/lib/public/css/clay-tool-activity.css +51 -0
  158. package/lib/public/css/clay-workspace.css +29 -0
  159. package/lib/public/css/command-palette.css +12 -33
  160. package/lib/public/css/contextual-clay.css +240 -0
  161. package/lib/public/css/filebrowser.css +1 -1
  162. package/lib/public/css/home-debate-planning.css +2 -0
  163. package/lib/public/css/home-mate-creation.css +5 -0
  164. package/lib/public/css/input.css +6 -0
  165. package/lib/public/css/mate-avatar-gallery.css +12 -0
  166. package/lib/public/css/mate-conversation.css +10 -5
  167. package/lib/public/css/mate-loading-scene.css +21 -0
  168. package/lib/public/css/messages.css +6 -2
  169. package/lib/public/css/overlays.css +68 -258
  170. package/lib/public/css/project-admin-overview.css +13 -0
  171. package/lib/public/css/project-mate-creation.css +5 -6
  172. package/lib/public/css/project-start.css +108 -0
  173. package/lib/public/css/projects-hub.css +53 -14
  174. package/lib/public/css/session-folders.css +11 -0
  175. package/lib/public/css/session-github.css +46 -1
  176. package/lib/public/css/settings-shell.css +103 -0
  177. package/lib/public/css/shared-browser.css +35 -1
  178. package/lib/public/css/sidebar.css +7 -0
  179. package/lib/public/css/sticky-notes.css +87 -1
  180. package/lib/public/css/title-bar.css +79 -0
  181. package/lib/public/index.html +61 -68
  182. package/lib/public/mate-avatars/B01.png +0 -0
  183. package/lib/public/mate-avatars/B02.png +0 -0
  184. package/lib/public/mate-avatars/B03.png +0 -0
  185. package/lib/public/mate-avatars/B04.png +0 -0
  186. package/lib/public/mate-avatars/B05.png +0 -0
  187. package/lib/public/mate-avatars/B06.png +0 -0
  188. package/lib/public/mate-avatars/B07.png +0 -0
  189. package/lib/public/mate-avatars/B08.png +0 -0
  190. package/lib/public/mate-avatars/B09.png +0 -0
  191. package/lib/public/mate-avatars/B10.png +0 -0
  192. package/lib/public/mate-avatars/B11.png +0 -0
  193. package/lib/public/mate-avatars/B12.png +0 -0
  194. package/lib/public/mate-avatars/B13.png +0 -0
  195. package/lib/public/mate-avatars/B14.png +0 -0
  196. package/lib/public/mate-avatars/B15.png +0 -0
  197. package/lib/public/mate-avatars/B16.png +0 -0
  198. package/lib/public/mate-avatars/B17.png +0 -0
  199. package/lib/public/mate-avatars/B18.png +0 -0
  200. package/lib/public/mate-avatars/B19.png +0 -0
  201. package/lib/public/mate-avatars/B20.png +0 -0
  202. package/lib/public/mate-avatars/B21.png +0 -0
  203. package/lib/public/mate-avatars/B22.png +0 -0
  204. package/lib/public/mate-avatars/B23.png +0 -0
  205. package/lib/public/mate-avatars/B24.png +0 -0
  206. package/lib/public/mate-avatars/B25.png +0 -0
  207. package/lib/public/mate-avatars/B26.png +0 -0
  208. package/lib/public/mate-avatars/B27.png +0 -0
  209. package/lib/public/mate-avatars/B28.png +0 -0
  210. package/lib/public/mate-avatars/B29.png +0 -0
  211. package/lib/public/mate-avatars/B30.png +0 -0
  212. package/lib/public/mate-avatars/B31.png +0 -0
  213. package/lib/public/mate-avatars/B32.png +0 -0
  214. package/lib/public/mate-avatars/B33.png +0 -0
  215. package/lib/public/mate-avatars/B34.png +0 -0
  216. package/lib/public/mate-avatars/B35.png +0 -0
  217. package/lib/public/mate-avatars/B36.png +0 -0
  218. package/lib/public/mate-avatars/B37.png +0 -0
  219. package/lib/public/mate-avatars/B38.png +0 -0
  220. package/lib/public/mate-avatars/B39.png +0 -0
  221. package/lib/public/mate-avatars/B40.png +0 -0
  222. package/lib/public/mate-avatars/B41.png +0 -0
  223. package/lib/public/mate-avatars/B42.png +0 -0
  224. package/lib/public/mate-avatars/B43.png +0 -0
  225. package/lib/public/mate-avatars/B44.png +0 -0
  226. package/lib/public/mate-avatars/B45.png +0 -0
  227. package/lib/public/mate-avatars/B46.png +0 -0
  228. package/lib/public/mate-avatars/B47.png +0 -0
  229. package/lib/public/mate-avatars/B48.png +0 -0
  230. package/lib/public/mate-avatars/C01.png +0 -0
  231. package/lib/public/mate-avatars/C02.png +0 -0
  232. package/lib/public/mate-avatars/C03.png +0 -0
  233. package/lib/public/mate-avatars/C04.png +0 -0
  234. package/lib/public/mate-avatars/C05.png +0 -0
  235. package/lib/public/mate-avatars/C06.png +0 -0
  236. package/lib/public/mate-avatars/C07.png +0 -0
  237. package/lib/public/mate-avatars/C08.png +0 -0
  238. package/lib/public/mate-avatars/C09.png +0 -0
  239. package/lib/public/mate-avatars/C10.png +0 -0
  240. package/lib/public/mate-avatars/C11.png +0 -0
  241. package/lib/public/mate-avatars/C12.png +0 -0
  242. package/lib/public/mate-avatars/C13.png +0 -0
  243. package/lib/public/mate-avatars/C14.png +0 -0
  244. package/lib/public/mate-avatars/C15.png +0 -0
  245. package/lib/public/mate-avatars/C16.png +0 -0
  246. package/lib/public/mate-avatars/C17.png +0 -0
  247. package/lib/public/mate-avatars/C18.png +0 -0
  248. package/lib/public/mate-avatars/C19.png +0 -0
  249. package/lib/public/mate-avatars/C20.png +0 -0
  250. package/lib/public/mate-avatars/C21.png +0 -0
  251. package/lib/public/mate-avatars/C22.png +0 -0
  252. package/lib/public/mate-avatars/C23.png +0 -0
  253. package/lib/public/mate-avatars/C24.png +0 -0
  254. package/lib/public/mate-avatars/C25.png +0 -0
  255. package/lib/public/mate-avatars/C26.png +0 -0
  256. package/lib/public/mate-avatars/C27.png +0 -0
  257. package/lib/public/mate-avatars/C28.png +0 -0
  258. package/lib/public/mate-avatars/C29.png +0 -0
  259. package/lib/public/mate-avatars/C30.png +0 -0
  260. package/lib/public/mate-avatars/C31.png +0 -0
  261. package/lib/public/mate-avatars/C32.png +0 -0
  262. package/lib/public/mate-avatars/C33.png +0 -0
  263. package/lib/public/mate-avatars/C34.png +0 -0
  264. package/lib/public/mate-avatars/C35.png +0 -0
  265. package/lib/public/mate-avatars/C36.png +0 -0
  266. package/lib/public/mate-avatars/C37.png +0 -0
  267. package/lib/public/mate-avatars/C38.png +0 -0
  268. package/lib/public/mate-avatars/C39.png +0 -0
  269. package/lib/public/mate-avatars/C40.png +0 -0
  270. package/lib/public/mate-avatars/C41.png +0 -0
  271. package/lib/public/mate-avatars/C42.png +0 -0
  272. package/lib/public/mate-avatars/C43.png +0 -0
  273. package/lib/public/mate-avatars/C44.png +0 -0
  274. package/lib/public/mate-avatars/C45.png +0 -0
  275. package/lib/public/mate-avatars/C46.png +0 -0
  276. package/lib/public/mate-avatars/C47.png +0 -0
  277. package/lib/public/mate-avatars/C48.png +0 -0
  278. package/lib/public/mate-avatars/catalog.json +482 -0
  279. package/lib/public/mate-avatars/lead-clay.png +0 -0
  280. package/lib/public/modules/admin-settings-invitations.js +2 -2
  281. package/lib/public/modules/admin-settings-projects.js +8 -4
  282. package/lib/public/modules/admin-settings-ui.js +20 -4
  283. package/lib/public/modules/admin-settings-users.js +4 -4
  284. package/lib/public/modules/app-connection.js +11 -1
  285. package/lib/public/modules/app-favicon.js +18 -9
  286. package/lib/public/modules/app-header.js +7 -4
  287. package/lib/public/modules/app-home-hub.js +2 -1
  288. package/lib/public/modules/app-loop-ui.js +2 -0
  289. package/lib/public/modules/app-message-router.js +22 -1
  290. package/lib/public/modules/app-messages.js +125 -19
  291. package/lib/public/modules/app-misc.js +3 -1
  292. package/lib/public/modules/app-notifications.js +11 -5
  293. package/lib/public/modules/app-panels.js +61 -123
  294. package/lib/public/modules/app-projects.js +14 -407
  295. package/lib/public/modules/app-rate-limit.js +19 -28
  296. package/lib/public/modules/app-rendering.js +4 -3
  297. package/lib/public/modules/avatar.js +15 -41
  298. package/lib/public/modules/chat-render-runtime.js +20 -0
  299. package/lib/public/modules/clay-browser-links.js +47 -0
  300. package/lib/public/modules/clay-control-activity.js +214 -0
  301. package/lib/public/modules/clay-control-copy.js +36 -0
  302. package/lib/public/modules/clay-control-detail-targets.js +44 -0
  303. package/lib/public/modules/clay-control-object-targets.js +52 -0
  304. package/lib/public/modules/clay-control-target-visibility.js +12 -0
  305. package/lib/public/modules/clay-control-targets.js +44 -0
  306. package/lib/public/modules/clay-log-links.js +23 -0
  307. package/lib/public/modules/clay-navigation-render.js +52 -0
  308. package/lib/public/modules/clay-owner-navigation.js +33 -0
  309. package/lib/public/modules/clay-session-links.js +31 -0
  310. package/lib/public/modules/clay-studio-bridge.js +20 -0
  311. package/lib/public/modules/clay-studio-document.js +67 -0
  312. package/lib/public/modules/clay-studio-render.js +146 -0
  313. package/lib/public/modules/clay-tool-activity.js +140 -0
  314. package/lib/public/modules/clay-tool-presentation.js +343 -0
  315. package/lib/public/modules/command-palette.js +162 -40
  316. package/lib/public/modules/contextual-ask-session.js +26 -0
  317. package/lib/public/modules/contextual-clay-geometry.js +155 -0
  318. package/lib/public/modules/contextual-clay-session.js +130 -0
  319. package/lib/public/modules/contextual-clay-workspace.js +169 -0
  320. package/lib/public/modules/contextual-clay.js +252 -0
  321. package/lib/public/modules/contextual-composer.js +91 -0
  322. package/lib/public/modules/contextual-mate-context.js +117 -0
  323. package/lib/public/modules/contextual-mate-hint.js +40 -0
  324. package/lib/public/modules/contextual-mate-identity.js +23 -0
  325. package/lib/public/modules/contextual-mate-sessions.js +134 -0
  326. package/lib/public/modules/contextual-search.js +137 -0
  327. package/lib/public/modules/contextual-session-citations.js +58 -0
  328. package/lib/public/modules/debate.js +1 -0
  329. package/lib/public/modules/default-ai.js +11 -3
  330. package/lib/public/modules/elicitation-form.js +5 -0
  331. package/lib/public/modules/filebrowser.js +20 -1
  332. package/lib/public/modules/generation-stop.js +8 -5
  333. package/lib/public/modules/git-panel.js +3 -1
  334. package/lib/public/modules/github-star.js +66 -0
  335. package/lib/public/modules/history-replay-batch.js +13 -1
  336. package/lib/public/modules/home-debate-live.js +2 -0
  337. package/lib/public/modules/home-debate-planning.js +7 -7
  338. package/lib/public/modules/home-mate-avatar-editor.js +127 -208
  339. package/lib/public/modules/home-mate-chat.js +8 -6
  340. package/lib/public/modules/home-mate-creation.js +73 -1
  341. package/lib/public/modules/home-mate-settings.js +19 -12
  342. package/lib/public/modules/icon-strip-tooltip.js +2 -1
  343. package/lib/public/modules/input.js +88 -10
  344. package/lib/public/modules/issues-render.js +3 -2
  345. package/lib/public/modules/knowledge-db-workbench.js +4 -4
  346. package/lib/public/modules/markdown.js +6 -34
  347. package/lib/public/modules/mate-avatar-catalog.js +97 -0
  348. package/lib/public/modules/mate-knowledge-workbench.js +1 -1
  349. package/lib/public/modules/mate-loading-scene.js +17 -0
  350. package/lib/public/modules/mate-management.js +40 -7
  351. package/lib/public/modules/mcp-connection-view.js +31 -13
  352. package/lib/public/modules/mcp-discovery-view.js +31 -0
  353. package/lib/public/modules/mcp-ui.js +23 -4
  354. package/lib/public/modules/mention.js +3 -0
  355. package/lib/public/modules/message-delivery.js +20 -2
  356. package/lib/public/modules/model-picker.js +2 -0
  357. package/lib/public/modules/pane-activation.js +214 -0
  358. package/lib/public/modules/pane-binding.js +82 -0
  359. package/lib/public/modules/pane-bridge.js +7 -4
  360. package/lib/public/modules/pane-browser-bridge.js +22 -0
  361. package/lib/public/modules/pane-file-bridge.js +4 -0
  362. package/lib/public/modules/pane-issue-bridge.js +4 -1
  363. package/lib/public/modules/pending-message-queue.js +1 -0
  364. package/lib/public/modules/permission-control.js +5 -4
  365. package/lib/public/modules/personal-settings-dialog.js +7 -1
  366. package/lib/public/modules/product-review.js +26 -0
  367. package/lib/public/modules/profile.js +12 -241
  368. package/lib/public/modules/project-access-recovery.js +17 -0
  369. package/lib/public/modules/project-admin-overview.js +21 -0
  370. package/lib/public/modules/project-chat-identity.js +13 -4
  371. package/lib/public/modules/project-logs-render.js +3 -0
  372. package/lib/public/modules/project-mate-creation-workspace.js +13 -4
  373. package/lib/public/modules/project-mate-navigation.js +144 -22
  374. package/lib/public/modules/project-session-visibility-settings.js +19 -16
  375. package/lib/public/modules/project-settings.js +119 -129
  376. package/lib/public/modules/project-start-dialog.js +130 -0
  377. package/lib/public/modules/project-start-folder-state.js +78 -0
  378. package/lib/public/modules/project-start-folder-view.js +190 -0
  379. package/lib/public/modules/project-start-forms.js +66 -0
  380. package/lib/public/modules/project-start-path.js +60 -0
  381. package/lib/public/modules/project-start-state.js +54 -0
  382. package/lib/public/modules/project-start-submit.js +67 -0
  383. package/lib/public/modules/projects-hub-view.js +33 -14
  384. package/lib/public/modules/projects-hub.js +10 -6
  385. package/lib/public/modules/rewind.js +5 -0
  386. package/lib/public/modules/scheduled-tasks.js +2 -0
  387. package/lib/public/modules/scheduler.js +2 -0
  388. package/lib/public/modules/search-clay-chat.js +5 -440
  389. package/lib/public/modules/server-settings.js +36 -91
  390. package/lib/public/modules/session-actions.js +5 -2
  391. package/lib/public/modules/session-context-menu.js +5 -0
  392. package/lib/public/modules/session-create-form.js +10 -10
  393. package/lib/public/modules/session-folder-layout.js +1 -1
  394. package/lib/public/modules/session-folder-view-menu.js +9 -0
  395. package/lib/public/modules/session-github.js +85 -14
  396. package/lib/public/modules/session-rich-drafts.js +21 -0
  397. package/lib/public/modules/session-switch-defer.js +67 -0
  398. package/lib/public/modules/session-work-primary.js +51 -0
  399. package/lib/public/modules/settings-defaults.js +27 -28
  400. package/lib/public/modules/settings-project-target.js +56 -0
  401. package/lib/public/modules/settings-select.js +1 -1
  402. package/lib/public/modules/settings-shell-registry.js +88 -0
  403. package/lib/public/modules/settings-shell-view.js +104 -0
  404. package/lib/public/modules/settings-shell.js +342 -0
  405. package/lib/public/modules/shared-browser-settings.js +112 -0
  406. package/lib/public/modules/shared-browser-tabs.js +13 -3
  407. package/lib/public/modules/shared-browser.js +29 -6
  408. package/lib/public/modules/sidebar-mobile.js +12 -33
  409. package/lib/public/modules/sidebar-projects.js +3 -1
  410. package/lib/public/modules/sidebar-session-folders-ui.js +1 -1
  411. package/lib/public/modules/sidebar-sessions.js +1 -0
  412. package/lib/public/modules/split-group-restore.js +68 -0
  413. package/lib/public/modules/split-pair-ui.js +1 -0
  414. package/lib/public/modules/split-pane-reconciler.js +15 -0
  415. package/lib/public/modules/split-pane-renderer.js +87 -6
  416. package/lib/public/modules/split-session-boundary.js +1 -1
  417. package/lib/public/modules/split-view.js +60 -68
  418. package/lib/public/modules/sticky-note-markdown.js +72 -6
  419. package/lib/public/modules/sticky-notes-actions.js +30 -0
  420. package/lib/public/modules/sticky-notes-browser.js +9 -2
  421. package/lib/public/modules/sticky-notes-card.js +23 -7
  422. package/lib/public/modules/sticky-notes-checklist.js +116 -0
  423. package/lib/public/modules/sticky-notes-editor.js +108 -44
  424. package/lib/public/modules/sticky-notes-shared.js +50 -2
  425. package/lib/public/modules/sticky-notes-state.js +66 -0
  426. package/lib/public/modules/sticky-notes.js +34 -51
  427. package/lib/public/modules/stt-controller.js +4 -1
  428. package/lib/public/modules/stt-recording.js +1 -1
  429. package/lib/public/modules/stt.js +7 -2
  430. package/lib/public/modules/terminal.js +9 -0
  431. package/lib/public/modules/theme.js +18 -3
  432. package/lib/public/modules/thinking-lifecycle.js +33 -3
  433. package/lib/public/modules/thinking-view.js +23 -1
  434. package/lib/public/modules/tools.js +60 -11
  435. package/lib/public/modules/tui-grab.js +1 -2
  436. package/lib/public/modules/user-settings-appearance.js +10 -3
  437. package/lib/public/modules/user-settings-editors.js +1 -1
  438. package/lib/public/modules/user-settings-layout.js +14 -30
  439. package/lib/public/modules/user-settings-preferences.js +6 -2
  440. package/lib/public/modules/user-settings-profile.js +13 -3
  441. package/lib/public/modules/user-settings.js +18 -84
  442. package/lib/public/modules/vendor-login-browser.js +5 -3
  443. package/lib/public/modules/vendor-login.js +2 -2
  444. package/lib/public/modules/vendor-priority.js +15 -1
  445. package/lib/public/modules/vendor-usage-format.js +93 -0
  446. package/lib/public/modules/vendor-usage-list.js +45 -0
  447. package/lib/public/modules/vendor-usage-model.js +215 -0
  448. package/lib/public/modules/vendor-usage-overview.js +312 -0
  449. package/lib/public/modules/wireframe-workbench.js +5 -2
  450. package/lib/public/muse-avatar.svg +4 -0
  451. package/lib/public/style.css +14 -6
  452. package/lib/public/sw.js +3 -1
  453. package/lib/public/welcome-art/conversation-desk.png +0 -0
  454. package/lib/public/welcome-art/mate-clay.png +0 -0
  455. package/lib/public/welcome-art/project-clay.png +0 -0
  456. package/lib/safe-bash-commands.js +3 -45
  457. package/lib/scheduled-task-records.js +3 -1
  458. package/lib/scheduler.js +2 -0
  459. package/lib/sdk-bridge.js +348 -402
  460. package/lib/sdk-foreground-admission.js +16 -0
  461. package/lib/sdk-mcp-descriptors.js +2 -37
  462. package/lib/sdk-message-processor.js +61 -18
  463. package/lib/sdk-quota-snapshot.js +21 -3
  464. package/lib/sdk-response-recovery.js +1 -0
  465. package/lib/sdk-worker.js +2 -677
  466. package/lib/server-admin.js +63 -16
  467. package/lib/server-appearance-settings.js +13 -1
  468. package/lib/server-contextual-clay-settings.js +40 -0
  469. package/lib/server-contextual-mate-sessions.js +70 -0
  470. package/lib/server-dm.js +2 -1
  471. package/lib/server-github-stars.js +39 -0
  472. package/lib/server-global-ws.js +26 -32
  473. package/lib/server-home-chat-events.js +18 -4
  474. package/lib/server-home-chat.js +22 -20
  475. package/lib/server-home-clay-entry.js +23 -4
  476. package/lib/server-home-clay-session-links.js +29 -9
  477. package/lib/server-home-mate-creation.js +1 -0
  478. package/lib/server-home-mcp-consent.js +14 -0
  479. package/lib/server-mates.js +25 -62
  480. package/lib/server-owner-ui.js +118 -0
  481. package/lib/server-path-access.js +38 -0
  482. package/lib/server-project-removal.js +22 -0
  483. package/lib/server-settings.js +6 -1
  484. package/lib/server.js +167 -43
  485. package/lib/session-config-transition.js +45 -0
  486. package/lib/session-folders.js +7 -2
  487. package/lib/session-fork-history.js +21 -0
  488. package/lib/session-github.js +9 -2
  489. package/lib/session-hygiene.js +3 -35
  490. package/lib/session-notes-mcp-server.js +26 -4
  491. package/lib/session-notes-writes.js +88 -0
  492. package/lib/session-permission-mode.js +4 -3
  493. package/lib/session-skill-scope.js +11 -0
  494. package/lib/session-visibility.js +25 -10
  495. package/lib/session-work-primary.js +50 -0
  496. package/lib/sessions.js +66 -99
  497. package/lib/shared-browser-cookie-sync.js +32 -0
  498. package/lib/shared-browser-cookies.js +79 -0
  499. package/lib/shared-browser-runtime.js +25 -9
  500. package/lib/shared-browser-storage-sync.js +43 -0
  501. package/lib/shared-browser-storage.js +101 -0
  502. package/lib/shared-browser-tools.js +2 -1
  503. package/lib/shared-browser-worker.js +46 -10
  504. package/lib/terminal-manager.js +65 -6
  505. package/lib/tool-llm.js +1 -1
  506. package/lib/tui-transcript-index.js +1 -132
  507. package/lib/users-contextual-clay-preferences.js +31 -0
  508. package/lib/users-permissions.js +2 -8
  509. package/lib/users.js +7 -0
  510. package/lib/vendor-login-browser.js +1 -11
  511. package/lib/vendor-usage-acp-readers.js +97 -0
  512. package/lib/vendor-usage-capabilities.js +88 -0
  513. package/lib/vendor-usage-http-readers.js +214 -0
  514. package/lib/vendor-usage-metrics.js +47 -0
  515. package/lib/vendor-usage-native-readers.js +106 -0
  516. package/lib/vendor-usage-overview.js +406 -0
  517. package/lib/vendor-usage-service.js +281 -0
  518. package/lib/workspace-assignment-service.js +25 -0
  519. package/lib/workspace-query-access.js +4 -1
  520. package/lib/workspace-query-mcp-server.js +1 -1
  521. package/lib/workspace-query-service.js +13 -2
  522. package/lib/ws-request.js +1 -0
  523. package/lib/ws-schema.js +22 -4
  524. package/lib/yoke/acp-agent-profiles.js +7 -5
  525. package/lib/yoke/adapters/antigravity.js +3 -14
  526. package/lib/yoke/adapters/claude-query-contract.js +9 -0
  527. package/lib/yoke/adapters/claude.js +66 -50
  528. package/lib/yoke/adapters/codex-query-contract.js +25 -0
  529. package/lib/yoke/adapters/codex.js +98 -123
  530. package/lib/yoke/adapters/kiro.js +3 -1
  531. package/lib/yoke/adapters/muse-query-contract.js +7 -0
  532. package/lib/yoke/adapters/muse.js +122 -0
  533. package/lib/yoke/auth-events.js +17 -0
  534. package/lib/yoke/claude-hook-installer.js +272 -0
  535. package/lib/yoke/claude-jsonl-watcher.js +204 -0
  536. package/lib/yoke/claude-maintenance.js +55 -0
  537. package/lib/yoke/claude-permission-patterns.js +53 -0
  538. package/lib/yoke/claude-response-recovery.js +155 -0
  539. package/lib/yoke/claude-transcript-hygiene.js +34 -0
  540. package/lib/yoke/claude-worker-startup.js +28 -0
  541. package/lib/yoke/clay-skill-install.js +33 -0
  542. package/lib/yoke/cli-sessions.js +300 -0
  543. package/lib/yoke/codex-app-server.js +7 -12
  544. package/lib/yoke/codex-dynamic-tool-names.js +80 -0
  545. package/lib/yoke/codex-idle-recovery.js +81 -1
  546. package/lib/yoke/codex-model-catalog.js +37 -3
  547. package/lib/yoke/codex-recovery-admission.js +164 -0
  548. package/lib/yoke/configuration.js +13 -0
  549. package/lib/yoke/discovery.js +70 -0
  550. package/lib/yoke/errors.js +8 -0
  551. package/lib/yoke/host-environment.js +7 -0
  552. package/lib/yoke/index.js +9 -51
  553. package/lib/yoke/interface.js +116 -0
  554. package/lib/yoke/kiro-acp-server.js +5 -5
  555. package/lib/yoke/legacy-sessions.js +89 -0
  556. package/lib/yoke/login-protocol.js +25 -0
  557. package/lib/yoke/maintenance.js +12 -0
  558. package/lib/yoke/mcp-proxy.js +32 -0
  559. package/lib/yoke/mcp-source-adapters.js +91 -0
  560. package/lib/yoke/mcp-source-context.js +42 -0
  561. package/lib/yoke/mcp-source-discovery.js +169 -0
  562. package/lib/yoke/mcp-source-plugins.js +68 -0
  563. package/lib/yoke/mcp-source-restrictions.js +47 -0
  564. package/lib/yoke/mcp-tool-policy-normalize.js +28 -0
  565. package/lib/yoke/model-preferences.js +6 -0
  566. package/lib/yoke/muse-artifacts.js +36 -0
  567. package/lib/yoke/muse-controls.js +50 -0
  568. package/lib/yoke/muse-input.js +64 -0
  569. package/lib/yoke/muse-items.js +157 -0
  570. package/lib/yoke/muse-policy.js +52 -0
  571. package/lib/yoke/muse-query.js +428 -0
  572. package/lib/yoke/muse-runtime.js +211 -0
  573. package/lib/yoke/muse-services.js +92 -0
  574. package/lib/yoke/muse-skills.js +79 -0
  575. package/lib/yoke/muse-turns.js +71 -0
  576. package/lib/yoke/options/acp.js +2 -0
  577. package/lib/yoke/options/antigravity.js +2 -0
  578. package/lib/yoke/options/claude.js +21 -0
  579. package/lib/yoke/options/codex-defaults.js +29 -0
  580. package/lib/yoke/options/codex-settings.js +21 -0
  581. package/lib/yoke/options/codex.js +6 -0
  582. package/lib/yoke/options/kiro-defaults.js +22 -0
  583. package/lib/yoke/options/kiro.js +5 -0
  584. package/lib/yoke/options/muse.js +5 -0
  585. package/lib/yoke/provider-contract.js +5 -0
  586. package/lib/yoke/providers/antigravity-executable.js +8 -0
  587. package/lib/yoke/providers/claude-executable.js +40 -0
  588. package/lib/yoke/providers/claude-model-descriptions.js +34 -0
  589. package/lib/yoke/providers/claude-process.js +97 -0
  590. package/lib/yoke/providers/claude-provision.js +75 -0
  591. package/lib/yoke/providers/codex-errors.js +8 -0
  592. package/lib/yoke/providers/muse-executable.js +17 -0
  593. package/lib/yoke/provisioning.js +6 -0
  594. package/lib/yoke/query-options.js +10 -0
  595. package/lib/yoke/response-recovery.js +41 -0
  596. package/lib/yoke/sdk-mcp-descriptors.js +37 -0
  597. package/lib/yoke/sdk-server-factory.js +7 -0
  598. package/lib/yoke/session-history.js +8 -0
  599. package/lib/yoke/session-tool-transport.js +34 -13
  600. package/lib/yoke/settings.js +23 -0
  601. package/lib/yoke/source-locations.js +4 -0
  602. package/lib/yoke/title-query.js +18 -7
  603. package/lib/yoke/tui-transcript-index.js +132 -0
  604. package/lib/yoke/usage.js +48 -0
  605. package/lib/yoke/user-input.js +13 -0
  606. package/lib/yoke/vendor-registry.js +87 -3
  607. package/package.json +11 -4
  608. package/lib/public/modules/server-settings-navigation.js +0 -39
@@ -5,8 +5,9 @@ import { refreshIcons } from './icons.js';
5
5
  import { store } from './store.js';
6
6
  import { getSendBtn, getStatusDot } from './dom-refs.js';
7
7
  import { onThemeChange } from './theme.js';
8
- import { getActivityEl, setActivityEl, addToMessages, scrollToBottom, VENDOR_AVATARS } from './app-rendering.js';
8
+ import { getActivityEl, setActivityEl, addToMessages, scrollToBottom } from './app-rendering.js';
9
9
  import { escapeHtml } from './utils.js';
10
+ import { resolveProjectAssistantIdentity, applyProjectAssistantIdentity } from './project-chat-identity.js';
10
11
 
11
12
  // --- Module-owned state ---
12
13
  var faviconLink, faviconOrigHref, faviconCanvas, faviconCtx, faviconImg, faviconImgReady;
@@ -197,7 +198,7 @@ export function stopUrgentBlink() {
197
198
 
198
199
  export function setActivity(text) {
199
200
  var thinkingState = store.get('thinkingState');
200
- if (text === "thinking" && thinkingState && thinkingState.active) {
201
+ if ((text === "thinking" || text === "running") && thinkingState && thinkingState.active) {
201
202
  // Live Thinking already owns the tail progress UI. Compaction and tool
202
203
  // activity intentionally continue through so their distinct states show.
203
204
  if (getActivityEl()) {
@@ -210,14 +211,12 @@ export function setActivity(text) {
210
211
  if (!getActivityEl()) {
211
212
  var _actEl = document.createElement("div");
212
213
  _actEl.className = "activity-inline";
213
- // In channel mode (Claude Code / Codex sessions), include the vendor
214
- // avatar so the user can see who is responding while the dots are
215
- // animating. DM mode handles its own avatar via mate-thinking
216
- // elements and shouldn't pick up a vendor avatar here.
214
+ // The same session-bound identity owns waiting, thoughts and replies.
215
+ // DM mode retains its own Mate-thinking row.
217
216
  var _isDm = !!(store.get('dmMode') && store.get('dmTargetUser') && store.get('dmTargetUser').isMate);
218
217
  if (!_isDm) {
219
- var _vendor = store.get('currentVendor') || 'claude';
220
- var _avatarUrl = VENDOR_AVATARS[_vendor] || VENDOR_AVATARS.claude;
218
+ var _identity = resolveProjectAssistantIdentity(store.snap(), store.get('currentVendor'));
219
+ var _avatarUrl = _identity.avatarUrl;
221
220
  _actEl.innerHTML =
222
221
  '<img class="activity-inline-avatar" src="' + escapeHtml(_avatarUrl) + '" alt="">' +
223
222
  '<div class="mate-thinking-dots"><span></span><span></span><span></span></div>';
@@ -225,9 +224,19 @@ export function setActivity(text) {
225
224
  _actEl.innerHTML =
226
225
  '<div class="mate-thinking-dots"><span></span><span></span><span></span></div>';
227
226
  }
227
+ _actEl.setAttribute("role", "status");
228
+ _actEl.setAttribute("aria-live", "polite");
228
229
  setActivityEl(_actEl);
229
- addToMessages(_actEl);
230
230
  }
231
+ var activity = getActivityEl();
232
+ var labels = { waiting: "Waiting for provider", running: "Working", background: "Background work pending" };
233
+ var label = activity.querySelector(".activity-state-label");
234
+ if (labels[text]) {
235
+ if (!label) { label = document.createElement("span"); label.className = "activity-state-label activity-text"; activity.appendChild(label); }
236
+ label.textContent = labels[text];
237
+ } else if (label) label.remove();
238
+ applyProjectAssistantIdentity(activity, resolveProjectAssistantIdentity(store.snap(), store.get('currentVendor')));
239
+ addToMessages(activity);
231
240
  scrollToBottom();
232
241
  } else {
233
242
  if (getActivityEl()) {
@@ -267,14 +267,16 @@ export function initHeader() {
267
267
  addRow("Local ID", split.panes[pi].sessionId);
268
268
  if (member && member.cliSessionId) {
269
269
  addRow("Session ID", member.cliSessionId);
270
- addRow("Resume", "claude --resume " + member.cliSessionId);
270
+ var memberResume = ((store.get("vendorInfo") || {})[member.vendor || "claude"] || {}).terminalResumeCommand;
271
+ if (memberResume) addRow("Resume", memberResume + " " + member.cliSessionId);
271
272
  }
272
273
  }
273
274
  } else {
274
275
  var s = store.snap();
275
276
  if (s.cliSessionId) addRow("Session ID", s.cliSessionId);
276
277
  if (s.activeSessionId) addRow("Local ID", s.activeSessionId);
277
- if (s.cliSessionId) addRow("Resume", "claude --resume " + s.cliSessionId);
278
+ var resume = ((s.vendorInfo || {})[s.currentVendor] || {}).terminalResumeCommand;
279
+ if (s.cliSessionId && resume) addRow("Resume", resume + " " + s.cliSessionId);
278
280
  }
279
281
 
280
282
  document.body.appendChild(pop);
@@ -350,6 +352,7 @@ export function prependOlderHistory(items, meta) {
350
352
 
351
353
  // Save current rendering state
352
354
  var savedMsgEl = store.get('currentMsgEl');
355
+ var savedReplayingHistory = store.get('replayingHistory');
353
356
  var savedActivity = getActivityEl();
354
357
  var savedFullText = store.get('currentFullText');
355
358
  var savedTurnCounter = getTurnCounter();
@@ -359,7 +362,7 @@ export function prependOlderHistory(items, meta) {
359
362
  var savedUsage = JSON.parse(JSON.stringify(getSessionUsage()));
360
363
 
361
364
  // Reset to initial values for clean rendering
362
- store.set({ currentMsgEl: null, currentFullText: "" });
365
+ store.set({ currentMsgEl: null, currentFullText: "", replayingHistory: true });
363
366
  setActivityEl(null);
364
367
  setTurnCounter(0);
365
368
  resetToolState();
@@ -387,7 +390,7 @@ export function prependOlderHistory(items, meta) {
387
390
  setPrependAnchor(null);
388
391
 
389
392
  // Restore saved state
390
- store.set({ currentMsgEl: savedMsgEl, currentFullText: savedFullText });
393
+ store.set({ currentMsgEl: savedMsgEl, currentFullText: savedFullText, replayingHistory: savedReplayingHistory });
391
394
  setActivityEl(savedActivity);
392
395
  setTurnCounter(savedTurnCounter);
393
396
  restoreToolState(savedToolsState);
@@ -3,7 +3,8 @@
3
3
  import { showProjectsHub, hideProjectsHub } from './projects-hub.js';
4
4
  import { store } from './store.js';
5
5
  import { getWs } from './ws-ref.js';
6
- import { getCachedProjects, openAddProjectModal, switchProject } from './app-projects.js';
6
+ import { getCachedProjects, switchProject } from './app-projects.js';
7
+ import { openAddProjectModal } from './project-start-dialog.js';
7
8
  import { chooseProjectActivationTarget, homeProjectCreationState } from './project-activation.js';
8
9
  import { mateAvatarUrl } from './avatar.js';
9
10
  import { exitDmMode } from './app-dm.js';
@@ -657,6 +657,8 @@ function renderPreviewModelTab(bodyEl) {
657
657
  }
658
658
 
659
659
  var opts = {
660
+ effortLevels: ((store.get("vendorInfo") || {})[store.get("currentVendor")] || {}).effortLevels || [],
661
+ configuration: ((store.get("vendorInfo") || {})[store.get("currentVendor")] || {}).configuration || {},
660
662
  models: s.currentModels || [],
661
663
  currentModel: _previewLoopSettings.model || "",
662
664
  currentMode: _previewLoopSettings.permissionMode || "default",
@@ -1,3 +1,5 @@
1
+ import { handleContextualConversations } from './contextual-mate-sessions.js';
2
+ import { handleMateContextMessage } from './contextual-mate-context.js';
1
3
  import { handleIssueReference } from './clay-issue-links.js';
2
4
  // Narrow pre-router for Home and Capsule protocol responses kept out of the legacy router.
3
5
 
@@ -15,10 +17,14 @@ import { handleDefaultAiMessage } from './default-ai.js';
15
17
  import { handleCursorSharingMessage } from './cursor-sharing-preference.js';
16
18
  import { handlePendingMessageQueueMessage } from './pending-message-queue.js';
17
19
  import { receiveHistoryReplay } from './history-replay-batch.js';
20
+ import { filterPaneActivation } from './pane-activation.js';
21
+ import { deferSessionSwitch } from './session-switch-defer.js';
18
22
  import { handleProjectMateCreationMessage } from './project-mate-creation-workspace.js';
19
23
  import { handleProjectDebatePlanningMessage } from './project-debate-planning-workspace.js';
20
24
 
21
25
  export function handleHomeProtocolMessage(msg) {
26
+ if (handleContextualConversations(msg)) return true;
27
+ if (handleMateContextMessage(msg)) return true;
22
28
  if (handleIssueReference(msg)) return true;
23
29
  if (handleClaySessionTarget(msg)) return true;
24
30
  if (isHomeWorkspaceAssignmentMessage(msg)) {
@@ -58,6 +64,10 @@ export function handleHomeProtocolMessage(msg) {
58
64
  handleHomeDebateTranscript(msg);
59
65
  return true;
60
66
  }
67
+ if (msg.type === "home_mcp_import_question" || msg.type === "home_mcp_import_question_resolved" || msg.type === "home_mate_question" || msg.type === "home_mate_question_resolved") {
68
+ if (!handleSearchClayMessage(msg)) handleHomeDebateTranscript(msg);
69
+ return true;
70
+ }
61
71
  if (msg.type === "home_debate_question" || msg.type === "home_debate_question_resolved" || msg.type === "home_debate_event") {
62
72
  handleHomeDebateTranscript(msg);
63
73
  return true;
@@ -86,6 +96,17 @@ export function handleHomeProtocolMessage(msg) {
86
96
  }
87
97
 
88
98
  export function processMessage(msg) {
99
+ if (filterPaneActivation(msg)) return;
100
+ if (deferSessionSwitch(msg)) return;
101
+ if (msg.type === 'pane_history_batch') {
102
+ if (!msg.paneActivation || !Array.isArray(msg.items) || msg.items.length > 100) return;
103
+ msg.items.forEach(function (item) {
104
+ // Every original event keeps its order/index and goes through the same
105
+ // stale-binding filter and replay handler as an individual socket event.
106
+ if (item && item.type !== 'pane_history_batch') processMessage(Object.assign({}, item, { paneActivation: msg.paneActivation }));
107
+ });
108
+ return;
109
+ }
89
110
  receiveHistoryReplay(msg, dispatchMessage);
90
111
  }
91
112
 
@@ -100,7 +121,7 @@ function dispatchMessage(msg) {
100
121
  if (handleDefaultAiMessage(msg)) return;
101
122
  if (handleCursorSharingMessage(msg)) return;
102
123
  var searchHandled = handleSearchClayMessage(msg);
103
- if (searchHandled && (msg.type === "home_clay_activity" || msg.type === "home_mate_stopping" || msg.type.indexOf("home_mate_permission_") === 0)) return;
124
+ if (searchHandled) return;
104
125
  if (handleHomeProtocolMessage(msg)) return;
105
126
  processAppMessage(msg);
106
127
  }
@@ -1,3 +1,12 @@
1
+ import { handleStudioDocumentMessage } from './clay-studio-document.js';
2
+ import { saveSessionRichDraft, restoreSessionRichDraft } from './session-rich-drafts.js';
3
+ import { refreshPaneActivation, primePaneSession } from './pane-activation.js';
4
+ import { paneCallbackCurrent } from './pane-binding.js';
5
+ import { handleClayControlActivity } from './clay-control-activity.js';
6
+ import { handleContextualWorkspaceMessage } from './contextual-clay-workspace.js';
7
+ import { handleContextualSessionMessage } from './contextual-clay-session.js';
8
+ import { handleOwnerNavigation } from './clay-owner-navigation.js';
9
+ import { leaveRevokedProject } from './project-access-recovery.js';
1
10
  import { handlePersonalSettingsMessage } from './user-settings-preferences.js';
2
11
  import { handleServerUpdate } from './server-settings-controls.js';
3
12
  import { handleYouMessage } from './you.js';
@@ -8,7 +17,8 @@ import { refreshProjectAssistantIdentities } from './project-chat-identity.js';
8
17
  import { handleLinearResult } from './linear-panel.js';
9
18
  import { handleSharedBrowserMessage } from './shared-browser.js';
10
19
  import { openWireframe } from './wireframe-workbench.js';
11
- import { syncGithubSessions } from './session-github.js';
20
+ import { handlePrimaryWorkResult } from './session-work-primary.js';
21
+ import { syncGithubSessions, applyGithubPersonalReviewStatus } from './session-github.js';
12
22
  import { handleIssuesMessageInContext as handleIssuesMessage } from './issues-context.js';
13
23
  // app-messages.js - WebSocket message router
14
24
  // Extracted from app.js (PR-23)
@@ -40,7 +50,7 @@ import { handleHomeMateMemoryState, handleHomeMateKnowledgeState, syncHomeMateSe
40
50
  import { renderKnowledgeList, handleKnowledgeContent, handleKnowledgeMutation } from './mate-knowledge.js';
41
51
  import { handleKnowledgeWorkbenchMessage } from './mate-knowledge-workbench.js';
42
52
  import { renderMemoryList } from './mate-memory.js';
43
- import { handlePaletteSessionSwitch, setPaletteVersion } from './command-palette.js';
53
+ import { handlePaletteSessionSwitch, handlePaletteHistoryDone, handlePaletteHistoryPrepended, setPaletteVersion } from './command-palette.js';
44
54
  import { handleFindInSessionResults } from './session-search.js';
45
55
  import { syncPaneTitles, maybeRestoreSplitGroup, openGroup } from './split-view.js';
46
56
  import { showPairDialog, handlePairCreated, handleSplitDelegation, showWorkerDelegationNotice, hideWorkerDelegationNotice } from './split-pair-ui.js';
@@ -55,17 +65,17 @@ import { showDoneNotification, playDoneSound, isNotifAlertEnabled, isNotifSoundE
55
65
  import { handleFsList, handleFsRead, handleFileChanged, handleDirChanged, handleFileHistory, handleGitDiff, handleFileAt, refreshIfOpen, getPendingNavigate, handleFsSearch, presentMarkdownEdit } from './filebrowser.js';
56
66
  import { beginMarkdownTurn, finishMarkdownTurn, markdownPathFromToolInput } from './markdown-live-edit.js';
57
67
  import { forwardPaneMarkdownPresentation } from './pane-bridge.js';
58
- import { handleProjectOwnerChanged } from './project-settings.js';
68
+ import { handleProjectOwnerChanged, handleProjectSettingsEditResult } from './project-settings.js';
59
69
  import { handleProjectEnv, handleProjectEnvSaved } from './project-settings-environment.js';
60
70
  import { handleProjectSessionVisibilityDefault, refreshProjectSessionVisibilitySettings } from './project-session-visibility-settings.js';
61
71
  import { updateSettingsStats, updateDaemonConfig, handleSetPinResult, handleKeepAwakeChanged, handleAutoContinueChanged, handleRestartResult, handleShutdownResult, handleSharedEnv, handleSharedEnvSaved, handleServerSettingResult } from './server-settings.js';
62
- import { handleTermList, handleTermCreated, sendTerminalCommand, handleTermOutput, handleTermResized, handleTermExited, handleTermClosed } from './terminal.js';
72
+ import { handleTerminalProjection, handleTermList, handleTermCreated, sendTerminalCommand, handleTermOutput, handleTermResized, handleTermExited, handleTermClosed } from './terminal.js';
63
73
  import { attachTuiView, detachTuiView, setTuiSuspendedView, tuiHandleTermOutput, tuiHandleTermResized, tuiHandleTermExited, tuiHandleTermClosed } from './session-tui-view.js';
64
74
  import { handleTuiTranscriptState } from './tui-grab.js';
65
75
  import { tuiModalHandleTermOutput, tuiModalHandleTermResized, tuiModalHandleTermExited, tuiModalHandleTermClosed } from './tui-attention.js';
66
76
  import { updateTerminalList, handleContextSourcesState, updateEmailAccountList, updateEmailUnreadCounts, handleEmailTestResult, handleEmailAddResult, handleEmailRemoveResult } from './context-sources.js';
67
77
  import { refreshEmailSettings } from './user-settings.js';
68
- import { handleNotesList, handleNoteCreated, handleNoteUpdated, handleNoteDeleted, handleNoteWritten } from './sticky-notes.js';
78
+ import { handleNotesList, handleNoteCreated, handleNoteUpdated, handleNoteUpdateResult, handleNoteDeleted, handleNoteWritten } from './sticky-notes.js';
69
79
  import { handleNoteDeleteResult } from './sticky-notes-browser.js';
70
80
  import { handleProjectLogsState, handleProjectLogEntry, handleProjectLogCommented, handleProjectLogCommentReviewed, handleProjectLogDeleted, handleProjectLogUpdated, handleProjectLogsError, handleScheduledTaskResultsState, handleScheduledTaskResultCreated, handleScheduledTaskResultSession } from './project-logs.js';
71
81
  import { handleSkillInstalled, handleSkillUninstalled } from './skills.js';
@@ -90,13 +100,15 @@ import { markProjectSessionListHydrated, applyProjectSplitGroups, clearProjectSp
90
100
  import { selectDefaultVendorForBlankSession } from './vendor-selection.js';
91
101
  import { getModelInfoUpdate, modelEntryValue, modelEntryMatches, handleModelSelectionResult, requestVendorModels } from './model-picker.js';
92
102
  import { getModelEffortLevels, accumulateUsage, updateUsagePanel, accumulateContext, updateContextPanel, renderCtxPopover, updateStatusPanel, markContextUnavailable } from './app-panels.js';
93
- import { updateProjectList, resetClientState, showUpdateAvailable, handleRemoveProjectCheckResult, handleRemoveProjectResult, handleBrowseDirResult, handleAddProjectResult, handleCloneProgress, finishProjectSessionActivation } from './app-projects.js';
103
+ import { updateProjectList, resetClientState, showUpdateAvailable, handleRemoveProjectCheckResult, handleRemoveProjectResult, finishProjectSessionActivation } from './app-projects.js';
104
+ import { handleBrowseDirResult, handleAddProjectResult, handleCloneProgress } from './project-start-dialog.js';
94
105
  import { updateHistorySentinel, prependOlderHistory } from './app-header.js';
95
106
  import { handleToolsState, handleToolInstalled, handleToolRemoved, handleToolStorageResult, handleToolLlmResult, handleToolsError, handleToolControlRequest, handleToolServerState, handleToolServerEvent, handleCapsuleGameSession } from './home-tools.js';
96
107
  import { handleHomeDockState } from './home-dock.js';
97
108
  import { handleToolFrameUrlState } from './home-tool-frame.js';
98
109
  import { enterDmMode, exitDmMode, handleMateCreatedInApp, updateMateIconStatus, appendDmMessage, showDmTypingIndicator, buildMateInterviewPrompt } from './app-dm.js';
99
110
  import { handleRateLimitEvent, updateRateLimitUsage, handleFastModeState } from './app-rate-limit.js';
111
+ import { handleVendorUsageOverview } from './vendor-usage-overview.js';
100
112
  import { handleRemoteCursorMove, handleRemoteCursorLeave, handleRemoteSelection, clearRemoteCursors } from './app-cursors.js';
101
113
  import { showLoopBanner, updateLoopBanner, updateLoopInputVisibility, showRalphApprovalBar, updateRalphApprovalStatus, openRalphPreviewModal, showExecModal, updateExecModalStatus } from './app-loop-ui.js';
102
114
  import { handleAutonomousRunMessage, syncAutonomousRunForSession } from './autonomous-run.js';
@@ -118,6 +130,9 @@ var connectOverlay = document.getElementById("connect-overlay");
118
130
  initMessageDeliveryUi();
119
131
 
120
132
  export function processMessage(msg) {
133
+ if (handleStudioDocumentMessage(msg)) return;
134
+ if (handleClayControlActivity(msg)) return;
135
+ if (handleOwnerNavigation(msg)) return;
121
136
  if (["update_available", "up_to_date", "update_started", "update_check_failed"].indexOf(msg.type) !== -1) handleServerUpdate(msg);
122
137
  if (/^(set_pin|set_keep_awake|set_inherit_groups|set_image_retention|set_update_channel|restart_server|shutdown_server)_result$/.test(msg.type)) handleServerSettingResult(msg);
123
138
  if (handleProjectDebateMessage(msg)) return;
@@ -145,7 +160,7 @@ export function processMessage(msg) {
145
160
  return;
146
161
  }
147
162
  if (msg.type === "access_revoked") {
148
- window.location.assign("/");
163
+ leaveRevokedProject("/");
149
164
  return;
150
165
  }
151
166
  // Preserve original timestamp from history replay
@@ -204,7 +219,7 @@ export function processMessage(msg) {
204
219
  if (readyMatch) {
205
220
  var newName = readyMatch[1].trim();
206
221
  store.get('dmTargetUser').displayName = newName;
207
- updateMateSidebarProfile({ profile: { displayName: newName, avatarColor: store.get('dmTargetUser').avatarColor, avatarStyle: store.get('dmTargetUser').avatarStyle, avatarSeed: store.get('dmTargetUser').avatarSeed } });
222
+ updateMateSidebarProfile({ profile: { displayName: newName, avatarCatalogId: store.get('dmTargetUser').avatarCatalogId, avatarColor: store.get('dmTargetUser').avatarColor, avatarStyle: store.get('dmTargetUser').avatarStyle, avatarSeed: store.get('dmTargetUser').avatarSeed } });
208
223
  if (getWs() && getWs().readyState === 1) {
209
224
  getWs().send(JSON.stringify({
210
225
  type: "mate_update",
@@ -224,6 +239,10 @@ export function processMessage(msg) {
224
239
  }
225
240
  }
226
241
 
242
+ store.set({ currentHistoryIndex: Number.isSafeInteger(msg._historyIndex) && msg._historyIndex >= 0 ? msg._historyIndex : null,
243
+ currentHistoryIndexes: Array.isArray(msg._historyIndexes) ? msg._historyIndexes : null });
244
+ if (handleContextualSessionMessage(msg)) return;
245
+ handleContextualWorkspaceMessage(msg);
227
246
  switch (msg.type) {
228
247
  case "message_ack":
229
248
  var acknowledgedEntry = acknowledgeMessage(msg.clientMessageId);
@@ -250,9 +269,12 @@ export function processMessage(msg) {
250
269
 
251
270
  case "history_prepend":
252
271
  prependOlderHistory(msg.items, msg.meta);
272
+ handlePaletteHistoryPrepended();
253
273
  break;
254
274
 
255
275
  case "history_done":
276
+ var historyPaintEpoch = store.get('sessionActionEpoch') || 0;
277
+ if (messagesEl && msg.sessionId === store.get("activeSessionId") && msg.sessionOriginId === store.get("sessionOriginId")) { messagesEl.dataset.controlSessionId = String(msg.sessionId); messagesEl.dataset.controlSessionOrigin = msg.sessionOriginId; messagesEl.dataset.controlHistoryRevision = msg.controlHistoryRevision || ""; }
256
278
  store.set({ replayingHistory: false });
257
279
  resumeThinkingAfterReplay(store.get('sessionIsProcessing'));
258
280
  // Batched syntax highlight + mermaid pass for the entire replayed
@@ -275,7 +297,7 @@ export function processMessage(msg) {
275
297
 
276
298
  // Restore accurate context data from the last result in full history
277
299
  if (msg.lastUsage || msg.lastModelUsage) {
278
- accumulateContext(msg.lastCost, msg.lastUsage, msg.lastModelUsage, msg.lastStreamInputTokens);
300
+ accumulateContext(msg.lastCost, msg.lastUsage, msg.lastModelUsage, msg.lastStreamInputTokens, msg.context);
279
301
  }
280
302
  updateContextPanel();
281
303
  updateUsagePanel();
@@ -283,6 +305,7 @@ export function processMessage(msg) {
283
305
  // the restored turn instead of starting a second answer bubble.
284
306
  if (store.get('sessionIsProcessing')) {
285
307
  flushStreamBuffer();
308
+ if (store.get('turnActivity')) setActivity(store.get('turnActivity').phase);
286
309
  } else {
287
310
  markAllToolsDone();
288
311
  finalizeAssistantBlock();
@@ -311,11 +334,16 @@ export function processMessage(msg) {
311
334
  // re-pins on every height change while armed. Disarms early on
312
335
  // any real user scroll input.
313
336
  // Skip arming when we have a pending in-conversation navigate
314
- // target (file-edit deeplink) — the navigate block below scrolls
315
- // that element into view, and sticky-bottom would fight it.
337
+ // target (file-edit or Session-entry deeplink) — the navigate block
338
+ // below scrolls that element into view, and sticky-bottom would
339
+ // fight it.
316
340
  var nav = getPendingNavigate();
317
341
  var hasNavTarget = nav && (nav.toolId || nav.assistantUuid);
318
- if (hasNavTarget) {
342
+ var sessionEntryNav = store.get('pendingSessionEntryNavigation');
343
+ var hasSessionEntryNav = sessionEntryNav
344
+ && String(sessionEntryNav.projectSlug) === String(store.get('currentSlug'))
345
+ && String(sessionEntryNav.sessionId) === String(store.get('activeSessionId'));
346
+ if (hasNavTarget || hasSessionEntryNav) {
319
347
  // Navigate block below will scrollIntoView on the target — don't
320
348
  // arm sticky-bottom or it would fight that scroll.
321
349
  scrollToBottom();
@@ -328,6 +356,7 @@ export function processMessage(msg) {
328
356
  // Scroll to tool element if navigating from file edit history
329
357
  if (hasNavTarget) {
330
358
  requestAnimationFrame(function() {
359
+ if (historyPaintEpoch !== (store.get('sessionActionEpoch') || 0) || !paneCallbackCurrent(msg.paneActivation)) return;
331
360
  // Prefer scrolling to the exact tool element
332
361
  var target = nav.toolId ? messagesEl.querySelector('[data-tool-id="' + nav.toolId + '"]') : null;
333
362
  if (!target && nav.assistantUuid) {
@@ -343,6 +372,7 @@ export function processMessage(msg) {
343
372
  }
344
373
  });
345
374
  }
375
+ requestAnimationFrame(function () { if (historyPaintEpoch === (store.get('sessionActionEpoch') || 0) && paneCallbackCurrent(msg.paneActivation)) handlePaletteHistoryDone(); });
346
376
  break;
347
377
 
348
378
  case "restore_mate_dm":
@@ -363,6 +393,7 @@ export function processMessage(msg) {
363
393
  break;
364
394
 
365
395
  case "info":
396
+ store.set({ controlRuntimeId: msg.controlRuntimeId || null });
366
397
  if (msg.text && !msg.project && !msg.cwd) {
367
398
  addSystemMessage(msg.text, false);
368
399
  break;
@@ -753,9 +784,11 @@ export function processMessage(msg) {
753
784
  markProjectSessionListHydrated();
754
785
  renderMateSessionList(msg.sessions || []);
755
786
  renderSessionList(msg.sessions || []);
787
+ store.set({ paneBindingSessions: msg.sessions || [] });
788
+ refreshPaneActivation();
756
789
  syncGithubSessions(msg.sessions || []);
757
790
  syncPaneTitles();
758
- var panePin = resolvePaneSession(store.get('paneMode'), store.get('panePinPending'), store.get('paneSessionId'), msg.sessions);
791
+ var panePin = resolvePaneSession(store.get('paneMode') && !primePaneSession(), store.get('panePinPending'), store.get('paneSessionId'), msg.sessions);
759
792
  if (panePin.consumed) {
760
793
  store.set({ panePinPending: false });
761
794
  if (panePin.sessionId && getWs() && getWs().readyState === 1) {
@@ -765,6 +798,9 @@ export function processMessage(msg) {
765
798
  handlePaletteSessionSwitch();
766
799
  maybeRestoreSplitGroup();
767
800
  break;
801
+ case "session_github_status":
802
+ applyGithubPersonalReviewStatus(msg);
803
+ break;
768
804
 
769
805
  case "split_groups":
770
806
  applyProjectSplitGroups(msg.groups || []);
@@ -850,6 +886,9 @@ export function processMessage(msg) {
850
886
  handleRemoteSelection(msg);
851
887
  break;
852
888
 
889
+ case "session_work_primary_result":
890
+ handlePrimaryWorkResult(msg);
891
+ break;
853
892
  case "linear_result":
854
893
  handleLinearResult(msg);
855
894
  break;
@@ -876,6 +915,8 @@ export function processMessage(msg) {
876
915
  break;
877
916
 
878
917
  case "session_switched":
918
+ saveSessionRichDraft();
919
+ store.set({ sessionActionEpoch: (store.get('sessionActionEpoch') || 0) + 1 });
879
920
  clearPairResultStatus();
880
921
  resetStreamBuffer();
881
922
  syncAutonomousRunForSession(msg.autonomousRun || null);
@@ -893,7 +934,7 @@ export function processMessage(msg) {
893
934
  ? msg.runtimeTerminalId
894
935
  : (typeof msg.terminalId === "number" ? msg.terminalId : null);
895
936
  var _sessionRole = msg.sessionRole === "worker" ? "worker" : "driver";
896
- store.set({ activeSessionId: msg.id, sessionOriginId: msg.sessionOriginId || null, cliSessionId: msg.cliSessionId || null, currentModel: msg.model || "", currentEffort: msg.effort || store.get('currentEffort'), vendorCapabilities: msg.capabilities || {}, sessionIsProcessing: !!msg.isProcessing, activeSessionMode: _effectiveMode, activeTerminalId: _effectiveTerminalId, sessionHasHistory: !!msg.hasHistory, sessionVendorBound: !!msg.vendor || !!msg.hasHistory, sessionFullAccess: msg.permissionMode === "bypassPermissions", currentMode: msg.permissionMode || store.get('currentMode'), effectivePermissionMode: msg.effectivePermissionMode || null, permissionCapabilities: msg.permissionCapabilities || { auto: false, mcpOverride: false }, mcpPermissionModeOverrides: msg.mcpPermissionModeOverrides || {}, activeSessionMateId: _sessionRole === "worker" ? null : (store.get('activeProjectMateId') || null), activeSessionMateName: _sessionRole === "worker" ? "" : (store.get('activeProjectMateName') || "") });
937
+ store.set({ activeSessionId: msg.id, sessionOriginId: msg.sessionOriginId || null, cliSessionId: msg.cliSessionId || null, currentModel: msg.model || "", currentEffort: msg.effort || '', vendorCapabilities: msg.capabilities || {}, sessionIsProcessing: !!msg.isProcessing, turnActivity: null, activeSessionMode: _effectiveMode, activeTerminalId: _effectiveTerminalId, sessionHasHistory: !!msg.hasHistory, sessionVendorBound: !!msg.vendor || !!msg.hasHistory, sessionFullAccess: msg.permissionMode === "bypassPermissions", currentMode: msg.permissionMode || 'default', effectivePermissionMode: msg.effectivePermissionMode || null, permissionCapabilities: msg.permissionCapabilities || { auto: false, mcpOverride: false }, mcpPermissionModeOverrides: msg.mcpPermissionModeOverrides || {}, activeSessionMateId: _sessionRole === "worker" ? null : (store.get('activeProjectMateId') || null), activeSessionMateName: _sessionRole === "worker" ? "" : (store.get('activeProjectMateName') || "") });
897
938
  handleScheduledTaskSessionSwitched(msg);
898
939
  requestLoopInterviewState();
899
940
  activateDeliverySession(msg.id, msg.cliSessionId || null, msg.sessionOriginId || null);
@@ -968,14 +1009,19 @@ export function processMessage(msg) {
968
1009
  // Restore draft for incoming session
969
1010
  var draft = store.get('sessionDrafts')[store.get('activeSessionId')] || "";
970
1011
  inputEl.value = draft;
1012
+ restoreSessionRichDraft();
971
1013
  autoResize();
972
1014
  if (!("ontouchstart" in window)) {
973
1015
  inputEl.focus();
974
1016
  }
975
1017
  // Reload survival: a restored active session that is a split-group
976
1018
  // member reopens its group (no-op when a split is already open).
977
- finishProjectSessionActivation();
978
- maybeRestoreSplitGroup();
1019
+ var deferredSwitch = store.get('deferredSessionSwitch');
1020
+ if (!deferredSwitch || !deferredSwitch.draining || deferredSwitch.finalSwitch === msg) {
1021
+ finishProjectSessionActivation();
1022
+ maybeRestoreSplitGroup();
1023
+ handlePaletteSessionSwitch(true);
1024
+ }
979
1025
  break;
980
1026
 
981
1027
  case "session_full_access_changed":
@@ -1020,7 +1066,11 @@ export function processMessage(msg) {
1020
1066
  // running session, where history_done keeps current tools active.
1021
1067
  // Question answers, plan feedback and Driver delegations are injected
1022
1068
  // mid-turn, so tools before them may still be running.
1023
- else if (!msg.askUserAnswer && !msg.planFeedback && !msg.delegated) markAllToolsDone();
1069
+ else if (!msg.askUserAnswer && !msg.planFeedback && !msg.delegated) {
1070
+ markAllToolsDone();
1071
+ // Older histories predate explicit foreground presentation boundaries.
1072
+ finalizeAssistantBlock();
1073
+ }
1024
1074
  resetThinkingGroup();
1025
1075
  if (msg.planContent) {
1026
1076
  setPlanContent(msg.planContent);
@@ -1117,7 +1167,7 @@ export function processMessage(msg) {
1117
1167
  // events make it through.
1118
1168
  removeMatePreThinking();
1119
1169
  if (!(store.get('dmMode') && store.get('dmTargetUser') && store.get('dmTargetUser').isMate) && !store.get('matePreThinkingEl')) {
1120
- setActivity("thinking");
1170
+ setActivity((store.get("turnActivity") || {}).phase || "thinking");
1121
1171
  }
1122
1172
  }
1123
1173
  break;
@@ -1153,8 +1203,24 @@ export function processMessage(msg) {
1153
1203
  }
1154
1204
  break;
1155
1205
 
1206
+ case "turn_activity":
1207
+ if (["waiting", "running", "background"].indexOf(msg.phase) === -1) break;
1208
+ store.set({ turnActivity: { phase: msg.phase, turnId: msg.turnId || null, disposition: msg.disposition || null } });
1209
+ if (!store.get('replayingHistory') && store.get('sessionIsProcessing')) {
1210
+ removeMatePreThinking();
1211
+ setActivity(msg.phase);
1212
+ }
1213
+ break;
1214
+
1215
+ case "assistant_boundary":
1216
+ // Foreground presentation ended; background work still owns its real
1217
+ // terminal. Flush pending animation text without finishing tools/Stop.
1218
+ finalizeAssistantBlock();
1219
+ break;
1220
+
1156
1221
  case "delta":
1157
1222
  if (typeof msg.text !== "string") break;
1223
+ store.set({ turnActivity: null });
1158
1224
  removeMatePreThinking();
1159
1225
  stopThinking();
1160
1226
  setActivity(null);
@@ -1202,6 +1268,8 @@ export function processMessage(msg) {
1202
1268
  renderMcpDebateProposal(msg.id, msg.input);
1203
1269
  startUrgentBlink();
1204
1270
  } else if (msg.name === "AskUserQuestion" && msg.input && msg.input.questions) {
1271
+ store.set({ turnActivity: null });
1272
+ setActivity(null);
1205
1273
  var askTool = getTools()[msg.id];
1206
1274
  if (askTool) {
1207
1275
  if (askTool.el) askTool.el.style.display = "none";
@@ -1266,12 +1334,23 @@ export function processMessage(msg) {
1266
1334
  renderGeneratedImage(msg);
1267
1335
  break;
1268
1336
 
1337
+ case 'mate_schedule_question_expired':
1338
+ markAskUserAnswered(msg.toolId, { 0: msg.error || 'This schedule review expired.' });
1339
+ stopUrgentBlink();
1340
+ break;
1341
+
1342
+ case 'mcp_import_consent_expired':
1343
+ markAskUserAnswered(msg.toolId, { 0: msg.error || 'No import was approved.' });
1344
+ stopUrgentBlink();
1345
+ break;
1346
+
1269
1347
  case "ask_user_answered":
1270
1348
  markAskUserAnswered(msg.toolId, msg.answers);
1271
1349
  stopUrgentBlink();
1272
1350
  break;
1273
1351
 
1274
1352
  case "permission_request":
1353
+ store.set({ turnActivity: null });
1275
1354
  setActivity(null);
1276
1355
  renderPermissionRequest(msg.requestId, msg.toolName, msg.toolInput, msg.decisionReason, msg.mateId, msg.vendor, msg);
1277
1356
  startUrgentBlink();
@@ -1287,13 +1366,21 @@ export function processMessage(msg) {
1287
1366
  stopUrgentBlink();
1288
1367
  break;
1289
1368
 
1369
+ case "ask_user_pending":
1370
+ renderAskUserQuestion(msg.toolId, msg.input);
1371
+ startUrgentBlink();
1372
+ break;
1373
+
1290
1374
  case "permission_request_pending":
1375
+ store.set({ turnActivity: null });
1291
1376
  setActivity(null);
1292
1377
  renderPermissionRequest(msg.requestId, msg.toolName, msg.toolInput, msg.decisionReason, msg.mateId, msg.vendor, msg);
1293
1378
  startUrgentBlink();
1294
1379
  break;
1295
1380
 
1296
1381
  case "elicitation_request":
1382
+ store.set({ turnActivity: null });
1383
+ setActivity(null);
1297
1384
  renderElicitationRequest(msg);
1298
1385
  startUrgentBlink();
1299
1386
  break;
@@ -1308,6 +1395,8 @@ export function processMessage(msg) {
1308
1395
  break;
1309
1396
 
1310
1397
  case "user_dialog_request":
1398
+ store.set({ turnActivity: null });
1399
+ setActivity(null);
1311
1400
  renderUserDialogRequest(msg);
1312
1401
  startUrgentBlink();
1313
1402
  break;
@@ -1373,7 +1462,7 @@ export function processMessage(msg) {
1373
1462
  finalizeAssistantBlock();
1374
1463
  addTurnMeta(msg.cost, msg.duration);
1375
1464
  accumulateUsage(msg.cost, msg.usage);
1376
- accumulateContext(msg.cost, msg.usage, msg.modelUsage, msg.lastStreamInputTokens);
1465
+ accumulateContext(msg.cost, msg.usage, msg.modelUsage, msg.lastStreamInputTokens, msg.context);
1377
1466
  break;
1378
1467
 
1379
1468
  case "context_usage":
@@ -1386,6 +1475,7 @@ export function processMessage(msg) {
1386
1475
  break;
1387
1476
 
1388
1477
  case "done":
1478
+ store.set({ turnActivity: null });
1389
1479
  removeMatePreThinking();
1390
1480
  setActivity(null);
1391
1481
  finishThinkingTurn();
@@ -1409,6 +1499,7 @@ export function processMessage(msg) {
1409
1499
  break;
1410
1500
 
1411
1501
  case "error":
1502
+ store.set({ turnActivity: null });
1412
1503
  removeMatePreThinking();
1413
1504
  setActivity(null);
1414
1505
  finishThinkingTurn();
@@ -1526,6 +1617,10 @@ export function processMessage(msg) {
1526
1617
  updateRateLimitUsage(msg);
1527
1618
  break;
1528
1619
 
1620
+ case "vendor_usage_overview":
1621
+ handleVendorUsageOverview(msg);
1622
+ break;
1623
+
1529
1624
  case "auto_continue_scheduled":
1530
1625
  // Scheduler auto-continue, just show info
1531
1626
  break;
@@ -1633,6 +1728,9 @@ export function processMessage(msg) {
1633
1728
  handleFileAt(msg);
1634
1729
  break;
1635
1730
 
1731
+ case "term_control_projection":
1732
+ handleTerminalProjection(msg);
1733
+ break;
1636
1734
  case "term_list":
1637
1735
  handleTermList(msg);
1638
1736
  updateTerminalList(msg.terminals);
@@ -1697,6 +1795,7 @@ export function processMessage(msg) {
1697
1795
  store.set({ pendingTermCommand: null });
1698
1796
  // Small delay to let terminal initialize
1699
1797
  setTimeout(function() {
1798
+ if (!paneCallbackCurrent(msg.paneActivation)) return;
1700
1799
  sendTerminalCommand(cmd);
1701
1800
  }, 300);
1702
1801
  }
@@ -1737,6 +1836,10 @@ export function processMessage(msg) {
1737
1836
  handleNoteUpdated(msg);
1738
1837
  break;
1739
1838
 
1839
+ case "note_update_result":
1840
+ handleNoteUpdateResult(msg);
1841
+ break;
1842
+
1740
1843
  case "note_written":
1741
1844
  showToast((msg.byTitle || "Agent") + ' left a note: "' + (msg.preview || "") + '"');
1742
1845
  handleNoteWritten(msg);
@@ -1825,12 +1928,14 @@ export function processMessage(msg) {
1825
1928
  break;
1826
1929
 
1827
1930
  case "set_project_title_result":
1931
+ handleProjectSettingsEditResult(msg);
1828
1932
  if (!msg.ok) {
1829
1933
  showToast(msg.error || "Failed to rename project", "error");
1830
1934
  }
1831
1935
  break;
1832
1936
 
1833
1937
  case "set_project_icon_result":
1938
+ handleProjectSettingsEditResult(msg);
1834
1939
  if (!msg.ok) {
1835
1940
  showToast(msg.error || "Failed to set icon", "error");
1836
1941
  }
@@ -1951,6 +2056,7 @@ export function processMessage(msg) {
1951
2056
  // Sync dmTargetUser so subsequent renders use fresh data
1952
2057
  var mp2 = msg.mate.profile || {};
1953
2058
  store.get('dmTargetUser').displayName = mp2.displayName || msg.mate.name || store.get('dmTargetUser').displayName;
2059
+ store.get('dmTargetUser').avatarCatalogId = mp2.avatarCatalogId || '';
1954
2060
  store.get('dmTargetUser').avatarStyle = mp2.avatarStyle || store.get('dmTargetUser').avatarStyle;
1955
2061
  store.get('dmTargetUser').avatarSeed = mp2.avatarSeed || store.get('dmTargetUser').avatarSeed;
1956
2062
  store.get('dmTargetUser').avatarColor = mp2.avatarColor || store.get('dmTargetUser').avatarColor;
@@ -3,6 +3,8 @@
3
3
 
4
4
  import { refreshIcons, iconHtml } from './icons.js';
5
5
  import { getWs } from './ws-ref.js';
6
+ import { store } from './store.js';
7
+ import { sessionCallback } from './pane-binding.js';
6
8
  import { updateBrowserTabList } from './context-sources.js';
7
9
  import { setExtensionConnected } from './mcp-ui.js';
8
10
  import { initPasteModal } from './paste-modal.js';
@@ -270,7 +272,7 @@ export function showConfirm(text, onConfirm, okLabel, destructive, onCancel) {
270
272
  confirmCancelCallback = null;
271
273
  if (replaced) replaced();
272
274
  confirmText.textContent = text;
273
- confirmCallback = onConfirm;
275
+ confirmCallback = store.get('paneCommittedBinding') ? sessionCallback(onConfirm) : onConfirm;
274
276
  confirmCancelCallback = onCancel || null;
275
277
  confirmOk.textContent = okLabel || "Delete";
276
278
  confirmOk.className = "confirm-btn " + (destructive === false ? "confirm-ok" : "confirm-delete");