clay-server 4.1.0-beta.5 → 4.1.0-beta.7
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/LICENSE +661 -21
- package/LICENSES/MIT-legacy.txt +21 -0
- package/LICENSES/README.md +7 -0
- package/README.md +2 -2
- package/bin/cli.js +0 -2
- package/lib/autonomous-run-record.js +32 -0
- package/lib/autonomous-run-scheduler.js +92 -0
- package/lib/daemon.js +0 -2
- package/lib/default-ai-runtime.js +117 -0
- package/lib/durable-scheduler-record.js +61 -0
- package/lib/durable-scheduler-store.js +185 -0
- package/lib/durable-scheduler.js +495 -0
- package/lib/git-cli.js +1 -0
- package/lib/issue-work-session.js +10 -0
- package/lib/issues-comments.js +40 -0
- package/lib/issues-commit-verification.js +30 -0
- package/lib/issues-mcp-server.js +27 -0
- package/lib/issues-schema.js +119 -0
- package/lib/issues-service.js +339 -0
- package/lib/issues-store.js +210 -0
- package/lib/loop-cron.js +47 -0
- package/lib/loop-durable-schedule.js +159 -0
- package/lib/loop-guidance.js +35 -0
- package/lib/loop-registry-occurrence.js +76 -0
- package/lib/model-entry.js +15 -0
- package/lib/project-autonomous-run.js +498 -0
- package/lib/project-capsule-turn.js +1 -0
- package/lib/project-connection.js +6 -1
- package/lib/project-delegated-session.js +1 -0
- package/lib/project-filesystem.js +10 -10
- package/lib/project-full-access.js +86 -0
- package/lib/project-http.js +3 -1
- package/lib/project-issue-launch.js +154 -0
- package/lib/project-issues.js +58 -0
- package/lib/project-logs-mcp-server.js +8 -12
- package/lib/project-loop-interview.js +163 -0
- package/lib/project-loop.js +150 -64
- package/lib/project-message-delivery.js +4 -2
- package/lib/project-models.js +71 -3
- package/lib/project-pair-autonomous-stop.js +16 -0
- package/lib/project-pair-owned-stop.js +18 -0
- package/lib/project-pair-task-control.js +14 -1
- package/lib/project-pending-message-queue.js +264 -0
- package/lib/project-scheduled-messages.js +316 -0
- package/lib/project-scheduled-task-execution.js +236 -0
- package/lib/project-scheduled-tasks.js +481 -0
- package/lib/project-session-pair.js +16 -19
- package/lib/project-sessions.js +114 -31
- package/lib/project-tool-llm-runtime.js +48 -0
- package/lib/project-user-message.js +202 -60
- package/lib/project-workspace-query.js +25 -0
- package/lib/project.js +361 -69
- package/lib/public/app.js +85 -22
- package/lib/public/css/default-ai.css +33 -0
- package/lib/public/css/home-hub.css +15 -2
- package/lib/public/css/home-sidebar.css +50 -2
- package/lib/public/css/input.css +160 -5
- package/lib/public/css/issues.css +101 -0
- package/lib/public/css/messages.css +19 -0
- package/lib/public/css/pane.css +58 -7
- package/lib/public/css/pending-message-queue.css +187 -0
- package/lib/public/css/rewind.css +11 -2
- package/lib/public/css/scheduled-tasks.css +122 -0
- package/lib/public/index.html +42 -150
- package/lib/public/modules/app-connection.js +3 -0
- package/lib/public/modules/app-cursors.js +29 -12
- package/lib/public/modules/app-loop-ui.js +4 -8
- package/lib/public/modules/app-message-router.js +8 -0
- package/lib/public/modules/app-messages.js +34 -9
- package/lib/public/modules/app-projects.js +2 -0
- package/lib/public/modules/app-rate-limit.js +8 -5
- package/lib/public/modules/autonomous-run.js +285 -0
- package/lib/public/modules/clay-file-links.js +111 -0
- package/lib/public/modules/clay-issue-links.js +131 -0
- package/lib/public/modules/clay-log-links.js +2 -0
- package/lib/public/modules/cursor-sharing-preference.js +38 -0
- package/lib/public/modules/default-ai.js +377 -0
- package/lib/public/modules/filebrowser.js +43 -2
- package/lib/public/modules/home-sidebar.js +16 -8
- package/lib/public/modules/home-surface.js +5 -0
- package/lib/public/modules/input.js +11 -20
- package/lib/public/modules/issues-context.js +117 -0
- package/lib/public/modules/issues-render.js +29 -0
- package/lib/public/modules/issues.js +270 -0
- package/lib/public/modules/loop-interview.js +151 -0
- package/lib/public/modules/markdown.js +4 -0
- package/lib/public/modules/message-delivery.js +5 -3
- package/lib/public/modules/pending-message-image-editor.js +143 -0
- package/lib/public/modules/pending-message-queue-model.js +22 -0
- package/lib/public/modules/pending-message-queue.js +449 -0
- package/lib/public/modules/project-logs.js +2 -2
- package/lib/public/modules/scheduled-message-state.js +46 -0
- package/lib/public/modules/scheduled-task-edit-state.js +7 -0
- package/lib/public/modules/scheduled-task-engine.js +48 -0
- package/lib/public/modules/scheduled-task-form.js +122 -0
- package/lib/public/modules/scheduled-task-recurrence.js +46 -0
- package/lib/public/modules/scheduled-task-schedule-rule.js +115 -0
- package/lib/public/modules/scheduled-tasks.js +459 -0
- package/lib/public/modules/scheduler-config.js +6 -52
- package/lib/public/modules/scheduler.js +9 -21
- package/lib/public/modules/sidebar-mobile.js +3 -0
- package/lib/public/modules/sidebar.js +0 -11
- package/lib/public/modules/split-view.js +2 -0
- package/lib/public/modules/sticky-note-markdown.js +1 -0
- package/lib/public/modules/terminal.js +2 -0
- package/lib/public/modules/tool-palette-order.js +3 -3
- package/lib/public/modules/tools.js +5 -2
- package/lib/public/style.css +3 -0
- package/lib/record-revision.js +11 -0
- package/lib/schedule-rule.js +151 -0
- package/lib/schedule-validation.js +124 -0
- package/lib/scheduled-run-state.js +87 -0
- package/lib/scheduled-task-records.js +127 -0
- package/lib/scheduler.js +179 -196
- package/lib/sdk-bridge.js +157 -22
- package/lib/sdk-message-processor.js +3 -0
- package/lib/server-cursor-sharing.js +65 -0
- package/lib/server-default-ai.js +265 -0
- package/lib/server-durable-scheduler.js +26 -0
- package/lib/server-home-chat.js +29 -9
- package/lib/server-home-clay-entry.js +4 -1
- package/lib/server-home-debate-planning.js +32 -14
- package/lib/server-home-mate-creation.js +30 -11
- package/lib/server-home-models.js +14 -6
- package/lib/server-issue-links.js +18 -0
- package/lib/server.js +63 -0
- package/lib/session-notes-mcp-server.js +1 -1
- package/lib/session-pair-factory.js +42 -4
- package/lib/session-pair-query-start.js +22 -0
- package/lib/session-query-tool-bridge.js +52 -0
- package/lib/session-search.js +4 -1
- package/lib/session-split-groups.js +35 -1
- package/lib/sessions.js +51 -3
- package/lib/tool-llm.js +1 -0
- package/lib/users-default-ai-preferences.js +80 -0
- package/lib/users-home-surface-preferences.js +2 -1
- package/lib/users-preferences.js +35 -0
- package/lib/users-scheduled-task-preferences.js +44 -0
- package/lib/users.js +16 -0
- package/lib/workspace-query-projection.js +29 -0
- package/lib/workspace-query-service.js +19 -29
- package/lib/ws-schema.js +61 -1
- package/lib/yoke/adapters/antigravity.js +1 -0
- package/lib/yoke/adapters/claude-worker.js +11 -6
- package/lib/yoke/adapters/claude.js +35 -1
- package/lib/yoke/adapters/codex.js +3 -0
- package/lib/yoke/claude-user-input.js +2 -0
- package/lib/yoke/index.js +2 -0
- package/lib/yoke/mcp-bridge-server.js +7 -1
- package/lib/yoke/package.json +1 -1
- package/lib/yoke/session-tool-transport.js +53 -0
- package/lib/yoke/user-input.js +21 -7
- package/package.json +5 -6
- package/bin/claude-relay.js +0 -6
- package/lib/public/modules/app-loop-wizard.js +0 -439
package/lib/users-preferences.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
function attachPreferences(deps) {
|
|
2
2
|
var loadUsers = deps.loadUsers;
|
|
3
3
|
var saveUsers = deps.saveUsers;
|
|
4
|
+
var configModule = deps.config || require("./config");
|
|
4
5
|
|
|
5
6
|
// --- DM Favorites ---
|
|
6
7
|
|
|
@@ -289,6 +290,38 @@ function attachPreferences(deps) {
|
|
|
289
290
|
return { error: "User not found" };
|
|
290
291
|
}
|
|
291
292
|
|
|
293
|
+
// --- Per-user cursor sharing preference ---
|
|
294
|
+
|
|
295
|
+
function getCursorSharing(userId) {
|
|
296
|
+
var data = loadUsers();
|
|
297
|
+
for (var i = 0; i < data.users.length; i++) {
|
|
298
|
+
if (data.users[i].id === userId) return data.users[i].cursorSharing !== false;
|
|
299
|
+
}
|
|
300
|
+
if (userId === "default") {
|
|
301
|
+
var current = configModule.loadConfig() || {};
|
|
302
|
+
return current.cursorSharing !== false;
|
|
303
|
+
}
|
|
304
|
+
return true;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
function setCursorSharing(userId, enabled) {
|
|
308
|
+
if (typeof enabled !== "boolean") return { error: "enabled must be a boolean" };
|
|
309
|
+
var data = loadUsers();
|
|
310
|
+
for (var i = 0; i < data.users.length; i++) {
|
|
311
|
+
if (data.users[i].id === userId) {
|
|
312
|
+
data.users[i].cursorSharing = enabled;
|
|
313
|
+
saveUsers(data);
|
|
314
|
+
return { ok: true, cursorSharing: enabled };
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
if (userId === "default") {
|
|
318
|
+
var current = configModule.loadConfig() || {};
|
|
319
|
+
configModule.saveConfig(Object.assign({}, current, { cursorSharing: enabled }));
|
|
320
|
+
return { ok: true, cursorSharing: enabled };
|
|
321
|
+
}
|
|
322
|
+
return { error: "User not found" };
|
|
323
|
+
}
|
|
324
|
+
|
|
292
325
|
// --- Per-user extra auto-approve patterns ---
|
|
293
326
|
//
|
|
294
327
|
// Strings appended to Clay's managed CLAY_MANAGED_ALLOW list when
|
|
@@ -515,6 +548,8 @@ function attachPreferences(deps) {
|
|
|
515
548
|
setAutoContinue: setAutoContinue,
|
|
516
549
|
getClaudeOpenMode: getClaudeOpenMode,
|
|
517
550
|
setClaudeOpenMode: setClaudeOpenMode,
|
|
551
|
+
getCursorSharing: getCursorSharing,
|
|
552
|
+
setCursorSharing: setCursorSharing,
|
|
518
553
|
getClaudeUserAllowList: getClaudeUserAllowList,
|
|
519
554
|
setClaudeUserAllowList: setClaudeUserAllowList,
|
|
520
555
|
getMatesEnabled: getMatesEnabled,
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
function attachScheduledTaskPreferences(deps) {
|
|
2
|
+
function normalize(value) {
|
|
3
|
+
value = value && typeof value === "object" ? value : {};
|
|
4
|
+
return {
|
|
5
|
+
vendor: typeof value.vendor === "string" ? value.vendor.substring(0, 40) : "",
|
|
6
|
+
model: typeof value.model === "string" ? value.model.substring(0, 200) : "",
|
|
7
|
+
effort: typeof value.effort === "string" ? value.effort.substring(0, 40) : "",
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function single(load) {
|
|
11
|
+
try {
|
|
12
|
+
var config = deps.configModule || require("./config");
|
|
13
|
+
var current = config.loadConfig() || {};
|
|
14
|
+
if (load) return normalize(current.scheduledTaskInterviewEngine);
|
|
15
|
+
return { config: config, current: current };
|
|
16
|
+
} catch (e) { return load ? normalize(null) : null; }
|
|
17
|
+
}
|
|
18
|
+
function get(userId) {
|
|
19
|
+
var data = deps.loadUsers();
|
|
20
|
+
for (var i = 0; i < data.users.length; i++) if (data.users[i].id === userId) return normalize(data.users[i].scheduledTaskInterviewEngine);
|
|
21
|
+
return userId === "default" ? single(true) : normalize(null);
|
|
22
|
+
}
|
|
23
|
+
function set(userId, value) {
|
|
24
|
+
var next = normalize(value);
|
|
25
|
+
try {
|
|
26
|
+
var data = deps.loadUsers();
|
|
27
|
+
for (var i = 0; i < data.users.length; i++) {
|
|
28
|
+
if (data.users[i].id !== userId) continue;
|
|
29
|
+
data.users[i].scheduledTaskInterviewEngine = next; deps.saveUsers(data); return { ok: true, preference: next };
|
|
30
|
+
}
|
|
31
|
+
if (userId === "default") {
|
|
32
|
+
var target = single(false);
|
|
33
|
+
if (!target) return { error: "Unable to save interview engine preference" };
|
|
34
|
+
target.config.saveConfig(Object.assign({}, target.current, { scheduledTaskInterviewEngine: next }));
|
|
35
|
+
return { ok: true, preference: next };
|
|
36
|
+
}
|
|
37
|
+
return { error: "User not found" };
|
|
38
|
+
} catch (error) {
|
|
39
|
+
return { error: "Unable to save interview engine preference: " + (error.message || error) };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return { get: get, set: set };
|
|
43
|
+
}
|
|
44
|
+
module.exports = { attachScheduledTaskPreferences: attachScheduledTaskPreferences };
|
package/lib/users.js
CHANGED
|
@@ -9,6 +9,8 @@ var { attachPreferences } = require("./users-preferences");
|
|
|
9
9
|
var { attachHomeDockPreferences } = require("./users-home-dock-preferences");
|
|
10
10
|
var { attachHomeSurfacePreferences } = require("./users-home-surface-preferences");
|
|
11
11
|
var { attachExperimentalPreferences } = require("./users-experimental-preferences");
|
|
12
|
+
var { attachScheduledTaskPreferences } = require("./users-scheduled-task-preferences");
|
|
13
|
+
var { attachDefaultAiPreferences } = require("./users-default-ai-preferences");
|
|
12
14
|
|
|
13
15
|
var USERS_FILE = path.join(CONFIG_DIR, "users.json");
|
|
14
16
|
|
|
@@ -400,6 +402,8 @@ var preferences = attachPreferences({ loadUsers: loadUsers, saveUsers: saveUsers
|
|
|
400
402
|
var homeDockPreferences = attachHomeDockPreferences({ loadUsers: loadUsers, saveUsers: saveUsers });
|
|
401
403
|
var homeSurfacePreferences = attachHomeSurfacePreferences({ loadUsers: loadUsers, saveUsers: saveUsers });
|
|
402
404
|
var experimentalPreferences = attachExperimentalPreferences({ loadUsers: loadUsers, saveUsers: saveUsers });
|
|
405
|
+
var scheduledTaskPreferences = attachScheduledTaskPreferences({ loadUsers: loadUsers, saveUsers: saveUsers });
|
|
406
|
+
var defaultAiPreferences = attachDefaultAiPreferences({ loadUsers: loadUsers, saveUsers: saveUsers, isMultiUser: auth.isMultiUser });
|
|
403
407
|
|
|
404
408
|
// Alias auth functions
|
|
405
409
|
var isMultiUser = auth.isMultiUser;
|
|
@@ -437,6 +441,8 @@ var getAutoContinue = preferences.getAutoContinue;
|
|
|
437
441
|
var setAutoContinue = preferences.setAutoContinue;
|
|
438
442
|
var getClaudeOpenMode = preferences.getClaudeOpenMode;
|
|
439
443
|
var setClaudeOpenMode = preferences.setClaudeOpenMode;
|
|
444
|
+
var getCursorSharing = preferences.getCursorSharing;
|
|
445
|
+
var setCursorSharing = preferences.setCursorSharing;
|
|
440
446
|
var getClaudeUserAllowList = preferences.getClaudeUserAllowList;
|
|
441
447
|
var setClaudeUserAllowList = preferences.setClaudeUserAllowList;
|
|
442
448
|
var getMatesEnabled = preferences.getMatesEnabled;
|
|
@@ -454,6 +460,10 @@ var getHomeDockPreference = homeDockPreferences.getHomeDockPreference;
|
|
|
454
460
|
var setHomeDockPreference = homeDockPreferences.setHomeDockPreference;
|
|
455
461
|
var getHomeSurfacePreference = homeSurfacePreferences.getHomeSurfacePreference;
|
|
456
462
|
var setHomeSurfacePreference = homeSurfacePreferences.setHomeSurfacePreference;
|
|
463
|
+
var getScheduledTaskInterviewEngine = scheduledTaskPreferences.get;
|
|
464
|
+
var setScheduledTaskInterviewEngine = scheduledTaskPreferences.set;
|
|
465
|
+
var getDefaultAiPreference = defaultAiPreferences.getDefaultAiPreference;
|
|
466
|
+
var setDefaultAiPreference = defaultAiPreferences.setDefaultAiPreference;
|
|
457
467
|
|
|
458
468
|
module.exports = {
|
|
459
469
|
USERS_FILE: USERS_FILE,
|
|
@@ -513,6 +523,8 @@ module.exports = {
|
|
|
513
523
|
setAutoContinue: setAutoContinue,
|
|
514
524
|
getClaudeOpenMode: getClaudeOpenMode,
|
|
515
525
|
setClaudeOpenMode: setClaudeOpenMode,
|
|
526
|
+
getCursorSharing: getCursorSharing,
|
|
527
|
+
setCursorSharing: setCursorSharing,
|
|
516
528
|
getClaudeUserAllowList: getClaudeUserAllowList,
|
|
517
529
|
setClaudeUserAllowList: setClaudeUserAllowList,
|
|
518
530
|
getMatesEnabled: getMatesEnabled,
|
|
@@ -529,6 +541,10 @@ module.exports = {
|
|
|
529
541
|
setHomeDockPreference: setHomeDockPreference,
|
|
530
542
|
getHomeSurfacePreference: getHomeSurfacePreference,
|
|
531
543
|
setHomeSurfacePreference: setHomeSurfacePreference,
|
|
544
|
+
getScheduledTaskInterviewEngine: getScheduledTaskInterviewEngine,
|
|
545
|
+
setScheduledTaskInterviewEngine: setScheduledTaskInterviewEngine,
|
|
546
|
+
getDefaultAiPreference: getDefaultAiPreference,
|
|
547
|
+
setDefaultAiPreference: setDefaultAiPreference,
|
|
532
548
|
getDeletedBuiltinKeys: getDeletedBuiltinKeys,
|
|
533
549
|
addDeletedBuiltinKey: addDeletedBuiltinKey,
|
|
534
550
|
removeDeletedBuiltinKey: removeDeletedBuiltinKey,
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
function createProjection(deps) {
|
|
2
|
+
var canonicalTurns = deps.canonicalTurns;
|
|
3
|
+
var sanitizedHistory = deps.sanitizedHistory;
|
|
4
|
+
var cleanMetadata = deps.cleanMetadata;
|
|
5
|
+
var sessionRef = deps.sessionRef;
|
|
6
|
+
|
|
7
|
+
function sanitizedProject(project, turnLimit) {
|
|
8
|
+
return {
|
|
9
|
+
projectSlug: project.projectSlug,
|
|
10
|
+
projectTitle: project.projectTitle,
|
|
11
|
+
projectIcon: project.projectIcon,
|
|
12
|
+
isMate: project.isMate,
|
|
13
|
+
mateId: project.mateId,
|
|
14
|
+
sessions: project.sessions.map(function (session) {
|
|
15
|
+
return {
|
|
16
|
+
localId: sessionRef(project.projectSlug, session),
|
|
17
|
+
title: cleanMetadata(session.title || "New Session", 160),
|
|
18
|
+
createdAt: session.createdAt || 0,
|
|
19
|
+
lastActivity: session.lastActivity || session.createdAt || 0,
|
|
20
|
+
history: sanitizedHistory(canonicalTurns(session.history, turnLimit)),
|
|
21
|
+
};
|
|
22
|
+
}),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return { sanitizedProject: sanitizedProject };
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
module.exports = { createProjection: createProjection };
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
var sessionSearch = require("./session-search");
|
|
2
2
|
var builtinMates = require("./builtin-mates");
|
|
3
3
|
var workspaceQueryAccess = require("./workspace-query-access");
|
|
4
|
+
var createProjection = require("./workspace-query-projection").createProjection;
|
|
4
5
|
var crypto = require("crypto");
|
|
5
6
|
|
|
6
7
|
var MAX_PAGE = 50;
|
|
@@ -52,12 +53,12 @@ function sessionRef(projectSlug, session) {
|
|
|
52
53
|
return "session:" + digest.substring(0, 24);
|
|
53
54
|
}
|
|
54
55
|
|
|
55
|
-
function canonicalTurns(history) {
|
|
56
|
+
function canonicalTurns(history, maxChars) {
|
|
57
|
+
var turnLimit = maxChars == null ? MAX_TURN_CHARS : maxChars;
|
|
56
58
|
var turns = [];
|
|
57
59
|
var assistant = "";
|
|
58
|
-
|
|
59
60
|
function flushAssistant() {
|
|
60
|
-
var text = cleanText(assistant,
|
|
61
|
+
var text = cleanText(assistant, turnLimit);
|
|
61
62
|
if (text) turns.push({ role: "assistant", text: text });
|
|
62
63
|
assistant = "";
|
|
63
64
|
}
|
|
@@ -69,11 +70,11 @@ function canonicalTurns(history) {
|
|
|
69
70
|
flushAssistant();
|
|
70
71
|
} else if (event.type === "user_message") {
|
|
71
72
|
flushAssistant();
|
|
72
|
-
var userText = cleanText(event.text,
|
|
73
|
+
var userText = cleanText(event.text, turnLimit);
|
|
73
74
|
if (userText) turns.push({ role: "user", text: userText });
|
|
74
75
|
} else if (event.type === "delta" && typeof event.text === "string") {
|
|
75
76
|
assistant += event.text;
|
|
76
|
-
if (assistant.length >
|
|
77
|
+
if (assistant.length > turnLimit * 2) assistant = assistant.substring(0, turnLimit * 2);
|
|
77
78
|
} else if (event.type === "result" || event.type === "done" || event.type === "error") {
|
|
78
79
|
flushAssistant();
|
|
79
80
|
}
|
|
@@ -88,9 +89,17 @@ function sanitizedHistory(turns) {
|
|
|
88
89
|
history.push({ type: turns[i].role === "user" ? "user_message" : "delta", text: turns[i].text });
|
|
89
90
|
if (turns[i].role === "assistant") history.push({ type: "result" });
|
|
90
91
|
}
|
|
92
|
+
|
|
91
93
|
return history;
|
|
92
94
|
}
|
|
93
95
|
|
|
96
|
+
var projection = createProjection({
|
|
97
|
+
canonicalTurns: canonicalTurns,
|
|
98
|
+
sanitizedHistory: sanitizedHistory,
|
|
99
|
+
cleanMetadata: cleanMetadata,
|
|
100
|
+
sessionRef: sessionRef,
|
|
101
|
+
});
|
|
102
|
+
|
|
94
103
|
function sessionActivity(session) {
|
|
95
104
|
if (session.isProcessing) return "processing";
|
|
96
105
|
if (session.pendingPermissions && Object.keys(session.pendingPermissions).length > 0) return "waiting_for_approval";
|
|
@@ -283,26 +292,6 @@ function attachWorkspaceQueryService(ctx) {
|
|
|
283
292
|
var result = page(sessions, args || {});
|
|
284
293
|
return { project: { projectSlug: project.projectSlug, title: project.projectTitle }, sessions: result.items, nextCursor: result.nextCursor, total: result.total };
|
|
285
294
|
}
|
|
286
|
-
|
|
287
|
-
function sanitizedProject(project) {
|
|
288
|
-
return {
|
|
289
|
-
projectSlug: project.projectSlug,
|
|
290
|
-
projectTitle: project.projectTitle,
|
|
291
|
-
projectIcon: project.projectIcon,
|
|
292
|
-
isMate: project.isMate,
|
|
293
|
-
mateId: project.mateId,
|
|
294
|
-
sessions: project.sessions.map(function (session) {
|
|
295
|
-
return {
|
|
296
|
-
localId: sessionRef(project.projectSlug, session),
|
|
297
|
-
title: cleanMetadata(session.title || "New Session", 160),
|
|
298
|
-
createdAt: session.createdAt || 0,
|
|
299
|
-
lastActivity: session.lastActivity || session.createdAt || 0,
|
|
300
|
-
history: sanitizedHistory(canonicalTurns(session.history)),
|
|
301
|
-
};
|
|
302
|
-
}),
|
|
303
|
-
};
|
|
304
|
-
}
|
|
305
|
-
|
|
306
295
|
function searchHistory(principal, projectSlug, args) {
|
|
307
296
|
var query = cleanText(args && args.query || "", 500);
|
|
308
297
|
if (!query) throw new Error("A search query is required.");
|
|
@@ -319,8 +308,10 @@ function attachWorkspaceQueryService(ctx) {
|
|
|
319
308
|
}
|
|
320
309
|
var bySlug = {};
|
|
321
310
|
for (var v = 0; v < visible.length; v++) bySlug[visible[v].projectSlug] = visible[v];
|
|
322
|
-
var projects = visible.map(
|
|
323
|
-
|
|
311
|
+
var projects = visible.map(function (project) {
|
|
312
|
+
return projection.sanitizedProject(project, Infinity);
|
|
313
|
+
});
|
|
314
|
+
var max = decodeCursor(args && args.cursor) + parseLimit(args && args.limit, 20) + 20;
|
|
324
315
|
var ranked = sessionSearch.searchPalette(projects, query, { maxResults: max });
|
|
325
316
|
var offset = decodeCursor(args && args.cursor);
|
|
326
317
|
var limit = parseLimit(args && args.limit, 20);
|
|
@@ -345,7 +336,6 @@ function attachWorkspaceQueryService(ctx) {
|
|
|
345
336
|
}
|
|
346
337
|
return { results: results, nextCursor: offset + limit < ranked.length ? encodeCursor(offset + limit) : null };
|
|
347
338
|
}
|
|
348
|
-
|
|
349
339
|
function readSession(principal, args) {
|
|
350
340
|
var project = findProject(principal, args && args.projectSlug);
|
|
351
341
|
if (!project) throw new Error("Project not found in the owned workspace.");
|
|
@@ -435,7 +425,7 @@ function attachWorkspaceQueryService(ctx) {
|
|
|
435
425
|
var projects = collect(principal);
|
|
436
426
|
for (var p = 0; p < projects.length; p++) {
|
|
437
427
|
if (excludeSource && projects[p].projectSlug === principal.sourceProjectSlug) continue;
|
|
438
|
-
var sanitized = sanitizedProject(projects[p]);
|
|
428
|
+
var sanitized = projection.sanitizedProject(projects[p], MAX_TURN_CHARS);
|
|
439
429
|
for (var s = 0; s < sanitized.sessions.length; s++) {
|
|
440
430
|
sanitized.sessions[s]._projectTitle = sanitized.projectTitle;
|
|
441
431
|
sanitized.sessions[s]._projectSlug = sanitized.projectSlug;
|
package/lib/ws-schema.js
CHANGED
|
@@ -20,6 +20,7 @@ var schema = {
|
|
|
20
20
|
"resume_tui_session": { direction: "c2s", handler: "lib/project-sessions.js", description: "Spawn the claude --resume PTY for a TUI session shown read-only (lazy resume)" },
|
|
21
21
|
"suspend_tui_session": { direction: "c2s", handler: "lib/project-sessions.js", description: "Close a live TUI session's PTY now but keep it resumable (explicit Close)" },
|
|
22
22
|
"new_session": { direction: "c2s", handler: "lib/project-sessions.js", description: "Create a new blank session (opts: vendor, mode, sessionVisibility, dangerouslySkipPermissions)" },
|
|
23
|
+
"new_session_result": { direction: "s2c", handler: "lib/public/modules/scheduled-tasks.js", description: "Correlated result for a requested new session" },
|
|
23
24
|
"delete_session": { direction: "c2s", handler: "lib/project-sessions.js", description: "Delete a session by ID" },
|
|
24
25
|
"rename_session": { direction: "c2s", handler: "lib/project-sessions.js", description: "Rename a session" },
|
|
25
26
|
"set_session_bookmark": { direction: "c2s", handler: "lib/project-sessions.js", description: "Bookmark or unbookmark a session in the sidebar" },
|
|
@@ -44,6 +45,22 @@ var schema = {
|
|
|
44
45
|
"project_assignment_response": { direction: "c2s", handler: "lib/workspace-assignment-service.js", description: "Approve or cancel an exact-session cross-project assignment proposal" },
|
|
45
46
|
"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
47
|
"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" },
|
|
48
|
+
"issues_list": { direction: "c2s", handler: "lib/project-issues.js", description: "Project Issues issues list" },
|
|
49
|
+
"issue_read": { direction: "c2s", handler: "lib/project-issues.js", description: "Project Issues issue read" },
|
|
50
|
+
"issue_create": { direction: "c2s", handler: "lib/project-issues.js", description: "Project Issues issue create" },
|
|
51
|
+
"issue_update": { direction: "c2s", handler: "lib/project-issues.js", description: "Project Issues issue update" },
|
|
52
|
+
"issue_history": { direction: "c2s", handler: "lib/project-issues.js", description: "Project Issues issue history" },
|
|
53
|
+
"issue_revision": { direction: "c2s", handler: "lib/project-issues.js", description: "Project Issues issue revision" },
|
|
54
|
+
"issue_start_work": { direction: "c2s", handler: "lib/project-issues.js", description: "Project Issues issue start work" },
|
|
55
|
+
"issue_open_work": { direction: "c2s", handler: "lib/project-issues.js", description: "Project Issues issue open work" },
|
|
56
|
+
"issue_comment": { direction: "c2s", handler: "lib/project-issues.js", description: "Append an attributed Issue comment" },
|
|
57
|
+
"issue_delete": { direction: "c2s", handler: "lib/project-issues.js", description: "Delete an Issue (project owner only; append-only tombstone)" },
|
|
58
|
+
"issues_result": { direction: "s2c", handler: "lib/public/modules/issues.js", description: "Project Issues issues result" },
|
|
59
|
+
"issue_updated": { direction: "s2c", handler: "lib/public/modules/issues.js", description: "Project Issues issue updated" },
|
|
60
|
+
"issue_commented": { direction: "s2c", handler: "lib/public/modules/issues.js", description: "Issue after an attributed comment" },
|
|
61
|
+
"issue_deleted": { direction: "s2c", handler: "lib/public/modules/issues.js", description: "Issue deletion notification" },
|
|
62
|
+
"issue_reference_resolve": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Project Issues issue reference resolve" },
|
|
63
|
+
"issue_reference_result": { direction: "s2c", handler: "lib/public/modules/clay-issue-links.js", description: "Project Issues issue reference result" },
|
|
47
64
|
"home_clay_log_resolve": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Resolve an opaque Project Log reference through the exact bound Clay session" },
|
|
48
65
|
"home_clay_log_target": { direction: "s2c", handler: "lib/public/modules/command-palette.js", description: "Return an owner-validated project target for a rendered Log reference" },
|
|
49
66
|
|
|
@@ -53,6 +70,17 @@ var schema = {
|
|
|
53
70
|
"session_presence": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Which users are present in which sessions" },
|
|
54
71
|
"session_io": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Notify that a session has new output activity" },
|
|
55
72
|
"session_unread": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Unread message count for a session" },
|
|
73
|
+
"scheduled_tasks_list": { direction: "c2s", handler: "lib/project-scheduled-tasks.js", description: "List project schedules for the active Driver session" },
|
|
74
|
+
"scheduled_tasks_state": { direction: "s2c", handler: "lib/public/modules/scheduled-tasks.js", description: "Correlated Scheduled Tasks workbench list" },
|
|
75
|
+
"scheduled_task_interview_start": { direction: "c2s", handler: "lib/project-scheduled-tasks.js", description: "Begin the built-in interview in a newly selected Driver session" },
|
|
76
|
+
"scheduled_task_interview_start_result": { direction: "s2c", handler: "lib/public/modules/scheduled-tasks.js", description: "Correlated schedule interview start result" },
|
|
77
|
+
"scheduled_task_interview_state": { direction: "s2c", handler: "lib/public/modules/scheduled-tasks.js", description: "Session-bound schedule proposal state" },
|
|
78
|
+
"scheduled_task_manual_start": { direction: "c2s", handler: "lib/project-scheduled-tasks.js", description: "Start or resume a blank manual schedule draft in the current Driver session" },
|
|
79
|
+
"scheduled_task_manual_start_result": { direction: "s2c", handler: "lib/public/modules/scheduled-tasks.js", description: "Correlated manual schedule draft start result" },
|
|
80
|
+
"scheduled_task_create": { direction: "c2s", handler: "lib/project-scheduled-tasks.js", description: "Create a schedule from an exact pending proposal" },
|
|
81
|
+
"scheduled_task_update": { direction: "c2s", handler: "lib/project-scheduled-tasks.js", description: "Update an exact schedule revision" },
|
|
82
|
+
"scheduled_task_cancel": { direction: "c2s", handler: "lib/project-scheduled-tasks.js", description: "Cancel the active schedule interview or draft" },
|
|
83
|
+
"scheduled_task_action_result": { direction: "s2c", handler: "lib/public/modules/scheduled-tasks.js", description: "Correlated create or edit result" },
|
|
56
84
|
"search_results": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Session title search results" },
|
|
57
85
|
"search_content_results": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Full-text content search results" },
|
|
58
86
|
"fork_complete": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Fork succeeded, includes new session ID" },
|
|
@@ -85,7 +113,7 @@ var schema = {
|
|
|
85
113
|
// Chat / streaming
|
|
86
114
|
// -----------------------------------------------------------------------
|
|
87
115
|
"message": { direction: "c2s", handler: "lib/project-user-message.js", description: "Send an idempotent user chat message; message_ack confirms persistence" },
|
|
88
|
-
"message_ack": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Confirm that an idempotent user chat message was persisted" },
|
|
116
|
+
"message_ack": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Confirm that an idempotent user chat message was persisted, correlated to its exact project session" },
|
|
89
117
|
"user_message": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Echo of the user message in the timeline" },
|
|
90
118
|
"delta": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Incremental text delta from the assistant" },
|
|
91
119
|
"result": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Final assistant result text" },
|
|
@@ -194,8 +222,20 @@ var schema = {
|
|
|
194
222
|
"scheduled_message_queued": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Scheduled message has been queued" },
|
|
195
223
|
"scheduled_message_sent": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Scheduled message was sent" },
|
|
196
224
|
"scheduled_message_cancelled": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Scheduled message was cancelled" },
|
|
225
|
+
"scheduled_message_state": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Authoritative pending scheduled message state after session history replay" },
|
|
197
226
|
"auto_continue_scheduled": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Auto-continue was scheduled after rate limit" },
|
|
198
227
|
"auto_continue_fired": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Auto-continue timer fired" },
|
|
228
|
+
"pending_message_get": { direction: "c2s", handler: "lib/project-user-message.js", description: "Get the exact active session's pending-message queue and canonical paused state" },
|
|
229
|
+
"pending_message_edit": { direction: "c2s", handler: "lib/project-user-message.js", description: "Edit owned pending-message text and images using exact session and queue revision guards" },
|
|
230
|
+
"pending_message_cancel": { direction: "c2s", handler: "lib/project-user-message.js", description: "Cancel an owned pending or claimed message using exact session and queue revision guards" },
|
|
231
|
+
"pending_message_reorder": { direction: "c2s", handler: "lib/project-user-message.js", description: "Reorder the requesting user's pending messages using an exact validated permutation" },
|
|
232
|
+
"pending_message_resume": { direction: "c2s", handler: "lib/project-user-message.js", description: "Explicitly resume a canonically paused queue using exact session and queue revision guards" },
|
|
233
|
+
"pending_message_result": { direction: "s2c", handler: "lib/public/modules/pending-message-queue.js", description: "Correlated pending-message request result with exact session, project, revision, items, and paused state" },
|
|
234
|
+
"message_queued": { direction: "s2c", handler: "lib/public/modules/pending-message-queue.js", description: "Sender acknowledgement that a chat message is represented by pending queue state" },
|
|
235
|
+
"pending_message_queued": { direction: "s2c", handler: "lib/public/modules/pending-message-queue.js", description: "Authorized session-viewer notification for a newly queued message" },
|
|
236
|
+
"pending_message_state": { direction: "s2c", handler: "lib/public/modules/pending-message-queue.js", description: "Authoritative pending-message queue revision, items, and paused state" },
|
|
237
|
+
"pending_message_claimed": { direction: "s2c", handler: "lib/public/modules/pending-message-queue.js", description: "Authorized notification that one pending item is reserved for delivery" },
|
|
238
|
+
"pending_message_consumed": { direction: "s2c", handler: "lib/public/modules/pending-message-queue.js", description: "Authorized terminal notification after SDK acceptance or delivery failure" },
|
|
199
239
|
|
|
200
240
|
// -----------------------------------------------------------------------
|
|
201
241
|
// Model / config
|
|
@@ -208,6 +248,18 @@ var schema = {
|
|
|
208
248
|
"set_session_full_access": { direction: "c2s", handler: "lib/project-sessions.js", description: "Toggle Clay-managed permission skipping for a GUI session" },
|
|
209
249
|
"session_full_access_changed": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "A session's full-access state changed" },
|
|
210
250
|
"session_full_access_result": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Result of toggling session full access" },
|
|
251
|
+
"autonomous_run_arm": { direction: "c2s", handler: "lib/project-autonomous-run.js", description: "Arm an Until complete task with request identity, limits, and server-persisted success criteria after enabling Skip Permissions" },
|
|
252
|
+
"loop_interview_start": { direction: "c2s", handler: "lib/project-loop-interview.js", description: "Start a server-owned built-in Loop interview in the exact current Driver session" },
|
|
253
|
+
"loop_interview_state": { direction: "c2s", handler: "lib/project-loop-interview.js", description: "Request the persisted Loop interview brief for the exact current session" },
|
|
254
|
+
"loop_interview_start_run": { direction: "c2s", handler: "lib/project-loop-interview.js", description: "Human-approved handoff from a persisted Loop brief into the existing arm lifecycle" },
|
|
255
|
+
"loop_interview_edit": { direction: "c2s", handler: "lib/project-loop-interview.js", description: "Edit a persisted Loop brief before human approval" },
|
|
256
|
+
"loop_interview_cancel": { direction: "c2s", handler: "lib/project-loop-interview.js", description: "Cancel a persisted Loop brief" },
|
|
257
|
+
"autonomous_run_disarm": { direction: "c2s", handler: "lib/project-autonomous-run.js", description: "Deselect an exact armed Until complete run with correlated request and run identity" },
|
|
258
|
+
"autonomous_run_stop": { direction: "c2s", handler: "lib/project-autonomous-run.js", description: "Stop an exact active Until complete run with correlated request and run identity" },
|
|
259
|
+
"autonomous_run_resume": { direction: "c2s", handler: "lib/project-autonomous-run.js", description: "Explicitly resume an exact run paused after restart with correlated request and run identity" },
|
|
260
|
+
"autonomous_run_arm_result": { direction: "s2c", handler: "lib/public/modules/autonomous-run.js", description: "Session- and request-correlated Until complete arm acknowledgement with the persisted run criteria" },
|
|
261
|
+
"autonomous_run_action_result": { direction: "s2c", handler: "lib/public/modules/autonomous-run.js", description: "Session-, run-, and request-correlated Until complete action acknowledgement" },
|
|
262
|
+
"autonomous_run_state": { direction: "s2c", handler: "lib/public/modules/autonomous-run.js", description: "Synchronized Until complete run state" },
|
|
211
263
|
"reload_skills": { direction: "c2s", handler: "lib/project-sessions.js", description: "Hot-reload skills/MCP/agents on the active query without a restart" },
|
|
212
264
|
"set_mcp_permission_mode_override": { direction: "c2s", handler: "lib/project-sessions.js", description: "Override permission mode (default/auto/null) for one MCP server" },
|
|
213
265
|
"set_server_default_mode": { direction: "c2s", handler: "lib/project-sessions.js", description: "Set the server-wide default permission mode" },
|
|
@@ -239,6 +291,9 @@ var schema = {
|
|
|
239
291
|
"cursor_move": { direction: "both", handler: "lib/project-sessions.js", description: "Cursor position update from a user" },
|
|
240
292
|
"cursor_leave": { direction: "both", handler: "lib/project-sessions.js", description: "User cursor left the viewport" },
|
|
241
293
|
"text_select": { direction: "both", handler: "lib/project-sessions.js", description: "Text selection ranges from a user" },
|
|
294
|
+
"cursor_sharing_get": { direction: "c2s", handler: "lib/server-cursor-sharing.js", description: "Request the authenticated user's cursor sharing preference" },
|
|
295
|
+
"cursor_sharing_set": { direction: "c2s", handler: "lib/server-cursor-sharing.js", description: "Persist the authenticated user's cursor sharing preference" },
|
|
296
|
+
"cursor_sharing_state": { direction: "s2c", handler: "lib/public/modules/cursor-sharing-preference.js", description: "Cursor sharing preference and hydration state" },
|
|
242
297
|
|
|
243
298
|
// -----------------------------------------------------------------------
|
|
244
299
|
// Push notifications
|
|
@@ -660,6 +715,11 @@ var schema = {
|
|
|
660
715
|
"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" },
|
|
661
716
|
"home_mate_models_get": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Request an available vendor and model catalog for the selected Mate" },
|
|
662
717
|
"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" },
|
|
718
|
+
"default_ai_get": { direction: "c2s", handler: "lib/server-default-ai.js", description: "Read the authenticated user's shared Default AI and available providers" },
|
|
719
|
+
"default_ai_catalog_get": { direction: "c2s", handler: "lib/server-default-ai.js", description: "Read one installed provider catalog for the Default AI picker" },
|
|
720
|
+
"default_ai_set": { direction: "c2s", handler: "lib/server-default-ai.js", description: "Validate and persist the authenticated user's shared Default AI" },
|
|
721
|
+
"default_ai_state": { direction: "s2c", handler: "lib/public/modules/default-ai.js", description: "Correlated or same-user-broadcast canonical Default AI state" },
|
|
722
|
+
"default_ai_catalog": { direction: "s2c", handler: "lib/public/modules/default-ai.js", description: "Correlated Default AI provider catalog" },
|
|
663
723
|
"home_mate_history": { direction: "s2c", handler: "lib/public/modules/home-mate-chat.js", description: "Selected mate's initial or refreshed chat history" },
|
|
664
724
|
"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" },
|
|
665
725
|
"home_mate_permission_request": { direction: "s2c", handler: "lib/public/modules/search-clay-chat.js", description: "Exact pending permission card for a global Ask Clay conversation" },
|
|
@@ -345,6 +345,7 @@ function createAntigravityAdapter(opts) {
|
|
|
345
345
|
elicitation: false,
|
|
346
346
|
fileCheckpointing: false,
|
|
347
347
|
contextCompacting: false,
|
|
348
|
+
queryBoundTools: { mode: "none", reason: "The current Clay adapter does not forward custom-tool configuration to agy." },
|
|
348
349
|
skillSharing: true,
|
|
349
350
|
toolPolicy: ["ask", "allow-all"],
|
|
350
351
|
};
|
|
@@ -162,14 +162,16 @@ function buildZodShape(z, inputSchema) {
|
|
|
162
162
|
var key = keys[i];
|
|
163
163
|
var prop = props[key];
|
|
164
164
|
var field;
|
|
165
|
+
var nullable = Array.isArray(prop.type) && prop.type.indexOf("null") !== -1;
|
|
166
|
+
var propType = nullable ? prop.type.filter(function (type) { return type !== "null"; })[0] : prop.type;
|
|
165
167
|
|
|
166
|
-
if (
|
|
168
|
+
if (propType === "number" || propType === "integer") {
|
|
167
169
|
field = z.number();
|
|
168
|
-
} else if (
|
|
170
|
+
} else if (propType === "boolean") {
|
|
169
171
|
field = z.boolean();
|
|
170
|
-
} else if (
|
|
172
|
+
} else if (propType === "array") {
|
|
171
173
|
field = z.array(z.any());
|
|
172
|
-
} else if (
|
|
174
|
+
} else if (propType === "object") {
|
|
173
175
|
field = z.record(z.any());
|
|
174
176
|
} else if (prop.enum) {
|
|
175
177
|
field = z.enum(prop.enum);
|
|
@@ -177,6 +179,7 @@ function buildZodShape(z, inputSchema) {
|
|
|
177
179
|
field = z.string();
|
|
178
180
|
}
|
|
179
181
|
|
|
182
|
+
if (nullable) field = field.nullable();
|
|
180
183
|
if (prop.description) field = field.describe(prop.description);
|
|
181
184
|
if (required.indexOf(key) === -1) field = field.optional();
|
|
182
185
|
shape[key] = field;
|
|
@@ -204,8 +207,10 @@ function createWorkerMcpToolHandler(serverName, toolName) {
|
|
|
204
207
|
function buildMcpServersFromDescriptors(descriptors, sdk) {
|
|
205
208
|
if (!descriptors || !descriptors.length) return null;
|
|
206
209
|
var z;
|
|
207
|
-
try { z = require("zod")
|
|
208
|
-
try { z = require("zod"); } catch (e2) {
|
|
210
|
+
try { z = require("zod/v3"); } catch (e) {
|
|
211
|
+
try { z = require("zod").z; } catch (e2) {
|
|
212
|
+
try { z = require("zod"); } catch (e3) { return null; }
|
|
213
|
+
}
|
|
209
214
|
}
|
|
210
215
|
|
|
211
216
|
var servers = {};
|
|
@@ -126,6 +126,40 @@ function loadSDKSync() {
|
|
|
126
126
|
return _sdkSync;
|
|
127
127
|
}
|
|
128
128
|
|
|
129
|
+
function claudeToolInputSchema(inputSchema) {
|
|
130
|
+
if (!inputSchema || inputSchema.type !== "object" || !inputSchema.properties) return inputSchema || {};
|
|
131
|
+
// Claude's SDK bundles a Zod processor that is incompatible with Zod 4
|
|
132
|
+
// schemas from the daemon's dependency tree. Prefer the compatibility
|
|
133
|
+
// surface shipped by Zod 4; the fallback keeps older installations working.
|
|
134
|
+
var zod;
|
|
135
|
+
try { zod = require("zod/v3"); } catch (e) { zod = require("zod"); }
|
|
136
|
+
var z = zod.z || zod;
|
|
137
|
+
var shape = {};
|
|
138
|
+
var required = inputSchema.required || [];
|
|
139
|
+
var keys = Object.keys(inputSchema.properties);
|
|
140
|
+
for (var i = 0; i < keys.length; i++) {
|
|
141
|
+
var key = keys[i];
|
|
142
|
+
var property = inputSchema.properties[key] || {};
|
|
143
|
+
var field;
|
|
144
|
+
var nullable = Array.isArray(property.type) && property.type.indexOf("null") !== -1;
|
|
145
|
+
var propertyType = nullable ? property.type.filter(function (type) { return type !== "null"; })[0] : property.type;
|
|
146
|
+
if (Array.isArray(property.enum) && property.enum.length) field = z.enum(property.enum);
|
|
147
|
+
else if (propertyType === "integer") field = z.number().int();
|
|
148
|
+
else if (propertyType === "number") field = z.number();
|
|
149
|
+
else if (propertyType === "boolean") field = z.boolean();
|
|
150
|
+
else if (propertyType === "array") field = z.array(z.any());
|
|
151
|
+
else if (propertyType === "object") field = z.record(z.any());
|
|
152
|
+
else field = z.string();
|
|
153
|
+
if (nullable) field = field.nullable();
|
|
154
|
+
if (typeof property.minimum === "number" && typeof field.min === "function") field = field.min(property.minimum);
|
|
155
|
+
if (typeof property.maximum === "number" && typeof field.max === "function") field = field.max(property.maximum);
|
|
156
|
+
if (property.description && typeof field.describe === "function") field = field.describe(property.description);
|
|
157
|
+
if (required.indexOf(key) === -1) field = field.optional();
|
|
158
|
+
shape[key] = field;
|
|
159
|
+
}
|
|
160
|
+
return shape;
|
|
161
|
+
}
|
|
162
|
+
|
|
129
163
|
// --- Internal message queue (async iterable for SDK prompt) ---
|
|
130
164
|
function createMessageQueue() {
|
|
131
165
|
var queue = [];
|
|
@@ -1466,7 +1500,7 @@ function createClaudeAdapter(opts) {
|
|
|
1466
1500
|
var sdkTools = [];
|
|
1467
1501
|
for (var i = 0; i < def.tools.length; i++) {
|
|
1468
1502
|
var t = def.tools[i];
|
|
1469
|
-
sdkTools.push(sdk.tool(t.name, t.description, t.inputSchema, t.handler));
|
|
1503
|
+
sdkTools.push(sdk.tool(t.name, t.description, claudeToolInputSchema(t.inputSchema), t.handler));
|
|
1470
1504
|
}
|
|
1471
1505
|
return sdk.createSdkMcpServer({
|
|
1472
1506
|
name: def.name,
|
|
@@ -29,6 +29,7 @@ var CODEX_REASONING_DEFAULTS = {
|
|
|
29
29
|
model_supports_reasoning_summaries: true,
|
|
30
30
|
};
|
|
31
31
|
var DEFAULT_CODEX_MODEL = "gpt-6-astra";
|
|
32
|
+
var CODEX_QUERY_BOUND_TOOL_CAPABILITY = { mode: "dynamic", resume: "persisted-catalog-only" };
|
|
32
33
|
var CODEX_NOTE_TOOLS = {
|
|
33
34
|
list_notes: true,
|
|
34
35
|
write_note: true,
|
|
@@ -1476,6 +1477,7 @@ function createCodexAdapter(opts) {
|
|
|
1476
1477
|
elicitation: true,
|
|
1477
1478
|
fileCheckpointing: false,
|
|
1478
1479
|
contextCompacting: false,
|
|
1480
|
+
queryBoundTools: CODEX_QUERY_BOUND_TOOL_CAPABILITY,
|
|
1479
1481
|
skillSharing: true,
|
|
1480
1482
|
toolPolicy: ["ask", "allow-all"],
|
|
1481
1483
|
},
|
|
@@ -1578,6 +1580,7 @@ function createCodexAdapter(opts) {
|
|
|
1578
1580
|
|
|
1579
1581
|
var adapter = {
|
|
1580
1582
|
vendor: "codex",
|
|
1583
|
+
queryBoundToolCapability: CODEX_QUERY_BOUND_TOOL_CAPABILITY,
|
|
1581
1584
|
userInputCapability: { mode: "native", native: true, transport: "item/tool/requestUserInput" },
|
|
1582
1585
|
|
|
1583
1586
|
init: function(initOpts) {
|
|
@@ -28,6 +28,8 @@ function elicitation(handler, request, opts) {
|
|
|
28
28
|
function canUseTool(queryOpts) {
|
|
29
29
|
var original = queryOpts.canUseTool;
|
|
30
30
|
return function (toolName, input, opts) {
|
|
31
|
+
var validationError = toolName === "AskUserQuestion" && typeof queryOpts.validateUserInputRequest === "function" ? queryOpts.validateUserInputRequest(input) : null;
|
|
32
|
+
if (validationError) return Promise.resolve({ behavior: "deny", message: validationError });
|
|
31
33
|
if (toolName === "AskUserQuestion" && typeof queryOpts.onUserInputRequest === "function") return ask(queryOpts.onUserInputRequest, input, opts);
|
|
32
34
|
if (toolName === "AskUserQuestion") return Promise.resolve({ behavior: "deny", message: "Use the query's structured input fallback tool." });
|
|
33
35
|
if (original) return original(toolName, input, opts);
|
package/lib/yoke/index.js
CHANGED
|
@@ -6,6 +6,7 @@ var instructions = require("./instructions");
|
|
|
6
6
|
var vendorRegistry = require("./vendor-registry");
|
|
7
7
|
var completeOnce = require("./complete-once").completeOnce;
|
|
8
8
|
var userInput = require("./user-input");
|
|
9
|
+
var sessionTools = require("./session-tool-transport");
|
|
9
10
|
var createClaudeAdapter = require("./adapters/claude").createClaudeAdapter;
|
|
10
11
|
var createCodexAdapter = require("./adapters/codex").createCodexAdapter;
|
|
11
12
|
var createAntigravityAdapter = require("./adapters/antigravity").createAntigravityAdapter;
|
|
@@ -477,4 +478,5 @@ module.exports = {
|
|
|
477
478
|
validateQueryHandle: iface.validateQueryHandle,
|
|
478
479
|
completeOnce: completeOnce,
|
|
479
480
|
userInput: userInput,
|
|
481
|
+
sessionTools: sessionTools,
|
|
480
482
|
};
|
|
@@ -25,6 +25,7 @@ var clayPort = 2633;
|
|
|
25
25
|
var claySlug = "";
|
|
26
26
|
var clayTls = false;
|
|
27
27
|
var claySessionId = null;
|
|
28
|
+
var clayQueryGeneration = null;
|
|
28
29
|
var sessionOnly = false;
|
|
29
30
|
|
|
30
31
|
for (var i = 0; i < args.length; i++) {
|
|
@@ -40,6 +41,10 @@ for (var i = 0; i < args.length; i++) {
|
|
|
40
41
|
i++;
|
|
41
42
|
} else if (args[i] === "--tls") {
|
|
42
43
|
clayTls = true;
|
|
44
|
+
} else if (args[i] === "--query-generation" && args[i + 1]) {
|
|
45
|
+
clayQueryGeneration = parseInt(args[i + 1], 10);
|
|
46
|
+
if (!Number.isInteger(clayQueryGeneration)) clayQueryGeneration = null;
|
|
47
|
+
i++;
|
|
43
48
|
} else if (args[i] === "--session-only") {
|
|
44
49
|
sessionOnly = true;
|
|
45
50
|
}
|
|
@@ -115,7 +120,7 @@ function postJson(urlPath, body) {
|
|
|
115
120
|
|
|
116
121
|
// --- Fetch tools from Clay ---
|
|
117
122
|
function fetchTools() {
|
|
118
|
-
return postJson(CLAY_MCP_PATH, { action: "list_tools", sessionId: claySessionId, sessionOnly: sessionOnly }).then(function (resp) {
|
|
123
|
+
return postJson(CLAY_MCP_PATH, { action: "list_tools", sessionId: claySessionId, queryGeneration: clayQueryGeneration, sessionOnly: sessionOnly }).then(function (resp) {
|
|
119
124
|
if (resp.error) {
|
|
120
125
|
log("Failed to fetch tools: " + resp.error);
|
|
121
126
|
return [];
|
|
@@ -142,6 +147,7 @@ function callTool(serverName, toolName, args) {
|
|
|
142
147
|
tool: toolName,
|
|
143
148
|
args: args || {},
|
|
144
149
|
sessionId: claySessionId,
|
|
150
|
+
queryGeneration: clayQueryGeneration,
|
|
145
151
|
sessionOnly: sessionOnly,
|
|
146
152
|
});
|
|
147
153
|
}
|
package/lib/yoke/package.json
CHANGED