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
@@ -0,0 +1,215 @@
1
+ // vendor-usage-model.js - Pure projection of the owner-scoped vendor usage
2
+ // overview into what the top bar shows. No DOM, store or network access.
3
+ //
4
+ // Principle: a value is shown only if it was observed. A missing observation is
5
+ // "Unknown", never 0%. Ages are measured from the server's own clock so a
6
+ // skewed browser clock cannot make an old observation look fresh.
7
+
8
+ import { formatMetric, pickHeadline } from "./vendor-usage-format.js";
9
+
10
+ var STALE_AFTER_MS = 15 * 60 * 1000;
11
+ var WARNING_PERCENT = 80;
12
+
13
+ var TYPE_LABELS = {
14
+ five_hour: "5h",
15
+ seven_day: "7d",
16
+ seven_day_opus: "7d Opus",
17
+ seven_day_sonnet: "7d Sonnet",
18
+ overage: "Extra usage",
19
+ seven_day_overage_included: "7d included extra usage",
20
+ };
21
+
22
+ export function estimatedServerNow(overview, nowMs) {
23
+ if (!overview || !Number.isFinite(overview.serverNowMs) || !Number.isFinite(overview.receivedAtMs)) return nowMs;
24
+ return overview.serverNowMs + (nowMs - overview.receivedAtMs);
25
+ }
26
+
27
+ export function ageText(ms) {
28
+ if (!Number.isFinite(ms) || ms < 0) return "";
29
+ var minutes = Math.floor(ms / 60000);
30
+ if (minutes < 1) return "just now";
31
+ if (minutes < 60) return minutes + "m ago";
32
+ var hours = Math.floor(minutes / 60);
33
+ if (hours < 48) return hours + "h ago";
34
+ return Math.floor(hours / 24) + "d ago";
35
+ }
36
+
37
+ export function durationText(ms) {
38
+ if (!Number.isFinite(ms) || ms <= 0) return "";
39
+ var totalMinutes = Math.floor(ms / 60000);
40
+ var days = Math.floor(totalMinutes / 1440);
41
+ var hours = Math.floor((totalMinutes % 1440) / 60);
42
+ var minutes = totalMinutes % 60;
43
+ if (days >= 2) return days + "d " + hours + "h";
44
+ if (totalMinutes >= 60) return Math.floor(totalMinutes / 60) + "h " + minutes + "m";
45
+ return Math.max(1, minutes) + "m";
46
+ }
47
+
48
+ export function windowLabel(entry, vendor) {
49
+ var label;
50
+ if (entry.kind === "reset") {
51
+ label = TYPE_LABELS[entry.rateLimitType] || entry.rateLimitType || "Usage";
52
+ } else {
53
+ var mins = entry.windowDurationMins;
54
+ if (!Number.isFinite(mins) || mins <= 0) label = "Usage";
55
+ else if (mins % 1440 === 0) label = (mins / 1440) + "d";
56
+ else if (mins % 60 === 0) label = (mins / 60) + "h";
57
+ else label = mins + "m";
58
+ }
59
+ // A separate limit bucket (for example a model-specific one) keeps its name.
60
+ if (entry.limitId && entry.limitId !== vendor) label += " (" + entry.limitId + ")";
61
+ return label;
62
+ }
63
+
64
+ function percentOf(entry) {
65
+ return Number.isFinite(entry.usedPercent) ? entry.usedPercent : null;
66
+ }
67
+
68
+ function windowView(entry, vendor, serverNow) {
69
+ var percent = percentOf(entry);
70
+ var resetText = entry.resetsAt ? durationText(entry.resetsAt - serverNow) : "";
71
+ var warn = (percent !== null && percent >= WARNING_PERCENT) || entry.status === "allowed_warning" || entry.status === "rejected";
72
+ var observed = Number.isFinite(entry.observedAtMs) ? serverNow - entry.observedAtMs : null;
73
+ return {
74
+ label: windowLabel(entry, vendor),
75
+ percent: percent,
76
+ percentText: percent === null ? "" : Math.round(percent) + "% used",
77
+ resetText: resetText,
78
+ resetsAt: entry.resetsAt || null,
79
+ warning: warn,
80
+ observedAgeMs: observed,
81
+ observedText: observed === null ? "observation time unknown" : "observed " + ageText(observed),
82
+ origin: entry.origin === "history" ? "history" : "live",
83
+ };
84
+ }
85
+
86
+ var MAX_CHIPS = 3;
87
+
88
+ function capabilityOf(info, entry) {
89
+ if (entry && entry.capability) return entry.capability;
90
+ // An older server without capabilities: only the observed path exists.
91
+ return { mode: info && info.rateLimitTracking === true ? "event" : "unintegrated", observed: info && info.rateLimitTracking === true, units: [] };
92
+ }
93
+
94
+ function accountRows(account, serverNow) {
95
+ if (!account || !Array.isArray(account.metrics)) return [];
96
+ var age = Number.isFinite(account.fetchedAtMs) ? serverNow - account.fetchedAtMs : null;
97
+ var stale = account.stale === true || (age !== null && age >= STALE_AFTER_MS);
98
+ return account.metrics.map(function (metric) {
99
+ var row = formatMetric(metric);
100
+ row.resetText = row.resetsAtMs ? durationText(row.resetsAtMs - serverNow) : "";
101
+ row.expired = !!(row.resetsAtMs && row.resetsAtMs <= serverNow);
102
+ row.stale = stale;
103
+ row.source = "account";
104
+ row.observedAgeMs = age;
105
+ row.observedText = age === null ? "read time unknown" : "read " + ageText(age);
106
+ return row;
107
+ }).filter(function (row) { return !row.expired; });
108
+ }
109
+
110
+ // Why a vendor has no figures, in the vendor's own terms.
111
+ function statusLine(cap, account, hasObserved) {
112
+ if (cap.mode === "unintegrated" || cap.mode === "unsupported") return cap.reason || "Not integrated: no verified usage source.";
113
+ var status = account && account.status;
114
+ if (account && account.fetching) return "Checking account usage\u2026";
115
+ if (status === "refused") return account.message || "Account usage is not available for you.";
116
+ if (status === "no_auth") return "Not signed in, so account usage cannot be read.";
117
+ if (status === "expired_auth") return "Sign-in has expired; run the vendor CLI once to refresh it.";
118
+ if (status === "error") return (account.message || "Account usage could not be read.") + (Number.isFinite(account.retryAtMs) ? " Will retry later." : "");
119
+ if (cap.mode === "query" && (!status || status === "idle")) return "Not checked yet.";
120
+ if (!hasObserved) return cap.mode === "event" ? "Waiting for a report from one of your sessions. Usage is unknown, not zero." : "No usage reported. Usage is unknown, not zero.";
121
+ return "";
122
+ }
123
+
124
+ // Returns the display model for one vendor, or null when it is not installed.
125
+ // The headline value, its label and its age always describe the same row: a
126
+ // stale high row is never presented with the freshness of a different one.
127
+ export function describeVendor(vendor, info, entry, overview, nowMs) {
128
+ if (!info) return null;
129
+ if (entry && entry.installed === false) return null;
130
+ var cap = capabilityOf(info, entry);
131
+ var serverNow = estimatedServerNow(overview, nowMs);
132
+ var name = info.displayName || vendor;
133
+ var meta = info.usageDashboard || null;
134
+ var observed = [];
135
+ if (entry && Array.isArray(entry.windows)) {
136
+ entry.windows.forEach(function (raw) {
137
+ if (raw.resetsAt && raw.resetsAt <= serverNow) return;
138
+ var row = windowView(raw, vendor, serverNow);
139
+ row.source = "session";
140
+ observed.push(row);
141
+ });
142
+ }
143
+ var account = entry && entry.account ? entry.account : null;
144
+ var accounts = accountRows(account, serverNow);
145
+ var lastSeenAge = entry && Number.isFinite(entry.lastObservedAtMs) ? serverNow - entry.lastObservedAtMs : null;
146
+ var chosen = null;
147
+ var fromAccount = accounts.length > 0 && !(accounts[0].stale && observed.length > 0);
148
+ if (fromAccount) {
149
+ chosen = pickHeadline(accounts);
150
+ chosen.percentText = chosen.percent === null ? "" : Math.round(chosen.percent) + "% used";
151
+ } else {
152
+ observed.forEach(function (row) { if (row.percent !== null && (chosen === null || row.percent > chosen.percent)) chosen = row; });
153
+ if (!chosen) observed.forEach(function (row) { if (row.resetText && (chosen === null || row.resetsAt < chosen.resetsAt)) chosen = row; });
154
+ if (!chosen && observed.length) chosen = observed[0];
155
+ if (!chosen && accounts.length) { chosen = pickHeadline(accounts); fromAccount = true; }
156
+ }
157
+ var known = chosen !== null;
158
+ var rows = accounts.concat(observed);
159
+ var warning = rows.some(function (row) { return row.warning; });
160
+ var text = "Unknown";
161
+ var summary = name + " usage unknown";
162
+ var stale = false;
163
+ if (known) {
164
+ var chosenAge = chosen.observedAgeMs;
165
+ var headline = fromAccount ? chosen.headline : (chosen.percent !== null ? Math.round(chosen.percent) + "%" : chosen.resetText ? "resets " + chosen.resetText : "Observed");
166
+ text = headline;
167
+ stale = fromAccount ? chosen.stale === true : (chosenAge !== null && chosenAge >= STALE_AFTER_MS);
168
+ if (chosenAge === null) text += " \u00b7 age unknown";
169
+ else if (stale) text += " \u00b7 " + ageText(chosenAge);
170
+ var pieces = [name + " " + chosen.label + " usage"];
171
+ if (fromAccount) pieces.push(chosen.value);
172
+ else if (chosen.percent !== null) pieces.push(Math.round(chosen.percent) + "% used");
173
+ else if (chosen.resetText) pieces.push("resets in " + chosen.resetText);
174
+ pieces.push(fromAccount ? "account, " + chosen.observedText : chosen.observedText);
175
+ summary = pieces.join(", ");
176
+ }
177
+ var others = entry && Number.isFinite(entry.otherSourceCount) ? entry.otherSourceCount : 0;
178
+ return {
179
+ vendor: vendor, name: name, mode: cap.mode, capability: cap, known: known, warning: warning, stale: stale,
180
+ text: text, summary: summary, rows: rows, accountCount: accounts.length, observedCount: observed.length,
181
+ status: statusLine(cap, account, observed.length > 0 || accounts.length > 0),
182
+ accountSource: cap.source || "",
183
+ sourceSessionId: entry && entry.sourceSessionId !== undefined ? entry.sourceSessionId : null,
184
+ otherSourceCount: others,
185
+ lastObservedText: lastSeenAge === null ? "" : ageText(lastSeenAge),
186
+ href: meta && meta.href || "", linkTitle: meta && meta.title || "", icon: meta && meta.icon || info.avatar || "",
187
+ };
188
+ }
189
+
190
+ // Every installed vendor, in registry order. Nothing is shown until the server
191
+ // has answered for this project and user.
192
+ export function allVendors(vendorInfo, overview, nowMs) {
193
+ if (!overview) return [];
194
+ var infos = vendorInfo || {};
195
+ var byVendor = {};
196
+ (Array.isArray(overview.vendors) ? overview.vendors : []).forEach(function (entry) { byVendor[entry.vendor] = entry; });
197
+ var result = [];
198
+ Object.keys(infos).forEach(function (vendor) {
199
+ // Without a server entry only a tracked vendor is listed (older servers).
200
+ if (!byVendor[vendor] && infos[vendor].rateLimitTracking !== true) return;
201
+ var view = describeVendor(vendor, infos[vendor], byVendor[vendor], overview, nowMs);
202
+ if (view) result.push(view);
203
+ });
204
+ return result;
205
+ }
206
+
207
+ // Compact bar: chips only for vendors that have figures (warnings first, then
208
+ // registry order, at most MAX_CHIPS); everything else lives in the list.
209
+ export function overviewVendors(vendorInfo, overview, nowMs) {
210
+ var all = allVendors(vendorInfo, overview, nowMs);
211
+ var withData = all.filter(function (view) { return view.known; });
212
+ var ordered = withData.filter(function (v) { return v.warning; }).concat(withData.filter(function (v) { return !v.warning; }));
213
+ var shown = ordered.slice(0, MAX_CHIPS);
214
+ return all.filter(function (view) { return shown.indexOf(view) !== -1; });
215
+ }
@@ -0,0 +1,312 @@
1
+ // vendor-usage-overview.js - Top-bar usage overview for every tracked vendor.
2
+ //
3
+ // This is a read-only projection of the owner-scoped `vendor_usage_overview`
4
+ // message. It sits beside the existing active-session usage pill and never
5
+ // touches rejection, warning or scheduling state in app-rate-limit.js.
6
+
7
+ import { store } from './store.js';
8
+ import { getWs } from './ws-ref.js';
9
+ import { iconHtml, refreshIcons } from './icons.js';
10
+ import { overviewVendors, allVendors } from './vendor-usage-model.js';
11
+ import { fillListPopover } from './vendor-usage-list.js';
12
+
13
+ var LIST_KEY = "__all";
14
+
15
+ var groupEl = null;
16
+ var records = {};
17
+ var tickTimer = null;
18
+ var outsideHandler = null;
19
+ var keyHandler = null;
20
+ var requestCounter = 0;
21
+ var pendingRequestId = null;
22
+
23
+ // `refresh` asks the server to read account usage for vendors that support it;
24
+ // the server caches, so repeating it is cheap. Replies echo the request id.
25
+ function requestOverview(refresh) {
26
+ var ws = getWs();
27
+ if (!ws || ws.readyState !== 1) return;
28
+ pendingRequestId = "vu-" + (++requestCounter) + "-" + Date.now().toString(36);
29
+ var message = { type: "vendor_usage_get", slug: store.get('currentSlug') || undefined, requestId: pendingRequestId };
30
+ if (refresh) message.refresh = true;
31
+ ws.send(JSON.stringify(message));
32
+ }
33
+
34
+ // A reply is shown only for the project, user and request it was asked for.
35
+ // A delayed reply from before a project or account change is dropped.
36
+ export function handleVendorUsageOverview(msg) {
37
+ if (!msg || msg.error) return;
38
+ var slug = store.get('currentSlug');
39
+ if (slug && msg.slug !== slug) return;
40
+ if ((msg.userId || null) !== (store.get('myUserId') || null)) return;
41
+ if (msg.requestId !== undefined && msg.requestId !== pendingRequestId) return;
42
+ var vendors = Array.isArray(msg.vendors) ? msg.vendors : [];
43
+ store.set({ vendorUsageOverview: { slug: msg.slug, serverNowMs: msg.serverNowMs, receivedAtMs: Date.now(), vendors: vendors } });
44
+ }
45
+
46
+ function el(tag, className, text) {
47
+ var node = document.createElement(tag);
48
+ if (className) node.className = className;
49
+ if (text !== undefined) node.textContent = text;
50
+ return node;
51
+ }
52
+
53
+ function closePopover(restoreFocus) {
54
+ var open = store.get('vendorUsageOpen');
55
+ if (!open) return;
56
+ store.set({ vendorUsageOpen: null });
57
+ var record = records[open];
58
+ if (restoreFocus && record && typeof record.chip.focus === "function") record.chip.focus();
59
+ }
60
+
61
+ function sourceNote(view) {
62
+ var note = view.lastObservedText ? "Latest report " + view.lastObservedText : "Not observed yet in this project";
63
+ if (view.sourceSessionId !== null && view.sourceSessionId !== undefined) note += " from session #" + view.sourceSessionId;
64
+ note += ".";
65
+ if (view.otherSourceCount > 0) note += " " + view.otherSourceCount + " other session" + (view.otherSourceCount === 1 ? "" : "s") + " reported separately and are not combined.";
66
+ return note;
67
+ }
68
+
69
+ function ensurePopover(record, view) {
70
+ if (!record.pop) {
71
+ var pop = el("div", "vendor-usage-popover");
72
+ pop.setAttribute("role", "dialog");
73
+ record.title = el("div", "vendor-usage-popover-title");
74
+ record.rows = el("div", "vendor-usage-rows");
75
+ record.notes = el("div", "vendor-usage-notes");
76
+ pop.appendChild(record.title);
77
+ pop.appendChild(record.rows);
78
+ pop.appendChild(record.notes);
79
+ // The link is created once and only updated, so keyboard focus on it
80
+ // survives refreshes.
81
+ record.link = el("a", "vendor-usage-link");
82
+ record.link.target = "_blank";
83
+ record.link.rel = "noopener";
84
+ record.linkLabel = el("span", "", "Open usage dashboard");
85
+ record.link.appendChild(record.linkLabel);
86
+ record.link.insertAdjacentHTML("beforeend", iconHtml("external-link"));
87
+ pop.appendChild(record.link);
88
+ record.item.appendChild(pop);
89
+ record.pop = pop;
90
+ }
91
+ record.pop.setAttribute("aria-label", view.name + " usage");
92
+ record.title.textContent = view.name;
93
+ record.rows.textContent = "";
94
+ view.rows.forEach(function (row) {
95
+ var line = el("div", "vendor-usage-row" + (row.warning ? " warning" : "") + (row.stale ? " stale" : ""));
96
+ line.appendChild(el("span", "vendor-usage-row-label", row.label));
97
+ var parts = [];
98
+ if (row.source === "account") { if (row.value) parts.push(row.value); } else if (row.percentText) parts.push(row.percentText);
99
+ if (row.resetText) parts.push("resets in " + row.resetText);
100
+ var value = el("span", "vendor-usage-row-value");
101
+ value.appendChild(el("span", "", parts.length ? parts.join(" \u00b7 ") : "Limit window"));
102
+ var origin = row.source === "account" ? "account, " : (row.origin === "history" ? "session record, " : "session, ");
103
+ value.appendChild(el("span", "vendor-usage-row-age", origin + row.observedText + (row.stale ? " (stale)" : "") + (row.origin === "history" ? " (earlier session record)" : "")));
104
+ line.appendChild(value);
105
+ record.rows.appendChild(line);
106
+ });
107
+ record.notes.textContent = "";
108
+ if (view.status) record.notes.appendChild(el("div", "vendor-usage-note", view.status));
109
+ if (view.accountCount > 0 && view.accountSource) record.notes.appendChild(el("div", "vendor-usage-note", "Account figures: " + view.accountSource + ". Units are the vendor's own and are not converted."));
110
+ if (view.observedCount > 0) {
111
+ record.notes.appendChild(el("div", "vendor-usage-note", sourceNote(view)));
112
+ record.notes.appendChild(el("div", "vendor-usage-note", "Session rows come from your own sessions in this project; another account or session may differ."));
113
+ }
114
+ if (view.href) {
115
+ if (record.link.getAttribute("href") !== view.href) record.link.href = view.href;
116
+ record.link.title = view.linkTitle || "";
117
+ record.link.style.display = "";
118
+ } else {
119
+ record.link.style.display = "none";
120
+ }
121
+ }
122
+
123
+ function removePopover(record) {
124
+ if (record.pop) { record.pop.remove(); record.pop = null; }
125
+ }
126
+
127
+ // The popover is absolutely positioned under its chip, right-aligned; a measured
128
+ // shift keeps it inside the viewport.
129
+ function placePopover(pop) {
130
+ if (typeof pop.getBoundingClientRect !== "function") return;
131
+ pop.style.marginRight = "";
132
+ var bounds = pop.getBoundingClientRect();
133
+ var viewport = document.documentElement.clientWidth;
134
+ var shift = bounds.left < 8 ? 8 - bounds.left : Math.min(0, viewport - 8 - bounds.right);
135
+ if (shift) pop.style.marginRight = (-shift) + "px";
136
+ }
137
+
138
+ function bindDismissal(open) {
139
+ if (open && !outsideHandler) {
140
+ outsideHandler = function (event) {
141
+ if (groupEl && !groupEl.contains(event.target)) closePopover(false);
142
+ };
143
+ keyHandler = function (event) {
144
+ if (event.key === "Escape") { closePopover(true); }
145
+ };
146
+ document.addEventListener("pointerdown", outsideHandler, true);
147
+ document.addEventListener("keydown", keyHandler, true);
148
+ } else if (!open && outsideHandler) {
149
+ document.removeEventListener("pointerdown", outsideHandler, true);
150
+ document.removeEventListener("keydown", keyHandler, true);
151
+ outsideHandler = null;
152
+ keyHandler = null;
153
+ }
154
+ }
155
+
156
+ function removeGroup() {
157
+ if (groupEl) { groupEl.remove(); groupEl = null; }
158
+ records = {};
159
+ bindDismissal(false);
160
+ if (tickTimer) { clearInterval(tickTimer); tickTimer = null; }
161
+ }
162
+
163
+ function createRecord(view) {
164
+ var item = el("span", "vendor-usage-item");
165
+ var chip = el("button", "top-bar-pill vendor-usage-chip");
166
+ chip.type = "button";
167
+ chip.setAttribute("data-vendor", view.vendor);
168
+ chip.setAttribute("aria-haspopup", "dialog");
169
+ var record = { item: item, chip: chip, icon: null, text: el("span", "vendor-usage-chip-text"), pop: null };
170
+ chip.appendChild(record.text);
171
+ chip.addEventListener("click", function () {
172
+ var opening = store.get('vendorUsageOpen') !== view.vendor;
173
+ store.set({ vendorUsageOpen: opening ? view.vendor : null });
174
+ if (opening) requestOverview(true);
175
+ });
176
+ item.appendChild(chip);
177
+ return record;
178
+ }
179
+
180
+ function updateChip(record, view, open) {
181
+ record.chip.className = "top-bar-pill vendor-usage-chip " + (view.warning ? "pill-warning" : "pill-dim") + (view.known ? "" : " unknown") + (view.stale ? " stale" : "");
182
+ record.chip.setAttribute("aria-expanded", open ? "true" : "false");
183
+ record.chip.setAttribute("aria-label", view.summary + ". Show details");
184
+ record.chip.title = view.summary;
185
+ if (view.icon) {
186
+ if (!record.icon) {
187
+ record.icon = el("img", "usage-check-vendor-icon");
188
+ record.icon.alt = "";
189
+ record.chip.insertBefore(record.icon, record.text);
190
+ }
191
+ if (record.icon.getAttribute("src") !== view.icon) record.icon.setAttribute("src", view.icon);
192
+ }
193
+ if (record.text.textContent !== view.text) record.text.textContent = view.text;
194
+ }
195
+
196
+ function updateListChip(record, listViews, open) {
197
+ var known = listViews.filter(function (view) { return view.known; }).length;
198
+ var summary = "Usage for " + listViews.length + " vendor" + (listViews.length === 1 ? "" : "s") + ", " + known + " with figures";
199
+ record.chip.className = "top-bar-pill vendor-usage-chip vendor-usage-list-chip pill-dim";
200
+ record.chip.setAttribute("aria-expanded", open ? "true" : "false");
201
+ record.chip.setAttribute("aria-label", summary + ". Show all vendors");
202
+ record.chip.title = summary;
203
+ if (!record.icon) {
204
+ record.icon = el("span", "vendor-usage-list-icon");
205
+ record.icon.insertAdjacentHTML("beforeend", iconHtml("gauge"));
206
+ record.chip.insertBefore(record.icon, record.text);
207
+ }
208
+ var text = known + "/" + listViews.length;
209
+ if (record.text.textContent !== text) record.text.textContent = text;
210
+ }
211
+
212
+ function ensureListPopover(record, listViews) {
213
+ if (!record.pop) {
214
+ var pop = el("div", "vendor-usage-popover vendor-usage-list-popover");
215
+ pop.setAttribute("role", "dialog");
216
+ pop.setAttribute("aria-label", "Usage by vendor");
217
+ record.title = el("div", "vendor-usage-popover-title", "Usage by vendor");
218
+ record.rows = el("div", "vendor-usage-rows");
219
+ pop.appendChild(record.title);
220
+ pop.appendChild(record.rows);
221
+ record.item.appendChild(pop);
222
+ record.pop = pop;
223
+ }
224
+ fillListPopover(record.rows, listViews, el);
225
+ }
226
+
227
+ // Updates stable elements in place. Chips, the popover and its link are never
228
+ // recreated while they stay relevant, so focus survives refreshes.
229
+ export function renderVendorUsageOverview() {
230
+ var actions = document.querySelector("#top-bar .top-bar-actions");
231
+ if (!actions) return;
232
+ var overview = store.get('vendorUsageOverview');
233
+ var info = store.get('vendorInfo');
234
+ var views = overviewVendors(info, overview, Date.now());
235
+ var listViews = allVendors(info, overview, Date.now());
236
+ if (listViews.length === 0) {
237
+ if (store.get('vendorUsageOpen')) store.set({ vendorUsageOpen: null });
238
+ removeGroup();
239
+ return;
240
+ }
241
+ var open = store.get('vendorUsageOpen');
242
+ if (open && open !== LIST_KEY && !views.some(function (view) { return view.vendor === open; })) {
243
+ open = null;
244
+ store.set({ vendorUsageOpen: null });
245
+ }
246
+ if (!groupEl) {
247
+ groupEl = el("div", "vendor-usage-overview");
248
+ groupEl.id = "vendor-usage-overview";
249
+ groupEl.setAttribute("role", "group");
250
+ groupEl.setAttribute("aria-label", "Vendor usage");
251
+ }
252
+ var anchor = document.getElementById("rate-limit-usage-link") || document.getElementById("skip-perms-pill");
253
+ if (groupEl.parentNode !== actions || groupEl.nextSibling !== anchor) actions.insertBefore(groupEl, anchor);
254
+ var present = {};
255
+ views.forEach(function (view, index) {
256
+ present[view.vendor] = true;
257
+ var record = records[view.vendor] || (records[view.vendor] = createRecord(view));
258
+ if (groupEl.children[index] !== record.item) groupEl.insertBefore(record.item, groupEl.children[index] || null);
259
+ updateChip(record, view, open === view.vendor);
260
+ if (open === view.vendor) {
261
+ var created = !record.pop;
262
+ ensurePopover(record, view);
263
+ placePopover(record.pop);
264
+ if (created) bindDismissal(true);
265
+ } else {
266
+ removePopover(record);
267
+ }
268
+ });
269
+ // The list entry is always last and reaches every installed vendor.
270
+ present[LIST_KEY] = true;
271
+ var listRecord = records[LIST_KEY] || (records[LIST_KEY] = createRecord({ vendor: LIST_KEY }));
272
+ if (groupEl.children[views.length] !== listRecord.item) groupEl.insertBefore(listRecord.item, groupEl.children[views.length] || null);
273
+ updateListChip(listRecord, listViews, open === LIST_KEY);
274
+ if (open === LIST_KEY) {
275
+ var listCreated = !listRecord.pop;
276
+ ensureListPopover(listRecord, listViews);
277
+ placePopover(listRecord.pop);
278
+ if (listCreated) bindDismissal(true);
279
+ } else {
280
+ removePopover(listRecord);
281
+ }
282
+ Object.keys(records).forEach(function (vendor) {
283
+ if (present[vendor]) return;
284
+ records[vendor].item.remove();
285
+ delete records[vendor];
286
+ });
287
+ if (!open) bindDismissal(false);
288
+ refreshIcons();
289
+ // Relative times only change slowly; one light timer keeps them honest.
290
+ if (!tickTimer) tickTimer = setInterval(renderVendorUsageOverview, 30000);
291
+ }
292
+
293
+ export function initVendorUsageOverview() {
294
+ store.subscribe(function (state, prev) {
295
+ var identityChanged = state.currentSlug !== prev.currentSlug || state.myUserId !== prev.myUserId;
296
+ if (identityChanged) {
297
+ // Another project or account must start unknown and ignore any reply
298
+ // that was requested before the change.
299
+ pendingRequestId = null;
300
+ if (state.vendorUsageOverview) {
301
+ store.set({ vendorUsageOverview: null, vendorUsageOpen: null });
302
+ if (state.connected) requestOverview(true);
303
+ return;
304
+ }
305
+ }
306
+ if (state.connected && (!prev.connected || identityChanged)) requestOverview(true);
307
+ if (state.vendorUsageOverview !== prev.vendorUsageOverview || state.vendorInfo !== prev.vendorInfo
308
+ || state.currentVendor !== prev.currentVendor || state.vendorUsageOpen !== prev.vendorUsageOpen) {
309
+ renderVendorUsageOverview();
310
+ }
311
+ });
312
+ }
@@ -1,3 +1,4 @@
1
+ import { forwardStudioPresentation, registerStudioPaint } from './clay-studio-render.js';
1
2
  import { sketchBrand, sketchCredit } from './wireframe-style.js';
