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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (552) hide show
  1. package/lib/account-auth-socket.js +1 -0
  2. package/lib/builtin-mates.js +19 -16
  3. package/lib/bundled-skills/clay-agent-browser/SKILL.md +6 -2
  4. package/lib/canonical-clay-record-authority.js +15 -0
  5. package/lib/canonical-clay-scheduling-authority.js +19 -0
  6. package/lib/claude-hook-installer.js +1 -239
  7. package/lib/claude-jsonl-watcher.js +1 -204
  8. package/lib/clay-control-presentation-binding.js +96 -0
  9. package/lib/clay-control-presentation.js +128 -0
  10. package/lib/clay-control-target-projection.js +26 -0
  11. package/lib/clay-mate-chat-receipts.js +26 -0
  12. package/lib/clay-mate-chat.js +88 -0
  13. package/lib/clay-mate-knowledge-input.js +26 -0
  14. package/lib/clay-mate-knowledge.js +95 -0
  15. package/lib/clay-mate-lifecycle.js +95 -0
  16. package/lib/clay-product-control-input.js +33 -0
  17. package/lib/clay-product-control-tools.js +51 -0
  18. package/lib/clay-product-control.js +247 -0
  19. package/lib/clay-project-lifecycle.js +154 -0
  20. package/lib/clay-project-record-input.js +44 -0
  21. package/lib/clay-project-records.js +84 -0
  22. package/lib/clay-scheduling-input.js +21 -0
  23. package/lib/clay-scheduling-receipts.js +26 -0
  24. package/lib/clay-scheduling.js +119 -0
  25. package/lib/clay-screen-controls.js +104 -0
  26. package/lib/clay-skill-install.js +1 -33
  27. package/lib/clay-workspace-controls.js +84 -0
  28. package/lib/clay-workspace-input.js +17 -0
  29. package/lib/clay-workspace-receipts.js +26 -0
  30. package/lib/cli-sessions.js +1 -300
  31. package/lib/codex-defaults.js +1 -28
  32. package/lib/context-usage.js +3 -2
  33. package/lib/contextual-screen-snapshot.js +38 -0
  34. package/lib/daemon-project-access.js +11 -0
  35. package/lib/daemon-project-lifecycle-callbacks.js +15 -0
  36. package/lib/daemon-project-lifecycle.js +262 -0
  37. package/lib/daemon-projects.js +1 -1
  38. package/lib/daemon.js +78 -276
  39. package/lib/default-ai-runtime.js +4 -8
  40. package/lib/dm-digest-cursor.js +120 -0
  41. package/lib/email-mcp-server.js +1 -1
  42. package/lib/issues-service.js +29 -15
  43. package/lib/kiro-defaults.js +1 -22
  44. package/lib/knowledge-db-import-validation.js +46 -0
  45. package/lib/knowledge-db-import.js +99 -0
  46. package/lib/knowledge-db-service.js +24 -33
  47. package/lib/knowledge-db-storage-nedb-maintenance.js +99 -0
  48. package/lib/knowledge-db-storage-nedb.js +66 -0
  49. package/lib/knowledge-db-storage.js +72 -0
  50. package/lib/knowledge-db-validation.js +0 -0
  51. package/lib/knowledge-document-index.js +2 -1
  52. package/lib/knowledge-file-store.js +7 -1
  53. package/lib/knowledge-product-operations.js +46 -0
  54. package/lib/mate-avatar-catalog.js +12 -0
  55. package/lib/mate-avatar-migration.js +41 -0
  56. package/lib/mate-context-service.js +138 -0
  57. package/lib/mate-context-tools.js +21 -0
  58. package/lib/mate-creation-mcp-server.js +2 -0
  59. package/lib/mate-knowledge-canonical-access.js +10 -0
  60. package/lib/mate-knowledge-mate-bound.js +53 -0
  61. package/lib/mate-knowledge-mcp-server.js +55 -8
  62. package/lib/mate-knowledge-service.js +16 -34
  63. package/lib/mate-knowledge-text-tools.js +106 -0
  64. package/lib/mate-lifecycle-service.js +94 -0
  65. package/lib/mate-message-delivery.js +43 -0
  66. package/lib/mate-ready-creation.js +9 -1
  67. package/lib/mate-schedule-input.js +29 -0
  68. package/lib/mate-schedule-lifecycle.js +151 -0
  69. package/lib/mate-scheduling.js +103 -0
  70. package/lib/mates.js +18 -6
  71. package/lib/mcp-agent-tools.js +117 -0
  72. package/lib/mcp-connection-store.js +119 -15
  73. package/lib/mcp-import-credentials.js +31 -0
  74. package/lib/mcp-local-transport.js +13 -0
  75. package/lib/mcp-oauth.js +8 -6
  76. package/lib/mcp-proxy.js +2 -32
  77. package/lib/mcp-query-bridge.js +30 -0
  78. package/lib/mcp-remote-connections.js +74 -20
  79. package/lib/mcp-source-adapters.js +1 -0
  80. package/lib/mcp-source-context.js +1 -0
  81. package/lib/mcp-source-discovery.js +1 -0
  82. package/lib/mcp-source-plugins.js +1 -0
  83. package/lib/mcp-source-restrictions.js +1 -0
  84. package/lib/mcp-tool-policy.js +9 -0
  85. package/lib/notes-checklist.js +50 -0
  86. package/lib/notes.js +49 -3
  87. package/lib/os-user-diagnostics.js +2 -4
  88. package/lib/os-users.js +24 -70
  89. package/lib/pane-pending-interactions.js +20 -0
  90. package/lib/pane-session-activation.js +114 -0
  91. package/lib/pane-session-transport.js +26 -0
  92. package/lib/project-admin-overview.js +51 -0
  93. package/lib/project-ask-user.js +8 -4
  94. package/lib/project-connection.js +14 -10
  95. package/lib/project-control-git-view.js +12 -0
  96. package/lib/project-debate.js +1 -0
  97. package/lib/project-delegated-follow-up.js +2 -1
  98. package/lib/project-directory-claim.js +65 -0
  99. package/lib/project-file-operations.js +61 -0
  100. package/lib/project-filesystem.js +15 -85
  101. package/lib/project-full-access.js +23 -2
  102. package/lib/project-http.js +7 -4
  103. package/lib/project-knowledge.js +32 -18
  104. package/lib/project-lifecycle-operations.js +98 -0
  105. package/lib/project-lifecycle-process-witness.js +32 -0
  106. package/lib/project-lifecycle-runtime.js +50 -0
  107. package/lib/project-linux-access.js +22 -0
  108. package/lib/project-logs-canonical-clay.js +27 -0
  109. package/lib/project-logs-clay-query.js +16 -0
  110. package/lib/project-logs-schema.js +4 -2
  111. package/lib/project-logs-service.js +8 -7
  112. package/lib/project-logs.js +1 -0
  113. package/lib/project-loop.js +1 -0
  114. package/lib/project-mate-chat-control.js +55 -0
  115. package/lib/project-mate-creation-proposal.js +18 -3
  116. package/lib/project-mate-interaction.js +40 -62
  117. package/lib/project-mcp.js +54 -16
  118. package/lib/project-models.js +14 -31
  119. package/lib/project-notifications.js +76 -17
  120. package/lib/project-ownership.js +77 -0
  121. package/lib/project-pair-result-delivery.js +14 -3
  122. package/lib/project-pair-usage.js +12 -13
  123. package/lib/project-pending-message-queue.js +4 -1
  124. package/lib/project-product-control.js +89 -0
  125. package/lib/project-product-session-queue.js +46 -0
  126. package/lib/project-push-access.js +28 -0
  127. package/lib/project-scheduled-message-queue.js +30 -0
  128. package/lib/project-scheduled-messages.js +67 -68
  129. package/lib/project-scheduled-task-control.js +83 -0
  130. package/lib/project-scheduled-tasks.js +13 -2
  131. package/lib/project-scheduling-access.js +10 -0
  132. package/lib/project-session-actions.js +65 -0
  133. package/lib/project-session-delete.js +8 -1
  134. package/lib/project-session-document.js +27 -7
  135. package/lib/project-session-github.js +63 -19
  136. package/lib/project-session-history-actions.js +167 -0
  137. package/lib/project-session-linear.js +14 -6
  138. package/lib/project-session-notes.js +7 -3
  139. package/lib/project-session-pair.js +1 -1
  140. package/lib/project-session-runtime-actions.js +64 -0
  141. package/lib/project-session-spawn.js +2 -3
  142. package/lib/project-session-vendor.js +55 -0
  143. package/lib/project-sessions.js +103 -272
  144. package/lib/project-shared-browser.js +78 -17
  145. package/lib/project-studio-presentation.js +58 -0
  146. package/lib/project-user-message.js +67 -1
  147. package/lib/project-vendor-login.js +6 -36
  148. package/lib/project-workspace-operations.js +126 -0
  149. package/lib/project-workspace-query.js +19 -2
  150. package/lib/project.js +178 -45
  151. package/lib/public/app.js +46 -0
  152. package/lib/public/appearance-bootstrap.js +16 -0
  153. package/lib/public/css/clay-tool-activity.css +51 -0
  154. package/lib/public/css/clay-workspace.css +29 -0
  155. package/lib/public/css/command-palette.css +12 -33
  156. package/lib/public/css/contextual-clay.css +240 -0
  157. package/lib/public/css/home-debate-planning.css +2 -0
  158. package/lib/public/css/home-mate-creation.css +5 -0
  159. package/lib/public/css/input.css +6 -0
  160. package/lib/public/css/mate-avatar-gallery.css +12 -0
  161. package/lib/public/css/mate-conversation.css +10 -5
  162. package/lib/public/css/messages.css +6 -2
  163. package/lib/public/css/overlays.css +4 -2
  164. package/lib/public/css/project-admin-overview.css +13 -0
  165. package/lib/public/css/session-folders.css +11 -0
  166. package/lib/public/css/session-github.css +46 -1
  167. package/lib/public/css/shared-browser.css +35 -1
  168. package/lib/public/css/sticky-notes.css +87 -1
  169. package/lib/public/index.html +11 -5
  170. package/lib/public/mate-avatars/B01.png +0 -0
  171. package/lib/public/mate-avatars/B02.png +0 -0
  172. package/lib/public/mate-avatars/B03.png +0 -0
  173. package/lib/public/mate-avatars/B04.png +0 -0
  174. package/lib/public/mate-avatars/B05.png +0 -0
  175. package/lib/public/mate-avatars/B06.png +0 -0
  176. package/lib/public/mate-avatars/B07.png +0 -0
  177. package/lib/public/mate-avatars/B08.png +0 -0
  178. package/lib/public/mate-avatars/B09.png +0 -0
  179. package/lib/public/mate-avatars/B10.png +0 -0
  180. package/lib/public/mate-avatars/B11.png +0 -0
  181. package/lib/public/mate-avatars/B12.png +0 -0
  182. package/lib/public/mate-avatars/B13.png +0 -0
  183. package/lib/public/mate-avatars/B14.png +0 -0
  184. package/lib/public/mate-avatars/B15.png +0 -0
  185. package/lib/public/mate-avatars/B16.png +0 -0
  186. package/lib/public/mate-avatars/B17.png +0 -0
  187. package/lib/public/mate-avatars/B18.png +0 -0
  188. package/lib/public/mate-avatars/B19.png +0 -0
  189. package/lib/public/mate-avatars/B20.png +0 -0
  190. package/lib/public/mate-avatars/B21.png +0 -0
  191. package/lib/public/mate-avatars/B22.png +0 -0
  192. package/lib/public/mate-avatars/B23.png +0 -0
  193. package/lib/public/mate-avatars/B24.png +0 -0
  194. package/lib/public/mate-avatars/B25.png +0 -0
  195. package/lib/public/mate-avatars/B26.png +0 -0
  196. package/lib/public/mate-avatars/B27.png +0 -0
  197. package/lib/public/mate-avatars/B28.png +0 -0
  198. package/lib/public/mate-avatars/B29.png +0 -0
  199. package/lib/public/mate-avatars/B30.png +0 -0
  200. package/lib/public/mate-avatars/B31.png +0 -0
  201. package/lib/public/mate-avatars/B32.png +0 -0
  202. package/lib/public/mate-avatars/B33.png +0 -0
  203. package/lib/public/mate-avatars/B34.png +0 -0
  204. package/lib/public/mate-avatars/B35.png +0 -0
  205. package/lib/public/mate-avatars/B36.png +0 -0
  206. package/lib/public/mate-avatars/B37.png +0 -0
  207. package/lib/public/mate-avatars/B38.png +0 -0
  208. package/lib/public/mate-avatars/B39.png +0 -0
  209. package/lib/public/mate-avatars/B40.png +0 -0
  210. package/lib/public/mate-avatars/B41.png +0 -0
  211. package/lib/public/mate-avatars/B42.png +0 -0
  212. package/lib/public/mate-avatars/B43.png +0 -0
  213. package/lib/public/mate-avatars/B44.png +0 -0
  214. package/lib/public/mate-avatars/B45.png +0 -0
  215. package/lib/public/mate-avatars/B46.png +0 -0
  216. package/lib/public/mate-avatars/B47.png +0 -0
  217. package/lib/public/mate-avatars/B48.png +0 -0
  218. package/lib/public/mate-avatars/C01.png +0 -0
  219. package/lib/public/mate-avatars/C02.png +0 -0
  220. package/lib/public/mate-avatars/C03.png +0 -0
  221. package/lib/public/mate-avatars/C04.png +0 -0
  222. package/lib/public/mate-avatars/C05.png +0 -0
  223. package/lib/public/mate-avatars/C06.png +0 -0
  224. package/lib/public/mate-avatars/C07.png +0 -0
  225. package/lib/public/mate-avatars/C08.png +0 -0
  226. package/lib/public/mate-avatars/C09.png +0 -0
  227. package/lib/public/mate-avatars/C10.png +0 -0
  228. package/lib/public/mate-avatars/C11.png +0 -0
  229. package/lib/public/mate-avatars/C12.png +0 -0
  230. package/lib/public/mate-avatars/C13.png +0 -0
  231. package/lib/public/mate-avatars/C14.png +0 -0
  232. package/lib/public/mate-avatars/C15.png +0 -0
  233. package/lib/public/mate-avatars/C16.png +0 -0
  234. package/lib/public/mate-avatars/C17.png +0 -0
  235. package/lib/public/mate-avatars/C18.png +0 -0
  236. package/lib/public/mate-avatars/C19.png +0 -0
  237. package/lib/public/mate-avatars/C20.png +0 -0
  238. package/lib/public/mate-avatars/C21.png +0 -0
  239. package/lib/public/mate-avatars/C22.png +0 -0
  240. package/lib/public/mate-avatars/C23.png +0 -0
  241. package/lib/public/mate-avatars/C24.png +0 -0
  242. package/lib/public/mate-avatars/C25.png +0 -0
  243. package/lib/public/mate-avatars/C26.png +0 -0
  244. package/lib/public/mate-avatars/C27.png +0 -0
  245. package/lib/public/mate-avatars/C28.png +0 -0
  246. package/lib/public/mate-avatars/C29.png +0 -0
  247. package/lib/public/mate-avatars/C30.png +0 -0
  248. package/lib/public/mate-avatars/C31.png +0 -0
  249. package/lib/public/mate-avatars/C32.png +0 -0
  250. package/lib/public/mate-avatars/C33.png +0 -0
  251. package/lib/public/mate-avatars/C34.png +0 -0
  252. package/lib/public/mate-avatars/C35.png +0 -0
  253. package/lib/public/mate-avatars/C36.png +0 -0
  254. package/lib/public/mate-avatars/C37.png +0 -0
  255. package/lib/public/mate-avatars/C38.png +0 -0
  256. package/lib/public/mate-avatars/C39.png +0 -0
  257. package/lib/public/mate-avatars/C40.png +0 -0
  258. package/lib/public/mate-avatars/C41.png +0 -0
  259. package/lib/public/mate-avatars/C42.png +0 -0
  260. package/lib/public/mate-avatars/C43.png +0 -0
  261. package/lib/public/mate-avatars/C44.png +0 -0
  262. package/lib/public/mate-avatars/C45.png +0 -0
  263. package/lib/public/mate-avatars/C46.png +0 -0
  264. package/lib/public/mate-avatars/C47.png +0 -0
  265. package/lib/public/mate-avatars/C48.png +0 -0
  266. package/lib/public/mate-avatars/catalog.json +482 -0
  267. package/lib/public/mate-avatars/lead-clay.png +0 -0
  268. package/lib/public/modules/admin-settings-projects.js +6 -2
  269. package/lib/public/modules/app-connection.js +11 -1
  270. package/lib/public/modules/app-favicon.js +18 -9
  271. package/lib/public/modules/app-header.js +7 -4
  272. package/lib/public/modules/app-loop-ui.js +2 -0
  273. package/lib/public/modules/app-message-router.js +22 -1
  274. package/lib/public/modules/app-messages.js +115 -17
  275. package/lib/public/modules/app-misc.js +3 -1
  276. package/lib/public/modules/app-notifications.js +11 -5
  277. package/lib/public/modules/app-panels.js +61 -123
  278. package/lib/public/modules/app-projects.js +13 -0
  279. package/lib/public/modules/app-rate-limit.js +7 -27
  280. package/lib/public/modules/app-rendering.js +4 -3
  281. package/lib/public/modules/avatar.js +15 -41
  282. package/lib/public/modules/chat-render-runtime.js +20 -0
  283. package/lib/public/modules/clay-browser-links.js +47 -0
  284. package/lib/public/modules/clay-control-activity.js +214 -0
  285. package/lib/public/modules/clay-control-copy.js +36 -0
  286. package/lib/public/modules/clay-control-detail-targets.js +44 -0
  287. package/lib/public/modules/clay-control-object-targets.js +52 -0
  288. package/lib/public/modules/clay-control-target-visibility.js +12 -0
  289. package/lib/public/modules/clay-control-targets.js +44 -0
  290. package/lib/public/modules/clay-log-links.js +23 -0
  291. package/lib/public/modules/clay-navigation-render.js +52 -0
  292. package/lib/public/modules/clay-owner-navigation.js +33 -0
  293. package/lib/public/modules/clay-session-links.js +31 -0
  294. package/lib/public/modules/clay-studio-bridge.js +20 -0
  295. package/lib/public/modules/clay-studio-document.js +67 -0
  296. package/lib/public/modules/clay-studio-render.js +146 -0
  297. package/lib/public/modules/clay-tool-activity.js +140 -0
  298. package/lib/public/modules/clay-tool-presentation.js +342 -0
  299. package/lib/public/modules/command-palette.js +162 -40
  300. package/lib/public/modules/contextual-ask-session.js +26 -0
  301. package/lib/public/modules/contextual-clay-geometry.js +155 -0
  302. package/lib/public/modules/contextual-clay-session.js +130 -0
  303. package/lib/public/modules/contextual-clay-workspace.js +169 -0
  304. package/lib/public/modules/contextual-clay.js +250 -0
  305. package/lib/public/modules/contextual-composer.js +91 -0
  306. package/lib/public/modules/contextual-mate-context.js +117 -0
  307. package/lib/public/modules/contextual-mate-hint.js +40 -0
  308. package/lib/public/modules/contextual-mate-identity.js +23 -0
  309. package/lib/public/modules/contextual-mate-sessions.js +134 -0
  310. package/lib/public/modules/contextual-search.js +137 -0
  311. package/lib/public/modules/contextual-session-citations.js +58 -0
  312. package/lib/public/modules/debate.js +1 -0
  313. package/lib/public/modules/default-ai.js +11 -3
  314. package/lib/public/modules/elicitation-form.js +5 -0
  315. package/lib/public/modules/filebrowser.js +20 -1
  316. package/lib/public/modules/generation-stop.js +8 -5
  317. package/lib/public/modules/git-panel.js +3 -1
  318. package/lib/public/modules/history-replay-batch.js +13 -1
  319. package/lib/public/modules/home-debate-live.js +2 -0
  320. package/lib/public/modules/home-debate-planning.js +7 -7
  321. package/lib/public/modules/home-mate-avatar-editor.js +127 -208
  322. package/lib/public/modules/home-mate-chat.js +8 -6
  323. package/lib/public/modules/home-mate-creation.js +73 -1
  324. package/lib/public/modules/home-mate-settings.js +19 -12
  325. package/lib/public/modules/icon-strip-tooltip.js +2 -1
  326. package/lib/public/modules/input.js +88 -10
  327. package/lib/public/modules/issues-render.js +3 -2
  328. package/lib/public/modules/knowledge-db-workbench.js +4 -4
  329. package/lib/public/modules/markdown.js +6 -34
  330. package/lib/public/modules/mate-avatar-catalog.js +97 -0
  331. package/lib/public/modules/mate-knowledge-workbench.js +1 -1
  332. package/lib/public/modules/mate-management.js +40 -7
  333. package/lib/public/modules/mcp-connection-view.js +31 -13
  334. package/lib/public/modules/mcp-discovery-view.js +31 -0
  335. package/lib/public/modules/mcp-ui.js +23 -4
  336. package/lib/public/modules/mention.js +3 -0
  337. package/lib/public/modules/message-delivery.js +20 -2
  338. package/lib/public/modules/model-picker.js +2 -0
  339. package/lib/public/modules/pane-activation.js +214 -0
  340. package/lib/public/modules/pane-binding.js +82 -0
  341. package/lib/public/modules/pane-bridge.js +7 -4
  342. package/lib/public/modules/pane-browser-bridge.js +22 -0
  343. package/lib/public/modules/pane-file-bridge.js +4 -0
  344. package/lib/public/modules/pane-issue-bridge.js +4 -1
  345. package/lib/public/modules/pending-message-queue.js +1 -0
  346. package/lib/public/modules/permission-control.js +5 -4
  347. package/lib/public/modules/personal-settings-dialog.js +7 -1
  348. package/lib/public/modules/product-review.js +26 -0
  349. package/lib/public/modules/profile.js +1 -238
  350. package/lib/public/modules/project-access-recovery.js +17 -0
  351. package/lib/public/modules/project-admin-overview.js +21 -0
  352. package/lib/public/modules/project-chat-identity.js +13 -4
  353. package/lib/public/modules/project-logs-render.js +3 -0
  354. package/lib/public/modules/project-mate-navigation.js +144 -22
  355. package/lib/public/modules/rewind.js +5 -0
  356. package/lib/public/modules/scheduled-tasks.js +2 -0
  357. package/lib/public/modules/scheduler.js +2 -0
  358. package/lib/public/modules/search-clay-chat.js +5 -440
  359. package/lib/public/modules/session-actions.js +5 -2
  360. package/lib/public/modules/session-context-menu.js +5 -0
  361. package/lib/public/modules/session-create-form.js +10 -10
  362. package/lib/public/modules/session-folder-layout.js +1 -1
  363. package/lib/public/modules/session-folder-view-menu.js +9 -0
  364. package/lib/public/modules/session-github.js +85 -14
  365. package/lib/public/modules/session-rich-drafts.js +21 -0
  366. package/lib/public/modules/session-switch-defer.js +67 -0
  367. package/lib/public/modules/session-work-primary.js +51 -0
  368. package/lib/public/modules/settings-defaults.js +27 -28
  369. package/lib/public/modules/shared-browser-settings.js +112 -0
  370. package/lib/public/modules/shared-browser-tabs.js +13 -3
  371. package/lib/public/modules/shared-browser.js +29 -6
  372. package/lib/public/modules/sidebar-mobile.js +4 -3
  373. package/lib/public/modules/sidebar-projects.js +1 -0
  374. package/lib/public/modules/sidebar-session-folders-ui.js +1 -1
  375. package/lib/public/modules/sidebar-sessions.js +1 -0
  376. package/lib/public/modules/split-group-restore.js +68 -0
  377. package/lib/public/modules/split-pair-ui.js +1 -0
  378. package/lib/public/modules/split-pane-reconciler.js +15 -0
  379. package/lib/public/modules/split-pane-renderer.js +87 -6
  380. package/lib/public/modules/split-session-boundary.js +1 -1
  381. package/lib/public/modules/split-view.js +60 -68
  382. package/lib/public/modules/sticky-note-markdown.js +72 -6
  383. package/lib/public/modules/sticky-notes-actions.js +30 -0
  384. package/lib/public/modules/sticky-notes-browser.js +9 -2
  385. package/lib/public/modules/sticky-notes-card.js +23 -7
  386. package/lib/public/modules/sticky-notes-checklist.js +116 -0
  387. package/lib/public/modules/sticky-notes-editor.js +108 -44
  388. package/lib/public/modules/sticky-notes-shared.js +50 -2
  389. package/lib/public/modules/sticky-notes-state.js +66 -0
  390. package/lib/public/modules/sticky-notes.js +34 -51
  391. package/lib/public/modules/stt-controller.js +4 -1
  392. package/lib/public/modules/stt-recording.js +1 -1
  393. package/lib/public/modules/stt.js +7 -2
  394. package/lib/public/modules/terminal.js +9 -0
  395. package/lib/public/modules/theme.js +8 -1
  396. package/lib/public/modules/thinking-lifecycle.js +33 -3
  397. package/lib/public/modules/thinking-view.js +23 -1
  398. package/lib/public/modules/tools.js +60 -11
  399. package/lib/public/modules/tui-grab.js +1 -2
  400. package/lib/public/modules/user-settings-appearance.js +10 -3
  401. package/lib/public/modules/user-settings-editors.js +1 -1
  402. package/lib/public/modules/user-settings-layout.js +11 -2
  403. package/lib/public/modules/user-settings-preferences.js +6 -2
  404. package/lib/public/modules/user-settings-profile.js +12 -2
  405. package/lib/public/modules/user-settings.js +3 -2
  406. package/lib/public/modules/vendor-login-browser.js +5 -3
  407. package/lib/public/modules/vendor-login.js +2 -2
  408. package/lib/public/modules/vendor-priority.js +15 -1
  409. package/lib/public/modules/wireframe-workbench.js +5 -2
  410. package/lib/public/muse-avatar.svg +4 -0
  411. package/lib/public/style.css +5 -0
  412. package/lib/public/sw.js +3 -1
  413. package/lib/safe-bash-commands.js +3 -45
  414. package/lib/scheduled-task-records.js +3 -1
  415. package/lib/scheduler.js +2 -0
  416. package/lib/sdk-bridge.js +342 -401
  417. package/lib/sdk-foreground-admission.js +16 -0
  418. package/lib/sdk-mcp-descriptors.js +2 -37
  419. package/lib/sdk-message-processor.js +52 -17
  420. package/lib/sdk-quota-snapshot.js +1 -1
  421. package/lib/sdk-response-recovery.js +1 -0
  422. package/lib/sdk-worker.js +2 -677
  423. package/lib/server-admin.js +63 -16
  424. package/lib/server-appearance-settings.js +13 -1
  425. package/lib/server-contextual-clay-settings.js +40 -0
  426. package/lib/server-contextual-mate-sessions.js +70 -0
  427. package/lib/server-dm.js +2 -1
  428. package/lib/server-global-ws.js +10 -20
  429. package/lib/server-home-chat-events.js +18 -4
  430. package/lib/server-home-chat.js +22 -20
  431. package/lib/server-home-clay-entry.js +23 -4
  432. package/lib/server-home-clay-session-links.js +29 -9
  433. package/lib/server-home-mate-creation.js +1 -0
  434. package/lib/server-home-mcp-consent.js +14 -0
  435. package/lib/server-mates.js +25 -62
  436. package/lib/server-owner-ui.js +118 -0
  437. package/lib/server-path-access.js +38 -0
  438. package/lib/server-project-removal.js +22 -0
  439. package/lib/server-settings.js +6 -1
  440. package/lib/server.js +163 -43
  441. package/lib/session-config-transition.js +45 -0
  442. package/lib/session-folders.js +7 -2
  443. package/lib/session-fork-history.js +21 -0
  444. package/lib/session-github.js +9 -2
  445. package/lib/session-hygiene.js +3 -35
  446. package/lib/session-permission-mode.js +4 -3
  447. package/lib/session-skill-scope.js +11 -0
  448. package/lib/session-visibility.js +5 -2
  449. package/lib/session-work-primary.js +50 -0
  450. package/lib/sessions.js +64 -99
  451. package/lib/shared-browser-cookie-sync.js +32 -0
  452. package/lib/shared-browser-cookies.js +79 -0
  453. package/lib/shared-browser-runtime.js +25 -9
  454. package/lib/shared-browser-storage-sync.js +43 -0
  455. package/lib/shared-browser-storage.js +101 -0
  456. package/lib/shared-browser-tools.js +2 -1
  457. package/lib/shared-browser-worker.js +46 -10
  458. package/lib/terminal-manager.js +65 -6
  459. package/lib/tool-llm.js +1 -1
  460. package/lib/tui-transcript-index.js +1 -132
  461. package/lib/users-contextual-clay-preferences.js +31 -0
  462. package/lib/users-permissions.js +2 -8
  463. package/lib/users.js +7 -0
  464. package/lib/vendor-login-browser.js +1 -11
  465. package/lib/workspace-assignment-service.js +25 -0
  466. package/lib/workspace-query-access.js +4 -1
  467. package/lib/workspace-query-mcp-server.js +1 -1
  468. package/lib/workspace-query-service.js +13 -2
  469. package/lib/ws-request.js +1 -0
  470. package/lib/ws-schema.js +18 -2
  471. package/lib/yoke/acp-agent-profiles.js +7 -5
  472. package/lib/yoke/adapters/antigravity.js +3 -14
  473. package/lib/yoke/adapters/claude-query-contract.js +9 -0
  474. package/lib/yoke/adapters/claude.js +54 -50
  475. package/lib/yoke/adapters/codex-query-contract.js +24 -0
  476. package/lib/yoke/adapters/codex.js +53 -111
  477. package/lib/yoke/adapters/kiro.js +3 -1
  478. package/lib/yoke/adapters/muse-query-contract.js +7 -0
  479. package/lib/yoke/adapters/muse.js +122 -0
  480. package/lib/yoke/auth-events.js +17 -0
  481. package/lib/yoke/claude-hook-installer.js +271 -0
  482. package/lib/yoke/claude-jsonl-watcher.js +204 -0
  483. package/lib/yoke/claude-maintenance.js +55 -0
  484. package/lib/yoke/claude-permission-patterns.js +53 -0
  485. package/lib/yoke/claude-response-recovery.js +155 -0
  486. package/lib/yoke/claude-transcript-hygiene.js +34 -0
  487. package/lib/yoke/claude-worker-startup.js +28 -0
  488. package/lib/yoke/clay-skill-install.js +33 -0
  489. package/lib/yoke/cli-sessions.js +300 -0
  490. package/lib/yoke/codex-app-server.js +7 -12
  491. package/lib/yoke/codex-idle-recovery.js +81 -1
  492. package/lib/yoke/codex-recovery-admission.js +164 -0
  493. package/lib/yoke/configuration.js +13 -0
  494. package/lib/yoke/discovery.js +70 -0
  495. package/lib/yoke/errors.js +8 -0
  496. package/lib/yoke/host-environment.js +7 -0
  497. package/lib/yoke/index.js +9 -51
  498. package/lib/yoke/interface.js +116 -0
  499. package/lib/yoke/kiro-acp-server.js +5 -5
  500. package/lib/yoke/legacy-sessions.js +89 -0
  501. package/lib/yoke/login-protocol.js +25 -0
  502. package/lib/yoke/maintenance.js +12 -0
  503. package/lib/yoke/mcp-proxy.js +32 -0
  504. package/lib/yoke/mcp-source-adapters.js +91 -0
  505. package/lib/yoke/mcp-source-context.js +42 -0
  506. package/lib/yoke/mcp-source-discovery.js +169 -0
  507. package/lib/yoke/mcp-source-plugins.js +68 -0
  508. package/lib/yoke/mcp-source-restrictions.js +47 -0
  509. package/lib/yoke/mcp-tool-policy-normalize.js +28 -0
  510. package/lib/yoke/model-preferences.js +6 -0
  511. package/lib/yoke/muse-artifacts.js +36 -0
  512. package/lib/yoke/muse-controls.js +50 -0
  513. package/lib/yoke/muse-input.js +64 -0
  514. package/lib/yoke/muse-items.js +157 -0
  515. package/lib/yoke/muse-policy.js +52 -0
  516. package/lib/yoke/muse-query.js +428 -0
  517. package/lib/yoke/muse-runtime.js +211 -0
  518. package/lib/yoke/muse-services.js +79 -0
  519. package/lib/yoke/muse-skills.js +79 -0
  520. package/lib/yoke/muse-turns.js +71 -0
  521. package/lib/yoke/options/acp.js +2 -0
  522. package/lib/yoke/options/antigravity.js +2 -0
  523. package/lib/yoke/options/claude.js +21 -0
  524. package/lib/yoke/options/codex-defaults.js +29 -0
  525. package/lib/yoke/options/codex-settings.js +21 -0
  526. package/lib/yoke/options/codex.js +6 -0
  527. package/lib/yoke/options/kiro-defaults.js +22 -0
  528. package/lib/yoke/options/kiro.js +5 -0
  529. package/lib/yoke/options/muse.js +5 -0
  530. package/lib/yoke/provider-contract.js +5 -0
  531. package/lib/yoke/providers/antigravity-executable.js +8 -0
  532. package/lib/yoke/providers/claude-executable.js +40 -0
  533. package/lib/yoke/providers/claude-model-descriptions.js +14 -0
  534. package/lib/yoke/providers/claude-process.js +97 -0
  535. package/lib/yoke/providers/claude-provision.js +75 -0
  536. package/lib/yoke/providers/codex-errors.js +8 -0
  537. package/lib/yoke/providers/muse-executable.js +17 -0
  538. package/lib/yoke/provisioning.js +6 -0
  539. package/lib/yoke/query-options.js +10 -0
  540. package/lib/yoke/response-recovery.js +41 -0
  541. package/lib/yoke/sdk-mcp-descriptors.js +37 -0
  542. package/lib/yoke/sdk-server-factory.js +7 -0
  543. package/lib/yoke/session-history.js +8 -0
  544. package/lib/yoke/session-tool-transport.js +34 -13
  545. package/lib/yoke/settings.js +23 -0
  546. package/lib/yoke/source-locations.js +4 -0
  547. package/lib/yoke/title-query.js +18 -7
  548. package/lib/yoke/tui-transcript-index.js +132 -0
  549. package/lib/yoke/usage.js +48 -0
  550. package/lib/yoke/user-input.js +13 -0
  551. package/lib/yoke/vendor-registry.js +81 -1
  552. package/package.json +10 -4
