clay-server 5.2.0-beta.4 → 5.2.0-beta.6

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 (301) hide show
  1. package/lib/account-auth-socket.js +1 -0
  2. package/lib/builtin-mates.js +17 -14
  3. package/lib/canonical-clay-record-authority.js +15 -0
  4. package/lib/canonical-clay-scheduling-authority.js +19 -0
  5. package/lib/claude-hook-installer.js +1 -239
  6. package/lib/claude-jsonl-watcher.js +1 -204
  7. package/lib/clay-mate-chat-receipts.js +26 -0
  8. package/lib/clay-mate-chat.js +87 -0
  9. package/lib/clay-mate-knowledge-input.js +26 -0
  10. package/lib/clay-mate-knowledge.js +95 -0
  11. package/lib/clay-mate-lifecycle.js +95 -0
  12. package/lib/clay-product-control-input.js +33 -0
  13. package/lib/clay-product-control-tools.js +51 -0
  14. package/lib/clay-product-control.js +237 -0
  15. package/lib/clay-project-lifecycle.js +154 -0
  16. package/lib/clay-project-record-input.js +44 -0
  17. package/lib/clay-project-records.js +83 -0
  18. package/lib/clay-scheduling-input.js +21 -0
  19. package/lib/clay-scheduling-receipts.js +26 -0
  20. package/lib/clay-scheduling.js +119 -0
  21. package/lib/clay-screen-controls.js +96 -0
  22. package/lib/clay-skill-install.js +1 -33
  23. package/lib/clay-workspace-controls.js +83 -0
  24. package/lib/clay-workspace-input.js +17 -0
  25. package/lib/clay-workspace-receipts.js +26 -0
  26. package/lib/cli-sessions.js +1 -300
  27. package/lib/codex-defaults.js +1 -28
  28. package/lib/context-usage.js +3 -2
  29. package/lib/daemon-project-access.js +11 -0
  30. package/lib/daemon-project-lifecycle-callbacks.js +15 -0
  31. package/lib/daemon-project-lifecycle.js +262 -0
  32. package/lib/daemon-projects.js +1 -1
  33. package/lib/daemon.js +78 -276
  34. package/lib/default-ai-runtime.js +4 -8
  35. package/lib/email-mcp-server.js +1 -1
  36. package/lib/issues-service.js +29 -15
  37. package/lib/kiro-defaults.js +1 -22
  38. package/lib/knowledge-db-import.js +5 -4
  39. package/lib/knowledge-db-service.js +9 -6
  40. package/lib/knowledge-document-index.js +2 -1
  41. package/lib/knowledge-product-operations.js +46 -0
  42. package/lib/mate-creation-mcp-server.js +2 -0
  43. package/lib/mate-knowledge-canonical-access.js +10 -0
  44. package/lib/mate-knowledge-service.js +7 -4
  45. package/lib/mate-lifecycle-service.js +94 -0
  46. package/lib/mate-message-delivery.js +43 -0
  47. package/lib/mate-ready-creation.js +9 -1
  48. package/lib/mate-schedule-input.js +29 -0
  49. package/lib/mate-schedule-lifecycle.js +151 -0
  50. package/lib/mate-scheduling.js +103 -0
  51. package/lib/mates.js +4 -3
  52. package/lib/mcp-proxy.js +2 -32
  53. package/lib/mcp-query-bridge.js +1 -1
  54. package/lib/mcp-source-adapters.js +1 -91
  55. package/lib/mcp-source-context.js +1 -42
  56. package/lib/mcp-source-discovery.js +1 -169
  57. package/lib/mcp-source-plugins.js +1 -68
  58. package/lib/mcp-source-restrictions.js +1 -47
  59. package/lib/mcp-tool-policy.js +1 -26
  60. package/lib/notes-checklist.js +50 -0
  61. package/lib/notes.js +49 -3
  62. package/lib/os-user-diagnostics.js +2 -4
  63. package/lib/os-users.js +24 -70
  64. package/lib/project-admin-overview.js +51 -0
  65. package/lib/project-ask-user.js +4 -2
  66. package/lib/project-connection.js +8 -7
  67. package/lib/project-delegated-follow-up.js +2 -1
  68. package/lib/project-directory-claim.js +65 -0
  69. package/lib/project-file-operations.js +61 -0
  70. package/lib/project-filesystem.js +13 -87
  71. package/lib/project-full-access.js +23 -2
  72. package/lib/project-http.js +4 -4
  73. package/lib/project-knowledge.js +32 -18
  74. package/lib/project-lifecycle-operations.js +98 -0
  75. package/lib/project-lifecycle-process-witness.js +32 -0
  76. package/lib/project-lifecycle-runtime.js +50 -0
  77. package/lib/project-linux-access.js +22 -0
  78. package/lib/project-logs-canonical-clay.js +27 -0
  79. package/lib/project-logs-clay-query.js +16 -0
  80. package/lib/project-logs-schema.js +4 -2
  81. package/lib/project-logs-service.js +8 -7
  82. package/lib/project-logs.js +1 -0
  83. package/lib/project-loop.js +1 -0
  84. package/lib/project-mate-chat-control.js +55 -0
  85. package/lib/project-mate-creation-proposal.js +18 -3
  86. package/lib/project-mcp.js +2 -2
  87. package/lib/project-models.js +14 -31
  88. package/lib/project-notifications.js +74 -16
  89. package/lib/project-ownership.js +77 -0
  90. package/lib/project-pair-result-delivery.js +14 -3
  91. package/lib/project-pair-usage.js +12 -13
  92. package/lib/project-pending-message-queue.js +4 -1
  93. package/lib/project-product-control.js +87 -0
  94. package/lib/project-product-session-queue.js +46 -0
  95. package/lib/project-push-access.js +28 -0
  96. package/lib/project-scheduled-message-queue.js +30 -0
  97. package/lib/project-scheduled-messages.js +63 -64
  98. package/lib/project-scheduled-task-control.js +83 -0
  99. package/lib/project-scheduled-tasks.js +13 -2
  100. package/lib/project-scheduling-access.js +10 -0
  101. package/lib/project-session-actions.js +65 -0
  102. package/lib/project-session-delete.js +8 -1
  103. package/lib/project-session-github.js +47 -12
  104. package/lib/project-session-history-actions.js +167 -0
  105. package/lib/project-session-pair.js +1 -1
  106. package/lib/project-session-runtime-actions.js +64 -0
  107. package/lib/project-session-spawn.js +2 -3
  108. package/lib/project-session-vendor.js +55 -0
  109. package/lib/project-sessions.js +82 -267
  110. package/lib/project-user-message.js +31 -1
  111. package/lib/project-vendor-login.js +6 -36
  112. package/lib/project-workspace-operations.js +126 -0
  113. package/lib/project-workspace-query.js +9 -2
  114. package/lib/project.js +95 -3
  115. package/lib/public/app.js +1 -0
  116. package/lib/public/css/clay-tool-activity.css +51 -0
  117. package/lib/public/css/home-mate-creation.css +5 -0
  118. package/lib/public/css/messages.css +6 -2
  119. package/lib/public/css/overlays.css +4 -2
  120. package/lib/public/css/project-admin-overview.css +13 -0
  121. package/lib/public/css/session-folders.css +11 -0
  122. package/lib/public/css/session-github.css +3 -0
  123. package/lib/public/css/sticky-notes.css +61 -1
  124. package/lib/public/index.html +1 -1
  125. package/lib/public/modules/admin-settings-projects.js +6 -2
  126. package/lib/public/modules/app-connection.js +8 -1
  127. package/lib/public/modules/app-favicon.js +11 -2
  128. package/lib/public/modules/app-header.js +4 -2
  129. package/lib/public/modules/app-loop-ui.js +2 -0
  130. package/lib/public/modules/app-message-router.js +1 -1
  131. package/lib/public/modules/app-messages.js +54 -8
  132. package/lib/public/modules/app-notifications.js +1 -2
  133. package/lib/public/modules/app-panels.js +61 -123
  134. package/lib/public/modules/app-projects.js +5 -0
  135. package/lib/public/modules/app-rate-limit.js +7 -27
  136. package/lib/public/modules/chat-render-runtime.js +3 -0
  137. package/lib/public/modules/clay-owner-navigation.js +27 -0
  138. package/lib/public/modules/clay-tool-activity.js +140 -0
  139. package/lib/public/modules/clay-tool-presentation.js +338 -0
  140. package/lib/public/modules/command-palette.js +1 -1
  141. package/lib/public/modules/default-ai.js +11 -3
  142. package/lib/public/modules/home-debate-planning.js +5 -5
  143. package/lib/public/modules/home-mate-chat.js +8 -6
  144. package/lib/public/modules/home-mate-creation.js +73 -1
  145. package/lib/public/modules/mcp-connection-view.js +1 -1
  146. package/lib/public/modules/permission-control.js +5 -4
  147. package/lib/public/modules/personal-settings-dialog.js +7 -1
  148. package/lib/public/modules/project-access-recovery.js +17 -0
  149. package/lib/public/modules/project-admin-overview.js +21 -0
  150. package/lib/public/modules/scheduler.js +2 -0
  151. package/lib/public/modules/session-create-form.js +10 -10
  152. package/lib/public/modules/session-folder-layout.js +1 -1
  153. package/lib/public/modules/session-folder-view-menu.js +9 -0
  154. package/lib/public/modules/session-github.js +65 -8
  155. package/lib/public/modules/settings-defaults.js +27 -28
  156. package/lib/public/modules/sidebar-session-folders-ui.js +1 -1
  157. package/lib/public/modules/sticky-note-markdown.js +72 -6
  158. package/lib/public/modules/sticky-notes-actions.js +30 -0
  159. package/lib/public/modules/sticky-notes-browser.js +9 -2
  160. package/lib/public/modules/sticky-notes-card.js +23 -7
  161. package/lib/public/modules/sticky-notes-checklist.js +71 -0
  162. package/lib/public/modules/sticky-notes-editor.js +108 -44
  163. package/lib/public/modules/sticky-notes-shared.js +50 -2
  164. package/lib/public/modules/sticky-notes-state.js +66 -0
  165. package/lib/public/modules/sticky-notes.js +34 -51
  166. package/lib/public/modules/thinking-lifecycle.js +33 -3
  167. package/lib/public/modules/thinking-view.js +23 -1
  168. package/lib/public/modules/tools.js +36 -7
  169. package/lib/public/modules/tui-grab.js +1 -2
  170. package/lib/public/modules/user-settings-appearance.js +10 -3
  171. package/lib/public/modules/user-settings-editors.js +1 -1
  172. package/lib/public/modules/user-settings-layout.js +11 -2
  173. package/lib/public/modules/user-settings-preferences.js +6 -2
  174. package/lib/public/modules/user-settings-profile.js +12 -2
  175. package/lib/public/modules/user-settings.js +3 -2
  176. package/lib/public/modules/vendor-login-browser.js +5 -3
  177. package/lib/public/modules/vendor-login.js +2 -2
  178. package/lib/public/modules/vendor-priority.js +15 -1
  179. package/lib/public/muse-avatar.svg +4 -0
  180. package/lib/public/style.css +2 -0
  181. package/lib/safe-bash-commands.js +3 -45
  182. package/lib/scheduled-task-records.js +3 -1
  183. package/lib/scheduler.js +2 -0
  184. package/lib/sdk-bridge.js +334 -403
  185. package/lib/sdk-foreground-admission.js +16 -0
  186. package/lib/sdk-mcp-descriptors.js +2 -37
  187. package/lib/sdk-message-processor.js +52 -17
  188. package/lib/sdk-quota-snapshot.js +1 -1
  189. package/lib/sdk-response-recovery.js +1 -0
  190. package/lib/sdk-worker.js +2 -677
  191. package/lib/server-admin.js +63 -16
  192. package/lib/server-dm.js +1 -1
  193. package/lib/server-global-ws.js +10 -20
  194. package/lib/server-home-chat-events.js +7 -3
  195. package/lib/server-home-chat.js +4 -16
  196. package/lib/server-home-mate-creation.js +1 -0
  197. package/lib/server-home-mcp-consent.js +3 -3
  198. package/lib/server-mates.js +25 -67
  199. package/lib/server-owner-ui.js +77 -0
  200. package/lib/server-path-access.js +38 -0
  201. package/lib/server-project-removal.js +22 -0
  202. package/lib/server.js +100 -30
  203. package/lib/session-config-transition.js +45 -0
  204. package/lib/session-folders.js +7 -2
  205. package/lib/session-fork-history.js +21 -0
  206. package/lib/session-github.js +9 -2
  207. package/lib/session-hygiene.js +3 -35
  208. package/lib/session-permission-mode.js +4 -3
  209. package/lib/session-skill-scope.js +11 -0
  210. package/lib/session-visibility.js +5 -2
  211. package/lib/sessions.js +27 -89
  212. package/lib/terminal-manager.js +52 -0
  213. package/lib/tool-llm.js +1 -1
  214. package/lib/tui-transcript-index.js +1 -132
  215. package/lib/users-permissions.js +2 -8
  216. package/lib/users.js +4 -0
  217. package/lib/vendor-login-browser.js +1 -11
  218. package/lib/workspace-query-access.js +4 -1
  219. package/lib/ws-schema.js +8 -2
  220. package/lib/yoke/acp-agent-profiles.js +5 -3
  221. package/lib/yoke/adapters/antigravity.js +3 -14
  222. package/lib/yoke/adapters/claude-query-contract.js +9 -0
  223. package/lib/yoke/adapters/claude.js +54 -50
  224. package/lib/yoke/adapters/codex-query-contract.js +24 -0
  225. package/lib/yoke/adapters/codex.js +53 -111
  226. package/lib/yoke/adapters/kiro.js +3 -1
  227. package/lib/yoke/adapters/muse-query-contract.js +7 -0
  228. package/lib/yoke/adapters/muse.js +122 -0
  229. package/lib/yoke/auth-events.js +17 -0
  230. package/lib/yoke/claude-hook-installer.js +267 -0
  231. package/lib/yoke/claude-jsonl-watcher.js +204 -0
  232. package/lib/yoke/claude-maintenance.js +55 -0
  233. package/lib/yoke/claude-permission-patterns.js +53 -0
  234. package/lib/yoke/claude-response-recovery.js +155 -0
  235. package/lib/yoke/claude-transcript-hygiene.js +34 -0
  236. package/lib/yoke/claude-worker-startup.js +28 -0
  237. package/lib/yoke/clay-skill-install.js +33 -0
  238. package/lib/yoke/cli-sessions.js +300 -0
  239. package/lib/yoke/codex-app-server.js +7 -12
  240. package/lib/yoke/codex-idle-recovery.js +81 -1
  241. package/lib/yoke/codex-recovery-admission.js +164 -0
  242. package/lib/yoke/configuration.js +13 -0
  243. package/lib/yoke/discovery.js +70 -0
  244. package/lib/yoke/errors.js +8 -0
  245. package/lib/yoke/host-environment.js +7 -0
  246. package/lib/yoke/index.js +9 -51
  247. package/lib/yoke/interface.js +116 -0
  248. package/lib/yoke/kiro-acp-server.js +5 -5
  249. package/lib/yoke/legacy-sessions.js +89 -0
  250. package/lib/yoke/login-protocol.js +25 -0
  251. package/lib/yoke/maintenance.js +12 -0
  252. package/lib/yoke/mcp-proxy.js +32 -0
  253. package/lib/yoke/mcp-source-adapters.js +91 -0
  254. package/lib/yoke/mcp-source-context.js +42 -0
  255. package/lib/yoke/mcp-source-discovery.js +169 -0
  256. package/lib/yoke/mcp-source-plugins.js +68 -0
  257. package/lib/yoke/mcp-source-restrictions.js +47 -0
  258. package/lib/yoke/mcp-tool-policy-normalize.js +28 -0
  259. package/lib/yoke/model-preferences.js +6 -0
  260. package/lib/yoke/muse-artifacts.js +36 -0
  261. package/lib/yoke/muse-controls.js +50 -0
  262. package/lib/yoke/muse-input.js +64 -0
  263. package/lib/yoke/muse-items.js +157 -0
  264. package/lib/yoke/muse-policy.js +52 -0
  265. package/lib/yoke/muse-query.js +428 -0
  266. package/lib/yoke/muse-runtime.js +211 -0
  267. package/lib/yoke/muse-services.js +79 -0
  268. package/lib/yoke/muse-skills.js +79 -0
  269. package/lib/yoke/muse-turns.js +71 -0
  270. package/lib/yoke/options/acp.js +2 -0
  271. package/lib/yoke/options/antigravity.js +2 -0
  272. package/lib/yoke/options/claude.js +21 -0
  273. package/lib/yoke/options/codex-defaults.js +29 -0
  274. package/lib/yoke/options/codex-settings.js +21 -0
  275. package/lib/yoke/options/codex.js +6 -0
  276. package/lib/yoke/options/kiro-defaults.js +22 -0
  277. package/lib/yoke/options/kiro.js +5 -0
  278. package/lib/yoke/options/muse.js +5 -0
  279. package/lib/yoke/provider-contract.js +5 -0
  280. package/lib/yoke/providers/antigravity-executable.js +8 -0
  281. package/lib/yoke/providers/claude-executable.js +40 -0
  282. package/lib/yoke/providers/claude-model-descriptions.js +14 -0
  283. package/lib/yoke/providers/claude-process.js +97 -0
  284. package/lib/yoke/providers/claude-provision.js +75 -0
  285. package/lib/yoke/providers/codex-errors.js +8 -0
  286. package/lib/yoke/providers/muse-executable.js +17 -0
  287. package/lib/yoke/provisioning.js +6 -0
  288. package/lib/yoke/query-options.js +10 -0
  289. package/lib/yoke/response-recovery.js +41 -0
  290. package/lib/yoke/sdk-mcp-descriptors.js +37 -0
  291. package/lib/yoke/sdk-server-factory.js +7 -0
  292. package/lib/yoke/session-history.js +8 -0
  293. package/lib/yoke/session-tool-transport.js +34 -13
  294. package/lib/yoke/settings.js +23 -0
  295. package/lib/yoke/source-locations.js +4 -0
  296. package/lib/yoke/title-query.js +18 -7
  297. package/lib/yoke/tui-transcript-index.js +132 -0
  298. package/lib/yoke/usage.js +48 -0
  299. package/lib/yoke/user-input.js +13 -0
  300. package/lib/yoke/vendor-registry.js +81 -1
  301. package/package.json +3 -2