2
3
  import { store } from './store.js';
3
4
  import { claimRightWorkbench, registerRightWorkbench, releaseRightWorkbench } from './right-workbench.js';
@@ -80,7 +81,7 @@ function createPanel() {
80
81
  export function openWireframe(message) {
81
82
  if (!message || typeof message.source !== 'string' || new TextEncoder().encode(message.source).length > 100000) return;
82
83
  if (store.get('paneMode') && window.parent !== window) {
83
- window.parent.postMessage({ type: 'clay-pane-present-wireframe', message: message, projectSlug: store.get('currentSlug'), sessionId: store.get('activeSessionId') }, window.location.origin);
84
+ forwardStudioPresentation(message, 'clay-pane-present-wireframe');
84
85
  return;
85
86
  }
86
87
  claimRightWorkbench('wireframe');
@@ -92,7 +93,8 @@ export function openWireframe(message) {
92
93
  el.querySelector('header strong').textContent = draft.title;
93
94
  el.querySelector('.wireframe-save-status').textContent = '';
94
95
  el.querySelector('form').hidden = true;
95
- draw(draft, el).catch(function () {});
96
+ var painted = draw(draft, el); registerStudioPaint(Object.assign({}, message, { source: draft.source }), el.querySelector("header"), painted, el.querySelector(".wireframe-workbench-canvas"));
97
+ painted.catch(function () {});
96
98
  }
97
99
  function draw(draft, el) {
98
100
  var canvas = el.querySelector('.wireframe-workbench-canvas');
@@ -104,6 +106,7 @@ function draw(draft, el) {
104
106
  var image = wireframeImage(svg, draft.title);
105
107
  canvas.replaceChildren(image);
106
108
  mountWireframeViewport(canvas, image, el.querySelector('.wireframe-zoom'));
109
+ return image.decode ? image.decode() : undefined;
107
110
  }).catch(function (error) {
108
111
  if (store.get('wireframeDraft') !== active) throw error;
109
112
  status.textContent = error.name === 'AbortError' ? 'Rendering was interrupted. Reopen the wireframe to retry.' : error.message;
@@ -0,0 +1,4 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Muse Code">
2
+ <rect width="64" height="64" rx="14" fill="#111827"/>
3
+ <path d="M14 45V19h7l11 14 10-14h8v26h-7V30L32 45 21 30v15z" fill="#f8fafc"/>
4
+ </svg>
@@ -6,15 +6,15 @@
6
6
  @import url("css/linear.css");
7
7
  @import url("css/base.css?v=20260828-type1");
8
8
  @import url("css/icon-strip.css?v=20260828-surfaces4");
9
- @import url("css/title-bar.css?v=20260828-project-header1");
9
+ @import url("css/title-bar.css?v=20261017-star4");
10
10
  @import url("css/clay-workspace.css?v=20261010-tint");
11
11
  @import url("css/pane.css");
12
12
  @import url("css/worker-proposal.css");
13
13
  @import url("css/workspace-assignment.css");
14
14
  @import url("css/session-actions.css?v=20260828-contrast1");
15
- @import url("css/sidebar.css?v=20260828-session-list3");
15
+ @import url("css/sidebar.css?v=20261018-quick-appearance");
16
16
  @import url("css/session-folders.css");
17
- @import url("css/overlays.css?v=20260827-brand3");
17
+ @import url("css/overlays.css?v=20261017-usage2");
18
18
  @import url("css/menus.css");
19
19
  @import url("css/messages.css?v=20260828-delegated-muted1");
20
20
  @import url("css/generated-images.css?v=20260829-save-details1");
@@ -22,7 +22,7 @@
22
22
  @import url("css/elicitation-form.css");
23
23
  @import url("css/input.css?v=20261002-stop-inline1");
24
24
  @import url("css/pending-message-queue.css?v=20260914-queue1");
25
- @import url("css/filebrowser.css?v=20260829-terminal-canvas1");
25
+ @import url("css/filebrowser.css?v=20261018-browser-header1");
26
26
  @import url("css/git-panel.css");
27
27
  @import url("css/git-placard.css");
28
28
  @import url("css/diff.css");
@@ -59,15 +59,17 @@
59
59
  @import url("css/home-debate-planning.css");
60
60
  @import url("css/home-mate-creation.css");
61
61
  @import url("css/home-mate-settings.css");
62
+ @import url("css/mate-avatar-gallery.css");
62
63
  @import url("css/home-mate-model-picker.css");
63
- @import url("css/project-mate-creation.css");
64
+ @import url("css/project-mate-creation.css?v=20261018-clay-choices");
64
65
  @import url("css/home-debate-live.css");
65
66
  @import url("css/notifications-center.css");
66
67
  @import url("css/tui-attention.css?v=20260829-terminal-canvas1");
67
68
  @import url("css/pwa-mobile.css?v=20260824f");
68
69
  @import url("css/avatar-imprints.css?v=20260829-imprints1");
69
70
 
70
- @import url("css/projects-hub.css");
71
+ @import url("css/projects-hub.css?v=20261018-welcome-art");
72
+ @import url("css/project-start.css");
71
73
 
72
74
  @import url("./css/shared-browser.css");
73
75
 
@@ -87,3 +89,9 @@
87
89
  @import url("css/server-settings-system.css");
88
90
 
89
91
  @import url("css/project-settings-modal.css");
92
+ @import url("css/settings-shell.css");
93
+
94
+ @import url("css/clay-tool-activity.css");
95
+
96
+ @import url("css/contextual-clay.css?v=20261018-loading-scene");
97
+ @import url("css/mate-loading-scene.css");
package/lib/public/sw.js CHANGED
@@ -1,4 +1,4 @@
1
- var CACHE_NAME = "clay-offline-v4";
1
+ var CACHE_NAME = "clay-offline-v5";
2
2
 
3
3
  self.addEventListener("install", function (event) {
4
4
  event.waitUntil(self.skipWaiting());
@@ -23,6 +23,8 @@ self.addEventListener("activate", function (event) {
23
23
  function shouldCache(request, response) {
24
24
  if (request.method !== "GET") return false;
25
25
  if (!response || !response.ok) return false;
26
+ var cacheControl = response.headers && response.headers.get("Cache-Control") || "";
27
+ if (/(^|,)\s*(private|no-store)(?:\s*=\s*[^,]*)?(?=\s*(?:,|$))/i.test(cacheControl)) return false;
26
28
  // Cache same-origin static assets and CDN resources (jsdelivr, fonts)
27
29
  var url = new URL(request.url);
28
30
  if (url.origin === self.location.origin) return true;