clay-server 2.31.0 → 2.32.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/lib/browser-mcp-server.js +32 -44
  2. package/lib/debate-mcp-server.js +14 -31
  3. package/lib/mcp-local.js +31 -1
  4. package/lib/project-connection.js +4 -2
  5. package/lib/project-filesystem.js +47 -1
  6. package/lib/project-http.js +75 -8
  7. package/lib/project-mcp.js +4 -0
  8. package/lib/project-sessions.js +88 -51
  9. package/lib/project-user-message.js +12 -7
  10. package/lib/project.js +204 -90
  11. package/lib/public/app.js +123 -448
  12. package/lib/public/codex-avatar.png +0 -0
  13. package/lib/public/css/debate.css +3 -2
  14. package/lib/public/css/filebrowser.css +91 -1
  15. package/lib/public/css/icon-strip.css +21 -5
  16. package/lib/public/css/input.css +181 -100
  17. package/lib/public/css/mates.css +43 -0
  18. package/lib/public/css/mention.css +48 -4
  19. package/lib/public/css/menus.css +1 -1
  20. package/lib/public/css/messages.css +2 -0
  21. package/lib/public/css/notifications-center.css +19 -0
  22. package/lib/public/index.html +46 -24
  23. package/lib/public/modules/app-connection.js +138 -37
  24. package/lib/public/modules/app-cursors.js +18 -17
  25. package/lib/public/modules/app-debate-ui.js +9 -9
  26. package/lib/public/modules/app-dm.js +170 -131
  27. package/lib/public/modules/app-favicon.js +28 -26
  28. package/lib/public/modules/app-header.js +79 -68
  29. package/lib/public/modules/app-home-hub.js +55 -47
  30. package/lib/public/modules/app-loop-ui.js +34 -18
  31. package/lib/public/modules/app-loop-wizard.js +6 -6
  32. package/lib/public/modules/app-messages.js +195 -152
  33. package/lib/public/modules/app-misc.js +23 -12
  34. package/lib/public/modules/app-notifications.js +97 -3
  35. package/lib/public/modules/app-panels.js +203 -49
  36. package/lib/public/modules/app-projects.js +159 -150
  37. package/lib/public/modules/app-rate-limit.js +5 -4
  38. package/lib/public/modules/app-rendering.js +149 -101
  39. package/lib/public/modules/app-skills-install.js +4 -4
  40. package/lib/public/modules/context-sources.js +12 -41
  41. package/lib/public/modules/dom-refs.js +21 -0
  42. package/lib/public/modules/filebrowser.js +173 -2
  43. package/lib/public/modules/input.js +86 -0
  44. package/lib/public/modules/mate-sidebar.js +38 -0
  45. package/lib/public/modules/mention.js +24 -6
  46. package/lib/public/modules/scheduler.js +1 -1
  47. package/lib/public/modules/sidebar-mates.js +66 -34
  48. package/lib/public/modules/sidebar-mobile.js +34 -30
  49. package/lib/public/modules/sidebar-projects.js +60 -57
  50. package/lib/public/modules/sidebar-sessions.js +75 -69
  51. package/lib/public/modules/sidebar.js +12 -20
  52. package/lib/public/modules/skills.js +8 -9
  53. package/lib/public/modules/sticky-notes.js +1 -2
  54. package/lib/public/modules/store.js +9 -2
  55. package/lib/public/modules/stt.js +4 -1
  56. package/lib/public/modules/tools.js +14 -9
  57. package/lib/sdk-bridge.js +511 -1113
  58. package/lib/sdk-message-processor.js +123 -134
  59. package/lib/sdk-worker.js +4 -0
  60. package/lib/server-dm.js +1 -0
  61. package/lib/server.js +86 -1
  62. package/lib/sessions.js +47 -36
  63. package/lib/ws-schema.js +2 -0
  64. package/lib/yoke/adapters/claude-worker.js +559 -0
  65. package/lib/yoke/adapters/claude.js +1418 -0
  66. package/lib/yoke/adapters/codex.js +968 -0
  67. package/lib/yoke/adapters/gemini.js +668 -0
  68. package/lib/yoke/codex-app-server.js +307 -0
  69. package/lib/yoke/index.js +199 -0
  70. package/lib/yoke/instructions.js +62 -0
  71. package/lib/yoke/interface.js +92 -0
  72. package/lib/yoke/mcp-bridge-server.js +294 -0
  73. package/lib/yoke/package.json +7 -0
  74. package/package.json +3 -1
