clay-server 3.8.1 → 4.0.0-beta.2

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 (189) hide show
  1. package/lib/ask-user-mcp-server.js +5 -119
  2. package/lib/builtin-mates.js +6 -6
  3. package/lib/claude-hook-installer.js +15 -0
  4. package/lib/clay-history-mcp-server.js +62 -297
  5. package/lib/daemon.js +1 -1
  6. package/lib/debate-model-selection.js +119 -0
  7. package/lib/home-debate-tool-policy.js +164 -0
  8. package/lib/home-response-notifications.js +26 -0
  9. package/lib/mate-creation-mcp-server.js +55 -0
  10. package/lib/mate-ready-creation.js +95 -0
  11. package/lib/mates.js +2 -0
  12. package/lib/notes.js +2 -1
  13. package/lib/project-ask-user.js +64 -0
  14. package/lib/project-capsule-catalog.js +101 -0
  15. package/lib/project-connection.js +4 -0
  16. package/lib/project-debate-proposal.js +133 -17
  17. package/lib/project-debate.js +214 -110
  18. package/lib/project-delegated-follow-up.js +84 -0
  19. package/lib/project-delegated-session.js +53 -0
  20. package/lib/project-filesystem.js +7 -9
  21. package/lib/project-knowledge.js +1 -0
  22. package/lib/project-mate-creation-proposal.js +120 -0
  23. package/lib/project-memory.js +14 -7
  24. package/lib/project-models.js +157 -32
  25. package/lib/project-session-notes.js +2 -2
  26. package/lib/project-session-pair.js +8 -8
  27. package/lib/project-sessions.js +66 -51
  28. package/lib/project-vendor-login.js +397 -0
  29. package/lib/project-worker-proposal.js +25 -25
  30. package/lib/project-workspace-query.js +144 -0
  31. package/lib/project.js +349 -102
  32. package/lib/public/app.js +85 -42
  33. package/lib/public/css/avatar-imprints.css +0 -1
  34. package/lib/public/css/base.css +4 -0
  35. package/lib/public/css/capsule-ui.css +389 -0
  36. package/lib/public/css/command-palette.css +306 -6
  37. package/lib/public/css/home-capsule-library.css +243 -0
  38. package/lib/public/css/home-capsule-source.css +192 -0
  39. package/lib/public/css/home-debate-live.css +146 -0
  40. package/lib/public/css/home-debate-planning.css +125 -0
  41. package/lib/public/css/home-debates-archive.css +281 -0
  42. package/lib/public/css/home-hub.css +896 -405
  43. package/lib/public/css/home-mate-creation.css +34 -0
  44. package/lib/public/css/home-mate-model-picker.css +131 -0
  45. package/lib/public/css/home-mate-settings.css +344 -0
  46. package/lib/public/css/home-session-actions.css +265 -0
  47. package/lib/public/css/home-sidebar.css +667 -0
  48. package/lib/public/css/icon-strip.css +1 -2
  49. package/lib/public/css/mates.css +7 -34
  50. package/lib/public/css/pane.css +1 -1
  51. package/lib/public/css/playbook.css +0 -80
  52. package/lib/public/css/sticky-notes.css +53 -117
  53. package/lib/public/css/tui-attention.css +0 -44
  54. package/lib/public/css/workspace-assignment.css +45 -0
  55. package/lib/public/fonts/source-serif-4/LICENSE.md +93 -0
  56. package/lib/public/fonts/source-serif-4/SourceSerif4Caption-Semibold.ttf.woff2 +0 -0
  57. package/lib/public/index.html +93 -74
  58. package/lib/public/modules/app-connection.js +10 -1
  59. package/lib/public/modules/app-dm.js +43 -160
  60. package/lib/public/modules/app-home-hub.js +328 -585
  61. package/lib/public/modules/app-message-cards.js +242 -0
  62. package/lib/public/modules/app-message-router.js +84 -0
  63. package/lib/public/modules/app-messages.js +102 -37
  64. package/lib/public/modules/app-notifications.js +8 -119
  65. package/lib/public/modules/app-projects.js +9 -1
  66. package/lib/public/modules/app-rendering.js +21 -602
  67. package/lib/public/modules/avatar-imprint.js +11 -8
  68. package/lib/public/modules/chat-bubble-renderer.js +152 -0
  69. package/lib/public/modules/chat-render-runtime.js +198 -0
  70. package/lib/public/modules/command-palette.js +225 -436
  71. package/lib/public/modules/dm-render.js +82 -0
  72. package/lib/public/modules/home-capsule-creation-intent.js +31 -0
  73. package/lib/public/modules/home-capsule-library.js +146 -0
  74. package/lib/public/modules/home-capsule-source.js +383 -0
  75. package/lib/public/modules/home-chat-identity.js +35 -0
  76. package/lib/public/modules/home-chat-scroll.js +77 -0
  77. package/lib/public/modules/home-chat-stream-state.js +34 -0
  78. package/lib/public/modules/home-composer-focus.js +25 -0
  79. package/lib/public/modules/home-conversations-sheet.js +179 -0
  80. package/lib/public/modules/home-debate-activity.js +48 -0
  81. package/lib/public/modules/home-debate-controls.js +295 -0
  82. package/lib/public/modules/home-debate-launch.js +41 -0
  83. package/lib/public/modules/home-debate-live.js +284 -0
  84. package/lib/public/modules/home-debate-models.js +73 -0
  85. package/lib/public/modules/home-debate-planning.js +335 -0
  86. package/lib/public/modules/home-debates-archive.js +279 -0
  87. package/lib/public/modules/home-dock-resize.js +74 -0
  88. package/lib/public/modules/home-dock.js +446 -0
  89. package/lib/public/modules/home-mate-chat.js +496 -0
  90. package/lib/public/modules/home-mate-creation.js +109 -0
  91. package/lib/public/modules/home-mate-model-picker.js +281 -0
  92. package/lib/public/modules/home-mate-selection.js +38 -0
  93. package/lib/public/modules/home-mate-settings-menu.js +131 -0
  94. package/lib/public/modules/home-mate-settings.js +383 -0
  95. package/lib/public/modules/home-session-actions.js +373 -0
  96. package/lib/public/modules/home-session-model-confirmation.js +13 -0
  97. package/lib/public/modules/home-shell.js +9 -0
  98. package/lib/public/modules/home-sidebar-chat-list.js +63 -0
  99. package/lib/public/modules/home-sidebar.js +158 -0
  100. package/lib/public/modules/home-sub-surface.js +19 -0
  101. package/lib/public/modules/home-surface-boot.js +68 -0
  102. package/lib/public/modules/home-surface.js +141 -0
  103. package/lib/public/modules/home-tools.js +271 -0
  104. package/lib/public/modules/markdown.js +50 -2
  105. package/lib/public/modules/mate-management.js +86 -0
  106. package/lib/public/modules/mate-wizard.js +0 -7
  107. package/lib/public/modules/mention.js +17 -19
  108. package/lib/public/modules/pane-bridge.js +9 -0
  109. package/lib/public/modules/profile.js +4 -5
  110. package/lib/public/modules/project-settings.js +34 -28
  111. package/lib/public/modules/project-switcher.js +11 -5
  112. package/lib/public/modules/project-workspace-assignment.js +23 -0
  113. package/lib/public/modules/search-clay-chat.js +402 -0
  114. package/lib/public/modules/server-settings.js +14 -12
  115. package/lib/public/modules/session-actions.js +1 -1
  116. package/lib/public/modules/sidebar-mates.js +56 -552
  117. package/lib/public/modules/sidebar-mobile.js +7 -64
  118. package/lib/public/modules/sidebar-presence.js +37 -0
  119. package/lib/public/modules/split-pair-ui.js +13 -13
  120. package/lib/public/modules/split-view.js +7 -0
  121. package/lib/public/modules/sticky-notes.js +7 -6
  122. package/lib/public/modules/tool-input-composition.js +48 -0
  123. package/lib/public/modules/tool-llm-status.js +167 -0
  124. package/lib/public/modules/tool-renderer-advanced.js +285 -0
  125. package/lib/public/modules/tool-renderer-chart.js +158 -0
  126. package/lib/public/modules/tool-renderer-semantics.js +35 -0
  127. package/lib/public/modules/tool-renderer.js +464 -0
  128. package/lib/public/modules/tool-runtime.js +309 -0
  129. package/lib/public/modules/tool-ui-evaluator.js +97 -0
  130. package/lib/public/modules/tool-ui-tree.js +21 -0
  131. package/lib/public/modules/tui-attention.js +10 -0
  132. package/lib/public/modules/user-settings.js +16 -23
  133. package/lib/public/modules/vendor-login.js +287 -0
  134. package/lib/public/modules/worker-proposal.js +2 -2
  135. package/lib/public/modules/workspace-assignment-card.js +149 -0
  136. package/lib/public/modules/workspace-assignment-routing.js +4 -0
  137. package/lib/public/style.css +13 -2
  138. package/lib/runtime-env.js +65 -0
  139. package/lib/sdk-bridge.js +120 -32
  140. package/lib/sdk-message-processor.js +10 -6
  141. package/lib/server-home-capsule-creation.js +36 -0
  142. package/lib/server-home-chat-events.js +287 -0
  143. package/lib/server-home-chat.js +518 -0
  144. package/lib/server-home-clay-entry.js +65 -0
  145. package/lib/server-home-clay-session-links.js +26 -0
  146. package/lib/server-home-debate-planning.js +214 -0
  147. package/lib/server-home-debates.js +137 -0
  148. package/lib/server-home-mate-creation.js +261 -0
  149. package/lib/server-home-models.js +241 -0
  150. package/lib/server-home-preferences.js +61 -0
  151. package/lib/server-mates.js +37 -0
  152. package/lib/server-tools.js +377 -0
  153. package/lib/server.js +111 -59
  154. package/lib/session-pair-mcp-server.js +6 -6
  155. package/lib/sessions.js +18 -3
  156. package/lib/tool-capsule-source.js +142 -0
  157. package/lib/tool-control-mcp-server.js +126 -0
  158. package/lib/tool-llm.js +48 -0
  159. package/lib/tool-storage.js +77 -0
  160. package/lib/tool-ui-spec-advanced.js +82 -0
  161. package/lib/tool-ui-spec.js +261 -0
  162. package/lib/tools-registry.js +286 -0
  163. package/lib/users-home-dock-preferences.js +77 -0
  164. package/lib/users-home-surface-preferences.js +99 -0
  165. package/lib/users-preferences.js +4 -7
  166. package/lib/users.js +12 -0
  167. package/lib/whats-new-content.js +3 -3
  168. package/lib/workspace-assignment-service.js +420 -0
  169. package/lib/workspace-query-mcp-server.js +154 -0
  170. package/lib/workspace-query-service.js +492 -0
  171. package/lib/ws-schema.js +93 -12
  172. package/lib/yoke/adapters/acp.js +2 -1
  173. package/lib/yoke/adapters/antigravity.js +2 -1
  174. package/lib/yoke/adapters/claude-worker.js +11 -4
  175. package/lib/yoke/adapters/claude.js +73 -43
  176. package/lib/yoke/adapters/codex.js +40 -10
  177. package/lib/yoke/adapters/kiro.js +2 -1
  178. package/lib/yoke/claude-user-input.js +38 -0
  179. package/lib/yoke/codex-app-server.js +20 -2
  180. package/lib/yoke/codex-user-input.js +64 -0
  181. package/lib/yoke/complete-once.js +164 -0
  182. package/lib/yoke/index.js +5 -1
  183. package/lib/yoke/interface.js +19 -0
  184. package/lib/yoke/mcp-bridge-server.js +2 -6
  185. package/lib/yoke/user-input.js +254 -0
  186. package/package.json +3 -2
  187. package/lib/public/css/home-chat.css +0 -380
  188. package/lib/public/modules/home-chat.js +0 -438
  189. 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
