clay-server 5.2.0-beta.3 → 5.2.0-beta.5

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 (339) hide show
  1. package/lib/account-auth-socket.js +1 -0
  2. package/lib/builtin-mates.js +19 -16
  3. package/lib/bundled-skills/clay-agent-browser/SKILL.md +6 -2
  4. package/lib/canonical-clay-record-authority.js +15 -0
  5. package/lib/canonical-clay-scheduling-authority.js +19 -0
  6. package/lib/claude-hook-installer.js +28 -0
  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-workspace-controls.js +83 -0
  23. package/lib/clay-workspace-input.js +17 -0
  24. package/lib/clay-workspace-receipts.js +26 -0
  25. package/lib/daemon-project-access.js +11 -0
  26. package/lib/daemon-project-lifecycle-callbacks.js +15 -0
  27. package/lib/daemon-project-lifecycle.js +262 -0
  28. package/lib/daemon-projects.js +1 -1
  29. package/lib/daemon.js +73 -221
  30. package/lib/issues-service.js +29 -15
  31. package/lib/knowledge-db-import.js +5 -4
  32. package/lib/knowledge-db-service.js +9 -6
  33. package/lib/knowledge-document-index.js +2 -1
  34. package/lib/knowledge-file-store.js +7 -1
  35. package/lib/knowledge-product-operations.js +46 -0
  36. package/lib/mate-avatar-catalog.js +12 -0
  37. package/lib/mate-avatar-migration.js +41 -0
  38. package/lib/mate-creation-mcp-server.js +2 -0
  39. package/lib/mate-knowledge-canonical-access.js +10 -0
  40. package/lib/mate-knowledge-service.js +7 -4
  41. package/lib/mate-lifecycle-service.js +94 -0
  42. package/lib/mate-message-delivery.js +43 -0
  43. package/lib/mate-ready-creation.js +9 -1
  44. package/lib/mate-schedule-input.js +29 -0
  45. package/lib/mate-schedule-lifecycle.js +151 -0
  46. package/lib/mate-scheduling.js +103 -0
  47. package/lib/mates.js +18 -6
  48. package/lib/mcp-agent-tools.js +117 -0
  49. package/lib/mcp-connection-store.js +119 -15
  50. package/lib/mcp-import-credentials.js +31 -0
  51. package/lib/mcp-local-transport.js +13 -0
  52. package/lib/mcp-oauth.js +8 -6
  53. package/lib/mcp-query-bridge.js +30 -0
  54. package/lib/mcp-remote-connections.js +74 -20
  55. package/lib/mcp-source-adapters.js +91 -0
  56. package/lib/mcp-source-context.js +42 -0
  57. package/lib/mcp-source-discovery.js +169 -0
  58. package/lib/mcp-source-plugins.js +68 -0
  59. package/lib/mcp-source-restrictions.js +47 -0
  60. package/lib/mcp-tool-policy.js +34 -0
  61. package/lib/notes-checklist.js +50 -0
  62. package/lib/notes.js +49 -3
  63. package/lib/os-users.js +20 -5
  64. package/lib/project-admin-overview.js +51 -0
  65. package/lib/project-ask-user.js +8 -4
  66. package/lib/project-debate.js +1 -0
  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-knowledge.js +32 -18
  73. package/lib/project-lifecycle-operations.js +98 -0
  74. package/lib/project-lifecycle-process-witness.js +32 -0
  75. package/lib/project-lifecycle-runtime.js +50 -0
  76. package/lib/project-linux-access.js +22 -0
  77. package/lib/project-logs-canonical-clay.js +27 -0
  78. package/lib/project-logs-clay-query.js +16 -0
  79. package/lib/project-logs-schema.js +4 -2
  80. package/lib/project-logs-service.js +8 -7
  81. package/lib/project-logs.js +1 -0
  82. package/lib/project-loop.js +1 -0
  83. package/lib/project-mate-chat-control.js +55 -0
  84. package/lib/project-mate-creation-proposal.js +18 -3
  85. package/lib/project-mate-interaction.js +8 -0
  86. package/lib/project-mcp.js +54 -16
  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-pending-message-queue.js +1 -0
  92. package/lib/project-product-control.js +87 -0
  93. package/lib/project-product-session-queue.js +46 -0
  94. package/lib/project-push-access.js +28 -0
  95. package/lib/project-scheduled-message-queue.js +30 -0
  96. package/lib/project-scheduled-messages.js +63 -64
  97. package/lib/project-scheduled-task-control.js +83 -0
  98. package/lib/project-scheduled-tasks.js +13 -2
  99. package/lib/project-scheduling-access.js +10 -0
  100. package/lib/project-session-actions.js +65 -0
  101. package/lib/project-session-delete.js +8 -1
  102. package/lib/project-session-document.js +8 -3
  103. package/lib/project-session-github.js +63 -19
  104. package/lib/project-session-history-actions.js +165 -0
  105. package/lib/project-session-linear.js +14 -6
  106. package/lib/project-session-notes.js +7 -3
  107. package/lib/project-session-runtime-actions.js +63 -0
  108. package/lib/project-session-vendor.js +54 -0
  109. package/lib/project-sessions.js +68 -241
  110. package/lib/project-shared-browser.js +56 -12
  111. package/lib/project-user-message.js +30 -1
  112. package/lib/project-workspace-operations.js +126 -0
  113. package/lib/project-workspace-query.js +9 -2
  114. package/lib/project.js +144 -37
  115. package/lib/public/app.js +5 -0
  116. package/lib/public/appearance-bootstrap.js +14 -0
  117. package/lib/public/css/clay-tool-activity.css +51 -0
  118. package/lib/public/css/clay-workspace.css +29 -0
  119. package/lib/public/css/home-debate-planning.css +2 -0
  120. package/lib/public/css/home-mate-creation.css +5 -0
  121. package/lib/public/css/mate-avatar-gallery.css +12 -0
  122. package/lib/public/css/mate-conversation.css +10 -5
  123. package/lib/public/css/overlays.css +4 -2
  124. package/lib/public/css/project-admin-overview.css +13 -0
  125. package/lib/public/css/session-folders.css +11 -0
  126. package/lib/public/css/session-github.css +46 -1
  127. package/lib/public/css/shared-browser.css +35 -1
  128. package/lib/public/css/sticky-notes.css +61 -1
  129. package/lib/public/index.html +11 -5
  130. package/lib/public/mate-avatars/B01.png +0 -0
  131. package/lib/public/mate-avatars/B02.png +0 -0
  132. package/lib/public/mate-avatars/B03.png +0 -0
  133. package/lib/public/mate-avatars/B04.png +0 -0
  134. package/lib/public/mate-avatars/B05.png +0 -0
  135. package/lib/public/mate-avatars/B06.png +0 -0
  136. package/lib/public/mate-avatars/B07.png +0 -0
  137. package/lib/public/mate-avatars/B08.png +0 -0
  138. package/lib/public/mate-avatars/B09.png +0 -0
  139. package/lib/public/mate-avatars/B10.png +0 -0
  140. package/lib/public/mate-avatars/B11.png +0 -0
  141. package/lib/public/mate-avatars/B12.png +0 -0
  142. package/lib/public/mate-avatars/B13.png +0 -0
  143. package/lib/public/mate-avatars/B14.png +0 -0
  144. package/lib/public/mate-avatars/B15.png +0 -0
  145. package/lib/public/mate-avatars/B16.png +0 -0
  146. package/lib/public/mate-avatars/B17.png +0 -0
  147. package/lib/public/mate-avatars/B18.png +0 -0
  148. package/lib/public/mate-avatars/B19.png +0 -0
  149. package/lib/public/mate-avatars/B20.png +0 -0
  150. package/lib/public/mate-avatars/B21.png +0 -0
  151. package/lib/public/mate-avatars/B22.png +0 -0
  152. package/lib/public/mate-avatars/B23.png +0 -0
  153. package/lib/public/mate-avatars/B24.png +0 -0
  154. package/lib/public/mate-avatars/B25.png +0 -0
  155. package/lib/public/mate-avatars/B26.png +0 -0
  156. package/lib/public/mate-avatars/B27.png +0 -0
  157. package/lib/public/mate-avatars/B28.png +0 -0
  158. package/lib/public/mate-avatars/B29.png +0 -0
  159. package/lib/public/mate-avatars/B30.png +0 -0
  160. package/lib/public/mate-avatars/B31.png +0 -0
  161. package/lib/public/mate-avatars/B32.png +0 -0
  162. package/lib/public/mate-avatars/B33.png +0 -0
  163. package/lib/public/mate-avatars/B34.png +0 -0
  164. package/lib/public/mate-avatars/B35.png +0 -0
  165. package/lib/public/mate-avatars/B36.png +0 -0
  166. package/lib/public/mate-avatars/B37.png +0 -0
  167. package/lib/public/mate-avatars/B38.png +0 -0
  168. package/lib/public/mate-avatars/B39.png +0 -0
  169. package/lib/public/mate-avatars/B40.png +0 -0
  170. package/lib/public/mate-avatars/B41.png +0 -0
  171. package/lib/public/mate-avatars/B42.png +0 -0
  172. package/lib/public/mate-avatars/B43.png +0 -0
  173. package/lib/public/mate-avatars/B44.png +0 -0
  174. package/lib/public/mate-avatars/B45.png +0 -0
  175. package/lib/public/mate-avatars/B46.png +0 -0
  176. package/lib/public/mate-avatars/B47.png +0 -0
  177. package/lib/public/mate-avatars/B48.png +0 -0
  178. package/lib/public/mate-avatars/C01.png +0 -0
  179. package/lib/public/mate-avatars/C02.png +0 -0
  180. package/lib/public/mate-avatars/C03.png +0 -0
  181. package/lib/public/mate-avatars/C04.png +0 -0
  182. package/lib/public/mate-avatars/C05.png +0 -0
  183. package/lib/public/mate-avatars/C06.png +0 -0
  184. package/lib/public/mate-avatars/C07.png +0 -0
  185. package/lib/public/mate-avatars/C08.png +0 -0
  186. package/lib/public/mate-avatars/C09.png +0 -0
  187. package/lib/public/mate-avatars/C10.png +0 -0
  188. package/lib/public/mate-avatars/C11.png +0 -0
  189. package/lib/public/mate-avatars/C12.png +0 -0
  190. package/lib/public/mate-avatars/C13.png +0 -0
  191. package/lib/public/mate-avatars/C14.png +0 -0
  192. package/lib/public/mate-avatars/C15.png +0 -0
  193. package/lib/public/mate-avatars/C16.png +0 -0
  194. package/lib/public/mate-avatars/C17.png +0 -0
  195. package/lib/public/mate-avatars/C18.png +0 -0
  196. package/lib/public/mate-avatars/C19.png +0 -0
  197. package/lib/public/mate-avatars/C20.png +0 -0
  198. package/lib/public/mate-avatars/C21.png +0 -0
  199. package/lib/public/mate-avatars/C22.png +0 -0
  200. package/lib/public/mate-avatars/C23.png +0 -0
  201. package/lib/public/mate-avatars/C24.png +0 -0
  202. package/lib/public/mate-avatars/C25.png +0 -0
  203. package/lib/public/mate-avatars/C26.png +0 -0
  204. package/lib/public/mate-avatars/C27.png +0 -0
  205. package/lib/public/mate-avatars/C28.png +0 -0
  206. package/lib/public/mate-avatars/C29.png +0 -0
  207. package/lib/public/mate-avatars/C30.png +0 -0
  208. package/lib/public/mate-avatars/C31.png +0 -0
  209. package/lib/public/mate-avatars/C32.png +0 -0
  210. package/lib/public/mate-avatars/C33.png +0 -0
  211. package/lib/public/mate-avatars/C34.png +0 -0
  212. package/lib/public/mate-avatars/C35.png +0 -0
  213. package/lib/public/mate-avatars/C36.png +0 -0
  214. package/lib/public/mate-avatars/C37.png +0 -0
  215. package/lib/public/mate-avatars/C38.png +0 -0
  216. package/lib/public/mate-avatars/C39.png +0 -0
  217. package/lib/public/mate-avatars/C40.png +0 -0
  218. package/lib/public/mate-avatars/C41.png +0 -0
  219. package/lib/public/mate-avatars/C42.png +0 -0
  220. package/lib/public/mate-avatars/C43.png +0 -0
  221. package/lib/public/mate-avatars/C44.png +0 -0
  222. package/lib/public/mate-avatars/C45.png +0 -0
  223. package/lib/public/mate-avatars/C46.png +0 -0
  224. package/lib/public/mate-avatars/C47.png +0 -0
  225. package/lib/public/mate-avatars/C48.png +0 -0
  226. package/lib/public/mate-avatars/catalog.json +482 -0
  227. package/lib/public/mate-avatars/lead-clay.png +0 -0
  228. package/lib/public/modules/admin-settings-projects.js +6 -2
  229. package/lib/public/modules/app-connection.js +8 -1
  230. package/lib/public/modules/app-message-router.js +4 -0
  231. package/lib/public/modules/app-messages.js +31 -5
  232. package/lib/public/modules/app-projects.js +5 -0
  233. package/lib/public/modules/app-rendering.js +1 -1
  234. package/lib/public/modules/avatar.js +15 -41
  235. package/lib/public/modules/chat-render-runtime.js +10 -1
  236. package/lib/public/modules/clay-browser-links.js +47 -0
  237. package/lib/public/modules/clay-log-links.js +1 -1
  238. package/lib/public/modules/clay-owner-navigation.js +27 -0
  239. package/lib/public/modules/clay-tool-activity.js +140 -0
  240. package/lib/public/modules/clay-tool-presentation.js +338 -0
  241. package/lib/public/modules/command-palette.js +2 -2
  242. package/lib/public/modules/debate.js +1 -0
  243. package/lib/public/modules/default-ai.js +11 -3
  244. package/lib/public/modules/history-replay-batch.js +5 -1
  245. package/lib/public/modules/home-debate-live.js +2 -0
  246. package/lib/public/modules/home-debate-planning.js +7 -7
  247. package/lib/public/modules/home-mate-avatar-editor.js +127 -208
  248. package/lib/public/modules/home-mate-chat.js +8 -6
  249. package/lib/public/modules/home-mate-creation.js +73 -1
  250. package/lib/public/modules/home-mate-settings.js +19 -12
  251. package/lib/public/modules/markdown.js +4 -0
  252. package/lib/public/modules/mate-avatar-catalog.js +97 -0
  253. package/lib/public/modules/mate-management.js +40 -7
  254. package/lib/public/modules/mcp-connection-view.js +31 -13
  255. package/lib/public/modules/mcp-discovery-view.js +31 -0
  256. package/lib/public/modules/mcp-ui.js +23 -4
  257. package/lib/public/modules/mention.js +3 -0
  258. package/lib/public/modules/pane-browser-bridge.js +20 -0
  259. package/lib/public/modules/personal-settings-dialog.js +7 -1
  260. package/lib/public/modules/profile.js +1 -238
  261. package/lib/public/modules/project-access-recovery.js +17 -0
  262. package/lib/public/modules/project-admin-overview.js +21 -0
  263. package/lib/public/modules/project-mate-navigation.js +99 -14
  264. package/lib/public/modules/search-clay-chat.js +16 -2
  265. package/lib/public/modules/session-folder-layout.js +1 -1
  266. package/lib/public/modules/session-folder-view-menu.js +9 -0
  267. package/lib/public/modules/session-github.js +85 -14
  268. package/lib/public/modules/session-work-primary.js +51 -0
  269. package/lib/public/modules/shared-browser-settings.js +112 -0
  270. package/lib/public/modules/shared-browser-tabs.js +13 -3
  271. package/lib/public/modules/shared-browser.js +27 -6
  272. package/lib/public/modules/sidebar-session-folders-ui.js +1 -1
  273. package/lib/public/modules/split-view.js +2 -0
  274. package/lib/public/modules/sticky-note-markdown.js +72 -6
  275. package/lib/public/modules/sticky-notes-actions.js +30 -0
  276. package/lib/public/modules/sticky-notes-browser.js +9 -2
  277. package/lib/public/modules/sticky-notes-card.js +23 -7
  278. package/lib/public/modules/sticky-notes-checklist.js +71 -0
  279. package/lib/public/modules/sticky-notes-editor.js +108 -44
  280. package/lib/public/modules/sticky-notes-shared.js +50 -2
  281. package/lib/public/modules/sticky-notes-state.js +66 -0
  282. package/lib/public/modules/sticky-notes.js +34 -51
  283. package/lib/public/modules/theme.js +8 -1
  284. package/lib/public/modules/thinking-lifecycle.js +33 -3
  285. package/lib/public/modules/thinking-view.js +23 -1
  286. package/lib/public/modules/tools.js +36 -7
  287. package/lib/public/modules/user-settings-appearance.js +10 -3
  288. package/lib/public/modules/user-settings-editors.js +1 -1
  289. package/lib/public/modules/user-settings-layout.js +11 -2
  290. package/lib/public/modules/user-settings-preferences.js +6 -2
  291. package/lib/public/modules/user-settings-profile.js +12 -2
  292. package/lib/public/modules/user-settings.js +3 -2
  293. package/lib/public/style.css +3 -0
  294. package/lib/public/sw.js +3 -1
  295. package/lib/scheduled-task-records.js +3 -1
  296. package/lib/scheduler.js +2 -0
  297. package/lib/sdk-bridge.js +228 -23
  298. package/lib/sdk-message-processor.js +2 -0
  299. package/lib/sdk-response-recovery.js +155 -0
  300. package/lib/server-admin.js +63 -16
  301. package/lib/server-appearance-settings.js +13 -1
  302. package/lib/server-dm.js +2 -1
  303. package/lib/server-global-ws.js +10 -20
  304. package/lib/server-home-chat-events.js +18 -4
  305. package/lib/server-home-chat.js +12 -16
  306. package/lib/server-home-mate-creation.js +1 -0
  307. package/lib/server-home-mcp-consent.js +14 -0
  308. package/lib/server-mates.js +25 -62
  309. package/lib/server-owner-ui.js +77 -0
  310. package/lib/server-path-access.js +38 -0
  311. package/lib/server-project-removal.js +22 -0
  312. package/lib/server-settings.js +4 -1
  313. package/lib/server.js +144 -41
  314. package/lib/session-config-transition.js +45 -0
  315. package/lib/session-folders.js +7 -2
  316. package/lib/session-github.js +9 -2
  317. package/lib/session-visibility.js +5 -2
  318. package/lib/session-work-primary.js +50 -0
  319. package/lib/sessions.js +13 -0
  320. package/lib/shared-browser-cookie-sync.js +32 -0
  321. package/lib/shared-browser-cookies.js +79 -0
  322. package/lib/shared-browser-runtime.js +25 -9
  323. package/lib/shared-browser-storage-sync.js +43 -0
  324. package/lib/shared-browser-storage.js +101 -0
  325. package/lib/shared-browser-tools.js +2 -1
  326. package/lib/shared-browser-worker.js +46 -10
  327. package/lib/terminal-manager.js +52 -0
  328. package/lib/users-permissions.js +2 -8
  329. package/lib/users.js +4 -0
  330. package/lib/workspace-query-access.js +4 -1
  331. package/lib/ws-schema.js +8 -2
  332. package/lib/yoke/acp-agent-profiles.js +2 -2
  333. package/lib/yoke/adapters/claude.js +47 -8
  334. package/lib/yoke/adapters/codex.js +52 -111
  335. package/lib/yoke/claude-worker-startup.js +28 -0
  336. package/lib/yoke/codex-idle-recovery.js +81 -1
  337. package/lib/yoke/codex-recovery-admission.js +164 -0
  338. package/lib/yoke/session-tool-transport.js +3 -0
  339. package/package.json +5 -1