package/lib/sessions.js CHANGED
@@ -20,6 +20,8 @@ function createSessionManager(opts) {
20
20
  var skillNames = null; // Claude-only skills to filter from slash menu
21
21
  var singleUserUnread = {}; // sessionLocalId -> unread count (single-user mode)
22
22
  var permissionRequestIndex = {}; // requestId -> sessionLocalId (O(1) lookup)
23
+ var capabilitiesByVendor = null; // set by sdk-bridge after adapter init
24
+ var defaultVendor = null; // set by sdk-bridge
23
25
 
24
26
  // --- Session persistence (centralized in ~/.clay/sessions/{encoded-cwd}/) ---
25
27
  var sessionsBase = path.join(config.CONFIG_DIR, "sessions");
@@ -86,6 +88,7 @@ function createSessionManager(opts) {
86
88
  createdAt: session.createdAt,
87
89
  };
88
90
  if (session.ownerId) metaObj.ownerId = session.ownerId;
91
+ if (session.vendor) metaObj.vendor = session.vendor;
89
92
  if (session.sessionVisibility) metaObj.sessionVisibility = session.sessionVisibility;
90
93
  if (session.lastRewindUuid) metaObj.lastRewindUuid = session.lastRewindUuid;
91
94
  if (session.loop) metaObj.loop = session.loop;
@@ -186,6 +189,7 @@ function createSessionManager(opts) {
186
189
  messageUUIDs: messageUUIDs,
187
190
  lastRewindUuid: m.lastRewindUuid || null,
188
191
  };
192
+ if (m.vendor) session.vendor = m.vendor;
189
193
  if (m.loop) session.loop = m.loop;
190
194
  if (m.debateState) session.debateState = m.debateState;
191
195
  if (m.debateSetupMode) session.debateSetupMode = true;
@@ -230,6 +234,7 @@ function createSessionManager(opts) {
230
234
  ownerId: s.ownerId || null,
231
235
  sessionVisibility: s.sessionVisibility || "shared",
232
236
  unread: unreadMap[s.localId] || 0,
237
+ vendor: s.vendor || null,
233
238
  };
234
239
  }
235
240
 
@@ -287,6 +292,7 @@ function createSessionManager(opts) {
287
292
  messageUUIDs: [],
288
293
  ownerId: (sessionOpts && sessionOpts.ownerId) || null,
289
294
  sessionVisibility: (sessionOpts && sessionOpts.sessionVisibility) || "shared",
295
+ vendor: (sessionOpts && sessionOpts.vendor) || null,
290
296
  };
291
297
  sessions.set(localId, session);
292
298
  switchSession(localId, targetWs);
@@ -314,6 +320,7 @@ function createSessionManager(opts) {
314
320
  messageUUIDs: [],
315
321
  ownerId: (sessionOpts && sessionOpts.ownerId) || null,
316
322
  sessionVisibility: (sessionOpts && sessionOpts.sessionVisibility) || "shared",
323
+ vendor: (sessionOpts && sessionOpts.vendor) || null,
317
324
  };
318
325
  sessions.set(localId, session);
319
326
  return session;
