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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (588) hide show
  1. package/lib/account-auth-policy.js +21 -0
  2. package/lib/account-auth-socket.js +30 -0
  3. package/lib/account-auth-throttle.js +44 -0
  4. package/lib/account-auth-transport.js +48 -0
  5. package/lib/account-login-page.js +28 -0
  6. package/lib/account-passkey-challenges.js +31 -0
  7. package/lib/account-passkey-page.js +89 -0
  8. package/lib/account-passkey-policy.js +39 -0
  9. package/lib/account-password-page.js +69 -0
  10. package/lib/account-passwords.js +36 -0
  11. package/lib/account-remembered.js +77 -0
  12. package/lib/account-session-page.js +51 -0
  13. package/lib/account-session-store.js +82 -0
  14. package/lib/builtin-mates.js +19 -16
  15. package/lib/bundled-skills/clay-agent-browser/SKILL.md +6 -2
  16. package/lib/canonical-clay-record-authority.js +15 -0
  17. package/lib/canonical-clay-scheduling-authority.js +19 -0
  18. package/lib/claude-hook-installer.js +1 -239
  19. package/lib/claude-jsonl-watcher.js +1 -204
  20. package/lib/clay-control-presentation-binding.js +96 -0
  21. package/lib/clay-control-presentation.js +128 -0
  22. package/lib/clay-control-target-projection.js +26 -0
  23. package/lib/clay-mate-chat-receipts.js +26 -0
  24. package/lib/clay-mate-chat.js +88 -0
  25. package/lib/clay-mate-knowledge-input.js +26 -0
  26. package/lib/clay-mate-knowledge.js +95 -0
  27. package/lib/clay-mate-lifecycle.js +95 -0
  28. package/lib/clay-product-control-input.js +33 -0
  29. package/lib/clay-product-control-tools.js +51 -0
  30. package/lib/clay-product-control.js +247 -0
  31. package/lib/clay-project-lifecycle.js +154 -0
  32. package/lib/clay-project-record-input.js +44 -0
  33. package/lib/clay-project-records.js +84 -0
  34. package/lib/clay-scheduling-input.js +21 -0
  35. package/lib/clay-scheduling-receipts.js +26 -0
  36. package/lib/clay-scheduling.js +119 -0
  37. package/lib/clay-screen-controls.js +104 -0
  38. package/lib/clay-skill-install.js +1 -33
  39. package/lib/clay-workspace-controls.js +84 -0
  40. package/lib/clay-workspace-input.js +17 -0
  41. package/lib/clay-workspace-receipts.js +26 -0
  42. package/lib/cli-sessions.js +1 -300
  43. package/lib/codex-defaults.js +1 -28
  44. package/lib/context-usage.js +3 -2
  45. package/lib/contextual-screen-snapshot.js +38 -0
  46. package/lib/daemon-project-access.js +11 -0
  47. package/lib/daemon-project-lifecycle-callbacks.js +15 -0
  48. package/lib/daemon-project-lifecycle.js +262 -0
  49. package/lib/daemon-projects.js +1 -1
  50. package/lib/daemon.js +80 -276
  51. package/lib/default-ai-runtime.js +4 -8
  52. package/lib/dm-digest-cursor.js +120 -0
  53. package/lib/email-mcp-server.js +1 -1
  54. package/lib/issues-service.js +29 -15
  55. package/lib/kiro-defaults.js +1 -22
  56. package/lib/knowledge-db-import-validation.js +46 -0
  57. package/lib/knowledge-db-import.js +99 -0
  58. package/lib/knowledge-db-service.js +24 -33
  59. package/lib/knowledge-db-storage-nedb-maintenance.js +99 -0
  60. package/lib/knowledge-db-storage-nedb.js +66 -0
  61. package/lib/knowledge-db-storage.js +72 -0
  62. package/lib/knowledge-db-validation.js +0 -0
  63. package/lib/knowledge-document-index.js +2 -1
  64. package/lib/knowledge-file-store.js +7 -1
  65. package/lib/knowledge-product-operations.js +46 -0
  66. package/lib/mate-avatar-catalog.js +12 -0
  67. package/lib/mate-avatar-migration.js +41 -0
  68. package/lib/mate-context-service.js +138 -0
  69. package/lib/mate-context-tools.js +21 -0
  70. package/lib/mate-creation-mcp-server.js +2 -0
  71. package/lib/mate-knowledge-canonical-access.js +10 -0
  72. package/lib/mate-knowledge-mate-bound.js +53 -0
  73. package/lib/mate-knowledge-mcp-server.js +55 -8
  74. package/lib/mate-knowledge-service.js +16 -34
  75. package/lib/mate-knowledge-text-tools.js +106 -0
  76. package/lib/mate-lifecycle-service.js +94 -0
  77. package/lib/mate-message-delivery.js +43 -0
  78. package/lib/mate-ready-creation.js +9 -1
  79. package/lib/mate-schedule-input.js +29 -0
  80. package/lib/mate-schedule-lifecycle.js +151 -0
  81. package/lib/mate-scheduling.js +103 -0
  82. package/lib/mates.js +18 -6
  83. package/lib/mcp-agent-tools.js +117 -0
  84. package/lib/mcp-connection-store.js +119 -15
  85. package/lib/mcp-import-credentials.js +31 -0
  86. package/lib/mcp-local-transport.js +13 -0
  87. package/lib/mcp-oauth.js +8 -6
  88. package/lib/mcp-proxy.js +2 -32
  89. package/lib/mcp-query-bridge.js +30 -0
  90. package/lib/mcp-remote-connections.js +74 -20
  91. package/lib/mcp-source-adapters.js +1 -0
  92. package/lib/mcp-source-context.js +1 -0
  93. package/lib/mcp-source-discovery.js +1 -0
  94. package/lib/mcp-source-plugins.js +1 -0
  95. package/lib/mcp-source-restrictions.js +1 -0
  96. package/lib/mcp-tool-policy.js +9 -0
  97. package/lib/migrate-single-user.js +3 -23
  98. package/lib/notes-checklist.js +50 -0
  99. package/lib/notes.js +49 -3
  100. package/lib/os-user-diagnostics.js +2 -4
  101. package/lib/os-users.js +24 -70
  102. package/lib/pane-pending-interactions.js +20 -0
  103. package/lib/pane-session-activation.js +114 -0
  104. package/lib/pane-session-transport.js +26 -0
  105. package/lib/project-admin-overview.js +51 -0
  106. package/lib/project-ask-user.js +8 -4
  107. package/lib/project-connection.js +14 -10
  108. package/lib/project-control-git-view.js +12 -0
  109. package/lib/project-debate.js +1 -0
  110. package/lib/project-delegated-follow-up.js +2 -1
  111. package/lib/project-directory-claim.js +65 -0
  112. package/lib/project-file-operations.js +61 -0
  113. package/lib/project-filesystem.js +15 -85
  114. package/lib/project-full-access.js +23 -2
  115. package/lib/project-http.js +7 -4
  116. package/lib/project-knowledge.js +32 -18
  117. package/lib/project-lifecycle-operations.js +98 -0
  118. package/lib/project-lifecycle-process-witness.js +32 -0
  119. package/lib/project-lifecycle-runtime.js +50 -0
  120. package/lib/project-linux-access.js +22 -0
  121. package/lib/project-logs-canonical-clay.js +27 -0
  122. package/lib/project-logs-clay-query.js +16 -0
  123. package/lib/project-logs-schema.js +4 -2
  124. package/lib/project-logs-service.js +8 -7
  125. package/lib/project-logs.js +1 -0
  126. package/lib/project-loop.js +1 -0
  127. package/lib/project-mate-chat-control.js +55 -0
  128. package/lib/project-mate-creation-proposal.js +18 -3
  129. package/lib/project-mate-interaction.js +40 -62
  130. package/lib/project-mcp.js +54 -16
  131. package/lib/project-models.js +14 -31
  132. package/lib/project-notifications.js +76 -17
  133. package/lib/project-ownership.js +77 -0
  134. package/lib/project-pair-result-delivery.js +14 -3
  135. package/lib/project-pair-usage.js +12 -13
  136. package/lib/project-pending-message-queue.js +4 -1
  137. package/lib/project-product-control.js +89 -0
  138. package/lib/project-product-session-queue.js +46 -0
  139. package/lib/project-push-access.js +28 -0
  140. package/lib/project-scheduled-message-queue.js +30 -0
  141. package/lib/project-scheduled-messages.js +67 -68
  142. package/lib/project-scheduled-task-control.js +83 -0
  143. package/lib/project-scheduled-tasks.js +13 -2
  144. package/lib/project-scheduling-access.js +10 -0
  145. package/lib/project-server-settings.js +1 -0
  146. package/lib/project-session-actions.js +65 -0
  147. package/lib/project-session-delete.js +8 -1
  148. package/lib/project-session-document.js +27 -7
  149. package/lib/project-session-github.js +63 -19
  150. package/lib/project-session-history-actions.js +167 -0
  151. package/lib/project-session-linear.js +14 -6
  152. package/lib/project-session-notes.js +7 -3
  153. package/lib/project-session-pair.js +1 -1
  154. package/lib/project-session-runtime-actions.js +64 -0
  155. package/lib/project-session-spawn.js +2 -3
  156. package/lib/project-session-vendor.js +55 -0
  157. package/lib/project-sessions.js +103 -272
  158. package/lib/project-shared-browser.js +78 -17
  159. package/lib/project-studio-presentation.js +58 -0
  160. package/lib/project-user-knowledge.js +2 -1
  161. package/lib/project-user-message.js +67 -1
  162. package/lib/project-vendor-login.js +6 -36
  163. package/lib/project-workspace-operations.js +126 -0
  164. package/lib/project-workspace-query.js +19 -2
  165. package/lib/project.js +178 -45
  166. package/lib/public/app.js +46 -0
  167. package/lib/public/appearance-bootstrap.js +16 -0
  168. package/lib/public/auth/account-login.css +98 -0
  169. package/lib/public/auth/account-login.js +104 -0
  170. package/lib/public/css/clay-tool-activity.css +51 -0
  171. package/lib/public/css/clay-workspace.css +29 -0
  172. package/lib/public/css/command-palette.css +12 -33
  173. package/lib/public/css/contextual-clay.css +240 -0
  174. package/lib/public/css/home-debate-planning.css +2 -0
  175. package/lib/public/css/home-mate-creation.css +5 -0
  176. package/lib/public/css/input.css +6 -0
  177. package/lib/public/css/mate-avatar-gallery.css +12 -0
  178. package/lib/public/css/mate-conversation.css +10 -5
  179. package/lib/public/css/messages.css +6 -2
  180. package/lib/public/css/overlays.css +4 -2
  181. package/lib/public/css/project-admin-overview.css +13 -0
  182. package/lib/public/css/session-folders.css +11 -0
  183. package/lib/public/css/session-github.css +46 -1
  184. package/lib/public/css/shared-browser.css +35 -1
  185. package/lib/public/css/sticky-notes.css +87 -1
  186. package/lib/public/css/user-settings-sessions.css +42 -0
  187. package/lib/public/index.html +28 -10
  188. package/lib/public/mate-avatars/B01.png +0 -0
  189. package/lib/public/mate-avatars/B02.png +0 -0
  190. package/lib/public/mate-avatars/B03.png +0 -0
  191. package/lib/public/mate-avatars/B04.png +0 -0
  192. package/lib/public/mate-avatars/B05.png +0 -0
  193. package/lib/public/mate-avatars/B06.png +0 -0
  194. package/lib/public/mate-avatars/B07.png +0 -0
  195. package/lib/public/mate-avatars/B08.png +0 -0
  196. package/lib/public/mate-avatars/B09.png +0 -0
  197. package/lib/public/mate-avatars/B10.png +0 -0
  198. package/lib/public/mate-avatars/B11.png +0 -0
  199. package/lib/public/mate-avatars/B12.png +0 -0
  200. package/lib/public/mate-avatars/B13.png +0 -0
  201. package/lib/public/mate-avatars/B14.png +0 -0
  202. package/lib/public/mate-avatars/B15.png +0 -0
  203. package/lib/public/mate-avatars/B16.png +0 -0
  204. package/lib/public/mate-avatars/B17.png +0 -0
  205. package/lib/public/mate-avatars/B18.png +0 -0
  206. package/lib/public/mate-avatars/B19.png +0 -0
  207. package/lib/public/mate-avatars/B20.png +0 -0
  208. package/lib/public/mate-avatars/B21.png +0 -0
  209. package/lib/public/mate-avatars/B22.png +0 -0
  210. package/lib/public/mate-avatars/B23.png +0 -0
  211. package/lib/public/mate-avatars/B24.png +0 -0
  212. package/lib/public/mate-avatars/B25.png +0 -0
  213. package/lib/public/mate-avatars/B26.png +0 -0
  214. package/lib/public/mate-avatars/B27.png +0 -0
  215. package/lib/public/mate-avatars/B28.png +0 -0
  216. package/lib/public/mate-avatars/B29.png +0 -0
  217. package/lib/public/mate-avatars/B30.png +0 -0
  218. package/lib/public/mate-avatars/B31.png +0 -0
  219. package/lib/public/mate-avatars/B32.png +0 -0
  220. package/lib/public/mate-avatars/B33.png +0 -0
  221. package/lib/public/mate-avatars/B34.png +0 -0
  222. package/lib/public/mate-avatars/B35.png +0 -0
  223. package/lib/public/mate-avatars/B36.png +0 -0
  224. package/lib/public/mate-avatars/B37.png +0 -0
  225. package/lib/public/mate-avatars/B38.png +0 -0
  226. package/lib/public/mate-avatars/B39.png +0 -0
  227. package/lib/public/mate-avatars/B40.png +0 -0
  228. package/lib/public/mate-avatars/B41.png +0 -0
  229. package/lib/public/mate-avatars/B42.png +0 -0
  230. package/lib/public/mate-avatars/B43.png +0 -0
  231. package/lib/public/mate-avatars/B44.png +0 -0
  232. package/lib/public/mate-avatars/B45.png +0 -0
  233. package/lib/public/mate-avatars/B46.png +0 -0
  234. package/lib/public/mate-avatars/B47.png +0 -0
  235. package/lib/public/mate-avatars/B48.png +0 -0
  236. package/lib/public/mate-avatars/C01.png +0 -0
  237. package/lib/public/mate-avatars/C02.png +0 -0
  238. package/lib/public/mate-avatars/C03.png +0 -0
  239. package/lib/public/mate-avatars/C04.png +0 -0
  240. package/lib/public/mate-avatars/C05.png +0 -0
  241. package/lib/public/mate-avatars/C06.png +0 -0
  242. package/lib/public/mate-avatars/C07.png +0 -0
  243. package/lib/public/mate-avatars/C08.png +0 -0
  244. package/lib/public/mate-avatars/C09.png +0 -0
  245. package/lib/public/mate-avatars/C10.png +0 -0
  246. package/lib/public/mate-avatars/C11.png +0 -0
  247. package/lib/public/mate-avatars/C12.png +0 -0
  248. package/lib/public/mate-avatars/C13.png +0 -0
  249. package/lib/public/mate-avatars/C14.png +0 -0
  250. package/lib/public/mate-avatars/C15.png +0 -0
  251. package/lib/public/mate-avatars/C16.png +0 -0
  252. package/lib/public/mate-avatars/C17.png +0 -0
  253. package/lib/public/mate-avatars/C18.png +0 -0
  254. package/lib/public/mate-avatars/C19.png +0 -0
  255. package/lib/public/mate-avatars/C20.png +0 -0
  256. package/lib/public/mate-avatars/C21.png +0 -0
  257. package/lib/public/mate-avatars/C22.png +0 -0
  258. package/lib/public/mate-avatars/C23.png +0 -0
  259. package/lib/public/mate-avatars/C24.png +0 -0
  260. package/lib/public/mate-avatars/C25.png +0 -0
  261. package/lib/public/mate-avatars/C26.png +0 -0
  262. package/lib/public/mate-avatars/C27.png +0 -0
  263. package/lib/public/mate-avatars/C28.png +0 -0
  264. package/lib/public/mate-avatars/C29.png +0 -0
  265. package/lib/public/mate-avatars/C30.png +0 -0
  266. package/lib/public/mate-avatars/C31.png +0 -0
  267. package/lib/public/mate-avatars/C32.png +0 -0
  268. package/lib/public/mate-avatars/C33.png +0 -0
  269. package/lib/public/mate-avatars/C34.png +0 -0
  270. package/lib/public/mate-avatars/C35.png +0 -0
  271. package/lib/public/mate-avatars/C36.png +0 -0
  272. package/lib/public/mate-avatars/C37.png +0 -0
  273. package/lib/public/mate-avatars/C38.png +0 -0
  274. package/lib/public/mate-avatars/C39.png +0 -0
  275. package/lib/public/mate-avatars/C40.png +0 -0
  276. package/lib/public/mate-avatars/C41.png +0 -0
  277. package/lib/public/mate-avatars/C42.png +0 -0
  278. package/lib/public/mate-avatars/C43.png +0 -0
  279. package/lib/public/mate-avatars/C44.png +0 -0
  280. package/lib/public/mate-avatars/C45.png +0 -0
  281. package/lib/public/mate-avatars/C46.png +0 -0
  282. package/lib/public/mate-avatars/C47.png +0 -0
  283. package/lib/public/mate-avatars/C48.png +0 -0
  284. package/lib/public/mate-avatars/catalog.json +482 -0
  285. package/lib/public/mate-avatars/lead-clay.png +0 -0
  286. package/lib/public/modules/account-auth-settings.js +71 -0
  287. package/lib/public/modules/account-transport-settings.js +51 -0
  288. package/lib/public/modules/admin-settings-projects.js +6 -2
  289. package/lib/public/modules/app-connection.js +11 -1
  290. package/lib/public/modules/app-favicon.js +18 -9
  291. package/lib/public/modules/app-header.js +7 -4
  292. package/lib/public/modules/app-loop-ui.js +2 -0
  293. package/lib/public/modules/app-message-router.js +22 -1
  294. package/lib/public/modules/app-messages.js +119 -17
  295. package/lib/public/modules/app-misc.js +3 -1
  296. package/lib/public/modules/app-notifications.js +11 -5
  297. package/lib/public/modules/app-panels.js +61 -123
  298. package/lib/public/modules/app-projects.js +13 -0
  299. package/lib/public/modules/app-rate-limit.js +7 -27
  300. package/lib/public/modules/app-rendering.js +4 -3
  301. package/lib/public/modules/avatar.js +15 -41
  302. package/lib/public/modules/chat-render-runtime.js +20 -0
  303. package/lib/public/modules/clay-browser-links.js +47 -0
  304. package/lib/public/modules/clay-control-activity.js +214 -0
  305. package/lib/public/modules/clay-control-copy.js +36 -0
  306. package/lib/public/modules/clay-control-detail-targets.js +44 -0
  307. package/lib/public/modules/clay-control-object-targets.js +52 -0
  308. package/lib/public/modules/clay-control-target-visibility.js +12 -0
  309. package/lib/public/modules/clay-control-targets.js +44 -0
  310. package/lib/public/modules/clay-log-links.js +23 -0
  311. package/lib/public/modules/clay-navigation-render.js +52 -0
  312. package/lib/public/modules/clay-owner-navigation.js +33 -0
  313. package/lib/public/modules/clay-session-links.js +31 -0
  314. package/lib/public/modules/clay-studio-bridge.js +20 -0
  315. package/lib/public/modules/clay-studio-document.js +67 -0
  316. package/lib/public/modules/clay-studio-render.js +146 -0
  317. package/lib/public/modules/clay-tool-activity.js +140 -0
  318. package/lib/public/modules/clay-tool-presentation.js +342 -0
  319. package/lib/public/modules/command-palette.js +162 -40
  320. package/lib/public/modules/contextual-ask-session.js +26 -0
  321. package/lib/public/modules/contextual-clay-geometry.js +155 -0
  322. package/lib/public/modules/contextual-clay-session.js +130 -0
  323. package/lib/public/modules/contextual-clay-workspace.js +169 -0
  324. package/lib/public/modules/contextual-clay.js +250 -0
  325. package/lib/public/modules/contextual-composer.js +91 -0
  326. package/lib/public/modules/contextual-mate-context.js +117 -0
  327. package/lib/public/modules/contextual-mate-hint.js +40 -0
  328. package/lib/public/modules/contextual-mate-identity.js +23 -0
  329. package/lib/public/modules/contextual-mate-sessions.js +134 -0
  330. package/lib/public/modules/contextual-search.js +137 -0
  331. package/lib/public/modules/contextual-session-citations.js +58 -0
  332. package/lib/public/modules/debate.js +1 -0
  333. package/lib/public/modules/default-ai.js +11 -3
  334. package/lib/public/modules/elicitation-form.js +5 -0
  335. package/lib/public/modules/filebrowser.js +20 -1
  336. package/lib/public/modules/generation-stop.js +8 -5
  337. package/lib/public/modules/git-panel.js +3 -1
  338. package/lib/public/modules/history-replay-batch.js +13 -1
  339. package/lib/public/modules/home-debate-live.js +2 -0
  340. package/lib/public/modules/home-debate-planning.js +7 -7
  341. package/lib/public/modules/home-mate-avatar-editor.js +127 -208
  342. package/lib/public/modules/home-mate-chat.js +8 -6
  343. package/lib/public/modules/home-mate-creation.js +73 -1
  344. package/lib/public/modules/home-mate-settings.js +19 -12
  345. package/lib/public/modules/icon-strip-tooltip.js +2 -1
  346. package/lib/public/modules/input.js +88 -10
  347. package/lib/public/modules/issues-render.js +3 -2
  348. package/lib/public/modules/knowledge-db-workbench.js +4 -4
  349. package/lib/public/modules/markdown.js +6 -34
  350. package/lib/public/modules/mate-avatar-catalog.js +97 -0
  351. package/lib/public/modules/mate-knowledge-workbench.js +1 -1
  352. package/lib/public/modules/mate-management.js +40 -7
  353. package/lib/public/modules/mcp-connection-view.js +31 -13
  354. package/lib/public/modules/mcp-discovery-view.js +31 -0
  355. package/lib/public/modules/mcp-ui.js +23 -4
  356. package/lib/public/modules/mention.js +3 -0
  357. package/lib/public/modules/message-delivery.js +20 -2
  358. package/lib/public/modules/model-picker.js +2 -0
  359. package/lib/public/modules/pane-activation.js +214 -0
  360. package/lib/public/modules/pane-binding.js +82 -0
  361. package/lib/public/modules/pane-bridge.js +7 -4
  362. package/lib/public/modules/pane-browser-bridge.js +22 -0
  363. package/lib/public/modules/pane-file-bridge.js +4 -0
  364. package/lib/public/modules/pane-issue-bridge.js +4 -1
  365. package/lib/public/modules/passkey-browser.js +69 -0
  366. package/lib/public/modules/passkey-server-settings.js +57 -0
  367. package/lib/public/modules/pending-message-queue.js +1 -0
  368. package/lib/public/modules/permission-control.js +5 -4
  369. package/lib/public/modules/personal-settings-dialog.js +7 -1
  370. package/lib/public/modules/product-review.js +26 -0
  371. package/lib/public/modules/profile.js +1 -238
  372. package/lib/public/modules/project-access-recovery.js +17 -0
  373. package/lib/public/modules/project-admin-overview.js +21 -0
  374. package/lib/public/modules/project-chat-identity.js +13 -4
  375. package/lib/public/modules/project-logs-render.js +6 -2
  376. package/lib/public/modules/project-mate-navigation.js +144 -22
  377. package/lib/public/modules/rewind.js +5 -0
  378. package/lib/public/modules/scheduled-tasks.js +2 -0
  379. package/lib/public/modules/scheduler.js +2 -0
  380. package/lib/public/modules/search-clay-chat.js +5 -440
  381. package/lib/public/modules/server-settings-controls.js +10 -0
  382. package/lib/public/modules/server-settings.js +7 -2
  383. package/lib/public/modules/session-actions.js +5 -2
  384. package/lib/public/modules/session-context-menu.js +5 -0
  385. package/lib/public/modules/session-create-form.js +10 -10
  386. package/lib/public/modules/session-folder-layout.js +1 -1
  387. package/lib/public/modules/session-folder-view-menu.js +9 -0
  388. package/lib/public/modules/session-github.js +85 -14
  389. package/lib/public/modules/session-rich-drafts.js +21 -0
  390. package/lib/public/modules/session-switch-defer.js +67 -0
  391. package/lib/public/modules/session-work-primary.js +51 -0
  392. package/lib/public/modules/settings-defaults.js +27 -28
  393. package/lib/public/modules/shared-browser-settings.js +112 -0
  394. package/lib/public/modules/shared-browser-tabs.js +13 -3
  395. package/lib/public/modules/shared-browser.js +29 -6
  396. package/lib/public/modules/sidebar-mobile.js +4 -3
  397. package/lib/public/modules/sidebar-projects.js +1 -0
  398. package/lib/public/modules/sidebar-session-folders-ui.js +1 -1
  399. package/lib/public/modules/sidebar-sessions.js +1 -0
  400. package/lib/public/modules/split-group-restore.js +68 -0
  401. package/lib/public/modules/split-pair-ui.js +1 -0
  402. package/lib/public/modules/split-pane-reconciler.js +15 -0
  403. package/lib/public/modules/split-pane-renderer.js +87 -6
  404. package/lib/public/modules/split-session-boundary.js +1 -1
  405. package/lib/public/modules/split-view.js +60 -68
  406. package/lib/public/modules/sticky-note-markdown.js +72 -6
  407. package/lib/public/modules/sticky-notes-actions.js +30 -0
  408. package/lib/public/modules/sticky-notes-browser.js +9 -2
  409. package/lib/public/modules/sticky-notes-card.js +23 -7
  410. package/lib/public/modules/sticky-notes-checklist.js +116 -0
  411. package/lib/public/modules/sticky-notes-editor.js +108 -44
  412. package/lib/public/modules/sticky-notes-shared.js +50 -2
  413. package/lib/public/modules/sticky-notes-state.js +66 -0
  414. package/lib/public/modules/sticky-notes.js +34 -51
  415. package/lib/public/modules/stt-controller.js +4 -1
  416. package/lib/public/modules/stt-recording.js +1 -1
  417. package/lib/public/modules/stt.js +7 -2
  418. package/lib/public/modules/terminal.js +9 -0
  419. package/lib/public/modules/theme.js +8 -1
  420. package/lib/public/modules/thinking-lifecycle.js +33 -3
  421. package/lib/public/modules/thinking-view.js +23 -1
  422. package/lib/public/modules/tools.js +60 -11
  423. package/lib/public/modules/tui-grab.js +1 -2
  424. package/lib/public/modules/user-settings-account.js +14 -1
  425. package/lib/public/modules/user-settings-appearance.js +10 -3
  426. package/lib/public/modules/user-settings-editors.js +1 -1
  427. package/lib/public/modules/user-settings-layout.js +11 -2
  428. package/lib/public/modules/user-settings-preferences.js +6 -2
  429. package/lib/public/modules/user-settings-profile.js +12 -2
  430. package/lib/public/modules/user-settings-sessions.js +120 -0
  431. package/lib/public/modules/user-settings.js +6 -2
  432. package/lib/public/modules/vendor-login-browser.js +5 -3
  433. package/lib/public/modules/vendor-login.js +2 -2
  434. package/lib/public/modules/vendor-priority.js +15 -1
  435. package/lib/public/modules/wireframe-workbench.js +5 -2
  436. package/lib/public/modules/you-activity.js +3 -1
  437. package/lib/public/modules/you.js +91 -6
  438. package/lib/public/muse-avatar.svg +4 -0
  439. package/lib/public/style.css +6 -0
  440. package/lib/public/sw.js +3 -1
  441. package/lib/safe-bash-commands.js +3 -45
  442. package/lib/scheduled-task-records.js +3 -1
  443. package/lib/scheduler.js +2 -0
  444. package/lib/sdk-bridge.js +342 -401
  445. package/lib/sdk-foreground-admission.js +16 -0
  446. package/lib/sdk-mcp-descriptors.js +2 -37
  447. package/lib/sdk-message-processor.js +52 -17
  448. package/lib/sdk-quota-snapshot.js +1 -1
  449. package/lib/sdk-response-recovery.js +1 -0
  450. package/lib/sdk-worker.js +2 -677
  451. package/lib/server-account-passkeys.js +186 -0
  452. package/lib/server-account-passwords.js +127 -0
  453. package/lib/server-account-security.js +53 -0
  454. package/lib/server-admin.js +63 -16
  455. package/lib/server-appearance-settings.js +13 -1
  456. package/lib/server-auth.js +107 -79
  457. package/lib/server-contextual-clay-settings.js +40 -0
  458. package/lib/server-contextual-mate-sessions.js +70 -0
  459. package/lib/server-dm.js +2 -1
  460. package/lib/server-global-ws.js +10 -20
  461. package/lib/server-home-chat-events.js +18 -4
  462. package/lib/server-home-chat.js +22 -20
  463. package/lib/server-home-clay-entry.js +23 -4
  464. package/lib/server-home-clay-session-links.js +29 -9
  465. package/lib/server-home-mate-creation.js +1 -0
  466. package/lib/server-home-mcp-consent.js +14 -0
  467. package/lib/server-mates.js +25 -62
  468. package/lib/server-owner-ui.js +118 -0
  469. package/lib/server-path-access.js +38 -0
  470. package/lib/server-project-removal.js +22 -0
  471. package/lib/server-settings.js +8 -2
  472. package/lib/server.js +165 -43
  473. package/lib/session-config-transition.js +45 -0
  474. package/lib/session-folders.js +7 -2
  475. package/lib/session-fork-history.js +21 -0
  476. package/lib/session-github.js +9 -2
  477. package/lib/session-hygiene.js +3 -35
  478. package/lib/session-permission-mode.js +4 -3
  479. package/lib/session-skill-scope.js +11 -0
  480. package/lib/session-visibility.js +5 -2
  481. package/lib/session-work-primary.js +50 -0
  482. package/lib/sessions.js +64 -99
  483. package/lib/shared-browser-cookie-sync.js +32 -0
  484. package/lib/shared-browser-cookies.js +79 -0
  485. package/lib/shared-browser-runtime.js +25 -9
  486. package/lib/shared-browser-storage-sync.js +43 -0
  487. package/lib/shared-browser-storage.js +101 -0
  488. package/lib/shared-browser-tools.js +2 -1
  489. package/lib/shared-browser-worker.js +46 -10
  490. package/lib/terminal-manager.js +65 -6
  491. package/lib/tool-llm.js +1 -1
  492. package/lib/tui-transcript-index.js +1 -132
  493. package/lib/user-knowledge-service.js +23 -1
  494. package/lib/users-auth.js +38 -3
  495. package/lib/users-contextual-clay-preferences.js +31 -0
  496. package/lib/users-create.js +97 -0
  497. package/lib/users-permissions.js +2 -8
  498. package/lib/users-server-pin.js +37 -0
  499. package/lib/users.js +18 -84
  500. package/lib/vendor-login-browser.js +1 -11
  501. package/lib/workspace-assignment-service.js +25 -0
  502. package/lib/workspace-query-access.js +4 -1
  503. package/lib/workspace-query-mcp-server.js +1 -1
  504. package/lib/workspace-query-service.js +13 -2
  505. package/lib/ws-request.js +1 -0
  506. package/lib/ws-schema.js +18 -2
  507. package/lib/yoke/acp-agent-profiles.js +7 -5
  508. package/lib/yoke/adapters/antigravity.js +3 -14
  509. package/lib/yoke/adapters/claude-query-contract.js +9 -0
  510. package/lib/yoke/adapters/claude.js +54 -50
  511. package/lib/yoke/adapters/codex-query-contract.js +24 -0
  512. package/lib/yoke/adapters/codex.js +53 -111
  513. package/lib/yoke/adapters/kiro.js +3 -1
  514. package/lib/yoke/adapters/muse-query-contract.js +7 -0
  515. package/lib/yoke/adapters/muse.js +122 -0
  516. package/lib/yoke/auth-events.js +17 -0
  517. package/lib/yoke/claude-hook-installer.js +271 -0
  518. package/lib/yoke/claude-jsonl-watcher.js +204 -0
  519. package/lib/yoke/claude-maintenance.js +55 -0
  520. package/lib/yoke/claude-permission-patterns.js +53 -0
  521. package/lib/yoke/claude-response-recovery.js +155 -0
  522. package/lib/yoke/claude-transcript-hygiene.js +34 -0
  523. package/lib/yoke/claude-worker-startup.js +28 -0
  524. package/lib/yoke/clay-skill-install.js +33 -0
  525. package/lib/yoke/cli-sessions.js +300 -0
  526. package/lib/yoke/codex-app-server.js +7 -12
  527. package/lib/yoke/codex-idle-recovery.js +81 -1
  528. package/lib/yoke/codex-recovery-admission.js +164 -0
  529. package/lib/yoke/configuration.js +13 -0
  530. package/lib/yoke/discovery.js +70 -0
  531. package/lib/yoke/errors.js +8 -0
  532. package/lib/yoke/host-environment.js +7 -0
  533. package/lib/yoke/index.js +9 -51
  534. package/lib/yoke/interface.js +116 -0
  535. package/lib/yoke/kiro-acp-server.js +5 -5
  536. package/lib/yoke/legacy-sessions.js +89 -0
  537. package/lib/yoke/login-protocol.js +25 -0
  538. package/lib/yoke/maintenance.js +12 -0
  539. package/lib/yoke/mcp-proxy.js +32 -0
  540. package/lib/yoke/mcp-source-adapters.js +91 -0
  541. package/lib/yoke/mcp-source-context.js +42 -0
  542. package/lib/yoke/mcp-source-discovery.js +169 -0
  543. package/lib/yoke/mcp-source-plugins.js +68 -0
  544. package/lib/yoke/mcp-source-restrictions.js +47 -0
  545. package/lib/yoke/mcp-tool-policy-normalize.js +28 -0
  546. package/lib/yoke/model-preferences.js +6 -0
  547. package/lib/yoke/muse-artifacts.js +36 -0
  548. package/lib/yoke/muse-controls.js +50 -0
  549. package/lib/yoke/muse-input.js +64 -0
  550. package/lib/yoke/muse-items.js +157 -0
  551. package/lib/yoke/muse-policy.js +52 -0
  552. package/lib/yoke/muse-query.js +428 -0
  553. package/lib/yoke/muse-runtime.js +211 -0
  554. package/lib/yoke/muse-services.js +79 -0
  555. package/lib/yoke/muse-skills.js +79 -0
  556. package/lib/yoke/muse-turns.js +71 -0
  557. package/lib/yoke/options/acp.js +2 -0
  558. package/lib/yoke/options/antigravity.js +2 -0
  559. package/lib/yoke/options/claude.js +21 -0
  560. package/lib/yoke/options/codex-defaults.js +29 -0
  561. package/lib/yoke/options/codex-settings.js +21 -0
  562. package/lib/yoke/options/codex.js +6 -0
  563. package/lib/yoke/options/kiro-defaults.js +22 -0
  564. package/lib/yoke/options/kiro.js +5 -0
  565. package/lib/yoke/options/muse.js +5 -0
  566. package/lib/yoke/provider-contract.js +5 -0
  567. package/lib/yoke/providers/antigravity-executable.js +8 -0
  568. package/lib/yoke/providers/claude-executable.js +40 -0
  569. package/lib/yoke/providers/claude-model-descriptions.js +14 -0
  570. package/lib/yoke/providers/claude-process.js +97 -0
  571. package/lib/yoke/providers/claude-provision.js +75 -0
  572. package/lib/yoke/providers/codex-errors.js +8 -0
  573. package/lib/yoke/providers/muse-executable.js +17 -0
  574. package/lib/yoke/provisioning.js +6 -0
  575. package/lib/yoke/query-options.js +10 -0
  576. package/lib/yoke/response-recovery.js +41 -0
  577. package/lib/yoke/sdk-mcp-descriptors.js +37 -0
  578. package/lib/yoke/sdk-server-factory.js +7 -0
  579. package/lib/yoke/session-history.js +8 -0
  580. package/lib/yoke/session-tool-transport.js +34 -13
  581. package/lib/yoke/settings.js +23 -0
  582. package/lib/yoke/source-locations.js +4 -0
  583. package/lib/yoke/title-query.js +18 -7
  584. package/lib/yoke/tui-transcript-index.js +132 -0
  585. package/lib/yoke/usage.js +48 -0
  586. package/lib/yoke/user-input.js +13 -0
  587. package/lib/yoke/vendor-registry.js +81 -1
  588. package/package.json +11 -4