@@ -435,6 +458,30 @@ var schema = {
435
458
  "mate_available_builtins": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Available built-in mates list" },
436
459
  "mate_error": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Mate operation error" },
437
460
 
461
+ // -----------------------------------------------------------------------
462
+ // User-installed home tools
463
+ // -----------------------------------------------------------------------
464
+ "tools_list": { direction: "c2s", handler: "lib/server-tools.js", description: "List installed tool definitions" },
465
+ "tool_get": { direction: "c2s", handler: "lib/server-tools.js", description: "Get one installed tool definition" },
466
+ "tool_install": { direction: "c2s", handler: "lib/server-tools.js", description: "Install a new declarative tool" },
467
+ "tool_source_get": { direction: "c2s", handler: "lib/server-tools.js", description: "Read authored Capsule source for the current user" },
468
+ "tool_mate_access_set": { direction: "c2s", handler: "lib/server-tools.js", description: "Set whether Mates may inspect and edit one Capsule" },
469
+ "tool_remove": { direction: "c2s", handler: "lib/server-tools.js", description: "Remove an installed tool" },
470
+ "tool_storage_op": { direction: "c2s", handler: "lib/server-tools.js", description: "Run an operation against scoped tool storage" },
471
+ "tool_llm_op": { direction: "c2s", handler: "lib/server-tools.js", description: "Run a permission-gated vendor-neutral capsule LLM completion" },
472
+ "tool_llm_config_get": { direction: "c2s", handler: "lib/server-tools.js", description: "Get the concrete configured provider and model used by Capsule LLM calls" },
473
+ "tool_control_response": { direction: "c2s", handler: "lib/server-tools.js", description: "Resolve a mate tool-control request with browser runtime state or an error" },
474
+ "tools_state": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Full installed tool definitions" },
475
+ "tool_installed": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "An installed tool changed" },
476
+ "tool_source_state": { direction: "s2c", handler: "lib/public/modules/home-capsule-source.js", description: "Correlated authored Capsule source or read error" },
477
+ "tool_mate_access_state": { direction: "s2c", handler: "lib/public/modules/home-capsule-source.js", description: "Server-confirmed Mate editing permission" },
478
+ "tool_removed": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "An installed tool was removed" },
479
+ "tool_storage_result": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Result of a scoped tool storage operation" },
480
+ "tool_llm_result": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Result of a capsule LLM completion" },
481
+ "tool_llm_config_state": { direction: "s2c", handler: "lib/public/modules/tool-llm-status.js", description: "Concrete provider and model state for Capsule LLM calls" },
482
+ "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" },
483
+ "tools_error": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Tool registry, runtime, or storage error" },
484
+
438
485
  // -----------------------------------------------------------------------
