clay-server 5.2.0-beta.4 → 5.2.0-beta.6

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 (301) hide show
  1. package/lib/account-auth-socket.js +1 -0
  2. package/lib/builtin-mates.js +17 -14
  3. package/lib/canonical-clay-record-authority.js +15 -0
  4. package/lib/canonical-clay-scheduling-authority.js +19 -0
  5. package/lib/claude-hook-installer.js +1 -239
  6. package/lib/claude-jsonl-watcher.js +1 -204
  7. package/lib/clay-mate-chat-receipts.js +26 -0
  8. package/lib/clay-mate-chat.js +87 -0
  9. package/lib/clay-mate-knowledge-input.js +26 -0
  10. package/lib/clay-mate-knowledge.js +95 -0
  11. package/lib/clay-mate-lifecycle.js +95 -0
  12. package/lib/clay-product-control-input.js +33 -0
  13. package/lib/clay-product-control-tools.js +51 -0
  14. package/lib/clay-product-control.js +237 -0
  15. package/lib/clay-project-lifecycle.js +154 -0
  16. package/lib/clay-project-record-input.js +44 -0
  17. package/lib/clay-project-records.js +83 -0
  18. package/lib/clay-scheduling-input.js +21 -0
  19. package/lib/clay-scheduling-receipts.js +26 -0
  20. package/lib/clay-scheduling.js +119 -0
  21. package/lib/clay-screen-controls.js +96 -0
  22. package/lib/clay-skill-install.js +1 -33
  23. package/lib/clay-workspace-controls.js +83 -0
  24. package/lib/clay-workspace-input.js +17 -0
  25. package/lib/clay-workspace-receipts.js +26 -0
  26. package/lib/cli-sessions.js +1 -300
  27. package/lib/codex-defaults.js +1 -28
  28. package/lib/context-usage.js +3 -2
  29. package/lib/daemon-project-access.js +11 -0
  30. package/lib/daemon-project-lifecycle-callbacks.js +15 -0
  31. package/lib/daemon-project-lifecycle.js +262 -0
  32. package/lib/daemon-projects.js +1 -1
  33. package/lib/daemon.js +78 -276
  34. package/lib/default-ai-runtime.js +4 -8
  35. package/lib/email-mcp-server.js +1 -1
  36. package/lib/issues-service.js +29 -15
  37. package/lib/kiro-defaults.js +1 -22
  38. package/lib/knowledge-db-import.js +5 -4
  39. package/lib/knowledge-db-service.js +9 -6
  40. package/lib/knowledge-document-index.js +2 -1
  41. package/lib/knowledge-product-operations.js +46 -0
  42. package/lib/mate-creation-mcp-server.js +2 -0
  43. package/lib/mate-knowledge-canonical-access.js +10 -0
  44. package/lib/mate-knowledge-service.js +7 -4
  45. package/lib/mate-lifecycle-service.js +94 -0
  46. package/lib/mate-message-delivery.js +43 -0
  47. package/lib/mate-ready-creation.js +9 -1
  48. package/lib/mate-schedule-input.js +29 -0
  49. package/lib/mate-schedule-lifecycle.js +151 -0
  50. package/lib/mate-scheduling.js +103 -0
  51. package/lib/mates.js +4 -3
  52. package/lib/mcp-proxy.js +2 -32
  53. package/lib/mcp-query-bridge.js +1 -1
  54. package/lib/mcp-source-adapters.js +1 -91
  55. package/lib/mcp-source-context.js +1 -42
  56. package/lib/mcp-source-discovery.js +1 -169
  57. package/lib/mcp-source-plugins.js +1 -68
  58. package/lib/mcp-source-restrictions.js +1 -47
  59. package/lib/mcp-tool-policy.js +1 -26
  60. package/lib/notes-checklist.js +50 -0
  61. package/lib/notes.js +49 -3
  62. package/lib/os-user-diagnostics.js +2 -4
  63. package/lib/os-users.js +24 -70
  64. package/lib/project-admin-overview.js +51 -0
  65. package/lib/project-ask-user.js +4 -2
  66. package/lib/project-connection.js +8 -7
  67. package/lib/project-delegated-follow-up.js +2 -1
  68. package/lib/project-directory-claim.js +65 -0
  69. package/lib/project-file-operations.js +61 -0
  70. package/lib/project-filesystem.js +13 -87
  71. package/lib/project-full-access.js +23 -2
  72. package/lib/project-http.js +4 -4
  73. package/lib/project-knowledge.js +32 -18
  74. package/lib/project-lifecycle-operations.js +98 -0
  75. package/lib/project-lifecycle-process-witness.js +32 -0
  76. package/lib/project-lifecycle-runtime.js +50 -0
  77. package/lib/project-linux-access.js +22 -0
  78. package/lib/project-logs-canonical-clay.js +27 -0
  79. package/lib/project-logs-clay-query.js +16 -0
  80. package/lib/project-logs-schema.js +4 -2
  81. package/lib/project-logs-service.js +8 -7
  82. package/lib/project-logs.js +1 -0
  83. package/lib/project-loop.js +1 -0
  84. package/lib/project-mate-chat-control.js +55 -0
  85. package/lib/project-mate-creation-proposal.js +18 -3
  86. package/lib/project-mcp.js +2 -2
  87. package/lib/project-models.js +14 -31
  88. package/lib/project-notifications.js +74 -16
  89. package/lib/project-ownership.js +77 -0
  90. package/lib/project-pair-result-delivery.js +14 -3
  91. package/lib/project-pair-usage.js +12 -13
  92. package/lib/project-pending-message-queue.js +4 -1
  93. package/lib/project-product-control.js +87 -0
  94. package/lib/project-product-session-queue.js +46 -0
  95. package/lib/project-push-access.js +28 -0
  96. package/lib/project-scheduled-message-queue.js +30 -0
  97. package/lib/project-scheduled-messages.js +63 -64
  98. package/lib/project-scheduled-task-control.js +83 -0
  99. package/lib/project-scheduled-tasks.js +13 -2
  100. package/lib/project-scheduling-access.js +10 -0
  101. package/lib/project-session-actions.js +65 -0
  102. package/lib/project-session-delete.js +8 -1
  103. package/lib/project-session-github.js +47 -12
  104. package/lib/project-session-history-actions.js +167 -0
  105. package/lib/project-session-pair.js +1 -1
  106. package/lib/project-session-runtime-actions.js +64 -0
  107. package/lib/project-session-spawn.js +2 -3
  108. package/lib/project-session-vendor.js +55 -0
  109. package/lib/project-sessions.js +82 -267
  110. package/lib/project-user-message.js +31 -1
  111. package/lib/project-vendor-login.js +6 -36
  112. package/lib/project-workspace-operations.js +126 -0
  113. package/lib/project-workspace-query.js +9 -2
  114. package/lib/project.js +95 -3
  115. package/lib/public/app.js +1 -0
  116. package/lib/public/css/clay-tool-activity.css +51 -0
  117. package/lib/public/css/home-mate-creation.css +5 -0
  118. package/lib/public/css/messages.css +6 -2
  119. package/lib/public/css/overlays.css +4 -2
  120. package/lib/public/css/project-admin-overview.css +13 -0
  121. package/lib/public/css/session-folders.css +11 -0
  122. package/lib/public/css/session-github.css +3 -0
  123. package/lib/public/css/sticky-notes.css +61 -1
  124. package/lib/public/index.html +1 -1
  125. package/lib/public/modules/admin-settings-projects.js +6 -2
  126. package/lib/public/modules/app-connection.js +8 -1
  127. package/lib/public/modules/app-favicon.js +11 -2
  128. package/lib/public/modules/app-header.js +4 -2
  129. package/lib/public/modules/app-loop-ui.js +2 -0
  130. package/lib/public/modules/app-message-router.js +1 -1
  131. package/lib/public/modules/app-messages.js +54 -8
  132. package/lib/public/modules/app-notifications.js +1 -2
  133. package/lib/public/modules/app-panels.js +61 -123
  134. package/lib/public/modules/app-projects.js +5 -0
  135. package/lib/public/modules/app-rate-limit.js +7 -27
  136. package/lib/public/modules/chat-render-runtime.js +3 -0
  137. package/lib/public/modules/clay-owner-navigation.js +27 -0
  138. package/lib/public/modules/clay-tool-activity.js +140 -0
  139. package/lib/public/modules/clay-tool-presentation.js +338 -0
  140. package/lib/public/modules/command-palette.js +1 -1
  141. package/lib/public/modules/default-ai.js +11 -3
  142. package/lib/public/modules/home-debate-planning.js +5 -5
  143. package/lib/public/modules/home-mate-chat.js +8 -6
  144. package/lib/public/modules/home-mate-creation.js +73 -1
  145. package/lib/public/modules/mcp-connection-view.js +1 -1
  146. package/lib/public/modules/permission-control.js +5 -4
  147. package/lib/public/modules/personal-settings-dialog.js +7 -1
  148. package/lib/public/modules/project-access-recovery.js +17 -0
  149. package/lib/public/modules/project-admin-overview.js +21 -0
  150. package/lib/public/modules/scheduler.js +2 -0
  151. package/lib/public/modules/session-create-form.js +10 -10
  152. package/lib/public/modules/session-folder-layout.js +1 -1
  153. package/lib/public/modules/session-folder-view-menu.js +9 -0
  154. package/lib/public/modules/session-github.js +65 -8
  155. package/lib/public/modules/settings-defaults.js +27 -28
  156. package/lib/public/modules/sidebar-session-folders-ui.js +1 -1
  157. package/lib/public/modules/sticky-note-markdown.js +72 -6
  158. package/lib/public/modules/sticky-notes-actions.js +30 -0
  159. package/lib/public/modules/sticky-notes-browser.js +9 -2
  160. package/lib/public/modules/sticky-notes-card.js +23 -7
  161. package/lib/public/modules/sticky-notes-checklist.js +71 -0
  162. package/lib/public/modules/sticky-notes-editor.js +108 -44
  163. package/lib/public/modules/sticky-notes-shared.js +50 -2
  164. package/lib/public/modules/sticky-notes-state.js +66 -0
  165. package/lib/public/modules/sticky-notes.js +34 -51
  166. package/lib/public/modules/thinking-lifecycle.js +33 -3
  167. package/lib/public/modules/thinking-view.js +23 -1
  168. package/lib/public/modules/tools.js +36 -7
  169. package/lib/public/modules/tui-grab.js +1 -2
  170. package/lib/public/modules/user-settings-appearance.js +10 -3
  171. package/lib/public/modules/user-settings-editors.js +1 -1
  172. package/lib/public/modules/user-settings-layout.js +11 -2
  173. package/lib/public/modules/user-settings-preferences.js +6 -2
  174. package/lib/public/modules/user-settings-profile.js +12 -2
  175. package/lib/public/modules/user-settings.js +3 -2
  176. package/lib/public/modules/vendor-login-browser.js +5 -3
  177. package/lib/public/modules/vendor-login.js +2 -2
  178. package/lib/public/modules/vendor-priority.js +15 -1
  179. package/lib/public/muse-avatar.svg +4 -0
  180. package/lib/public/style.css +2 -0
  181. package/lib/safe-bash-commands.js +3 -45
  182. package/lib/scheduled-task-records.js +3 -1
  183. package/lib/scheduler.js +2 -0
  184. package/lib/sdk-bridge.js +334 -403
  185. package/lib/sdk-foreground-admission.js +16 -0
  186. package/lib/sdk-mcp-descriptors.js +2 -37
  187. package/lib/sdk-message-processor.js +52 -17
  188. package/lib/sdk-quota-snapshot.js +1 -1
  189. package/lib/sdk-response-recovery.js +1 -0
  190. package/lib/sdk-worker.js +2 -677
  191. package/lib/server-admin.js +63 -16
  192. package/lib/server-dm.js +1 -1
  193. package/lib/server-global-ws.js +10 -20
  194. package/lib/server-home-chat-events.js +7 -3
  195. package/lib/server-home-chat.js +4 -16
  196. package/lib/server-home-mate-creation.js +1 -0
  197. package/lib/server-home-mcp-consent.js +3 -3
  198. package/lib/server-mates.js +25 -67
  199. package/lib/server-owner-ui.js +77 -0
  200. package/lib/server-path-access.js +38 -0
  201. package/lib/server-project-removal.js +22 -0
  202. package/lib/server.js +100 -30
  203. package/lib/session-config-transition.js +45 -0
  204. package/lib/session-folders.js +7 -2
  205. package/lib/session-fork-history.js +21 -0
  206. package/lib/session-github.js +9 -2
  207. package/lib/session-hygiene.js +3 -35
  208. package/lib/session-permission-mode.js +4 -3
  209. package/lib/session-skill-scope.js +11 -0
  210. package/lib/session-visibility.js +5 -2
  211. package/lib/sessions.js +27 -89
  212. package/lib/terminal-manager.js +52 -0
  213. package/lib/tool-llm.js +1 -1
  214. package/lib/tui-transcript-index.js +1 -132
  215. package/lib/users-permissions.js +2 -8
  216. package/lib/users.js +4 -0
  217. package/lib/vendor-login-browser.js +1 -11
  218. package/lib/workspace-query-access.js +4 -1
  219. package/lib/ws-schema.js +8 -2
  220. package/lib/yoke/acp-agent-profiles.js +5 -3
  221. package/lib/yoke/adapters/antigravity.js +3 -14
  222. package/lib/yoke/adapters/claude-query-contract.js +9 -0
  223. package/lib/yoke/adapters/claude.js +54 -50
  224. package/lib/yoke/adapters/codex-query-contract.js +24 -0
  225. package/lib/yoke/adapters/codex.js +53 -111
  226. package/lib/yoke/adapters/kiro.js +3 -1
  227. package/lib/yoke/adapters/muse-query-contract.js +7 -0
  228. package/lib/yoke/adapters/muse.js +122 -0
  229. package/lib/yoke/auth-events.js +17 -0
  230. package/lib/yoke/claude-hook-installer.js +267 -0
  231. package/lib/yoke/claude-jsonl-watcher.js +204 -0
  232. package/lib/yoke/claude-maintenance.js +55 -0
  233. package/lib/yoke/claude-permission-patterns.js +53 -0
  234. package/lib/yoke/claude-response-recovery.js +155 -0
  235. package/lib/yoke/claude-transcript-hygiene.js +34 -0
  236. package/lib/yoke/claude-worker-startup.js +28 -0
  237. package/lib/yoke/clay-skill-install.js +33 -0
  238. package/lib/yoke/cli-sessions.js +300 -0
  239. package/lib/yoke/codex-app-server.js +7 -12
  240. package/lib/yoke/codex-idle-recovery.js +81 -1
  241. package/lib/yoke/codex-recovery-admission.js +164 -0
  242. package/lib/yoke/configuration.js +13 -0
  243. package/lib/yoke/discovery.js +70 -0
  244. package/lib/yoke/errors.js +8 -0
  245. package/lib/yoke/host-environment.js +7 -0
  246. package/lib/yoke/index.js +9 -51
  247. package/lib/yoke/interface.js +116 -0
  248. package/lib/yoke/kiro-acp-server.js +5 -5
  249. package/lib/yoke/legacy-sessions.js +89 -0
  250. package/lib/yoke/login-protocol.js +25 -0
  251. package/lib/yoke/maintenance.js +12 -0
  252. package/lib/yoke/mcp-proxy.js +32 -0
  253. package/lib/yoke/mcp-source-adapters.js +91 -0
  254. package/lib/yoke/mcp-source-context.js +42 -0
  255. package/lib/yoke/mcp-source-discovery.js +169 -0
  256. package/lib/yoke/mcp-source-plugins.js +68 -0
  257. package/lib/yoke/mcp-source-restrictions.js +47 -0
  258. package/lib/yoke/mcp-tool-policy-normalize.js +28 -0
  259. package/lib/yoke/model-preferences.js +6 -0
  260. package/lib/yoke/muse-artifacts.js +36 -0
  261. package/lib/yoke/muse-controls.js +50 -0
  262. package/lib/yoke/muse-input.js +64 -0
  263. package/lib/yoke/muse-items.js +157 -0
  264. package/lib/yoke/muse-policy.js +52 -0
  265. package/lib/yoke/muse-query.js +428 -0
  266. package/lib/yoke/muse-runtime.js +211 -0
  267. package/lib/yoke/muse-services.js +79 -0
  268. package/lib/yoke/muse-skills.js +79 -0
  269. package/lib/yoke/muse-turns.js +71 -0
  270. package/lib/yoke/options/acp.js +2 -0
  271. package/lib/yoke/options/antigravity.js +2 -0
  272. package/lib/yoke/options/claude.js +21 -0
  273. package/lib/yoke/options/codex-defaults.js +29 -0
  274. package/lib/yoke/options/codex-settings.js +21 -0
  275. package/lib/yoke/options/codex.js +6 -0
  276. package/lib/yoke/options/kiro-defaults.js +22 -0
  277. package/lib/yoke/options/kiro.js +5 -0
  278. package/lib/yoke/options/muse.js +5 -0
  279. package/lib/yoke/provider-contract.js +5 -0
  280. package/lib/yoke/providers/antigravity-executable.js +8 -0
  281. package/lib/yoke/providers/claude-executable.js +40 -0
  282. package/lib/yoke/providers/claude-model-descriptions.js +14 -0
  283. package/lib/yoke/providers/claude-process.js +97 -0
  284. package/lib/yoke/providers/claude-provision.js +75 -0
  285. package/lib/yoke/providers/codex-errors.js +8 -0
  286. package/lib/yoke/providers/muse-executable.js +17 -0
  287. package/lib/yoke/provisioning.js +6 -0
  288. package/lib/yoke/query-options.js +10 -0
  289. package/lib/yoke/response-recovery.js +41 -0
  290. package/lib/yoke/sdk-mcp-descriptors.js +37 -0
  291. package/lib/yoke/sdk-server-factory.js +7 -0
  292. package/lib/yoke/session-history.js +8 -0
  293. package/lib/yoke/session-tool-transport.js +34 -13
  294. package/lib/yoke/settings.js +23 -0
  295. package/lib/yoke/source-locations.js +4 -0
  296. package/lib/yoke/title-query.js +18 -7
  297. package/lib/yoke/tui-transcript-index.js +132 -0
  298. package/lib/yoke/usage.js +48 -0
  299. package/lib/yoke/user-input.js +13 -0
  300. package/lib/yoke/vendor-registry.js +81 -1
  301. package/package.json +3 -2
