clay-server 5.1.0-beta.1 → 5.1.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 (157) hide show
  1. package/LICENSES/README.md +4 -0
  2. package/LICENSES/dicebear-avatars.md +16 -0
  3. package/lib/daemon-project-access.js +7 -1
  4. package/lib/daemon.js +2 -0
  5. package/lib/dicebear-avatar.js +62 -0
  6. package/lib/knowledge-db-service.js +175 -0
  7. package/lib/knowledge-db-validation.js +0 -0
  8. package/lib/knowledge-document-index.js +49 -0
  9. package/lib/knowledge-draft-store.js +56 -0
  10. package/lib/knowledge-file-store.js +199 -0
  11. package/lib/knowledge-markdown.js +128 -0
  12. package/lib/mate-knowledge-mcp-server.js +29 -6
  13. package/lib/mate-knowledge-service.js +23 -2
  14. package/lib/mate-knowledge-sync.js +36 -21
  15. package/lib/mate-workspace-color.js +4 -0
  16. package/lib/mates.js +18 -0
  17. package/lib/project-connection.js +36 -2
  18. package/lib/project-debate-proposal.js +6 -0
  19. package/lib/project-debate-workspace.js +43 -0
  20. package/lib/project-debate.js +1 -0
  21. package/lib/project-knowledge.js +315 -136
  22. package/lib/project-mate-creation-proposal.js +1 -0
  23. package/lib/project-sessions.js +39 -2
  24. package/lib/project-user-knowledge.js +60 -0
  25. package/lib/project.js +59 -18
  26. package/lib/public/app.js +73 -34
  27. package/lib/public/clay-studio-wordmark-bold.svg +20 -0
  28. package/lib/public/css/clay-workspace.css +105 -0
  29. package/lib/public/css/debates-workbench.css +47 -0
  30. package/lib/public/css/home-debate-live.css +26 -0
  31. package/lib/public/css/home-hub.css +3 -1
  32. package/lib/public/css/home-mate-model-picker.css +15 -131
  33. package/lib/public/css/home-mate-settings.css +168 -16
  34. package/lib/public/css/icon-strip.css +249 -32
  35. package/lib/public/css/mate-conversation.css +176 -0
  36. package/lib/public/css/mate-knowledge-workbench.css +118 -0
  37. package/lib/public/css/mate-workspace-color.css +16 -0
  38. package/lib/public/css/mates.css +28 -28
  39. package/lib/public/css/messages.css +1 -114
  40. package/lib/public/css/mobile-nav.css +16 -16
  41. package/lib/public/css/overlays.css +8 -0
  42. package/lib/public/css/project-logs.css +7 -0
  43. package/lib/public/css/project-mate-creation.css +105 -0
  44. package/lib/public/css/right-workbench.css +3 -3
  45. package/lib/public/css/session-folders.css +80 -21
  46. package/lib/public/css/sidebar.css +183 -107
  47. package/lib/public/css/title-bar.css +151 -0
  48. package/lib/public/css/worker-delegation.css +47 -0
  49. package/lib/public/css/worker-proposal.css +72 -150
  50. package/lib/public/css/you.css +74 -0
  51. package/lib/public/index.html +33 -101
  52. package/lib/public/modules/account-island.js +230 -0
  53. package/lib/public/modules/app-cursors.js +19 -43
  54. package/lib/public/modules/app-debate-ui.js +4 -3
  55. package/lib/public/modules/app-header.js +106 -0
  56. package/lib/public/modules/app-message-router.js +12 -3
  57. package/lib/public/modules/app-messages.js +34 -9
  58. package/lib/public/modules/app-notifications.js +4 -7
  59. package/lib/public/modules/app-projects.js +5 -38
  60. package/lib/public/modules/app-rendering.js +12 -13
  61. package/lib/public/modules/avatar.js +25 -9
  62. package/lib/public/modules/chat-render-runtime.js +16 -4
  63. package/lib/public/modules/command-palette.js +2 -15
  64. package/lib/public/modules/cursor-sharing-preference.js +3 -3
  65. package/lib/public/modules/debate-controls.js +299 -0
  66. package/lib/public/modules/debate.js +2 -0
  67. package/lib/public/modules/debates-workbench.js +339 -0
  68. package/lib/public/modules/default-ai.js +81 -65
  69. package/lib/public/modules/home-debate-controls.js +18 -289
  70. package/lib/public/modules/home-mate-avatar-editor.js +228 -0
  71. package/lib/public/modules/home-mate-color-picker.js +66 -0
  72. package/lib/public/modules/home-mate-creation.js +1 -1
  73. package/lib/public/modules/home-mate-instructions.js +90 -0
  74. package/lib/public/modules/home-mate-model-picker.js +80 -271
  75. package/lib/public/modules/home-mate-profile-editor.js +72 -0
  76. package/lib/public/modules/home-mate-settings.js +118 -125
  77. package/lib/public/modules/home-shell.js +3 -0
  78. package/lib/public/modules/home-surface-boot.js +1 -9
  79. package/lib/public/modules/icon-strip-tooltip.js +95 -0
  80. package/lib/public/modules/knowledge-db-edit-state.js +35 -0
  81. package/lib/public/modules/knowledge-db-workbench.js +234 -0
  82. package/lib/public/modules/knowledge-history-state.js +55 -0
  83. package/lib/public/modules/knowledge-markdown-editor.js +57 -0
  84. package/lib/public/modules/knowledge-preview-links.js +70 -0
  85. package/lib/public/modules/knowledge-workbench-shell.js +21 -0
  86. package/lib/public/modules/mate-knowledge-workbench-state.js +174 -0
  87. package/lib/public/modules/mate-knowledge-workbench.js +500 -0
  88. package/lib/public/modules/mate-knowledge.js +11 -3
  89. package/lib/public/modules/mate-management.js +54 -10
  90. package/lib/public/modules/mate-sidebar.js +11 -1
  91. package/lib/public/modules/mate-workspace-color.js +33 -0
  92. package/lib/public/modules/mention.js +5 -13
  93. package/lib/public/modules/profile.js +51 -18
  94. package/lib/public/modules/project-chat-identity.js +79 -0
  95. package/lib/public/modules/project-debate-planning-workspace.js +250 -0
  96. package/lib/public/modules/project-debate-workspace.js +185 -0
  97. package/lib/public/modules/project-header-identity.js +127 -0
  98. package/lib/public/modules/project-logs-render.js +9 -4
  99. package/lib/public/modules/project-mate-creation-workspace.js +414 -0
  100. package/lib/public/modules/project-mate-navigation.js +238 -0
  101. package/lib/public/modules/project-session-navigation.js +29 -0
  102. package/lib/public/modules/project-switcher.js +6 -8
  103. package/lib/public/modules/projects-hub-view.js +5 -6
  104. package/lib/public/modules/projects-hub.js +2 -6
  105. package/lib/public/modules/qrcode.js +27 -8
  106. package/lib/public/modules/search-clay-chat.js +8 -11
  107. package/lib/public/modules/session-activity-tooltip.js +12 -0
  108. package/lib/public/modules/session-create-form.js +86 -14
  109. package/lib/public/modules/session-create.js +50 -7
  110. package/lib/public/modules/session-list-visibility.js +41 -0
  111. package/lib/public/modules/session-presence-ui.js +4 -1
  112. package/lib/public/modules/session-title-marquee.js +51 -0
  113. package/lib/public/modules/sidebar-mates.js +3 -50
  114. package/lib/public/modules/sidebar-mobile.js +63 -60
  115. package/lib/public/modules/sidebar-projects.js +84 -97
  116. package/lib/public/modules/sidebar-session-folders-ui.js +2 -2
  117. package/lib/public/modules/sidebar-session-hierarchy.js +149 -70
  118. package/lib/public/modules/sidebar-sessions.js +49 -50
  119. package/lib/public/modules/sidebar.js +11 -13
  120. package/lib/public/modules/thinking-lifecycle.js +7 -6
  121. package/lib/public/modules/tool-palette-order.js +4 -3
  122. package/lib/public/modules/tool-palette.js +13 -3
  123. package/lib/public/modules/tools.js +22 -22
  124. package/lib/public/modules/worker-proposal.js +42 -8
  125. package/lib/public/modules/worker-runtime-picker.js +115 -0
  126. package/lib/public/modules/you-activity.js +121 -0
  127. package/lib/public/modules/you.js +251 -0
  128. package/lib/public/style.css +16 -8
  129. package/lib/public/vendor/codemirror/LICENSE +21 -0
  130. package/lib/public/vendor/codemirror/codemirror.css +344 -0
  131. package/lib/public/vendor/codemirror/codemirror.js +9884 -0
  132. package/lib/public/vendor/codemirror/continuelist.js +101 -0
  133. package/lib/public/vendor/codemirror/markdown.js +886 -0
  134. package/lib/public/vendor/codemirror/show-hint.css +37 -0
  135. package/lib/public/vendor/codemirror/show-hint.js +523 -0
  136. package/lib/sdk-bridge.js +15 -3
  137. package/lib/server-admin.js +11 -0
  138. package/lib/server-home-chat-events.js +1 -1
  139. package/lib/server-home-chat.js +25 -3
  140. package/lib/server-home-debate-planning.js +4 -1
  141. package/lib/server-home-debates.js +2 -0
  142. package/lib/server-home-mate-creation.js +4 -1
  143. package/lib/server-mate-instructions.js +44 -0
  144. package/lib/server-mates.js +12 -3
  145. package/lib/server-palette.js +1 -1
  146. package/lib/server-settings.js +65 -1
  147. package/lib/server-user-knowledge.js +119 -0
  148. package/lib/server.js +21 -1
  149. package/lib/session-visibility.js +7 -2
  150. package/lib/sessions.js +32 -6
  151. package/lib/user-knowledge-service.js +167 -0
  152. package/lib/users-permissions.js +7 -0
  153. package/lib/users-project-mate-filter-preferences.js +39 -0
  154. package/lib/users.js +6 -0
  155. package/lib/workspace-query-access.js +4 -1
  156. package/lib/ws-schema.js +50 -0
  157. package/package.json +10 -1
