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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (608) hide show
  1. package/README.md +0 -4
  2. package/lib/account-auth-socket.js +1 -0
  3. package/lib/builtin-mates.js +19 -16
  4. package/lib/bundled-skills/clay-agent-browser/SKILL.md +6 -2
  5. package/lib/canonical-clay-record-authority.js +15 -0
  6. package/lib/canonical-clay-scheduling-authority.js +19 -0
  7. package/lib/claude-hook-installer.js +1 -239
  8. package/lib/claude-jsonl-watcher.js +1 -204
  9. package/lib/clay-control-presentation-binding.js +96 -0
  10. package/lib/clay-control-presentation.js +128 -0
  11. package/lib/clay-control-target-projection.js +26 -0
  12. package/lib/clay-mate-chat-receipts.js +26 -0
  13. package/lib/clay-mate-chat.js +88 -0
  14. package/lib/clay-mate-knowledge-input.js +26 -0
  15. package/lib/clay-mate-knowledge.js +95 -0
  16. package/lib/clay-mate-lifecycle.js +95 -0
  17. package/lib/clay-product-control-input.js +33 -0
  18. package/lib/clay-product-control-tools.js +52 -0
  19. package/lib/clay-product-control.js +250 -0
  20. package/lib/clay-project-lifecycle.js +154 -0
  21. package/lib/clay-project-record-input.js +44 -0
  22. package/lib/clay-project-records.js +84 -0
  23. package/lib/clay-scheduling-input.js +21 -0
  24. package/lib/clay-scheduling-receipts.js +26 -0
  25. package/lib/clay-scheduling.js +119 -0
  26. package/lib/clay-screen-controls.js +104 -0
  27. package/lib/clay-skill-install.js +1 -33
  28. package/lib/clay-vendor-usage.js +44 -0
  29. package/lib/clay-workspace-controls.js +84 -0
  30. package/lib/clay-workspace-input.js +17 -0
  31. package/lib/clay-workspace-receipts.js +26 -0
  32. package/lib/cli-sessions.js +1 -300
  33. package/lib/codex-defaults.js +1 -28
  34. package/lib/context-usage.js +3 -2
  35. package/lib/contextual-screen-snapshot.js +38 -0
  36. package/lib/daemon-project-access.js +11 -0
  37. package/lib/daemon-project-lifecycle-callbacks.js +15 -0
  38. package/lib/daemon-project-lifecycle.js +262 -0
  39. package/lib/daemon-projects.js +1 -1
  40. package/lib/daemon.js +78 -276
  41. package/lib/default-ai-runtime.js +4 -8
  42. package/lib/dm-digest-cursor.js +120 -0
  43. package/lib/email-mcp-server.js +1 -1
  44. package/lib/github-star-count.js +147 -0
  45. package/lib/issues-service.js +29 -15
  46. package/lib/kiro-defaults.js +1 -22
  47. package/lib/knowledge-db-import-validation.js +46 -0
  48. package/lib/knowledge-db-import.js +99 -0
  49. package/lib/knowledge-db-service.js +24 -33
  50. package/lib/knowledge-db-storage-nedb-maintenance.js +99 -0
  51. package/lib/knowledge-db-storage-nedb.js +66 -0
  52. package/lib/knowledge-db-storage.js +72 -0
  53. package/lib/knowledge-db-validation.js +0 -0
  54. package/lib/knowledge-document-index.js +2 -1
  55. package/lib/knowledge-file-store.js +7 -1
  56. package/lib/knowledge-product-operations.js +46 -0
  57. package/lib/mate-avatar-catalog.js +12 -0
  58. package/lib/mate-avatar-migration.js +41 -0
  59. package/lib/mate-context-service.js +138 -0
  60. package/lib/mate-context-tools.js +21 -0
  61. package/lib/mate-creation-mcp-server.js +2 -0
  62. package/lib/mate-knowledge-canonical-access.js +10 -0
  63. package/lib/mate-knowledge-mate-bound.js +53 -0
  64. package/lib/mate-knowledge-mcp-server.js +55 -8
  65. package/lib/mate-knowledge-service.js +16 -34
  66. package/lib/mate-knowledge-text-tools.js +106 -0
  67. package/lib/mate-lifecycle-service.js +94 -0
  68. package/lib/mate-message-delivery.js +43 -0
  69. package/lib/mate-ready-creation.js +9 -1
  70. package/lib/mate-schedule-input.js +29 -0
  71. package/lib/mate-schedule-lifecycle.js +151 -0
  72. package/lib/mate-scheduling.js +103 -0
  73. package/lib/mates.js +18 -6
  74. package/lib/mcp-agent-tools.js +117 -0
  75. package/lib/mcp-connection-store.js +119 -15
  76. package/lib/mcp-import-credentials.js +31 -0
  77. package/lib/mcp-local-transport.js +13 -0
  78. package/lib/mcp-oauth.js +8 -6
  79. package/lib/mcp-proxy.js +2 -32
  80. package/lib/mcp-query-bridge.js +30 -0
  81. package/lib/mcp-remote-connections.js +74 -20
  82. package/lib/mcp-source-adapters.js +1 -0
  83. package/lib/mcp-source-context.js +1 -0
  84. package/lib/mcp-source-discovery.js +1 -0
  85. package/lib/mcp-source-plugins.js +1 -0
  86. package/lib/mcp-source-restrictions.js +1 -0
  87. package/lib/mcp-tool-policy.js +9 -0
  88. package/lib/notes-checklist.js +92 -0
  89. package/lib/notes.js +51 -4
  90. package/lib/os-user-diagnostics.js +2 -4
  91. package/lib/os-users.js +24 -70
  92. package/lib/pane-pending-interactions.js +20 -0
  93. package/lib/pane-session-activation.js +114 -0
  94. package/lib/pane-session-transport.js +26 -0
  95. package/lib/project-admin-overview.js +51 -0
  96. package/lib/project-ask-user.js +8 -4
  97. package/lib/project-connection.js +14 -10
  98. package/lib/project-control-git-view.js +12 -0
  99. package/lib/project-debate.js +1 -0
  100. package/lib/project-delegated-follow-up.js +2 -1
  101. package/lib/project-directory-claim.js +65 -0
  102. package/lib/project-file-operations.js +61 -0
  103. package/lib/project-filesystem.js +15 -85
  104. package/lib/project-full-access.js +23 -2
  105. package/lib/project-http.js +7 -4
  106. package/lib/project-knowledge.js +32 -18
  107. package/lib/project-lifecycle-operations.js +98 -0
  108. package/lib/project-lifecycle-process-witness.js +32 -0
  109. package/lib/project-lifecycle-runtime.js +50 -0
  110. package/lib/project-linux-access.js +22 -0
  111. package/lib/project-logs-canonical-clay.js +27 -0
  112. package/lib/project-logs-clay-query.js +16 -0
  113. package/lib/project-logs-schema.js +4 -2
  114. package/lib/project-logs-service.js +8 -7
  115. package/lib/project-logs.js +1 -0
  116. package/lib/project-loop.js +1 -0
  117. package/lib/project-mate-chat-control.js +55 -0
  118. package/lib/project-mate-creation-proposal.js +18 -3
  119. package/lib/project-mate-interaction.js +40 -62
  120. package/lib/project-mcp.js +54 -16
  121. package/lib/project-models.js +14 -31
  122. package/lib/project-notifications.js +76 -17
  123. package/lib/project-ownership.js +77 -0
  124. package/lib/project-pair-result-delivery.js +14 -3
  125. package/lib/project-pair-usage.js +12 -13
  126. package/lib/project-pending-message-queue.js +4 -1
  127. package/lib/project-product-control.js +89 -0
  128. package/lib/project-product-session-queue.js +46 -0
  129. package/lib/project-push-access.js +28 -0
  130. package/lib/project-scheduled-message-queue.js +30 -0
  131. package/lib/project-scheduled-messages.js +67 -68
  132. package/lib/project-scheduled-task-control.js +83 -0
  133. package/lib/project-scheduled-tasks.js +13 -2
  134. package/lib/project-scheduling-access.js +10 -0
  135. package/lib/project-session-actions.js +65 -0
  136. package/lib/project-session-delete.js +8 -1
  137. package/lib/project-session-document.js +27 -7
  138. package/lib/project-session-github.js +63 -19
  139. package/lib/project-session-history-actions.js +167 -0
  140. package/lib/project-session-linear.js +14 -6
  141. package/lib/project-session-notes.js +40 -11
  142. package/lib/project-session-pair.js +1 -1
  143. package/lib/project-session-runtime-actions.js +64 -0
  144. package/lib/project-session-spawn.js +2 -3
  145. package/lib/project-session-vendor.js +55 -0
  146. package/lib/project-sessions.js +160 -290
  147. package/lib/project-shared-browser.js +78 -17
  148. package/lib/project-start-protocol.js +29 -0
  149. package/lib/project-studio-presentation.js +58 -0
  150. package/lib/project-user-message.js +67 -1
  151. package/lib/project-vendor-login.js +8 -36
  152. package/lib/project-workspace-operations.js +126 -0
  153. package/lib/project-workspace-query.js +19 -2
  154. package/lib/project.js +181 -45
  155. package/lib/public/app.js +71 -17
  156. package/lib/public/appearance-bootstrap.js +16 -0
  157. package/lib/public/css/clay-tool-activity.css +51 -0
  158. package/lib/public/css/clay-workspace.css +29 -0
  159. package/lib/public/css/command-palette.css +12 -33
  160. package/lib/public/css/contextual-clay.css +240 -0
  161. package/lib/public/css/filebrowser.css +1 -1
  162. package/lib/public/css/home-debate-planning.css +2 -0
  163. package/lib/public/css/home-mate-creation.css +5 -0
  164. package/lib/public/css/input.css +6 -0
  165. package/lib/public/css/mate-avatar-gallery.css +12 -0
  166. package/lib/public/css/mate-conversation.css +10 -5
  167. package/lib/public/css/mate-loading-scene.css +21 -0
  168. package/lib/public/css/messages.css +6 -2
  169. package/lib/public/css/overlays.css +68 -258
  170. package/lib/public/css/project-admin-overview.css +13 -0
  171. package/lib/public/css/project-mate-creation.css +5 -6
  172. package/lib/public/css/project-start.css +108 -0
  173. package/lib/public/css/projects-hub.css +53 -14
  174. package/lib/public/css/session-folders.css +11 -0
  175. package/lib/public/css/session-github.css +46 -1
  176. package/lib/public/css/settings-shell.css +103 -0
  177. package/lib/public/css/shared-browser.css +35 -1
  178. package/lib/public/css/sidebar.css +7 -0
  179. package/lib/public/css/sticky-notes.css +87 -1
  180. package/lib/public/css/title-bar.css +79 -0
  181. package/lib/public/index.html +61 -68
  182. package/lib/public/mate-avatars/B01.png +0 -0
  183. package/lib/public/mate-avatars/B02.png +0 -0
  184. package/lib/public/mate-avatars/B03.png +0 -0
  185. package/lib/public/mate-avatars/B04.png +0 -0
  186. package/lib/public/mate-avatars/B05.png +0 -0
  187. package/lib/public/mate-avatars/B06.png +0 -0
  188. package/lib/public/mate-avatars/B07.png +0 -0
  189. package/lib/public/mate-avatars/B08.png +0 -0
  190. package/lib/public/mate-avatars/B09.png +0 -0
  191. package/lib/public/mate-avatars/B10.png +0 -0
  192. package/lib/public/mate-avatars/B11.png +0 -0
  193. package/lib/public/mate-avatars/B12.png +0 -0
  194. package/lib/public/mate-avatars/B13.png +0 -0
  195. package/lib/public/mate-avatars/B14.png +0 -0
  196. package/lib/public/mate-avatars/B15.png +0 -0
  197. package/lib/public/mate-avatars/B16.png +0 -0
  198. package/lib/public/mate-avatars/B17.png +0 -0
  199. package/lib/public/mate-avatars/B18.png +0 -0
  200. package/lib/public/mate-avatars/B19.png +0 -0
  201. package/lib/public/mate-avatars/B20.png +0 -0
  202. package/lib/public/mate-avatars/B21.png +0 -0
  203. package/lib/public/mate-avatars/B22.png +0 -0
  204. package/lib/public/mate-avatars/B23.png +0 -0
  205. package/lib/public/mate-avatars/B24.png +0 -0
  206. package/lib/public/mate-avatars/B25.png +0 -0
  207. package/lib/public/mate-avatars/B26.png +0 -0
  208. package/lib/public/mate-avatars/B27.png +0 -0
  209. package/lib/public/mate-avatars/B28.png +0 -0
  210. package/lib/public/mate-avatars/B29.png +0 -0
  211. package/lib/public/mate-avatars/B30.png +0 -0
  212. package/lib/public/mate-avatars/B31.png +0 -0
  213. package/lib/public/mate-avatars/B32.png +0 -0
  214. package/lib/public/mate-avatars/B33.png +0 -0
  215. package/lib/public/mate-avatars/B34.png +0 -0
  216. package/lib/public/mate-avatars/B35.png +0 -0
  217. package/lib/public/mate-avatars/B36.png +0 -0
  218. package/lib/public/mate-avatars/B37.png +0 -0
  219. package/lib/public/mate-avatars/B38.png +0 -0
  220. package/lib/public/mate-avatars/B39.png +0 -0
  221. package/lib/public/mate-avatars/B40.png +0 -0
  222. package/lib/public/mate-avatars/B41.png +0 -0
  223. package/lib/public/mate-avatars/B42.png +0 -0
  224. package/lib/public/mate-avatars/B43.png +0 -0
  225. package/lib/public/mate-avatars/B44.png +0 -0
  226. package/lib/public/mate-avatars/B45.png +0 -0
  227. package/lib/public/mate-avatars/B46.png +0 -0
  228. package/lib/public/mate-avatars/B47.png +0 -0
  229. package/lib/public/mate-avatars/B48.png +0 -0
  230. package/lib/public/mate-avatars/C01.png +0 -0
  231. package/lib/public/mate-avatars/C02.png +0 -0
  232. package/lib/public/mate-avatars/C03.png +0 -0
  233. package/lib/public/mate-avatars/C04.png +0 -0
  234. package/lib/public/mate-avatars/C05.png +0 -0
  235. package/lib/public/mate-avatars/C06.png +0 -0
  236. package/lib/public/mate-avatars/C07.png +0 -0
  237. package/lib/public/mate-avatars/C08.png +0 -0
  238. package/lib/public/mate-avatars/C09.png +0 -0
  239. package/lib/public/mate-avatars/C10.png +0 -0
  240. package/lib/public/mate-avatars/C11.png +0 -0
  241. package/lib/public/mate-avatars/C12.png +0 -0
  242. package/lib/public/mate-avatars/C13.png +0 -0
  243. package/lib/public/mate-avatars/C14.png +0 -0
  244. package/lib/public/mate-avatars/C15.png +0 -0
  245. package/lib/public/mate-avatars/C16.png +0 -0
  246. package/lib/public/mate-avatars/C17.png +0 -0
  247. package/lib/public/mate-avatars/C18.png +0 -0
  248. package/lib/public/mate-avatars/C19.png +0 -0
  249. package/lib/public/mate-avatars/C20.png +0 -0
  250. package/lib/public/mate-avatars/C21.png +0 -0
  251. package/lib/public/mate-avatars/C22.png +0 -0
  252. package/lib/public/mate-avatars/C23.png +0 -0
  253. package/lib/public/mate-avatars/C24.png +0 -0
  254. package/lib/public/mate-avatars/C25.png +0 -0
  255. package/lib/public/mate-avatars/C26.png +0 -0
  256. package/lib/public/mate-avatars/C27.png +0 -0
  257. package/lib/public/mate-avatars/C28.png +0 -0
  258. package/lib/public/mate-avatars/C29.png +0 -0
  259. package/lib/public/mate-avatars/C30.png +0 -0
  260. package/lib/public/mate-avatars/C31.png +0 -0
  261. package/lib/public/mate-avatars/C32.png +0 -0
  262. package/lib/public/mate-avatars/C33.png +0 -0
  263. package/lib/public/mate-avatars/C34.png +0 -0
  264. package/lib/public/mate-avatars/C35.png +0 -0
  265. package/lib/public/mate-avatars/C36.png +0 -0
  266. package/lib/public/mate-avatars/C37.png +0 -0
  267. package/lib/public/mate-avatars/C38.png +0 -0
  268. package/lib/public/mate-avatars/C39.png +0 -0
  269. package/lib/public/mate-avatars/C40.png +0 -0
  270. package/lib/public/mate-avatars/C41.png +0 -0
  271. package/lib/public/mate-avatars/C42.png +0 -0
  272. package/lib/public/mate-avatars/C43.png +0 -0
  273. package/lib/public/mate-avatars/C44.png +0 -0
  274. package/lib/public/mate-avatars/C45.png +0 -0
  275. package/lib/public/mate-avatars/C46.png +0 -0
  276. package/lib/public/mate-avatars/C47.png +0 -0
  277. package/lib/public/mate-avatars/C48.png +0 -0
  278. package/lib/public/mate-avatars/catalog.json +482 -0
  279. package/lib/public/mate-avatars/lead-clay.png +0 -0
  280. package/lib/public/modules/admin-settings-invitations.js +2 -2
  281. package/lib/public/modules/admin-settings-projects.js +8 -4
  282. package/lib/public/modules/admin-settings-ui.js +20 -4
  283. package/lib/public/modules/admin-settings-users.js +4 -4
  284. package/lib/public/modules/app-connection.js +11 -1
  285. package/lib/public/modules/app-favicon.js +18 -9
  286. package/lib/public/modules/app-header.js +7 -4
  287. package/lib/public/modules/app-home-hub.js +2 -1
  288. package/lib/public/modules/app-loop-ui.js +2 -0
  289. package/lib/public/modules/app-message-router.js +22 -1
  290. package/lib/public/modules/app-messages.js +125 -19
  291. package/lib/public/modules/app-misc.js +3 -1
  292. package/lib/public/modules/app-notifications.js +11 -5
  293. package/lib/public/modules/app-panels.js +61 -123
  294. package/lib/public/modules/app-projects.js +14 -407
  295. package/lib/public/modules/app-rate-limit.js +19 -28
  296. package/lib/public/modules/app-rendering.js +4 -3
  297. package/lib/public/modules/avatar.js +15 -41
  298. package/lib/public/modules/chat-render-runtime.js +20 -0
  299. package/lib/public/modules/clay-browser-links.js +47 -0
  300. package/lib/public/modules/clay-control-activity.js +214 -0
  301. package/lib/public/modules/clay-control-copy.js +36 -0
  302. package/lib/public/modules/clay-control-detail-targets.js +44 -0
  303. package/lib/public/modules/clay-control-object-targets.js +52 -0
  304. package/lib/public/modules/clay-control-target-visibility.js +12 -0
  305. package/lib/public/modules/clay-control-targets.js +44 -0
  306. package/lib/public/modules/clay-log-links.js +23 -0
  307. package/lib/public/modules/clay-navigation-render.js +52 -0
  308. package/lib/public/modules/clay-owner-navigation.js +33 -0
  309. package/lib/public/modules/clay-session-links.js +31 -0
  310. package/lib/public/modules/clay-studio-bridge.js +20 -0
  311. package/lib/public/modules/clay-studio-document.js +67 -0
  312. package/lib/public/modules/clay-studio-render.js +146 -0
  313. package/lib/public/modules/clay-tool-activity.js +140 -0
  314. package/lib/public/modules/clay-tool-presentation.js +343 -0
  315. package/lib/public/modules/command-palette.js +162 -40
  316. package/lib/public/modules/contextual-ask-session.js +26 -0
  317. package/lib/public/modules/contextual-clay-geometry.js +155 -0
  318. package/lib/public/modules/contextual-clay-session.js +130 -0
  319. package/lib/public/modules/contextual-clay-workspace.js +169 -0
  320. package/lib/public/modules/contextual-clay.js +252 -0
  321. package/lib/public/modules/contextual-composer.js +91 -0
  322. package/lib/public/modules/contextual-mate-context.js +117 -0
  323. package/lib/public/modules/contextual-mate-hint.js +40 -0
  324. package/lib/public/modules/contextual-mate-identity.js +23 -0
  325. package/lib/public/modules/contextual-mate-sessions.js +134 -0
  326. package/lib/public/modules/contextual-search.js +137 -0
  327. package/lib/public/modules/contextual-session-citations.js +58 -0
  328. package/lib/public/modules/debate.js +1 -0
  329. package/lib/public/modules/default-ai.js +11 -3
  330. package/lib/public/modules/elicitation-form.js +5 -0
  331. package/lib/public/modules/filebrowser.js +20 -1
  332. package/lib/public/modules/generation-stop.js +8 -5
  333. package/lib/public/modules/git-panel.js +3 -1
  334. package/lib/public/modules/github-star.js +66 -0
  335. package/lib/public/modules/history-replay-batch.js +13 -1
  336. package/lib/public/modules/home-debate-live.js +2 -0
  337. package/lib/public/modules/home-debate-planning.js +7 -7
  338. package/lib/public/modules/home-mate-avatar-editor.js +127 -208
  339. package/lib/public/modules/home-mate-chat.js +8 -6
  340. package/lib/public/modules/home-mate-creation.js +73 -1
  341. package/lib/public/modules/home-mate-settings.js +19 -12
  342. package/lib/public/modules/icon-strip-tooltip.js +2 -1
  343. package/lib/public/modules/input.js +88 -10
  344. package/lib/public/modules/issues-render.js +3 -2
  345. package/lib/public/modules/knowledge-db-workbench.js +4 -4
  346. package/lib/public/modules/markdown.js +6 -34
  347. package/lib/public/modules/mate-avatar-catalog.js +97 -0
  348. package/lib/public/modules/mate-knowledge-workbench.js +1 -1
  349. package/lib/public/modules/mate-loading-scene.js +17 -0
  350. package/lib/public/modules/mate-management.js +40 -7
  351. package/lib/public/modules/mcp-connection-view.js +31 -13
  352. package/lib/public/modules/mcp-discovery-view.js +31 -0
  353. package/lib/public/modules/mcp-ui.js +23 -4
  354. package/lib/public/modules/mention.js +3 -0
  355. package/lib/public/modules/message-delivery.js +20 -2
  356. package/lib/public/modules/model-picker.js +2 -0
  357. package/lib/public/modules/pane-activation.js +214 -0
  358. package/lib/public/modules/pane-binding.js +82 -0
  359. package/lib/public/modules/pane-bridge.js +7 -4
  360. package/lib/public/modules/pane-browser-bridge.js +22 -0
  361. package/lib/public/modules/pane-file-bridge.js +4 -0
  362. package/lib/public/modules/pane-issue-bridge.js +4 -1
  363. package/lib/public/modules/pending-message-queue.js +1 -0
  364. package/lib/public/modules/permission-control.js +5 -4
  365. package/lib/public/modules/personal-settings-dialog.js +7 -1
  366. package/lib/public/modules/product-review.js +26 -0
  367. package/lib/public/modules/profile.js +12 -241
  368. package/lib/public/modules/project-access-recovery.js +17 -0
  369. package/lib/public/modules/project-admin-overview.js +21 -0
  370. package/lib/public/modules/project-chat-identity.js +13 -4
  371. package/lib/public/modules/project-logs-render.js +3 -0
  372. package/lib/public/modules/project-mate-creation-workspace.js +13 -4
  373. package/lib/public/modules/project-mate-navigation.js +144 -22
  374. package/lib/public/modules/project-session-visibility-settings.js +19 -16
  375. package/lib/public/modules/project-settings.js +119 -129
  376. package/lib/public/modules/project-start-dialog.js +130 -0
  377. package/lib/public/modules/project-start-folder-state.js +78 -0
  378. package/lib/public/modules/project-start-folder-view.js +190 -0
  379. package/lib/public/modules/project-start-forms.js +66 -0
  380. package/lib/public/modules/project-start-path.js +60 -0
  381. package/lib/public/modules/project-start-state.js +54 -0
  382. package/lib/public/modules/project-start-submit.js +67 -0
  383. package/lib/public/modules/projects-hub-view.js +33 -14
  384. package/lib/public/modules/projects-hub.js +10 -6
  385. package/lib/public/modules/rewind.js +5 -0
  386. package/lib/public/modules/scheduled-tasks.js +2 -0
  387. package/lib/public/modules/scheduler.js +2 -0
  388. package/lib/public/modules/search-clay-chat.js +5 -440
  389. package/lib/public/modules/server-settings.js +36 -91
  390. package/lib/public/modules/session-actions.js +5 -2
  391. package/lib/public/modules/session-context-menu.js +5 -0
  392. package/lib/public/modules/session-create-form.js +10 -10
  393. package/lib/public/modules/session-folder-layout.js +1 -1
  394. package/lib/public/modules/session-folder-view-menu.js +9 -0
  395. package/lib/public/modules/session-github.js +85 -14
  396. package/lib/public/modules/session-rich-drafts.js +21 -0
  397. package/lib/public/modules/session-switch-defer.js +67 -0
  398. package/lib/public/modules/session-work-primary.js +51 -0
  399. package/lib/public/modules/settings-defaults.js +27 -28
  400. package/lib/public/modules/settings-project-target.js +56 -0
  401. package/lib/public/modules/settings-select.js +1 -1
  402. package/lib/public/modules/settings-shell-registry.js +88 -0
  403. package/lib/public/modules/settings-shell-view.js +104 -0
  404. package/lib/public/modules/settings-shell.js +342 -0
  405. package/lib/public/modules/shared-browser-settings.js +112 -0
  406. package/lib/public/modules/shared-browser-tabs.js +13 -3
  407. package/lib/public/modules/shared-browser.js +29 -6
  408. package/lib/public/modules/sidebar-mobile.js +12 -33
  409. package/lib/public/modules/sidebar-projects.js +3 -1
  410. package/lib/public/modules/sidebar-session-folders-ui.js +1 -1
  411. package/lib/public/modules/sidebar-sessions.js +1 -0
  412. package/lib/public/modules/split-group-restore.js +68 -0
  413. package/lib/public/modules/split-pair-ui.js +1 -0
  414. package/lib/public/modules/split-pane-reconciler.js +15 -0
  415. package/lib/public/modules/split-pane-renderer.js +87 -6
  416. package/lib/public/modules/split-session-boundary.js +1 -1
  417. package/lib/public/modules/split-view.js +60 -68
  418. package/lib/public/modules/sticky-note-markdown.js +72 -6
  419. package/lib/public/modules/sticky-notes-actions.js +30 -0
  420. package/lib/public/modules/sticky-notes-browser.js +9 -2
  421. package/lib/public/modules/sticky-notes-card.js +23 -7
  422. package/lib/public/modules/sticky-notes-checklist.js +116 -0
  423. package/lib/public/modules/sticky-notes-editor.js +108 -44
  424. package/lib/public/modules/sticky-notes-shared.js +50 -2
  425. package/lib/public/modules/sticky-notes-state.js +66 -0
  426. package/lib/public/modules/sticky-notes.js +34 -51
  427. package/lib/public/modules/stt-controller.js +4 -1
  428. package/lib/public/modules/stt-recording.js +1 -1
  429. package/lib/public/modules/stt.js +7 -2
  430. package/lib/public/modules/terminal.js +9 -0
  431. package/lib/public/modules/theme.js +18 -3
  432. package/lib/public/modules/thinking-lifecycle.js +33 -3
  433. package/lib/public/modules/thinking-view.js +23 -1
  434. package/lib/public/modules/tools.js +60 -11
  435. package/lib/public/modules/tui-grab.js +1 -2
  436. package/lib/public/modules/user-settings-appearance.js +10 -3
  437. package/lib/public/modules/user-settings-editors.js +1 -1
  438. package/lib/public/modules/user-settings-layout.js +14 -30
  439. package/lib/public/modules/user-settings-preferences.js +6 -2
  440. package/lib/public/modules/user-settings-profile.js +13 -3
  441. package/lib/public/modules/user-settings.js +18 -84
  442. package/lib/public/modules/vendor-login-browser.js +5 -3
  443. package/lib/public/modules/vendor-login.js +2 -2
  444. package/lib/public/modules/vendor-priority.js +15 -1
  445. package/lib/public/modules/vendor-usage-format.js +93 -0
  446. package/lib/public/modules/vendor-usage-list.js +45 -0
  447. package/lib/public/modules/vendor-usage-model.js +215 -0
  448. package/lib/public/modules/vendor-usage-overview.js +312 -0
  449. package/lib/public/modules/wireframe-workbench.js +5 -2
  450. package/lib/public/muse-avatar.svg +4 -0
  451. package/lib/public/style.css +14 -6
  452. package/lib/public/sw.js +3 -1
  453. package/lib/public/welcome-art/conversation-desk.png +0 -0
  454. package/lib/public/welcome-art/mate-clay.png +0 -0
  455. package/lib/public/welcome-art/project-clay.png +0 -0
  456. package/lib/safe-bash-commands.js +3 -45
  457. package/lib/scheduled-task-records.js +3 -1
  458. package/lib/scheduler.js +2 -0
  459. package/lib/sdk-bridge.js +348 -402
  460. package/lib/sdk-foreground-admission.js +16 -0
  461. package/lib/sdk-mcp-descriptors.js +2 -37
  462. package/lib/sdk-message-processor.js +61 -18
  463. package/lib/sdk-quota-snapshot.js +21 -3
  464. package/lib/sdk-response-recovery.js +1 -0
  465. package/lib/sdk-worker.js +2 -677
  466. package/lib/server-admin.js +63 -16
  467. package/lib/server-appearance-settings.js +13 -1
  468. package/lib/server-contextual-clay-settings.js +40 -0
  469. package/lib/server-contextual-mate-sessions.js +70 -0
  470. package/lib/server-dm.js +2 -1
  471. package/lib/server-github-stars.js +39 -0
  472. package/lib/server-global-ws.js +26 -32
  473. package/lib/server-home-chat-events.js +18 -4
  474. package/lib/server-home-chat.js +22 -20
  475. package/lib/server-home-clay-entry.js +23 -4
  476. package/lib/server-home-clay-session-links.js +29 -9
  477. package/lib/server-home-mate-creation.js +1 -0
  478. package/lib/server-home-mcp-consent.js +14 -0
  479. package/lib/server-mates.js +25 -62
  480. package/lib/server-owner-ui.js +118 -0
  481. package/lib/server-path-access.js +38 -0
  482. package/lib/server-project-removal.js +22 -0
  483. package/lib/server-settings.js +6 -1
  484. package/lib/server.js +167 -43
  485. package/lib/session-config-transition.js +45 -0
  486. package/lib/session-folders.js +7 -2
  487. package/lib/session-fork-history.js +21 -0
  488. package/lib/session-github.js +9 -2
  489. package/lib/session-hygiene.js +3 -35
  490. package/lib/session-notes-mcp-server.js +26 -4
  491. package/lib/session-notes-writes.js +88 -0
  492. package/lib/session-permission-mode.js +4 -3
  493. package/lib/session-skill-scope.js +11 -0
  494. package/lib/session-visibility.js +25 -10
  495. package/lib/session-work-primary.js +50 -0
  496. package/lib/sessions.js +66 -99
  497. package/lib/shared-browser-cookie-sync.js +32 -0
  498. package/lib/shared-browser-cookies.js +79 -0
  499. package/lib/shared-browser-runtime.js +25 -9
  500. package/lib/shared-browser-storage-sync.js +43 -0
  501. package/lib/shared-browser-storage.js +101 -0
  502. package/lib/shared-browser-tools.js +2 -1
  503. package/lib/shared-browser-worker.js +46 -10
  504. package/lib/terminal-manager.js +65 -6
  505. package/lib/tool-llm.js +1 -1
  506. package/lib/tui-transcript-index.js +1 -132
  507. package/lib/users-contextual-clay-preferences.js +31 -0
  508. package/lib/users-permissions.js +2 -8
  509. package/lib/users.js +7 -0
  510. package/lib/vendor-login-browser.js +1 -11
  511. package/lib/vendor-usage-acp-readers.js +97 -0
  512. package/lib/vendor-usage-capabilities.js +88 -0
  513. package/lib/vendor-usage-http-readers.js +214 -0
  514. package/lib/vendor-usage-metrics.js +47 -0
  515. package/lib/vendor-usage-native-readers.js +106 -0
  516. package/lib/vendor-usage-overview.js +406 -0
  517. package/lib/vendor-usage-service.js +281 -0
  518. package/lib/workspace-assignment-service.js +25 -0
  519. package/lib/workspace-query-access.js +4 -1
  520. package/lib/workspace-query-mcp-server.js +1 -1
  521. package/lib/workspace-query-service.js +13 -2
  522. package/lib/ws-request.js +1 -0
  523. package/lib/ws-schema.js +22 -4
  524. package/lib/yoke/acp-agent-profiles.js +7 -5
  525. package/lib/yoke/adapters/antigravity.js +3 -14
  526. package/lib/yoke/adapters/claude-query-contract.js +9 -0
  527. package/lib/yoke/adapters/claude.js +66 -50
  528. package/lib/yoke/adapters/codex-query-contract.js +25 -0
  529. package/lib/yoke/adapters/codex.js +98 -123
  530. package/lib/yoke/adapters/kiro.js +3 -1
  531. package/lib/yoke/adapters/muse-query-contract.js +7 -0
  532. package/lib/yoke/adapters/muse.js +122 -0
  533. package/lib/yoke/auth-events.js +17 -0
  534. package/lib/yoke/claude-hook-installer.js +272 -0
  535. package/lib/yoke/claude-jsonl-watcher.js +204 -0
  536. package/lib/yoke/claude-maintenance.js +55 -0
  537. package/lib/yoke/claude-permission-patterns.js +53 -0
  538. package/lib/yoke/claude-response-recovery.js +155 -0
  539. package/lib/yoke/claude-transcript-hygiene.js +34 -0
  540. package/lib/yoke/claude-worker-startup.js +28 -0
  541. package/lib/yoke/clay-skill-install.js +33 -0
  542. package/lib/yoke/cli-sessions.js +300 -0
  543. package/lib/yoke/codex-app-server.js +7 -12
  544. package/lib/yoke/codex-dynamic-tool-names.js +80 -0
  545. package/lib/yoke/codex-idle-recovery.js +81 -1
  546. package/lib/yoke/codex-model-catalog.js +37 -3
  547. package/lib/yoke/codex-recovery-admission.js +164 -0
  548. package/lib/yoke/configuration.js +13 -0
  549. package/lib/yoke/discovery.js +70 -0
  550. package/lib/yoke/errors.js +8 -0
  551. package/lib/yoke/host-environment.js +7 -0
  552. package/lib/yoke/index.js +9 -51
  553. package/lib/yoke/interface.js +116 -0
  554. package/lib/yoke/kiro-acp-server.js +5 -5
  555. package/lib/yoke/legacy-sessions.js +89 -0
  556. package/lib/yoke/login-protocol.js +25 -0
  557. package/lib/yoke/maintenance.js +12 -0
  558. package/lib/yoke/mcp-proxy.js +32 -0
  559. package/lib/yoke/mcp-source-adapters.js +91 -0
  560. package/lib/yoke/mcp-source-context.js +42 -0
  561. package/lib/yoke/mcp-source-discovery.js +169 -0
  562. package/lib/yoke/mcp-source-plugins.js +68 -0
  563. package/lib/yoke/mcp-source-restrictions.js +47 -0
  564. package/lib/yoke/mcp-tool-policy-normalize.js +28 -0
  565. package/lib/yoke/model-preferences.js +6 -0
  566. package/lib/yoke/muse-artifacts.js +36 -0
  567. package/lib/yoke/muse-controls.js +50 -0
  568. package/lib/yoke/muse-input.js +64 -0
  569. package/lib/yoke/muse-items.js +157 -0
  570. package/lib/yoke/muse-policy.js +52 -0
  571. package/lib/yoke/muse-query.js +428 -0
  572. package/lib/yoke/muse-runtime.js +211 -0
  573. package/lib/yoke/muse-services.js +92 -0
  574. package/lib/yoke/muse-skills.js +79 -0
  575. package/lib/yoke/muse-turns.js +71 -0
  576. package/lib/yoke/options/acp.js +2 -0
  577. package/lib/yoke/options/antigravity.js +2 -0
  578. package/lib/yoke/options/claude.js +21 -0
  579. package/lib/yoke/options/codex-defaults.js +29 -0
  580. package/lib/yoke/options/codex-settings.js +21 -0
  581. package/lib/yoke/options/codex.js +6 -0
  582. package/lib/yoke/options/kiro-defaults.js +22 -0
  583. package/lib/yoke/options/kiro.js +5 -0
  584. package/lib/yoke/options/muse.js +5 -0
  585. package/lib/yoke/provider-contract.js +5 -0
  586. package/lib/yoke/providers/antigravity-executable.js +8 -0
  587. package/lib/yoke/providers/claude-executable.js +40 -0
  588. package/lib/yoke/providers/claude-model-descriptions.js +34 -0
  589. package/lib/yoke/providers/claude-process.js +97 -0
  590. package/lib/yoke/providers/claude-provision.js +75 -0
  591. package/lib/yoke/providers/codex-errors.js +8 -0
  592. package/lib/yoke/providers/muse-executable.js +17 -0
  593. package/lib/yoke/provisioning.js +6 -0
  594. package/lib/yoke/query-options.js +10 -0
  595. package/lib/yoke/response-recovery.js +41 -0
  596. package/lib/yoke/sdk-mcp-descriptors.js +37 -0
  597. package/lib/yoke/sdk-server-factory.js +7 -0
  598. package/lib/yoke/session-history.js +8 -0
  599. package/lib/yoke/session-tool-transport.js +34 -13
  600. package/lib/yoke/settings.js +23 -0
  601. package/lib/yoke/source-locations.js +4 -0
  602. package/lib/yoke/title-query.js +18 -7
  603. package/lib/yoke/tui-transcript-index.js +132 -0
  604. package/lib/yoke/usage.js +48 -0
  605. package/lib/yoke/user-input.js +13 -0
  606. package/lib/yoke/vendor-registry.js +87 -3
  607. package/package.json +11 -4
  608. package/lib/public/modules/server-settings-navigation.js +0 -39