@@ -0,0 +1,13 @@
1
+ .project-admin-overview { overflow: auto; padding: 8px; }
2
+ .project-admin-canvas { width: 100%; min-height: 100%; padding: 24px; border: 1px solid var(--border); border-radius: 8px; background: var(--bg); }
3
+ .project-admin-canvas h1 { font-size: 20px; margin: 0 0 16px; }
4
+ .project-admin-canvas h2 { font-size: 16px; }
5
+ .project-admin-canvas [role="tablist"] { display: flex; gap: 4px; border-bottom: 1px solid var(--border); padding-bottom: 8px; }
6
+ .project-admin-canvas [role="tab"] { height: 32px; padding: 0 12px; border: 1px solid var(--border); border-radius: 8px; color: inherit; background: transparent; cursor: pointer; }
7
+ .project-admin-canvas [aria-selected="true"] { background: #5857fc; color: white; }
8
+ .project-admin-canvas :focus-visible { outline: 2px solid #5857fc; outline-offset: 2px; }
9
+ .project-admin-canvas dl { display: grid; grid-template-columns: 110px 1fr; gap: 12px; margin: 24px 0; font-size: 13px; }
10
+ .project-admin-canvas dd { margin: 0; }
11
+ .project-admin-canvas p { max-width: 640px; line-height: 1.6; font-size: 14px; }
12
+ .project-admin-secondary { opacity: .65; }
13
+ @media (max-width: 600px) { .project-admin-canvas { padding: 16px; } }
@@ -158,6 +158,16 @@
158
158
  .session-folder-viewmenu .session-folder-radio-dot { width: 12px; height: 12px; }
159
159
  .session-folder-viewmenu .session-folder-radio-legend { margin: 2px 0 1px 6px; font-size: 10px; text-transform: uppercase; letter-spacing: 0.4px; }
160
160
  .session-folder-viewmenu .session-folder-view-note { padding: 2px 6px 4px; font-size: 11px; line-height: 1.35; }
161
+ .session-folder-view-toggle {
162
+ display: flex; align-items: center; justify-content: space-between; gap: 10px; width: 100%; min-height: 30px; padding: 0 6px;
163
+ border: 0; border-radius: 6px; background: transparent; color: var(--text); font: inherit; font-size: 12.5px; text-align: left; cursor: pointer;
164
+ }
165
+ .session-folder-view-toggle:hover { background: rgba(var(--overlay-rgb), 0.08); }
166
+ .session-folder-view-toggle-track { position: relative; flex: none; width: 28px; height: 16px; border-radius: 999px; background: var(--text-dimmer); transition: background 0.15s ease; }
167
+ .session-folder-view-toggle-thumb { position: absolute; top: 2px; left: 2px; width: 12px; height: 12px; border-radius: 50%; background: var(--sidebar-bg); transition: transform 0.15s ease; }
168
+ .session-folder-view-toggle[aria-checked="true"] .session-folder-view-toggle-track { background: var(--accent); }
169
+ .session-folder-view-toggle[aria-checked="true"] .session-folder-view-toggle-thumb { transform: translateX(12px); }
170
+ .session-folder-view-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
161
171
  .session-folder-viewmenu .session-folder-radio-group.segmented {
162
172
  display: flex; gap: 2px; padding: 2px; margin-top: 2px; border-radius: 8px; background: rgba(var(--overlay-rgb), 0.05);
163
173
  }
@@ -167,6 +177,7 @@
167
177
  .session-folder-viewmenu.is-mobile { padding: 6px; }
168
178
  .session-folder-viewmenu.is-mobile .session-folder-radio { min-height: 40px; font-size: 14px; }
169
179
  .session-folder-viewmenu.is-mobile .session-folder-radio-dot { width: 14px; height: 14px; }
180
+ .session-folder-viewmenu.is-mobile .session-folder-view-toggle { min-height: 40px; font-size: 14px; }
170
181
  @media (pointer: coarse) {
171
182
  .session-folder-viewmenu .session-folder-radio { min-height: 40px; font-size: 14px; }
172
183
  }
@@ -168,6 +168,9 @@
168
168
  .session-item:has(.session-work-column) > .session-work-links-slot { grid-column: 1 / 3; grid-row: 2; }
169
169
 
170
170
  .github-kind-pr.github-state-closed .github-work-status svg { color: #f85149; }
171
+ .github-kind-pr.github-state-open .github-review-changes svg { color: var(--error); }
172
+ .github-kind-pr.github-state-open .github-review-requested svg { color: var(--warning); }
173
+ .github-kind-pr.github-state-open .github-review-approved svg { color: var(--success); }
171
174
  @media (max-width: 600px) {
172
175
  #header-github-links { flex: 0 0 auto; }
173
176
  #header-github-links .session-github-link { display: none; }
@@ -514,6 +514,20 @@
514
514
  background: color-mix(in srgb, var(--note-ink) 12%, transparent) !important;
515
515
  border-radius: 4px;
516
516
  }
517
+ .sticky-note-checklist-btn.active {
518
+ opacity: 1 !important;
519
+ background: color-mix(in srgb, var(--note-ink) 12%, transparent) !important;
520
+ border-radius: 4px;
521
+ }
522
+ .sticky-note-checklist-btn .lucide { width: 13px; height: 13px; }
523
+ .sticky-note-save-status {
524
+ color: var(--danger, #b42318);
525
+ font-size: 10px;
526
+ max-width: 90px;
527
+ overflow: hidden;
528
+ text-overflow: ellipsis;
529
+ white-space: nowrap;
530
+ }
517
531
 
518
532
  .sn-fmt-bold { font-weight: 800; }
519
533
  .sn-fmt-italic { font-style: italic; }
@@ -692,6 +706,7 @@
692
706
  overflow-y: auto;
693
707
  display: grid;
694
708
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
709
+ grid-auto-rows: max-content;
695
710
  gap: 10px;
696
711
  padding: 12px 12px 28px;
697
712
  align-content: start;
@@ -715,8 +730,23 @@
715
730
  .notes-browser-card:hover { box-shadow: 0 2px 10px rgba(var(--shadow-rgb), 0.12); }
716
731
  .notes-browser-card:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
717
732
  /* A closed note is calm, not crossed out: still fully readable. */
718
- .notes-browser-card.closed { opacity: 0.72; cursor: default; }
733
+ .notes-browser-card.closed {
734
+ min-height: 150px;
735
+ align-self: start;
736
+ opacity: 0.88;
737
+ cursor: default;
738
+ }
719
739
  .notes-browser-card.closed:hover { box-shadow: none; }
740
+ .notes-browser-card.closed .notes-browser-card-header {
741
+ display: flex;
742
+ flex-wrap: wrap;
743
+ align-items: start;
744
+ }
745
+ .notes-browser-card.closed .notes-browser-card-title {
746
+ flex: 0 0 100%;
747
+ display: block;
748
+ overflow-wrap: anywhere;
749
+ }
720
750
 
721
751
  .notes-browser-card-title { color: var(--note-ink); }
722
752
  .notes-browser-card-body { color: var(--note-ink); }
@@ -791,6 +821,23 @@
791
821
  -webkit-line-clamp: 5;
792
822
  -webkit-box-orient: vertical;
793
823
  }
824
+ .notes-browser-card.closed .notes-browser-card-body {
825
+ flex: 0 0 auto;
826
+ display: block;
827
+ min-width: 0;
828
+ overflow: visible;
829
+ overflow-wrap: anywhere;
830
+ word-break: break-word;
831
+ }
832
+ .notes-browser-card.closed .notes-browser-card-body a,
833
+ .notes-browser-card.closed .notes-browser-card-body code,
834
+ .notes-browser-card.closed .notes-browser-card-body pre {
835
+ overflow-wrap: anywhere;
836
+ word-break: break-word;
837
+ }
838
+ .notes-browser-card.closed .notes-browser-card-body pre {
839
+ white-space: pre-wrap;
840
+ }
794
841
  .notes-browser-card-body code {
795
842
  padding: 1px 3px;
796
843
  border-radius: 3px;
@@ -879,3 +926,16 @@
879
926
  .sticky-note.sticky-note-flight-away,
880
927
  .sticky-note:not(.sticky-note-flight-away) { transition-duration: 0ms; }
881
928
  }
929
+
930
+ /* Checklist inputs retain the card's compact reading rhythm. */
931
+ .sn-task-form { display: grid; gap: 6px; }
932
+ .sn-task-row { display: flex; align-items: center; gap: 6px; }
933
+ .sn-task-form input { min-width: 0; width: 100%; box-sizing: border-box; border: 1px solid transparent; border-radius: 4px; background: transparent; color: inherit; font: inherit; padding: 3px 4px; }
934
+ .sn-task-form input:hover, .sn-task-form input:focus { border-color: color-mix(in srgb, var(--note-ink) 25%, transparent); }
935
+ .sn-task-title { font-weight: 600 !important; }
936
+ .sn-task-form button { color: inherit; background: transparent; border: 0; font: inherit; cursor: pointer; }
937
+ .sn-task-form .sn-check { flex-shrink: 0; }
938
+ .sn-task-form .sn-task-save { justify-self: start; padding: 4px 8px; border: 1px solid color-mix(in srgb, var(--note-ink) 25%, transparent); border-radius: 4px; }
939
+ .sn-task-form button:focus-visible, .sn-task-form input:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
940
+ .sticky-note-header .sticky-note-md-btn[hidden] { display: none !important; }
941
+ .sn-task-remove .lucide { width: 13px; height: 13px; }
@@ -332,7 +332,7 @@ body { background: transparent; color: inherit; }
332
332
  <div id="connect-overlay">
333
333
  <div class="connect-brand">
334
334
  <img class="connect-symbol" src="clay-studio-symbol.png" alt="">
335
- <img class="connect-wordmark" src="clay-studio-wordmark-bold.svg" alt="Clay Studio" width="4742" height="1156">
335
+ <span class="connect-wordmark" role="img" aria-label="Clay Studio"></span>
336
336
  </div>
337
337
  <p id="connect-overlay-msg">Connecting…</p>
338
338
  </div>
@@ -16,7 +16,7 @@ export function loadProjectsTab(body) {
16
16
 
17
17
  var accessPromises = projectList.map(function (p) {
18
18
  return apiGet("/api/admin/projects/" + p.slug + "/access").then(function (access) {
19
- return { slug: p.slug, title: p.title || p.project || p.slug, projectOwnerId: p.projectOwnerId || null, visibility: access.visibility || "public", allowedUsers: access.allowedUsers || [] };
19
+ return { slug: p.slug, title: p.title || p.project || p.slug, projectOwnerId: p.projectOwnerId || null, visibility: access.visibility || "public", allowedUsers: access.allowedUsers || [], readOnly: access.contentAccess === false || p.projectOwnerId !== store.get("myUserId") };
20
20
  });
21
21
  });
22
22
 
@@ -39,9 +39,13 @@ function renderProjectsTab(body, projectAccessList, allUsers) {
39
39
  html += '<div class="admin-project-slug">' + escapeHtml(p.slug) + '</div>';
40
40
  html += '</div>';
41
41
  html += '<div class="admin-project-controls">';
42
+ if (p.readOnly) {
43
+ html += '<span class="admin-project-access-readonly">Administrative metadata only</span></div></div>';
44
+ continue;
45
+ }
42
46
  // Owner select
43
47
  html += '<select aria-label="Project owner" class="admin-owner-select" data-slug="' + escapeHtml(p.slug) + '">';
44
- html += '<option value=""' + (!p.projectOwnerId ? ' selected' : '') + '>No owner</option>';
48
+ if (!p.projectOwnerId) html += '<option value="" selected disabled>Ownership needs recovery</option>';
45
49
  for (var u = 0; u < allUsers.length; u++) {
46
50
  var user = allUsers[u];
47
51
  var sel = p.projectOwnerId === user.id ? ' selected' : '';
@@ -1,3 +1,4 @@
1
+ import { leaveRevokedProject, reconnectDestination } from './project-access-recovery.js';
1
2
  // app-connection.js - WebSocket connection, reconnect, status
2
3
  // Extracted from app.js (PR-22)
3
4
 
@@ -355,6 +356,7 @@ export function connect() {
355
356
  console.log("[clay] WebSocket reconnected after " + (Date.now() - disconnectedAt) + "ms");
356
357
  }
357
358
  disconnectedAt = 0;
359
+ newWs.send(JSON.stringify({ type: "clay_ui_ready", version: 1 }));
358
360
  setStatus("connected");
359
361
  startHeartbeat(newWs, attemptEpoch);
360
362
  lifecycle.clearRetry();
@@ -460,7 +462,12 @@ export function scheduleReconnect(reason) {
460
462
  location.reload();
461
463
  return;
462
464
  }
463
- connect();
465
+ return res.json().then(function (info) {
466
+ if (!lifecycle.canProceed(authEpoch)) return;
467
+ var destination = reconnectDestination(info, store.get('currentSlug'));
468
+ if (destination) { leaveRevokedProject(destination); return; }
469
+ connect();
470
+ });
464
471
  }).catch(function () {
465
472
  var authFinished = lifecycle.finishAuth(authEpoch, authToken);
466
473
  if (authFinished && lifecycle.canProceed(authEpoch)) connect();
@@ -197,7 +197,7 @@ export function stopUrgentBlink() {
197
197
 
198
198
  export function setActivity(text) {
199
199
  var thinkingState = store.get('thinkingState');
200
- if (text === "thinking" && thinkingState && thinkingState.active) {
200
+ if ((text === "thinking" || text === "running") && thinkingState && thinkingState.active) {
201
201
  // Live Thinking already owns the tail progress UI. Compaction and tool
202
202
  // activity intentionally continue through so their distinct states show.
203
203
  if (getActivityEl()) {
@@ -225,9 +225,18 @@ export function setActivity(text) {
225
225
  _actEl.innerHTML =
226
226
  '<div class="mate-thinking-dots"><span></span><span></span><span></span></div>';
227
227
  }
228
+ _actEl.setAttribute("role", "status");
229
+ _actEl.setAttribute("aria-live", "polite");
228
230
  setActivityEl(_actEl);
229
- addToMessages(_actEl);
230
231
  }
232
+ var activity = getActivityEl();
233
+ var labels = { waiting: "Waiting for provider", running: "Working", background: "Background work pending" };
234
+ var label = activity.querySelector(".activity-state-label");
235
+ if (labels[text]) {
236
+ if (!label) { label = document.createElement("span"); label.className = "activity-state-label activity-text"; activity.appendChild(label); }
237
+ label.textContent = labels[text];
238
+ } else if (label) label.remove();
239
+ addToMessages(activity);
231
240
  scrollToBottom();
232
241
  } else {
233
242
  if (getActivityEl()) {
@@ -267,14 +267,16 @@ export function initHeader() {
267
267
  addRow("Local ID", split.panes[pi].sessionId);
268
268
  if (member && member.cliSessionId) {
269
269
  addRow("Session ID", member.cliSessionId);
270
- addRow("Resume", "claude --resume " + member.cliSessionId);
270
+ var memberResume = ((store.get("vendorInfo") || {})[member.vendor || "claude"] || {}).terminalResumeCommand;
271
+ if (memberResume) addRow("Resume", memberResume + " " + member.cliSessionId);
271
272
  }
272
273
  }
273
274
  } else {
274
275
  var s = store.snap();
275
276
  if (s.cliSessionId) addRow("Session ID", s.cliSessionId);
276
277
  if (s.activeSessionId) addRow("Local ID", s.activeSessionId);
277
- if (s.cliSessionId) addRow("Resume", "claude --resume " + s.cliSessionId);
278
+ var resume = ((s.vendorInfo || {})[s.currentVendor] || {}).terminalResumeCommand;
279
+ if (s.cliSessionId && resume) addRow("Resume", resume + " " + s.cliSessionId);
278
280
  }
279
281
 
280
282
  document.body.appendChild(pop);
@@ -657,6 +657,8 @@ function renderPreviewModelTab(bodyEl) {
657
657
  }
658
658
 
659
659
  var opts = {
660
+ effortLevels: ((store.get("vendorInfo") || {})[store.get("currentVendor")] || {}).effortLevels || [],
661
+ configuration: ((store.get("vendorInfo") || {})[store.get("currentVendor")] || {}).configuration || {},
660
662
  models: s.currentModels || [],
661
663
  currentModel: _previewLoopSettings.model || "",
662
664
  currentMode: _previewLoopSettings.permissionMode || "default",
@@ -58,7 +58,7 @@ export function handleHomeProtocolMessage(msg) {
58
58
  handleHomeDebateTranscript(msg);
59
59
  return true;
60
60
  }
61
- if (msg.type === "home_mcp_import_question" || msg.type === "home_mcp_import_question_resolved") {
61
+ 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") {
62
62
  if (!handleSearchClayMessage(msg)) handleHomeDebateTranscript(msg);
63
63
  return true;
64
64
  }
@@ -1,3 +1,5 @@
1
+ import { handleOwnerNavigation } from './clay-owner-navigation.js';
2
+ import { leaveRevokedProject } from './project-access-recovery.js';
1
3
  import { handlePersonalSettingsMessage } from './user-settings-preferences.js';
2
4
  import { handleServerUpdate } from './server-settings-controls.js';
3
5
  import { handleYouMessage } from './you.js';
@@ -9,7 +11,7 @@ import { handleLinearResult } from './linear-panel.js';
9
11
  import { handleSharedBrowserMessage } from './shared-browser.js';
10
12
  import { openWireframe } from './wireframe-workbench.js';
11
13
  import { handlePrimaryWorkResult } from './session-work-primary.js';
12
- import { syncGithubSessions } from './session-github.js';
14
+ import { syncGithubSessions, applyGithubPersonalReviewStatus } from './session-github.js';
13
15
  import { handleIssuesMessageInContext as handleIssuesMessage } from './issues-context.js';
14
16
  // app-messages.js - WebSocket message router
15
17
  // Extracted from app.js (PR-23)
@@ -66,7 +68,7 @@ import { handleTuiTranscriptState } from './tui-grab.js';
66
68
  import { tuiModalHandleTermOutput, tuiModalHandleTermResized, tuiModalHandleTermExited, tuiModalHandleTermClosed } from './tui-attention.js';
67
69
  import { updateTerminalList, handleContextSourcesState, updateEmailAccountList, updateEmailUnreadCounts, handleEmailTestResult, handleEmailAddResult, handleEmailRemoveResult } from './context-sources.js';
68
70
  import { refreshEmailSettings } from './user-settings.js';
69
- import { handleNotesList, handleNoteCreated, handleNoteUpdated, handleNoteDeleted, handleNoteWritten } from './sticky-notes.js';
71
+ import { handleNotesList, handleNoteCreated, handleNoteUpdated, handleNoteUpdateResult, handleNoteDeleted, handleNoteWritten } from './sticky-notes.js';
70
72
  import { handleNoteDeleteResult } from './sticky-notes-browser.js';
71
73
  import { handleProjectLogsState, handleProjectLogEntry, handleProjectLogCommented, handleProjectLogCommentReviewed, handleProjectLogDeleted, handleProjectLogUpdated, handleProjectLogsError, handleScheduledTaskResultsState, handleScheduledTaskResultCreated, handleScheduledTaskResultSession } from './project-logs.js';
72
74
  import { handleSkillInstalled, handleSkillUninstalled } from './skills.js';
@@ -119,6 +121,7 @@ var connectOverlay = document.getElementById("connect-overlay");
119
121
  initMessageDeliveryUi();
120
122
 
121
123
  export function processMessage(msg) {
124
+ if (handleOwnerNavigation(msg)) return;
122
125
  if (["update_available", "up_to_date", "update_started", "update_check_failed"].indexOf(msg.type) !== -1) handleServerUpdate(msg);
123
126
  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);
124
127
  if (handleProjectDebateMessage(msg)) return;
@@ -146,7 +149,7 @@ export function processMessage(msg) {
146
149
  return;
147
150
  }
148
151
  if (msg.type === "access_revoked") {
149
- window.location.assign("/");
152
+ leaveRevokedProject("/");
150
153
  return;
151
154
  }
152
155
  // Preserve original timestamp from history replay
@@ -279,7 +282,7 @@ export function processMessage(msg) {
279
282
 
280
283
  // Restore accurate context data from the last result in full history
281
284
  if (msg.lastUsage || msg.lastModelUsage) {
282
- accumulateContext(msg.lastCost, msg.lastUsage, msg.lastModelUsage, msg.lastStreamInputTokens);
285
+ accumulateContext(msg.lastCost, msg.lastUsage, msg.lastModelUsage, msg.lastStreamInputTokens, msg.context);
283
286
  }
284
287
  updateContextPanel();
285
288
  updateUsagePanel();
@@ -287,6 +290,7 @@ export function processMessage(msg) {
287
290
  // the restored turn instead of starting a second answer bubble.
288
291
  if (store.get('sessionIsProcessing')) {
289
292
  flushStreamBuffer();
293
+ if (store.get('turnActivity')) setActivity(store.get('turnActivity').phase);
290
294
  } else {
291
295
  markAllToolsDone();
292
296
  finalizeAssistantBlock();
@@ -775,6 +779,9 @@ export function processMessage(msg) {
775
779
  handlePaletteSessionSwitch();
776
780
  maybeRestoreSplitGroup();
777
781
  break;
782
+ case "session_github_status":
783
+ applyGithubPersonalReviewStatus(msg);
784
+ break;
778
785
 
779
786
  case "split_groups":
780
787
  applyProjectSplitGroups(msg.groups || []);
@@ -906,7 +913,7 @@ export function processMessage(msg) {
906
913
  ? msg.runtimeTerminalId
907
914
  : (typeof msg.terminalId === "number" ? msg.terminalId : null);
908
915
  var _sessionRole = msg.sessionRole === "worker" ? "worker" : "driver";
909
- 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') || "") });
916
+ 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, turnActivity: null, 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') || "") });
910
917
  handleScheduledTaskSessionSwitched(msg);
911
918
  requestLoopInterviewState();
912
919
  activateDeliverySession(msg.id, msg.cliSessionId || null, msg.sessionOriginId || null);
@@ -1033,7 +1040,11 @@ export function processMessage(msg) {
1033
1040
  // running session, where history_done keeps current tools active.
1034
1041
  // Question answers, plan feedback and Driver delegations are injected
1035
1042
  // mid-turn, so tools before them may still be running.
1036
- else if (!msg.askUserAnswer && !msg.planFeedback && !msg.delegated) markAllToolsDone();
1043
+ else if (!msg.askUserAnswer && !msg.planFeedback && !msg.delegated) {
1044
+ markAllToolsDone();
1045
+ // Older histories predate explicit foreground presentation boundaries.
1046
+ finalizeAssistantBlock();
1047
+ }
1037
1048
  resetThinkingGroup();
1038
1049
  if (msg.planContent) {
1039
1050
  setPlanContent(msg.planContent);
@@ -1130,7 +1141,7 @@ export function processMessage(msg) {
1130
1141
  // events make it through.
1131
1142
  removeMatePreThinking();
1132
1143
  if (!(store.get('dmMode') && store.get('dmTargetUser') && store.get('dmTargetUser').isMate) && !store.get('matePreThinkingEl')) {
1133
- setActivity("thinking");
1144
+ setActivity((store.get("turnActivity") || {}).phase || "thinking");
1134
1145
  }
1135
1146
  }
1136
1147
  break;
@@ -1166,8 +1177,24 @@ export function processMessage(msg) {
1166
1177
  }
1167
1178
  break;
1168
1179
 
1180
+ case "turn_activity":
1181
+ if (["waiting", "running", "background"].indexOf(msg.phase) === -1) break;
1182
+ store.set({ turnActivity: { phase: msg.phase, turnId: msg.turnId || null, disposition: msg.disposition || null } });
1183
+ if (!store.get('replayingHistory') && store.get('sessionIsProcessing')) {
1184
+ removeMatePreThinking();
1185
+ setActivity(msg.phase);
1186
+ }
1187
+ break;
1188
+
1189
+ case "assistant_boundary":
1190
+ // Foreground presentation ended; background work still owns its real
1191
+ // terminal. Flush pending animation text without finishing tools/Stop.
1192
+ finalizeAssistantBlock();
1193
+ break;
1194
+
1169
1195
  case "delta":
1170
1196
  if (typeof msg.text !== "string") break;
1197
+ store.set({ turnActivity: null });
1171
1198
  removeMatePreThinking();
1172
1199
  stopThinking();
1173
1200
  setActivity(null);
@@ -1215,6 +1242,8 @@ export function processMessage(msg) {
1215
1242
  renderMcpDebateProposal(msg.id, msg.input);
1216
1243
  startUrgentBlink();
1217
1244
  } else if (msg.name === "AskUserQuestion" && msg.input && msg.input.questions) {
1245
+ store.set({ turnActivity: null });
1246
+ setActivity(null);
1218
1247
  var askTool = getTools()[msg.id];
1219
1248
  if (askTool) {
1220
1249
  if (askTool.el) askTool.el.style.display = "none";
@@ -1279,6 +1308,11 @@ export function processMessage(msg) {
1279
1308
  renderGeneratedImage(msg);
1280
1309
  break;
1281
1310
 
1311
+ case 'mate_schedule_question_expired':
1312
+ markAskUserAnswered(msg.toolId, { 0: msg.error || 'This schedule review expired.' });
1313
+ stopUrgentBlink();
1314
+ break;
1315
+
1282
1316
  case 'mcp_import_consent_expired':
1283
1317
  markAskUserAnswered(msg.toolId, { 0: msg.error || 'No import was approved.' });
1284
1318
  stopUrgentBlink();
@@ -1290,6 +1324,7 @@ export function processMessage(msg) {
1290
1324
  break;
1291
1325
 
1292
1326
  case "permission_request":
1327
+ store.set({ turnActivity: null });
1293
1328
  setActivity(null);
1294
1329
  renderPermissionRequest(msg.requestId, msg.toolName, msg.toolInput, msg.decisionReason, msg.mateId, msg.vendor, msg);
1295
1330
  startUrgentBlink();
@@ -1306,12 +1341,15 @@ export function processMessage(msg) {
1306
1341
  break;
1307
1342
 
1308
1343
  case "permission_request_pending":
1344
+ store.set({ turnActivity: null });
1309
1345
  setActivity(null);
1310
1346
  renderPermissionRequest(msg.requestId, msg.toolName, msg.toolInput, msg.decisionReason, msg.mateId, msg.vendor, msg);
1311
1347
  startUrgentBlink();
1312
1348
  break;
1313
1349
 
1314
1350
  case "elicitation_request":
1351
+ store.set({ turnActivity: null });
1352
+ setActivity(null);
1315
1353
  renderElicitationRequest(msg);
1316
1354
  startUrgentBlink();
1317
1355
  break;
@@ -1326,6 +1364,8 @@ export function processMessage(msg) {
1326
1364
  break;
1327
1365
 
1328
1366
  case "user_dialog_request":
1367
+ store.set({ turnActivity: null });
1368
+ setActivity(null);
1329
1369
  renderUserDialogRequest(msg);
1330
1370
  startUrgentBlink();
1331
1371
  break;
@@ -1391,7 +1431,7 @@ export function processMessage(msg) {
1391
1431
  finalizeAssistantBlock();
1392
1432
  addTurnMeta(msg.cost, msg.duration);
1393
1433
  accumulateUsage(msg.cost, msg.usage);
1394
- accumulateContext(msg.cost, msg.usage, msg.modelUsage, msg.lastStreamInputTokens);
1434
+ accumulateContext(msg.cost, msg.usage, msg.modelUsage, msg.lastStreamInputTokens, msg.context);
1395
1435
  break;
1396
1436
 
1397
1437
  case "context_usage":
@@ -1404,6 +1444,7 @@ export function processMessage(msg) {
1404
1444
  break;
1405
1445
 
1406
1446
  case "done":
1447
+ store.set({ turnActivity: null });
1407
1448
  removeMatePreThinking();
1408
1449
  setActivity(null);
1409
1450
  finishThinkingTurn();
@@ -1427,6 +1468,7 @@ export function processMessage(msg) {
1427
1468
  break;
1428
1469
 
1429
1470
  case "error":
1471
+ store.set({ turnActivity: null });
1430
1472
  removeMatePreThinking();
1431
1473
  setActivity(null);
1432
1474
  finishThinkingTurn();
@@ -1755,6 +1797,10 @@ export function processMessage(msg) {
1755
1797
  handleNoteUpdated(msg);
1756
1798
  break;
1757
1799
 
1800
+ case "note_update_result":
1801
+ handleNoteUpdateResult(msg);
1802
+ break;
1803
+
1758
1804
  case "note_written":
1759
1805
  showToast((msg.byTitle || "Agent") + ' left a note: "' + (msg.preview || "") + '"');
1760
1806
  handleNoteWritten(msg);
@@ -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 ---