@@ -15,31 +15,37 @@ function attachProjectScheduledMessages(ctx) {
15
15
  var now = ctx.now || Date.now;
16
16
  var unregister = null;
17
17
  var stopped = false;
18
- function findSession(cliSessionId) {
18
+ function sessionIdentity(session) {
19
+ if (!session) return null;
20
+ if (ctx.isMate) return session.sessionOriginId || session._sessionRecordId || session.cliSessionId || null;
21
+ return session.cliSessionId || null;
22
+ }
23
+ function findSession(targetId) {
19
24
  var found = null;
20
25
  sm.sessions.forEach(function (session) {
21
- if (!found && session.cliSessionId === cliSessionId) found = session;
26
+ if (!found && (sessionIdentity(session) === targetId || (ctx.isMate &&
27
+ (session.cliSessionId === targetId || session._sessionRecordId === targetId)))) found = session;
22
28
  });
23
29
  return found;
24
30
  }
25
31
  function latestJob(session) {
26
- if (!scheduler || !session || !session.cliSessionId) return null;
32
+ if (!scheduler || !session || !sessionIdentity(session)) return null;
27
33
  var jobs = scheduler.listJobs();
28
34
  for (var i = jobs.length - 1; i >= 0; i--) {
29
- if (jobs[i].type === type && jobs[i].projectId === slug && jobs[i].target && jobs[i].target.id === session.cliSessionId) return jobs[i];
35
+ if (jobs[i].type === type && jobs[i].projectId === slug && jobs[i].target && findSession(jobs[i].target.id) === session) return jobs[i];
30
36
  }
31
37
  return null;
32
38
  }
33
39
  function pendingJob(session) {
34
- if (!scheduler || !session || !session.cliSessionId) return null;
40
+ if (!scheduler || !session || !sessionIdentity(session)) return null;
35
41
  if (session.scheduledMessage && session.scheduledMessage.jobId) {
36
42
  var direct = scheduler.getJob(session.scheduledMessage.jobId);
37
- if (direct && direct.state === "queued") return direct;
43
+ if (direct && direct.state === "queued" && !direct.payload.mateScheduleId) return direct;
38
44
  }
39
45
  var jobs = scheduler.listJobs();
40
46
  for (var i = jobs.length - 1; i >= 0; i--) {
41
- if (jobs[i].type === type && jobs[i].projectId === slug && jobs[i].state === "queued" &&
42
- jobs[i].target && jobs[i].target.id === session.cliSessionId) return jobs[i];
47
+ if (jobs[i].type === type && jobs[i].projectId === slug && jobs[i].state === "queued" && !jobs[i].payload.mateScheduleId &&
48
+ jobs[i].target && findSession(jobs[i].target.id) === session) return jobs[i];
43
49
  }
44
50
  return null;
45
51
  }
@@ -53,30 +59,10 @@ function attachProjectScheduledMessages(ctx) {
53
59
  scheduledAt: job.payload.scheduledAt,
54
60
  };
55
61
  }
56
- function queueActor(actorId) {
57
- return users.isMultiUser() ? users.findUserById(actorId) : { id: "default" };
58
- }
59
- function queueItemForJob(session, job, actorId) {
60
- if (!pendingMessageQueue || !session || !job) return null;
61
- var actor = queueActor(actorId || (job.payload && job.payload.actorId));
62
- var items = pendingMessageQueue.list(session, actor);
63
- for (var i = 0; i < items.length; i++) {
64
- if (items[i].schedule && items[i].schedule.jobId === job.id && items[i].schedule.revision === job.payload.revision) return items[i];
65
- }
66
- return null;
67
- }
68
- function validateQueueControl(session, job, actorId, correlation, requireQueueRevision) {
69
- if (!pendingMessageQueue) return null;
70
- if (requireQueueRevision && (!correlation || correlation.queueRevision == null || Number(correlation.queueRevision) !== pendingMessageQueue.getRevision())) {
71
- throw new Error("The scheduled-message queue is stale.");
72
- }
73
- var actor = queueActor(actorId || (job.payload && job.payload.actorId));
74
- var item = queueItemForJob(session, job, actorId);
75
- if (!item || item.actorId !== actor.id || ["cancelled", "consumed", "failed"].indexOf(item.state) >= 0) {
76
- throw new Error("The scheduled queue item is no longer available.");
77
- }
78
- return item;
79
- }
62
+ var queue = require('./project-scheduled-message-queue').attachScheduledMessageQueue({ users: users, pendingMessageQueue: pendingMessageQueue });
63
+ var queueActor = queue.actor;
64
+ var queueItemForJob = queue.item;
65
+ var validateQueueControl = queue.validate;
80
66
  function sendState(session, targetWs, sendFn) {
81
67
  var job = pendingJob(session);
82
68
  session.scheduledMessage = projection(job, queueItemForJob(session, job, job && job.payload && job.payload.actorId));
@@ -106,11 +92,13 @@ function attachProjectScheduledMessages(ctx) {
106
92
  function authorize(session, actorId) {
107
93
  if (!session || session.destroying) throw new Error("The session is no longer available.");
108
94
  if (sm.sessions.get(session.localId) !== session) throw new Error("The session is no longer live.");
109
- if (!session.cliSessionId) throw new Error("This session has no persistent provider identity yet.");
95
+ if (!sessionIdentity(session)) throw new Error(ctx.isMate ? "This Mate has no persistent server identity yet." : "This session has no persistent provider identity yet.");
110
96
  if (session.mode === "tui" || session.runtimeMode === "tui" || sessionProvenance.isWorker(session) ||
111
97
  (ctx.isDriverOperatedSession && ctx.isDriverOperatedSession(session))) {
112
98
  throw new Error("Scheduled messages are available only for ordinary project chat sessions.");
113
99
  }
100
+ if (ctx.isMate && (session._mcpForeignInput || session.sessionVisibility === "shared" || session.mateCreationMode ||
101
+ (session.history || []).some(function (entry) { return entry.type === "user_message" && entry.from && entry.from !== (session.ownerId || "default"); }))) throw new Error("Foreign input cannot authorize private Mate schedules.");
114
102
  if (!users.isMultiUser()) return LOCAL_OWNER;
115
103
  if (!actorId || !users.findUserById(actorId)) throw new Error("The scheduling user no longer exists.");
116
104
  var access = ctx.getProjectAccess();
@@ -123,26 +111,33 @@ function attachProjectScheduledMessages(ctx) {
123
111
  }
124
112
  return ownerId;
125
113
  }
126
- function buildSpec(session, text, resetsAt, actorId, revision) {
114
+ function buildSpec(session, text, resetsAt, actorId, revision, options) {
115
+ options = options || {};
127
116
  var timestamp = now();
128
- var runAt = resetsAt <= timestamp ? timestamp + 5000 : resetsAt + 60000;
117
+ var runAt = options.exact === true ? resetsAt : (resetsAt <= timestamp ? timestamp + 5000 : resetsAt + 60000);
129
118
  var ownerId = authorize(session, actorId);
130
119
  return {
131
120
  type: type,
132
- idempotencyKey: "project-message:" + slug + ":" + session.cliSessionId + ":" + revision,
121
+ idempotencyKey: "project-message:" + slug + ":" + sessionIdentity(session) + ":" + revision,
133
122
  ownerId: ownerId,
134
123
  projectId: slug,
135
- target: { kind: "project-session", id: session.cliSessionId },
124
+ target: { kind: "project-session", id: sessionIdentity(session) },
136
125
  payload: {
137
126
  text: text,
138
127
  hasAttachments: false,
139
128
  queueAdmissionRequired: true,
140
- cliSessionId: session.cliSessionId,
129
+ cliSessionId: session.cliSessionId || null,
130
+ sessionIdentity: sessionIdentity(session),
141
131
  actorId: actorId || LOCAL_OWNER,
142
132
  sessionOwnerId: ownerId,
143
133
  revision: revision,
144
134
  requestedResetsAt: resetsAt,
145
135
  scheduledAt: timestamp,
136
+ scheduleRule: options.scheduleRule || null,
137
+ mateScheduleId: options.mateScheduleId || null,
138
+ logicalScheduleId: options.logicalScheduleId || options.mateScheduleId || null,
139
+ logicalRevision: options.logicalRevision || null,
140
+ occurrence: Number(options.occurrence || 0),
146
141
  },
147
142
  runAt: runAt,
148
143
  };
@@ -151,12 +146,12 @@ function attachProjectScheduledMessages(ctx) {
151
146
  if (!scheduler || !session || !requestId) return [];
152
147
  var jobs = scheduler.listJobs();
153
148
  return jobs.filter(function (job) {
154
- return job.type === type && job.projectId === slug && job.target && job.target.id === session.cliSessionId &&
149
+ return job.type === type && job.projectId === slug && job.target && findSession(job.target.id) === session &&
155
150
  job.payload && job.payload.admissionRequestId === requestId && job.payload.actorId === actorId;
156
151
  });
157
152
  }
158
153
  function requestIdempotencyKey(session, actorId, requestId) {
159
- var base = "project-message:" + slug + ":" + session.cliSessionId + ":actor:" + actorId + ":request:" + requestId;
154
+ var base = "project-message:" + slug + ":" + sessionIdentity(session) + ":actor:" + actorId + ":request:" + requestId;
160
155
  var jobs = requestJobs(session, actorId, requestId);
161
156
  var retryCount = 0;
162
157
  for (var i = 0; i < jobs.length; i++) if (jobs[i].state === "cancelled" && jobs[i].cancelledReason === "queue_admission_failed") retryCount++;
@@ -176,8 +171,7 @@ function attachProjectScheduledMessages(ctx) {
176
171
  scheduledMessage: job ? projection(job, queueItemForJob(session, job, actorId)) : null,
177
172
  });
178
173
  }
179
-
180
- function schedule(session, text, resetsAt, actorUser, targetWs, attachments, requestId, transportAccountId) {
174
+ function schedule(session, text, resetsAt, actorUser, targetWs, attachments, requestId, transportAccountId, options) {
181
175
  var actorId = users.isMultiUser() ? (actorUser && actorUser.id) : LOCAL_OWNER;
182
176
  if (!scheduler || stopped) {
183
177
  sendAdmissionResult(targetWs, session, actorId, requestId, null, "Scheduled messages are temporarily unavailable.", transportAccountId);
@@ -198,7 +192,7 @@ function attachProjectScheduledMessages(ctx) {
198
192
  sendAdmissionResult(targetWs, session, actorId, requestId, null, "Invalid schedule request identifier.", transportAccountId);
199
193
  return null;
200
194
  }
201
- if (typeof text !== "string" || (!text.trim() && !images.length && !pastes.length) || !isFinite(Number(resetsAt))) {
195
+ if (typeof text !== "string" || (!text.trim() && !images.length && !pastes.length) || !isFinite(Number(resetsAt)) || (options && options.exact === true && Number(resetsAt) <= now())) {
202
196
  sendAdmissionResult(targetWs, session, actorId, requestId, null, "A valid scheduled message and reset time are required.", transportAccountId);
203
197
  visibleError(session, targetWs, "A valid scheduled message and reset time are required.");
204
198
  return null;
@@ -219,7 +213,7 @@ function attachProjectScheduledMessages(ctx) {
219
213
  return prior;
220
214
  }
221
215
  var revision = makeRevision();
222
- var spec = buildSpec(session, text, Number(resetsAt), actorId, revision);
216
+ var spec = buildSpec(session, text, Number(resetsAt), actorId, revision, options);
223
217
  if (requestId) {
224
218
  spec.idempotencyKey = requestIdempotencyKey(session, actorId, requestId);
225
219
  spec.payload.admissionRequestId = requestId;
@@ -227,6 +221,7 @@ function attachProjectScheduledMessages(ctx) {
227
221
  }
228
222
  spec.payload.hasAttachments = images.length > 0 || pastes.length > 0;
229
223
  var current = pendingJob(session);
224
+ if (options && options.mateScheduleId) current = null;
230
225
  if (current && requestId && (!current.payload || current.payload.admissionRequestId !== requestId)) {
231
226
  throw new Error("Another scheduled message is already pending.");
232
227
  }
@@ -239,7 +234,7 @@ function attachProjectScheduledMessages(ctx) {
239
234
  images: images,
240
235
  pastes: pastes,
241
236
  clientMessageId: requestId ? "scheduled-request-" + requestId : "scheduled-" + job.id,
242
- schedule: { jobId: job.id, revision: job.payload.revision, notBefore: job.runAt, ready: false },
237
+ schedule: { jobId: job.id, revision: job.payload.revision, notBefore: job.runAt, ready: false, logicalScheduleId: job.payload.logicalScheduleId || null, logicalRevision: job.payload.logicalRevision || null },
243
238
  }, queueActor(actorId));
244
239
  if (!queuedScheduled.ok) {
245
240
  if (current) {
@@ -262,18 +257,18 @@ function attachProjectScheduledMessages(ctx) {
262
257
  return null;
263
258
  }
264
259
  }
265
-
266
260
  function requireCorrelation(job, correlation, targetWs) {
267
261
  if (!targetWs) return;
268
262
  if (!correlation || correlation.jobId !== job.id || correlation.revision !== job.payload.revision || correlation.queueRevision == null || !pendingMessageQueue || Number(correlation.queueRevision) !== pendingMessageQueue.getRevision()) {
269
263
  throw new Error("The scheduled-message control is stale.");
270
264
  }
271
265
  }
272
-
273
266
  function cancel(session, actorUser, targetWs, reason, correlation) {
274
267
  try {
275
268
  authorize(session, users.isMultiUser() ? (actorUser && actorUser.id) : LOCAL_OWNER);
276
- var job = pendingJob(session) || latestJob(session);
269
+ var job = correlation && correlation.jobId ? scheduler.getJob(correlation.jobId) : (pendingJob(session) || latestJob(session));
270
+ if (job && (job.projectId !== slug || job.type !== type || !job.target || findSession(job.target.id) !== session || job.ownerId !== ownerFor(session) ||
271
+ (correlation && correlation.revision !== job.payload.revision))) throw new Error("The scheduled-message control is stale.");
277
272
  if (!job) return false;
278
273
  requireCorrelation(job, correlation, targetWs);
279
274
  if (pendingMessageQueue) validateQueueControl(session, job, actorUser && actorUser.id, correlation, !!targetWs);
@@ -291,7 +286,6 @@ function attachProjectScheduledMessages(ctx) {
291
286
  return false;
292
287
  }
293
288
  }
294
-
295
289
  function sendNow(session, actorUser, targetWs, correlation) {
296
290
  try {
297
291
  authorize(session, users.isMultiUser() ? (actorUser && actorUser.id) : LOCAL_OWNER);
@@ -310,7 +304,7 @@ function attachProjectScheduledMessages(ctx) {
310
304
  images: existing ? existing.message.images : undefined,
311
305
  pastes: existing ? existing.message.pastes : undefined,
312
306
  clientMessageId: existing ? existing.clientMessageId : "scheduled-" + updated.id,
313
- schedule: { jobId: updated.id, revision: updated.payload.revision, notBefore: updated.runAt, ready: false },
307
+ schedule: { jobId: updated.id, revision: updated.payload.revision, notBefore: updated.runAt, ready: false, logicalScheduleId: updated.payload.logicalScheduleId || null, logicalRevision: updated.payload.logicalRevision || null },
314
308
  }, queueActor(actorUser && actorUser.id));
315
309
  if (!queued.ok) {
316
310
  try { scheduler.replaceQueued(job.id, job); }
@@ -326,14 +320,16 @@ function attachProjectScheduledMessages(ctx) {
326
320
  return false;
327
321
  }
328
322
  }
329
-
330
323
  function canRun(job) {
331
324
  var session = findSession(job.target && job.target.id);
332
325
  if (!session) return true;
333
326
  return !session.isProcessing && !session._queryStarting;
334
327
  }
335
-
336
328
  function failJob(session, job, error, processingOwner) {
329
+ if (session && job.payload.mateScheduleId && ctx.mateLifecycle) {
330
+ try { ctx.mateLifecycle().failed(session, job, error); }
331
+ catch (saveError) { console.error("[mate-schedules] Failed to persist dispatch failure:", saveError.message); }
332
+ }
337
333
  var ownsProcessing = session && processingOwner && session._scheduledMessageProcessing === processingOwner &&
338
334
  session._queryGeneration === processingOwner.queryGeneration &&
339
335
  session.queryInstance === processingOwner.queryInstance && !session._queryStarting;
@@ -358,6 +354,7 @@ function attachProjectScheduledMessages(ctx) {
358
354
  try {
359
355
  if (!session) throw new Error("The scheduled session was deleted.");
360
356
  var ownerId = authorize(session, job.payload.actorId);
357
+ if (job.payload.mateScheduleId && ctx.mateLifecycle && !ctx.mateLifecycle().current(session, job)) throw new Error("The Mate schedule is no longer active.");
361
358
  if (ownerId !== job.ownerId || ownerId !== job.payload.sessionOwnerId) throw new Error("The session owner changed.");
362
359
  if (ctx.osUsers) {
363
360
  var owner = users.findUserById(job.ownerId);
@@ -378,7 +375,7 @@ function attachProjectScheduledMessages(ctx) {
378
375
  if (!ensured && job.payload.queueAdmissionRequired === true) throw new Error("Scheduled queue item is missing; refusing to recreate message payload.");
379
376
  if (!ensured) ensured = pendingMessageQueue.upsertScheduled(session, {
380
377
  type: "message", text: job.payload.text, clientMessageId: "scheduled-" + job.id,
381
- schedule: { jobId: job.id, revision: job.payload.revision, notBefore: job.runAt, ready: false },
378
+ schedule: { jobId: job.id, revision: job.payload.revision, notBefore: job.runAt, ready: false, logicalScheduleId: job.payload.logicalScheduleId || null, logicalRevision: job.payload.logicalRevision || null },
382
379
  }, queueActor(job.payload.actorId));
383
380
  if (!ensured || ensured.ok === false) throw new Error(ensured.error || "Scheduled queue handoff could not be prepared.");
384
381
  var released = pendingMessageQueue.releaseScheduled(session, job.id, job.payload.revision);
@@ -390,7 +387,6 @@ function attachProjectScheduledMessages(ctx) {
390
387
  throw error;
391
388
  }
392
389
  }
393
-
394
390
  function onQueueConsumed(item) {
395
391
  if (!item || !item.schedule || !scheduler) return false;
396
392
  var job = scheduler.getJob(item.schedule.jobId);
@@ -401,10 +397,10 @@ function attachProjectScheduledMessages(ctx) {
401
397
  session.rateLimitAutoContinuePending = false;
402
398
  }
403
399
  sm.sendAndRecord(session, { type: "scheduled_message_sent", jobId: job.id, revision: item.schedule.revision });
400
+ if (job.payload && job.payload.mateScheduleId && ctx.mateLifecycle) ctx.mateLifecycle().consumed(session, job);
404
401
  sm.broadcastSessionList();
405
402
  return true;
406
403
  }
407
-
408
404
  function onQueueCancelled(item) {
409
405
  if (!item || !item.schedule || !scheduler) return false;
410
406
  var job = scheduler.getJob(item.schedule.jobId);
@@ -412,6 +408,7 @@ function attachProjectScheduledMessages(ctx) {
412
408
  try { scheduler.cancel(job.id, "cancelled_by_user"); } catch (error) {}
413
409
  }
414
410
  var session = job && job.target ? findSession(job.target.id) : null;
411
+ if (session && job.payload.mateScheduleId && ctx.mateLifecycle) ctx.mateLifecycle().cancelled(session, job);
415
412
  if (session && session.scheduledMessage && session.scheduledMessage.jobId === item.schedule.jobId) {
416
413
  session.scheduledMessage = null;
417
414
  session.rateLimitAutoContinuePending = false;
@@ -419,17 +416,16 @@ function attachProjectScheduledMessages(ctx) {
419
416
  }
420
417
  return true;
421
418
  }
422
-
423
419
  function authorizePending(item, session) {
424
420
  if (!item || !item.schedule || !scheduler || !session) return true;
425
421
  var job = scheduler.getJob(item.schedule.jobId);
426
422
  var expectedActorId = users.isMultiUser() ? job && job.payload && job.payload.actorId : "default";
427
- if (!job || ["running", "completed", "interrupted"].indexOf(job.state) < 0 || !job.target || job.target.id !== session.cliSessionId ||
423
+ if (!job || ["running", "completed", "interrupted"].indexOf(job.state) < 0 || !job.target || findSession(job.target.id) !== session ||
428
424
  !job.payload || job.projectId !== slug || job.payload.revision !== item.schedule.revision || item.actorId !== expectedActorId ||
429
425
  job.ownerId !== job.payload.sessionOwnerId) return false;
426
+ if (job.payload.mateScheduleId && ctx.mateLifecycle && !ctx.mateLifecycle().current(session, job)) return false;
430
427
  try { return authorize(session, job.payload.actorId) === job.ownerId; } catch (error) { return false; }
431
428
  }
432
-
433
429
  function rehydrate() {
434
430
  sm.sessions.forEach(function (session) {
435
431
  var pending = pendingJob(session);
@@ -437,12 +433,12 @@ function attachProjectScheduledMessages(ctx) {
437
433
  if (!pendingMessageQueue) return;
438
434
  var jobs = scheduler.listJobs();
439
435
  for (var i = 0; i < jobs.length; i++) {
440
- if (jobs[i].type !== type || jobs[i].projectId !== slug || !jobs[i].target || jobs[i].target.id !== session.cliSessionId) continue;
436
+ if (jobs[i].type !== type || jobs[i].projectId !== slug || !jobs[i].target || findSession(jobs[i].target.id) !== session) continue;
441
437
  var actor = users.isMultiUser() ? users.findUserById(jobs[i].payload.actorId) : { id: "default" };
442
438
  if (jobs[i].state === "queued" && !queueItemForJob(session, jobs[i], jobs[i].payload.actorId)) {
443
- if (jobs[i].payload.queueAdmissionRequired !== true) pendingMessageQueue.upsertScheduled(session, {
439
+ if (jobs[i].payload.queueAdmissionRequired !== true || (jobs[i].payload.mateScheduleId && ctx.mateLifecycle && ctx.mateLifecycle().current(session, jobs[i]))) pendingMessageQueue.upsertScheduled(session, {
444
440
  type: "message", text: jobs[i].payload.text, clientMessageId: "scheduled-" + jobs[i].id,
445
- schedule: { jobId: jobs[i].id, revision: jobs[i].payload.revision, notBefore: jobs[i].runAt, ready: false },
441
+ schedule: { jobId: jobs[i].id, revision: jobs[i].payload.revision, notBefore: jobs[i].runAt, ready: false, logicalScheduleId: jobs[i].payload.logicalScheduleId || null, logicalRevision: jobs[i].payload.logicalRevision || null },
446
442
  }, actor);
447
443
  }
448
444
  else if (["interrupted", "completed"].indexOf(jobs[i].state) >= 0) {
@@ -455,19 +451,19 @@ function attachProjectScheduledMessages(ctx) {
455
451
  }
456
452
  });
457
453
  }
458
-
459
454
  function deleted(localId, session) {
460
- var job = pendingJob(session);
461
- if (!job) return;
462
- try { scheduler.cancel(job.id, "session_deleted"); } catch (error) {}
455
+ if (!session) return;
456
+ scheduler.listJobs().forEach(function (job) {
457
+ if (job.type === type && job.state === "queued" && job.target && [sessionIdentity(session), session.cliSessionId, session._sessionRecordId].indexOf(job.target.id) >= 0) {
458
+ try { scheduler.cancel(job.id, "session_deleted"); } catch (error) {}
459
+ }
460
+ });
463
461
  session.scheduledMessage = null;
464
462
  }
465
-
466
463
  function notify() {
467
464
  if (!scheduler || stopped) return;
468
465
  try { scheduler.tick(); } catch (error) {}
469
466
  }
470
-
471
467
  function shutdown() {
472
468
  stopped = true;
473
469
  if (unregister) unregister();
@@ -476,7 +472,7 @@ function attachProjectScheduledMessages(ctx) {
476
472
 
477
473
  if (scheduler) {
478
474
  unregister = scheduler.registerHandler(type, dispatch, { canRun: canRun });
479
- rehydrate();
475
+ if (!ctx.deferRehydrate) rehydrate();
480
476
  sm.addOnSessionDeleted(deleted);
481
477
  sm.addOnSessionViewed(function (session, targetWs, sendFn) { sendState(session, targetWs, sendFn); });
482
478
  }
@@ -491,6 +487,9 @@ function attachProjectScheduledMessages(ctx) {
491
487
  shutdown: shutdown,
492
488
  handlerType: type,
493
489
  authorizePending: authorizePending,
490
+ authorize: authorize,
491
+ identity: sessionIdentity,
492
+ queueItem: queueItemForJob,
494
493
  onQueueConsumed: onQueueConsumed,
495
494
  onQueueCancelled: onQueueCancelled,
496
495
  };
@@ -0,0 +1,83 @@
1
+ var crypto = require('crypto');
2
+ var authority = require('./canonical-clay-scheduling-authority');
3
+ var validation = require('./schedule-validation');
4
+ function attachScheduledTaskControl(ctx) {
5
+ var drafts = new Map();
6
+ function current(session, token) {
7
+ var actor = authority.validate(token, ctx.slug, session);
8
+ if (!ctx.available(session)) throw new Error('Scheduled Tasks requires an eligible owned project Driver session.');
9
+ if (ctx.validateOwnerIdentity) ctx.validateOwnerIdentity(session);
10
+ return actor;
11
+ }
12
+ function read(session, op, token) {
13
+ var actor = current(session, token);
14
+ if (op.action === 'list') return { records: ctx.records.list(session).filter(function (item) { return !ctx.multiUser() || item.ownerId === actor.userId; }), timezone: ctx.timezone };
15
+ var result = ctx.records.read(session, op.id);
16
+ if (!result.ok) throw new Error(result.error);
17
+ if (ctx.multiUser() && result.record.ownerId !== actor.userId) throw new Error('This task belongs to another owner or requires workbench ownership setup.');
18
+ return result;
19
+ }
20
+ function snapshot(session, op, token) {
21
+ current(session, token);
22
+ return op.action === 'propose' ? { draft: session.scheduledTaskDraft || null, interviewId: ctx.interviewId(session) } : read(session, { id: op.id }, token).record;
23
+ }
24
+ function prepare(session, op, token, requestId) {
25
+ current(session, token);
26
+ if (ctx.interviewId(session) || session.scheduledTaskDraft) throw new Error('Finish or cancel this Driver schedule draft before proposing another.');
27
+ var checked = validation.validateScheduledTaskInput(op.data);
28
+ if (!checked.ok || !checked.value.execution) throw new Error(checked.error || 'Choose Driver and Split Worker runtimes.');
29
+ ctx.preflight(checked.value.execution.driver, null, true); ctx.preflight(checked.value.execution.worker, null, true);
30
+ current(session, token);
31
+ var begun = ctx.beginManual(session, requestId);
32
+ if (!begun.ok) throw new Error(begun.error);
33
+ var prior = session.scheduledTaskDraft;
34
+ var draft = Object.assign({}, prior, checked.value, { canonicalScheduling: true, version: Number(prior.version || 0) + 1 });
35
+ session.scheduledTaskDraft = draft;
36
+ if (ctx.sm.saveSessionFile(session) !== true) { session.scheduledTaskDraft = prior; throw new Error('The canonical schedule proposal could not be saved.'); }
37
+ if (drafts.size >= 100) drafts.delete(drafts.keys().next().value);
38
+ drafts.set(draft.id, { session: session, token: token });
39
+ ctx.publish(session, { open: true });
40
+ return { status: 'proposed', persisted: true, proposalId: draft.id, version: draft.version, interviewId: draft.interviewId, sessionId: session.localId, guidance: 'The task has not been created. Open this selected Driver Scheduled Tasks workbench and use its final Create task control. No execution has started.' };
41
+ }
42
+ function actorForDraft(session, draft) {
43
+ if (!draft.canonicalScheduling) return null;
44
+ var grant = drafts.get(draft.id);
45
+ if (!grant || grant.session !== session) throw new Error('This canonical schedule proposal needs a fresh live Clay query after reload.');
46
+ return current(session, grant.token);
47
+ }
48
+ function apply(session, op, token, requestId) {
49
+ var actor = current(session, token);
50
+ if (op.action === 'propose') return prepare(session, op, token, requestId);
51
+ var selected = read(session, op, token).record;
52
+ if (selected.revision !== op.revision) throw new Error('Scheduled task revision changed.');
53
+ if (!selected.ownerId && ctx.multiUser()) throw new Error('Claim legacy task ownership through the existing workbench first.');
54
+ var record = ctx.registry.getById(op.id), result;
55
+ current(session, token);
56
+ if (op.action === 'update') {
57
+ result = ctx.records.update(session, op.id, op.revision, op.data, actor);
58
+ if (!result.ok) throw new Error(result.error);
59
+ ctx.publishRecord(session, result.record);
60
+ return { status: 'completed', persisted: true, record: result.record };
61
+ }
62
+ if (op.action === 'run') {
63
+ result = ctx.execution.trigger(record, 'canonical-clay');
64
+ if (!result.ok) return { status: 'failed', persisted: 'unknown', error: result.error, result: result };
65
+ return { status: 'queued', persisted: true, result: result, guidance: 'The existing scheduled-task executor dispatched its Driver. Task completion requires its normal Worker and outcome reporting.' };
66
+ }
67
+ if (op.action === 'cancel') {
68
+ var running = !!record.activeRun;
69
+ if (running && !ctx.execution.stopRecord(record, 'The owner cancelled this scheduled task through Clay.')) throw new Error('The active scheduled run could not be stopped; task retained.');
70
+ current(session, token);
71
+ if (!ctx.registry.remove(record.id)) throw new Error('The scheduled task could not be cancelled.');
72
+ return { status: 'completed', persisted: true, removed: true, runStopRequested: running };
73
+ }
74
+ var enabled = op.action === 'resume';
75
+ result = ctx.registry.update(record.id, { enabled: enabled, updatedBy: actor });
76
+ if (!result) throw new Error('The scheduled task state could not be saved.');
77
+ ctx.publishRecord(session, ctx.records.read(session, op.id).record);
78
+ return { status: 'completed', persisted: true, enabled: enabled };
79
+ }
80
+ return { authorize: current, read: read, snapshot: snapshot, apply: apply, actorForDraft: actorForDraft,
81
+ creationId: function (draft) { return 'loop_clay_' + crypto.createHash('sha256').update(draft.id).digest('hex').slice(0, 32); } };
82
+ }
83
+ module.exports = { attachScheduledTaskControl: attachScheduledTaskControl };
@@ -313,13 +313,19 @@ function attachScheduledTasks(ctx) {
313
313
  ctx.preflightRuntime(checked.value.execution.worker, null, true);
314
314
  } catch (runtimeError) { return { ok: false, error: runtimeError.message || String(runtimeError) }; }
315
315
  }
316
- var recordId = "loop_" + Date.now() + "_" + crypto.randomBytes(3).toString("hex");
316
+ var canonicalActor;
317
+ try { canonicalActor = productControl.actorForDraft(session, draft); } catch (error) { return { ok: false, error: error.message }; }
318
+ var recordId = draft.canonicalScheduling ? productControl.creationId(draft) : "loop_" + Date.now() + "_" + crypto.randomBytes(3).toString("hex");
319
+ var creationKey = crypto.createHash('sha256').update(JSON.stringify(checked.value)).digest('hex');
320
+ var existing = draft.canonicalScheduling && registry.getById(recordId);
321
+ if (existing) return existing.creationFingerprint === creationKey ? { ok: true, duplicate: true, recordId: existing.id } : { ok: false, error: 'This schedule proposal already created a different reviewed task.' };
317
322
  var saved;
318
323
  try {
319
324
  var actor = owner(ws);
320
325
  if (session.ownerId && actor.id !== session.ownerId) return { ok: false, error: "The schedule owner does not match this Driver session." };
321
326
  createTaskFiles(recordId, checked.value);
322
327
  saved = registry.register(Object.assign({}, checked.value, {
328
+ createdBy: canonicalActor, updatedBy: canonicalActor, creationFingerprint: creationKey,
323
329
  id: recordId, task: checked.value.instructions, prompt: checked.value.instructions, enabled: true,
324
330
  mode: "simple", source: checked.value.cron ? null : "schedule", ownerId: actor.id, ownerName: actor.name, sessionId: session.localId, createdViaScheduledTasks: true,
325
331
  }));
@@ -475,7 +481,12 @@ function attachScheduledTasks(ctx) {
475
481
  return allowed(ws, session) && available(session);
476
482
  }
477
483
 
478
- return { getToolDefs: getToolDefs, getSystemPrompt: getSystemPrompt, handleMessage: handleMessage, activeInterviewId: activeInterviewId, canStartInterview: canStartInterview, canCreateInterview: canCreateInterview };
484
+ var productControl = require('./project-scheduled-task-control').attachScheduledTaskControl({
485
+ slug: ctx.projectSlug, sm: sm, available: available, records: records, registry: registry, execution: ctx.scheduledExecution,
486
+ validateOwnerIdentity: ctx.validateOwnerIdentity, multiUser: function () { return !!(ctx.usersModule && ctx.usersModule.isMultiUser()); }, preflight: ctx.preflightRuntime, timezone: schedulerTimeZone,
487
+ beginManual: beginManual, interviewId: activeInterviewId, publish: publish, publishRecord: publishRecord,
488
+ });
489
+ return { productControl: productControl, getToolDefs: getToolDefs, getSystemPrompt: getSystemPrompt, handleMessage: handleMessage, activeInterviewId: activeInterviewId, canStartInterview: canStartInterview, canCreateInterview: canCreateInterview };
479
490
  }
480
491
 
481
492
  module.exports = { attachScheduledTasks: attachScheduledTasks, activeInterviewId: activeInterviewId, interviewPrompt: interviewPrompt, authorizeStoredOwner: authorizeStoredOwner };
@@ -0,0 +1,10 @@
1
+ function attachSchedulingAccess(ctx) {
2
+ function ownerIdentity(session) {
3
+ if (!ctx.osUsers) return null;
4
+ var username = ctx.getLinuxUser(session), identity = username && ctx.resolveLinuxUser(username);
5
+ if (!identity) throw new Error('The schedule owner no longer has a valid mapped OS identity.');
6
+ return identity;
7
+ }
8
+ return { ownerIdentity: ownerIdentity };
9
+ }
10
+ module.exports = { attachSchedulingAccess: attachSchedulingAccess };
@@ -13,6 +13,7 @@ function handleServerSettings(ctx, ws, msg) {
13
13
  var id = ws._clayUser && ws._clayUser.id;
14
14
  var user = id && ctx.usersModule.findUserById(id);
15
15
  if (!user || user.role !== 'admin') { reply({ ok: false, error: 'Administrator access required.' }); return true; }
16
+ if (msg.type === 'set_pin') { reply({ ok: false, error: 'Server PIN is unavailable while account authentication is enabled. Manage account credentials in Personal settings or Users.' }); return true; }
16
17
  }
17
18
  var value = msg[entry.field];
18
19
  if (entry.valid ? !entry.valid(value) : typeof value !== 'boolean') { reply({ ok: false, error: 'Invalid setting value.' }); return true; }
@@ -0,0 +1,65 @@
1
+ var yoke = require("./yoke");
2
+ var permissionModes = require("./session-permission-mode");
3
+
4
+ // Shared session effects. Callers authorize the exact live session before entry.
5
+ function attachSessionActions(ctx) {
6
+ var sm = ctx.sm;
7
+ function exact(session) {
8
+ if (!session || sm.sessions.get(session.localId) !== session) throw new Error("Session was deleted or replaced.");
9
+ }
10
+ function rename(session, title) {
11
+ exact(session);
12
+ var previous = { title: session.title, titleProvisional: session.titleProvisional, titleAutoGenerated: session.titleAutoGenerated, titleManuallySet: session.titleManuallySet };
13
+ session.title = title;
14
+ session.titleProvisional = false;
15
+ session.titleAutoGenerated = false;
16
+ session.titleManuallySet = true;
17
+ try { if (sm.saveSessionFile(session) === false) throw new Error("Could not save session title."); }
18
+ catch (error) { Object.assign(session, previous); throw error; }
19
+ sm.notifySessionRenamed(session.localId);
20
+ sm.broadcastSessionList();
21
+ var adapter = ctx.adapters && ctx.adapters[session.vendor] || ctx.adapter;
22
+ if (session.cliSessionId && adapter && adapter.renameSession) {
23
+ Promise.resolve(adapter.renameSession(session.cliSessionId, title, { dir: ctx.cwd, linuxUser: ctx.getLinuxUserForSession && ctx.getLinuxUserForSession(session) || undefined })).catch(function (error) {
24
+ console.error("[session-actions] Provider title sync failed:", error.message);
25
+ });
26
+ }
27
+ return { title: title };
28
+ }
29
+ function stop(session, actor) {
30
+ exact(session);
31
+ if (ctx.autonomousRun && session.autonomousRun) ctx.autonomousRun.finish(session, "stopped", "Stopped by the user.");
32
+ if (typeof ctx.sdk.cancelResponseRecovery === "function") ctx.sdk.cancelResponseRecovery(session);
33
+ session._pendingMessageDrainPaused = true;
34
+ if (ctx.onPendingQueuePause) ctx.onPendingQueuePause(session, actor || null);
35
+ if (!session.isProcessing && !session._queryStarting && !session._responseRecoveryStopPending) return { status: "completed", queuePaused: true };
36
+ if (ctx.onHumanPairStop) ctx.onHumanPairStop(session);
37
+ session.taskStopRequested = true;
38
+ if (session.abortController) session.abortController.abort();
39
+ return { status: "queued", queuePaused: true, detail: "Stop requested; runtime completion is still pending." };
40
+ }
41
+ async function effort(session, value, revalidate) {
42
+ exact(session);
43
+ var vendor = session.vendor || sm.defaultVendor || "claude";
44
+ if (yoke.clampEffort(vendor, value) !== value) throw new Error("This effort level is not supported by the selected vendor.");
45
+ var result = await ctx.sdk.setEffort(session, value, revalidate ? { revalidate: revalidate } : undefined);
46
+ if (revalidate) return result;
47
+ sm.sendToSession(session, { type: "config_state", sessionId: session.localId, vendor: vendor, effort: value, model: session.model || ((sm.defaultModelByVendor || {})[vendor]) || "", mode: session.permissionMode || sm.currentPermissionMode || "default", betas: sm.currentBetas || [], thinking: sm.currentThinking || "adaptive", thinkingBudget: sm.currentThinkingBudget || 10000 });
48
+ return { effort: value };
49
+ }
50
+ async function permission(session, value, requestId, revalidate) {
51
+ exact(session);
52
+ if ((session.runtimeMode || session.mode || "gui") !== "gui" || ctx.isDriverOperatedSession && ctx.isDriverOperatedSession(session)) throw new Error("Permissions require a GUI Driver session.");
53
+ if (ctx.dangerouslySkipPermissions) throw new Error("Skip permissions is forced by the server setting.");
54
+ var valid = permissionModes.validate(session, value, sm.defaultVendor);
55
+ if (!valid.ok) throw new Error(valid.error);
56
+ if (session.permissionMode === "bypassPermissions" && valid.mode !== "bypassPermissions" && ctx.autonomousRun) await ctx.autonomousRun.stopForPermissionChange(session);
57
+ var result = await ctx.fullAccessService.setMode(session, valid.mode, revalidate ? { revalidate: revalidate } : undefined);
58
+ if (revalidate) return result;
59
+ var state = permissionModes.clientState(session, sm.currentPermissionMode, sm.defaultVendor);
60
+ sm.sendToSession(session, Object.assign({ type: "config_state", sessionId: session.localId, vendor: session.vendor || sm.defaultVendor || "claude", mode: state.requestedPermissionMode, permissionRequestId: requestId || null, effort: session.effort || sm.currentEffort || "medium", betas: sm.currentBetas || [] }, state));
61
+ return state;
62
+ }
63
+ return { rename: rename, stop: stop, effort: effort, permission: permission };
64
+ }
65
+ module.exports = { attachSessionActions: attachSessionActions };
@@ -97,6 +97,13 @@ function attachSessionDelete(ctx) {
97
97
  sm.deleteSessionsBulk(plan.ids, ws);
98
98
  }
99
99
 
100
+ function executeOwnedDeletion(plan) {
101
+ if (!plan || !plan.ok || !plan.ids.length) throw new Error("No exact deletion plan.");
102
+ releaseRuntime(plan.ids);
103
+ plan.ids.forEach(function (id) { sm.deleteSessionQuiet(id); });
104
+ sm.broadcastSessionList();
105
+ }
106
+
100
107
  function bulkDeleteSessions(ws, msg) {
101
108
  if (!Array.isArray(msg.sessionIds) || msg.sessionIds.length === 0) return;
102
109
  if (!hasDeletePermission(ws)) return refuse(ws, "You do not have permission to delete sessions");
@@ -113,7 +120,7 @@ function attachSessionDelete(ctx) {
113
120
  executeDeletion(ws, scope);
114
121
  }
115
122
 
116
- return { deleteSession: deleteSession, bulkDeleteSessions: bulkDeleteSessions, planDeletion: planDeletion, executeDeletion: executeDeletion, hasDeletePermission: hasDeletePermission };
123
+ return { deleteSession: deleteSession, bulkDeleteSessions: bulkDeleteSessions, planDeletion: planDeletion, executeDeletion: executeDeletion, executeOwnedDeletion: executeOwnedDeletion, hasDeletePermission: hasDeletePermission };
117
124
  }
118
125
 
119
126
  module.exports = { attachSessionDelete: attachSessionDelete, resolveDeletionScope: resolveDeletionScope };