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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (608) hide show
  1. package/README.md +0 -4
  2. package/lib/account-auth-socket.js +1 -0
  3. package/lib/builtin-mates.js +19 -16
  4. package/lib/bundled-skills/clay-agent-browser/SKILL.md +6 -2
  5. package/lib/canonical-clay-record-authority.js +15 -0
  6. package/lib/canonical-clay-scheduling-authority.js +19 -0
  7. package/lib/claude-hook-installer.js +1 -239
  8. package/lib/claude-jsonl-watcher.js +1 -204
  9. package/lib/clay-control-presentation-binding.js +96 -0
  10. package/lib/clay-control-presentation.js +128 -0
  11. package/lib/clay-control-target-projection.js +26 -0
  12. package/lib/clay-mate-chat-receipts.js +26 -0
  13. package/lib/clay-mate-chat.js +88 -0
  14. package/lib/clay-mate-knowledge-input.js +26 -0
  15. package/lib/clay-mate-knowledge.js +95 -0
  16. package/lib/clay-mate-lifecycle.js +95 -0
  17. package/lib/clay-product-control-input.js +33 -0
  18. package/lib/clay-product-control-tools.js +52 -0
  19. package/lib/clay-product-control.js +250 -0
  20. package/lib/clay-project-lifecycle.js +154 -0
  21. package/lib/clay-project-record-input.js +44 -0
  22. package/lib/clay-project-records.js +84 -0
  23. package/lib/clay-scheduling-input.js +21 -0
  24. package/lib/clay-scheduling-receipts.js +26 -0
  25. package/lib/clay-scheduling.js +119 -0
  26. package/lib/clay-screen-controls.js +104 -0
  27. package/lib/clay-skill-install.js +1 -33
  28. package/lib/clay-vendor-usage.js +44 -0
  29. package/lib/clay-workspace-controls.js +84 -0
  30. package/lib/clay-workspace-input.js +17 -0
  31. package/lib/clay-workspace-receipts.js +26 -0
  32. package/lib/cli-sessions.js +1 -300
  33. package/lib/codex-defaults.js +1 -28
  34. package/lib/context-usage.js +3 -2
  35. package/lib/contextual-screen-snapshot.js +38 -0
  36. package/lib/daemon-project-access.js +11 -0
  37. package/lib/daemon-project-lifecycle-callbacks.js +15 -0
  38. package/lib/daemon-project-lifecycle.js +262 -0
  39. package/lib/daemon-projects.js +1 -1
  40. package/lib/daemon.js +78 -276
  41. package/lib/default-ai-runtime.js +4 -8
  42. package/lib/dm-digest-cursor.js +120 -0
  43. package/lib/email-mcp-server.js +1 -1
  44. package/lib/github-star-count.js +147 -0
  45. package/lib/issues-service.js +29 -15
  46. package/lib/kiro-defaults.js +1 -22
  47. package/lib/knowledge-db-import-validation.js +46 -0
  48. package/lib/knowledge-db-import.js +99 -0
  49. package/lib/knowledge-db-service.js +24 -33
  50. package/lib/knowledge-db-storage-nedb-maintenance.js +99 -0
  51. package/lib/knowledge-db-storage-nedb.js +66 -0
  52. package/lib/knowledge-db-storage.js +72 -0
  53. package/lib/knowledge-db-validation.js +0 -0
  54. package/lib/knowledge-document-index.js +2 -1
  55. package/lib/knowledge-file-store.js +7 -1
  56. package/lib/knowledge-product-operations.js +46 -0
  57. package/lib/mate-avatar-catalog.js +12 -0
  58. package/lib/mate-avatar-migration.js +41 -0
  59. package/lib/mate-context-service.js +138 -0
  60. package/lib/mate-context-tools.js +21 -0
  61. package/lib/mate-creation-mcp-server.js +2 -0
  62. package/lib/mate-knowledge-canonical-access.js +10 -0
  63. package/lib/mate-knowledge-mate-bound.js +53 -0
  64. package/lib/mate-knowledge-mcp-server.js +55 -8
  65. package/lib/mate-knowledge-service.js +16 -34
  66. package/lib/mate-knowledge-text-tools.js +106 -0
  67. package/lib/mate-lifecycle-service.js +94 -0
  68. package/lib/mate-message-delivery.js +43 -0
  69. package/lib/mate-ready-creation.js +9 -1
  70. package/lib/mate-schedule-input.js +29 -0
  71. package/lib/mate-schedule-lifecycle.js +151 -0
  72. package/lib/mate-scheduling.js +103 -0
  73. package/lib/mates.js +18 -6
  74. package/lib/mcp-agent-tools.js +117 -0
  75. package/lib/mcp-connection-store.js +119 -15
  76. package/lib/mcp-import-credentials.js +31 -0
  77. package/lib/mcp-local-transport.js +13 -0
  78. package/lib/mcp-oauth.js +8 -6
  79. package/lib/mcp-proxy.js +2 -32
  80. package/lib/mcp-query-bridge.js +30 -0
  81. package/lib/mcp-remote-connections.js +74 -20
  82. package/lib/mcp-source-adapters.js +1 -0
  83. package/lib/mcp-source-context.js +1 -0
  84. package/lib/mcp-source-discovery.js +1 -0
  85. package/lib/mcp-source-plugins.js +1 -0
  86. package/lib/mcp-source-restrictions.js +1 -0
  87. package/lib/mcp-tool-policy.js +9 -0
  88. package/lib/notes-checklist.js +92 -0
  89. package/lib/notes.js +51 -4
  90. package/lib/os-user-diagnostics.js +2 -4
  91. package/lib/os-users.js +24 -70
  92. package/lib/pane-pending-interactions.js +20 -0
  93. package/lib/pane-session-activation.js +114 -0
  94. package/lib/pane-session-transport.js +26 -0
  95. package/lib/project-admin-overview.js +51 -0
  96. package/lib/project-ask-user.js +8 -4
  97. package/lib/project-connection.js +14 -10
  98. package/lib/project-control-git-view.js +12 -0
  99. package/lib/project-debate.js +1 -0
  100. package/lib/project-delegated-follow-up.js +2 -1
  101. package/lib/project-directory-claim.js +65 -0
  102. package/lib/project-file-operations.js +61 -0
  103. package/lib/project-filesystem.js +15 -85
  104. package/lib/project-full-access.js +23 -2
  105. package/lib/project-http.js +7 -4
  106. package/lib/project-knowledge.js +32 -18
  107. package/lib/project-lifecycle-operations.js +98 -0
  108. package/lib/project-lifecycle-process-witness.js +32 -0
  109. package/lib/project-lifecycle-runtime.js +50 -0
  110. package/lib/project-linux-access.js +22 -0
  111. package/lib/project-logs-canonical-clay.js +27 -0
  112. package/lib/project-logs-clay-query.js +16 -0
  113. package/lib/project-logs-schema.js +4 -2
  114. package/lib/project-logs-service.js +8 -7
  115. package/lib/project-logs.js +1 -0
  116. package/lib/project-loop.js +1 -0
  117. package/lib/project-mate-chat-control.js +55 -0
  118. package/lib/project-mate-creation-proposal.js +18 -3
  119. package/lib/project-mate-interaction.js +40 -62
  120. package/lib/project-mcp.js +54 -16
  121. package/lib/project-models.js +14 -31
  122. package/lib/project-notifications.js +76 -17
  123. package/lib/project-ownership.js +77 -0
  124. package/lib/project-pair-result-delivery.js +14 -3
  125. package/lib/project-pair-usage.js +12 -13
  126. package/lib/project-pending-message-queue.js +4 -1
  127. package/lib/project-product-control.js +89 -0
  128. package/lib/project-product-session-queue.js +46 -0
  129. package/lib/project-push-access.js +28 -0
  130. package/lib/project-scheduled-message-queue.js +30 -0
  131. package/lib/project-scheduled-messages.js +67 -68
  132. package/lib/project-scheduled-task-control.js +83 -0
  133. package/lib/project-scheduled-tasks.js +13 -2
  134. package/lib/project-scheduling-access.js +10 -0
  135. package/lib/project-session-actions.js +65 -0
  136. package/lib/project-session-delete.js +8 -1
  137. package/lib/project-session-document.js +27 -7
  138. package/lib/project-session-github.js +63 -19
  139. package/lib/project-session-history-actions.js +167 -0
  140. package/lib/project-session-linear.js +14 -6
  141. package/lib/project-session-notes.js +40 -11
  142. package/lib/project-session-pair.js +1 -1
  143. package/lib/project-session-runtime-actions.js +64 -0
  144. package/lib/project-session-spawn.js +2 -3
  145. package/lib/project-session-vendor.js +55 -0
  146. package/lib/project-sessions.js +160 -290
  147. package/lib/project-shared-browser.js +78 -17
  148. package/lib/project-start-protocol.js +29 -0
  149. package/lib/project-studio-presentation.js +58 -0
  150. package/lib/project-user-message.js +67 -1
  151. package/lib/project-vendor-login.js +8 -36
  152. package/lib/project-workspace-operations.js +126 -0
  153. package/lib/project-workspace-query.js +19 -2
  154. package/lib/project.js +181 -45
  155. package/lib/public/app.js +71 -17
  156. package/lib/public/appearance-bootstrap.js +16 -0
  157. package/lib/public/css/clay-tool-activity.css +51 -0
  158. package/lib/public/css/clay-workspace.css +29 -0
  159. package/lib/public/css/command-palette.css +12 -33
  160. package/lib/public/css/contextual-clay.css +240 -0
  161. package/lib/public/css/filebrowser.css +1 -1
  162. package/lib/public/css/home-debate-planning.css +2 -0
  163. package/lib/public/css/home-mate-creation.css +5 -0
  164. package/lib/public/css/input.css +6 -0
  165. package/lib/public/css/mate-avatar-gallery.css +12 -0
  166. package/lib/public/css/mate-conversation.css +10 -5
  167. package/lib/public/css/mate-loading-scene.css +21 -0
  168. package/lib/public/css/messages.css +6 -2
  169. package/lib/public/css/overlays.css +68 -258
  170. package/lib/public/css/project-admin-overview.css +13 -0
  171. package/lib/public/css/project-mate-creation.css +5 -6
  172. package/lib/public/css/project-start.css +108 -0
  173. package/lib/public/css/projects-hub.css +53 -14
  174. package/lib/public/css/session-folders.css +11 -0
  175. package/lib/public/css/session-github.css +46 -1
  176. package/lib/public/css/settings-shell.css +103 -0
  177. package/lib/public/css/shared-browser.css +35 -1
  178. package/lib/public/css/sidebar.css +7 -0
  179. package/lib/public/css/sticky-notes.css +87 -1
  180. package/lib/public/css/title-bar.css +79 -0
  181. package/lib/public/index.html +61 -68
  182. package/lib/public/mate-avatars/B01.png +0 -0
  183. package/lib/public/mate-avatars/B02.png +0 -0
  184. package/lib/public/mate-avatars/B03.png +0 -0
  185. package/lib/public/mate-avatars/B04.png +0 -0
  186. package/lib/public/mate-avatars/B05.png +0 -0
  187. package/lib/public/mate-avatars/B06.png +0 -0
  188. package/lib/public/mate-avatars/B07.png +0 -0
  189. package/lib/public/mate-avatars/B08.png +0 -0
  190. package/lib/public/mate-avatars/B09.png +0 -0
  191. package/lib/public/mate-avatars/B10.png +0 -0
  192. package/lib/public/mate-avatars/B11.png +0 -0
  193. package/lib/public/mate-avatars/B12.png +0 -0
  194. package/lib/public/mate-avatars/B13.png +0 -0
  195. package/lib/public/mate-avatars/B14.png +0 -0
  196. package/lib/public/mate-avatars/B15.png +0 -0
  197. package/lib/public/mate-avatars/B16.png +0 -0
  198. package/lib/public/mate-avatars/B17.png +0 -0
  199. package/lib/public/mate-avatars/B18.png +0 -0
  200. package/lib/public/mate-avatars/B19.png +0 -0
  201. package/lib/public/mate-avatars/B20.png +0 -0
  202. package/lib/public/mate-avatars/B21.png +0 -0
  203. package/lib/public/mate-avatars/B22.png +0 -0
  204. package/lib/public/mate-avatars/B23.png +0 -0
  205. package/lib/public/mate-avatars/B24.png +0 -0
  206. package/lib/public/mate-avatars/B25.png +0 -0
  207. package/lib/public/mate-avatars/B26.png +0 -0
  208. package/lib/public/mate-avatars/B27.png +0 -0
  209. package/lib/public/mate-avatars/B28.png +0 -0
  210. package/lib/public/mate-avatars/B29.png +0 -0
  211. package/lib/public/mate-avatars/B30.png +0 -0
  212. package/lib/public/mate-avatars/B31.png +0 -0
  213. package/lib/public/mate-avatars/B32.png +0 -0
  214. package/lib/public/mate-avatars/B33.png +0 -0
  215. package/lib/public/mate-avatars/B34.png +0 -0
  216. package/lib/public/mate-avatars/B35.png +0 -0
  217. package/lib/public/mate-avatars/B36.png +0 -0
  218. package/lib/public/mate-avatars/B37.png +0 -0
  219. package/lib/public/mate-avatars/B38.png +0 -0
  220. package/lib/public/mate-avatars/B39.png +0 -0
  221. package/lib/public/mate-avatars/B40.png +0 -0
  222. package/lib/public/mate-avatars/B41.png +0 -0
  223. package/lib/public/mate-avatars/B42.png +0 -0
  224. package/lib/public/mate-avatars/B43.png +0 -0
  225. package/lib/public/mate-avatars/B44.png +0 -0
  226. package/lib/public/mate-avatars/B45.png +0 -0
  227. package/lib/public/mate-avatars/B46.png +0 -0
  228. package/lib/public/mate-avatars/B47.png +0 -0
  229. package/lib/public/mate-avatars/B48.png +0 -0
  230. package/lib/public/mate-avatars/C01.png +0 -0
  231. package/lib/public/mate-avatars/C02.png +0 -0
  232. package/lib/public/mate-avatars/C03.png +0 -0
  233. package/lib/public/mate-avatars/C04.png +0 -0
  234. package/lib/public/mate-avatars/C05.png +0 -0
  235. package/lib/public/mate-avatars/C06.png +0 -0
  236. package/lib/public/mate-avatars/C07.png +0 -0
  237. package/lib/public/mate-avatars/C08.png +0 -0
  238. package/lib/public/mate-avatars/C09.png +0 -0
  239. package/lib/public/mate-avatars/C10.png +0 -0
  240. package/lib/public/mate-avatars/C11.png +0 -0
  241. package/lib/public/mate-avatars/C12.png +0 -0
  242. package/lib/public/mate-avatars/C13.png +0 -0
  243. package/lib/public/mate-avatars/C14.png +0 -0
  244. package/lib/public/mate-avatars/C15.png +0 -0
  245. package/lib/public/mate-avatars/C16.png +0 -0
  246. package/lib/public/mate-avatars/C17.png +0 -0
  247. package/lib/public/mate-avatars/C18.png +0 -0
  248. package/lib/public/mate-avatars/C19.png +0 -0
  249. package/lib/public/mate-avatars/C20.png +0 -0
  250. package/lib/public/mate-avatars/C21.png +0 -0
  251. package/lib/public/mate-avatars/C22.png +0 -0
  252. package/lib/public/mate-avatars/C23.png +0 -0
  253. package/lib/public/mate-avatars/C24.png +0 -0
  254. package/lib/public/mate-avatars/C25.png +0 -0
  255. package/lib/public/mate-avatars/C26.png +0 -0
  256. package/lib/public/mate-avatars/C27.png +0 -0
  257. package/lib/public/mate-avatars/C28.png +0 -0
  258. package/lib/public/mate-avatars/C29.png +0 -0
  259. package/lib/public/mate-avatars/C30.png +0 -0
  260. package/lib/public/mate-avatars/C31.png +0 -0
  261. package/lib/public/mate-avatars/C32.png +0 -0
  262. package/lib/public/mate-avatars/C33.png +0 -0
  263. package/lib/public/mate-avatars/C34.png +0 -0
  264. package/lib/public/mate-avatars/C35.png +0 -0
  265. package/lib/public/mate-avatars/C36.png +0 -0
  266. package/lib/public/mate-avatars/C37.png +0 -0
  267. package/lib/public/mate-avatars/C38.png +0 -0
  268. package/lib/public/mate-avatars/C39.png +0 -0
  269. package/lib/public/mate-avatars/C40.png +0 -0
  270. package/lib/public/mate-avatars/C41.png +0 -0
  271. package/lib/public/mate-avatars/C42.png +0 -0
  272. package/lib/public/mate-avatars/C43.png +0 -0
  273. package/lib/public/mate-avatars/C44.png +0 -0
  274. package/lib/public/mate-avatars/C45.png +0 -0
  275. package/lib/public/mate-avatars/C46.png +0 -0
  276. package/lib/public/mate-avatars/C47.png +0 -0
  277. package/lib/public/mate-avatars/C48.png +0 -0
  278. package/lib/public/mate-avatars/catalog.json +482 -0
  279. package/lib/public/mate-avatars/lead-clay.png +0 -0
  280. package/lib/public/modules/admin-settings-invitations.js +2 -2
  281. package/lib/public/modules/admin-settings-projects.js +8 -4
  282. package/lib/public/modules/admin-settings-ui.js +20 -4
  283. package/lib/public/modules/admin-settings-users.js +4 -4
  284. package/lib/public/modules/app-connection.js +11 -1
  285. package/lib/public/modules/app-favicon.js +18 -9
  286. package/lib/public/modules/app-header.js +7 -4
  287. package/lib/public/modules/app-home-hub.js +2 -1
  288. package/lib/public/modules/app-loop-ui.js +2 -0
  289. package/lib/public/modules/app-message-router.js +22 -1
  290. package/lib/public/modules/app-messages.js +125 -19
  291. package/lib/public/modules/app-misc.js +3 -1
  292. package/lib/public/modules/app-notifications.js +11 -5
  293. package/lib/public/modules/app-panels.js +61 -123
  294. package/lib/public/modules/app-projects.js +14 -407
  295. package/lib/public/modules/app-rate-limit.js +19 -28
  296. package/lib/public/modules/app-rendering.js +4 -3
  297. package/lib/public/modules/avatar.js +15 -41
  298. package/lib/public/modules/chat-render-runtime.js +20 -0
  299. package/lib/public/modules/clay-browser-links.js +47 -0
  300. package/lib/public/modules/clay-control-activity.js +214 -0
  301. package/lib/public/modules/clay-control-copy.js +36 -0
  302. package/lib/public/modules/clay-control-detail-targets.js +44 -0
  303. package/lib/public/modules/clay-control-object-targets.js +52 -0
  304. package/lib/public/modules/clay-control-target-visibility.js +12 -0
  305. package/lib/public/modules/clay-control-targets.js +44 -0
  306. package/lib/public/modules/clay-log-links.js +23 -0
  307. package/lib/public/modules/clay-navigation-render.js +52 -0
  308. package/lib/public/modules/clay-owner-navigation.js +33 -0
  309. package/lib/public/modules/clay-session-links.js +31 -0
  310. package/lib/public/modules/clay-studio-bridge.js +20 -0
  311. package/lib/public/modules/clay-studio-document.js +67 -0
  312. package/lib/public/modules/clay-studio-render.js +146 -0
  313. package/lib/public/modules/clay-tool-activity.js +140 -0
  314. package/lib/public/modules/clay-tool-presentation.js +343 -0
  315. package/lib/public/modules/command-palette.js +162 -40
  316. package/lib/public/modules/contextual-ask-session.js +26 -0
  317. package/lib/public/modules/contextual-clay-geometry.js +155 -0
  318. package/lib/public/modules/contextual-clay-session.js +130 -0
  319. package/lib/public/modules/contextual-clay-workspace.js +169 -0
  320. package/lib/public/modules/contextual-clay.js +252 -0
  321. package/lib/public/modules/contextual-composer.js +91 -0
  322. package/lib/public/modules/contextual-mate-context.js +117 -0
  323. package/lib/public/modules/contextual-mate-hint.js +40 -0
  324. package/lib/public/modules/contextual-mate-identity.js +23 -0
  325. package/lib/public/modules/contextual-mate-sessions.js +134 -0
  326. package/lib/public/modules/contextual-search.js +137 -0
  327. package/lib/public/modules/contextual-session-citations.js +58 -0
  328. package/lib/public/modules/debate.js +1 -0
  329. package/lib/public/modules/default-ai.js +11 -3
  330. package/lib/public/modules/elicitation-form.js +5 -0
  331. package/lib/public/modules/filebrowser.js +20 -1
  332. package/lib/public/modules/generation-stop.js +8 -5
  333. package/lib/public/modules/git-panel.js +3 -1
  334. package/lib/public/modules/github-star.js +66 -0
  335. package/lib/public/modules/history-replay-batch.js +13 -1
  336. package/lib/public/modules/home-debate-live.js +2 -0
  337. package/lib/public/modules/home-debate-planning.js +7 -7
  338. package/lib/public/modules/home-mate-avatar-editor.js +127 -208
  339. package/lib/public/modules/home-mate-chat.js +8 -6
  340. package/lib/public/modules/home-mate-creation.js +73 -1
  341. package/lib/public/modules/home-mate-settings.js +19 -12
  342. package/lib/public/modules/icon-strip-tooltip.js +2 -1
  343. package/lib/public/modules/input.js +88 -10
  344. package/lib/public/modules/issues-render.js +3 -2
  345. package/lib/public/modules/knowledge-db-workbench.js +4 -4
  346. package/lib/public/modules/markdown.js +6 -34
  347. package/lib/public/modules/mate-avatar-catalog.js +97 -0
  348. package/lib/public/modules/mate-knowledge-workbench.js +1 -1
  349. package/lib/public/modules/mate-loading-scene.js +17 -0
  350. package/lib/public/modules/mate-management.js +40 -7
  351. package/lib/public/modules/mcp-connection-view.js +31 -13
  352. package/lib/public/modules/mcp-discovery-view.js +31 -0
  353. package/lib/public/modules/mcp-ui.js +23 -4
  354. package/lib/public/modules/mention.js +3 -0
  355. package/lib/public/modules/message-delivery.js +20 -2
  356. package/lib/public/modules/model-picker.js +2 -0
  357. package/lib/public/modules/pane-activation.js +214 -0
  358. package/lib/public/modules/pane-binding.js +82 -0
  359. package/lib/public/modules/pane-bridge.js +7 -4
  360. package/lib/public/modules/pane-browser-bridge.js +22 -0
  361. package/lib/public/modules/pane-file-bridge.js +4 -0
  362. package/lib/public/modules/pane-issue-bridge.js +4 -1
  363. package/lib/public/modules/pending-message-queue.js +1 -0
  364. package/lib/public/modules/permission-control.js +5 -4
  365. package/lib/public/modules/personal-settings-dialog.js +7 -1
  366. package/lib/public/modules/product-review.js +26 -0
  367. package/lib/public/modules/profile.js +12 -241
  368. package/lib/public/modules/project-access-recovery.js +17 -0
  369. package/lib/public/modules/project-admin-overview.js +21 -0
  370. package/lib/public/modules/project-chat-identity.js +13 -4
  371. package/lib/public/modules/project-logs-render.js +3 -0
  372. package/lib/public/modules/project-mate-creation-workspace.js +13 -4
  373. package/lib/public/modules/project-mate-navigation.js +144 -22
  374. package/lib/public/modules/project-session-visibility-settings.js +19 -16
  375. package/lib/public/modules/project-settings.js +119 -129
  376. package/lib/public/modules/project-start-dialog.js +130 -0
  377. package/lib/public/modules/project-start-folder-state.js +78 -0
  378. package/lib/public/modules/project-start-folder-view.js +190 -0
  379. package/lib/public/modules/project-start-forms.js +66 -0
  380. package/lib/public/modules/project-start-path.js +60 -0
  381. package/lib/public/modules/project-start-state.js +54 -0
  382. package/lib/public/modules/project-start-submit.js +67 -0
  383. package/lib/public/modules/projects-hub-view.js +33 -14
  384. package/lib/public/modules/projects-hub.js +10 -6
  385. package/lib/public/modules/rewind.js +5 -0
  386. package/lib/public/modules/scheduled-tasks.js +2 -0
  387. package/lib/public/modules/scheduler.js +2 -0
  388. package/lib/public/modules/search-clay-chat.js +5 -440
  389. package/lib/public/modules/server-settings.js +36 -91
  390. package/lib/public/modules/session-actions.js +5 -2
  391. package/lib/public/modules/session-context-menu.js +5 -0
  392. package/lib/public/modules/session-create-form.js +10 -10
  393. package/lib/public/modules/session-folder-layout.js +1 -1
  394. package/lib/public/modules/session-folder-view-menu.js +9 -0
  395. package/lib/public/modules/session-github.js +85 -14
  396. package/lib/public/modules/session-rich-drafts.js +21 -0
  397. package/lib/public/modules/session-switch-defer.js +67 -0
  398. package/lib/public/modules/session-work-primary.js +51 -0
  399. package/lib/public/modules/settings-defaults.js +27 -28
  400. package/lib/public/modules/settings-project-target.js +56 -0
  401. package/lib/public/modules/settings-select.js +1 -1
  402. package/lib/public/modules/settings-shell-registry.js +88 -0
  403. package/lib/public/modules/settings-shell-view.js +104 -0
  404. package/lib/public/modules/settings-shell.js +342 -0
  405. package/lib/public/modules/shared-browser-settings.js +112 -0
  406. package/lib/public/modules/shared-browser-tabs.js +13 -3
  407. package/lib/public/modules/shared-browser.js +29 -6
  408. package/lib/public/modules/sidebar-mobile.js +12 -33
  409. package/lib/public/modules/sidebar-projects.js +3 -1
  410. package/lib/public/modules/sidebar-session-folders-ui.js +1 -1
  411. package/lib/public/modules/sidebar-sessions.js +1 -0
  412. package/lib/public/modules/split-group-restore.js +68 -0
  413. package/lib/public/modules/split-pair-ui.js +1 -0
  414. package/lib/public/modules/split-pane-reconciler.js +15 -0
  415. package/lib/public/modules/split-pane-renderer.js +87 -6
  416. package/lib/public/modules/split-session-boundary.js +1 -1
  417. package/lib/public/modules/split-view.js +60 -68
  418. package/lib/public/modules/sticky-note-markdown.js +72 -6
  419. package/lib/public/modules/sticky-notes-actions.js +30 -0
  420. package/lib/public/modules/sticky-notes-browser.js +9 -2
  421. package/lib/public/modules/sticky-notes-card.js +23 -7
  422. package/lib/public/modules/sticky-notes-checklist.js +116 -0
  423. package/lib/public/modules/sticky-notes-editor.js +108 -44
  424. package/lib/public/modules/sticky-notes-shared.js +50 -2
  425. package/lib/public/modules/sticky-notes-state.js +66 -0
  426. package/lib/public/modules/sticky-notes.js +34 -51
  427. package/lib/public/modules/stt-controller.js +4 -1
  428. package/lib/public/modules/stt-recording.js +1 -1
  429. package/lib/public/modules/stt.js +7 -2
  430. package/lib/public/modules/terminal.js +9 -0
  431. package/lib/public/modules/theme.js +18 -3
  432. package/lib/public/modules/thinking-lifecycle.js +33 -3
  433. package/lib/public/modules/thinking-view.js +23 -1
  434. package/lib/public/modules/tools.js +60 -11
  435. package/lib/public/modules/tui-grab.js +1 -2
  436. package/lib/public/modules/user-settings-appearance.js +10 -3
  437. package/lib/public/modules/user-settings-editors.js +1 -1
  438. package/lib/public/modules/user-settings-layout.js +14 -30
  439. package/lib/public/modules/user-settings-preferences.js +6 -2
  440. package/lib/public/modules/user-settings-profile.js +13 -3
  441. package/lib/public/modules/user-settings.js +18 -84
  442. package/lib/public/modules/vendor-login-browser.js +5 -3
  443. package/lib/public/modules/vendor-login.js +2 -2
  444. package/lib/public/modules/vendor-priority.js +15 -1
  445. package/lib/public/modules/vendor-usage-format.js +93 -0
  446. package/lib/public/modules/vendor-usage-list.js +45 -0
  447. package/lib/public/modules/vendor-usage-model.js +215 -0
  448. package/lib/public/modules/vendor-usage-overview.js +312 -0
  449. package/lib/public/modules/wireframe-workbench.js +5 -2
  450. package/lib/public/muse-avatar.svg +4 -0
  451. package/lib/public/style.css +14 -6
  452. package/lib/public/sw.js +3 -1
  453. package/lib/public/welcome-art/conversation-desk.png +0 -0
  454. package/lib/public/welcome-art/mate-clay.png +0 -0
  455. package/lib/public/welcome-art/project-clay.png +0 -0
  456. package/lib/safe-bash-commands.js +3 -45
  457. package/lib/scheduled-task-records.js +3 -1
  458. package/lib/scheduler.js +2 -0
  459. package/lib/sdk-bridge.js +348 -402
  460. package/lib/sdk-foreground-admission.js +16 -0
  461. package/lib/sdk-mcp-descriptors.js +2 -37
  462. package/lib/sdk-message-processor.js +61 -18
  463. package/lib/sdk-quota-snapshot.js +21 -3
  464. package/lib/sdk-response-recovery.js +1 -0
  465. package/lib/sdk-worker.js +2 -677
  466. package/lib/server-admin.js +63 -16
  467. package/lib/server-appearance-settings.js +13 -1
  468. package/lib/server-contextual-clay-settings.js +40 -0
  469. package/lib/server-contextual-mate-sessions.js +70 -0
  470. package/lib/server-dm.js +2 -1
  471. package/lib/server-github-stars.js +39 -0
  472. package/lib/server-global-ws.js +26 -32
  473. package/lib/server-home-chat-events.js +18 -4
  474. package/lib/server-home-chat.js +22 -20
  475. package/lib/server-home-clay-entry.js +23 -4
  476. package/lib/server-home-clay-session-links.js +29 -9
  477. package/lib/server-home-mate-creation.js +1 -0
  478. package/lib/server-home-mcp-consent.js +14 -0
  479. package/lib/server-mates.js +25 -62
  480. package/lib/server-owner-ui.js +118 -0
  481. package/lib/server-path-access.js +38 -0
  482. package/lib/server-project-removal.js +22 -0
  483. package/lib/server-settings.js +6 -1
  484. package/lib/server.js +167 -43
  485. package/lib/session-config-transition.js +45 -0
  486. package/lib/session-folders.js +7 -2
  487. package/lib/session-fork-history.js +21 -0
  488. package/lib/session-github.js +9 -2
  489. package/lib/session-hygiene.js +3 -35
  490. package/lib/session-notes-mcp-server.js +26 -4
  491. package/lib/session-notes-writes.js +88 -0
  492. package/lib/session-permission-mode.js +4 -3
  493. package/lib/session-skill-scope.js +11 -0
  494. package/lib/session-visibility.js +25 -10
  495. package/lib/session-work-primary.js +50 -0
  496. package/lib/sessions.js +66 -99
  497. package/lib/shared-browser-cookie-sync.js +32 -0
  498. package/lib/shared-browser-cookies.js +79 -0
  499. package/lib/shared-browser-runtime.js +25 -9
  500. package/lib/shared-browser-storage-sync.js +43 -0
  501. package/lib/shared-browser-storage.js +101 -0
  502. package/lib/shared-browser-tools.js +2 -1
  503. package/lib/shared-browser-worker.js +46 -10
  504. package/lib/terminal-manager.js +65 -6
  505. package/lib/tool-llm.js +1 -1
  506. package/lib/tui-transcript-index.js +1 -132
  507. package/lib/users-contextual-clay-preferences.js +31 -0
  508. package/lib/users-permissions.js +2 -8
  509. package/lib/users.js +7 -0
  510. package/lib/vendor-login-browser.js +1 -11
  511. package/lib/vendor-usage-acp-readers.js +97 -0
  512. package/lib/vendor-usage-capabilities.js +88 -0
  513. package/lib/vendor-usage-http-readers.js +214 -0
  514. package/lib/vendor-usage-metrics.js +47 -0
  515. package/lib/vendor-usage-native-readers.js +106 -0
  516. package/lib/vendor-usage-overview.js +406 -0
  517. package/lib/vendor-usage-service.js +281 -0
  518. package/lib/workspace-assignment-service.js +25 -0
  519. package/lib/workspace-query-access.js +4 -1
  520. package/lib/workspace-query-mcp-server.js +1 -1
  521. package/lib/workspace-query-service.js +13 -2
  522. package/lib/ws-request.js +1 -0
  523. package/lib/ws-schema.js +22 -4
  524. package/lib/yoke/acp-agent-profiles.js +7 -5
  525. package/lib/yoke/adapters/antigravity.js +3 -14
  526. package/lib/yoke/adapters/claude-query-contract.js +9 -0
  527. package/lib/yoke/adapters/claude.js +66 -50
  528. package/lib/yoke/adapters/codex-query-contract.js +25 -0
  529. package/lib/yoke/adapters/codex.js +98 -123
  530. package/lib/yoke/adapters/kiro.js +3 -1
  531. package/lib/yoke/adapters/muse-query-contract.js +7 -0
  532. package/lib/yoke/adapters/muse.js +122 -0
  533. package/lib/yoke/auth-events.js +17 -0
  534. package/lib/yoke/claude-hook-installer.js +272 -0
  535. package/lib/yoke/claude-jsonl-watcher.js +204 -0
  536. package/lib/yoke/claude-maintenance.js +55 -0
  537. package/lib/yoke/claude-permission-patterns.js +53 -0
  538. package/lib/yoke/claude-response-recovery.js +155 -0
  539. package/lib/yoke/claude-transcript-hygiene.js +34 -0
  540. package/lib/yoke/claude-worker-startup.js +28 -0
  541. package/lib/yoke/clay-skill-install.js +33 -0
  542. package/lib/yoke/cli-sessions.js +300 -0
  543. package/lib/yoke/codex-app-server.js +7 -12
  544. package/lib/yoke/codex-dynamic-tool-names.js +80 -0
  545. package/lib/yoke/codex-idle-recovery.js +81 -1
  546. package/lib/yoke/codex-model-catalog.js +37 -3
  547. package/lib/yoke/codex-recovery-admission.js +164 -0
  548. package/lib/yoke/configuration.js +13 -0
  549. package/lib/yoke/discovery.js +70 -0
  550. package/lib/yoke/errors.js +8 -0
  551. package/lib/yoke/host-environment.js +7 -0
  552. package/lib/yoke/index.js +9 -51
  553. package/lib/yoke/interface.js +116 -0
  554. package/lib/yoke/kiro-acp-server.js +5 -5
  555. package/lib/yoke/legacy-sessions.js +89 -0
  556. package/lib/yoke/login-protocol.js +25 -0
  557. package/lib/yoke/maintenance.js +12 -0
  558. package/lib/yoke/mcp-proxy.js +32 -0
  559. package/lib/yoke/mcp-source-adapters.js +91 -0
  560. package/lib/yoke/mcp-source-context.js +42 -0
  561. package/lib/yoke/mcp-source-discovery.js +169 -0
  562. package/lib/yoke/mcp-source-plugins.js +68 -0
  563. package/lib/yoke/mcp-source-restrictions.js +47 -0
  564. package/lib/yoke/mcp-tool-policy-normalize.js +28 -0
  565. package/lib/yoke/model-preferences.js +6 -0
  566. package/lib/yoke/muse-artifacts.js +36 -0
  567. package/lib/yoke/muse-controls.js +50 -0
  568. package/lib/yoke/muse-input.js +64 -0
  569. package/lib/yoke/muse-items.js +157 -0
  570. package/lib/yoke/muse-policy.js +52 -0
  571. package/lib/yoke/muse-query.js +428 -0
  572. package/lib/yoke/muse-runtime.js +211 -0
  573. package/lib/yoke/muse-services.js +92 -0
  574. package/lib/yoke/muse-skills.js +79 -0
  575. package/lib/yoke/muse-turns.js +71 -0
  576. package/lib/yoke/options/acp.js +2 -0
  577. package/lib/yoke/options/antigravity.js +2 -0
  578. package/lib/yoke/options/claude.js +21 -0
  579. package/lib/yoke/options/codex-defaults.js +29 -0
  580. package/lib/yoke/options/codex-settings.js +21 -0
  581. package/lib/yoke/options/codex.js +6 -0
  582. package/lib/yoke/options/kiro-defaults.js +22 -0
  583. package/lib/yoke/options/kiro.js +5 -0
  584. package/lib/yoke/options/muse.js +5 -0
  585. package/lib/yoke/provider-contract.js +5 -0
  586. package/lib/yoke/providers/antigravity-executable.js +8 -0
  587. package/lib/yoke/providers/claude-executable.js +40 -0
  588. package/lib/yoke/providers/claude-model-descriptions.js +34 -0
  589. package/lib/yoke/providers/claude-process.js +97 -0
  590. package/lib/yoke/providers/claude-provision.js +75 -0
  591. package/lib/yoke/providers/codex-errors.js +8 -0
  592. package/lib/yoke/providers/muse-executable.js +17 -0
  593. package/lib/yoke/provisioning.js +6 -0
  594. package/lib/yoke/query-options.js +10 -0
  595. package/lib/yoke/response-recovery.js +41 -0
  596. package/lib/yoke/sdk-mcp-descriptors.js +37 -0
  597. package/lib/yoke/sdk-server-factory.js +7 -0
  598. package/lib/yoke/session-history.js +8 -0
  599. package/lib/yoke/session-tool-transport.js +34 -13
  600. package/lib/yoke/settings.js +23 -0
  601. package/lib/yoke/source-locations.js +4 -0
  602. package/lib/yoke/title-query.js +18 -7
  603. package/lib/yoke/tui-transcript-index.js +132 -0
  604. package/lib/yoke/usage.js +48 -0
  605. package/lib/yoke/user-input.js +13 -0
  606. package/lib/yoke/vendor-registry.js +87 -3
  607. package/package.json +11 -4
  608. package/lib/public/modules/server-settings-navigation.js +0 -39
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;
@@ -451,7 +459,8 @@ function createProjectContext(opts) {
451
459
  if (obj.type === "loop_registry_updated") payload.records = getHubSchedules(userId);
452
460
  else payload.schedules = getHubSchedules(userId);
453
461
  }