439
486
  // Mentions (@mate)
440
487
  // -----------------------------------------------------------------------
@@ -458,7 +505,7 @@ var schema = {
458
505
  "debate_stop": { direction: "c2s", handler: "lib/project.js", description: "Stop the current debate" },
459
506
  "debate_conclude_response": { direction: "c2s", handler: "lib/project.js", description: "Respond to a debate conclude prompt (end or continue)" },
460
507
  "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" },
508
+ "debate_proposal_response": { direction: "c2s", handler: "lib/project.js", description: "Respond to a debate proposal with optional per-participant model overrides" },
462
509
  "debate_user_floor_response": { direction: "c2s", handler: "lib/project.js", description: "User submits their statement during user floor turn" },
463
510
  "debate_preparing": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Debate is being prepared" },
464
511
  "debate_brief_ready": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Debate brief is ready for user approval" },
@@ -467,6 +514,9 @@ var schema = {
467
514
  "debate_activity": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Debate panelist activity indicator" },
468
515
  "debate_stream": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Incremental debate response text" },
469
516
  "debate_turn_done": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Debate turn completed with full text" },
517
+ "debate_tool_decision": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Moderator tool permission decision for a debate participant" },
518
+ "debate_stop_requested": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Debate will stop after the active turn" },
519
+ "debate_stop_cancelled": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Pending debate stop was cancelled" },
470
520
  "debate_hand_raised": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "User hand raise was acknowledged" },