@@ -389,7 +396,9 @@ function createSessionManager(opts) {
389
396
  // In multi-user mode with a specific client, only send to that client
390
397
  var _send = (targetWs && sendTo) ? function (obj) { sendTo(targetWs, obj); } : send;
391
398
 
392
- _send({ type: "session_switched", id: localId, cliSessionId: session.cliSessionId || null, loop: session.loop || null });
399
+ var _capsByVendor = capabilitiesByVendor || {};
400
+ var _vendorCaps = _capsByVendor[session.vendor || defaultVendor || "claude"] || {};
401
+ _send({ type: "session_switched", id: localId, cliSessionId: session.cliSessionId || null, loop: session.loop || null, vendor: session.vendor || null, hasHistory: (session.history && session.history.length > 0), capabilities: _vendorCaps });
393
402
  broadcastSessionList();
394
403
  replayHistory(session, undefined, targetWs, transform);
395
404
 
@@ -677,7 +686,7 @@ function createSessionManager(opts) {
677
686
  }
678
687
 
679
688
  var _migrationFailedIds = {};
680
- function migrateSessionTitles(getSDK, migrateCwd) {
689
+ function migrateSessionTitles(adapter, migrateCwd) {
681
690
  var candidates = [];
682
691
  sessions.forEach(function(s) {
683
692
  if (s.cliSessionId && s.title && s.title !== "New Session" && s.title !== "Resumed session"
@@ -686,43 +695,41 @@ function createSessionManager(opts) {
686
695
  }
687
696
  });
688
697
  if (candidates.length === 0) return;
689
- getSDK().then(function(sdkMod) {
690
- return sdkMod.listSessions({ dir: migrateCwd }).then(function(sdkSessions) {
691
- var sdkTitles = {};
692
- for (var i = 0; i < sdkSessions.length; i++) {
693
- if (sdkSessions[i].customTitle) {
694
- sdkTitles[sdkSessions[i].sessionId] = sdkSessions[i].customTitle;
695
- }
698
+ adapter.listSessions({ dir: migrateCwd }).then(function(sdkSessions) {
699
+ var sdkTitles = {};
700
+ for (var i = 0; i < sdkSessions.length; i++) {
701
+ if (sdkSessions[i].customTitle) {
702
+ sdkTitles[sdkSessions[i].sessionId] = sdkSessions[i].customTitle;
696
703
  }
697
- var toMigrate = candidates.filter(function(item) {
698
- return sdkTitles[item.cliSessionId] !== item.title;
699
- });
700
- if (toMigrate.length === 0) return;
701
- var migrated = 0;
702
- var failed = 0;
703
- var chain = Promise.resolve();
704
- for (var j = 0; j < toMigrate.length; j++) {
705
- (function(item) {
706
- chain = chain.then(function() {
707
- return sdkMod.renameSession(item.cliSessionId, item.title, { dir: migrateCwd }).then(function() {
708
- migrated++;
709
- }).catch(function(e) {
710
- failed++;
711
- _migrationFailedIds[item.cliSessionId] = true;
712
- });
704
+ }
705
+ var toMigrate = candidates.filter(function(item) {
706
+ return sdkTitles[item.cliSessionId] !== item.title;
707
+ });
708
+ if (toMigrate.length === 0) return;
709
+ var migrated = 0;
710
+ var failed = 0;
711
+ var chain = Promise.resolve();
712
+ for (var j = 0; j < toMigrate.length; j++) {
713
+ (function(item) {
714
+ chain = chain.then(function() {
715
+ return adapter.renameSession(item.cliSessionId, item.title, { dir: migrateCwd }).then(function() {
716
+ migrated++;
717
+ }).catch(function(e) {
718
+ failed++;
719
+ _migrationFailedIds[item.cliSessionId] = true;
713
720
  });
714
- })(toMigrate[j]);
721
+ });
722
+ })(toMigrate[j]);
723
+ }
724
+ chain.then(function() {
725
+ if (migrated > 0) {
726
+ console.log("[session] Migrated " + migrated + " session title(s) to SDK format");
715
727
  }
716
- chain.then(function() {
717
- if (migrated > 0) {
718
- console.log("[session] Migrated " + migrated + " session title(s) to SDK format");
719
- }
720
- if (failed > 0) {
721
- console.log("[session] Skipped " + failed + " session(s) (CLI session not found for current user)");
722
- }
723
- }).catch(function(e) {
724
- console.error("[session] Migration chain failed:", e.message || e);
725
- });
728
+ if (failed > 0) {
729
+ console.log("[session] Skipped " + failed + " session(s) (CLI session not found for current user)");
730
+ }
731
+ }).catch(function(e) {
732
+ console.error("[session] Migration chain failed:", e.message || e);
726
733
  });
727
734
  }).catch(function() {});
728
735
  }
@@ -734,6 +741,10 @@ function createSessionManager(opts) {
734
741
  set slashCommands(v) { slashCommands = v; },
735
742
  get skillNames() { return skillNames; },
736
743
  set skillNames(v) { skillNames = v; },
744
+ get capabilitiesByVendor() { return capabilitiesByVendor; },
745
+ set capabilitiesByVendor(v) { capabilitiesByVendor = v; },
746
+ get defaultVendor() { return defaultVendor; },
747
+ set defaultVendor(v) { defaultVendor = v; },
737
748
  sessions: sessions,
738
749
  sessionsDir: sessionsDir,
739
750
  HISTORY_PAGE_SIZE: HISTORY_PAGE_SIZE,
package/lib/ws-schema.js CHANGED
@@ -256,6 +256,8 @@ var schema = {
256
256
  // -----------------------------------------------------------------------
257
257
  "fs_list": { direction: "c2s", handler: "lib/project-filesystem.js", description: "List directory contents" },
258
258
  "fs_list_result": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Directory listing result" },
259
+ "fs_search": { direction: "c2s", handler: "lib/project-filesystem.js", description: "Search files by name" },
260
+ "fs_search_result": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "File search results" },
259
261
  "fs_read": { direction: "c2s", handler: "lib/project-filesystem.js", description: "Read file contents" },
260
262
  "fs_read_result": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "File content result" },
261
263
  "fs_write": { direction: "c2s", handler: "lib/project-filesystem.js", description: "Write file contents" },