@@ -0,0 +1,120 @@
1
+ var CONVERSATION_CAP = 6000;
2
+
3
+ // SDK text is persisted as delta before onTurnDone; the response preview
4
+ // is only a notification excerpt. Historical complete text entries remain readable.
5
+ function isDigestEntry(entry) {
6
+ return entry && (entry.type === "user_message" || entry.type === "assistant_message" || entry.type === "delta" || entry.type === "text");
7
+ }
8
+
9
+ function copyCursor(cursor) {
10
+ return {
11
+ historyIndex: Math.max(0, cursor.historyIndex || 0),
12
+ textOffset: Math.max(0, cursor.textOffset || 0),
13
+ };
14
+ }
15
+
16
+ function readState(history) {
17
+ var state = { cursor: { historyIndex: 0, textOffset: 0 } };
18
+ for (var i = history.length - 1; i >= 0; i--) {
19
+ var entry = history[i];
20
+ if (!entry || entry.type !== "digest_checkpoint") continue;
21
+ if (entry.cursor && typeof entry.cursor.historyIndex === "number") {
22
+ state.cursor = copyCursor(entry.cursor);
23
+ } else if (typeof entry.digestedIndex === "number") {
24
+ // Legacy checkpoints pointed at the next history entry and had no
25
+ // within-entry progress. Treat them as fully consumed entries.
26
+ state.cursor = { historyIndex: Math.max(0, entry.digestedIndex), textOffset: 0 };
27
+ }
28
+ break;
29
+ }
30
+ return state;
31
+ }
32
+
33
+ function readCursor(history) {
34
+ return readState(history).cursor;
35
+ }
36
+
37
+ function sameCursor(left, right) {
38
+ return left.historyIndex === right.historyIndex && left.textOffset === right.textOffset;
39
+ }
40
+
41
+ function safeTextEnd(text, start, maximum) {
42
+ var end = Math.min(text.length, start + maximum);
43
+ if (end < text.length && end > start) {
44
+ var previous = text.charCodeAt(end - 1);
45
+ if (previous >= 0xD800 && previous <= 0xDBFF) end--;
46
+ }
47
+ // The normal cap leaves enough room for a code point. Keep this fallback
48
+ // defensive so a future smaller cap cannot make the cursor stall.
49
+ if (end === start && end < text.length) {
50
+ end = start + (text.charCodeAt(start) >= 0xD800 && text.charCodeAt(start) <= 0xDBFF ? 2 : 1);
51
+ }
52
+ return Math.min(end, text.length);
53
+ }
54
+
55
+ function collectChunk(history, startCursor) {
56
+ var cursor = copyCursor(startCursor);
57
+ var parts = [];
58
+ var totalLength = 0;
59
+ var hadHistoryProgress = false;
60
+ var partCount = 0;
61
+
62
+ function appendPart(value) {
63
+ var separatorLength = partCount > 0 ? 1 : 0;
64
+ if (totalLength + separatorLength + value.length > CONVERSATION_CAP) return false;
65
+ parts.push(value);
66
+ totalLength += separatorLength + value.length;
67
+ partCount++;
68
+ return true;
69
+ }
70
+
71
+ while (cursor.historyIndex < history.length) {
72
+ var entry = history[cursor.historyIndex];
73
+ if (!isDigestEntry(entry) || typeof entry.text !== "string" || !entry.text) {
74
+ cursor.historyIndex++;
75
+ cursor.textOffset = 0;
76
+ hadHistoryProgress = true;
77
+ continue;
78
+ }
79
+
80
+ var text = entry.text;
81
+ var offset = Math.min(cursor.textOffset, text.length);
82
+
83
+ var label = entry.type === "user_message" ? "User: " : "Mate: ";
84
+ var available = CONVERSATION_CAP - totalLength - (partCount > 0 ? 1 : 0) - label.length;
85
+ if (available <= 0 && partCount > 0) break;
86
+ if (available <= 0) available = CONVERSATION_CAP - label.length;
87
+
88
+ if (offset < text.length) {
89
+ var end = safeTextEnd(text, offset, available);
90
+ var value = label + text.substring(offset, end);
91
+ if (!appendPart(value)) break;
92
+ cursor.textOffset = end;
93
+ hadHistoryProgress = true;
94
+ if (end < text.length) break;
95
+ }
96
+
97
+ cursor.historyIndex++;
98
+ cursor.textOffset = 0;
99
+ }
100
+
101
+ return {
102
+ conversationContent: parts.join("\n"),
103
+ cursor: cursor,
104
+ hasHistoryProgress: hadHistoryProgress,
105
+ };
106
+ }
107
+
108
+ function hasPending(history, cursor) {
109
+ var probe = collectChunk(history, cursor, "");
110
+ return !!probe.conversationContent;
111
+ }
112
+
113
+ module.exports = {
114
+ CONVERSATION_CAP: CONVERSATION_CAP,
115
+ collectChunk: collectChunk,
116
+ hasPending: hasPending,
117
+ readCursor: readCursor,
118
+ readState: readState,
119
+ sameCursor: sameCursor,
120
+ };
@@ -37,7 +37,7 @@ function buildShape(props, required) {
37
37
  // appendAuditLog(entry) -> void
38
38
  function create(deps) {
39
39
  var sdk;
40
- try { sdk = require("@anthropic-ai/claude-agent-sdk"); } catch (e) {
40
+ try { sdk = require("./yoke/sdk-server-factory").load(); } catch (e) {
41
41
  console.error("[email-mcp] Failed to load SDK:", e.message);
42
42
  return null;
43
43
  }
@@ -0,0 +1,147 @@
1
+ // github-star-count.js - Cached public star count for the fixed Clay repository.
2
+ //
3
+ // Server-wide and unauthenticated toward GitHub: one fixed public metadata
4
+ // URL, no credentials, no redirects, no user data. A fresh value is reused for
5
+ // an hour, concurrent callers share one request, failures back off, and the
6
+ // last successful count survives a failed refresh. Unknown stays null; a count
7
+ // is never invented.
8
+
9
+ var https = require("https");
10
+
11
+ var REPO = "chadbyte/clay";
12
+ var HOST = "api.github.com";
13
+ var PATH = "/repos/" + REPO;
14
+ var TTL_MS = 60 * 60 * 1000;
15
+ var TIMEOUT_MS = 5000;
16
+ var BACKOFF_BASE_MS = 60 * 1000;
17
+ var MAX_BODY_BYTES = 256 * 1024;
18
+
19
+ // Resolves { status, body } or rejects. Never follows redirects. `timeoutMs`
20
+ // is a wall-clock deadline for the whole exchange (DNS, TLS, headers, body),
21
+ // not socket inactivity, so a slow trickle cannot pin the request. `get` is
22
+ // injectable for tests.
23
+ function fetchRepoMetadata(timeoutMs, get) {
24
+ get = get || https.get;
25
+ return new Promise(function (resolve, reject) {
26
+ var settled = false;
27
+ var req = null;
28
+ var deadline = null;
29
+ function finish(fn, value) {
30
+ if (settled) return;
31
+ settled = true;
32
+ clearTimeout(deadline);
33
+ fn(value);
34
+ }
35
+ function fail(err) {
36
+ finish(reject, err);
37
+ if (req) req.destroy();
38
+ }
39
+ deadline = setTimeout(function () { fail(new Error("timeout")); }, timeoutMs);
40
+ try {
41
+ req = get({
42
+ host: HOST,
43
+ path: PATH,
44
+ method: "GET",
45
+ headers: {
46
+ "User-Agent": "clay-server",
47
+ "Accept": "application/vnd.github+json",
48
+ "X-GitHub-Api-Version": "2022-11-28",
49
+ },
50
+ }, function (res) {
51
+ var chunks = [];
52
+ var size = 0;
53
+ res.on("data", function (chunk) {
54
+ size += chunk.length;
55
+ if (size > MAX_BODY_BYTES) {
56
+ fail(new Error("response too large"));
57
+ if (res.destroy) res.destroy();
58
+ return;
59
+ }
60
+ chunks.push(chunk);
61
+ });
62
+ res.on("end", function () {
63
+ finish(resolve, { status: res.statusCode, body: Buffer.concat(chunks).toString("utf8") });
64
+ });
65
+ res.on("error", fail);
66
+ res.on("aborted", function () { fail(new Error("aborted")); });
67
+ });
68
+ } catch (err) {
69
+ fail(err);
70
+ return;
71
+ }
72
+ req.on("error", fail);
73
+ if (settled) req.destroy();
74
+ });
75
+ }
76
+
77
+ function parseStars(response) {
78
+ if (!response || response.status !== 200) return null;
79
+ var data;
80
+ try { data = JSON.parse(response.body); } catch (e) { return null; }
81
+ var n = data && data.stargazers_count;
82
+ if (typeof n !== "number" || !isFinite(n) || n < 0 || Math.floor(n) !== n) return null;
83
+ return n;
84
+ }
85
+
86
+ // opts (all optional, for tests): fetch(timeoutMs) -> Promise<{status, body}>,
87
+ // now() -> ms, ttlMs, timeoutMs, backoffBaseMs.
88
+ function createGithubStarCount(opts) {
89
+ opts = opts || {};
90
+ var fetchFn = opts.fetch || fetchRepoMetadata;
91
+ var now = opts.now || Date.now;
92
+ var ttlMs = opts.ttlMs || TTL_MS;
93
+ var timeoutMs = opts.timeoutMs || TIMEOUT_MS;
94
+ var backoffBaseMs = opts.backoffBaseMs || BACKOFF_BASE_MS;
95
+
96
+ var stars = null;
97
+ var fetchedAt = null;
98
+ var failures = 0;
99
+ var retryAt = 0;
100
+ var inflight = null;
101
+
102
+ function snapshot() {
103
+ return { repo: REPO, stars: stars, fetchedAt: fetchedAt };
104
+ }
105
+
106
+ function refresh() {
107
+ var started;
108
+ try {
109
+ started = Promise.resolve(fetchFn(timeoutMs));
110
+ } catch (e) {
111
+ started = Promise.reject(e);
112
+ }
113
+ return started.then(function (response) {
114
+ var parsed = parseStars(response);
115
+ if (parsed === null) throw new Error("unusable response");
116
+ stars = parsed;
117
+ fetchedAt = now();
118
+ failures = 0;
119
+ retryAt = 0;
120
+ }).catch(function () {
121
+ failures++;
122
+ retryAt = now() + Math.min(backoffBaseMs * Math.pow(2, failures - 1), ttlMs);
123
+ }).then(function () {
124
+ inflight = null;
125
+ return snapshot();
126
+ });
127
+ }
128
+
129
+ function get() {
130
+ if (stars !== null && fetchedAt !== null && now() - fetchedAt < ttlMs) return Promise.resolve(snapshot());
131
+ if (inflight) return inflight;
132
+ if (now() < retryAt) return Promise.resolve(snapshot());
133
+ inflight = refresh();
134
+ return inflight;
135
+ }
136
+
137
+ return { get: get };
138
+ }
139
+
140
+ module.exports = {
141
+ createGithubStarCount: createGithubStarCount,
142
+ parseStars: parseStars,
143
+ fetchRepoMetadata: fetchRepoMetadata,
144
+ MAX_BODY_BYTES: MAX_BODY_BYTES,
145
+ REPO: REPO,
146
+ TTL_MS: TTL_MS,
147
+ };
@@ -129,25 +129,35 @@ function attachIssuesService(ctx) {
129
129
  principal: principal, worktreeOnly: authorization.worktreeOnly };
130
130
  }
131
131
 
132
- function bind(source, isSession) {
132
+ function bind(source, isSession, canonicalClay) {
133
133
  if (!source || typeof source.projectSlug !== "string") return null;
134
134
  var initialSlug = source.projectSlug;
135
135
  var initialProject = projectFor(initialSlug);
136
136
  var initialSession = isSession ? source.session : null;
137
+ var clayInitial;
138
+ if (canonicalClay) { try { clayInitial = require("./canonical-clay-record-authority").resolve(source.authority, initialSlug); } catch (error) { return null; } }
137
139
  if (!initialProject || (isSession && !initialSession)) return null;
138
140
  if (initialSession) provenance.ensureOrigin(initialSession);
139
- var initialUserId = initialSession ? initialSession.ownerId || null : source.userId || null;
141
+ var initialUserId = initialSession ? initialSession.ownerId || null : canonicalClay ? clayInitial.principal.userId || clayInitial.principal.singleUserOwnerId : source.userId || null;
140
142
  var initialOrigin = initialSession ? initialSession.sessionOriginId || null : null;
141
143
  var initial = bindingState(initialProject, initialSession, initialUserId, initialOrigin);
142
144
  if (!initial) return null;
143
145
 
144
146
  function current() {
145
147
  if (projectFor(initialSlug) !== initialProject) throw new Error("This Issues binding is no longer valid.");
148
+ if (canonicalClay) {
149
+ var clayLive = require("./canonical-clay-record-authority").resolve(source.authority, initialSlug);
150
+ if (clayLive.project !== initialProject || clayLive.status.path !== clayInitial.status.path || clayLive.status.projectKnowledgeId !== clayInitial.status.projectKnowledgeId || clayLive.status.changeSetId !== clayInitial.status.changeSetId) throw new Error("Selected Issues context changed.");
151
+ }
146
152
  var live = bindingState(initialProject, initialSession, initialUserId, initialOrigin);
147
153
  if (!live) throw new Error("This Issues binding is no longer valid.");
148
154
  return live;
149
155
  }
150
156
 
157
+ function expected(entry, args) { if (canonicalClay && (!Number.isInteger(args.expectedRevision) || entry.revision !== args.expectedRevision)) throw new Error("Issue revision conflict."); }
158
+
159
+ function actor(state) { return canonicalClay ? require("./canonical-clay-record-authority").resolve(source.authority, initialSlug).actor : author(state.user, state.session ? "session" : "user", state.session); }
160
+
151
161
  function visibleIssue(store, ref, state) {
152
162
  var result = store.read(ref);
153
163
  if (state.worktreeOnly && (!result.context || result.context.changeSetId !== state.status.changeSetId)) throw new Error("Issue not found.");
@@ -174,7 +184,7 @@ function attachIssuesService(ctx) {
174
184
  path: state.status.path, knowledgeId: governing.projectKnowledgeId,
175
185
  changeSetId: state.status.changeSetId || null, worktreeOnly: state.worktreeOnly,
176
186
  recordContext: clone(issueContext(state.status)),
177
- actor: clone(author(state.user, state.session ? "session" : "user", state.session)),
187
+ actor: clone(actor(state)),
178
188
  osIdentity: needsIdentity ? osIdentity(state) : null };
179
189
  }
180
190
 
@@ -184,7 +194,7 @@ function attachIssuesService(ctx) {
184
194
  var liveIdentity = needsIdentity ? osIdentity(fresh) : null;
185
195
  if (fresh.project !== before.project || fresh.session !== before.session || (fresh.user.id || null) !== before.userId ||
186
196
  fresh.status.path !== before.path || !governing || governing.projectKnowledgeId !== before.knowledgeId ||
187
- (fresh.status.changeSetId || null) !== before.changeSetId || fresh.worktreeOnly !== before.worktreeOnly ||
197
+ (fresh.status.changeSetId || null) !== before.changeSetId || fresh.worktreeOnly !== before.worktreeOnly || JSON.stringify(issueContext(fresh.status)) !== JSON.stringify(before.recordContext) ||
188
198
  JSON.stringify(liveIdentity) !== JSON.stringify(before.osIdentity)) throw new Error("Issue authorization changed during the operation.");
189
199
  return fresh;
190
200
  }
@@ -200,7 +210,7 @@ function attachIssuesService(ctx) {
200
210
  var github = require('./issues-github').attachIssueGithub({
201
211
  locks: githubLocks, assessments: githubAssessments, run: context.runGithub, analyze: source.analyzeGithub || context.analyzeGithub,
202
212
  begin: function () {
203
- if (isSession) throw new Error('GitHub filing requires an explicit action in the Issues panel.');
213
+ if (isSession || canonicalClay) throw new Error('GitHub filing requires an explicit action in the Issues panel.');
204
214
  return operation(current(), true);
205
215
  },
206
216
  read: function (before, ref) {
@@ -217,6 +227,7 @@ function attachIssuesService(ctx) {
217
227
  return {
218
228
  searchGithubIssue: github.search, linkGithubIssue: github.link, createGithubIssue: github.create,
219
229
  linkWorkSession: function (args, session) {
230
+ if (canonicalClay) throw new Error("Use reviewed project assignment or follow-up for Driver execution.");
220
231
  var state = current();
221
232
  var manager = state.project.getSessionManager();
222
233
  if (!args || !Number.isInteger(args.expectedRevision)) throw new Error("expectedRevision is required.");
@@ -232,9 +243,10 @@ function attachIssuesService(ctx) {
232
243
  if (links.some(function (link) { return link.sessionId === session.sessionOriginId; })) return entry;
233
244
  var link = { sessionId: session.sessionOriginId, role: "driver", issueRevision: args.expectedRevision };
234
245
  if (args.requestId !== undefined) link.requestId = schema.text(args.requestId, "work request id", 200, true);
235
- return target.update(args.ref, { linkedWorkSessions: links.concat([link]), status: "in_progress" }, args.expectedRevision, author(state.user, "user", null));
246
+ return target.update(args.ref, { linkedWorkSessions: links.concat([link]), status: "in_progress" }, args.expectedRevision, canonicalClay ? actor(state) : author(state.user, "user", null));
236
247
  },
237
248
  resolveWorkSession: function (args) {
249
+ if (canonicalClay) throw new Error("Work sessions require the existing project Driver workflow.");
238
250
  var state = current();
239
251
  var entry = visibleIssue(openStore(state.status), args.ref, state);
240
252
  if (!(entry.linkedWorkSessions || []).some(function (link) { return link.sessionId === args.sessionOriginId; })) throw new Error("Work session unavailable.");
@@ -255,9 +267,9 @@ function attachIssuesService(ctx) {
255
267
  readIssueTombstone: function (args) { var state = current(); return scopedIssue(openStore(state.status), args && args.ref, state); },
256
268
  issueHistory: function (args) { var state = current(); var store = openStore(state.status); var history = store.history(args && args.ref); if (state.worktreeOnly) { var historical = scopedIssue(store, args && args.ref, state); if (!historical.context || historical.context.changeSetId !== state.status.changeSetId) throw new Error("Issue not found."); } return history; },
257
269
  readIssueRevision: function (args) { var state = current(); var store = openStore(state.status); visibleIssue(store, args && args.ref, state); return store.readRevision(args.ref, args.revision); },
258
- commentIssue: function (args) { var state = current(); var target = openStore(state.status); visibleIssue(target, args && args.ref, state); return target.comment(args.ref, args.body, author(state.user, "user", null)); },
270
+ commentIssue: function (args) { var state = current(); var target = openStore(state.status); expected(visibleIssue(target, args && args.ref, state), args); return target.comment(args.ref, args.body, canonicalClay ? actor(state) : author(state.user, "user", null)); },
259
271
  listIssueFeedback: function (args) {
260
- if (!isSession) throw new Error("Only the Project Driver can review issue comments.");
272
+ if (!isSession && !canonicalClay) throw new Error("Only the Project Driver can review issue comments.");
261
273
  var state = current(); var target = openStore(state.status); var out = []; var feedbackLimit = args && args.limit === undefined ? 200 : Number(args.limit);
262
274
  if (!Number.isInteger(feedbackLimit) || feedbackLimit < 1 || feedbackLimit > 200) throw new Error("Feedback limit must be between 1 and 200.");
263
275
  var position = { issueCursor: null, issueIndex: 0, commentOffset: 0 };
@@ -297,31 +309,32 @@ function attachIssuesService(ctx) {
297
309
  return { feedback: out, total: out.length, nextCursor: nextCursor, truncated: !!nextCursor };
298
310
  },
299
311
  reviewIssueComment: function (args) {
300
- if (!isSession) throw new Error("Only the Project Driver can review issue comments.");
312
+ if (!isSession && !canonicalClay) throw new Error("Only the Project Driver can review issue comments.");
301
313
  var state = current(); var target = openStore(state.status); var entry = visibleIssue(target, args && args.ref, state);
314
+ expected(entry, args);
302
315
  if (args.action === "incorporate") {
303
316
  if (!Number.isInteger(args.expectedRevision)) throw new Error("expectedRevision is required to incorporate a comment.");
304
317
  var data = cleanPublic(args, { ref: true, expectedRevision: true, commentId: true, action: true, response: true, commitSha: true }, true);
305
318
  if (data.status === "resolved") throw new Error("Use update_issue with verified commit evidence before resolving this Issue.");
306
- return target.incorporate(entry.ref, args.commentId, data, args.expectedRevision, args.response, author(state.user, "session", state.session));
319
+ return target.incorporate(entry.ref, args.commentId, data, args.expectedRevision, args.response, actor(state));
307
320
  }
308
- return target.review(entry.ref, args.commentId, args.action, args.response, author(state.user, "session", state.session));
321
+ return target.review(entry.ref, args.commentId, args.action, args.response, actor(state));
309
322
  },
310
323
  removeIssue: function (args) {
311
324
  var state = current();
312
325
  if (!state.principal.isProjectOwner) throw new Error("Only the project owner can delete Issues.");
313
326
  var target = openStore(state.status); var entry = visibleIssue(target, args && args.ref, state);
314
327
  if (!Number.isInteger(args && args.expectedRevision) || entry.revision !== args.expectedRevision) throw new Error("Issue revision conflict.");
315
- return target.remove(entry.ref, author(state.user, "user", null), args.expectedRevision);
328
+ return target.remove(entry.ref, canonicalClay ? actor(state) : author(state.user, "user", null), args.expectedRevision);
316
329
  },
317
330
  createIssue: function (args) {
318
- if (!isSession) throw new Error("People cannot create issues directly. Ask the Project Driver to create one.");
331
+ if (!isSession && !canonicalClay) throw new Error("People cannot create issues directly. Ask the Project Driver to create one.");
319
332
  var data = cleanPublic(args, { commitSha: true }, true);
320
333
  var status = data.status === undefined ? "open" : data.status;
321
334
  if (schema.STATUSES.indexOf(status) === -1) throw new Error("Invalid status.");
322
335
  var state = current();
323
336
  if (status !== "resolved") return Promise.resolve(openStore(state.status).create(data,
324
- author(state.user, state.session ? "session" : "user", state.session), issueContext(state.status)));
337
+ actor(state), issueContext(state.status)));
325
338
  if (typeof data.resolutionSummary !== "string" || !data.resolutionSummary.trim()) throw new Error("resolutionSummary is required when resolving an issue.");
326
339
  var before = operation(state, true);
327
340
  return evidence(before, args.commitSha).then(function (proof) {
@@ -340,7 +353,7 @@ function attachIssuesService(ctx) {
340
353
  var existing = visibleIssue(target, ref, state);
341
354
  if (existing.revision !== expectedRevision) throw new Error("Issue revision conflict.");
342
355
  if (data.status !== "resolved") return Promise.resolve(target.update(ref, data, expectedRevision,
343
- author(state.user, state.session ? "session" : "user", state.session)));
356
+ actor(state)));
344
357
  if (typeof data.resolutionSummary !== "string" || !data.resolutionSummary.trim()) throw new Error("resolutionSummary is required when resolving an issue.");
345
358
  var before = operation(state, true);
346
359
  return evidence(before, args.commitSha).then(function (proof) {
@@ -354,6 +367,7 @@ function attachIssuesService(ctx) {
354
367
  }
355
368
 
356
369
  return { bindUser: function (source) { return bind(source, false); },
370
+ bindCanonicalClay: function (source) { return bind(source, false, true); },
357
371
  bindProjectSession: function (source) { return bind(source, true); },
358
372
  issueScopeIdForKnowledgeId: issuesStore.issueScopeIdForKnowledgeId };
359
373
  }
@@ -1,22 +1 @@
1
- // Kiro-specific default values. Single source of truth — do not duplicate
2
- // elsewhere. Consumed by the server-side vendor plumbing and sent to clients
3
- // via the config state so the UI renders the right controls.
4
-
5
- var KIRO_DEFAULTS = {
6
- // Kiro CLI 2.18.1 exposes the next-generation agent as the v3 engine. Its
7
- // general-purpose mode id is "vibe" (displayed as "Default").
8
- engine: "v3",
9
- mode: "vibe",
10
- };
11
-
12
- function getKiroConfig(sm) {
13
- return {
14
- engine: (sm && sm.kiroEngine) || KIRO_DEFAULTS.engine,
15
- mode: (sm && sm.kiroMode) || KIRO_DEFAULTS.mode,
16
- };
17
- }
18
-
19
- module.exports = {
20
- KIRO_DEFAULTS: KIRO_DEFAULTS,
21
- getKiroConfig: getKiroConfig,
22
- };
1
+ module.exports = require("./yoke/options/kiro-defaults");
@@ -0,0 +1,46 @@
1
+ var crypto = require("crypto");
2
+ var validation = require("./knowledge-db-validation");
3
+ var MAX_BATCH_ROWS = 100;
4
+ var MAX_BATCH_BYTES = 256 * 1024;
5
+
6
+ function fail(message, code) { throw Object.assign(new Error(message), { code: code || "INVALID" }); }
7
+ function json(value, depth) {
8
+ if (depth > 32) fail("Import JSON exceeds 32 nesting levels.");
9
+ if (value === null || typeof value === "string" || typeof value === "boolean") return;
10
+ if (typeof value === "number" && Number.isFinite(value)) return;
11
+ if (typeof value !== "object" || !value) fail("Import payload must contain finite JSON values.");
12
+ if (!Array.isArray(value)) validation.plainObject(value, "Import payload");
13
+ Object.keys(value).forEach(function (key) { json(value[key], depth + 1); });
14
+ }
15
+ function canonical(value) {
16
+ if (Array.isArray(value)) return value.map(canonical);
17
+ if (!value || typeof value !== "object") return value;
18
+ var out = {}; Object.keys(value).sort().forEach(function (key) { out[key] = canonical(value[key]); }); return out;
19
+ }
20
+ function identity(namespace, key) { return JSON.stringify([namespace, key]); }
21
+ function sourceText(value, label, max) {
22
+ var clean = validation.text(value, label, max, false);
23
+ if (clean !== value) fail(label + " must not have surrounding whitespace.");
24
+ return clean;
25
+ }
26
+ function batch(args) {
27
+ validation.plainObject(args, "Import request");
28
+ var namespace = sourceText(args.sourceNamespace, "Source namespace", 120);
29
+ if (!Array.isArray(args.rows) || !args.rows.length || args.rows.length > MAX_BATCH_ROWS) fail("Import batch must contain between 1 and " + MAX_BATCH_ROWS + " rows.", "IMPORT_BATCH_LIMIT");
30
+ json(args.rows, 0);
31
+ if (Buffer.byteLength(JSON.stringify(args.rows), "utf8") > MAX_BATCH_BYTES) fail("Import rows exceed the " + MAX_BATCH_BYTES + " byte input limit.", "IMPORT_BYTES_LIMIT");
32
+ var seen = new Set();
33
+ var rows = args.rows.map(function (row) {
34
+ validation.plainObject(row, "Import row");
35
+ var key = sourceText(row.sourceKey, "Source row key", 200);
36
+ if (seen.has(key)) fail("Import batch contains duplicate source row keys.");
37
+ seen.add(key);
38
+ if (!Object.prototype.hasOwnProperty.call(row, "sourcePayload")) fail("Each import row needs an immutable sourcePayload.");
39
+ validation.plainObject(row.values, "Import values");
40
+ var fingerprint = crypto.createHash("sha256").update(JSON.stringify(canonical({ sourcePayload: row.sourcePayload, values: row.values }))).digest("hex");
41
+ return { sourceKey: key, fingerprint: fingerprint, values: row.values };
42
+ });
43
+ return { sourceNamespace: namespace, rows: rows };
44
+ }
45
+
46
+ module.exports = { batch: batch, identity: identity, sourceText: sourceText, MAX_BATCH_ROWS: MAX_BATCH_ROWS, MAX_BATCH_BYTES: MAX_BATCH_BYTES };
@@ -0,0 +1,99 @@
1
+ var validation = require("./knowledge-db-validation");
2
+ var input = require("./knowledge-db-import-validation");
3
+
4
+ // importRecords({ databaseId, expectedDatabaseRevision, operationId, sourceNamespace,
5
+ // rows: [{ sourceKey, sourcePayload, values }], actor }) creates only unseen source rows.
6
+ // Both sourcePayload and supplied values are immutable import identity; corrections use CRUD.
7
+ // Record references can use sourceNamespace/sourceKey instead of id, including forward
8
+ // references within this batch. Cross-database sources must already be imported locally.
9
+ // readImportProgress({ databaseId, sourceNamespace, offset?, limit? }) returns native ids.
10
+ // Import mappings survive receipt expiry; replay with a fresh operation id and current revision.
11
+ // Limits: 100 rows / 256 KiB of row JSON per batch; shared 20000-record / 16 MiB
12
+ // aggregate bounds include archives, history, mappings and receipts (500 live / 24 hours).
13
+ // Each fresh operation retains one receipt and uses one canonical replacement; source
14
+ // replay preserves the revision. New rows also use the existing optional summary
15
+ // projection write. No filesystem input is accepted.
16
+ function attachKnowledgeDbImport(ctx) {
17
+ function mappings(database) { return database.importMappings || []; }
18
+ function index(database) {
19
+ var out = new Map(); mappings(database).forEach(function (mapping) { out.set(input.identity(mapping.sourceNamespace, mapping.sourceKey), mapping); }); return out;
20
+ }
21
+ function convert(values, schema, databases, next, planned) {
22
+ var fields = {}; schema.forEach(function (field) { fields[field.id] = field; });
23
+ var out = Object.assign({}, values);
24
+ Object.keys(out).forEach(function (fieldId) {
25
+ var field = fields[fieldId]; var value = out[fieldId];
26
+ if (!field || field.type !== "reference" || !value || !Object.prototype.hasOwnProperty.call(value, "sourceKey")) return;
27
+ validation.plainObject(value, "Import reference");
28
+ if (value.type !== "record" || value.id !== undefined) throw ctx.error("Source references require type record and no native id.", "INVALID");
29
+ var databaseId = validation.id(value.databaseId || field.targetDatabaseId || next._id, "reference database id");
30
+ var namespace = input.sourceText(value.sourceNamespace, "Reference source namespace", 120);
31
+ var key = input.sourceText(value.sourceKey, "Reference source key", 200);
32
+ var target = databases.find(function (database) { return database._id === databaseId; });
33
+ var mapping = databaseId === next._id ? planned.get(input.identity(namespace, key)) : target && index(target).get(input.identity(namespace, key));
34
+ if (!mapping) throw ctx.error("Reference source row is outside this Mate or has not been imported.", "FORBIDDEN_REFERENCE");
35
+ out[fieldId] = { type: "record", databaseId: databaseId, id: mapping.recordId };
36
+ });
37
+ return out;
38
+ }
39
+ function importRecords(args) {
40
+ // Snapshot caller-owned JSON before any asynchronous operation.
41
+ var revalidate = args.revalidate; var batch = ctx.clone(input.batch(args)); args = ctx.clone(args); args.revalidate = revalidate;
42
+ var operationId = ctx.mutationId(args.operationId); var fingerprint = ctx.fingerprint("import", args);
43
+ return ctx.serialize(args.databaseId, function () { return ctx.load(args.databaseId).then(async function (current) {
44
+ ctx.guard(args, current);
45
+ var duplicate = ctx.receipt(current, operationId, fingerprint);
46
+ if (duplicate) return Object.assign({}, duplicate, { projectionPending: current.projectionPending === true, projectionError: current.projectionError || null });
47
+ if (current.archivedAt) throw ctx.error("Knowledge database is archived.", "ARCHIVED", current.revision);
48
+ ctx.ensureRevision(args.expectedDatabaseRevision, current.revision, "database");
49
+ var next = ctx.clone(current); var planned = index(current); var added = [];
50
+ var resultMappings = batch.rows.map(function (row) {
51
+ var identity = input.identity(batch.sourceNamespace, row.sourceKey); var existing = planned.get(identity);
52
+ if (existing && existing.fingerprint !== row.fingerprint) throw ctx.error("Source row was already imported with a different payload: " + row.sourceKey, "IMPORT_SOURCE_CONFLICT");
53
+ if (existing) return Object.assign({}, existing, { created: false });
54
+ var mapping = { sourceNamespace: batch.sourceNamespace, sourceKey: row.sourceKey, fingerprint: row.fingerprint, recordId: ctx.newId("rec") };
55
+ planned.set(identity, mapping); added.push({ row: row, mapping: mapping });
56
+ return Object.assign({}, mapping, { created: true });
57
+ });
58
+ if (next.records.length + added.length > validation.MAX_RECORDS) throw ctx.error("Database exceeds the " + validation.MAX_RECORDS + " record limit (including archived records).", "LIMIT");
59
+ var result = { databaseId: current._id, databaseRevision: current.revision, sourceNamespace: batch.sourceNamespace, createdCount: added.length, replayedCount: batch.rows.length - added.length, mappings: resultMappings };
60
+ // Remember fresh replay operations too, so reusing an operation id with another
61
+ // payload still conflicts. Preserve record values, archives and database revision.
62
+ if (!added.length) {
63
+ ctx.remember(next, operationId, fingerprint, result);
64
+ await ctx.replace(current, next, args);
65
+ return Object.assign(result, { projectionPending: current.projectionPending === true, projectionError: current.projectionError || null });
66
+ }
67
+ var databases = await ctx.all(); ctx.guard(args, current); var at = Date.now(); var who = ctx.actor(args.actor);
68
+ added.forEach(function (item) {
69
+ next.records.push({ id: item.mapping.recordId, revision: 1, values: {}, archivedAt: null, createdAt: at, updatedAt: at, createdBy: who, updatedBy: who });
70
+ next.recordHistory[item.mapping.recordId] = [];
71
+ });
72
+ var localDatabases = databases.filter(function (database) { return database._id !== next._id; }).concat([next]);
73
+ var context = ctx.referenceContext(localDatabases, next);
74
+ added.forEach(function (item, position) {
75
+ var values = convert(item.row.values, current.schema, databases, next, planned);
76
+ next.records[current.records.length + position].values = validation.normalizeValues(values, current.schema, context, null);
77
+ });
78
+ next.importMappings = mappings(next).concat(added.map(function (item) { return item.mapping; }));
79
+ next.revision++; next.updatedAt = at; next.updatedBy = who; next.projectionPending = true; next.projectionError = null;
80
+ result.databaseRevision = next.revision;
81
+ ctx.remember(next, operationId, fingerprint, result);
82
+ await ctx.replace(current, next, args);
83
+ return ctx.finish(next, result, who);
84
+ }); });
85
+ }
86
+ function readImportProgress(args) {
87
+ var namespace = input.sourceText(args.sourceNamespace, "Source namespace", 120);
88
+ var offset = args.offset === undefined ? 0 : args.offset; var limit = args.limit === undefined ? 100 : args.limit;
89
+ if (!Number.isInteger(offset) || offset < 0 || !Number.isInteger(limit) || limit < 1 || limit > 100) throw ctx.error("Import progress requires a nonnegative integer offset and limit between 1 and 100.", "INVALID");
90
+ return ctx.load(args.databaseId).then(function (database) {
91
+ var rows = mappings(database).filter(function (mapping) { return mapping.sourceNamespace === namespace; });
92
+ rows.sort(function (a, b) { return a.sourceKey === b.sourceKey ? 0 : a.sourceKey < b.sourceKey ? -1 : 1; });
93
+ return { databaseId: database._id, databaseRevision: database.revision, sourceNamespace: namespace, total: rows.length, mappings: ctx.clone(rows.slice(offset, offset + limit)), nextOffset: offset + limit < rows.length ? offset + limit : null };
94
+ });
95
+ }
96
+ return { importRecords: importRecords, readImportProgress: readImportProgress };
97
+ }
98
+
99
+ module.exports = { attachKnowledgeDbImport: attachKnowledgeDbImport, MAX_BATCH_ROWS: input.MAX_BATCH_ROWS, MAX_BATCH_BYTES: input.MAX_BATCH_BYTES };