package/lib/project.js CHANGED
@@ -46,6 +46,8 @@ var { attachShellCommand } = require("./project-shell-command");
46
46
  var { attachVendorLogin } = require("./project-vendor-login");
47
47
  var { attachConnection } = require("./project-connection");
48
48
  var { attachProjectScheduledMessages } = require("./project-scheduled-messages");
49
+ var { attachMateScheduling } = require("./mate-scheduling");
50
+ var { attachMateScheduleLifecycle } = require("./mate-schedule-lifecycle");
49
51
  var { attachMcp } = require("./project-mcp");
50
52
  var { createSessionSkillCatalog } = require("./yoke/session-skill-catalog");
51
53
  var { attachEmail: attachEmailModule } = require("./project-email");
@@ -229,6 +231,8 @@ function createProjectContext(opts) {
229
231
  var getScheduleCount = opts.getScheduleCount || function () { return 0; };
230
232
  var notifyProcessingChanged = opts.onProcessingChanged || function () {};
231
233
  var _scheduledMessages = null;
234
+ var _mateScheduling = null;
235
+ var _mateLifecycle = null;
232
236
  var _scheduledTasks = null;
233
237
  var _scheduledTaskExecution = null;
234
238
  function onProcessingChanged() {
@@ -348,6 +352,10 @@ function createProjectContext(opts) {
348
352
  function getRuntimeEnvForSession(session) {
349
353
  var linuxUser = (session && session.linuxUser) || getLinuxUserForSession(session);
350
354
  var osUserInfo = getOsUserInfoForLinuxUser(linuxUser);
355
+ return resolveOwnerRuntimeEnv(osUserInfo);
356
+ }
357
+
358
+ function resolveOwnerRuntimeEnv(osUserInfo) {
351
359
  var baseEnv = osUserInfo ? buildUserEnv(osUserInfo) : process.env;
352
360
  var shared = typeof opts.onGetSharedEnv === "function" ? opts.onGetSharedEnv() : null;
353
361
  var projectEnv = typeof opts.onGetProjectEnv === "function" ? opts.onGetProjectEnv(slug) : null;
@@ -709,7 +717,22 @@ function createProjectContext(opts) {
709
717
 
710
718
  // Personal computer tools use the extension; remote URLs are owner-bound.
711
719
  var _mcp = attachMcp({
712
- sendTo: sendTo, slug: slug, clients: clients,
720
+ sendTo: sendTo, slug: slug, clients: clients, cwd: cwd,
721
+ userInput: function (session) { return _askUser.createHandler(session); },
722
+ runtimeEnvForSession: getRuntimeEnvForSession,
723
+ canDiscoverSession: function (session) { var scope = _requestAccess.fileScope({ _clayUser: session.ownerId && usersModule.findUserById(session.ownerId) }); return !!scope.identity || !scope.projectBound; },
724
+ sessionVendor: function (session) { return session.vendor || sm.defaultVendor || "claude"; },
725
+ runtimeEnv: function (owner, ws) { return resolveOwnerRuntimeEnv(_requestAccess.fileScope(ws).identity); },
726
+ canDiscover: function (ws) { var scope = _requestAccess.fileScope(ws); return !!scope.identity || !scope.projectBound; },
727
+ ownerIdentity: function (owner) {
728
+ if (!osUsers) {
729
+ if (usersModule.isMultiUser() && (usersModule.getAllUsers().length !== 1 || !usersModule.findUserById(owner))) throw new Error('Local MCP requires OS user mapping in a shared installation.');
730
+ return null;
731
+ }
732
+ var user = usersModule.findUserById(owner);
733
+ if (!user || !user.linuxUser) throw new Error('OS user identity is unavailable.');
734
+ return getOsUserInfoForWs({ _clayUser: user });
735
+ },
713
736
  root: require("./config").CONFIG_DIR,
714
737
  isMultiUser: function () { return usersModule.isMultiUser(); },
715
738
  canAccess: function (ws) { return _requestAccess.canAccessProject(ws, slug); },
@@ -769,7 +792,7 @@ function createProjectContext(opts) {
769
792
  },
770
793
  });
771
794
  var _sharedBrowser = attachSharedBrowser({
772
- slug: slug, isMate: isMate, sm: sm, clients: clients, sendTo: sendTo,
795
+ slug: slug, isMate: isMate, ownerId: projectOwnerId, sm: sm, clients: clients, sendTo: sendTo,
773
796
  usersModule: usersModule, requestAccess: _requestAccess, osUsers: osUsers,
774
797
  getSessionForWs: getSessionForWs,
775
798
  getIdentity: function (session) {
@@ -780,6 +803,7 @@ function createProjectContext(opts) {
780
803
  var _sessionDocument = attachSessionDocument({
781
804
  cwd: cwd,
782
805
  isMate: isMate,
806
+ canUseSession: _sessionNotes.canUseSession,
783
807
  sendToSession: sendToSession,
784
808
  FS_MAX_SIZE: FS_MAX_SIZE,
785
809
  getOsUserInfoForSession: function (session) {
@@ -799,6 +823,7 @@ function createProjectContext(opts) {
799
823
  });
800
824
  var _workspaceQuery = attachProjectWorkspaceQuery({
801
825
  service: opts.workspaceQueryService || null,
826
+ controlService: opts.clayProductControl || null,
802
827
  sm: sm,
803
828
  projectSlug: slug,
804
829
  getProjectOwnerId: function () { return projectOwnerId; },
@@ -839,7 +864,12 @@ function createProjectContext(opts) {
839
864
  sendTo: sendTo, getClients: function () { return clients; }, startWork: _issueWork,
840
865
  });
841
866
  var _sessionGithub = require("./project-session-github").attachSessionGithub({
842
- cwd: cwd, sm: sm, isMate: isMate, osUsers: osUsers,
867
+ cwd: cwd, sm: sm, isMate: isMate, osUsers: osUsers, projectSlug: slug, sendTo: sendTo,
868
+ userInput: function (session) { return _askUser.createHandler(session); },
869
+ canAccess: function (ws) {
870
+ return !isMate && clients.has(ws) && ws.readyState === 1 && (!usersModule.isMultiUser() ||
871
+ !!(ws._clayUser && usersModule.findUserById(ws._clayUser.id) && opts.canAccessProjectSlug(ws._clayUser.id, slug)));
872
+ },
843
873
  canUse: function (session) {
844
874
  if (session.hidden || session.delegated || session._pairDelegation || session._delegatedBy || require("./session-provenance").isWorker(session)) return false;
845
875
  if (!usersModule.isMultiUser()) return true;
@@ -858,9 +888,10 @@ function createProjectContext(opts) {
858
888
  });
859
889
  var _sessionLinear = require("./project-session-linear").attachSessionLinear({
860
890
  sm: sm, isMate: isMate, storage: opts.linearStorage, projectSlug: slug,
891
+ userInput: function (session) { return _askUser.createHandler(session); },
861
892
  isMultiUser: usersModule.isMultiUser, sendTo: sendTo,
862
893
  canAccess: function (ws) {
863
- return !isMate && clients.has(ws) && ws.readyState === 1 && (!usersModule.isMultiUser() ||
894
+ return clients.has(ws) && ws.readyState === 1 && (!usersModule.isMultiUser() ||
864
895
  !!(ws._clayUser && usersModule.findUserById(ws._clayUser.id) && opts.canAccessProjectSlug(ws._clayUser.id, slug)));
865
896
  },
866
897
  startWork: require('./project-linear-launch').attachLinearLaunch({
@@ -1021,6 +1052,7 @@ function createProjectContext(opts) {
1021
1052
  persistSession: function (session) { return sm.saveSessionFile(session); },
1022
1053
  getVendorModelCatalog: function (ws, vendor) { return _models.getVendorCatalog(ws, vendor); },
1023
1054
  createReadyMate: opts.createReadyMate,
1055
+ isLive: function (session) { return sm.sessions.get(session.localId) === session; },
1024
1056
  });
1025
1057
  var _askUser = attachAskUser({
1026
1058
  record: function (session, event) { sm.sendAndRecord(session, event); },
@@ -1055,14 +1087,12 @@ function createProjectContext(opts) {
1055
1087
  }
1056
1088
  }
1057
1089
 
1058
- // Shared sticky-note memory (main projects only).
1059
- if (!isMate) {
1060
- try {
1061
- var sessionNotesMcpConfig = _sessionNotes.createMcpServer(adapter);
1062
- if (sessionNotesMcpConfig) servers[sessionNotesMcpConfig.name || "clay-notes"] = sessionNotesMcpConfig;
1063
- } catch (e) {
1064
- console.error("[project] Failed to create session notes MCP server:", e.message);
1065
- }
1090
+ // Shared sticky-note memory is available in both owner-private projects and Mates.
1091
+ try {
1092
+ var sessionNotesMcpConfig = _sessionNotes.createMcpServer(adapter);
1093
+ if (sessionNotesMcpConfig) servers[sessionNotesMcpConfig.name || "clay-notes"] = sessionNotesMcpConfig;
1094
+ } catch (e) {
1095
+ console.error("[project] Failed to create session notes MCP server:", e.message);
1066
1096
  }
1067
1097
 
1068
1098
  // Project Logs. Project sessions get the project-scoped set; Mate projects
@@ -1107,13 +1137,11 @@ function createProjectContext(opts) {
1107
1137
  if (sharedBrowserConfig) servers["clay-shared-browser"] = sharedBrowserConfig;
1108
1138
 
1109
1139
  // Explicit agent signal for user-requested Markdown presentation.
1110
- if (!isMate) {
1111
- try {
1112
- var sessionDocumentMcpConfig = _sessionDocument.createMcpServer(adapter);
1113
- if (sessionDocumentMcpConfig) servers[sessionDocumentMcpConfig.name || "clay-documents"] = sessionDocumentMcpConfig;
1114
- } catch (e) {
1115
- console.error("[project] Failed to create session document MCP server:", e.message);
1116
- }
1140
+ try {
1141
+ var sessionDocumentMcpConfig = _sessionDocument.createMcpServer(adapter);
1142
+ if (sessionDocumentMcpConfig) servers[sessionDocumentMcpConfig.name || "clay-documents"] = sessionDocumentMcpConfig;
1143
+ } catch (e) {
1144
+ console.error("[project] Failed to create session document MCP server:", e.message);
1117
1145
  }
1118
1146
 
1119
1147
  // Debate MCP server (available to both mates and main project)
@@ -1383,6 +1411,7 @@ function createProjectContext(opts) {
1383
1411
 
1384
1412
  // --- SDK bridge ---
1385
1413
  sdk = createSDKBridge({
1414
+ isLifecycleExecutionPaused: function () { return !!(opts.getProjectAccess && opts.getProjectAccess().lifecycleExecutionPaused); },
1386
1415
  cwd: cwd,
1387
1416
  slug: slug,
1388
1417
  sessionManager: sm,
@@ -1458,6 +1487,7 @@ function createProjectContext(opts) {
1458
1487
  _sessionGithub.getSystemPrompt(session),
1459
1488
  _sessionLinear.getSystemPrompt(session),
1460
1489
  _scheduledTasks ? _scheduledTasks.getSystemPrompt(session) : "",
1490
+ _mateScheduling ? _mateScheduling.getSystemPrompt(session) : "",
1461
1491
  _mateKnowledge.getSystemPrompt(session),
1462
1492
  _userKnowledge.getSystemPrompt(session),
1463
1493
  _autonomousRun ? _autonomousRun.getSystemPrompt(session) : "",
@@ -1487,6 +1517,7 @@ function createProjectContext(opts) {
1487
1517
  .concat(opts.userKnowledgeService ? _userKnowledge.getDynamicToolDefs(session) : [])
1488
1518
  .concat(_loopInterview ? _loopInterview.getToolDefs(session) : [])
1489
1519
  .concat(_scheduledTasks ? _scheduledTasks.getToolDefs(session) : [])
1520
+ .concat(_mateScheduling ? _mateScheduling.getToolDefs(session) : [])
1490
1521
  .concat(_scheduledTaskExecution ? _scheduledTaskExecution.getToolDefs(session) : [])
1491
1522
  .concat(_autonomousRun ? _autonomousRun.getToolDefs(session) : []);
1492
1523
  },
@@ -1542,6 +1573,8 @@ function createProjectContext(opts) {
1542
1573
 
1543
1574
  _scheduledMessages = attachProjectScheduledMessages({
1544
1575
  scheduler: opts.durableScheduler,
1576
+ mateLifecycle: function () { return _mateLifecycle; },
1577
+ deferRehydrate: isMate,
1545
1578
  slug: slug,
1546
1579
  isMate: isMate,
1547
1580
  osUsers: osUsers,
@@ -1564,6 +1597,32 @@ function createProjectContext(opts) {
1564
1597
  consumePendingMessage: function (session) { return _userMessage && _userMessage.consumePendingMessage(session); },
1565
1598
  });
1566
1599
 
1600
+ var _schedulingAccess = require('./project-scheduling-access').attachSchedulingAccess({ osUsers: osUsers, getLinuxUser: getLinuxUserForSession, resolveLinuxUser: getOsUserInfoForLinuxUser });
1601
+ _mateLifecycle = attachMateScheduleLifecycle({
1602
+ sm: sm, scheduler: opts.durableScheduler, slug: slug,
1603
+ owner: function (session) { return _mateScheduling.owner(session); },
1604
+ authorize: function (session, control) { return control ? _mateScheduling.authorizeControl(session, control) : _mateScheduling.authorize(session); },
1605
+ authorizeRuntime: function (session) { return _mateScheduling.authorizeLifecycle(session); },
1606
+ schedule: function () { return _scheduledMessages.schedule.apply(null, arguments); },
1607
+ queueItem: function (session, job) { return _scheduledMessages.queueItem(session, job); },
1608
+ cancelJob: function (session, job) {
1609
+ return _scheduledMessages.cancel(session, { id: job.ownerId }, null, "cancelled_by_mate", { jobId: job.id, revision: job.payload.revision });
1610
+ },
1611
+ });
1612
+ _mateScheduling = attachMateScheduling({
1613
+ isMate: isMate, isHostAgent: isHostAgent, projectOwnerId: projectOwnerId, slug: slug, mateId: opts.mateId,
1614
+ sm: sm, users: usersModule, lifecycle: _mateLifecycle,
1615
+ authorizeAccess: function (session, ownerId) { _schedulingAccess.ownerIdentity(session); return _scheduledMessages.authorize(session, ownerId); },
1616
+ userInput: function (session) { return _askUser.createHandler(session); },
1617
+ });
1618
+ if (isMate) {
1619
+ sm.sessions.forEach(function (session) {
1620
+ try { _mateLifecycle.reconcile(session); }
1621
+ catch (error) { console.error("[mate-schedules] Recovery failed:", error.message); }
1622
+ });
1623
+ _scheduledMessages.rehydrate();
1624
+ }
1625
+
1567
1626
  // --- Loop engine (delegated to project-loop.js) ---
1568
1627
  // --- Notification center (global singleton from server.js) ---
1569
1628
  var _notifications = opts.notificationsModule || null;
@@ -1645,6 +1704,7 @@ function createProjectContext(opts) {
1645
1704
  cwd: cwd,
1646
1705
  projectSlug: slug,
1647
1706
  projectTitle: title || project,
1707
+ validateOwnerIdentity: _schedulingAccess.ownerIdentity,
1648
1708
  isMate: isMate,
1649
1709
  sm: sm,
1650
1710
  sdk: sdk,
@@ -1743,8 +1803,8 @@ function createProjectContext(opts) {
1743
1803
  }
1744
1804
 
1745
1805
  // --- Schedule / cancel a message (used by WS handler and auto-continue) ---
1746
- function scheduleMessage(session, text, resetsAt, actorUser, targetWs, attachments, requestId, transportAccountId) {
1747
- return _scheduledMessages ? _scheduledMessages.schedule(session, text, resetsAt, actorUser, targetWs, attachments, requestId, transportAccountId) : null;
1806
+ function scheduleMessage(session, text, resetsAt, actorUser, targetWs, attachments, requestId, transportAccountId, options) {
1807
+ return _scheduledMessages ? _scheduledMessages.schedule(session, text, resetsAt, actorUser, targetWs, attachments, requestId, transportAccountId, options) : null;
1748
1808
  }
1749
1809
 
1750
1810
  function cancelScheduledMessage(session, actorUser, targetWs, correlation) {
@@ -1778,7 +1838,7 @@ function createProjectContext(opts) {
1778
1838
  }
1779
1839
 
1780
1840
  // --- DM messages (delegated to server-level handler) ---
1781
- if (msg.type === "home_debate_question_response" || msg.type === "home_debate_control" || msg.type === "home_mate_creation_question_response" || msg.type === "default_ai_get" || msg.type === "default_ai_catalog_get" || msg.type === "default_ai_set" || msg.type === "default_vendor_get" || msg.type === "default_vendor_set" || msg.type === "context_view_get" || msg.type === "context_view_set" || msg.type === "cursor_sharing_get" || msg.type === "cursor_sharing_set") {
1841
+ if (msg.type === "home_mate_question_response" || msg.type === "clay_ui_ready" || msg.type === "clay_navigation_claim" || msg.type === "clay_navigation_ack" || msg.type === "home_debate_question_response" || msg.type === "home_debate_control" || msg.type === "home_mate_creation_question_response" || msg.type === "default_ai_get" || msg.type === "default_ai_catalog_get" || msg.type === "default_ai_set" || msg.type === "default_vendor_get" || msg.type === "default_vendor_set" || msg.type === "context_view_get" || msg.type === "context_view_set" || msg.type === "cursor_sharing_get" || msg.type === "cursor_sharing_set") {
1782
1842
  if (typeof opts.onDmMessage === "function") opts.onDmMessage(ws, msg, slug);
1783
1843
  return;
1784
1844
  }
@@ -2074,6 +2134,8 @@ function createProjectContext(opts) {
2074
2134
  });
2075
2135
  sm.setSessionHydrator(_sessionSkillCatalog.hydrate);
2076
2136
  var _sessions = attachSessions({
2137
+ adapters: adapters,
2138
+ isPendingQueuePaused: function (session) { return _pendingMessageQueue.isPaused(session); },
2077
2139
  cwd: cwd,
2078
2140
  slug: slug,
2079
2141
  isMate: isMate,
@@ -2147,6 +2209,26 @@ function createProjectContext(opts) {
2147
2209
  _notifications: _notifications,
2148
2210
  _projectLogs: _projectLogs,
2149
2211
  });
2212
+ var _productControl = require("./project-product-control").attachProjectProductControl({
2213
+ sm: sm, users: usersModule, clients: clients, slug: slug, isMate: isMate, osUsers: osUsers,
2214
+ getProjectAccess: opts.getProjectAccess || function () { return { visibility: "public", ownerId: projectOwnerId || null }; },
2215
+ userInput: function (session) { return _askUser.createHandler(session); },
2216
+ actions: _sessions.sessionActions, history: _sessions.sessionHistoryActions, selectModel: function (session, model, options) { return _models.selectSessionModel(session, model, null, options); },
2217
+ isDriverOperatedSession: function (session) { return _sessionPair.workerPermission.isDriverOperated(session); },
2218
+ deletePlan: _sessions.deleteProductControlPlan,
2219
+ queue: _pendingMessageQueue,
2220
+ requestQueueDrain: function (session) { if (_userMessage) _userMessage.consumePendingMessage(session); },
2221
+ vendor: _sessions.sessionVendorActions,
2222
+ runtime: _sessions.sessionRuntimeActions,
2223
+ });
2224
+ var _mateChatControl = require('./project-mate-chat-control').attachMateChatControl({
2225
+ sm: sm, sdk: sdk, isMate: isMate, osUsers: osUsers, getLinuxUser: getLinuxUserForSession,
2226
+ users: usersModule, getAccess: opts.getProjectAccess || function () { return { isMate: isMate, ownerId: projectOwnerId || null, visibility: 'private' }; },
2227
+ actions: _sessions.sessionActions, vendor: _sessions.sessionVendorActions,
2228
+ selectModel: function (session, model, options) { return _models.selectSessionModel(session, model, null, options); },
2229
+ });
2230
+
2231
+
2150
2232
 
2151
2233
  var _models = attachModels({
2152
2234
  cwd: cwd,
@@ -2193,6 +2275,7 @@ function createProjectContext(opts) {
2193
2275
  });
2194
2276
  var _delegatedFollowUp = attachDelegatedFollowUp({
2195
2277
  sm: sm,
2278
+ isPendingQueuePaused: function (session) { return _pendingMessageQueue.isPaused(session); },
2196
2279
  getSdk: function () { return sdk; },
2197
2280
  getLinuxUserForSession: getLinuxUserForSession,
2198
2281
  onProcessingChanged: onProcessingChanged,
@@ -2207,6 +2290,12 @@ function createProjectContext(opts) {
2207
2290
 
2208
2291
  // --- User message handler (delegated to project-user-message.js) ---
2209
2292
  var _userMessage = attachUserMessage({
2293
+ isLifecycleExecutionPaused: function () { return !!(opts.getProjectAccess && opts.getProjectAccess().lifecycleExecutionPaused); },
2294
+ resumeLifecycleProject: function (ws) {
2295
+ if (!opts.getProjectAccess || !opts.getProjectAccess().lifecycleExecutionPaused) return true;
2296
+ if (!clients.has(ws) || !ws._clayUser || !opts.resumeLifecycleProject) throw new Error('The current owner must explicitly resume recovered project execution.');
2297
+ return opts.resumeLifecycleProject(ws._clayUser.id);
2298
+ },
2210
2299
  // Exact live pair state decides whether a session is Driver-operated; the
2211
2300
  // handler never infers the role from the message.
2212
2301
  isDriverOperatedSession: function (session) {
@@ -2329,6 +2418,13 @@ function createProjectContext(opts) {
2329
2418
  FS_MAX_SIZE: FS_VIEWER_MAX_SIZE,
2330
2419
  });
2331
2420
 
2421
+ var _workspaceOperations = require('./project-workspace-operations').attachWorkspaceOperations({
2422
+ cwd: cwd, isMate: isMate, osUsers: osUsers, users: usersModule, tm: tm,
2423
+ getAccess: opts.getProjectAccess || function () { return { ownerId: projectOwnerId || null, visibility: 'private' }; },
2424
+ files: function () { return _filesystem.productOperations; },
2425
+ publishTerminals: function () { send({ type: 'term_list', terminals: tm.list() }); },
2426
+ });
2427
+
2332
2428
  // --- MCP bridge handler for Codex and session-bound Kiro tools ---
2333
2429
  // Provides list_tools and call_tool operations over HTTP for mcp-bridge-server.js.
2334
2430
  // The normal Codex bridge excludes local MCP servers it manages natively;
@@ -2336,6 +2432,8 @@ function createProjectContext(opts) {
2336
2432
  function getMcpBridgeHandler(sessionId, sessionOnly, queryGeneration) {
2337
2433
  var boundSession = Number.isInteger(sessionId) ? sm.sessions.get(sessionId) : null;
2338
2434
  var queryToolBridge = createSessionQueryToolBridge({ session: boundSession, sdk: sdk });
2435
+ var externalQueryBridge = require('./mcp-query-bridge').createQueryBridge({ valid: sessionQueryValid,
2436
+ getServers: function () { return _mcp.getMcpServers(boundSession, sessionQueryValid()); } });
2339
2437
  function sessionQueryValid() {
2340
2438
  return !!boundSession
2341
2439
  && Number.isInteger(queryGeneration)
@@ -2460,7 +2558,7 @@ function createProjectContext(opts) {
2460
2558
  }
2461
2559
  }
2462
2560
 
2463
- if (sessionOnly) return Promise.resolve(tools);
2561
+ if (sessionOnly) return Promise.resolve(tools.concat(externalQueryBridge.list()));
2464
2562
 
2465
2563
  // In-app MCP servers (debate, browser, email).
2466
2564
  // Use getLocalMcpServers() so clay-browser is hidden unless the
@@ -2480,7 +2578,7 @@ function createProjectContext(opts) {
2480
2578
  }
2481
2579
 
2482
2580
  // Personal computer and remote URL connections.
2483
- var remoteServers = _mcp.getMcpServers(boundSession);
2581
+ var remoteServers = sessionQueryValid() ? _mcp.getMcpServers(boundSession, sessionQueryValid()) : {};
2484
2582
  if (remoteServers) {
2485
2583
  var remoteNames = Object.keys(remoteServers);
2486
2584
  for (var ri = 0; ri < remoteNames.length; ri++) {
@@ -2578,7 +2676,7 @@ function createProjectContext(opts) {
2578
2676
  if (serverName === "clay-sessions" || serverName === "clay-notes" || serverName === "clay-handoff" || serverName === "clay-documents" || serverName === "clay-shared-browser" || serverName === "clay-debate" || serverName === "clay-mate-creation" || serverName === "clay-workspace" || serverName === "clay-history" || serverName === "clay-github" || serverName === "clay-linear" || serverName === "clay-issues" || serverName === "clay-logs" || serverName === "clay-knowledge" || serverName === "clay-you") {
2579
2677
  return Promise.reject(new Error("Session-bound tool requires a valid Clay session: " + serverName + "/" + toolName));
2580
2678
  }
2581
- if (sessionOnly) return Promise.reject(new Error("Session tool not found: " + serverName + "/" + toolName));
2679
+ if (sessionOnly) return externalQueryBridge.call(serverName, toolName, args);
2582
2680
  // Try in-app servers first (gated by extension connectivity for clay-browser).
2583
2681
  var localMcp = getLocalMcpServers(boundSession);
2584
2682
  if (localMcp && localMcp[serverName]) {
@@ -2590,17 +2688,7 @@ function createProjectContext(opts) {
2590
2688
  }
2591
2689
  }
2592
2690
  }
2593
- // Try remote/local proxy servers
2594
- var remoteServers = _mcp.getMcpServers(boundSession);
2595
- if (remoteServers && remoteServers[serverName]) {
2596
- var rServer = remoteServers[serverName];
2597
- if (rServer.instance && rServer.instance._registeredTools && rServer.instance._registeredTools[toolName]) {
2598
- var rHandler = rServer.instance._registeredTools[toolName].handler;
2599
- if (typeof rHandler === "function") {
2600
- return Promise.resolve(rHandler(args));
2601
- }
2602
- }
2603
- }
2691
+ if (externalQueryBridge.list().some(function (tool) { return tool.server === serverName && tool.name === toolName; })) return externalQueryBridge.call(serverName, toolName, args);
2604
2692
  return Promise.reject(new Error("Tool not found: " + serverName + "/" + toolName));
2605
2693
  },
2606
2694
  };
@@ -2766,6 +2854,7 @@ function createProjectContext(opts) {
2766
2854
  return false;
2767
2855
  }));
2768
2856
  } catch (err) {
2857
+ shutdowns.push(Promise.resolve(false));
2769
2858
  console.error("[project] " + vendor + " shutdown threw for " + slug + ":", err && err.message ? err.message : err);
2770
2859
  }
2771
2860
  });
@@ -2909,15 +2998,32 @@ function createProjectContext(opts) {
2909
2998
  },
2910
2999
  getYouLinuxUser: getLinuxUserForSession,
2911
3000
  getStatus: getStatus,
3001
+ bindMateSchedule: function (session, intent, id) {
3002
+ return _mateLifecycle.create(session, require("./mate-schedule-input").normalize(intent), id);
3003
+ },
3004
+ cancelMateSchedule: function (session, record) { return _mateLifecycle.cancel(session, record); },
2912
3005
  getSessionManager: function () { return sm; },
2913
3006
  createDelegatedSession: _delegatedSession.createDelegatedSession,
3007
+ refreshEnvironmentRuntime: function () { return sdk.refreshEnvironmentRuntime(); },
3008
+ getWorkspaceProductOperations: function () { return isMate ? null : _workspaceOperations; },
3009
+ getMateChatControl: function () { return isMate ? _mateChatControl : null; },
3010
+ getMateScheduleControl: function () { return isMate ? _mateLifecycle : null; },
3011
+ getScheduledTaskControl: function () { return _scheduledTasks.productControl; },
3012
+ notifyIssueUpdate: _issues.notify,
3013
+ notifyLogUpdate: _projectLogs.broadcastUpdate,
3014
+ requestProductControlReview: _productControl.requestProductControlReview,
3015
+ applyProductSessionAction: _productControl.applyProductSessionAction,
3016
+ inspectProductSessionQueue: _productControl.inspectProductSessionQueue,
3017
+ inspectProductSessionRuntime: _sessions.sessionRuntimeActions.inspect,
3018
+ inspectMateLifecycleRuntime: _sessions.sessionRuntimeActions.inspectLifecycle,
2914
3019
  inspectDelegatedFollowUp: _delegatedFollowUp.inspectDelegatedFollowUp,
2915
3020
  dispatchDelegatedFollowUp: _delegatedFollowUp.dispatchDelegatedFollowUp,
2916
3021
  deliverCapsuleTurn: _capsuleTurn.deliverCapsuleTurn,
2917
3022
  unregisterHomeDebateClient: function (ws) { homeDebateClients.delete(ws); },
2918
3023
  handleHomeDebateProposalResponse: function (ws, msg, session) { return _debateProposal.handleHomeMessage(ws, msg, session); },
2919
3024
  handleHomeMateCreationProposalResponse: function (ws, msg, session) { return _mateCreationProposal.handleHomeMessage(ws, msg, session); },
2920
- handleHomeAskUserResponse: function (msg, session) { return _sessions.respondToAskUser(session, msg); },
3025
+ registerMcpConsentViewer: _mcp.registerConsentViewer,
3026
+ handleHomeAskUserResponse: function (msg, session, ws) { return _sessions.respondToAskUser(session, msg, ws); },
2921
3027
  handleHomePermissionResponse: function (ws, msg, session) { return _sessions.respondToHomePermission(ws, msg, session); },
2922
3028
  stopHomeSession: function (session) { return _sessions.stopHomeSession(session); },
2923
3029
  handleHomeDebateControl: function (ws, msg, session) { return _debate.handleHomeControl(ws, msg, session); },
@@ -2926,6 +3032,7 @@ function createProjectContext(opts) {
2926
3032
  getMemoryState: _memory.readMemoryState,
2927
3033
  listKnowledgeFiles: _knowledge.listKnowledgeFiles,
2928
3034
  getKnowledgeDbService: function () { return _knowledge.databases; },
3035
+ getKnowledgeProductOperations: function () { return _knowledge.productOperations; },
2929
3036
  refreshCapsuleCatalog: _capsuleCatalog.refreshSessions,
2930
3037
  getNotificationsModule: function () { return _notifications; },
2931
3038
  refreshVendorAuth: _vendorLogin.refreshVendorAuth,
package/lib/public/app.js CHANGED
@@ -285,6 +285,8 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
285
285
  mcpConnections: { screen: "list", servers: [], search: "", loaded: false },
286
286
  sharedBrowserOpen: false,
287
287
  sharedBrowserUi: {},
288
+ sharedBrowserSettings: {},
289
+ browserLinksBound: false,
288
290
  // session / routing
289
291
  basePath: basePath,
290
292
  wsPath: wsPath,
@@ -324,9 +326,12 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
324
326
  githubWorkSessions: [],
325
327
  githubWorkProject: null,
326
328
  githubWorkRefresh: null,
329
+ workPrimaryPending: null,
327
330
  activeProjectSlug: null,
328
331
  activeProjectMateId: null,
329
332
  activeProjectMateName: '',
333
+ clayReturnTarget: null,
334
+ clayReturnPendingProjectSlug: null,
330
335
  activeSessionMateId: null,
331
336
  activeSessionMateName: '',
332
337
  sessionActivatedProjectSlug: null,
@@ -0,0 +1,14 @@
1
+ (function () {
2
+ var root = document.documentElement;
3
+ var light = window.matchMedia && window.matchMedia("(prefers-color-scheme: light)").matches;
4
+ var seed = window.__clayAppearanceSeed;
5
+
6
+ function applyMode(mode) {
7
+ if (mode !== "light" && mode !== "dark") return;
8
+ root.classList.toggle("light-theme", mode === "light");
9
+ root.classList.toggle("dark-theme", mode !== "light");
10
+ }
11
+
12
+ var savedMode = seed && seed.configured && (seed.mode === "light" || seed.mode === "dark") ? seed.mode : null;
13
+ applyMode(savedMode || (light ? "light" : "dark"));
14
+ }());
@@ -0,0 +1,51 @@
1
+ /* Keep internal activity in the established compact tool disclosure rows. */
2
+ .clay-tool-activity .tool-name {
3
+ flex-shrink: 1;
4
+ min-width: 0;
5
+ overflow: hidden;
6
+ text-overflow: ellipsis;
7
+ white-space: nowrap;
8
+ }
9
+ .clay-tool-activity .tool-desc {
10
+ font-family: var(--font-ui);
11
+ flex: 0 1 auto;
12
+ }
13
+ .clay-tool-activity .tool-status-icon { margin-left: auto; }
14
+ .clay-tool-activity .tool-subtitle { display: none; }
15
+ .tool-header[role="button"]:focus-visible,
16
+ .tool-group-header[role="button"]:focus-visible {
17
+ outline: 2px solid var(--accent);
18
+ outline-offset: 2px;
19
+ }
20
+ .clay-tool-activity[data-activity-phase="running"] .tool-bullet {
21
+ animation: pulse 1.5s ease-in-out infinite;
22
+ }
23
+ .clay-tool-activity[data-activity-phase="pending"] .tool-bullet,
24
+ .tool-group[data-activity-phase="pending"] .tool-group-bullet {
25
+ background: var(--text-muted);
26
+ animation: none;
27
+ }
28
+ .clay-tool-activity[data-activity-phase="error"] .tool-name,
29
+ .clay-tool-activity[data-activity-phase="cancelled"] .tool-name,
30
+ .tool-group[data-activity-phase="error"] .tool-group-label { color: var(--error); }
31
+ .clay-tool-technical-name,
32
+ .clay-tool-evidence-label {
33
+ padding: 8px 14px 0;
34
+ color: var(--text-muted);
35
+ font-size: 12px;
36
+ overflow-wrap: anywhere;
37
+ }
38
+ .clay-tool-technical-name { font-family: "Roboto Mono", monospace; }
39
+ .clay-tool-evidence-label { font-weight: 600; }
40
+ @media (prefers-reduced-motion: reduce) {
41
+ .clay-tool-activity .tool-bullet { animation: none; }
42
+ }
43
+
44
+ @media (max-width: 600px) {
45
+ .clay-tool-activity .tool-name {
46
+ white-space: normal;
47
+ overflow-wrap: anywhere;
48
+ line-height: 1.4;
49
+ }
50
+ .clay-tool-activity .tool-desc { max-width: 35%; }
51
+ }
@@ -4,6 +4,35 @@
4
4
  padding: 0;
5
5
  cursor: pointer;
6
6
  }
7
+ .clay-brand-flip {
8
+ position: relative;
9
+ display: block;
10
+ width: 38px;
11
+ height: 38px;
12
+ transform-style: preserve-3d;
13
+ transition: transform 220ms cubic-bezier(.2,.75,.25,1);
14
+ }
15
+ .clay-brand-face {
16
+ position: absolute;
17
+ inset: 0;
18
+ width: 38px;
19
+ height: 38px;
20
+ object-fit: contain;
21
+ backface-visibility: hidden;
22
+ transition: opacity 120ms ease;
23
+ }
24
+ .clay-brand-avatar { transform: rotateY(180deg); border-radius: 11px; }
25
+ .icon-strip-brand[data-clay-mode="mate"] .clay-brand-flip { transform: rotateY(180deg); }
26
+ .icon-strip-brand:hover .clay-brand-flip,
27
+ .icon-strip-brand:focus-visible .clay-brand-flip,
28
+ .icon-strip-brand.clay-speaking[data-clay-mode="project"] .clay-brand-flip { transform: rotateY(180deg); }
29
+ .icon-strip-brand[data-clay-mode="mate"]:hover .clay-brand-flip,
30
+ .icon-strip-brand[data-clay-mode="mate"]:focus-visible .clay-brand-flip { transform: rotateY(0deg); }
31
+ .icon-strip-brand.clay-speaking[data-clay-mode="mate"] .clay-brand-flip { transform: rotateY(180deg); }
32
+ .icon-strip-brand.clay-speaking .clay-brand-face { transition-duration: 80ms; }
33
+ @media (prefers-reduced-motion: reduce) {
34
+ .clay-brand-flip, .clay-brand-face { transition: none; }
35
+ }
7
36
  .icon-strip-brand:hover::before {
8
37
  background: var(--bg-alt);
9
38
  box-shadow: 0 1px 2px rgba(var(--shadow-rgb), 0.08);
@@ -87,6 +87,8 @@
87
87
  }
88
88
 
89
89
  .home-debate-question-text { margin: 0 0 14px; font-size: 15px; }
90
+ .mcp-import-consent .home-debate-question-text,
91
+ .mcp-import-consent .ask-user-question-text { white-space: pre-line; font-size: 13px; line-height: 1.6; }
90
92
  .home-debate-question-form { display: grid; gap: 8px; }
91
93
  .home-debate-question-option {
92
94
  display: grid;
@@ -32,3 +32,8 @@
32
32
  .home-mate-proposal-facts dd + dt { margin-top: 7px; }
33
33
  .home-mate-proposal-actions button { flex: 1; }
34
34
  }
35
+
36
+ .home-mate-proposal-schedule-details { margin-top: 2px; color: var(--text-dimmer); }
37
+ .home-mate-proposal-schedule-details summary { width: fit-content; padding-block: 3px; cursor: pointer; font-weight: 400; }
38
+ .home-mate-proposal-schedule-details summary:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
39
+ .home-mate-proposal-schedule-details[open] > div { padding-top: 3px; color: var(--text-muted); }
@@ -0,0 +1,12 @@
1
+ /* Coin-size portraits in an explicit, compact visual catalog. */
2
+ .home-mate-avatar-selection { display: flex; align-items: center; gap: 10px; margin-bottom: 14px; }
3
+ .home-mate-avatar-selection p { color: var(--text-secondary); font-size: 12px; }
4
+ .home-mate-avatar-editor h4 { margin: 16px 0 8px; font-size: 13px; color: var(--text); }
5
+ .home-mate-avatar-choices { grid-template-columns: repeat(auto-fill, minmax(54px, 1fr)); gap: 5px; }
6
+ .home-mate-avatar-choice img { width: 42px; height: 42px; }
7
+ .home-mate-avatar-choice[aria-pressed="true"] { border: 2px solid var(--brand-indigo); padding: 4px 2px 5px; }
8
+ .home-mate-avatar-choice:disabled { cursor: default; opacity: .65; }
9
+ .home-mate-avatar-actions { position: sticky; bottom: 0; padding: 10px 0; background: var(--bg); z-index: 1; }
10
+ .home-mate-avatar-actions button.primary { background: var(--brand-indigo); color: white; border-color: var(--brand-indigo); }
11
+ @media (pointer: coarse) { .home-mate-avatar-choice { min-height: 62px; } }
12
+ .home-mate-avatar-actions .home-mate-avatar-status { flex: 0 0 100%; margin: 0; padding-top: 0; }
@@ -1,11 +1,16 @@
1
1
  /* Restore the Home conversation's reading measure inside Mate projects.
2
2
  The existing project renderer, queue and composer still own behavior. */
3
- body.mate-workspace-active { --content-width: 720px; }
4
- body.mate-workspace-active #messages { padding-inline: max(0px, calc((100% - 720px) / 2)); }
3
+ body.mate-workspace-active {
4
+ --mate-content-width: 860px;
5
+ --content-width: var(--mate-content-width);
6
+ }
7
+ body.mate-workspace-active #messages {
8
+ padding-inline: max(12px, calc((100% - var(--mate-content-width)) / 2));
9
+ }
5
10
  body.mate-workspace-active #messages > .msg-assistant,
6
11
  body.mate-workspace-active #messages > .msg-user {
7
12
  width: 100%;
8
- max-width: 720px;
13
+ max-width: var(--mate-content-width);
9
14
  box-sizing: border-box;
10
15
  margin: 0 auto 12px;
11
16
  padding: 4px 20px;
@@ -66,7 +71,7 @@ body.mate-workspace-active .msg-user:not(.msg-user-other):not(.msg-user-delegate
66
71
 
67
72
  /* One writing row, with secondary tools and model selection underneath.
68
73
  Display contents preserves the live controls and their event handlers. */
69
- body.mate-workspace-active #input-wrapper { max-width: 720px; }
74
+ body.mate-workspace-active #input-wrapper { max-width: var(--mate-content-width); }
70
75
  body.mate-workspace-active #input-row,
71
76
  body.mate-workspace-active #input-row:focus-within {
72
77
  display: grid;
@@ -144,7 +149,7 @@ body.mate-workspace-active #messages > .mate-thinking,
144
149
  body.mate-workspace-active #messages > .mate-permission,
145
150
  body.mate-workspace-active #messages > .mate-ask-user {
146
151
  box-sizing: border-box;
147
- max-width: 720px;
152
+ max-width: var(--mate-content-width);
148
153
  margin: 0 auto 12px;
149
154
  padding: 4px 20px;
150
155
  gap: 9px;
@@ -1360,8 +1360,10 @@ button.top-bar-pill.pill-accent:hover { background: color-mix(in srgb, var(--acc
1360
1360
  .connect-wordmark {
1361
1361
  display: block;
1362
1362
  width: clamp(142px, 15vw, 184px);
1363
- height: auto;
1364
- filter: brightness(0);
1363
+ aspect-ratio: 4742 / 1156;
1364
+ background: var(--text-muted);
1365
+ -webkit-mask: url("../clay-studio-wordmark-bold.svg") center / contain no-repeat;
1366
+ mask: url("../clay-studio-wordmark-bold.svg") center / contain no-repeat;
1365
1367
  }
1366
1368
 
1367
1369
  #connect-overlay-msg {
@@ -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; } }