@@ -0,0 +1,16 @@
1
+ // One next-message admission window, bound to the exact live provider query.
2
+ // This is not turn completion: processing and pending terminal counts survive.
3
+ function available(session) {
4
+ var credit = session && session._foregroundAdmission;
5
+ return !!(credit && session.queryInstance === credit.query
6
+ && Number(session._sdkQueryGeneration || 0) === credit.generation
7
+ && !session.taskStopRequested && !session._pendingMessageDrainPaused
8
+ && !(session.abortController && session.abortController.signal.aborted));
9
+ }
10
+ function offer(session) {
11
+ if (!session.queryInstance || session.taskStopRequested || session.abortController && session.abortController.signal.aborted) return false;
12
+ session._foregroundAdmission = { query: session.queryInstance, generation: Number(session._sdkQueryGeneration || 0) };
13
+ return true;
14
+ }
15
+ function take(session) { delete session._foregroundAdmission; }
16
+ module.exports = { available: available, offer: offer, take: take };
@@ -1,37 +1,2 @@
1
- // Extract serializable tool descriptors from MCP server instances.
2
- // Used for IPC to worker processes (McpSdkServerConfigWithInstance is not serializable).
3
- function extractMcpDescriptors(mcpServers) {
4
- if (!mcpServers) return null;
5
- // Claude's adapter uses Zod v3 for JSON Schema tools; other servers use v4.
6
- // Use the MCP SDK's version-aware converter for both kinds of registered tool.
7
- var toJSONSchema = require("@modelcontextprotocol/sdk/server/zod-json-schema-compat.js").toJsonSchemaCompat;
8
- var descriptors = [];
9
- var names = Object.keys(mcpServers);
10
- for (var i = 0; i < names.length; i++) {
11
- var serverName = names[i];
12
- var server = mcpServers[serverName];
13
- if (!server || !server.instance || !server.instance._registeredTools) continue;
14
- var tools = [];
15
- var toolNames = Object.keys(server.instance._registeredTools);
16
- for (var j = 0; j < toolNames.length; j++) {
17
- var toolName = toolNames[j];
18
- var toolDef = server.instance._registeredTools[toolName];
19
- var inputSchema = { type: "object", properties: {} };
20
- try {
21
- if (toolDef._clayInputSchema) inputSchema = toolDef._clayInputSchema;
22
- else if (toolDef.inputSchema) inputSchema = toJSONSchema(toolDef.inputSchema);
23
- } catch (e) {
24
- throw new Error("Cannot serialize MCP tool schema " + serverName + "/" + toolName + ": " + e.message);
25
- }
26
- tools.push({
27
- name: toolName,
28
- description: toolDef.description || toolName,
29
- inputSchema: inputSchema,
30
- });
31
- }
32
- if (tools.length > 0) descriptors.push({ serverName: serverName, tools: tools });
33
- }
34
- return descriptors.length > 0 ? descriptors : null;
35
- }
36
-
37
- module.exports = { extractMcpDescriptors: extractMcpDescriptors };
1
+ // Compatibility export; SDK serialization is owned by YOKE.
2
+ module.exports = require("./yoke/sdk-mcp-descriptors");
@@ -42,9 +42,20 @@ function attachMessageProcessor(ctx) {
42
42
  }