471
521
  "debate_comment_queued": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "User comment was queued for injection" },
472
522
  "debate_comment_injected": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "User comment was injected into the debate" },
@@ -556,16 +606,47 @@ var schema = {
556
606
  "ralph_files_content": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Loop file contents (prompt and judge)" },
557
607
 
558
608
  // -----------------------------------------------------------------------
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" }
609
+ // Embedded mate chat
610
+ // -----------------------------------------------------------------------
611
+ "home_mate_open": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Open or restore the selected mate's embedded chat session" },
612
+ "home_clay_ask": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Start a fresh builtin Clay conversation from the global search drawer" },
613
+ "home_mate_sessions_list": { direction: "c2s", handler: "lib/server-home-chat.js", description: "List the current user's conversations with the selected mate" },
614
+ "home_mate_session_open": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Open one explicit conversation with the selected mate" },
615
+ "home_mate_send": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Send a message to the selected mate from the home hub" },
616
+ "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" },
617
+ "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" },
618
+ "home_mate_creation_plan": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Start a fresh server-seeded Mate creation interview with Clay" },
619
+ "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" },
620
+ "home_mate_creation_proposal_response": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Approve or cancel an exact Mate creation proposal" },
621
+ "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" },
622
+ "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" },
623
+ "home_debate_control": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Control or resume the exact owned Home debate session" },
624
+ "home_mate_close": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Tear down the embedded mate session tap" },
625
+ "home_mate_present": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Report whether Home is visibly presenting its active exact Mate conversation" },
626
+ "home_mate_memory_list": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Request a correlated read-only memory projection for one owned Mate" },
627
+ "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" },
628
+ "home_mate_models_get": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Request an available vendor and model catalog for the selected Mate" },
629
+ "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" },
630
+ "home_mate_history": { direction: "s2c", handler: "lib/public/modules/home-mate-chat.js", description: "Selected mate's initial or refreshed chat history" },
631
+ "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" },
632
+ "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" },
633
+ "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" },
634
+ "home_mate_delta": { direction: "s2c", handler: "lib/public/modules/home-mate-chat.js", description: "Selected mate's streaming assistant text delta" },
635
+ "home_mate_done": { direction: "s2c", handler: "lib/public/modules/home-mate-chat.js", description: "Selected mate's turn finished" },
636
+ "home_debate_proposal": { direction: "s2c", handler: "lib/public/modules/app-message-router.js", description: "Session-bound debate proposal for the active Home transcript" },
637
+ "home_debate_proposal_resolved": { direction: "s2c", handler: "lib/public/modules/app-message-router.js", description: "Server-confirmed result for a Home debate proposal" },
638
+ "home_debate_question": { direction: "s2c", handler: "lib/public/modules/app-message-router.js", description: "Session-bound AskUserQuestion card for Home debate planning" },
639
+ "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" },
640
+ "home_debate_event": { direction: "s2c", handler: "lib/public/modules/app-message-router.js", description: "Correlated live debate event for the active Home transcript" },
641
+ "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" },
642
+ "home_mate_creation_question_resolved": { direction: "s2c", handler: "lib/public/modules/app-message-router.js", description: "Server-confirmed Mate interview answer or expiry" },
643
+ "home_mate_creation_proposal": { direction: "s2c", handler: "lib/public/modules/app-message-router.js", description: "Session-bound new Mate proposal" },
644
+ "home_mate_creation_proposal_resolved": { direction: "s2c", handler: "lib/public/modules/app-message-router.js", description: "Server-confirmed result for a Mate creation proposal" },
645
+ "home_mate_error": { direction: "s2c", handler: "lib/public/modules/home-mate-chat.js", description: "Embedded mate chat error" },
646
+ "home_mate_memory_state": { direction: "s2c", handler: "lib/public/modules/home-mate-settings.js", description: "Selected mate's read-only memory summary and entries" },
647
+ "home_mate_knowledge_state": { direction: "s2c", handler: "lib/public/modules/home-mate-settings.js", description: "Selected mate's read-only knowledge file list" },
648
+ "home_mate_models_state": { direction: "s2c", handler: "lib/public/modules/home-mate-settings.js", description: "Correlated Mate model catalog state" },
649
+ "home_mate_model_result": { direction: "s2c", handler: "lib/public/modules/home-mate-settings.js", description: "Correlated Mate model selection result" }
569
650
  };
570
651
 
571
652
  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
@@ -26,6 +27,36 @@ function getSharedSkillPlugins(homeDir, existingPlugins) {
26
27
  return plugins;
27
28
  }
28
29
 
