clay-server 3.8.1 → 4.0.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 (222) hide show
  1. package/lib/ask-user-mcp-server.js +5 -119
  2. package/lib/background-task-timing.js +105 -0
  3. package/lib/builtin-mates.js +6 -6
  4. package/lib/claude-hook-installer.js +15 -0
  5. package/lib/clay-history-mcp-server.js +62 -297
  6. package/lib/daemon.js +23 -1
  7. package/lib/debate-model-selection.js +119 -0
  8. package/lib/home-debate-tool-policy.js +164 -0
  9. package/lib/home-response-notifications.js +26 -0
  10. package/lib/knowledge-import.js +436 -0
  11. package/lib/knowledge-record-store.js +188 -0
  12. package/lib/knowledge-search.js +224 -0
  13. package/lib/mate-creation-mcp-server.js +55 -0
  14. package/lib/mate-knowledge-mcp-server.js +151 -0
  15. package/lib/mate-knowledge-migration.js +283 -0
  16. package/lib/mate-knowledge-service.js +488 -0
  17. package/lib/mate-knowledge-sync.js +482 -0
  18. package/lib/mate-ready-creation.js +95 -0
  19. package/lib/mates.js +2 -0
  20. package/lib/notes.js +2 -1
  21. package/lib/project-ask-user.js +64 -0
  22. package/lib/project-capsule-catalog.js +101 -0
  23. package/lib/project-connection.js +17 -0
  24. package/lib/project-debate-proposal.js +133 -17
  25. package/lib/project-debate.js +214 -110
  26. package/lib/project-delegated-follow-up.js +84 -0
  27. package/lib/project-delegated-session.js +53 -0
  28. package/lib/project-filesystem.js +7 -9
  29. package/lib/project-knowledge.js +23 -0
  30. package/lib/project-logs-comments.js +137 -0
  31. package/lib/project-logs-mcp-server.js +290 -0
  32. package/lib/project-logs-query.js +167 -0
  33. package/lib/project-logs-root.js +67 -0
  34. package/lib/project-logs-schema.js +259 -0
  35. package/lib/project-logs-service.js +357 -0
  36. package/lib/project-logs-snapshot.js +202 -0
  37. package/lib/project-logs-store.js +498 -0
  38. package/lib/project-logs-versioning.js +128 -0
  39. package/lib/project-logs.js +347 -0
  40. package/lib/project-mate-creation-proposal.js +120 -0
  41. package/lib/project-mate-interaction.js +14 -0
  42. package/lib/project-mate-knowledge.js +110 -0
  43. package/lib/project-memory.js +36 -7
  44. package/lib/project-models.js +157 -32
  45. package/lib/project-session-notes.js +2 -2
  46. package/lib/project-session-pair.js +8 -8
  47. package/lib/project-sessions.js +66 -51
  48. package/lib/project-vendor-login.js +414 -0
  49. package/lib/project-worker-proposal.js +25 -25
  50. package/lib/project-workspace-query.js +144 -0
  51. package/lib/project.js +433 -102
  52. package/lib/public/app.js +109 -48
  53. package/lib/public/css/avatar-imprints.css +0 -1
  54. package/lib/public/css/base.css +4 -0
  55. package/lib/public/css/capsule-ui.css +389 -0
  56. package/lib/public/css/command-palette.css +306 -6
  57. package/lib/public/css/home-capsule-library.css +243 -0
  58. package/lib/public/css/home-capsule-source.css +192 -0
  59. package/lib/public/css/home-debate-live.css +146 -0
  60. package/lib/public/css/home-debate-planning.css +125 -0
  61. package/lib/public/css/home-debates-archive.css +281 -0
  62. package/lib/public/css/home-hub.css +896 -405
  63. package/lib/public/css/home-mate-creation.css +34 -0
  64. package/lib/public/css/home-mate-model-picker.css +131 -0
  65. package/lib/public/css/home-mate-settings.css +344 -0
  66. package/lib/public/css/home-session-actions.css +265 -0
  67. package/lib/public/css/home-sidebar.css +667 -0
  68. package/lib/public/css/icon-strip.css +1 -2
  69. package/lib/public/css/input.css +79 -25
  70. package/lib/public/css/mates.css +7 -34
  71. package/lib/public/css/pane.css +1 -1
  72. package/lib/public/css/playbook.css +0 -80
  73. package/lib/public/css/project-logs.css +234 -0
  74. package/lib/public/css/scheduler.css +1 -1
  75. package/lib/public/css/sticky-notes.css +53 -117
  76. package/lib/public/css/tui-attention.css +0 -44
  77. package/lib/public/css/workspace-assignment.css +45 -0
  78. package/lib/public/fonts/source-serif-4/LICENSE.md +93 -0
  79. package/lib/public/fonts/source-serif-4/SourceSerif4Caption-Semibold.ttf.woff2 +0 -0
  80. package/lib/public/index.html +96 -74
  81. package/lib/public/modules/app-connection.js +100 -5
  82. package/lib/public/modules/app-dm.js +43 -160
  83. package/lib/public/modules/app-home-hub.js +328 -585
  84. package/lib/public/modules/app-message-cards.js +242 -0
  85. package/lib/public/modules/app-message-router.js +84 -0
  86. package/lib/public/modules/app-messages.js +124 -38
  87. package/lib/public/modules/app-notifications.js +8 -119
  88. package/lib/public/modules/app-panels.js +43 -2
  89. package/lib/public/modules/app-projects.js +9 -1
  90. package/lib/public/modules/app-rendering.js +21 -602
  91. package/lib/public/modules/avatar-imprint.js +11 -8
  92. package/lib/public/modules/background-tasks-ui.js +139 -16
  93. package/lib/public/modules/chat-bubble-renderer.js +152 -0
  94. package/lib/public/modules/chat-render-runtime.js +198 -0
  95. package/lib/public/modules/command-palette.js +225 -436
  96. package/lib/public/modules/dm-render.js +82 -0
  97. package/lib/public/modules/home-capsule-creation-intent.js +31 -0
  98. package/lib/public/modules/home-capsule-library.js +146 -0
  99. package/lib/public/modules/home-capsule-source.js +383 -0
  100. package/lib/public/modules/home-chat-identity.js +35 -0
  101. package/lib/public/modules/home-chat-scroll.js +77 -0
  102. package/lib/public/modules/home-chat-stream-state.js +34 -0
  103. package/lib/public/modules/home-composer-focus.js +25 -0
  104. package/lib/public/modules/home-conversations-sheet.js +179 -0
  105. package/lib/public/modules/home-debate-activity.js +48 -0
  106. package/lib/public/modules/home-debate-controls.js +295 -0
  107. package/lib/public/modules/home-debate-launch.js +41 -0
  108. package/lib/public/modules/home-debate-live.js +284 -0
  109. package/lib/public/modules/home-debate-models.js +73 -0
  110. package/lib/public/modules/home-debate-planning.js +335 -0
  111. package/lib/public/modules/home-debates-archive.js +279 -0
  112. package/lib/public/modules/home-dock-resize.js +74 -0
  113. package/lib/public/modules/home-dock.js +446 -0
  114. package/lib/public/modules/home-mate-chat.js +496 -0
  115. package/lib/public/modules/home-mate-creation.js +109 -0
  116. package/lib/public/modules/home-mate-model-picker.js +281 -0
  117. package/lib/public/modules/home-mate-selection.js +38 -0
  118. package/lib/public/modules/home-mate-settings-menu.js +131 -0
  119. package/lib/public/modules/home-mate-settings.js +383 -0
  120. package/lib/public/modules/home-session-actions.js +373 -0
  121. package/lib/public/modules/home-session-model-confirmation.js +13 -0
  122. package/lib/public/modules/home-shell.js +9 -0
  123. package/lib/public/modules/home-sidebar-chat-list.js +63 -0
  124. package/lib/public/modules/home-sidebar.js +165 -0
  125. package/lib/public/modules/home-sub-surface.js +19 -0
  126. package/lib/public/modules/home-surface-boot.js +68 -0
  127. package/lib/public/modules/home-surface.js +141 -0
  128. package/lib/public/modules/home-tools.js +271 -0
  129. package/lib/public/modules/markdown.js +50 -2
  130. package/lib/public/modules/mate-management.js +86 -0
  131. package/lib/public/modules/mate-sidebar.js +0 -8
  132. package/lib/public/modules/mate-wizard.js +0 -7
  133. package/lib/public/modules/mention.js +17 -19
  134. package/lib/public/modules/pane-bridge.js +9 -0
  135. package/lib/public/modules/profile.js +4 -5
  136. package/lib/public/modules/project-logs-ambient.js +238 -0
  137. package/lib/public/modules/project-logs-render.js +359 -0
  138. package/lib/public/modules/project-logs.js +328 -0
  139. package/lib/public/modules/project-settings.js +34 -28
  140. package/lib/public/modules/project-switcher.js +11 -5
  141. package/lib/public/modules/project-workspace-assignment.js +23 -0
  142. package/lib/public/modules/scheduler.js +17 -3
  143. package/lib/public/modules/search-clay-chat.js +402 -0
  144. package/lib/public/modules/server-settings.js +14 -12
  145. package/lib/public/modules/session-actions.js +1 -1
  146. package/lib/public/modules/sidebar-mates.js +56 -552
  147. package/lib/public/modules/sidebar-mobile.js +12 -73
  148. package/lib/public/modules/sidebar-presence.js +37 -0
  149. package/lib/public/modules/sidebar-sessions.js +25 -1
  150. package/lib/public/modules/split-pair-ui.js +13 -13
  151. package/lib/public/modules/split-view.js +7 -0
  152. package/lib/public/modules/sticky-notes.js +106 -53
  153. package/lib/public/modules/tool-input-composition.js +48 -0
  154. package/lib/public/modules/tool-llm-status.js +167 -0
  155. package/lib/public/modules/tool-palette.js +76 -4
  156. package/lib/public/modules/tool-renderer-advanced.js +285 -0
  157. package/lib/public/modules/tool-renderer-chart.js +158 -0
  158. package/lib/public/modules/tool-renderer-semantics.js +35 -0
  159. package/lib/public/modules/tool-renderer.js +464 -0
  160. package/lib/public/modules/tool-runtime.js +309 -0
  161. package/lib/public/modules/tool-ui-evaluator.js +97 -0
  162. package/lib/public/modules/tool-ui-tree.js +21 -0
  163. package/lib/public/modules/tui-attention.js +10 -0
  164. package/lib/public/modules/user-settings.js +16 -23
  165. package/lib/public/modules/vendor-login.js +287 -0
  166. package/lib/public/modules/worker-proposal.js +2 -2
  167. package/lib/public/modules/workspace-assignment-card.js +149 -0
  168. package/lib/public/modules/workspace-assignment-routing.js +4 -0
  169. package/lib/public/style.css +14 -2
  170. package/lib/runtime-env.js +65 -0
  171. package/lib/sdk-bridge.js +120 -32
  172. package/lib/sdk-message-processor.js +34 -13
  173. package/lib/server-home-capsule-creation.js +36 -0
  174. package/lib/server-home-chat-events.js +287 -0
  175. package/lib/server-home-chat.js +518 -0
  176. package/lib/server-home-clay-entry.js +65 -0
  177. package/lib/server-home-clay-session-links.js +26 -0
  178. package/lib/server-home-debate-planning.js +214 -0
  179. package/lib/server-home-debates.js +137 -0
  180. package/lib/server-home-mate-creation.js +261 -0
  181. package/lib/server-home-models.js +241 -0
  182. package/lib/server-home-preferences.js +61 -0
  183. package/lib/server-mates.js +37 -0
  184. package/lib/server-tools.js +377 -0
  185. package/lib/server.js +166 -59
  186. package/lib/session-pair-mcp-server.js +6 -6
  187. package/lib/sessions.js +22 -4
  188. package/lib/tool-capsule-source.js +142 -0
  189. package/lib/tool-control-mcp-server.js +126 -0
  190. package/lib/tool-llm.js +48 -0
  191. package/lib/tool-storage.js +77 -0
  192. package/lib/tool-ui-spec-advanced.js +82 -0
  193. package/lib/tool-ui-spec.js +261 -0
  194. package/lib/tools-registry.js +286 -0
  195. package/lib/users-home-dock-preferences.js +77 -0
  196. package/lib/users-home-surface-preferences.js +99 -0
  197. package/lib/users-preferences.js +4 -7
  198. package/lib/users.js +12 -0
  199. package/lib/whats-new-content.js +3 -3
  200. package/lib/workspace-assignment-service.js +420 -0
  201. package/lib/workspace-query-mcp-server.js +154 -0
  202. package/lib/workspace-query-service.js +492 -0
  203. package/lib/ws-schema.js +107 -12
  204. package/lib/yoke/adapters/acp.js +2 -1
  205. package/lib/yoke/adapters/antigravity.js +2 -1
  206. package/lib/yoke/adapters/claude-worker.js +11 -4
  207. package/lib/yoke/adapters/claude.js +141 -46
  208. package/lib/yoke/adapters/codex.js +79 -11
  209. package/lib/yoke/adapters/kiro.js +2 -1
  210. package/lib/yoke/claude-user-input.js +38 -0
  211. package/lib/yoke/codex-app-server.js +20 -2
  212. package/lib/yoke/codex-background-tasks.js +8 -2
  213. package/lib/yoke/codex-user-input.js +64 -0
  214. package/lib/yoke/complete-once.js +164 -0
  215. package/lib/yoke/index.js +5 -1
  216. package/lib/yoke/interface.js +19 -0
  217. package/lib/yoke/mcp-bridge-server.js +2 -6
  218. package/lib/yoke/user-input.js +254 -0
  219. package/package.json +4 -3
  220. package/lib/public/css/home-chat.css +0 -380
  221. package/lib/public/modules/home-chat.js +0 -438
  222. package/lib/server-clay-home.js +0 -245
