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.
- package/lib/ask-user-mcp-server.js +5 -119
- package/lib/builtin-mates.js +6 -6
- package/lib/claude-hook-installer.js +15 -0
- package/lib/clay-history-mcp-server.js +62 -297
- package/lib/daemon.js +1 -1
- package/lib/debate-model-selection.js +119 -0
- package/lib/home-debate-tool-policy.js +164 -0
- package/lib/home-response-notifications.js +26 -0
- package/lib/mate-creation-mcp-server.js +55 -0
- package/lib/mate-ready-creation.js +95 -0
- package/lib/mates.js +2 -0
- package/lib/notes.js +2 -1
- package/lib/project-ask-user.js +64 -0
- package/lib/project-capsule-catalog.js +101 -0
- package/lib/project-connection.js +4 -0
- package/lib/project-debate-proposal.js +133 -17
- package/lib/project-debate.js +214 -110
- package/lib/project-delegated-follow-up.js +84 -0
- package/lib/project-delegated-session.js +53 -0
- package/lib/project-filesystem.js +7 -9
- package/lib/project-knowledge.js +1 -0
- package/lib/project-mate-creation-proposal.js +120 -0
- package/lib/project-memory.js +14 -7
- package/lib/project-models.js +157 -32
- package/lib/project-session-notes.js +2 -2
- package/lib/project-session-pair.js +8 -8
- package/lib/project-sessions.js +66 -51
- package/lib/project-vendor-login.js +397 -0
- package/lib/project-worker-proposal.js +25 -25
- package/lib/project-workspace-query.js +144 -0
- package/lib/project.js +349 -102
- package/lib/public/app.js +85 -42
- package/lib/public/css/avatar-imprints.css +0 -1
- package/lib/public/css/base.css +4 -0
- package/lib/public/css/capsule-ui.css +389 -0
- package/lib/public/css/command-palette.css +306 -6
- package/lib/public/css/home-capsule-library.css +243 -0
- package/lib/public/css/home-capsule-source.css +192 -0
- package/lib/public/css/home-debate-live.css +146 -0
- package/lib/public/css/home-debate-planning.css +125 -0
- package/lib/public/css/home-debates-archive.css +281 -0
- package/lib/public/css/home-hub.css +896 -405
- package/lib/public/css/home-mate-creation.css +34 -0
- package/lib/public/css/home-mate-model-picker.css +131 -0
- package/lib/public/css/home-mate-settings.css +344 -0
- package/lib/public/css/home-session-actions.css +265 -0
- package/lib/public/css/home-sidebar.css +667 -0
- package/lib/public/css/icon-strip.css +1 -2
- package/lib/public/css/mates.css +7 -34
- package/lib/public/css/pane.css +1 -1
- package/lib/public/css/playbook.css +0 -80
- package/lib/public/css/sticky-notes.css +53 -117
- package/lib/public/css/tui-attention.css +0 -44
- package/lib/public/css/workspace-assignment.css +45 -0
- package/lib/public/fonts/source-serif-4/LICENSE.md +93 -0
- package/lib/public/fonts/source-serif-4/SourceSerif4Caption-Semibold.ttf.woff2 +0 -0
- package/lib/public/index.html +93 -74
- package/lib/public/modules/app-connection.js +10 -1
- package/lib/public/modules/app-dm.js +43 -160
- package/lib/public/modules/app-home-hub.js +328 -585
- package/lib/public/modules/app-message-cards.js +242 -0
- package/lib/public/modules/app-message-router.js +84 -0
- package/lib/public/modules/app-messages.js +102 -37
- package/lib/public/modules/app-notifications.js +8 -119
- package/lib/public/modules/app-projects.js +9 -1
- package/lib/public/modules/app-rendering.js +21 -602
- package/lib/public/modules/avatar-imprint.js +11 -8
- package/lib/public/modules/chat-bubble-renderer.js +152 -0
- package/lib/public/modules/chat-render-runtime.js +198 -0
- package/lib/public/modules/command-palette.js +225 -436
- package/lib/public/modules/dm-render.js +82 -0
- package/lib/public/modules/home-capsule-creation-intent.js +31 -0
- package/lib/public/modules/home-capsule-library.js +146 -0
- package/lib/public/modules/home-capsule-source.js +383 -0
- package/lib/public/modules/home-chat-identity.js +35 -0
- package/lib/public/modules/home-chat-scroll.js +77 -0
- package/lib/public/modules/home-chat-stream-state.js +34 -0
- package/lib/public/modules/home-composer-focus.js +25 -0
- package/lib/public/modules/home-conversations-sheet.js +179 -0
- package/lib/public/modules/home-debate-activity.js +48 -0
- package/lib/public/modules/home-debate-controls.js +295 -0
- package/lib/public/modules/home-debate-launch.js +41 -0
- package/lib/public/modules/home-debate-live.js +284 -0
- package/lib/public/modules/home-debate-models.js +73 -0
- package/lib/public/modules/home-debate-planning.js +335 -0
- package/lib/public/modules/home-debates-archive.js +279 -0
- package/lib/public/modules/home-dock-resize.js +74 -0
- package/lib/public/modules/home-dock.js +446 -0
- package/lib/public/modules/home-mate-chat.js +496 -0
- package/lib/public/modules/home-mate-creation.js +109 -0
- package/lib/public/modules/home-mate-model-picker.js +281 -0
- package/lib/public/modules/home-mate-selection.js +38 -0
- package/lib/public/modules/home-mate-settings-menu.js +131 -0
- package/lib/public/modules/home-mate-settings.js +383 -0
- package/lib/public/modules/home-session-actions.js +373 -0
- package/lib/public/modules/home-session-model-confirmation.js +13 -0
- package/lib/public/modules/home-shell.js +9 -0
- package/lib/public/modules/home-sidebar-chat-list.js +63 -0
- package/lib/public/modules/home-sidebar.js +158 -0
- package/lib/public/modules/home-sub-surface.js +19 -0
- package/lib/public/modules/home-surface-boot.js +68 -0
- package/lib/public/modules/home-surface.js +141 -0
- package/lib/public/modules/home-tools.js +271 -0
- package/lib/public/modules/markdown.js +50 -2
- package/lib/public/modules/mate-management.js +86 -0
- package/lib/public/modules/mate-wizard.js +0 -7
- package/lib/public/modules/mention.js +17 -19
- package/lib/public/modules/pane-bridge.js +9 -0
- package/lib/public/modules/profile.js +4 -5
- package/lib/public/modules/project-settings.js +34 -28
- package/lib/public/modules/project-switcher.js +11 -5
- package/lib/public/modules/project-workspace-assignment.js +23 -0
- package/lib/public/modules/search-clay-chat.js +402 -0
- package/lib/public/modules/server-settings.js +14 -12
- package/lib/public/modules/session-actions.js +1 -1
- package/lib/public/modules/sidebar-mates.js +56 -552
- package/lib/public/modules/sidebar-mobile.js +7 -64
- package/lib/public/modules/sidebar-presence.js +37 -0
- package/lib/public/modules/split-pair-ui.js +13 -13
- package/lib/public/modules/split-view.js +7 -0
- package/lib/public/modules/sticky-notes.js +7 -6
- package/lib/public/modules/tool-input-composition.js +48 -0
- package/lib/public/modules/tool-llm-status.js +167 -0
- package/lib/public/modules/tool-renderer-advanced.js +285 -0
- package/lib/public/modules/tool-renderer-chart.js +158 -0
- package/lib/public/modules/tool-renderer-semantics.js +35 -0
- package/lib/public/modules/tool-renderer.js +464 -0
- package/lib/public/modules/tool-runtime.js +309 -0
- package/lib/public/modules/tool-ui-evaluator.js +97 -0
- package/lib/public/modules/tool-ui-tree.js +21 -0
- package/lib/public/modules/tui-attention.js +10 -0
- package/lib/public/modules/user-settings.js +16 -23
- package/lib/public/modules/vendor-login.js +287 -0
- package/lib/public/modules/worker-proposal.js +2 -2
- package/lib/public/modules/workspace-assignment-card.js +149 -0
- package/lib/public/modules/workspace-assignment-routing.js +4 -0
- package/lib/public/style.css +13 -2
- package/lib/runtime-env.js +65 -0
- package/lib/sdk-bridge.js +120 -32
- package/lib/sdk-message-processor.js +10 -6
- package/lib/server-home-capsule-creation.js +36 -0
- package/lib/server-home-chat-events.js +287 -0
- package/lib/server-home-chat.js +518 -0
- package/lib/server-home-clay-entry.js +65 -0
- package/lib/server-home-clay-session-links.js +26 -0
- package/lib/server-home-debate-planning.js +214 -0
- package/lib/server-home-debates.js +137 -0
- package/lib/server-home-mate-creation.js +261 -0
- package/lib/server-home-models.js +241 -0
- package/lib/server-home-preferences.js +61 -0
- package/lib/server-mates.js +37 -0
- package/lib/server-tools.js +377 -0
- package/lib/server.js +111 -59
- package/lib/session-pair-mcp-server.js +6 -6
- package/lib/sessions.js +18 -3
- package/lib/tool-capsule-source.js +142 -0
- package/lib/tool-control-mcp-server.js +126 -0
- package/lib/tool-llm.js +48 -0
- package/lib/tool-storage.js +77 -0
- package/lib/tool-ui-spec-advanced.js +82 -0
- package/lib/tool-ui-spec.js +261 -0
- package/lib/tools-registry.js +286 -0
- package/lib/users-home-dock-preferences.js +77 -0
- package/lib/users-home-surface-preferences.js +99 -0
- package/lib/users-preferences.js +4 -7
- package/lib/users.js +12 -0
- package/lib/whats-new-content.js +3 -3
- package/lib/workspace-assignment-service.js +420 -0
- package/lib/workspace-query-mcp-server.js +154 -0
- package/lib/workspace-query-service.js +492 -0
- package/lib/ws-schema.js +93 -12
- package/lib/yoke/adapters/acp.js +2 -1
- package/lib/yoke/adapters/antigravity.js +2 -1
- package/lib/yoke/adapters/claude-worker.js +11 -4
- package/lib/yoke/adapters/claude.js +73 -43
- package/lib/yoke/adapters/codex.js +40 -10
- package/lib/yoke/adapters/kiro.js +2 -1
- package/lib/yoke/claude-user-input.js +38 -0
- package/lib/yoke/codex-app-server.js +20 -2
- package/lib/yoke/codex-user-input.js +64 -0
- package/lib/yoke/complete-once.js +164 -0
- package/lib/yoke/index.js +5 -1
- package/lib/yoke/interface.js +19 -0
- package/lib/yoke/mcp-bridge-server.js +2 -6
- package/lib/yoke/user-input.js +254 -0
- package/package.json +3 -2
- package/lib/public/css/home-chat.css +0 -380
- package/lib/public/modules/home-chat.js +0 -438
- 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
|
-
//
|
|
560
|
-
// -----------------------------------------------------------------------
|
|
561
|
-
"
|
|
562
|
-
"
|
|
563
|
-
"
|
|
564
|
-
"
|
|
565
|
-
"
|
|
566
|
-
"
|
|
567
|
-
"
|
|
568
|
-
"
|
|
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 };
|
package/lib/yoke/adapters/acp.js
CHANGED
|
@@ -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
|
-
|
|
517
|
-
|
|
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 (
|
|
914
|
-
|
|
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
|
-
|
|
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
|
-
})
|
|
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
|
|
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
|
-
|
|
1422
|
-
if (queryOpts.
|
|
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
|
|
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
|
-
|
|
929
|
-
|
|
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 (
|
|
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,
|