30
+ function buildWorkerQueryOptions(queryOpts, claudeOpts, workerCwd) {
31
+ var queryOptions = {
32
+ cwd: workerCwd,
33
+ userInputMode: queryOpts.userInputMode || "auto",
34
+ };
35
+ if (queryOpts.env) queryOptions.env = queryOpts.env;
36
+ queryOptions.settingSources = claudeOpts.settingSources || ["user", "project", "local"];
37
+ if (queryOpts.title) queryOptions.title = queryOpts.title;
38
+ if (claudeOpts.includePartialMessages != null) queryOptions.includePartialMessages = claudeOpts.includePartialMessages;
39
+ if (claudeOpts.enableFileCheckpointing != null) queryOptions.enableFileCheckpointing = claudeOpts.enableFileCheckpointing;
40
+ if (claudeOpts.extraArgs) queryOptions.extraArgs = claudeOpts.extraArgs;
41
+ if (claudeOpts.promptSuggestions != null) queryOptions.promptSuggestions = claudeOpts.promptSuggestions;
42
+ if (claudeOpts.agentProgressSummaries != null) queryOptions.agentProgressSummaries = claudeOpts.agentProgressSummaries;
43
+ if (claudeOpts.thinking) queryOptions.thinking = claudeOpts.thinking;
44
+ if (claudeOpts.betas && claudeOpts.betas.length > 0) queryOptions.betas = claudeOpts.betas;
45
+ if (claudeOpts.permissionMode) queryOptions.permissionMode = claudeOpts.permissionMode;
46
+ if (claudeOpts.allowDangerouslySkipPermissions) queryOptions.allowDangerouslySkipPermissions = true;
47
+ if (claudeOpts.settings) queryOptions.settings = claudeOpts.settings;
48
+ if (queryOpts.appendSystemPrompt) queryOptions.systemPrompt = { type: "preset", preset: "claude_code", append: queryOpts.appendSystemPrompt };
49
+ queryOptions.plugins = queryOpts.skipSkills ? (claudeOpts.plugins || []) : getSharedSkillPlugins(claudeOpts.originalHome, claudeOpts.plugins);
50
+ if (queryOpts.toolServerDescriptors) queryOptions.mcpServerDescriptors = queryOpts.toolServerDescriptors;
51
+ if (queryOpts.onUserDialog) queryOptions.supportedDialogKinds = SUPPORTED_DIALOG_KINDS;
52
+ if (queryOpts.model) queryOptions.model = queryOpts.model;
53
+ if (queryOpts.effort) queryOptions.effort = queryOpts.effort;
54
+ if (queryOpts.resumeSessionId) queryOptions.resume = queryOpts.resumeSessionId;
55
+ if (queryOpts.persistSession === false) queryOptions.persistSession = false;
56
+ if (claudeOpts.resumeSessionAt) queryOptions.resumeSessionAt = claudeOpts.resumeSessionAt;
57
+ return queryOptions;
58
+ }
59
+
29
60
  // --- SDK loading ---
30
61
  // Async loader (ESM dynamic import, same pattern as current project.js getSDK)
31
62
  var _sdkPromise = null;
