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.
- package/lib/browser-mcp-server.js +32 -44
- package/lib/debate-mcp-server.js +14 -31
- package/lib/mcp-local.js +31 -1
- package/lib/project-connection.js +4 -2
- package/lib/project-filesystem.js +47 -1
- package/lib/project-http.js +75 -8
- package/lib/project-mcp.js +4 -0
- package/lib/project-sessions.js +88 -51
- package/lib/project-user-message.js +12 -7
- package/lib/project.js +204 -90
- package/lib/public/app.js +123 -448
- package/lib/public/codex-avatar.png +0 -0
- package/lib/public/css/debate.css +3 -2
- package/lib/public/css/filebrowser.css +91 -1
- package/lib/public/css/icon-strip.css +21 -5
- package/lib/public/css/input.css +181 -100
- package/lib/public/css/mates.css +43 -0
- package/lib/public/css/mention.css +48 -4
- package/lib/public/css/menus.css +1 -1
- package/lib/public/css/messages.css +2 -0
- package/lib/public/css/notifications-center.css +19 -0
- package/lib/public/index.html +46 -24
- package/lib/public/modules/app-connection.js +138 -37
- package/lib/public/modules/app-cursors.js +18 -17
- package/lib/public/modules/app-debate-ui.js +9 -9
- package/lib/public/modules/app-dm.js +170 -131
- package/lib/public/modules/app-favicon.js +28 -26
- package/lib/public/modules/app-header.js +79 -68
- package/lib/public/modules/app-home-hub.js +55 -47
- package/lib/public/modules/app-loop-ui.js +34 -18
- package/lib/public/modules/app-loop-wizard.js +6 -6
- package/lib/public/modules/app-messages.js +195 -152
- package/lib/public/modules/app-misc.js +23 -12
- package/lib/public/modules/app-notifications.js +97 -3
- package/lib/public/modules/app-panels.js +203 -49
- package/lib/public/modules/app-projects.js +159 -150
- package/lib/public/modules/app-rate-limit.js +5 -4
- package/lib/public/modules/app-rendering.js +149 -101
- package/lib/public/modules/app-skills-install.js +4 -4
- package/lib/public/modules/context-sources.js +12 -41
- package/lib/public/modules/dom-refs.js +21 -0
- package/lib/public/modules/filebrowser.js +173 -2
- package/lib/public/modules/input.js +86 -0
- package/lib/public/modules/mate-sidebar.js +38 -0
- package/lib/public/modules/mention.js +24 -6
- package/lib/public/modules/scheduler.js +1 -1
- package/lib/public/modules/sidebar-mates.js +66 -34
- package/lib/public/modules/sidebar-mobile.js +34 -30
- package/lib/public/modules/sidebar-projects.js +60 -57
- package/lib/public/modules/sidebar-sessions.js +75 -69
- package/lib/public/modules/sidebar.js +12 -20
- package/lib/public/modules/skills.js +8 -9
- package/lib/public/modules/sticky-notes.js +1 -2
- package/lib/public/modules/store.js +9 -2
- package/lib/public/modules/stt.js +4 -1
- package/lib/public/modules/tools.js +14 -9
- package/lib/sdk-bridge.js +511 -1113
- package/lib/sdk-message-processor.js +123 -134
- package/lib/sdk-worker.js +4 -0
- package/lib/server-dm.js +1 -0
- package/lib/server.js +86 -1
- package/lib/sessions.js +47 -36
- package/lib/ws-schema.js +2 -0
- package/lib/yoke/adapters/claude-worker.js +559 -0
- package/lib/yoke/adapters/claude.js +1418 -0
- package/lib/yoke/adapters/codex.js +968 -0
- package/lib/yoke/adapters/gemini.js +668 -0
- package/lib/yoke/codex-app-server.js +307 -0
- package/lib/yoke/index.js +199 -0
- package/lib/yoke/instructions.js +62 -0
- package/lib/yoke/interface.js +92 -0
- package/lib/yoke/mcp-bridge-server.js +294 -0
- package/lib/yoke/package.json +7 -0
- 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
|
-
|
|
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(
|
|
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
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
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
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
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
|
-
})
|
|
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
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
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" },
|