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.
Files changed (155) hide show
  1. package/LICENSE +661 -21
  2. package/LICENSES/MIT-legacy.txt +21 -0
  3. package/LICENSES/README.md +7 -0
  4. package/README.md +2 -2
  5. package/bin/cli.js +0 -2
  6. package/lib/autonomous-run-record.js +32 -0
  7. package/lib/autonomous-run-scheduler.js +92 -0
  8. package/lib/daemon.js +0 -2
  9. package/lib/default-ai-runtime.js +117 -0
  10. package/lib/durable-scheduler-record.js +61 -0
  11. package/lib/durable-scheduler-store.js +185 -0
  12. package/lib/durable-scheduler.js +495 -0
  13. package/lib/git-cli.js +1 -0
  14. package/lib/issue-work-session.js +10 -0
  15. package/lib/issues-comments.js +40 -0
  16. package/lib/issues-commit-verification.js +30 -0
  17. package/lib/issues-mcp-server.js +27 -0
  18. package/lib/issues-schema.js +119 -0
  19. package/lib/issues-service.js +339 -0
  20. package/lib/issues-store.js +210 -0
  21. package/lib/loop-cron.js +47 -0
  22. package/lib/loop-durable-schedule.js +159 -0
  23. package/lib/loop-guidance.js +35 -0
  24. package/lib/loop-registry-occurrence.js +76 -0
  25. package/lib/model-entry.js +15 -0
  26. package/lib/project-autonomous-run.js +498 -0
  27. package/lib/project-capsule-turn.js +1 -0
  28. package/lib/project-connection.js +6 -1
  29. package/lib/project-delegated-session.js +1 -0
  30. package/lib/project-filesystem.js +10 -10
  31. package/lib/project-full-access.js +86 -0
  32. package/lib/project-http.js +3 -1
  33. package/lib/project-issue-launch.js +154 -0
  34. package/lib/project-issues.js +58 -0
  35. package/lib/project-logs-mcp-server.js +8 -12
  36. package/lib/project-loop-interview.js +163 -0
  37. package/lib/project-loop.js +150 -64
  38. package/lib/project-message-delivery.js +4 -2
  39. package/lib/project-models.js +71 -3
  40. package/lib/project-pair-autonomous-stop.js +16 -0
  41. package/lib/project-pair-owned-stop.js +18 -0
  42. package/lib/project-pair-task-control.js +14 -1
  43. package/lib/project-pending-message-queue.js +264 -0
  44. package/lib/project-scheduled-messages.js +316 -0
  45. package/lib/project-scheduled-task-execution.js +236 -0
  46. package/lib/project-scheduled-tasks.js +481 -0
  47. package/lib/project-session-pair.js +16 -19
  48. package/lib/project-sessions.js +114 -31
  49. package/lib/project-tool-llm-runtime.js +48 -0
  50. package/lib/project-user-message.js +202 -60
  51. package/lib/project-workspace-query.js +25 -0
  52. package/lib/project.js +361 -69
  53. package/lib/public/app.js +85 -22
  54. package/lib/public/css/default-ai.css +33 -0
  55. package/lib/public/css/home-hub.css +15 -2
  56. package/lib/public/css/home-sidebar.css +50 -2
  57. package/lib/public/css/input.css +160 -5
  58. package/lib/public/css/issues.css +101 -0
  59. package/lib/public/css/messages.css +19 -0
  60. package/lib/public/css/pane.css +58 -7
  61. package/lib/public/css/pending-message-queue.css +187 -0
  62. package/lib/public/css/rewind.css +11 -2
  63. package/lib/public/css/scheduled-tasks.css +122 -0
  64. package/lib/public/index.html +42 -150
  65. package/lib/public/modules/app-connection.js +3 -0
  66. package/lib/public/modules/app-cursors.js +29 -12
  67. package/lib/public/modules/app-loop-ui.js +4 -8
  68. package/lib/public/modules/app-message-router.js +8 -0
  69. package/lib/public/modules/app-messages.js +34 -9
  70. package/lib/public/modules/app-projects.js +2 -0
  71. package/lib/public/modules/app-rate-limit.js +8 -5
  72. package/lib/public/modules/autonomous-run.js +285 -0
  73. package/lib/public/modules/clay-file-links.js +111 -0
  74. package/lib/public/modules/clay-issue-links.js +131 -0
  75. package/lib/public/modules/clay-log-links.js +2 -0
  76. package/lib/public/modules/cursor-sharing-preference.js +38 -0
  77. package/lib/public/modules/default-ai.js +377 -0
  78. package/lib/public/modules/filebrowser.js +43 -2
  79. package/lib/public/modules/home-sidebar.js +16 -8
  80. package/lib/public/modules/home-surface.js +5 -0
  81. package/lib/public/modules/input.js +11 -20
  82. package/lib/public/modules/issues-context.js +117 -0
  83. package/lib/public/modules/issues-render.js +29 -0
  84. package/lib/public/modules/issues.js +270 -0
  85. package/lib/public/modules/loop-interview.js +151 -0
  86. package/lib/public/modules/markdown.js +4 -0
  87. package/lib/public/modules/message-delivery.js +5 -3
  88. package/lib/public/modules/pending-message-image-editor.js +143 -0
  89. package/lib/public/modules/pending-message-queue-model.js +22 -0
  90. package/lib/public/modules/pending-message-queue.js +449 -0
  91. package/lib/public/modules/project-logs.js +2 -2
  92. package/lib/public/modules/scheduled-message-state.js +46 -0
  93. package/lib/public/modules/scheduled-task-edit-state.js +7 -0
  94. package/lib/public/modules/scheduled-task-engine.js +48 -0
  95. package/lib/public/modules/scheduled-task-form.js +122 -0
  96. package/lib/public/modules/scheduled-task-recurrence.js +46 -0
  97. package/lib/public/modules/scheduled-task-schedule-rule.js +115 -0
  98. package/lib/public/modules/scheduled-tasks.js +459 -0
  99. package/lib/public/modules/scheduler-config.js +6 -52
  100. package/lib/public/modules/scheduler.js +9 -21
  101. package/lib/public/modules/sidebar-mobile.js +3 -0
  102. package/lib/public/modules/sidebar.js +0 -11
  103. package/lib/public/modules/split-view.js +2 -0
  104. package/lib/public/modules/sticky-note-markdown.js +1 -0
  105. package/lib/public/modules/terminal.js +2 -0
  106. package/lib/public/modules/tool-palette-order.js +3 -3
  107. package/lib/public/modules/tools.js +5 -2
  108. package/lib/public/style.css +3 -0
  109. package/lib/record-revision.js +11 -0
  110. package/lib/schedule-rule.js +151 -0
  111. package/lib/schedule-validation.js +124 -0
  112. package/lib/scheduled-run-state.js +87 -0
  113. package/lib/scheduled-task-records.js +127 -0
  114. package/lib/scheduler.js +179 -196
  115. package/lib/sdk-bridge.js +157 -22
  116. package/lib/sdk-message-processor.js +3 -0
  117. package/lib/server-cursor-sharing.js +65 -0
  118. package/lib/server-default-ai.js +265 -0
  119. package/lib/server-durable-scheduler.js +26 -0
  120. package/lib/server-home-chat.js +29 -9
  121. package/lib/server-home-clay-entry.js +4 -1
  122. package/lib/server-home-debate-planning.js +32 -14
  123. package/lib/server-home-mate-creation.js +30 -11
  124. package/lib/server-home-models.js +14 -6
  125. package/lib/server-issue-links.js +18 -0
  126. package/lib/server.js +63 -0
  127. package/lib/session-notes-mcp-server.js +1 -1
  128. package/lib/session-pair-factory.js +42 -4
  129. package/lib/session-pair-query-start.js +22 -0
  130. package/lib/session-query-tool-bridge.js +52 -0
  131. package/lib/session-search.js +4 -1
  132. package/lib/session-split-groups.js +35 -1
  133. package/lib/sessions.js +51 -3
  134. package/lib/tool-llm.js +1 -0
  135. package/lib/users-default-ai-preferences.js +80 -0
  136. package/lib/users-home-surface-preferences.js +2 -1
  137. package/lib/users-preferences.js +35 -0
  138. package/lib/users-scheduled-task-preferences.js +44 -0
  139. package/lib/users.js +16 -0
  140. package/lib/workspace-query-projection.js +29 -0
  141. package/lib/workspace-query-service.js +19 -29
  142. package/lib/ws-schema.js +61 -1
  143. package/lib/yoke/adapters/antigravity.js +1 -0
  144. package/lib/yoke/adapters/claude-worker.js +11 -6
  145. package/lib/yoke/adapters/claude.js +35 -1
  146. package/lib/yoke/adapters/codex.js +3 -0
  147. package/lib/yoke/claude-user-input.js +2 -0
  148. package/lib/yoke/index.js +2 -0
  149. package/lib/yoke/mcp-bridge-server.js +7 -1
  150. package/lib/yoke/package.json +1 -1
  151. package/lib/yoke/session-tool-transport.js +53 -0
  152. package/lib/yoke/user-input.js +21 -7
  153. package/package.json +5 -6
  154. package/bin/claude-relay.js +0 -6
  155. package/lib/public/modules/app-loop-wizard.js +0 -439
@@ -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, MAX_TURN_CHARS);
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, MAX_TURN_CHARS);
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 > MAX_TURN_CHARS * 2) assistant = assistant.substring(0, MAX_TURN_CHARS * 2);
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(sanitizedProject);
323
- var max = Math.min(100, decodeCursor(args && args.cursor) + parseLimit(args && args.limit, 20) + 20);
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 (prop.type === "number" || prop.type === "integer") {
168
+ if (propType === "number" || propType === "integer") {
167
169
  field = z.number();
168
- } else if (prop.type === "boolean") {
170
+ } else if (propType === "boolean") {
169
171
  field = z.boolean();
170
- } else if (prop.type === "array") {
172
+ } else if (propType === "array") {
171
173
  field = z.array(z.any());
172
- } else if (prop.type === "object") {
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").z; } catch (e) {
208
- try { z = require("zod"); } catch (e2) { return null; }
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
  }
@@ -3,5 +3,5 @@
3
3
  "version": "0.1.0",
4
4
  "description": "YOKE - Yoke Overrides Known Engines. Vendor-independent harness abstraction for Clay.",
5
5
  "main": "index.js",
6
- "license": "MIT"
6
+ "license": "AGPL-3.0-only"
7
7
  }