@@ -843,7 +874,7 @@ function serializeWorkerValue(value, seen) {
843
874
  // in-process QueryHandle. This allows processQueryStream to iterate a worker
844
875
  // query identically to an in-process query.
845
876
 
846
- function createWorkerQueryHandle(worker, canUseTool, onElicitation, callMcpTool, onUserDialog) {
877
+ function createWorkerQueryHandle(worker, canUseTool, onElicitation, callMcpTool, onUserDialog, onUserInputRequest) {
847
878
  // Async iterable state
848
879
  var iterQueue = [];
849
880
  var iterWaiting = null;
@@ -910,8 +941,8 @@ function createWorkerQueryHandle(worker, canUseTool, onElicitation, callMcpTool,
910
941
  break;
911
942
 
912
943
  case "ask_user_request":
913
- if (canUseTool) {
914
- canUseTool("AskUserQuestion", msg.input, {
944
+ if (onUserInputRequest) {
945
+ claudeUserInput.ask(onUserInputRequest, msg.input, {
915
946
  toolUseID: msg.toolUseId,
916
947
  signal: { addEventListener: function() {} },
917
948
  }).then(function(result) {
@@ -923,17 +954,24 @@ function createWorkerQueryHandle(worker, canUseTool, onElicitation, callMcpTool,
923
954
  break;
924
955
 
925
956
  case "elicitation_request":
926
- if (onElicitation) {
927
- onElicitation({
957
+ if (onUserInputRequest || onElicitation) {
958
+ var workerElicitationRequest = {
928
959
  serverName: msg.serverName,
929
960
  message: msg.message,
930
961
  mode: msg.mode,
931
962
  url: msg.url,
932
963
  elicitationId: msg.elicitationId,
933
964
  requestedSchema: msg.requestedSchema,
934
- }, {
965
+ };
966
+ var workerElicitation = onUserInputRequest
967
+ ? claudeUserInput.elicitation(onUserInputRequest, workerElicitationRequest, {
968
+ requestId: msg.requestId,
969
+ signal: { addEventListener: function() {} },
970
+ })
971
+ : onElicitation(workerElicitationRequest, {
935
972
  signal: { addEventListener: function() {} },
936
- }).then(function(result) {
973
+ });
974
+ workerElicitation.then(function(result) {
937
975
  worker.send({ type: "elicitation_response", requestId: msg.requestId, result: result });
938
976
  }).catch(function(e) {
939
977
  console.error("[yoke/claude] elicitation_response send failed:", e.message || e);
@@ -1206,12 +1244,14 @@ function createClaudeAdapter(opts) {
1206
1244
  var _cwd = (opts && opts.cwd) || process.cwd();
1207
1245
  var _cachedModels = [];
1208
1246
  var _claudeBinaryPath = resolveClaudeBinaryPath();
1247
+ var _querySDK = (opts && opts.loadSDK) || loadSDK;
1209
1248
 
1210
1249
  // Path to the worker script (for OS-level user isolation)
1211
1250
  var workerScriptPath = path.join(__dirname, "claude-worker.js");
1212
1251
 
1213
1252
  var adapter = {
1214
1253
  vendor: "claude",
1254
+ userInputCapability: { mode: "native", native: true, transport: "AskUserQuestion/onElicitation" },
1215
1255
 
1216
1256
  // Path to worker script (sdk-bridge uses this to spawn worker processes)
1217
1257
  workerScriptPath: workerScriptPath,
@@ -1396,7 +1436,7 @@ function createClaudeAdapter(opts) {
1396
1436
  }
1397
1437
 
1398
1438
  // In-process path
1399
- var sdk = await loadSDK();
1439
+ var sdk = await _querySDK();
1400
1440
  var mq = createMessageQueue();
1401
1441
  var ac = queryOpts.abortController || new AbortController();
1402
1442
 
@@ -1405,6 +1445,7 @@ function createClaudeAdapter(opts) {
1405
1445
  cwd: queryOpts.cwd || _cwd,
1406
1446
  abortController: ac,
1407
1447
  };
1448
+ if (queryOpts.env) sdkOptions.env = queryOpts.env;
1408
1449
  if (_claudeBinaryPath) sdkOptions.pathToClaudeCodeExecutable = _claudeBinaryPath;
1409
1450
 
1410
1451
  // YOKE standard options -> SDK options
@@ -1418,13 +1459,19 @@ function createClaudeAdapter(opts) {
1418
1459
  if (queryOpts.model) sdkOptions.model = queryOpts.model;
1419
1460
  if (queryOpts.effort) sdkOptions.effort = queryOpts.effort;
1420
1461
  if (queryOpts.toolServers) sdkOptions.mcpServers = queryOpts.toolServers;
1421
- if (queryOpts.canUseTool) sdkOptions.canUseTool = queryOpts.canUseTool;
1422
- if (queryOpts.onElicitation) sdkOptions.onElicitation = queryOpts.onElicitation;
1462
+ var nativeUserInputHandler = queryOpts.userInputMode === "fallback" ? null : queryOpts.onUserInputRequest;
1463
+ if (queryOpts.canUseTool || nativeUserInputHandler) {
1464
+ sdkOptions.canUseTool = claudeUserInput.canUseTool(Object.assign({}, queryOpts, { onUserInputRequest: nativeUserInputHandler }));
1465
+ }
1466
+ if (nativeUserInputHandler) {
1467
+ sdkOptions.onElicitation = function (request, elicitOpts) { return claudeUserInput.elicitation(nativeUserInputHandler, request, elicitOpts); };
1468
+ } else if (queryOpts.userInputMode !== "fallback" && queryOpts.onElicitation) sdkOptions.onElicitation = queryOpts.onElicitation;
1423
1469
  if (queryOpts.onUserDialog) {
1424
1470
  sdkOptions.onUserDialog = queryOpts.onUserDialog;
1425
1471
  sdkOptions.supportedDialogKinds = SUPPORTED_DIALOG_KINDS;
1426
1472
  }
1427
1473
  if (queryOpts.resumeSessionId) sdkOptions.resume = queryOpts.resumeSessionId;
1474
+ if (queryOpts.persistSession === false) sdkOptions.persistSession = false;
1428
1475
 
1429
1476
  // Claude-specific options from adapterOptions.CLAUDE
1430
1477
  // Always set settingSources explicitly. SDK 0.2.119+ defaults to
@@ -1445,12 +1492,20 @@ function createClaudeAdapter(opts) {
1445
1492
  if (co.allowDangerouslySkipPermissions) sdkOptions.allowDangerouslySkipPermissions = true;
1446
1493
  if (co.resumeSessionAt) sdkOptions.resumeSessionAt = co.resumeSessionAt;
1447
1494
  if (co.settings) sdkOptions.settings = co.settings;
1448
- sdkOptions.plugins = getSharedSkillPlugins(co.originalHome, co.plugins);
1495
+ sdkOptions.plugins = queryOpts.skipSkills ? (co.plugins || []) : getSharedSkillPlugins(co.originalHome, co.plugins);
1449
1496
 
1450
1497
  var rawQuery = sdk.query({ prompt: mq, options: sdkOptions });
1451
1498
  return createQueryHandle(rawQuery, mq, ac);
1452
1499
  },
1453
1500
 
1501
+ createOneShotQuery: async function(queryOpts) {
1502
+ var handle = await adapter.createQuery(Object.assign({}, queryOpts || {}, {
1503
+ persistSession: false,
1504
+ resumeSessionId: null,
1505
+ }));
1506
+ return { handle: handle, backendPersistence: "ephemeral" };
1507
+ },
1508
+
1454
1509
  // --- Title generation ---
1455
1510
  generateTitle: async function(messages, opts) {
1456
1511
  console.log("[auto-title/claude] generateTitle called with " + messages.length + " messages");
@@ -1463,6 +1518,7 @@ function createClaudeAdapter(opts) {
1463
1518
  console.log("[auto-title/claude] Creating query with model=haiku...");
1464
1519
  var handle = await adapter.createQuery({
1465
1520
  cwd: (opts && opts.cwd) || _cwd,
1521
+ env: opts && opts.env,
1466
1522
  systemPrompt: systemPrompt,
1467
1523
  model: "haiku",
1468
1524
  adapterOptions: {
@@ -1573,44 +1629,17 @@ function createClaudeAdapter(opts) {
1573
1629
  }
1574
1630
 
1575
1631
  // Create the worker query handle (sets up message handler on worker)
1576
- var handle = createWorkerQueryHandle(worker, queryOpts.canUseTool, queryOpts.onElicitation, queryOpts.callMcpTool, queryOpts.onUserDialog);
1632
+ var workerUserInputHandler = queryOpts.userInputMode === "fallback" ? null : queryOpts.onUserInputRequest;
1633
+ var workerElicitationHandler = queryOpts.userInputMode === "fallback" ? null : queryOpts.onElicitation;
1634
+ var handle = createWorkerQueryHandle(worker, queryOpts.canUseTool, workerElicitationHandler, queryOpts.callMcpTool, queryOpts.onUserDialog, workerUserInputHandler);
1577
1635
 
1578
1636
  // Wait for worker to be ready before sending query_start
1579
1637
  if (!reusingWorker) {
1580
1638
  await worker.readyPromise;
1581
1639
  }
1582
1640
 
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;
1641
+ // Build serializable query options (no callbacks, no AbortController).
1642
+ var queryOptions = buildWorkerQueryOptions(queryOpts, claudeOpts, workerCwd);
1614
1643
 
1615
1644
  // Send query_start; the caller pushes the initial message via handle.pushMessage()
1616
1645
  // which routes through worker IPC.
@@ -1868,6 +1897,7 @@ module.exports = {
1868
1897
  hasWritableWorkerConnection: hasWritableWorkerConnection,
1869
1898
  sendWorkerMessage: sendWorkerMessage,
1870
1899
  canReuseWorker: canReuseWorker,
1900
+ buildWorkerQueryOptions: buildWorkerQueryOptions,
1871
1901
  normalizeEvent: flattenEvent,
1872
1902
  },
1873
1903
  };
@@ -10,6 +10,7 @@ var INITIALIZE_TIMEOUT_MS = require("../interface").INITIALIZE_TIMEOUT_MS;
10
10
  var skillDiscovery = require("../skill-discovery");
11
11
  var { resolveOsUserInfo } = require("../../os-users");
12
12
  var backgroundTasks = require("../codex-background-tasks");
13
+ var codexUserInput = require("../codex-user-input");
13
14
 
14
15
  // --- Event flattening ---
15
16
  // Converts app-server JSON-RPC notifications into flat objects with a yokeType field.
@@ -726,6 +727,7 @@ function createCodexQueryHandle(appServer, queryOpts) {
726
727
  var canUseTool = queryOpts.canUseTool || null;
727
728
  var callDynamicTool = queryOpts.callDynamicTool || null;
728
729
  var onElicitation = queryOpts.onElicitation || null;
730
+ var onUserInputRequest = queryOpts.onUserInputRequest || null;
729
731
  var onFinished = queryOpts.onFinished || null;
730
732
 
731
733
  // Check if the query was cancelled (either via handle.abort() or direct signal abort)
@@ -925,12 +927,23 @@ function createCodexQueryHandle(appServer, queryOpts) {
925
927
  return;
926
928
  }
927
929
 
928
- // MCP tool approval / elicitation (app-server uses mcpServer/elicitation/request)
929
- if (method === "item/tool/requestUserInput" || method === "mcpServer/elicitation/request") {
930
+ if (method === "item/tool/requestUserInput") {
931
+ if (!onUserInputRequest) {
932
+ appServer.respondError(msg.id, -32002, "This query cannot request structured user input.");
933
+ return;
934
+ }
935
+ codexUserInput.handleNative(appServer, msg, onUserInputRequest, state.threadId, abortController && abortController.signal);
936
+ return;
937
+ }
938
+
939
+ // MCP elicitation shares the YOKE user-input lifecycle when available.
940
+ if (method === "mcpServer/elicitation/request") {
930
941
  var mcpParams = msg.params || {};
931
942
  var mcpMeta = mcpParams._meta || {};
932
943
  console.log("[yoke/codex] MCP approval request:", (mcpMeta.tool || "?"), "server=" + (mcpParams.serverName || "?"));
933
- if (onElicitation) {
944
+ if (onUserInputRequest) {
945
+ codexUserInput.handleElicitation(appServer, msg, onUserInputRequest, abortController && abortController.signal);
946
+ } else if (onElicitation) {
934
947
  var request = {
935
948
  serverName: mcpParams.serverName || (mcpMeta.tool || "Tool"),
936
949
  message: mcpParams.message || mcpParams.prompt || "",
@@ -1049,6 +1062,7 @@ function createCodexQueryHandle(appServer, queryOpts) {
1049
1062
  cwd: queryOpts.cwd,
1050
1063
  skipGitRepoCheck: true,
1051
1064
  };
1065
+ if (queryOpts.ephemeral === true) threadParams.ephemeral = true;
1052
1066
  if (queryOpts.modelReasoningEffort) {
1053
1067
  threadParams.modelReasoningEffort = queryOpts.modelReasoningEffort;
1054
1068
  }
@@ -1079,6 +1093,11 @@ function createCodexQueryHandle(appServer, queryOpts) {
1079
1093
  threadResult = await appServer.send("thread/start", threadParams, 60000);
1080
1094
  }
1081
1095
 
1096
+ if (queryOpts.ephemeral === true
1097
+ && (!threadResult || !threadResult.thread || threadResult.thread.ephemeral !== true)) {
1098
+ throw new Error("Codex did not confirm an ephemeral one-shot thread.");
1099
+ }
1100
+
1082
1101
  if (threadResult && threadResult.thread) {
1083
1102
  state.threadId = threadResult.thread.id;
1084
1103
  handlerEntry.threadId = state.threadId;
@@ -1110,7 +1129,7 @@ function createCodexQueryHandle(appServer, queryOpts) {
1110
1129
 
1111
1130
  // Explicit references use Codex's native skill input item regardless of
1112
1131
  // which vendor owns the SKILL.md file.
1113
- var availableSkills = skillDiscovery.discoverSkills(queryOpts.cwd);
1132
+ var availableSkills = queryOpts.skipSkills ? [] : skillDiscovery.discoverSkills(queryOpts.cwd);
1114
1133
  var skillItemsToInject = [];
1115
1134
  var injected = {};
1116
1135
  for (var ii = 0; ii < input.length; ii++) {
@@ -1293,15 +1312,14 @@ function createCodexAdapter(opts) {
1293
1312
  // model listing must not depend on a successful app-server init — otherwise a
1294
1313
  // slow/failed `initialize` leaves the picker empty and the chip shows the
1295
1314
  // previous vendor's model.
1315
+ // Kept in sync with what `model/list` reports for the bundled codex build
1316
+ // (0.152.1). Models the CLI no longer offers are rejected at turn/start, so
1317
+ // listing them would only surface a runtime failure in the model picker.
1296
1318
  var CODEX_MODELS = [
1297
1319
  "gpt-5.6-terra",
1298
1320
  "gpt-5.6-sol",
1299
1321
  "gpt-5.6-luna",
1300
1322
  "gpt-5.5",
1301
- "gpt-5.4",
1302
- "gpt-5.4-mini",
1303
- "gpt-5.3-codex",
1304
- "gpt-5.3-codex-spark",
1305
1323
  "gpt-5.2",
1306
1324
  ];
1307
1325
  var _cachedModels = CODEX_MODELS.slice();
@@ -1516,6 +1534,7 @@ function createCodexAdapter(opts) {
1516
1534
 
1517
1535
  var adapter = {
1518
1536
  vendor: "codex",
1537
+ userInputCapability: { mode: "native", native: true, transport: "item/tool/requestUserInput" },
1519
1538
 
1520
1539
  init: function(initOpts) {
1521
1540
  var requestedLinuxUser = initOpts && initOpts.linuxUser;
@@ -1543,7 +1562,7 @@ function createCodexAdapter(opts) {
1543
1562
  if (_initPromise) return _initPromise;
1544
1563
 
1545
1564
  _initPromise = (async function() {
1546
- var serverOpts = { cwd: _cwd };
1565
+ var serverOpts = { cwd: _cwd, env: effectiveInitOpts.env || null };
1547
1566
  if (_runtimeLinuxUser) {
1548
1567
  serverOpts.osUserInfo = _resolveOsUserInfo(_runtimeLinuxUser);
1549
1568
  }
@@ -1749,9 +1768,11 @@ function createCodexAdapter(opts) {
1749
1768
  callDynamicTool: queryOpts.callDynamicTool || null,
1750
1769
  abortController: ac,
1751
1770
  canUseTool: queryOpts.canUseTool || null,
1752
- onElicitation: queryOpts.onElicitation || null,
1771
+ onElicitation: queryOpts.userInputMode === "fallback" ? null : (queryOpts.onElicitation || null),
1772
+ onUserInputRequest: queryOpts.userInputMode === "fallback" ? null : (queryOpts.onUserInputRequest || null),
1753
1773
  resumeSessionId: queryOpts.resumeSessionId || null,
1754
1774
  registerBackgroundTaskReset: registerBackgroundTaskReset,
1775
+ ephemeral: queryOpts.ephemeral === true,
1755
1776
  };
1756
1777
 
1757
1778
  // Reasoning effort
@@ -1806,6 +1827,14 @@ function createCodexAdapter(opts) {
1806
1827
  return handle;
1807
1828
  },
1808
1829
 
1830
+ createOneShotQuery: async function(queryOpts) {
1831
+ var handle = await adapter.createQuery(Object.assign({}, queryOpts || {}, {
1832
+ ephemeral: true,
1833
+ resumeSessionId: null,
1834
+ }));
1835
+ return { handle: handle, backendPersistence: "ephemeral" };
1836
+ },
1837
+
1809
1838
  // --- Title generation ---
1810
1839
  generateTitle: async function(messages, opts) {
1811
1840
  var requestedLinuxUser = opts && opts.linuxUser;
@@ -1823,6 +1852,7 @@ function createCodexAdapter(opts) {
1823
1852
  var ac = new AbortController();
1824
1853
  var handle = await adapter.createQuery({
1825
1854
  cwd: (opts && opts.cwd) || _cwd,
1855
+ env: opts && opts.env,
1826
1856
  systemPrompt: systemPrompt,
1827
1857
  model: "gpt-5.4-mini",
1828
1858
  abortController: ac,