@@ -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';
@@ -59,13 +69,13 @@ import { handleProjectOwnerChanged } 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';
@@ -118,6 +128,9 @@ var connectOverlay = document.getElementById("connect-overlay");
118
128
  initMessageDeliveryUi();
119
129
 
120
130
  export function processMessage(msg) {
131
+ if (handleStudioDocumentMessage(msg)) return;
132
+ if (handleClayControlActivity(msg)) return;
133
+ if (handleOwnerNavigation(msg)) return;
121
134
  if (["update_available", "up_to_date", "update_started", "update_check_failed"].indexOf(msg.type) !== -1) handleServerUpdate(msg);
122
135
  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
136
  if (handleProjectDebateMessage(msg)) return;
@@ -145,7 +158,7 @@ export function processMessage(msg) {
145
158
  return;
146
159
  }
147
160
  if (msg.type === "access_revoked") {
148
- window.location.assign("/");
161
+ leaveRevokedProject("/");
149
162
  return;
150
163
  }
151
164
  // Preserve original timestamp from history replay
@@ -204,7 +217,7 @@ export function processMessage(msg) {
204
217
  if (readyMatch) {
205
218
  var newName = readyMatch[1].trim();
206
219
  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 } });
220
+ 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
221
  if (getWs() && getWs().readyState === 1) {
209
222
  getWs().send(JSON.stringify({
210
223
  type: "mate_update",
@@ -224,6 +237,10 @@ export function processMessage(msg) {
224
237
  }
225
238
  }
226
239
 
240
+ store.set({ currentHistoryIndex: Number.isSafeInteger(msg._historyIndex) && msg._historyIndex >= 0 ? msg._historyIndex : null,
241
+ currentHistoryIndexes: Array.isArray(msg._historyIndexes) ? msg._historyIndexes : null });
242
+ if (handleContextualSessionMessage(msg)) return;
243
+ handleContextualWorkspaceMessage(msg);
227
244
  switch (msg.type) {
228
245
  case "message_ack":
229
246
  var acknowledgedEntry = acknowledgeMessage(msg.clientMessageId);
@@ -250,9 +267,12 @@ export function processMessage(msg) {
250
267
 
251
268
  case "history_prepend":
252
269
  prependOlderHistory(msg.items, msg.meta);
270
+ handlePaletteHistoryPrepended();
253
271
  break;
254
272
 
255
273
  case "history_done":
274
+ var historyPaintEpoch = store.get('sessionActionEpoch') || 0;
275
+ 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
276
  store.set({ replayingHistory: false });
257
277
  resumeThinkingAfterReplay(store.get('sessionIsProcessing'));
258
278
  // Batched syntax highlight + mermaid pass for the entire replayed
@@ -275,7 +295,7 @@ export function processMessage(msg) {
275
295
 
276
296
  // Restore accurate context data from the last result in full history
277
297
  if (msg.lastUsage || msg.lastModelUsage) {
278
- accumulateContext(msg.lastCost, msg.lastUsage, msg.lastModelUsage, msg.lastStreamInputTokens);
298
+ accumulateContext(msg.lastCost, msg.lastUsage, msg.lastModelUsage, msg.lastStreamInputTokens, msg.context);
279
299
  }
280
300
  updateContextPanel();
281
301
  updateUsagePanel();
@@ -283,6 +303,7 @@ export function processMessage(msg) {
283
303
  // the restored turn instead of starting a second answer bubble.
284
304
  if (store.get('sessionIsProcessing')) {
285
305
  flushStreamBuffer();
306
+ if (store.get('turnActivity')) setActivity(store.get('turnActivity').phase);
286
307
  } else {
287
308
  markAllToolsDone();
288
309
  finalizeAssistantBlock();
@@ -311,11 +332,16 @@ export function processMessage(msg) {
311
332
  // re-pins on every height change while armed. Disarms early on
312
333
  // any real user scroll input.
313
334
  // 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.
335
+ // target (file-edit or Session-entry deeplink) — the navigate block
336
+ // below scrolls that element into view, and sticky-bottom would
337
+ // fight it.
316
338
  var nav = getPendingNavigate();
317
339
  var hasNavTarget = nav && (nav.toolId || nav.assistantUuid);
318
- if (hasNavTarget) {
340
+ var sessionEntryNav = store.get('pendingSessionEntryNavigation');
341
+ var hasSessionEntryNav = sessionEntryNav
342
+ && String(sessionEntryNav.projectSlug) === String(store.get('currentSlug'))
343
+ && String(sessionEntryNav.sessionId) === String(store.get('activeSessionId'));
344
+ if (hasNavTarget || hasSessionEntryNav) {
319
345
  // Navigate block below will scrollIntoView on the target — don't
320
346
  // arm sticky-bottom or it would fight that scroll.
321
347
  scrollToBottom();
@@ -328,6 +354,7 @@ export function processMessage(msg) {
328
354
  // Scroll to tool element if navigating from file edit history
329
355
  if (hasNavTarget) {
330
356
  requestAnimationFrame(function() {
357
+ if (historyPaintEpoch !== (store.get('sessionActionEpoch') || 0) || !paneCallbackCurrent(msg.paneActivation)) return;
331
358
  // Prefer scrolling to the exact tool element
332
359
  var target = nav.toolId ? messagesEl.querySelector('[data-tool-id="' + nav.toolId + '"]') : null;
333
360
  if (!target && nav.assistantUuid) {
@@ -343,6 +370,7 @@ export function processMessage(msg) {
343
370
  }
344
371
  });
345
372
  }
373
+ requestAnimationFrame(function () { if (historyPaintEpoch === (store.get('sessionActionEpoch') || 0) && paneCallbackCurrent(msg.paneActivation)) handlePaletteHistoryDone(); });
346
374
  break;
347
375
 
348
376
  case "restore_mate_dm":
@@ -363,6 +391,7 @@ export function processMessage(msg) {
363
391
  break;
364
392
 
365
393
  case "info":
394
+ store.set({ controlRuntimeId: msg.controlRuntimeId || null });
366
395
  if (msg.text && !msg.project && !msg.cwd) {
367
396
  addSystemMessage(msg.text, false);
368
397
  break;
@@ -753,9 +782,11 @@ export function processMessage(msg) {
753
782
  markProjectSessionListHydrated();
754
783
  renderMateSessionList(msg.sessions || []);
755
784
  renderSessionList(msg.sessions || []);
785
+ store.set({ paneBindingSessions: msg.sessions || [] });
786
+ refreshPaneActivation();
756
787
  syncGithubSessions(msg.sessions || []);
757
788
  syncPaneTitles();
758
- var panePin = resolvePaneSession(store.get('paneMode'), store.get('panePinPending'), store.get('paneSessionId'), msg.sessions);
789
+ var panePin = resolvePaneSession(store.get('paneMode') && !primePaneSession(), store.get('panePinPending'), store.get('paneSessionId'), msg.sessions);
759
790
  if (panePin.consumed) {
760
791
  store.set({ panePinPending: false });
761
792
  if (panePin.sessionId && getWs() && getWs().readyState === 1) {
@@ -765,6 +796,9 @@ export function processMessage(msg) {
765
796
  handlePaletteSessionSwitch();
766
797
  maybeRestoreSplitGroup();
767
798
  break;
799
+ case "session_github_status":
800
+ applyGithubPersonalReviewStatus(msg);
801
+ break;
768
802
 
769
803
  case "split_groups":
770
804
  applyProjectSplitGroups(msg.groups || []);
@@ -850,6 +884,9 @@ export function processMessage(msg) {
850
884
  handleRemoteSelection(msg);
851
885
  break;
852
886
 
887
+ case "session_work_primary_result":
888
+ handlePrimaryWorkResult(msg);
889
+ break;
853
890
  case "linear_result":
854
891
  handleLinearResult(msg);
855
892
  break;
@@ -876,6 +913,8 @@ export function processMessage(msg) {
876
913
  break;
877
914
 
878
915
  case "session_switched":
916
+ saveSessionRichDraft();
917
+ store.set({ sessionActionEpoch: (store.get('sessionActionEpoch') || 0) + 1 });
879
918
  clearPairResultStatus();
880
919
  resetStreamBuffer();
881
920
  syncAutonomousRunForSession(msg.autonomousRun || null);
@@ -893,7 +932,7 @@ export function processMessage(msg) {
893
932
  ? msg.runtimeTerminalId
894
933
  : (typeof msg.terminalId === "number" ? msg.terminalId : null);
895
934
  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') || "") });
935
+ 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
936
  handleScheduledTaskSessionSwitched(msg);
898
937
  requestLoopInterviewState();
899
938
  activateDeliverySession(msg.id, msg.cliSessionId || null, msg.sessionOriginId || null);
@@ -968,14 +1007,19 @@ export function processMessage(msg) {
968
1007
  // Restore draft for incoming session
969
1008
  var draft = store.get('sessionDrafts')[store.get('activeSessionId')] || "";
970
1009
  inputEl.value = draft;
1010
+ restoreSessionRichDraft();
971
1011
  autoResize();
972
1012
  if (!("ontouchstart" in window)) {
973
1013
  inputEl.focus();
974
1014
  }
975
1015
  // Reload survival: a restored active session that is a split-group
976
1016
  // member reopens its group (no-op when a split is already open).
977
- finishProjectSessionActivation();
978
- maybeRestoreSplitGroup();
1017
+ var deferredSwitch = store.get('deferredSessionSwitch');
1018
+ if (!deferredSwitch || !deferredSwitch.draining || deferredSwitch.finalSwitch === msg) {
1019
+ finishProjectSessionActivation();
1020
+ maybeRestoreSplitGroup();
1021
+ handlePaletteSessionSwitch(true);
1022
+ }
979
1023
  break;
980
1024
 
981
1025
  case "session_full_access_changed":
@@ -1020,7 +1064,11 @@ export function processMessage(msg) {
1020
1064
  // running session, where history_done keeps current tools active.
1021
1065
  // Question answers, plan feedback and Driver delegations are injected
1022
1066
  // mid-turn, so tools before them may still be running.
1023
- else if (!msg.askUserAnswer && !msg.planFeedback && !msg.delegated) markAllToolsDone();
1067
+ else if (!msg.askUserAnswer && !msg.planFeedback && !msg.delegated) {
1068
+ markAllToolsDone();
1069
+ // Older histories predate explicit foreground presentation boundaries.
1070
+ finalizeAssistantBlock();
1071
+ }
1024
1072
  resetThinkingGroup();
1025
1073
  if (msg.planContent) {
1026
1074
  setPlanContent(msg.planContent);
@@ -1117,7 +1165,7 @@ export function processMessage(msg) {
1117
1165
  // events make it through.
1118
1166
  removeMatePreThinking();
1119
1167
  if (!(store.get('dmMode') && store.get('dmTargetUser') && store.get('dmTargetUser').isMate) && !store.get('matePreThinkingEl')) {
1120
- setActivity("thinking");
1168
+ setActivity((store.get("turnActivity") || {}).phase || "thinking");
1121
1169
  }
1122
1170
  }
1123
1171
  break;
@@ -1153,8 +1201,24 @@ export function processMessage(msg) {
1153
1201
  }
1154
1202
  break;
1155
1203
 
1204
+ case "turn_activity":
1205
+ if (["waiting", "running", "background"].indexOf(msg.phase) === -1) break;
1206
+ store.set({ turnActivity: { phase: msg.phase, turnId: msg.turnId || null, disposition: msg.disposition || null } });
1207
+ if (!store.get('replayingHistory') && store.get('sessionIsProcessing')) {
1208
+ removeMatePreThinking();
1209
+ setActivity(msg.phase);
1210
+ }
1211
+ break;
1212
+
1213
+ case "assistant_boundary":
1214
+ // Foreground presentation ended; background work still owns its real
1215
+ // terminal. Flush pending animation text without finishing tools/Stop.
1216
+ finalizeAssistantBlock();
1217
+ break;
1218
+
1156
1219
  case "delta":
1157
1220
  if (typeof msg.text !== "string") break;
1221
+ store.set({ turnActivity: null });
1158
1222
  removeMatePreThinking();
1159
1223
  stopThinking();
1160
1224
  setActivity(null);
@@ -1202,6 +1266,8 @@ export function processMessage(msg) {
1202
1266
  renderMcpDebateProposal(msg.id, msg.input);
1203
1267
  startUrgentBlink();
1204
1268
  } else if (msg.name === "AskUserQuestion" && msg.input && msg.input.questions) {
1269
+ store.set({ turnActivity: null });
1270
+ setActivity(null);
1205
1271
  var askTool = getTools()[msg.id];
1206
1272
  if (askTool) {
1207
1273
  if (askTool.el) askTool.el.style.display = "none";
@@ -1266,12 +1332,23 @@ export function processMessage(msg) {
1266
1332
  renderGeneratedImage(msg);
1267
1333
  break;
1268
1334
 
1335
+ case 'mate_schedule_question_expired':
1336
+ markAskUserAnswered(msg.toolId, { 0: msg.error || 'This schedule review expired.' });
1337
+ stopUrgentBlink();
1338
+ break;
1339
+
1340
+ case 'mcp_import_consent_expired':
1341
+ markAskUserAnswered(msg.toolId, { 0: msg.error || 'No import was approved.' });
1342
+ stopUrgentBlink();
1343
+ break;
1344
+
1269
1345
  case "ask_user_answered":
1270
1346
  markAskUserAnswered(msg.toolId, msg.answers);
1271
1347
  stopUrgentBlink();
1272
1348
  break;
1273
1349
 
1274
1350
  case "permission_request":
1351
+ store.set({ turnActivity: null });
1275
1352
  setActivity(null);
1276
1353
  renderPermissionRequest(msg.requestId, msg.toolName, msg.toolInput, msg.decisionReason, msg.mateId, msg.vendor, msg);
1277
1354
  startUrgentBlink();
@@ -1287,13 +1364,21 @@ export function processMessage(msg) {
1287
1364
  stopUrgentBlink();
1288
1365
  break;
1289
1366
 
1367
+ case "ask_user_pending":
1368
+ renderAskUserQuestion(msg.toolId, msg.input);
1369
+ startUrgentBlink();
1370
+ break;
1371
+
1290
1372
  case "permission_request_pending":
1373
+ store.set({ turnActivity: null });
1291
1374
  setActivity(null);
1292
1375
  renderPermissionRequest(msg.requestId, msg.toolName, msg.toolInput, msg.decisionReason, msg.mateId, msg.vendor, msg);
1293
1376
  startUrgentBlink();
1294
1377
  break;
1295
1378
 
1296
1379
  case "elicitation_request":
1380
+ store.set({ turnActivity: null });
1381
+ setActivity(null);
1297
1382
  renderElicitationRequest(msg);
1298
1383
  startUrgentBlink();
1299
1384
  break;
@@ -1308,6 +1393,8 @@ export function processMessage(msg) {
1308
1393
  break;
1309
1394
 
1310
1395
  case "user_dialog_request":
1396
+ store.set({ turnActivity: null });
1397
+ setActivity(null);
1311
1398
  renderUserDialogRequest(msg);
1312
1399
  startUrgentBlink();
1313
1400
  break;
@@ -1373,7 +1460,7 @@ export function processMessage(msg) {
1373
1460
  finalizeAssistantBlock();
1374
1461
  addTurnMeta(msg.cost, msg.duration);
1375
1462
  accumulateUsage(msg.cost, msg.usage);
1376
- accumulateContext(msg.cost, msg.usage, msg.modelUsage, msg.lastStreamInputTokens);
1463
+ accumulateContext(msg.cost, msg.usage, msg.modelUsage, msg.lastStreamInputTokens, msg.context);
1377
1464
  break;
1378
1465
 
1379
1466
  case "context_usage":
@@ -1386,6 +1473,7 @@ export function processMessage(msg) {
1386
1473
  break;
1387
1474
 
1388
1475
  case "done":
1476
+ store.set({ turnActivity: null });
1389
1477
  removeMatePreThinking();
1390
1478
  setActivity(null);
1391
1479
  finishThinkingTurn();
@@ -1409,6 +1497,7 @@ export function processMessage(msg) {
1409
1497
  break;
1410
1498
 
1411
1499
  case "error":
1500
+ store.set({ turnActivity: null });
1412
1501
  removeMatePreThinking();
1413
1502
  setActivity(null);
1414
1503
  finishThinkingTurn();
@@ -1633,6 +1722,9 @@ export function processMessage(msg) {
1633
1722
  handleFileAt(msg);
1634
1723
  break;
1635
1724
 
1725
+ case "term_control_projection":
1726
+ handleTerminalProjection(msg);
1727
+ break;
1636
1728
  case "term_list":
1637
1729
  handleTermList(msg);
1638
1730
  updateTerminalList(msg.terminals);
@@ -1697,6 +1789,7 @@ export function processMessage(msg) {
1697
1789
  store.set({ pendingTermCommand: null });
1698
1790
  // Small delay to let terminal initialize
1699
1791
  setTimeout(function() {
1792
+ if (!paneCallbackCurrent(msg.paneActivation)) return;
1700
1793
  sendTerminalCommand(cmd);
1701
1794
  }, 300);
1702
1795
  }
@@ -1737,6 +1830,10 @@ export function processMessage(msg) {
1737
1830
  handleNoteUpdated(msg);
1738
1831
  break;
1739
1832
 
1833
+ case "note_update_result":
1834
+ handleNoteUpdateResult(msg);
1835
+ break;
1836
+
1740
1837
  case "note_written":
1741
1838
  showToast((msg.byTitle || "Agent") + ' left a note: "' + (msg.preview || "") + '"');
1742
1839
  handleNoteWritten(msg);
@@ -1951,6 +2048,7 @@ export function processMessage(msg) {
1951
2048
  // Sync dmTargetUser so subsequent renders use fresh data
1952
2049
  var mp2 = msg.mate.profile || {};
1953
2050
  store.get('dmTargetUser').displayName = mp2.displayName || msg.mate.name || store.get('dmTargetUser').displayName;
2051
+ store.get('dmTargetUser').avatarCatalogId = mp2.avatarCatalogId || '';
1954
2052
  store.get('dmTargetUser').avatarStyle = mp2.avatarStyle || store.get('dmTargetUser').avatarStyle;
1955
2053
  store.get('dmTargetUser').avatarSeed = mp2.avatarSeed || store.get('dmTargetUser').avatarSeed;
1956
2054
  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");
@@ -26,8 +26,7 @@ function getVendorLoginCommand(vendor) {
26
26
  var vendors = store.get('vendorInfo') || {};
27
27
  var info = vendors[vendor];
28
28
  if (info && info.loginCommand) return info.loginCommand;
29
- var fallbacks = { codex: "codex login --device-auth", claude: "claude login" };
30
- return fallbacks[vendor] || fallbacks.claude;
29
+ return "";
31
30
  }
32
31
 
33
32
  // --- Pending TUI attention tracking ---
@@ -135,7 +134,7 @@ function showBanner(notif, autoDismissMs) {
135
134
 
136
135
  var banner = document.createElement("div");
137
136
  banner.className = "notif-banner" + (isAuthRequired ? " notif-banner-update notif-banner-auth" : isPermission ? " notif-banner-permission" : isUserMention ? " notif-banner-user-mention" : "");
138
- if (!isEmpty) banner.setAttribute("data-notif-id", notif.id);
137
+ if (!isEmpty) { banner.setAttribute("data-notif-id", notif.id); banner.dataset.controlRevision = notif.controlRevision || ""; }
139
138
  if (isAuthRequired) banner.setAttribute("data-auth-banner", "true");
140
139
 
141
140
  var iconHtmlStr = userMentionAvatarSrc
@@ -470,7 +469,12 @@ export function getPendingTuiAttention(slug) {
470
469
  }
471
470
 
472
471
  export function handleNotificationsState(msg) {
473
- notifications = msg.notifications || [];
472
+ notifications = msg.notifications || []; store.set({ clayControlNotifications: notifications });
473
+ // Authoritative snapshots also withdraw banners removed by reviewed canonical actions.
474
+ if (bannerContainer) Array.from(bannerContainer.querySelectorAll('[data-notif-id]')).forEach(function (banner) {
475
+ var id = banner.dataset.notifId;
476
+ if (id.charAt(0) !== '_' && !notifications.some(function (item) { return item.id === id; })) removeBanner(banner);
477
+ });
474
478
  unreadCount = msg.unreadCount || 0;
475
479
  updateBadge();
476
480
 
@@ -501,6 +505,7 @@ export function handleNotificationsState(msg) {
501
505
 
502
506
  export function handleNotificationCreated(msg) {
503
507
  var notif = msg.notification;
508
+ store.set({ clayControlNotifications: [notif].concat((store.get("clayControlNotifications") || []).filter(function (item) { return item.id !== notif.id; })) });
504
509
 
505
510
  // Auto-dismiss if it's for the session the user is currently viewing
506
511
  var activeSession = store.get('activeSessionId') || null;
@@ -511,6 +516,7 @@ export function handleNotificationCreated(msg) {
511
516
  }
512
517
 
513
518
  notifications.unshift(notif);
519
+ store.set({ clayControlNotifications: notifications });
514
520
  unreadCount = msg.unreadCount;
515
521
  updateBadge();
516
522
 
@@ -568,7 +574,7 @@ export function handleNotificationDismissed(msg) {
568
574
  }
569
575
 
570
576
  export function handleNotificationDismissedAll() {
571
- notifications = [];
577
+ notifications = []; store.set({ clayControlNotifications: [] });
572
578
  unreadCount = 0;
573
579
  updateBadge();
574
580
  if (bannerContainer) bannerContainer.innerHTML = "";