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.
- package/lib/account-auth-socket.js +1 -0
- package/lib/builtin-mates.js +17 -14
- package/lib/canonical-clay-record-authority.js +15 -0
- package/lib/canonical-clay-scheduling-authority.js +19 -0
- package/lib/claude-hook-installer.js +1 -239
- package/lib/claude-jsonl-watcher.js +1 -204
- package/lib/clay-mate-chat-receipts.js +26 -0
- package/lib/clay-mate-chat.js +87 -0
- package/lib/clay-mate-knowledge-input.js +26 -0
- package/lib/clay-mate-knowledge.js +95 -0
- package/lib/clay-mate-lifecycle.js +95 -0
- package/lib/clay-product-control-input.js +33 -0
- package/lib/clay-product-control-tools.js +51 -0
- package/lib/clay-product-control.js +237 -0
- package/lib/clay-project-lifecycle.js +154 -0
- package/lib/clay-project-record-input.js +44 -0
- package/lib/clay-project-records.js +83 -0
- package/lib/clay-scheduling-input.js +21 -0
- package/lib/clay-scheduling-receipts.js +26 -0
- package/lib/clay-scheduling.js +119 -0
- package/lib/clay-screen-controls.js +96 -0
- package/lib/clay-skill-install.js +1 -33
- package/lib/clay-workspace-controls.js +83 -0
- package/lib/clay-workspace-input.js +17 -0
- package/lib/clay-workspace-receipts.js +26 -0
- package/lib/cli-sessions.js +1 -300
- package/lib/codex-defaults.js +1 -28
- package/lib/context-usage.js +3 -2
- package/lib/daemon-project-access.js +11 -0
- package/lib/daemon-project-lifecycle-callbacks.js +15 -0
- package/lib/daemon-project-lifecycle.js +262 -0
- package/lib/daemon-projects.js +1 -1
- package/lib/daemon.js +78 -276
- package/lib/default-ai-runtime.js +4 -8
- package/lib/email-mcp-server.js +1 -1
- package/lib/issues-service.js +29 -15
- package/lib/kiro-defaults.js +1 -22
- package/lib/knowledge-db-import.js +5 -4
- package/lib/knowledge-db-service.js +9 -6
- package/lib/knowledge-document-index.js +2 -1
- package/lib/knowledge-product-operations.js +46 -0
- package/lib/mate-creation-mcp-server.js +2 -0
- package/lib/mate-knowledge-canonical-access.js +10 -0
- package/lib/mate-knowledge-service.js +7 -4
- package/lib/mate-lifecycle-service.js +94 -0
- package/lib/mate-message-delivery.js +43 -0
- package/lib/mate-ready-creation.js +9 -1
- package/lib/mate-schedule-input.js +29 -0
- package/lib/mate-schedule-lifecycle.js +151 -0
- package/lib/mate-scheduling.js +103 -0
- package/lib/mates.js +4 -3
- package/lib/mcp-proxy.js +2 -32
- package/lib/mcp-query-bridge.js +1 -1
- package/lib/mcp-source-adapters.js +1 -91
- package/lib/mcp-source-context.js +1 -42
- package/lib/mcp-source-discovery.js +1 -169
- package/lib/mcp-source-plugins.js +1 -68
- package/lib/mcp-source-restrictions.js +1 -47
- package/lib/mcp-tool-policy.js +1 -26
- package/lib/notes-checklist.js +50 -0
- package/lib/notes.js +49 -3
- package/lib/os-user-diagnostics.js +2 -4
- package/lib/os-users.js +24 -70
- package/lib/project-admin-overview.js +51 -0
- package/lib/project-ask-user.js +4 -2
- package/lib/project-connection.js +8 -7
- package/lib/project-delegated-follow-up.js +2 -1
- package/lib/project-directory-claim.js +65 -0
- package/lib/project-file-operations.js +61 -0
- package/lib/project-filesystem.js +13 -87
- package/lib/project-full-access.js +23 -2
- package/lib/project-http.js +4 -4
- package/lib/project-knowledge.js +32 -18
- package/lib/project-lifecycle-operations.js +98 -0
- package/lib/project-lifecycle-process-witness.js +32 -0
- package/lib/project-lifecycle-runtime.js +50 -0
- package/lib/project-linux-access.js +22 -0
- package/lib/project-logs-canonical-clay.js +27 -0
- package/lib/project-logs-clay-query.js +16 -0
- package/lib/project-logs-schema.js +4 -2
- package/lib/project-logs-service.js +8 -7
- package/lib/project-logs.js +1 -0
- package/lib/project-loop.js +1 -0
- package/lib/project-mate-chat-control.js +55 -0
- package/lib/project-mate-creation-proposal.js +18 -3
- package/lib/project-mcp.js +2 -2
- package/lib/project-models.js +14 -31
- package/lib/project-notifications.js +74 -16
- package/lib/project-ownership.js +77 -0
- package/lib/project-pair-result-delivery.js +14 -3
- package/lib/project-pair-usage.js +12 -13
- package/lib/project-pending-message-queue.js +4 -1
- package/lib/project-product-control.js +87 -0
- package/lib/project-product-session-queue.js +46 -0
- package/lib/project-push-access.js +28 -0
- package/lib/project-scheduled-message-queue.js +30 -0
- package/lib/project-scheduled-messages.js +63 -64
- package/lib/project-scheduled-task-control.js +83 -0
- package/lib/project-scheduled-tasks.js +13 -2
- package/lib/project-scheduling-access.js +10 -0
- package/lib/project-session-actions.js +65 -0
- package/lib/project-session-delete.js +8 -1
- package/lib/project-session-github.js +47 -12
- package/lib/project-session-history-actions.js +167 -0
- package/lib/project-session-pair.js +1 -1
- package/lib/project-session-runtime-actions.js +64 -0
- package/lib/project-session-spawn.js +2 -3
- package/lib/project-session-vendor.js +55 -0
- package/lib/project-sessions.js +82 -267
- package/lib/project-user-message.js +31 -1
- package/lib/project-vendor-login.js +6 -36
- package/lib/project-workspace-operations.js +126 -0
- package/lib/project-workspace-query.js +9 -2
- package/lib/project.js +95 -3
- package/lib/public/app.js +1 -0
- package/lib/public/css/clay-tool-activity.css +51 -0
- package/lib/public/css/home-mate-creation.css +5 -0
- package/lib/public/css/messages.css +6 -2
- package/lib/public/css/overlays.css +4 -2
- package/lib/public/css/project-admin-overview.css +13 -0
- package/lib/public/css/session-folders.css +11 -0
- package/lib/public/css/session-github.css +3 -0
- package/lib/public/css/sticky-notes.css +61 -1
- package/lib/public/index.html +1 -1
- package/lib/public/modules/admin-settings-projects.js +6 -2
- package/lib/public/modules/app-connection.js +8 -1
- package/lib/public/modules/app-favicon.js +11 -2
- package/lib/public/modules/app-header.js +4 -2
- package/lib/public/modules/app-loop-ui.js +2 -0
- package/lib/public/modules/app-message-router.js +1 -1
- package/lib/public/modules/app-messages.js +54 -8
- package/lib/public/modules/app-notifications.js +1 -2
- package/lib/public/modules/app-panels.js +61 -123
- package/lib/public/modules/app-projects.js +5 -0
- package/lib/public/modules/app-rate-limit.js +7 -27
- package/lib/public/modules/chat-render-runtime.js +3 -0
- package/lib/public/modules/clay-owner-navigation.js +27 -0
- package/lib/public/modules/clay-tool-activity.js +140 -0
- package/lib/public/modules/clay-tool-presentation.js +338 -0
- package/lib/public/modules/command-palette.js +1 -1
- package/lib/public/modules/default-ai.js +11 -3
- package/lib/public/modules/home-debate-planning.js +5 -5
- package/lib/public/modules/home-mate-chat.js +8 -6
- package/lib/public/modules/home-mate-creation.js +73 -1
- package/lib/public/modules/mcp-connection-view.js +1 -1
- package/lib/public/modules/permission-control.js +5 -4
- package/lib/public/modules/personal-settings-dialog.js +7 -1
- package/lib/public/modules/project-access-recovery.js +17 -0
- package/lib/public/modules/project-admin-overview.js +21 -0
- package/lib/public/modules/scheduler.js +2 -0
- package/lib/public/modules/session-create-form.js +10 -10
- package/lib/public/modules/session-folder-layout.js +1 -1
- package/lib/public/modules/session-folder-view-menu.js +9 -0
- package/lib/public/modules/session-github.js +65 -8
- package/lib/public/modules/settings-defaults.js +27 -28
- package/lib/public/modules/sidebar-session-folders-ui.js +1 -1
- package/lib/public/modules/sticky-note-markdown.js +72 -6
- package/lib/public/modules/sticky-notes-actions.js +30 -0
- package/lib/public/modules/sticky-notes-browser.js +9 -2
- package/lib/public/modules/sticky-notes-card.js +23 -7
- package/lib/public/modules/sticky-notes-checklist.js +71 -0
- package/lib/public/modules/sticky-notes-editor.js +108 -44
- package/lib/public/modules/sticky-notes-shared.js +50 -2
- package/lib/public/modules/sticky-notes-state.js +66 -0
- package/lib/public/modules/sticky-notes.js +34 -51
- package/lib/public/modules/thinking-lifecycle.js +33 -3
- package/lib/public/modules/thinking-view.js +23 -1
- package/lib/public/modules/tools.js +36 -7
- package/lib/public/modules/tui-grab.js +1 -2
- package/lib/public/modules/user-settings-appearance.js +10 -3
- package/lib/public/modules/user-settings-editors.js +1 -1
- package/lib/public/modules/user-settings-layout.js +11 -2
- package/lib/public/modules/user-settings-preferences.js +6 -2
- package/lib/public/modules/user-settings-profile.js +12 -2
- package/lib/public/modules/user-settings.js +3 -2
- package/lib/public/modules/vendor-login-browser.js +5 -3
- package/lib/public/modules/vendor-login.js +2 -2
- package/lib/public/modules/vendor-priority.js +15 -1
- package/lib/public/muse-avatar.svg +4 -0
- package/lib/public/style.css +2 -0
- package/lib/safe-bash-commands.js +3 -45
- package/lib/scheduled-task-records.js +3 -1
- package/lib/scheduler.js +2 -0
- package/lib/sdk-bridge.js +334 -403
- package/lib/sdk-foreground-admission.js +16 -0
- package/lib/sdk-mcp-descriptors.js +2 -37
- package/lib/sdk-message-processor.js +52 -17
- package/lib/sdk-quota-snapshot.js +1 -1
- package/lib/sdk-response-recovery.js +1 -0
- package/lib/sdk-worker.js +2 -677
- package/lib/server-admin.js +63 -16
- package/lib/server-dm.js +1 -1
- package/lib/server-global-ws.js +10 -20
- package/lib/server-home-chat-events.js +7 -3
- package/lib/server-home-chat.js +4 -16
- package/lib/server-home-mate-creation.js +1 -0
- package/lib/server-home-mcp-consent.js +3 -3
- package/lib/server-mates.js +25 -67
- package/lib/server-owner-ui.js +77 -0
- package/lib/server-path-access.js +38 -0
- package/lib/server-project-removal.js +22 -0
- package/lib/server.js +100 -30
- package/lib/session-config-transition.js +45 -0
- package/lib/session-folders.js +7 -2
- package/lib/session-fork-history.js +21 -0
- package/lib/session-github.js +9 -2
- package/lib/session-hygiene.js +3 -35
- package/lib/session-permission-mode.js +4 -3
- package/lib/session-skill-scope.js +11 -0
- package/lib/session-visibility.js +5 -2
- package/lib/sessions.js +27 -89
- package/lib/terminal-manager.js +52 -0
- package/lib/tool-llm.js +1 -1
- package/lib/tui-transcript-index.js +1 -132
- package/lib/users-permissions.js +2 -8
- package/lib/users.js +4 -0
- package/lib/vendor-login-browser.js +1 -11
- package/lib/workspace-query-access.js +4 -1
- package/lib/ws-schema.js +8 -2
- package/lib/yoke/acp-agent-profiles.js +5 -3
- package/lib/yoke/adapters/antigravity.js +3 -14
- package/lib/yoke/adapters/claude-query-contract.js +9 -0
- package/lib/yoke/adapters/claude.js +54 -50
- package/lib/yoke/adapters/codex-query-contract.js +24 -0
- package/lib/yoke/adapters/codex.js +53 -111
- package/lib/yoke/adapters/kiro.js +3 -1
- package/lib/yoke/adapters/muse-query-contract.js +7 -0
- package/lib/yoke/adapters/muse.js +122 -0
- package/lib/yoke/auth-events.js +17 -0
- package/lib/yoke/claude-hook-installer.js +267 -0
- package/lib/yoke/claude-jsonl-watcher.js +204 -0
- package/lib/yoke/claude-maintenance.js +55 -0
- package/lib/yoke/claude-permission-patterns.js +53 -0
- package/lib/yoke/claude-response-recovery.js +155 -0
- package/lib/yoke/claude-transcript-hygiene.js +34 -0
- package/lib/yoke/claude-worker-startup.js +28 -0
- package/lib/yoke/clay-skill-install.js +33 -0
- package/lib/yoke/cli-sessions.js +300 -0
- package/lib/yoke/codex-app-server.js +7 -12
- package/lib/yoke/codex-idle-recovery.js +81 -1
- package/lib/yoke/codex-recovery-admission.js +164 -0
- package/lib/yoke/configuration.js +13 -0
- package/lib/yoke/discovery.js +70 -0
- package/lib/yoke/errors.js +8 -0
- package/lib/yoke/host-environment.js +7 -0
- package/lib/yoke/index.js +9 -51
- package/lib/yoke/interface.js +116 -0
- package/lib/yoke/kiro-acp-server.js +5 -5
- package/lib/yoke/legacy-sessions.js +89 -0
- package/lib/yoke/login-protocol.js +25 -0
- package/lib/yoke/maintenance.js +12 -0
- package/lib/yoke/mcp-proxy.js +32 -0
- package/lib/yoke/mcp-source-adapters.js +91 -0
- package/lib/yoke/mcp-source-context.js +42 -0
- package/lib/yoke/mcp-source-discovery.js +169 -0
- package/lib/yoke/mcp-source-plugins.js +68 -0
- package/lib/yoke/mcp-source-restrictions.js +47 -0
- package/lib/yoke/mcp-tool-policy-normalize.js +28 -0
- package/lib/yoke/model-preferences.js +6 -0
- package/lib/yoke/muse-artifacts.js +36 -0
- package/lib/yoke/muse-controls.js +50 -0
- package/lib/yoke/muse-input.js +64 -0
- package/lib/yoke/muse-items.js +157 -0
- package/lib/yoke/muse-policy.js +52 -0
- package/lib/yoke/muse-query.js +428 -0
- package/lib/yoke/muse-runtime.js +211 -0
- package/lib/yoke/muse-services.js +79 -0
- package/lib/yoke/muse-skills.js +79 -0
- package/lib/yoke/muse-turns.js +71 -0
- package/lib/yoke/options/acp.js +2 -0
- package/lib/yoke/options/antigravity.js +2 -0
- package/lib/yoke/options/claude.js +21 -0
- package/lib/yoke/options/codex-defaults.js +29 -0
- package/lib/yoke/options/codex-settings.js +21 -0
- package/lib/yoke/options/codex.js +6 -0
- package/lib/yoke/options/kiro-defaults.js +22 -0
- package/lib/yoke/options/kiro.js +5 -0
- package/lib/yoke/options/muse.js +5 -0
- package/lib/yoke/provider-contract.js +5 -0
- package/lib/yoke/providers/antigravity-executable.js +8 -0
- package/lib/yoke/providers/claude-executable.js +40 -0
- package/lib/yoke/providers/claude-model-descriptions.js +14 -0
- package/lib/yoke/providers/claude-process.js +97 -0
- package/lib/yoke/providers/claude-provision.js +75 -0
- package/lib/yoke/providers/codex-errors.js +8 -0
- package/lib/yoke/providers/muse-executable.js +17 -0
- package/lib/yoke/provisioning.js +6 -0
- package/lib/yoke/query-options.js +10 -0
- package/lib/yoke/response-recovery.js +41 -0
- package/lib/yoke/sdk-mcp-descriptors.js +37 -0
- package/lib/yoke/sdk-server-factory.js +7 -0
- package/lib/yoke/session-history.js +8 -0
- package/lib/yoke/session-tool-transport.js +34 -13
- package/lib/yoke/settings.js +23 -0
- package/lib/yoke/source-locations.js +4 -0
- package/lib/yoke/title-query.js +18 -7
- package/lib/yoke/tui-transcript-index.js +132 -0
- package/lib/yoke/usage.js +48 -0
- package/lib/yoke/user-input.js +13 -0
- package/lib/yoke/vendor-registry.js +81 -1
- 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
|
-
//
|
|
2
|
-
|
|
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) || "
|
|
81
|
-
var loginCommand = (vendorInfo && vendorInfo.loginCommand) || "
|
|
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 || "
|
|
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: "
|
|
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
|
|
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 (
|
|
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
|
|
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
|
|
1055
|
-
if (
|
|
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 || "
|
|
1059
|
-
text:
|
|
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");
|