@@ -6,6 +6,7 @@ var emailAccounts = require("./email-accounts");
6
6
  var { getCodexConfig } = require("./codex-defaults");
7
7
  var yoke = require("./yoke");
8
8
  var permissionModes = require("./session-permission-mode");
9
+ var sessionProvenance = require("./session-provenance");
9
10
 
10
11
  function dispatchMessageSafely(handleMessage, sendTo, slug, ws, msg) {
11
12
  try {
@@ -45,6 +46,36 @@ function buildInitialModelInfo(sm, initialVendor, initialModel, initialModels, s
45
46
  };
46
47
  }
47
48
 
49
+ function buildRestoredSessionMessage(active, initialEffort, capabilities, permissionState) {
50
+ return {
51
+ type: "session_switched",
52
+ id: active.localId,
53
+ sessionOriginId: active.sessionOriginId || null,
54
+ sessionRole: sessionProvenance.isWorker(active) ? "worker" : "driver",
55
+ cliSessionId: active.cliSessionId || null,
56
+ loop: active.loop || null,
57
+ vendor: active.vendor || null,
58
+ model: active.model || null,
59
+ effort: active.effort || initialEffort || null,
60
+ hasHistory: !!(active.history && active.history.length > 0),
61
+ capabilities: capabilities,
62
+ isProcessing: !!active.isProcessing,
63
+ mateCreation: active.mateCreationMode === true,
64
+ mateCreationPhase: active.homeMateCreationPhase || null,
65
+ debatePlanning: active.debateSetupMode === true,
66
+ debatePhase: active.homeDebatePhase || null,
67
+ mode: active.mode || "gui",
68
+ terminalId: typeof active.terminalId === "number" ? active.terminalId : null,
69
+ runtimeMode: active.runtimeMode || null,
70
+ runtimeTerminalId: typeof active.runtimeTerminalId === "number" ? active.runtimeTerminalId : null,
71
+ tuiSuspended: !!active.tuiSuspended,
72
+ permissionMode: permissionState.requestedPermissionMode,
73
+ effectivePermissionMode: permissionState.effectivePermissionMode,
74
+ permissionCapabilities: permissionState.permissionCapabilities,
75
+ mcpPermissionModeOverrides: permissionState.mcpPermissionModeOverrides,
76
+ };
77
+ }
78
+
48
79
  /**
49
80
  * Attach connection/disconnection handlers to a project context.
50
81
  *
@@ -63,6 +94,8 @@ function attachConnection(ctx) {
63
94
  var cwd = ctx.cwd;
64
95
  var slug = ctx.slug;
65
96
  var isMate = ctx.isMate;
97
+ var mateId = ctx.mateId || null;
98
+ var mateDisplayName = ctx.mateDisplayName || "";
66
99
  var osUsers = ctx.osUsers;
67
100
  var debug = ctx.debug;
68
101
  var dangerouslySkipPermissions = ctx.dangerouslySkipPermissions;
@@ -184,7 +217,7 @@ function attachConnection(ctx) {
184
217
  sm.saveSessionFile(restoredActive);
185
218
  }
186
219
  var initialModels = (sm.modelsByVendor && sm.modelsByVendor[initialVendor]) || sm.availableModels || [];
187
- sendTo(ws, { type: "info", cwd: cwd, slug: slug, project: title || project, version: currentVersion, debug: !!debug, dangerouslySkipPermissions: dangerouslySkipPermissions, osUsers: osUsers, lanHost: lanHost, projectCount: _filteredProjects.length, projects: _filteredProjects, projectOwnerId: projectOwnerId, ownerLocked: ownerLocked, vendors: yoke.VENDOR_REGISTRY });
220
+ sendTo(ws, { type: "info", cwd: cwd, slug: slug, project: title || project, version: currentVersion, debug: !!debug, dangerouslySkipPermissions: dangerouslySkipPermissions, osUsers: osUsers, lanHost: lanHost, projectCount: _filteredProjects.length, projects: _filteredProjects, projectOwnerId: projectOwnerId, ownerLocked: ownerLocked, vendors: yoke.VENDOR_REGISTRY, isMate: isMate, mateId: isMate ? mateId : null, mateDisplayName: isMate ? (mateDisplayName || title || project || "Mate") : "" });
188
221
  if (typeof sendCursorSharingState === "function") sendCursorSharingState(ws);
189
222
  // Update notifications are pushed on a scheduled interval (see
190
223
  // scheduleUpdateBroadcast). We no longer push on connect to avoid
@@ -262,7 +295,7 @@ function attachConnection(ctx) {
262
295
  }
263
296
  var _vendorCaps = (sm.capabilitiesByVendor && sm.capabilitiesByVendor[active.vendor || sm.defaultVendor || "claude"]) || {};
264
297
  var activePermissionState = permissionModes.clientState(active, sm.currentPermissionMode, sm.defaultVendor);
265
- sendTo(ws, { type: "session_switched", id: active.localId, sessionOriginId: active.sessionOriginId || null, cliSessionId: active.cliSessionId || null, loop: active.loop || null, vendor: active.vendor || null, model: active.model || null, effort: active.effort || initialEffort || null, hasHistory: (active.history && active.history.length > 0), capabilities: _vendorCaps, isProcessing: !!active.isProcessing, mode: active.mode || "gui", terminalId: typeof active.terminalId === "number" ? active.terminalId : null, runtimeMode: active.runtimeMode || null, runtimeTerminalId: typeof active.runtimeTerminalId === "number" ? active.runtimeTerminalId : null, tuiSuspended: !!active.tuiSuspended, permissionMode: activePermissionState.requestedPermissionMode, effectivePermissionMode: activePermissionState.effectivePermissionMode, permissionCapabilities: activePermissionState.permissionCapabilities, mcpPermissionModeOverrides: activePermissionState.mcpPermissionModeOverrides });
298
+ sendTo(ws, buildRestoredSessionMessage(active, initialEffort, _vendorCaps, activePermissionState));
266
299
  if (ctx.autonomousRun) sendTo(ws, { type: "autonomous_run_state", sessionId: active.localId, run: ctx.autonomousRun.project(active.autonomousRun) });
267
300
  // Send per-session context sources
268
301
  var sessionSources = loadContextSources(slug, active.localId);
@@ -382,5 +415,6 @@ function attachConnection(ctx) {
382
415
  module.exports = {
383
416
  attachConnection: attachConnection,
384
417
  buildInitialModelInfo: buildInitialModelInfo,
418
+ buildRestoredSessionMessage: buildRestoredSessionMessage,
385
419
  dispatchMessageSafely: dispatchMessageSafely,
386
420
  };
@@ -227,6 +227,12 @@ function attachDebateProposal(ctx) {
227
227
 
228
228
  var found = findPendingProposal(ws, msg);
229
229
  if (!found) return true;
230
+ if (msg.sessionId != null && (String(found.pending.session.localId) !== String(msg.sessionId)
231
+ || String(ws._clayActiveSession) !== String(msg.sessionId)
232
+ || (found.pending.session.ownerId && (!ws._clayUser || ws._clayUser.id !== found.pending.session.ownerId)))) {
233
+ ctx.sendTo(ws, { type: "debate_error", error: "This proposal belongs to a different session." });
234
+ return true;
235
+ }
230
236
  startApprovedProposal(ws, msg, found).catch(function (error) {
231
237
  delete pendingProposals[found.key];
232
238
  rejectProposal(ws, found.pending, error && error.message ? error.message : "The selected debate models could not be verified.");
@@ -0,0 +1,43 @@
1
+ // Project-bound access to the same participation actions used by Home debates.
2
+ function handleProjectDebateControl(ws, msg, session, engine, sendTo) {
3
+ if (msg.type !== "project_debate_control" && msg.type !== "project_debate_state") return false;
4
+ var userId = ws && ws._clayUser && ws._clayUser.id;
5
+ var valid = session && msg.sessionId != null && String(session.localId) === String(msg.sessionId)
6
+ && (!session.ownerId || session.ownerId === userId);
7
+ if (msg.type === "project_debate_state") {
8
+ sendTo(ws, { type: "project_debate_state", sessionId: msg.sessionId, header: valid ? debateHeader(session) : null });
9
+ return true;
10
+ }
11
+ var ok = false;
12
+ if (valid) {
13
+ if (session.homeDebatePlanning) ok = engine.handleHomeControl(ws, msg, session);
14
+ else if (msg.action === "hand_raise") { engine.handleDebateHandRaise(ws, session); ok = true; }
15
+ else if (msg.action === "stop") ok = engine.handleDebateStop(ws, session);
16
+ else if (msg.action === "cancel_stop") ok = engine.handleDebateCancelStop(ws, session);
17
+ else if (msg.action === "user_floor") { engine.handleDebateUserFloorResponse(ws, msg, session); ok = true; }
18
+ else if (msg.action === "conclude" || msg.action === "resume") {
19
+ engine.handleDebateConcludeResponse(ws, { action: msg.action === "resume" ? "continue" : msg.response, text: msg.text || "" }, session);
20
+ ok = true;
21
+ }
22
+ }
23
+ sendTo(ws, { type: "project_debate_control_result", sessionId: msg.sessionId, ok: !!ok, error: ok ? null : "This debate action is no longer available. Reopen the debate and try again." });
24
+ return true;
25
+ }
26
+ function debateHeader(session) {
27
+ var header = null;
28
+ (session.history || []).forEach(function (event) {
29
+ if (event.type === "debate_started") header = Object.assign({}, event, { role: "debate_header", phase: "live", round: 1, interaction: null, handRaised: false });
30
+ if (!header) return;
31
+ if (event.round) header.round = event.round;
32
+ if (event.type === "debate_conclude_confirm") header.interaction = "conclude";
33
+ if (event.type === "debate_user_floor") header.interaction = "user_floor";
34
+ if (event.type === "debate_user_floor_done") { header.interaction = null; header.handRaised = false; }
35
+ if (event.type === "debate_hand_raised") header.handRaised = true;
36
+ if (event.type === "debate_stop_requested") header.stopping = true;
37
+ if (event.type === "debate_stop_cancelled") header.stopping = false;
38
+ if (event.type === "debate_turn" || event.type === "debate_resumed") { header.interaction = null; header.phase = "live"; }
39
+ if (event.type === "debate_ended") { header.phase = event.reason === "interrupted" ? "interrupted" : "ended"; header.reason = event.reason; header.interaction = null; header.stopping = false; }
40
+ });
41
+ return header;
42
+ }
43
+ module.exports = { handleProjectDebateControl: handleProjectDebateControl, debateHeader: debateHeader };
@@ -1859,6 +1859,7 @@ function attachDebate(ctx) {
1859
1859
  handleDebateHandRaise: handleDebateHandRaise,
1860
1860
  handleDebateComment: handleDebateComment,
1861
1861
  handleDebateStop: handleDebateStop,
1862
+ handleDebateCancelStop: handleDebateCancelStop,
1862
1863
  handleDebateConcludeResponse: handleDebateConcludeResponse,
1863
1864
  handleDebateConfirmBrief: handleDebateConfirmBrief,
1864
1865
  handleDebateUserFloorResponse: handleDebateUserFloorResponse,