454
- ws.send(JSON.stringify(payload));
462
+ payload = require('./pane-session-transport').outbound(ws, payload);
463
+ if (payload) ws.send(JSON.stringify(payload));
455
464
  }
456
465
 
457
466
  function sendToAdmins(obj) {
@@ -543,24 +552,27 @@ function createProjectContext(opts) {
543
552
  || !!(ws._clayUser && ws._clayUser.id === session.userKnowledgeOwnerId);
544
553
  }
545
554
 
546
- function sendToSession(sessionId, obj) {
547
- var data = JSON.stringify(obj);
555
+ function sendToSession(sessionId, obj, onSent) {
556
+ var data = JSON.stringify(obj), delivered = 0;
548
557
  for (var ws of clients) {
549
558
  if (ws.readyState === 1 && canReceiveMate(ws) && canReceiveYou(ws, sessionId) && ws._clayActiveSession === sessionId) {
550
- ws.send(data);
559
+ var panePayload = require('./pane-session-transport').outbound(ws, obj, sessionId);
560
+ if (panePayload) { ws.send(JSON.stringify(panePayload)); delivered++; if (onSent) onSent(ws); }
551
561
  }
552
562
  }
553
563
  homeDebateClients.forEach(function (ws) {
554
564
  if (ws.readyState !== 1) { homeDebateClients.delete(ws); return; }
555
- if (canReceiveMate(ws) && canReceiveYou(ws, sessionId) && !clients.has(ws) && ws._clayHomeDebateSlug === slug && ws._clayActiveSession === sessionId) ws.send(data);
565
+ if (canReceiveMate(ws) && canReceiveYou(ws, sessionId) && !clients.has(ws) && ws._clayHomeDebateSlug === slug && ws._clayActiveSession === sessionId) { ws.send(data); delivered++; if (onSent) onSent(ws); }
556
566
  });
567
+ return delivered;
557
568
  }
558
569
 
559
570
  function sendToSessionOthers(sender, sessionId, obj) {
560
571
  var data = JSON.stringify(obj);
561
572
  for (var ws of clients) {
562
573
  if (ws !== sender && ws.readyState === 1 && canReceiveMate(ws) && canReceiveYou(ws, sessionId) && ws._clayActiveSession === sessionId) {
563
- ws.send(data);
574
+ var panePayload = require('./pane-session-transport').outbound(ws, obj, sessionId);
575
+ if (panePayload) ws.send(JSON.stringify(panePayload));
564
576
  }
565
577
  }
566
578
  }
@@ -646,7 +658,8 @@ function createProjectContext(opts) {
646
658
  var access = opts.getProjectAccess ? opts.getProjectAccess() : { visibility: "public", ownerId: projectOwnerId || null };
647
659
  if (!viewer || (opts.canAccessProjectSlug && !opts.canAccessProjectSlug(viewer.id, slug)) || !usersModule.canAccessSession(viewer.id, session, access)) return;
648
660
  }
649
- ws.send(data);
661
+ var panePayload = ws._clayPaneActivation ? require('./pane-session-transport').outbound(ws, message, session.localId) : message;
662
+ if (panePayload) ws.send(panePayload === message ? data : JSON.stringify(panePayload));
650
663
  });
