clay-server 5.2.0-beta.6 → 5.2.0-beta.8

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 (109) hide show
  1. package/lib/clay-control-presentation-binding.js +96 -0
  2. package/lib/clay-control-presentation.js +128 -0
  3. package/lib/clay-control-target-projection.js +26 -0
  4. package/lib/clay-mate-chat.js +1 -0
  5. package/lib/clay-mate-knowledge.js +1 -1
  6. package/lib/clay-product-control-tools.js +1 -1
  7. package/lib/clay-product-control.js +22 -12
  8. package/lib/clay-project-records.js +2 -1
  9. package/lib/clay-scheduling.js +1 -1
  10. package/lib/clay-screen-controls.js +13 -5
  11. package/lib/clay-workspace-controls.js +2 -1
  12. package/lib/contextual-screen-snapshot.js +38 -0
  13. package/lib/mate-context-service.js +138 -0
  14. package/lib/mate-context-tools.js +21 -0
  15. package/lib/project-connection.js +8 -5
  16. package/lib/project-control-git-view.js +12 -0
  17. package/lib/project-filesystem.js +5 -1
  18. package/lib/project-http.js +3 -0
  19. package/lib/project-notifications.js +5 -4
  20. package/lib/project-product-control.js +3 -1
  21. package/lib/project-scheduled-messages.js +4 -4
  22. package/lib/project-scheduled-task-control.js +1 -1
  23. package/lib/project-session-document.js +20 -5
  24. package/lib/project-shared-browser.js +22 -5
  25. package/lib/project-studio-presentation.js +58 -0
  26. package/lib/project-user-message.js +36 -0
  27. package/lib/project-workspace-query.js +11 -1
  28. package/lib/project.js +24 -7
  29. package/lib/public/app.js +24 -0
  30. package/lib/public/appearance-bootstrap.js +2 -0
  31. package/lib/public/css/contextual-clay.css +240 -0
  32. package/lib/public/modules/app-favicon.js +7 -7
  33. package/lib/public/modules/app-message-router.js +5 -1
  34. package/lib/public/modules/app-messages.js +14 -1
  35. package/lib/public/modules/app-notifications.js +10 -3
  36. package/lib/public/modules/app-projects.js +3 -0
  37. package/lib/public/modules/clay-control-activity.js +214 -0
  38. package/lib/public/modules/clay-control-copy.js +36 -0
  39. package/lib/public/modules/clay-control-detail-targets.js +44 -0
  40. package/lib/public/modules/clay-control-object-targets.js +52 -0
  41. package/lib/public/modules/clay-control-target-visibility.js +12 -0
  42. package/lib/public/modules/clay-control-targets.js +44 -0
  43. package/lib/public/modules/clay-navigation-render.js +52 -0
  44. package/lib/public/modules/clay-owner-navigation.js +11 -2
  45. package/lib/public/modules/clay-session-links.js +31 -0
  46. package/lib/public/modules/clay-studio-bridge.js +20 -0
  47. package/lib/public/modules/clay-studio-document.js +67 -0
  48. package/lib/public/modules/clay-studio-render.js +144 -0
  49. package/lib/public/modules/clay-tool-presentation.js +4 -0
  50. package/lib/public/modules/command-palette.js +26 -31
  51. package/lib/public/modules/contextual-ask-session.js +26 -0
  52. package/lib/public/modules/contextual-clay-geometry.js +155 -0
  53. package/lib/public/modules/contextual-clay-session.js +130 -0
  54. package/lib/public/modules/contextual-clay-workspace.js +157 -0
  55. package/lib/public/modules/contextual-clay.js +237 -0
  56. package/lib/public/modules/contextual-composer.js +91 -0
  57. package/lib/public/modules/contextual-mate-context.js +115 -0
  58. package/lib/public/modules/contextual-mate-hint.js +40 -0
  59. package/lib/public/modules/contextual-mate-identity.js +23 -0
  60. package/lib/public/modules/contextual-mate-sessions.js +134 -0
  61. package/lib/public/modules/contextual-search.js +137 -0
  62. package/lib/public/modules/contextual-session-citations.js +58 -0
  63. package/lib/public/modules/filebrowser.js +20 -1
  64. package/lib/public/modules/generation-stop.js +8 -5
  65. package/lib/public/modules/git-panel.js +3 -1
  66. package/lib/public/modules/icon-strip-tooltip.js +2 -1
  67. package/lib/public/modules/input.js +35 -1
  68. package/lib/public/modules/issues-render.js +3 -2
  69. package/lib/public/modules/knowledge-db-workbench.js +4 -4
  70. package/lib/public/modules/markdown.js +2 -34
  71. package/lib/public/modules/mate-knowledge-workbench.js +1 -1
  72. package/lib/public/modules/message-delivery.js +10 -0
  73. package/lib/public/modules/pane-bridge.js +2 -2
  74. package/lib/public/modules/pending-message-queue.js +1 -0
  75. package/lib/public/modules/product-review.js +26 -0
  76. package/lib/public/modules/project-chat-identity.js +13 -4
  77. package/lib/public/modules/project-logs-render.js +3 -0
  78. package/lib/public/modules/project-mate-navigation.js +58 -21
  79. package/lib/public/modules/scheduled-tasks.js +2 -0
  80. package/lib/public/modules/search-clay-chat.js +5 -454
  81. package/lib/public/modules/shared-browser.js +2 -0
  82. package/lib/public/modules/sidebar-mobile.js +4 -3
  83. package/lib/public/modules/sidebar-projects.js +1 -0
  84. package/lib/public/modules/sidebar-sessions.js +1 -0
  85. package/lib/public/modules/split-view.js +7 -16
  86. package/lib/public/modules/stt.js +7 -2
  87. package/lib/public/modules/terminal.js +9 -0
  88. package/lib/public/modules/tools.js +4 -1
  89. package/lib/public/modules/wireframe-workbench.js +5 -2
  90. package/lib/public/style.css +2 -0
  91. package/lib/sdk-bridge.js +4 -0
  92. package/lib/server-contextual-clay-settings.js +40 -0
  93. package/lib/server-contextual-mate-sessions.js +70 -0
  94. package/lib/server-home-chat.js +7 -1
  95. package/lib/server-home-clay-entry.js +23 -4
  96. package/lib/server-home-clay-session-links.js +12 -0
  97. package/lib/server-owner-ui.js +49 -8
  98. package/lib/server-settings.js +2 -0
  99. package/lib/server.js +17 -0
  100. package/lib/sessions.js +10 -3
  101. package/lib/terminal-manager.js +18 -11
  102. package/lib/users-contextual-clay-preferences.js +31 -0
  103. package/lib/users.js +3 -0
  104. package/lib/workspace-assignment-service.js +25 -0
  105. package/lib/workspace-query-mcp-server.js +1 -1
  106. package/lib/ws-request.js +1 -0
  107. package/lib/ws-schema.js +10 -0
  108. package/lib/yoke/claude-hook-installer.js +4 -0
  109. package/package.json +1 -1