package/lib/ws-schema.js CHANGED
@@ -39,8 +39,11 @@ var schema = {
39
39
  "split_group_dissolve": { direction: "c2s", handler: "lib/session-split-groups.js", description: "Separate a split group without deleting its sessions" },
40
40
  "split_group_set_pair": { direction: "c2s", handler: "lib/session-split-groups.js", description: "Assign Driver/Worker roles on a split group (driverId null clears them)" },
41
41
  "pair_session_options": { direction: "c2s", handler: "lib/project-session-pair.js", description: "Request vendors/models for the pair-session dialog (response reuses the same type)" },
42
- "pair_session_create": { direction: "c2s", handler: "lib/project-session-pair.js", description: "Create a Driver/Worker session pair as a split group" },
42
+ "pair_session_create": { direction: "c2s", handler: "lib/project-session-pair.js", description: "Create a Driver/Split Worker session pair as a split group" },
43
43
  "worker_proposal_response": { direction: "c2s", handler: "lib/project-worker-proposal.js", description: "Accept or decline a Fable Worker suggestion with the selected runtime" },
44
+ "project_assignment_response": { direction: "c2s", handler: "lib/workspace-assignment-service.js", description: "Approve or cancel an exact-session cross-project assignment proposal" },
45
+ "home_clay_session_resolve": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Resolve an opaque Mate session reference through the exact bound source session" },
46
+ "home_clay_session_target": { direction: "s2c", handler: "lib/public/modules/command-palette.js", description: "Return an owner-validated navigation target for a rendered Mate session reference" },
44
47
 
45
48
  "session_list": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Full list of sessions for the sidebar" },
46
49
  "session_switched": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Confirmation that active session changed" },
@@ -61,6 +64,11 @@ var schema = {
61
64
  "pair_session_created": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Result of pair_session_create; carries the new group" },
62
65
  "worker_proposal": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Inline Fable suggestion to delegate execution to a Worker" },
63
66
  "worker_proposal_update": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Worker suggestion lifecycle update" },
67
+ "project_assignment_proposal": { direction: "s2c", handler: "lib/public/modules/app-message-router.js", description: "Approval card for a new owner-bound project assignment" },
68
+ "project_assignment_status": { direction: "s2c", handler: "lib/public/modules/app-message-router.js", description: "Durable project assignment lifecycle update" },
69
+ "project_assignment_error": { direction: "s2c", handler: "lib/public/modules/app-message-router.js", description: "Rejected or stale project assignment response" },
70
+ "home_project_assignment_proposal": { direction: "s2c", handler: "lib/public/modules/app-message-router.js", description: "Home-projected exact-session assignment approval card" },
71
+ "home_project_assignment_status": { direction: "s2c", handler: "lib/public/modules/app-message-router.js", description: "Home-projected exact-session assignment lifecycle" },
64
72
  "split_delegation": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "A pair delegation started or ended (drives the split-view flow indicator)" },
65
73
 
66
74
  // -----------------------------------------------------------------------
@@ -163,6 +171,13 @@ var schema = {
163
171
  // Auth
164
172
  // -----------------------------------------------------------------------
165
173
  "auth_required": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Authentication required (e.g. API key needed)" },
174
+ "vendor_login_start": { direction: "c2s", handler: "lib/project-vendor-login.js", description: "Start (or re-attach to) the per-vendor login terminal" },
175
+ "vendor_login_cancel": { direction: "c2s", handler: "lib/project-vendor-login.js", description: "Dismiss the login flow and kill its terminal" },
176
+ "vendor_login_state_request": { direction: "c2s", handler: "lib/project-vendor-login.js", description: "Ask for the project's active login flows" },
177
+ "vendor_login_ready": { direction: "s2c", handler: "lib/public/modules/vendor-login.js", description: "Login terminal is available; open/re-attach the modal to it" },
178
+ "vendor_login_state": { direction: "s2c", handler: "lib/public/modules/vendor-login.js", description: "Active login flows for this project (one per vendor)" },
179
+ "vendor_login_error": { direction: "s2c", handler: "lib/public/modules/vendor-login.js", description: "The login flow could not be started" },
180
+ "auth_refreshed": { direction: "s2c", handler: "lib/public/modules/vendor-login.js", description: "Login completed and the vendor adapter was restarted" },
166
181
 
167
182
  // -----------------------------------------------------------------------
168
183
  // Rate limiting / scheduling
@@ -242,6 +257,14 @@ var schema = {
242
257
  "whats_new_state": { direction: "s2c", handler: "lib/public/modules/whats-new.js", description: "Unseen What's New entries for the connecting user" },
243
258
  "whats_new_seen": { direction: "c2s", handler: "lib/project-sessions.js", description: "Mark a What's New entry as dismissed by the current user" },
244
259
  "whats_new_seen_result": { direction: "s2c", handler: "lib/public/modules/whats-new.js", description: "Result of marking a What's New entry seen" },
260
+ "home_dock_get": { direction: "c2s", handler: "lib/server-home-preferences.js", description: "Request the current user's home dock preference" },
261
+ "home_dock_set": { direction: "c2s", handler: "lib/server-home-preferences.js", description: "Persist the current user's home dock preference" },
262
+ "home_dock_state": { direction: "s2c", handler: "lib/public/modules/home-dock.js", description: "Current user home dock preference" },
263
+ "home_surface_get": { direction: "c2s", handler: "lib/server-home-preferences.js", description: "Request the current user's durable primary surface and Home conversation selection" },
264
+ "home_surface_set": { direction: "c2s", handler: "lib/server-home-preferences.js", description: "Persist the current user's primary surface and Home conversation selection" },
265
+ "home_surface_state": { direction: "s2c", handler: "lib/public/modules/home-surface.js", description: "Current user primary surface and Home conversation selection" },
266
+ "home_debates_list": { direction: "c2s", handler: "lib/server-home-debates.js", description: "Request the current user's durable Home debate archive" },
267
+ "home_debates_state": { direction: "s2c", handler: "lib/public/modules/home-debates-archive.js", description: "Current user's durable Home debate archive" },
245
268
 
246
269
  // -----------------------------------------------------------------------
247
270
  // Process stats
@@ -379,6 +402,20 @@ var schema = {
379
402
  "note_bring_front": { direction: "c2s", handler: "lib/project-user-message.js", description: "Bring a note to front (update z-order)" },
380
403
  "notes_list": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Full list of sticky notes" },
381
404
 
405
+ // -----------------------------------------------------------------------
406
+ // Project Logs
407
+ // -----------------------------------------------------------------------
408
+ "project_logs_list": { direction: "c2s", handler: "lib/project-logs.js", description: "List or search this project's logs (project scope is bound server-side)" },
409
+ "project_log_read": { direction: "c2s", handler: "lib/project-logs.js", description: "Read one project log entry by opaque ref" },
410
+ "project_log_comment": { direction: "c2s", handler: "lib/project-logs.js", description: "Append an attributed comment to a project log entry (append-only; author comes from the connection)" },
411
+ "project_log_create": { direction: "c2s", handler: "lib/project-logs.js", description: "Retired. Canonical entries are written only by project agent sessions; this is always refused" },
412
+ "project_log_update": { direction: "c2s", handler: "lib/project-logs.js", description: "Retired. Canonical revisions are written only by project agent sessions; this is always refused" },
413
+ "project_logs_state": { direction: "s2c", handler: "lib/public/modules/project-logs.js", description: "Correlated project log index for a list or search request" },
414
+ "project_log_entry": { direction: "s2c", handler: "lib/public/modules/project-logs.js", description: "Correlated full project log entry" },
415
+ "project_log_commented": { direction: "s2c", handler: "lib/public/modules/project-logs.js", description: "Correlated project log entry after a comment was appended" },
416
+ "project_log_updated": { direction: "s2c", handler: "lib/public/modules/project-logs.js", description: "A canonical log entry was created or revised by this project's agent session (bounded ledger metadata only)" },
417
+ "project_logs_error": { direction: "s2c", handler: "lib/public/modules/project-logs.js", description: "Correlated project log request failure" },
418
+
382
419
  // -----------------------------------------------------------------------
383
420
  // Browser extension
384
421
  // -----------------------------------------------------------------------
@@ -435,6 +472,30 @@ var schema = {
435
472
  "mate_available_builtins": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Available built-in mates list" },
436
473
  "mate_error": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Mate operation error" },
437
474
 
475
+ // -----------------------------------------------------------------------
476
+ // User-installed home tools
477
+ // -----------------------------------------------------------------------
478
+ "tools_list": { direction: "c2s", handler: "lib/server-tools.js", description: "List installed tool definitions" },
479
+ "tool_get": { direction: "c2s", handler: "lib/server-tools.js", description: "Get one installed tool definition" },
480
+ "tool_install": { direction: "c2s", handler: "lib/server-tools.js", description: "Install a new declarative tool" },
481
+ "tool_source_get": { direction: "c2s", handler: "lib/server-tools.js", description: "Read authored Capsule source for the current user" },
482
+ "tool_mate_access_set": { direction: "c2s", handler: "lib/server-tools.js", description: "Set whether Mates may inspect and edit one Capsule" },
483
+ "tool_remove": { direction: "c2s", handler: "lib/server-tools.js", description: "Remove an installed tool" },
484
+ "tool_storage_op": { direction: "c2s", handler: "lib/server-tools.js", description: "Run an operation against scoped tool storage" },
485
+ "tool_llm_op": { direction: "c2s", handler: "lib/server-tools.js", description: "Run a permission-gated vendor-neutral capsule LLM completion" },
486
+ "tool_llm_config_get": { direction: "c2s", handler: "lib/server-tools.js", description: "Get the concrete configured provider and model used by Capsule LLM calls" },
487
+ "tool_control_response": { direction: "c2s", handler: "lib/server-tools.js", description: "Resolve a mate tool-control request with browser runtime state or an error" },
488
+ "tools_state": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Full installed tool definitions" },
489
+ "tool_installed": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "An installed tool changed" },
490
+ "tool_source_state": { direction: "s2c", handler: "lib/public/modules/home-capsule-source.js", description: "Correlated authored Capsule source or read error" },
491
+ "tool_mate_access_state": { direction: "s2c", handler: "lib/public/modules/home-capsule-source.js", description: "Server-confirmed Mate editing permission" },
492
+ "tool_removed": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "An installed tool was removed" },
493
+ "tool_storage_result": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Result of a scoped tool storage operation" },
494
+ "tool_llm_result": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Result of a capsule LLM completion" },
495
+ "tool_llm_config_state": { direction: "s2c", handler: "lib/public/modules/tool-llm-status.js", description: "Concrete provider and model state for Capsule LLM calls" },
496
+ "tool_control_request": { direction: "s2c", handler: "lib/public/modules/home-tools.js", description: "Ask the connected home client to snapshot or drive a sandboxed tool" },
497
+ "tools_error": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Tool registry, runtime, or storage error" },
498
+
438
499
  // -----------------------------------------------------------------------
439
500
  // Mentions (@mate)
440
501
  // -----------------------------------------------------------------------
@@ -458,7 +519,7 @@ var schema = {
458
519
  "debate_stop": { direction: "c2s", handler: "lib/project.js", description: "Stop the current debate" },
459
520
  "debate_conclude_response": { direction: "c2s", handler: "lib/project.js", description: "Respond to a debate conclude prompt (end or continue)" },
460
521
  "debate_confirm_brief": { direction: "c2s", handler: "lib/project.js", description: "Confirm the debate brief and start the debate" },
461
- "debate_proposal_response": { direction: "c2s", handler: "lib/project.js", description: "Respond to a debate proposal" },
522
+ "debate_proposal_response": { direction: "c2s", handler: "lib/project.js", description: "Respond to a debate proposal with optional per-participant model overrides" },
462
523
  "debate_user_floor_response": { direction: "c2s", handler: "lib/project.js", description: "User submits their statement during user floor turn" },
463
524
  "debate_preparing": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Debate is being prepared" },
464
525
  "debate_brief_ready": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Debate brief is ready for user approval" },
@@ -467,6 +528,9 @@ var schema = {
467
528
  "debate_activity": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Debate panelist activity indicator" },
468
529
  "debate_stream": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Incremental debate response text" },
469
530
  "debate_turn_done": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Debate turn completed with full text" },
531
+ "debate_tool_decision": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Moderator tool permission decision for a debate participant" },
532
+ "debate_stop_requested": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Debate will stop after the active turn" },
533
+ "debate_stop_cancelled": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Pending debate stop was cancelled" },
470
534
  "debate_hand_raised": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "User hand raise was acknowledged" },
471
535
  "debate_comment_queued": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "User comment was queued for injection" },
472
536
  "debate_comment_injected": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "User comment was injected into the debate" },
@@ -556,16 +620,47 @@ var schema = {
556
620
  "ralph_files_content": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Loop file contents (prompt and judge)" },
557
621
 
558
622
  // -----------------------------------------------------------------------
559
- // Home Chat (Clay host agent)
560
- // -----------------------------------------------------------------------
561
- "home_clay_open": { direction: "c2s", handler: "lib/server-clay-home.js", description: "Open/restore the user's Clay home chat session" },
562
- "home_clay_send": { direction: "c2s", handler: "lib/server-clay-home.js", description: "Send a message to Clay from the home chat" },
563
- "home_clay_new_session": { direction: "c2s", handler: "lib/server-clay-home.js", description: "Start a fresh Clay home chat session" },
564
- "home_clay_close": { direction: "c2s", handler: "lib/server-clay-home.js", description: "Tear down the home-chat tap on the user's WS" },
565
- "home_clay_history": { direction: "s2c", handler: "lib/public/modules/home-chat.js", description: "Initial / refreshed Clay home chat history" },
566
- "home_clay_delta": { direction: "s2c", handler: "lib/public/modules/home-chat.js", description: "Streaming assistant text delta for home chat" },
567
- "home_clay_done": { direction: "s2c", handler: "lib/public/modules/home-chat.js", description: "Clay turn finished" },
568
- "home_clay_error": { direction: "s2c", handler: "lib/public/modules/home-chat.js", description: "Home chat error" }
623
+ // Embedded mate chat
624
+ // -----------------------------------------------------------------------
625
+ "home_mate_open": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Open or restore the selected mate's embedded chat session" },
626
+ "home_clay_ask": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Start a fresh builtin Clay conversation from the global search drawer" },
627
+ "home_mate_sessions_list": { direction: "c2s", handler: "lib/server-home-chat.js", description: "List the current user's conversations with the selected mate" },
628
+ "home_mate_session_open": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Open one explicit conversation with the selected mate" },
629
+ "home_mate_send": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Send a message to the selected mate from the home hub" },
630
+ "home_mate_new_session": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Start a fresh embedded session with the selected mate, optionally with a typed creation intent" },
631
+ "home_mate_debate_plan": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Start a fresh server-seeded debate planning conversation with Clay using an optional prefilled topic" },
632
+ "home_mate_creation_plan": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Start a fresh server-seeded Mate creation interview with Clay" },
633
+ "home_mate_creation_question_response": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Answer an exact pending question in a Clay-led Mate creation interview" },
634
+ "home_mate_creation_proposal_response": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Approve or cancel an exact Mate creation proposal" },
635
+ "home_debate_proposal_response": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Approve or cancel an exact Home debate proposal with optional per-participant model overrides" },
636
+ "home_debate_question_response": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Answer the exact pending AskUserQuestion in an owned Home debate planning session" },
637
+ "home_debate_control": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Control or resume the exact owned Home debate session" },
638
+ "home_mate_close": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Tear down the embedded mate session tap" },
639
+ "home_mate_present": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Report whether Home is visibly presenting its active exact Mate conversation" },
640
+ "home_mate_memory_list": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Request a correlated read-only memory projection for one owned Mate" },
641
+ "home_mate_knowledge_list": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Request a correlated read-only knowledge file list for one owned Mate" },
642
+ "home_mate_models_get": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Request an available vendor and model catalog for the selected Mate" },
643
+ "home_mate_model_set": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Validate and persist the Mate vendor/model, optionally applying it to an exact owned pristine Home draft" },
644
+ "home_mate_history": { direction: "s2c", handler: "lib/public/modules/home-mate-chat.js", description: "Selected mate's initial or refreshed chat history" },
645
+ "home_clay_activity": { direction: "s2c", handler: "lib/public/modules/search-clay-chat.js", description: "Sanitized progress stage for a query-bound global-search Clay conversation" },
646
+ "home_mate_session_identity": { direction: "s2c", handler: "lib/public/modules/app-message-router.js", description: "Promote an active Home session from its local reference to its durable runtime identity" },
647
+ "home_mate_sessions_state": { direction: "s2c", handler: "lib/public/modules/home-mate-chat.js", description: "Owned visible Mate conversations with sanitized runtime identity, model, status, and timestamps" },
648
+ "home_mate_delta": { direction: "s2c", handler: "lib/public/modules/home-mate-chat.js", description: "Selected mate's streaming assistant text delta" },
649
+ "home_mate_done": { direction: "s2c", handler: "lib/public/modules/home-mate-chat.js", description: "Selected mate's turn finished" },
650
+ "home_debate_proposal": { direction: "s2c", handler: "lib/public/modules/app-message-router.js", description: "Session-bound debate proposal for the active Home transcript" },
651
+ "home_debate_proposal_resolved": { direction: "s2c", handler: "lib/public/modules/app-message-router.js", description: "Server-confirmed result for a Home debate proposal" },
652
+ "home_debate_question": { direction: "s2c", handler: "lib/public/modules/app-message-router.js", description: "Session-bound AskUserQuestion card for Home debate planning" },
653
+ "home_debate_question_resolved": { direction: "s2c", handler: "lib/public/modules/app-message-router.js", description: "Server-confirmed answer or expiry for a Home debate question" },
654
+ "home_debate_event": { direction: "s2c", handler: "lib/public/modules/app-message-router.js", description: "Correlated live debate event for the active Home transcript" },
655
+ "home_mate_creation_question": { direction: "s2c", handler: "lib/public/modules/app-message-router.js", description: "Session-bound question in a Clay-led Mate creation interview" },
656
+ "home_mate_creation_question_resolved": { direction: "s2c", handler: "lib/public/modules/app-message-router.js", description: "Server-confirmed Mate interview answer or expiry" },
657
+ "home_mate_creation_proposal": { direction: "s2c", handler: "lib/public/modules/app-message-router.js", description: "Session-bound new Mate proposal" },
658
+ "home_mate_creation_proposal_resolved": { direction: "s2c", handler: "lib/public/modules/app-message-router.js", description: "Server-confirmed result for a Mate creation proposal" },
659
+ "home_mate_error": { direction: "s2c", handler: "lib/public/modules/home-mate-chat.js", description: "Embedded mate chat error" },
660
+ "home_mate_memory_state": { direction: "s2c", handler: "lib/public/modules/home-mate-settings.js", description: "Selected mate's read-only memory summary and entries" },
661
+ "home_mate_knowledge_state": { direction: "s2c", handler: "lib/public/modules/home-mate-settings.js", description: "Selected mate's read-only knowledge file list" },
662
+ "home_mate_models_state": { direction: "s2c", handler: "lib/public/modules/home-mate-settings.js", description: "Correlated Mate model catalog state" },
663
+ "home_mate_model_result": { direction: "s2c", handler: "lib/public/modules/home-mate-settings.js", description: "Correlated Mate model selection result" }
569
664
  };
570
665
 
571
666
  module.exports = { schema: schema };
@@ -220,7 +220,7 @@ function createAcpAdapter(vendor, opts) {
220
220
  if (!initialized || !acp || !acp.started) await adapter.init(queryOpts);
221
221
  if (shuttingDown) throw new Error(driver.displayName + " adapter is shutting down");
222
222
  var controller = queryOpts.abortController || new AbortController();
223
- var sharedSkills = skillDiscovery.discoverSkills(queryOpts.cwd || cwd);
223
+ var sharedSkills = queryOpts.skipSkills ? [] : skillDiscovery.discoverSkills(queryOpts.cwd || cwd);
224
224
  var skillIndex = skillDiscovery.buildSkillIndex(sharedSkills);
225
225
  var acpOptions = (queryOpts.adapterOptions && queryOpts.adapterOptions.ACP) || {};
226
226
  var handle = null;
@@ -254,6 +254,7 @@ function createAcpAdapter(vendor, opts) {
254
254
  for (var i = 0; i < messages.length; i++) prompt += "User message " + (i + 1) + ": " + messages[i] + "\n";
255
255
  var handle = await adapter.createQuery({
256
256
  cwd: (titleOpts && titleOpts.cwd) || cwd,
257
+ env: titleOpts && titleOpts.env,
257
258
  systemPrompt: "You generate concise conversation titles. Output only the title.",
258
259
  canUseTool: function() { return Promise.resolve({ behavior: "deny" }); },
259
260
  });
@@ -376,7 +376,7 @@ function createAntigravityAdapter(opts) {
376
376
  var handle;
377
377
  handle = createAntigravityQueryHandle(binaryPath, Object.assign({}, queryOpts, {
378
378
  dangerouslySkipPermissions: !!antigravityOpts.dangerouslySkipPermissions,
379
- env: antigravityOpts.env || null,
379
+ env: antigravityOpts.env || queryOpts.env || null,
380
380
  _spawn: opts._spawn || null,
381
381
  }), function() {
382
382
  var index = activeHandles.indexOf(handle);
@@ -388,6 +388,7 @@ function createAntigravityAdapter(opts) {
388
388
  generateTitle: async function(messages, titleOpts) {
389
389
  var handle = await adapter.createQuery({
390
390
  cwd: (titleOpts && titleOpts.cwd) || cwd,
391
+ env: titleOpts && titleOpts.env,
391
392
  systemPrompt: "Generate a concise conversation title of 3 to 8 words. Output only the title.",
392
393
  });
393
394
  var prompt = messages.join("\n");
@@ -491,10 +491,12 @@ async function handleQueryStart(msg) {
491
491
  }
492
492
  return cp;
493
493
  };
494
+ var nativeUserInput = options.userInputMode !== "fallback";
495
+ delete options.userInputMode;
494
496
  options.canUseTool = function(toolName, input, toolOpts) {
495
497
  // AskUserQuestion is handled specially: we send it as a separate IPC type
496
498
  // so the daemon can use its own AskUserQuestion handling logic
497
- if (toolName === "AskUserQuestion") {
499
+ if (toolName === "AskUserQuestion" && nativeUserInput) {
498
500
  var toolUseId = toolOpts.toolUseID || "";
499
501
  sendToDaemon({
500
502
  type: "ask_user_request",
@@ -511,11 +513,16 @@ async function handleQueryStart(msg) {
511
513
  }
512
514
  });
513
515
  }
516
+ if (toolName === "AskUserQuestion") {
517
+ return Promise.resolve({ behavior: "deny", message: "Use the query's structured input fallback tool." });
518
+ }
514
519
  return canUseTool(toolName, input, toolOpts);
515
520
  };
516
- options.onElicitation = function(request, elicitOpts) {
517
- return onElicitation(request, elicitOpts);
518
- };
521
+ if (nativeUserInput) {
522
+ options.onElicitation = function(request, elicitOpts) {
523
+ return onElicitation(request, elicitOpts);
524
+ };
525
+ }
519
526
  // supportedDialogKinds arrives serialized via msg.options (already on `options`);
520
527
  // the callback is non-serializable so we wire it here.
521
528
  options.onUserDialog = function(request, dialogOpts) {
@@ -12,6 +12,7 @@ var crypto = require("crypto");
12
12
  var { spawn } = require("child_process");
13
13
  var { resolveOsUserInfo } = require("../../os-users");
14
14
  var skillDiscovery = require("../skill-discovery");
15
+ var claudeUserInput = require("../claude-user-input");
15
16
 
16
17
  // SDK-specific knowledge stays in the adapter (not the relay): the host dialog
17
18
  // kinds this client can render, declared to the SDK when an onUserDialog
@@ -19,6 +20,49 @@ var skillDiscovery = require("../skill-discovery");
19
20
  // emitted. Keep in sync with the client's generic user-dialog renderer.
20
21
  var SUPPORTED_DIALOG_KINDS = ["refusal_fallback_prompt"];
21
22
 
23
+ // Clay renders a per-task Stop control in the composer's background-tasks bar
24
+ // (public/modules/background-tasks-ui.js), wired through project-sessions.js
25
+ // `stop_task` -> adapter.stopTask -> rawQuery.stopTask (worker path: the
26
+ // stop_task message in claude-worker.js). Declaring that affordance makes an
27
+ // interrupt spare running background tasks so Stop only aborts the current
28
+ // turn. The CLI fails CLOSED on absence: without this, every interrupt would
29
+ // also kill background tasks, since a consumer with no per-task control could
30
+ // not otherwise stop a runaway one.
31
+ //
32
+ // Declared identically on the in-process and OS-user worker paths. The CLI
33
+ // takes first-attached-client-wins on multi-client sessions, so the two paths
34
+ // must not disagree, or which one connected first would decide whether Stop
35
+ // kills background work.
36
+ var PER_TASK_STOP_AFFORDANCE = true;
37
+
38
+ // --- System prompt recording (SDK `snapshot`) ---
39
+ // Records the conversation's system prompt once and replays it verbatim on
40
+ // every later request and resume, which keeps the prompt-cache prefix and
41
+ // extended-thinking context stable across CLI upgrades and flag changes.
42
+ //
43
+ // OFF for Clay's persistent sessions, deliberately. getSessionSystemPrompt
44
+ // (project.js) recomposes the append from live state every time the query is
45
+ // rebuilt - sticky notes, pair/Driver role, and the Mate Capsule catalog - and
46
+ // three call sites exist purely to force that re-render mid-conversation
47
+ // (project-capsule-catalog.js refreshSessions, project.js pair regrouping,
48
+ // sdk-bridge refreshEnvironmentRuntime). Because Clay resumes those
49
+ // conversations, a recorded prompt would pin the first render and silently
50
+ // swallow every later update until compaction.
51
+ //
52
+ // Callers whose prompt is fixed for the life of the conversation opt in with
53
+ // queryOpts.systemPromptSnapshot. A bare string prompt cannot be recorded, so
54
+ // it is promoted to the custom form the SDK requires.
55
+ function applySystemPromptSnapshot(systemPrompt, enabled) {
56
+ if (!enabled || !systemPrompt) return systemPrompt;
57
+ if (typeof systemPrompt === "string" || Array.isArray(systemPrompt)) {
58
+ return { type: "custom", prompt: systemPrompt, snapshot: true };
59
+ }
60
+ if (typeof systemPrompt === "object") {
61
+ return Object.assign({}, systemPrompt, { snapshot: true });
62
+ }
63
+ return systemPrompt;
64
+ }
65
+
22
66
  function getSharedSkillPlugins(homeDir, existingPlugins) {
23
67
  var plugins = Array.isArray(existingPlugins) ? existingPlugins.slice() : [];
24
68
  var bridgePath = skillDiscovery.ensureClaudeCodexPlugin(homeDir ? { homeDir: homeDir } : null);
@@ -26,6 +70,42 @@ function getSharedSkillPlugins(homeDir, existingPlugins) {
26
70
  return plugins;
27
71
  }
28
72
 
73
+ function buildWorkerQueryOptions(queryOpts, claudeOpts, workerCwd) {
74
+ var queryOptions = {
75
+ cwd: workerCwd,
76
+ userInputMode: queryOpts.userInputMode || "auto",
77
+ };
78
+ if (queryOpts.env) queryOptions.env = queryOpts.env;
79
+ queryOptions.settingSources = claudeOpts.settingSources || ["user", "project", "local"];
80
+ if (queryOpts.title) queryOptions.title = queryOpts.title;
81
+ if (claudeOpts.includePartialMessages != null) queryOptions.includePartialMessages = claudeOpts.includePartialMessages;
82
+ if (claudeOpts.enableFileCheckpointing != null) queryOptions.enableFileCheckpointing = claudeOpts.enableFileCheckpointing;
83
+ if (claudeOpts.extraArgs) queryOptions.extraArgs = claudeOpts.extraArgs;
84
+ if (claudeOpts.promptSuggestions != null) queryOptions.promptSuggestions = claudeOpts.promptSuggestions;
85
+ if (claudeOpts.agentProgressSummaries != null) queryOptions.agentProgressSummaries = claudeOpts.agentProgressSummaries;
86
+ if (claudeOpts.thinking) queryOptions.thinking = claudeOpts.thinking;
87
+ if (claudeOpts.betas && claudeOpts.betas.length > 0) queryOptions.betas = claudeOpts.betas;
88
+ if (claudeOpts.permissionMode) queryOptions.permissionMode = claudeOpts.permissionMode;
89
+ if (claudeOpts.allowDangerouslySkipPermissions) queryOptions.allowDangerouslySkipPermissions = true;
90
+ if (claudeOpts.settings) queryOptions.settings = claudeOpts.settings;
91
+ if (queryOpts.appendSystemPrompt) {
92
+ queryOptions.systemPrompt = applySystemPromptSnapshot(
93
+ { type: "preset", preset: "claude_code", append: queryOpts.appendSystemPrompt },
94
+ queryOpts.systemPromptSnapshot
95
+ );
96
+ }
97
+ queryOptions.plugins = queryOpts.skipSkills ? (claudeOpts.plugins || []) : getSharedSkillPlugins(claudeOpts.originalHome, claudeOpts.plugins);
98
+ if (queryOpts.toolServerDescriptors) queryOptions.mcpServerDescriptors = queryOpts.toolServerDescriptors;
99
+ if (queryOpts.onUserDialog) queryOptions.supportedDialogKinds = SUPPORTED_DIALOG_KINDS;
100
+ queryOptions.perTaskStopAffordance = PER_TASK_STOP_AFFORDANCE;
101
+ if (queryOpts.model) queryOptions.model = queryOpts.model;
102
+ if (queryOpts.effort) queryOptions.effort = queryOpts.effort;
103
+ if (queryOpts.resumeSessionId) queryOptions.resume = queryOpts.resumeSessionId;
104
+ if (queryOpts.persistSession === false) queryOptions.persistSession = false;
105
+ if (claudeOpts.resumeSessionAt) queryOptions.resumeSessionAt = claudeOpts.resumeSessionAt;
106
+ return queryOptions;
107
+ }
108
+
29
109
  // --- SDK loading ---
30
110
  // Async loader (ESM dynamic import, same pattern as current project.js getSDK)
31
111
  var _sdkPromise = null;
@@ -369,11 +449,21 @@ function normalizeBackgroundTasks(tasks) {
369
449
  var nativeType = task && task.task_type;
370
450
  var taskType = nativeType === "local_bash" ? "shell"
371
451
  : nativeType === "local_agent" ? "agent" : "other";
372
- return {
452
+ var normalized = {
373
453
  task_id: task && task.task_id,
374
454
  task_type: taskType,
375
455
  description: (task && task.description) || "",
456
+ // Housekeeping the CLI does not surface as user work (skip_transcript
457
+ // tasks, auto-started live-update watchers). Clay keeps these out of its
458
+ // activity indicators and lists them as a subdued secondary group.
459
+ // Normalized to a boolean so consumers never have to test for absence.
460
+ ambient: !!(task && task.ambient),
376
461
  };
462
+ // The SDK does not report a start time today. Forward one if a future
463
+ // version adds it; otherwise the session stamps first-seen time.
464
+ var startedAt = task && (task.started_at || task.startedAt || task.created_at);
465
+ if (startedAt) normalized.started_at = startedAt;
466
+ return normalized;
377
467
  });
378
468
  }
379
469
 
@@ -843,7 +933,7 @@ function serializeWorkerValue(value, seen) {
843
933
  // in-process QueryHandle. This allows processQueryStream to iterate a worker
844
934
  // query identically to an in-process query.
845
935
 
846
- function createWorkerQueryHandle(worker, canUseTool, onElicitation, callMcpTool, onUserDialog) {
936
+ function createWorkerQueryHandle(worker, canUseTool, onElicitation, callMcpTool, onUserDialog, onUserInputRequest) {
847
937
  // Async iterable state
848
938
  var iterQueue = [];
849
939
  var iterWaiting = null;
@@ -910,8 +1000,8 @@ function createWorkerQueryHandle(worker, canUseTool, onElicitation, callMcpTool,
910
1000
  break;
911
1001
 
912
1002
  case "ask_user_request":
913
- if (canUseTool) {
914
- canUseTool("AskUserQuestion", msg.input, {
1003
+ if (onUserInputRequest) {
1004
+ claudeUserInput.ask(onUserInputRequest, msg.input, {
915
1005
  toolUseID: msg.toolUseId,
916
1006
  signal: { addEventListener: function() {} },
917
1007
  }).then(function(result) {
@@ -923,17 +1013,24 @@ function createWorkerQueryHandle(worker, canUseTool, onElicitation, callMcpTool,
923
1013
  break;
924
1014
 
925
1015
  case "elicitation_request":
926
- if (onElicitation) {
927
- onElicitation({
1016
+ if (onUserInputRequest || onElicitation) {
1017
+ var workerElicitationRequest = {
928
1018
  serverName: msg.serverName,
929
1019
  message: msg.message,
930
1020
  mode: msg.mode,
931
1021
  url: msg.url,
932
1022
  elicitationId: msg.elicitationId,
933
1023
  requestedSchema: msg.requestedSchema,
934
- }, {
1024
+ };
1025
+ var workerElicitation = onUserInputRequest
1026
+ ? claudeUserInput.elicitation(onUserInputRequest, workerElicitationRequest, {
1027
+ requestId: msg.requestId,
1028
+ signal: { addEventListener: function() {} },
1029
+ })
1030
+ : onElicitation(workerElicitationRequest, {
935
1031
  signal: { addEventListener: function() {} },
936
- }).then(function(result) {
1032
+ });
1033
+ workerElicitation.then(function(result) {
937
1034
  worker.send({ type: "elicitation_response", requestId: msg.requestId, result: result });
938
1035
  }).catch(function(e) {
939
1036
  console.error("[yoke/claude] elicitation_response send failed:", e.message || e);
@@ -1206,12 +1303,14 @@ function createClaudeAdapter(opts) {
1206
1303
  var _cwd = (opts && opts.cwd) || process.cwd();
1207
1304
  var _cachedModels = [];
1208
1305
  var _claudeBinaryPath = resolveClaudeBinaryPath();
1306
+ var _querySDK = (opts && opts.loadSDK) || loadSDK;
1209
1307
 
1210
1308
  // Path to the worker script (for OS-level user isolation)
1211
1309
  var workerScriptPath = path.join(__dirname, "claude-worker.js");
1212
1310
 
1213
1311
  var adapter = {
1214
1312
  vendor: "claude",
1313
+ userInputCapability: { mode: "native", native: true, transport: "AskUserQuestion/onElicitation" },
1215
1314
 
1216
1315
  // Path to worker script (sdk-bridge uses this to spawn worker processes)
1217
1316
  workerScriptPath: workerScriptPath,
@@ -1396,7 +1495,7 @@ function createClaudeAdapter(opts) {
1396
1495
  }
1397
1496
 
1398
1497
  // In-process path
1399
- var sdk = await loadSDK();
1498
+ var sdk = await _querySDK();
1400
1499
  var mq = createMessageQueue();
1401
1500
  var ac = queryOpts.abortController || new AbortController();
1402
1501
 
@@ -1405,26 +1504,39 @@ function createClaudeAdapter(opts) {
1405
1504
  cwd: queryOpts.cwd || _cwd,
1406
1505
  abortController: ac,
1407
1506
  };
1507
+ if (queryOpts.env) sdkOptions.env = queryOpts.env;
1408
1508
  if (_claudeBinaryPath) sdkOptions.pathToClaudeCodeExecutable = _claudeBinaryPath;
1409
1509
 
1410
1510
  // YOKE standard options -> SDK options
1411
- if (queryOpts.systemPrompt) sdkOptions.systemPrompt = queryOpts.systemPrompt;
1511
+ if (queryOpts.systemPrompt) {
1512
+ sdkOptions.systemPrompt = applySystemPromptSnapshot(queryOpts.systemPrompt, queryOpts.systemPromptSnapshot);
1513
+ }
1412
1514
  // Additive variant: keep the full Claude Code system prompt and append.
1413
1515
  // A plain-string systemPrompt REPLACES the whole prompt, so pair
1414
1516
  // presets and other add-ons must come through here instead.
1415
1517
  if (!queryOpts.systemPrompt && queryOpts.appendSystemPrompt) {
1416
- sdkOptions.systemPrompt = { type: "preset", preset: "claude_code", append: queryOpts.appendSystemPrompt };
1518
+ sdkOptions.systemPrompt = applySystemPromptSnapshot(
1519
+ { type: "preset", preset: "claude_code", append: queryOpts.appendSystemPrompt },
1520
+ queryOpts.systemPromptSnapshot
1521
+ );
1417
1522
  }
1418
1523
  if (queryOpts.model) sdkOptions.model = queryOpts.model;
1419
1524
  if (queryOpts.effort) sdkOptions.effort = queryOpts.effort;
1420
1525
  if (queryOpts.toolServers) sdkOptions.mcpServers = queryOpts.toolServers;
1421
- if (queryOpts.canUseTool) sdkOptions.canUseTool = queryOpts.canUseTool;
1422
- if (queryOpts.onElicitation) sdkOptions.onElicitation = queryOpts.onElicitation;
1526
+ var nativeUserInputHandler = queryOpts.userInputMode === "fallback" ? null : queryOpts.onUserInputRequest;
1527
+ if (queryOpts.canUseTool || nativeUserInputHandler) {
1528
+ sdkOptions.canUseTool = claudeUserInput.canUseTool(Object.assign({}, queryOpts, { onUserInputRequest: nativeUserInputHandler }));
1529
+ }
1530
+ if (nativeUserInputHandler) {
1531
+ sdkOptions.onElicitation = function (request, elicitOpts) { return claudeUserInput.elicitation(nativeUserInputHandler, request, elicitOpts); };
1532
+ } else if (queryOpts.userInputMode !== "fallback" && queryOpts.onElicitation) sdkOptions.onElicitation = queryOpts.onElicitation;
1423
1533
  if (queryOpts.onUserDialog) {
1424
1534
  sdkOptions.onUserDialog = queryOpts.onUserDialog;
1425
1535
  sdkOptions.supportedDialogKinds = SUPPORTED_DIALOG_KINDS;
1426
1536
  }
1537
+ sdkOptions.perTaskStopAffordance = PER_TASK_STOP_AFFORDANCE;
1427
1538
  if (queryOpts.resumeSessionId) sdkOptions.resume = queryOpts.resumeSessionId;
1539
+ if (queryOpts.persistSession === false) sdkOptions.persistSession = false;
1428
1540
 
1429
1541
  // Claude-specific options from adapterOptions.CLAUDE
1430
1542
  // Always set settingSources explicitly. SDK 0.2.119+ defaults to
@@ -1445,12 +1557,20 @@ function createClaudeAdapter(opts) {
1445
1557
  if (co.allowDangerouslySkipPermissions) sdkOptions.allowDangerouslySkipPermissions = true;
1446
1558
  if (co.resumeSessionAt) sdkOptions.resumeSessionAt = co.resumeSessionAt;
1447
1559
  if (co.settings) sdkOptions.settings = co.settings;
1448
- sdkOptions.plugins = getSharedSkillPlugins(co.originalHome, co.plugins);
1560
+ sdkOptions.plugins = queryOpts.skipSkills ? (co.plugins || []) : getSharedSkillPlugins(co.originalHome, co.plugins);
1449
1561
 
1450
1562
  var rawQuery = sdk.query({ prompt: mq, options: sdkOptions });
1451
1563
  return createQueryHandle(rawQuery, mq, ac);
1452
1564
  },
1453
1565
 
1566
+ createOneShotQuery: async function(queryOpts) {
1567
+ var handle = await adapter.createQuery(Object.assign({}, queryOpts || {}, {
1568
+ persistSession: false,
1569
+ resumeSessionId: null,
1570
+ }));
1571
+ return { handle: handle, backendPersistence: "ephemeral" };
1572
+ },
1573
+
1454
1574
  // --- Title generation ---
1455
1575
  generateTitle: async function(messages, opts) {
1456
1576
  console.log("[auto-title/claude] generateTitle called with " + messages.length + " messages");
@@ -1463,6 +1583,7 @@ function createClaudeAdapter(opts) {
1463
1583
  console.log("[auto-title/claude] Creating query with model=haiku...");
1464
1584
  var handle = await adapter.createQuery({
1465
1585
  cwd: (opts && opts.cwd) || _cwd,
1586
+ env: opts && opts.env,
1466
1587
  systemPrompt: systemPrompt,
1467
1588
  model: "haiku",
1468
1589
  adapterOptions: {
@@ -1573,44 +1694,17 @@ function createClaudeAdapter(opts) {
1573
1694
  }
1574
1695
 
1575
1696
  // Create the worker query handle (sets up message handler on worker)
1576
- var handle = createWorkerQueryHandle(worker, queryOpts.canUseTool, queryOpts.onElicitation, queryOpts.callMcpTool, queryOpts.onUserDialog);
1697
+ var workerUserInputHandler = queryOpts.userInputMode === "fallback" ? null : queryOpts.onUserInputRequest;
1698
+ var workerElicitationHandler = queryOpts.userInputMode === "fallback" ? null : queryOpts.onElicitation;
1699
+ var handle = createWorkerQueryHandle(worker, queryOpts.canUseTool, workerElicitationHandler, queryOpts.callMcpTool, queryOpts.onUserDialog, workerUserInputHandler);
1577
1700
 
1578
1701
  // Wait for worker to be ready before sending query_start
1579
1702
  if (!reusingWorker) {
1580
1703
  await worker.readyPromise;
1581
1704
  }
1582
1705
 
1583
- // Build serializable query options (no callbacks, no AbortController)
1584
- var queryOptions = {
1585
- cwd: workerCwd,
1586
- };
1587
- // Always set settingSources explicitly. See in-process path comment
1588
- // above for the SDK 0.2.119+ default-change rationale.
1589
- queryOptions.settingSources = claudeOpts.settingSources || ["user", "project", "local"];
1590
- if (queryOpts.title) queryOptions.title = queryOpts.title;
1591
- if (claudeOpts.includePartialMessages != null) queryOptions.includePartialMessages = claudeOpts.includePartialMessages;
1592
- if (claudeOpts.enableFileCheckpointing != null) queryOptions.enableFileCheckpointing = claudeOpts.enableFileCheckpointing;
1593
- if (claudeOpts.extraArgs) queryOptions.extraArgs = claudeOpts.extraArgs;
1594
- if (claudeOpts.promptSuggestions != null) queryOptions.promptSuggestions = claudeOpts.promptSuggestions;
1595
- if (claudeOpts.agentProgressSummaries != null) queryOptions.agentProgressSummaries = claudeOpts.agentProgressSummaries;
1596
- if (claudeOpts.thinking) queryOptions.thinking = claudeOpts.thinking;
1597
- if (claudeOpts.betas && claudeOpts.betas.length > 0) queryOptions.betas = claudeOpts.betas;
1598
- if (claudeOpts.permissionMode) queryOptions.permissionMode = claudeOpts.permissionMode;
1599
- if (claudeOpts.allowDangerouslySkipPermissions) queryOptions.allowDangerouslySkipPermissions = true;
1600
- if (claudeOpts.settings) queryOptions.settings = claudeOpts.settings;
1601
- // Same additive mapping as the in-process path: never pass a plain
1602
- // string (it would replace the whole Claude Code system prompt).
1603
- if (queryOpts.appendSystemPrompt) {
1604
- queryOptions.systemPrompt = { type: "preset", preset: "claude_code", append: queryOpts.appendSystemPrompt };
1605
- }
1606
- queryOptions.plugins = getSharedSkillPlugins(claudeOpts.originalHome, claudeOpts.plugins);
1607
-
1608
- if (queryOpts.toolServerDescriptors) queryOptions.mcpServerDescriptors = queryOpts.toolServerDescriptors;
1609
- if (queryOpts.onUserDialog) queryOptions.supportedDialogKinds = SUPPORTED_DIALOG_KINDS;
1610
- if (queryOpts.model) queryOptions.model = queryOpts.model;
1611
- if (queryOpts.effort) queryOptions.effort = queryOpts.effort;
1612
- if (queryOpts.resumeSessionId) queryOptions.resume = queryOpts.resumeSessionId;
1613
- if (claudeOpts.resumeSessionAt) queryOptions.resumeSessionAt = claudeOpts.resumeSessionAt;
1706
+ // Build serializable query options (no callbacks, no AbortController).
1707
+ var queryOptions = buildWorkerQueryOptions(queryOpts, claudeOpts, workerCwd);
1614
1708
 
1615
1709
  // Send query_start; the caller pushes the initial message via handle.pushMessage()
1616
1710
  // which routes through worker IPC.
@@ -1868,6 +1962,7 @@ module.exports = {
1868
1962
  hasWritableWorkerConnection: hasWritableWorkerConnection,
1869
1963
  sendWorkerMessage: sendWorkerMessage,
1870
1964
  canReuseWorker: canReuseWorker,
1965
+ buildWorkerQueryOptions: buildWorkerQueryOptions,
1871
1966
  normalizeEvent: flattenEvent,
1872
1967
  },
1873
1968
  };