651
664
  },
652
665
  authorize: function (session, actor) {
@@ -709,7 +722,22 @@ function createProjectContext(opts) {
709
722
 
710
723
  // Personal computer tools use the extension; remote URLs are owner-bound.
711
724
  var _mcp = attachMcp({
712
- sendTo: sendTo, slug: slug, clients: clients,
725
+ sendTo: sendTo, slug: slug, clients: clients, cwd: cwd,
726
+ userInput: function (session) { return _askUser.createHandler(session); },
727
+ runtimeEnvForSession: getRuntimeEnvForSession,
728
+ canDiscoverSession: function (session) { var scope = _requestAccess.fileScope({ _clayUser: session.ownerId && usersModule.findUserById(session.ownerId) }); return !!scope.identity || !scope.projectBound; },
729
+ sessionVendor: function (session) { return session.vendor || sm.defaultVendor || "claude"; },
730
+ runtimeEnv: function (owner, ws) { return resolveOwnerRuntimeEnv(_requestAccess.fileScope(ws).identity); },
731
+ canDiscover: function (ws) { var scope = _requestAccess.fileScope(ws); return !!scope.identity || !scope.projectBound; },
732
+ ownerIdentity: function (owner) {
733
+ if (!osUsers) {
734
+ if (usersModule.isMultiUser() && (usersModule.getAllUsers().length !== 1 || !usersModule.findUserById(owner))) throw new Error('Local MCP requires OS user mapping in a shared installation.');
735
+ return null;
736
+ }
737
+ var user = usersModule.findUserById(owner);
738
+ if (!user || !user.linuxUser) throw new Error('OS user identity is unavailable.');
739
+ return getOsUserInfoForWs({ _clayUser: user });
740
+ },
713
741
  root: require("./config").CONFIG_DIR,
714
742
  isMultiUser: function () { return usersModule.isMultiUser(); },
715
743
  canAccess: function (ws) { return _requestAccess.canAccessProject(ws, slug); },
@@ -768,8 +796,15 @@ function createProjectContext(opts) {
768
796
  }
769
797
  },
770
798
  });
799
+ var _studioPresentation = require('./project-studio-presentation').attachStudioPresentation({
800
+ getPresentation: function (session) { return _workspaceQuery && _workspaceQuery.getPresentation(session); },
801
+ getSessionForWs: getSessionForWs,
802
+ });
771
803
  var _sharedBrowser = attachSharedBrowser({
772
- slug: slug, isMate: isMate, sm: sm, clients: clients, sendTo: sendTo,
804
+ studioPresentation: _studioPresentation,
805
+ sendToSession: sendToSession,
806
+ getPresentation: function (session) { return _workspaceQuery && _workspaceQuery.getPresentation(session); },
807
+ slug: slug, isMate: isMate, ownerId: projectOwnerId, sm: sm, clients: clients, sendTo: sendTo,
773
808
  usersModule: usersModule, requestAccess: _requestAccess, osUsers: osUsers,
774
809
  getSessionForWs: getSessionForWs,
775
810
  getIdentity: function (session) {
@@ -778,8 +813,11 @@ function createProjectContext(opts) {
778
813
  },
779
814
  });
780
815
  var _sessionDocument = attachSessionDocument({
816
+ studioPresentation: _studioPresentation,
817
+ getPresentation: function (session) { return _workspaceQuery && _workspaceQuery.getPresentation(session); },
781
818
  cwd: cwd,
782
819
  isMate: isMate,
820
+ canUseSession: _sessionNotes.canUseSession,
783
821
  sendToSession: sendToSession,
784
822
  FS_MAX_SIZE: FS_MAX_SIZE,
785
823
  getOsUserInfoForSession: function (session) {
@@ -799,6 +837,8 @@ function createProjectContext(opts) {
799
837
  });
800
838
  var _workspaceQuery = attachProjectWorkspaceQuery({
801
839
  service: opts.workspaceQueryService || null,
840
+ controlService: opts.clayProductControl || null,
841
+ contextService: opts.mateContextService || null,
802
842
  sm: sm,
803
843
  projectSlug: slug,
804
844
  getProjectOwnerId: function () { return projectOwnerId; },
@@ -839,7 +879,12 @@ function createProjectContext(opts) {
839
879
  sendTo: sendTo, getClients: function () { return clients; }, startWork: _issueWork,
840
880
  });
841
881
  var _sessionGithub = require("./project-session-github").attachSessionGithub({
842
- cwd: cwd, sm: sm, isMate: isMate, osUsers: osUsers,
882
+ cwd: cwd, sm: sm, isMate: isMate, osUsers: osUsers, projectSlug: slug, sendTo: sendTo,
883
+ userInput: function (session) { return _askUser.createHandler(session); },
884
+ canAccess: function (ws) {
885
+ return !isMate && clients.has(ws) && ws.readyState === 1 && (!usersModule.isMultiUser() ||
886
+ !!(ws._clayUser && usersModule.findUserById(ws._clayUser.id) && opts.canAccessProjectSlug(ws._clayUser.id, slug)));
887
+ },
843
888
  canUse: function (session) {
844
889
  if (session.hidden || session.delegated || session._pairDelegation || session._delegatedBy || require("./session-provenance").isWorker(session)) return false;
845
890
  if (!usersModule.isMultiUser()) return true;
@@ -858,9 +903,10 @@ function createProjectContext(opts) {
858
903
  });
859
904
  var _sessionLinear = require("./project-session-linear").attachSessionLinear({
860
905
  sm: sm, isMate: isMate, storage: opts.linearStorage, projectSlug: slug,
906
+ userInput: function (session) { return _askUser.createHandler(session); },
861
907
  isMultiUser: usersModule.isMultiUser, sendTo: sendTo,
862
908
  canAccess: function (ws) {
863
- return !isMate && clients.has(ws) && ws.readyState === 1 && (!usersModule.isMultiUser() ||
909
+ return clients.has(ws) && ws.readyState === 1 && (!usersModule.isMultiUser() ||
864
910
  !!(ws._clayUser && usersModule.findUserById(ws._clayUser.id) && opts.canAccessProjectSlug(ws._clayUser.id, slug)));
865
911
  },
866
912
  startWork: require('./project-linear-launch').attachLinearLaunch({
@@ -1021,6 +1067,7 @@ function createProjectContext(opts) {
1021
1067
  persistSession: function (session) { return sm.saveSessionFile(session); },
1022
1068
  getVendorModelCatalog: function (ws, vendor) { return _models.getVendorCatalog(ws, vendor); },
1023
1069
  createReadyMate: opts.createReadyMate,
1070
+ isLive: function (session) { return sm.sessions.get(session.localId) === session; },
1024
1071
  });
1025
1072
  var _askUser = attachAskUser({
1026
1073
  record: function (session, event) { sm.sendAndRecord(session, event); },
@@ -1055,14 +1102,12 @@ function createProjectContext(opts) {
1055
1102
  }
1056
1103
  }
1057
1104
 
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
- }
1105
+ // Shared sticky-note memory is available in both owner-private projects and Mates.
1106
+ try {
1107
+ var sessionNotesMcpConfig = _sessionNotes.createMcpServer(adapter);
1108
+ if (sessionNotesMcpConfig) servers[sessionNotesMcpConfig.name || "clay-notes"] = sessionNotesMcpConfig;
1109
+ } catch (e) {
1110
+ console.error("[project] Failed to create session notes MCP server:", e.message);
1066
1111
  }
1067
1112
 
1068
1113
  // Project Logs. Project sessions get the project-scoped set; Mate projects
@@ -1107,13 +1152,11 @@ function createProjectContext(opts) {
1107
1152
  if (sharedBrowserConfig) servers["clay-shared-browser"] = sharedBrowserConfig;
1108
1153
 
1109
1154
  // 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
- }
1155
+ try {
1156
+ var sessionDocumentMcpConfig = _sessionDocument.createMcpServer(adapter);
1157
+ if (sessionDocumentMcpConfig) servers[sessionDocumentMcpConfig.name || "clay-documents"] = sessionDocumentMcpConfig;
1158
+ } catch (e) {
1159
+ console.error("[project] Failed to create session document MCP server:", e.message);
1117
1160
  }
1118
1161
 
1119
1162
  // Debate MCP server (available to both mates and main project)
@@ -1383,6 +1426,7 @@ function createProjectContext(opts) {
1383
1426
 
1384
1427
  // --- SDK bridge ---
1385
1428
  sdk = createSDKBridge({
1429
+ isLifecycleExecutionPaused: function () { return !!(opts.getProjectAccess && opts.getProjectAccess().lifecycleExecutionPaused); },
1386
1430
  cwd: cwd,
1387
1431
  slug: slug,
1388
1432
  sessionManager: sm,
@@ -1458,6 +1502,7 @@ function createProjectContext(opts) {
1458
1502
  _sessionGithub.getSystemPrompt(session),
1459
1503
  _sessionLinear.getSystemPrompt(session),
1460
1504
  _scheduledTasks ? _scheduledTasks.getSystemPrompt(session) : "",
1505
+ _mateScheduling ? _mateScheduling.getSystemPrompt(session) : "",
1461
1506
  _mateKnowledge.getSystemPrompt(session),
1462
1507
  _userKnowledge.getSystemPrompt(session),
1463
1508
  _autonomousRun ? _autonomousRun.getSystemPrompt(session) : "",
@@ -1487,6 +1532,7 @@ function createProjectContext(opts) {
1487
1532
  .concat(opts.userKnowledgeService ? _userKnowledge.getDynamicToolDefs(session) : [])
1488
1533
  .concat(_loopInterview ? _loopInterview.getToolDefs(session) : [])
1489
1534
  .concat(_scheduledTasks ? _scheduledTasks.getToolDefs(session) : [])
1535
+ .concat(_mateScheduling ? _mateScheduling.getToolDefs(session) : [])
1490
1536
  .concat(_scheduledTaskExecution ? _scheduledTaskExecution.getToolDefs(session) : [])
1491
1537
  .concat(_autonomousRun ? _autonomousRun.getToolDefs(session) : []);
1492
1538
  },
@@ -1542,6 +1588,8 @@ function createProjectContext(opts) {
1542
1588
 
1543
1589
  _scheduledMessages = attachProjectScheduledMessages({
1544
1590
  scheduler: opts.durableScheduler,
1591
+ mateLifecycle: function () { return _mateLifecycle; },
1592
+ deferRehydrate: isMate,
1545
1593
  slug: slug,
1546
1594
  isMate: isMate,
1547
1595
  osUsers: osUsers,
@@ -1564,6 +1612,32 @@ function createProjectContext(opts) {
1564
1612
  consumePendingMessage: function (session) { return _userMessage && _userMessage.consumePendingMessage(session); },
1565
1613
  });
1566
1614
 
1615
+ var _schedulingAccess = require('./project-scheduling-access').attachSchedulingAccess({ osUsers: osUsers, getLinuxUser: getLinuxUserForSession, resolveLinuxUser: getOsUserInfoForLinuxUser });
1616
+ _mateLifecycle = attachMateScheduleLifecycle({
1617
+ sm: sm, scheduler: opts.durableScheduler, slug: slug,
1618
+ owner: function (session) { return _mateScheduling.owner(session); },
1619
+ authorize: function (session, control) { return control ? _mateScheduling.authorizeControl(session, control) : _mateScheduling.authorize(session); },
1620
+ authorizeRuntime: function (session) { return _mateScheduling.authorizeLifecycle(session); },
1621
+ schedule: function () { return _scheduledMessages.schedule.apply(null, arguments); },
1622
+ queueItem: function (session, job) { return _scheduledMessages.queueItem(session, job); },
1623
+ cancelJob: function (session, job) {
1624
+ return _scheduledMessages.cancel(session, { id: job.ownerId }, null, "cancelled_by_mate", { jobId: job.id, revision: job.payload.revision });
1625
+ },
1626
+ });
1627
+ _mateScheduling = attachMateScheduling({
1628
+ isMate: isMate, isHostAgent: isHostAgent, projectOwnerId: projectOwnerId, slug: slug, mateId: opts.mateId,
1629
+ sm: sm, users: usersModule, lifecycle: _mateLifecycle,
1630
+ authorizeAccess: function (session, ownerId) { _schedulingAccess.ownerIdentity(session); return _scheduledMessages.authorize(session, ownerId); },
1631
+ userInput: function (session) { return _askUser.createHandler(session); },
1632
+ });
1633
+ if (isMate) {
1634
+ sm.sessions.forEach(function (session) {
1635
+ try { _mateLifecycle.reconcile(session); }
1636
+ catch (error) { console.error("[mate-schedules] Recovery failed:", error.message); }
1637
+ });
1638
+ _scheduledMessages.rehydrate();
1639
+ }
1640
+
1567
1641
  // --- Loop engine (delegated to project-loop.js) ---
1568
1642
  // --- Notification center (global singleton from server.js) ---
1569
1643
  var _notifications = opts.notificationsModule || null;
@@ -1645,6 +1719,7 @@ function createProjectContext(opts) {
1645
1719
  cwd: cwd,
1646
1720
  projectSlug: slug,
1647
1721
  projectTitle: title || project,
1722
+ validateOwnerIdentity: _schedulingAccess.ownerIdentity,
1648
1723
  isMate: isMate,
1649
1724
  sm: sm,
1650
1725
  sdk: sdk,
@@ -1743,8 +1818,8 @@ function createProjectContext(opts) {
1743
1818
  }
1744
1819
 
1745
1820
  // --- 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;
1821
+ function scheduleMessage(session, text, resetsAt, actorUser, targetWs, attachments, requestId, transportAccountId, options) {
1822
+ return _scheduledMessages ? _scheduledMessages.schedule(session, text, resetsAt, actorUser, targetWs, attachments, requestId, transportAccountId, options) : null;
1748
1823
  }
1749
1824
 
1750
1825
  function cancelScheduledMessage(session, actorUser, targetWs, correlation) {
@@ -1756,6 +1831,10 @@ function createProjectContext(opts) {
1756
1831
  }
1757
1832
 
1758
1833
  function handleMessage(ws, msg) {
1834
+ return require('./pane-session-transport').run(ws, msg, dispatchMessage);
1835
+ }
1836
+
1837
+ function dispatchMessage(ws, msg) {
1759
1838
  if (!_requestAccess.permitMessage(ws, msg)) return;
1760
1839
  // --- Keep-alive (delegated to project-connection.js) ---
1761
1840
  // Answered before any routing so a ping can never be forwarded elsewhere.
@@ -1777,8 +1856,10 @@ function createProjectContext(opts) {
1777
1856
  }
1778
1857
  }
1779
1858
 
1859
+ if (_studioPresentation.handleMessage(ws, msg)) return;
1860
+
1780
1861
  // --- 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") {
1862
+ if (msg.type === "home_mate_question_response" || msg.type === "mate_context_prepare" || msg.type === "clay_ui_ready" || msg.type === "clay_navigation_claim" || msg.type === "clay_navigation_ack" || msg.type === "clay_navigation_rendered" || 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
1863
  if (typeof opts.onDmMessage === "function") opts.onDmMessage(ws, msg, slug);
1783
1864
  return;
1784
1865
  }
@@ -2074,6 +2155,9 @@ function createProjectContext(opts) {
2074
2155
  });
2075
2156
  sm.setSessionHydrator(_sessionSkillCatalog.hydrate);
2076
2157
  var _sessions = attachSessions({
2158
+ splitStore: _splitGroups.store,
2159
+ adapters: adapters,
2160
+ isPendingQueuePaused: function (session) { return _pendingMessageQueue.isPaused(session); },
2077
2161
  cwd: cwd,
2078
2162
  slug: slug,
2079
2163
  isMate: isMate,
@@ -2103,6 +2187,7 @@ function createProjectContext(opts) {
2103
2187
  resolveDefaultAi: opts.resolveDefaultAi,
2104
2188
  resolveMateSessionDefaults: opts.resolveMateSessionDefaults,
2105
2189
  getVendorAvailability: function (ws) { return _models.getVendorAvailability(ws); },
2190
+ getLinuxUserForWs: getLinuxUserForWs,
2106
2191
  canCreateScheduledTaskInterview: function (ws, session) { return !!(_scheduledTasks && _scheduledTasks.canCreateInterview(ws, session)); },
2107
2192
  canStartScheduledTaskInterview: function (ws, session) { return !!(_scheduledTasks && _scheduledTasks.canStartInterview(ws, session)); },
2108
2193
  onHumanPairStop: function (session) {
@@ -2147,6 +2232,26 @@ function createProjectContext(opts) {
2147
2232
  _notifications: _notifications,
2148
2233
  _projectLogs: _projectLogs,
2149
2234
  });
2235
+ var _productControl = require("./project-product-control").attachProjectProductControl({
2236
+ sm: sm, users: usersModule, clients: clients, slug: slug, isMate: isMate, osUsers: osUsers,
2237
+ getProjectAccess: opts.getProjectAccess || function () { return { visibility: "public", ownerId: projectOwnerId || null }; },
2238
+ userInput: function (session) { return _askUser.createHandler(session); },
2239
+ actions: _sessions.sessionActions, history: _sessions.sessionHistoryActions, selectModel: function (session, model, options) { return _models.selectSessionModel(session, model, null, options); },
2240
+ isDriverOperatedSession: function (session) { return _sessionPair.workerPermission.isDriverOperated(session); },
2241
+ deletePlan: _sessions.deleteProductControlPlan,
2242
+ queue: _pendingMessageQueue,
2243
+ requestQueueDrain: function (session) { if (_userMessage) _userMessage.consumePendingMessage(session); },
2244
+ vendor: _sessions.sessionVendorActions,
2245
+ runtime: _sessions.sessionRuntimeActions,
2246
+ });
2247
+ var _mateChatControl = require('./project-mate-chat-control').attachMateChatControl({
2248
+ sm: sm, sdk: sdk, isMate: isMate, osUsers: osUsers, getLinuxUser: getLinuxUserForSession,
2249
+ users: usersModule, getAccess: opts.getProjectAccess || function () { return { isMate: isMate, ownerId: projectOwnerId || null, visibility: 'private' }; },
2250
+ actions: _sessions.sessionActions, vendor: _sessions.sessionVendorActions,
2251
+ selectModel: function (session, model, options) { return _models.selectSessionModel(session, model, null, options); },
2252
+ });
2253
+
2254
+
2150
2255
 
2151
2256
  var _models = attachModels({
2152
2257
  cwd: cwd,
@@ -2193,6 +2298,7 @@ function createProjectContext(opts) {
2193
2298
  });
2194
2299
  var _delegatedFollowUp = attachDelegatedFollowUp({
2195
2300
  sm: sm,
2301
+ isPendingQueuePaused: function (session) { return _pendingMessageQueue.isPaused(session); },
2196
2302
  getSdk: function () { return sdk; },
2197
2303
  getLinuxUserForSession: getLinuxUserForSession,
2198
2304
  onProcessingChanged: onProcessingChanged,
@@ -2207,6 +2313,12 @@ function createProjectContext(opts) {
2207
2313
 
2208
2314
  // --- User message handler (delegated to project-user-message.js) ---
2209
2315
  var _userMessage = attachUserMessage({
2316
+ isLifecycleExecutionPaused: function () { return !!(opts.getProjectAccess && opts.getProjectAccess().lifecycleExecutionPaused); },
2317
+ resumeLifecycleProject: function (ws) {
2318
+ if (!opts.getProjectAccess || !opts.getProjectAccess().lifecycleExecutionPaused) return true;
2319
+ if (!clients.has(ws) || !ws._clayUser || !opts.resumeLifecycleProject) throw new Error('The current owner must explicitly resume recovered project execution.');
2320
+ return opts.resumeLifecycleProject(ws._clayUser.id);
2321
+ },
2210
2322
  // Exact live pair state decides whether a session is Driver-operated; the
2211
2323
  // handler never infers the role from the message.
2212
2324
  isDriverOperatedSession: function (session) {
@@ -2234,6 +2346,7 @@ function createProjectContext(opts) {
2234
2346
  cwd: cwd,
2235
2347
  slug: slug,
2236
2348
  isMate: isMate,
2349
+ mateId: mateId,
2237
2350
  osUsers: osUsers,
2238
2351
  sm: sm,
2239
2352
  sdk: sdk,
@@ -2287,6 +2400,7 @@ function createProjectContext(opts) {
2287
2400
 
2288
2401
  // --- Vendor login flow (delegated to project-vendor-login.js) ---
2289
2402
  var _vendorLogin = attachVendorLogin({
2403
+ onVendorAuthChanged: function () { _sessions.invalidateVendorUsage(); },
2290
2404
  requestAccess: _requestAccess,
2291
2405
  clients: clients,
2292
2406
  slug: slug,
@@ -2329,6 +2443,13 @@ function createProjectContext(opts) {
2329
2443
  FS_MAX_SIZE: FS_VIEWER_MAX_SIZE,
2330
2444
  });
2331
2445
 
2446
+ var _workspaceOperations = require('./project-workspace-operations').attachWorkspaceOperations({
2447
+ cwd: cwd, isMate: isMate, osUsers: osUsers, users: usersModule, tm: tm,
2448
+ getAccess: opts.getProjectAccess || function () { return { ownerId: projectOwnerId || null, visibility: 'private' }; },
2449
+ files: function () { return _filesystem.productOperations; },
2450
+ publishTerminals: function () { send({ type: 'term_list', terminals: tm.list(true) }); },
2451
+ });
2452
+
2332
2453
  // --- MCP bridge handler for Codex and session-bound Kiro tools ---
2333
2454
  // Provides list_tools and call_tool operations over HTTP for mcp-bridge-server.js.
2334
2455
  // The normal Codex bridge excludes local MCP servers it manages natively;
@@ -2336,6 +2457,8 @@ function createProjectContext(opts) {
2336
2457
  function getMcpBridgeHandler(sessionId, sessionOnly, queryGeneration) {
2337
2458
  var boundSession = Number.isInteger(sessionId) ? sm.sessions.get(sessionId) : null;
2338
2459
  var queryToolBridge = createSessionQueryToolBridge({ session: boundSession, sdk: sdk });
2460
+ var externalQueryBridge = require('./mcp-query-bridge').createQueryBridge({ valid: sessionQueryValid,
2461
+ getServers: function () { return _mcp.getMcpServers(boundSession, sessionQueryValid()); } });
2339
2462
  function sessionQueryValid() {
2340
2463
  return !!boundSession
2341
2464
  && Number.isInteger(queryGeneration)
@@ -2460,7 +2583,7 @@ function createProjectContext(opts) {
2460
2583
  }
2461
2584
  }
2462
2585
 
2463
- if (sessionOnly) return Promise.resolve(tools);
2586
+ if (sessionOnly) return Promise.resolve(tools.concat(externalQueryBridge.list()));
2464
2587
 
2465
2588
  // In-app MCP servers (debate, browser, email).
2466
2589
  // Use getLocalMcpServers() so clay-browser is hidden unless the
@@ -2480,7 +2603,7 @@ function createProjectContext(opts) {
2480
2603
  }
2481
2604
 
2482
2605
  // Personal computer and remote URL connections.
2483
- var remoteServers = _mcp.getMcpServers(boundSession);
2606
+ var remoteServers = sessionQueryValid() ? _mcp.getMcpServers(boundSession, sessionQueryValid()) : {};
2484
2607
  if (remoteServers) {
2485
2608
  var remoteNames = Object.keys(remoteServers);
2486
2609
  for (var ri = 0; ri < remoteNames.length; ri++) {
@@ -2578,7 +2701,7 @@ function createProjectContext(opts) {
2578
2701
  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
2702
  return Promise.reject(new Error("Session-bound tool requires a valid Clay session: " + serverName + "/" + toolName));
2580
2703
  }
2581
- if (sessionOnly) return Promise.reject(new Error("Session tool not found: " + serverName + "/" + toolName));
2704
+ if (sessionOnly) return externalQueryBridge.call(serverName, toolName, args);
2582
2705
  // Try in-app servers first (gated by extension connectivity for clay-browser).
2583
2706
  var localMcp = getLocalMcpServers(boundSession);
2584
2707
  if (localMcp && localMcp[serverName]) {
@@ -2590,17 +2713,7 @@ function createProjectContext(opts) {
2590
2713
  }
2591
2714
  }
2592
2715
  }
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
- }
2716
+ if (externalQueryBridge.list().some(function (tool) { return tool.server === serverName && tool.name === toolName; })) return externalQueryBridge.call(serverName, toolName, args);
2604
2717
  return Promise.reject(new Error("Tool not found: " + serverName + "/" + toolName));
2605
2718
  },
2606
2719
  };
@@ -2608,6 +2721,8 @@ function createProjectContext(opts) {
2608
2721
 
2609
2722
  // --- HTTP handler (delegated to project-http.js) ---
2610
2723
  var _http = attachHTTP({
2724
+ workspaceOperations: _workspaceOperations,
2725
+ getProjectOwnerId: function () { return projectOwnerId; },
2611
2726
  requestAccess: _requestAccess,
2612
2727
  cwd: cwd,
2613
2728
  slug: slug,
@@ -2766,6 +2881,7 @@ function createProjectContext(opts) {
2766
2881
  return false;
2767
2882
  }));
2768
2883
  } catch (err) {
2884
+ shutdowns.push(Promise.resolve(false));
2769
2885
  console.error("[project] " + vendor + " shutdown threw for " + slug + ":", err && err.message ? err.message : err);
2770
2886
  }
2771
2887
  });
@@ -2788,6 +2904,7 @@ function createProjectContext(opts) {
2788
2904
  }
2789
2905
  });
2790
2906
  var status = {
2907
+ controlRuntimeId: require('./clay-control-target-projection').runtime(sm),
2791
2908
  slug: slug,
2792
2909
  path: cwd,
2793
2910
  project: project,
@@ -2838,7 +2955,7 @@ function createProjectContext(opts) {
2838
2955
 
2839
2956
  function setTitle(newTitle) {
2840
2957
  title = newTitle || null;
2841
- send({ type: "info", cwd: cwd, slug: slug, project: title || project, version: currentVersion, debug: !!debug, osUsers: osUsers, lanHost: lanHost, projectCount: getProjectCount(), projects: getProjectList(), projectOwnerId: projectOwnerId, isMate: isMate, mateId: isMate ? mateId : null, mateDisplayName: isMate ? (opts.mateDisplayName || title || project || "Mate") : "" });
2958
+ send({ type: "info", controlRuntimeId: require("./clay-control-target-projection").runtime(sm), cwd: cwd, slug: slug, project: title || project, version: currentVersion, debug: !!debug, osUsers: osUsers, lanHost: lanHost, projectCount: getProjectCount(), projects: getProjectList(), projectOwnerId: projectOwnerId, isMate: isMate, mateId: isMate ? mateId : null, mateDisplayName: isMate ? (opts.mateDisplayName || title || project || "Mate") : "" });
2842
2959
  }
2843
2960
 
2844
2961
  function setIcon(newIcon) {
@@ -2909,15 +3026,33 @@ function createProjectContext(opts) {
2909
3026
  },
2910
3027
  getYouLinuxUser: getLinuxUserForSession,
2911
3028
  getStatus: getStatus,
3029
+ bindMateSchedule: function (session, intent, id) {
3030
+ return _mateLifecycle.create(session, require("./mate-schedule-input").normalize(intent), id);
3031
+ },
3032
+ cancelMateSchedule: function (session, record) { return _mateLifecycle.cancel(session, record); },
2912
3033
  getSessionManager: function () { return sm; },
2913
3034
  createDelegatedSession: _delegatedSession.createDelegatedSession,
3035
+ refreshEnvironmentRuntime: function () { return sdk.refreshEnvironmentRuntime(); },
3036
+ getWorkspaceProductOperations: function () { return isMate ? null : _workspaceOperations; },
3037
+ getMateChatControl: function () { return isMate ? _mateChatControl : null; },
3038
+ getMateScheduleControl: function () { return isMate ? _mateLifecycle : null; },
3039
+ getScheduledTaskControl: function () { return _scheduledTasks.productControl; },
3040
+ notifyIssueUpdate: _issues.notify,
3041
+ notifyLogUpdate: _projectLogs.broadcastUpdate,
3042
+ requestProductControlReview: _productControl.requestProductControlReview,
3043
+ applyProductSessionAction: _productControl.applyProductSessionAction,
3044
+ inspectProductSessionQueue: _productControl.inspectProductSessionQueue,
3045
+ readVendorUsage: function (request) { return _sessions.readVendorUsage(request); },
3046
+ inspectProductSessionRuntime: _sessions.sessionRuntimeActions.inspect,
3047
+ inspectMateLifecycleRuntime: _sessions.sessionRuntimeActions.inspectLifecycle,
2914
3048
  inspectDelegatedFollowUp: _delegatedFollowUp.inspectDelegatedFollowUp,
2915
3049
  dispatchDelegatedFollowUp: _delegatedFollowUp.dispatchDelegatedFollowUp,
2916
3050
  deliverCapsuleTurn: _capsuleTurn.deliverCapsuleTurn,
2917
3051
  unregisterHomeDebateClient: function (ws) { homeDebateClients.delete(ws); },
2918
3052
  handleHomeDebateProposalResponse: function (ws, msg, session) { return _debateProposal.handleHomeMessage(ws, msg, session); },
2919
3053
  handleHomeMateCreationProposalResponse: function (ws, msg, session) { return _mateCreationProposal.handleHomeMessage(ws, msg, session); },
2920
- handleHomeAskUserResponse: function (msg, session) { return _sessions.respondToAskUser(session, msg); },
3054
+ registerMcpConsentViewer: _mcp.registerConsentViewer,
3055
+ handleHomeAskUserResponse: function (msg, session, ws) { return _sessions.respondToAskUser(session, msg, ws); },
2921
3056
  handleHomePermissionResponse: function (ws, msg, session) { return _sessions.respondToHomePermission(ws, msg, session); },
2922
3057
  stopHomeSession: function (session) { return _sessions.stopHomeSession(session); },
2923
3058
  handleHomeDebateControl: function (ws, msg, session) { return _debate.handleHomeControl(ws, msg, session); },
@@ -2926,6 +3061,7 @@ function createProjectContext(opts) {
2926
3061
  getMemoryState: _memory.readMemoryState,
2927
3062
  listKnowledgeFiles: _knowledge.listKnowledgeFiles,
2928
3063
  getKnowledgeDbService: function () { return _knowledge.databases; },
3064
+ getKnowledgeProductOperations: function () { return _knowledge.productOperations; },
2929
3065
  refreshCapsuleCatalog: _capsuleCatalog.refreshSessions,
2930
3066
  getNotificationsModule: function () { return _notifications; },
2931
3067
  refreshVendorAuth: _vendorLogin.refreshVendorAuth,