package/lib/users.js CHANGED
@@ -332,6 +332,7 @@ var creation = require("./users-create").attachCreation({ loadUsers: loadUsers,
332
332
  var createUser = creation.createUser;
333
333
  var createUserWithoutPin = creation.createUserWithoutPin;
334
334
  var permissions = attachPermissions({ loadUsers: loadUsers, saveUsers: saveUsers, findUserById: findUserById });
335
+ var contextualClayPreferences = require("./users-contextual-clay-preferences").attachContextualClayPreferences({ loadUsers: loadUsers, saveUsers: saveUsers });
335
336
  var preferences = attachPreferences({ loadUsers: loadUsers, saveUsers: saveUsers });
336
337
  var projectMateFilterPreferences = attachProjectMateFilterPreferences({ loadUsers: loadUsers, saveUsers: saveUsers });
337
338
  var homeDockPreferences = attachHomeDockPreferences({ loadUsers: loadUsers, saveUsers: saveUsers });
@@ -478,6 +479,8 @@ module.exports = {
478
479
  setToolPalette: setToolPalette,
479
480
  getTerminalFont: getTerminalFont,
480
481
  setTerminalFont: setTerminalFont,
482
+ getContextualClayGeometry: contextualClayPreferences.getContextualClayGeometry,
483
+ setContextualClayGeometry: contextualClayPreferences.setContextualClayGeometry,
481
484
  getHomeDockPreference: getHomeDockPreference,
482
485
  setHomeDockPreference: setHomeDockPreference,
483
486
  getHomeSurfacePreference: getHomeSurfacePreference,
@@ -19,6 +19,8 @@ function attachWorkspaceAssignmentService(ctx) {
19
19
  var records = [];
20
20
  var unsubscribers = {};
21
21
  var pendingRestartReplay = {};
22
+ var presentations = new WeakMap();
23
+ var presentationTargets = new WeakMap();
22
24
 
23
25
  function recordFile(userId) {
24
26
  return storageDir ? path.join(storageDir, userStorageKey(userId)) : null;
@@ -130,7 +132,27 @@ function attachWorkspaceAssignmentService(ctx) {
130
132
  return { project: project, manager: manager, session: session };
131
133
  }
132
134
 
135
+ function present(record, principal) {
136
+ try {
137
+ var display = ctx.getPresentation && ctx.getPresentation(principal), project = exactTarget(record);
138
+ if (!display || !project) return;
139
+ var view = { project: project, session: null, origin: null }; presentationTargets.set(record, view);
140
+ if (record.delivery === 'follow_up') project.getSessionManager().sessions.forEach(function (session) { if (ctx.sessionRef(record.targetProjectSlug, session) === record.targetSessionRef) { view.session = session; view.origin = session.sessionOriginId; } });
141
+ var projection = require('./clay-control-target-projection');
142
+ var target = view.session ? { kind: 'session', projectSlug: record.targetProjectSlug, sessionId: view.session.localId, sessionOriginId: view.origin } : { kind: 'project', projectSlug: record.targetProjectSlug, runtimeId: projection.runtime(project.getSessionManager()) };
143
+ var observer = display.track('assignment', record.delivery === 'follow_up' ? 'follow_up' : 'assign', target, function () {
144
+ if (exactTarget(record) !== project || view.session && (project.getSessionManager().sessions.get(view.session.localId) !== view.session || view.session.sessionOriginId !== view.origin || (view.session.ownerId || null) !== (record.userId || null))) throw new Error('Assignment target changed.');
145
+ }, 'review');
146
+ if (observer) { presentations.set(record, observer); var expiry = setTimeout(function () { presentations.delete(record); }, 300000); expiry.unref(); }
147
+ } catch (error) { /* Presentation never changes the assignment decision. */ }
148
+ }
133
149
  function emit(record, eventType) {
150
+ var observer = presentations.get(record);
151
+ if (observer) {
152
+ if (record.status === 'starting') observer.phase('queued');
153
+ else if (record.status === 'running') observer.phase('running');
154
+ else if (record.status !== 'proposed') { observer.finish({ status: record.status === 'interrupted' ? 'failed' : record.status, outcome: record.status === 'interrupted' ? 'uncertain' : undefined }); presentations.delete(record); }
155
+ }
134
156
  var source = exactSource(record);
135
157
  if (!source) return;
136
158
  source.manager.sendAndRecord(source.session, {
@@ -193,6 +215,7 @@ function attachWorkspaceAssignmentService(ctx) {
193
215
  if (!exactSource(record)) throw new Error("Source conversation is no longer available.");
194
216
  records.push(record);
195
217
  saveUser(record.userId);
218
+ present(record, principal);
196
219
  emit(record, "project_assignment_proposal");
197
220
  return publicRecord(record);
198
221
  }
@@ -229,6 +252,7 @@ function attachWorkspaceAssignmentService(ctx) {
229
252
  if (!exactSource(record)) throw new Error("Source conversation is no longer available.");
230
253
  records.push(record);
231
254
  saveUser(record.userId);
255
+ present(record, principal);
232
256
  emit(record, "project_assignment_proposal");
233
257
  return publicRecord(record);
234
258
  }
@@ -267,6 +291,7 @@ function attachWorkspaceAssignmentService(ctx) {
267
291
  }
268
292
 
269
293
  function watch(record, manager, session) {
294
+ var view = presentationTargets.get(record); if (view) { view.session = session; view.origin = session.sessionOriginId; var observer = presentations.get(record); if (observer && observer.target) observer.target({ kind: 'session', projectSlug: record.targetProjectSlug, sessionId: session.localId, sessionOriginId: session.sessionOriginId }); }
270
295
  var unsubscribe = manager.subscribeSession(session.localId, function (event) {
271
296
  if (event.type === "session_id") {
272
297
  record.targetSessionRef = ctx.sessionRef(record.targetProjectSlug, session);
@@ -32,7 +32,7 @@ function handler(bound, method) {
32
32
  };
33
33
  }
34
34
 
35
- var SESSION_CITATION = " When citing a returned session in user-visible text, write [clayos/<sessionRef> — short label] so Clay Studio renders an owner-validated session control.";
35
+ var SESSION_CITATION = " Cite returned sessions as Markdown links: [short human label](session:OPAQUE_REFERENCE), replacing the entire target with the exact returned sessionRef. Do not prepend a project name, change the opaque reference, or wrap citations in backticks/code. For a specific returned entry, append #entry-<entryIndex> using its exact returned entry index. Legacy [clayos/<sessionRef> — short label] remains supported. Labels are presentation only; Clay Studio resolves the exact reference with the authenticated owner's permissions.";
36
36
 
37
37
  function commonTools(bound) {
38
38
  return [
package/lib/ws-request.js CHANGED
@@ -8,6 +8,7 @@ function parseWsRequestUrl(requestUrl) {
8
8
  path: parsed.pathname || "/",
9
9
  pane: parsed.query.pane === "1",
10
10
  paneSession: paneSession,
11
+ contextual: parsed.query.pane === "1" && parsed.query.contextual === "1",
11
12
  };
12
13
  }
13
14
 
package/lib/ws-schema.js CHANGED
@@ -11,6 +11,11 @@
11
11
  * Use it as a reference when adding new message types.
12
12
  */
13
13
 
14
+ // message.contextualSnapshot: version=1, viewId, nullable projectTitle,
15
+ // conversationTitle/projectSlug (160 characters), nullable positive sessionId,
16
+ // screen=Home|Project|Direct message. Private canonical owner delivery only.
17
+ // Persisted user_message metadata is echoed in message_ack only after recording;
18
+ // queued admission ACK has no snapshot. Never part of user text/pastes or authority.
14
19
  var schema = {
15
20
 
16
21
  // -----------------------------------------------------------------------
@@ -62,6 +67,7 @@ var schema = {
62
67
  "project_assignment_response": { direction: "c2s", handler: "lib/workspace-assignment-service.js", description: "Approve or cancel an exact-session cross-project assignment proposal" },
63
68
  "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" },
64
69
  "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" },
70
+ "home_clay_contextual_session": { direction: "s2c", handler: "lib/public/modules/contextual-search.js", description: "Return the exact fresh canonical session for an idempotent contextual Ask request; does not submit or execute a message" },
65
71
  "issues_list": { direction: "c2s", handler: "lib/project-issues.js", description: "Project Issues issues list" },
66
72
  "issue_read": { direction: "c2s", handler: "lib/project-issues.js", description: "Project Issues issue read" },
67
73
  "issue_create": { direction: "c2s", handler: "lib/project-issues.js", description: "Project Issues issue create" },
@@ -482,6 +488,7 @@ var schema = {
482
488
  "term_resized": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Terminal was resized" },
483
489
  "term_exited": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Terminal process exited" },
484
490
  "term_closed": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Terminal session was closed" },
491
+ "term_control_projection": { direction: "s2c", handler: "lib/public/modules/terminal.js", description: "Authoritative terminal identity/revision after owner resize without echoing resize input" },
485
492
  "term_list": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Full list of open terminals" },
486
493
  "term_error": { direction: "s2c", handler: "lib/public/modules/app-messages.js", description: "Terminal error (e.g. access denied)" },
487
494
  "shell_command": { direction: "c2s", handler: "lib/project-shell-command.js", description: "Run a one-shot shell command for agent context" },
@@ -785,6 +792,7 @@ var schema = {
785
792
  // -----------------------------------------------------------------------
786
793
  "home_mate_open": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Open or restore the selected mate's embedded chat session" },
787
794
  "home_clay_ask": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Start a fresh builtin Clay conversation from the global search drawer" },
795
+ "contextual_mate_sessions_result": { direction: "s2c", handler: "lib/public/modules/contextual-mate-sessions.js", description: "Exact owner-private saved Mate conversation list or selection receipt; no transcript tap or underlying navigation" },
788
796
  "home_mate_sessions_list": { direction: "c2s", handler: "lib/server-home-chat.js", description: "List the current user's conversations with the selected mate" },
789
797
  "home_mate_session_open": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Open one explicit conversation with the selected mate" },
790
798
  "home_mate_send": { direction: "c2s", handler: "lib/server-home-chat.js", description: "Send a message to the selected mate from the home hub" },
@@ -814,6 +822,8 @@ var schema = {
814
822
  "clay_navigation_offer": { direction: "s2c", handler: "lib/public/modules/clay-owner-navigation.js", description: "Offer one exact reviewed navigation to a selected owner connection" },
815
823
  "clay_navigation_claim": { direction: "c2s", handler: "lib/server-owner-ui.js", description: "Claim an offered navigation with live source/target revalidation" },
816
824
  "clay_navigation_apply": { direction: "s2c", handler: "lib/public/modules/clay-owner-navigation.js", description: "Invoke the shared conversation navigator after live claim" },
825
+ "clay_studio_rendered": { direction: "c2s", handler: "lib/project-studio-presentation.js", description: "Exact source-viewer workbench render receipt; no product effects" },
826
+ "clay_navigation_rendered": { direction: "c2s", handler: "lib/server-owner-ui.js", description: "Bounded exact-viewer rendered conversation evidence; acceptance alone remains separate" },
817
827
  "clay_navigation_ack": { direction: "c2s", handler: "lib/server-owner-ui.js", description: "Client invocation acknowledgement; never proof of visible rendering" },
818
828
  "context_view_get": { direction: "c2s", handler: "lib/server-context-view.js", description: "Read the authenticated user's context display preference" },
819
829
  "context_view_set": { direction: "c2s", handler: "lib/server-context-view.js", description: "Persist the authenticated user's context display preference" },
@@ -45,6 +45,10 @@ var CLAY_MANAGED_ALLOW = [
45
45
  "mcp__clay-debate__propose_debate",
46
46
  "mcp__clay-mate-creation__propose_mate",
47
47
  "mcp__clay-history__*",
48
+ "mcp__clay-workspace__read_current_context",
49
+ "mcp__clay-workspace__read_selected_context",
50
+ "mcp__clay-workspace__open_context_conversation",
51
+ "mcp__clay-workspace__read_context_navigation_receipt",
48
52
  "mcp__clay-workspace__read_owner_screen",
49
53
  "mcp__clay-workspace__inspect_owner_screen_change",
50
54
  "mcp__clay-workspace__control_owner_screen",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "clay-server",
3
- "version": "5.2.0-beta.6",
3
+ "version": "5.2.0-beta.8",
4
4
  "description": "Self-hosted team workspace for Claude Code and Codex. Multi-user, browser-based, with persistent AI mates.",
5
5
  "bin": {
6
6
  "clay-server": "./bin/cli.js"