43
43
 
44
44
  function sendAndRecord(session, obj, clientObj) {
45
+ obj = require("./yoke/usage").clientEvent(obj, session.vendor || "claude");
45
46
  sm.sendAndRecord(session, obj, clientObj);
46
47
  }
47
48
 
49
+ function recordTurnActivity(session, activity) {
50
+ // An authoritative input card owns progress until its request settles.
51
+ var awaitingInput = ["pendingPermissions", "pendingAskUser", "pendingElicitations", "pendingUserDialogs"].some(function (key) {
52
+ return Object.keys(session[key] || {}).length > 0;
53
+ });
54
+ if (!awaitingInput && ["waiting", "running", "background"].indexOf(activity.phase) !== -1) sendAndRecord(session, {
55
+ type: "turn_activity", phase: activity.phase, turnId: activity.turnId || null, disposition: activity.disposition || null
56
+ });
57
+ }
58
+
48
59
  function parseGeneratedImage(parsed) {
49
60
  var data = parsed.data || "";
50
61
  var mediaType = parsed.mediaType || "image/png";
@@ -77,8 +88,8 @@ function attachMessageProcessor(ctx) {
77
88
  || !!authLinuxUser
78
89
  || (authUser && authUser.role === "admin");
79
90
  var vendorInfo = yoke.getVendorInfo(session.vendor);
80
- var authTitle = ((vendorInfo && vendorInfo.displayName) || "Claude Code") + " is not logged in.";
81
- var loginCommand = (vendorInfo && vendorInfo.loginCommand) || "claude login";
91
+ var authTitle = ((vendorInfo && vendorInfo.displayName) || "The provider") + " is not logged in.";
92
+ var loginCommand = (vendorInfo && vendorInfo.loginCommand) || "";
82
93
  var _nmLogin = getNotificationsModule();
83
94
  // Authentication recovery is transient UI state, not transcript content.
84
95
  // Recording it makes history replay look like a fresh auth failure and
@@ -163,6 +174,7 @@ function attachMessageProcessor(ctx) {
163
174
  }
164
175
 
165
176
  function processSDKMessage(session, parsed) {
177
+ parsed = require("./yoke/auth-events").normalize(parsed, session.responsePreview, session.vendor || "claude");
166
178
  // Timing: log key SDK milestones relative to query start
167
179
  if (session._queryStartTs) {
168
180
  var _elapsed = Date.now() - session._queryStartTs;
@@ -378,7 +390,7 @@ function attachMessageProcessor(ctx) {
378
390
  }) : [];
379
391
  sendAndRecord(session, {
380
392
  type: "tool_executing",
381
- id: parsed.turnId || "codex-plan",
393
+ id: parsed.turnId || "provider-plan",
382
394
  name: "TodoWrite",
383
395
  input: {
384
396
  todos: todos,
@@ -430,6 +442,7 @@ function attachMessageProcessor(ctx) {
430
442
  if (pushModule && block.name === "AskUserQuestion" && input.questions) {
431
443
  var q = input.questions[0];
432
444
  pushModule.sendPush({
445
+ sessionId: session.localId,
433
446
  type: "ask_user",
434
447
  slug: slug,
435
448
  title: (mateDisplayName || "Claude") + " has a question",
@@ -545,7 +558,32 @@ function attachMessageProcessor(ctx) {
545
558
  }
546
559
  }
547
560
 
561
+ } else if (parsed.yokeType === "turn_activity") {
562
+ recordTurnActivity(session, parsed);
563
+ } else if (parsed.yokeType === "foreground_available") {
564
+ // A provider observed an admission boundary while background work still
565
+ // owns its terminal. Do not synthesize success or clear processing/tasks.
566
+ // Persist the presentation boundary before a synchronous next admission.
567
+ sendAndRecord(session, { type: "assistant_boundary" });
568
+ recordTurnActivity(session, { phase: "background" });
569
+ if (require('./sdk-foreground-admission').offer(session) && opts && typeof opts.onSessionAvailable === 'function') opts.onSessionAvailable(session);
548
570
  } else if (parsed.yokeType === "result") {
571
+ if (parsed.backgroundOnly === true) {
572
+ // Observed terminal of an older foreground turn. Account for the
573
+ // outstanding send without settling a newer turn's reviews/callbacks.
574
+ session._queuedTurnCount = turnQueue.pendingSends(session, parsed);
575
+ if (session._queuedTurnCount > 0) session._queuedTurnCount--;
576
+ else {
577
+ session.isProcessing = false;
578
+ session._awaitingTurnResult = false;
579
+ onProcessingChanged();
580
+ sendAndRecord(session, { type: "done", code: 0 });
581
+ }
582
+ sendAndRecord(session, { type: "background_result", usage: require('./yoke/usage').accounting(parsed.usage), cost: parsed.cost, duration: parsed.duration });
583
+ sm.broadcastSessionList();
584
+ if (opts && typeof opts.onSessionAvailable === 'function') opts.onSessionAvailable(session);
585
+ return;
586
+ }
549
587
  // SDK 0.3.274 batches queued background-task completion wakes into one
550
588
  // model call. Every wake still emits a result, but all results before
551
589
  // the final wake are successful task-notification-origin placeholders
@@ -615,7 +653,7 @@ function attachMessageProcessor(ctx) {
615
653
  session._queuedTurnCount = 0;
616
654
  taskLifecycle.clearAll(session);
617
655
  onProcessingChanged();
618
- sendAndRecord(session, { type: "error", text: "Claude failed to start: " + parsed.startupFailureReason });
656
+ sendAndRecord(session, { type: "error", text: "The provider failed to start: " + parsed.startupFailureReason });
619
657
  sendAndRecord(session, { type: "done", code: 1 });
620
658
  sm.broadcastSessionList();
621
659
  return;
@@ -656,12 +694,6 @@ function attachMessageProcessor(ctx) {
656
694
  onProcessingChanged();
657
695
  }
658
696
  // Recognize only short, zero-cost CLI login responses, not ordinary prose.
659
- var previewTrimmed = (session.responsePreview || "").trim();
660
- var isZeroCost = !parsed.cost || parsed.cost === 0;
661
- var isLoginPrompt = isZeroCost && previewTrimmed.length < 100
662
- && ((/not logged in/i.test(previewTrimmed) && /\/login/i.test(previewTrimmed))
663
- || ((session.vendor || "claude") === "claude"
664
- && /^Failed to authenticate: OAuth session expired and could not be refreshed\.?$/i.test(previewTrimmed)));
665
697
  // Fetch rich context usage breakdown (fire-and-forget, non-blocking)
666
698
  if (session.queryInstance && typeof session.queryInstance.getContextUsage === "function") {
667
699
  var contextQuery = session.queryInstance;
@@ -683,7 +715,8 @@ function attachMessageProcessor(ctx) {
683
715
  type: "result",
684
716
  cost: parsed.cost,
685
717
  duration: parsed.duration,
686
- usage: parsed.usage || null,
718
+ usage: require("./yoke/usage").accounting(parsed.usage),
719
+ context: require("./yoke/usage").turnContext(Object.assign({}, parsed, { lastStreamInputTokens: lastStreamInput })),
687
720
  modelUsage: parsed.modelUsage || null,
688
721
  sessionId: parsed.sessionId,
689
722
  lastStreamInputTokens: lastStreamInput,
@@ -698,7 +731,7 @@ function attachMessageProcessor(ctx) {
698
731
  }
699
732
  // Recover both missing login and expired OAuth sessions from the SDK.
700
733
  // This is a short canned response with zero cost, not actual AI output.
701
- if (isLoginPrompt) {
734
+ if (parsed.authenticationRequired === true) {
702
735
  emitAuthRequired(session);
703
736
  }
704
737
  sendAndRecord(session, { type: "done", code: 0 });
@@ -715,6 +748,7 @@ function attachMessageProcessor(ctx) {
715
748
 
716
749
  if (pushModule && !session._delegatedBy && !_suppressResponseNotification) {
717
750
  pushModule.sendPush({
751
+ sessionId: session.localId,
718
752
  type: "done",
719
753
  slug: slug,
720
754
  title: _doneTitle,
@@ -885,7 +919,7 @@ function attachMessageProcessor(ctx) {
885
919
  resetsAt: info.resetsAt ? info.resetsAt * 1000 : null,
886
920
  rateLimitType: info.rateLimitType || null,
887
921
  utilization: info.utilization || null,
888
- isUsingOverage: info.isUsingOverage === true || info.overageInUse === true,
922
+ isUsingOverage: info.isUsingOverage === true,
889
923
  overageEnabled: typeof info.overageEnabled === "boolean" ? info.overageEnabled : null,
890
924
  overageStatus: info.overageStatus || null,
891
925
  overageResetsAt: info.overageResetsAt ? info.overageResetsAt * 1000 : null,
@@ -977,6 +1011,7 @@ function attachMessageProcessor(ctx) {
977
1011
  }
978
1012
 
979
1013
  } else if (parsed.yokeType === "commands_changed") {
1014
+ if (Array.isArray(parsed.skills)) session.skillNames = parsed.skills.slice();
980
1015
  // Mid-session command list change: rebuild the union with skills (same as
981
1016
  // init) and push a full replacement to the client.
982
1017
  var cmdSeen = new Set();
@@ -1051,12 +1086,12 @@ function attachMessageProcessor(ctx) {
1051
1086
  // processQueryStream can finish the turn when the iterator closes.
1052
1087
  var adapterErrorText = parsed.text || parsed.message || parsed.error || "Agent runtime error";
1053
1088
  session._lastAdapterError = adapterErrorText;
1054
- var isSessionWriterConflict = /thread-store conflict|already has an active writer/i.test(adapterErrorText);
1055
- if (isSessionWriterConflict) {
1089
+ var classifiedError = require("./yoke/errors").classify(session.vendor || "claude", adapterErrorText);
1090
+ if (classifiedError && classifiedError.kind === "session_writer_conflict") {
1056
1091
  sendAndRecord(session, {
1057
1092
  type: "session_writer_conflict",
1058
- vendor: session.vendor || "codex",
1059
- text: "This Codex session is already open in another Clay or Codex process. Stop the other server or close the other session, then try again.",
1093
+ vendor: session.vendor || "claude",
1094
+ text: classifiedError.text,
1060
1095
  });
1061
1096
  } else {
1062
1097
  sendAndRecord(session, { type: "error", text: adapterErrorText });
@@ -9,6 +9,7 @@ function recordQuotaSnapshot(session, info, sendAndRecord) {
9
9
  return Object.assign({}, window, { resetsAt: window.resetsAt ? window.resetsAt * 1000 : null });
10
10
  }),
11
11
  };
12
+ if (Number.isFinite(info.observedAtMs)) message.observedAtMs = info.observedAtMs;
12
13
  var snapshots = session._quotaSnapshots || (session._quotaSnapshots = Object.create(null));
13
14
  var key = JSON.stringify([session.ownerId, session.vendor, info.limitId]);
14
15
  var serialized = JSON.stringify(message);
@@ -20,7 +21,6 @@ function recordQuotaSnapshot(session, info, sendAndRecord) {
20
21
  function attachQuotaSnapshots(sm) {
21
22
  if (typeof sm.addOnSessionViewed !== "function") return;
22
23
  sm.addOnSessionViewed(function (session, ws, send) {
23
- if (session.vendor !== "codex") return;
24
24
  var seen = Object.create(null);
25
25
  var history = session.history || [];
26
26
  // A deduplicated snapshot may precede the initial page of chat history.
@@ -0,0 +1 @@
1
+ module.exports = require("./yoke/claude-response-recovery");