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
@@ -0,0 +1,174 @@
1
+ export function documentIdentity(file) {
2
+ if (file && file.clientIdentity) return file.clientIdentity;
3
+ var source = file && file.common ? "shared:" + encodeURIComponent(file.ownMateId || "unknown") : "local";
4
+ return source + ":" + encodeURIComponent(file && file.id || file && file.name || "");
5
+ }
6
+
7
+ export function blankKnowledgeState() {
8
+ return { files: [], searchFiles: [], searchTotal: 0, tabs: [], selected: null, drafts: {}, query: "", loading: false, searching: false,
9
+ error: "", wide: false, fullscreen: false, explorerScroll: 0, selectionVersion: 0, latestReads: {}, syncRetry: null,
10
+ navigationBack: [], navigationForward: [] };
11
+ }
12
+
13
+ function withDraft(state, id, draft) {
14
+ var drafts = Object.assign({}, state.drafts);
15
+ drafts[id] = draft;
16
+ return Object.assign({}, state, { drafts: drafts });
17
+ }
18
+
19
+ export function selectKnowledgeDocument(state, id) {
20
+ if (!state.drafts[id]) return state;
21
+ var tabs = state.tabs.indexOf(id) === -1 ? state.tabs.concat([id]) : state.tabs.slice();
22
+ return Object.assign({}, state, { tabs: tabs, selected: id, selectionVersion: (state.selectionVersion || 0) + 1, error: "" });
23
+ }
24
+
25
+ export function editKnowledgeDraft(state, id, patch) {
26
+ var current = state.drafts[id];
27
+ if (!current) return state;
28
+ return withDraft(state, id, Object.assign({}, current, patch, { version: (current.version || 0) + 1 }));
29
+ }
30
+
31
+ export function failKnowledgeOffline(state, id, message) {
32
+ var draft = id && state.drafts[id];
33
+ if (!draft) return Object.assign({}, state, { error: message });
34
+ return withDraft(state, id, Object.assign({}, draft, { savingRequest: null, error: message }));
35
+ }
36
+
37
+ export function closeKnowledgeTab(state, id) {
38
+ var draft = state.drafts[id];
39
+ if (draft && draft.dirty) return withDraft(state, id, Object.assign({}, draft, { error: "Save this draft before closing its tab." }));
40
+ var tabs = state.tabs.filter(function (item) { return item !== id; });
41
+ return Object.assign({}, state, { tabs: tabs, selected: state.selected === id ? tabs[tabs.length - 1] || null : state.selected,
42
+ selectionVersion: (state.selectionVersion || 0) + 1 });
43
+ }
44
+
45
+ export function beginKnowledgeRead(state, file, requestId, replace) {
46
+ var id = documentIdentity(file);
47
+ var version = (state.selectionVersion || 0) + 1;
48
+ var latestReads = Object.assign({}, state.latestReads);
49
+ latestReads[id] = requestId;
50
+ return {
51
+ state: Object.assign({}, state, { loading: true, error: "", selectionVersion: version, latestReads: latestReads }),
52
+ pending: { type: "knowledge_read", requestId: requestId, documentId: id, file: Object.assign({}, file), selectionVersion: version,
53
+ draftVersion: state.drafts[id] ? state.drafts[id].version || 0 : null, replace: replace === true },
54
+ };
55
+ }
56
+
57
+ export function applyKnowledgeRead(state, pending, msg) {
58
+ if (!pending || state.latestReads[pending.documentId] !== pending.requestId) return state;
59
+ var latestReads = Object.assign({}, state.latestReads);
60
+ delete latestReads[pending.documentId];
61
+ var existing = state.drafts[pending.documentId];
62
+ var unchanged = !existing || (existing.version || 0) === pending.draftVersion;
63
+ var mayReplace = !existing || ((!existing.dirty && !existing.savingRequest) || pending.replace) && unchanged;
64
+ var next = Object.assign({}, state, { latestReads: latestReads });
65
+ if (mayReplace) {
66
+ var writable = !pending.file.common && msg.writable === true; var recovered = writable && msg.recoveredDraft || null;
67
+ var file = Object.assign({}, pending.file, { id: msg.id || pending.file.id, name: msg.name || pending.file.name, itemType: msg.itemType || pending.file.itemType });
68
+ var draft = { file: file, content: recovered ? recovered.content : msg.content || "", savedContent: msg.content || "",
69
+ revision: msg.revision || null, dirty: false, writable: writable, newDocument: false, mode: writable ? "edit" : "read",
70
+ version: Math.max(existing ? existing.version || 0 : 0, recovered ? recovered.clientVersion || 0 : 0), editScroll: existing ? existing.editScroll || 0 : 0,
71
+ readScroll: existing ? existing.readScroll || 0 : 0, error: "", conflict: false, savingRequest: null, syncWarning: "",
72
+ outline: msg.outline || [], outgoing: msg.outgoing || [], backlinks: msg.backlinks || [], properties: msg.properties || {}, tags: msg.tags || [],
73
+ propertyErrors: msg.propertyErrors || [], cursor: recovered && recovered.cursor || null, draftSavedAt: recovered && recovered.savedAt || null,
74
+ draftVersion: recovered && recovered.clientVersion || 0, indexComplete: msg.indexComplete !== false, indexErrors: msg.indexErrors || [],
75
+ indexWarning: msg.indexComplete === false ? "Some workspace documents could not be indexed; links and backlinks may be incomplete." : "" };
76
+ draft.mode = "read"; draft.dirty = !!recovered && recovered.content !== draft.savedContent;
77
+ if (recovered && recovered.baseRevision !== draft.revision) { draft.conflict = true; draft.diskRevision = draft.revision; draft.conflictRevision = recovered.baseRevision || null; draft.error = "A recovered draft is based on an older disk version. Keep the draft or reload the disk version."; }
78
+ next = withDraft(next, pending.documentId, draft);
79
+ }
80
+ var tabs = next.tabs.indexOf(pending.documentId) === -1 ? next.tabs.concat([pending.documentId]) : next.tabs.slice();
81
+ var currentSelection = next.selectionVersion === pending.selectionVersion;
82
+ return Object.assign({}, next, { tabs: tabs, selected: currentSelection ? pending.documentId : next.selected,
83
+ loading: currentSelection ? false : next.loading, error: currentSelection ? "" : next.error });
84
+ }
85
+
86
+ export function beginKnowledgeSave(state, id, requestId, name) {
87
+ var draft = state.drafts[id];
88
+ var pending = { type: "knowledge_save", requestId: requestId, documentId: id, submittedContent: draft.content,
89
+ submittedVersion: draft.version || 0, submittedRevision: draft.revision || null, draftVersion: draft.draftVersion || draft.version || 0, name: name };
90
+ return { state: withDraft(state, id, Object.assign({}, draft, { savingRequest: requestId, error: "", conflict: false })), pending: pending };
91
+ }
92
+
93
+ export function applyKnowledgeSave(state, pending, msg) {
94
+ var current = state.drafts[pending.documentId];
95
+ if (!current) return state;
96
+ var nextId = documentIdentity({ id: msg.id || current.file.id, name: msg.name, common: false });
97
+ var laterEdits = (current.version || 0) !== pending.submittedVersion || current.content !== pending.submittedContent;
98
+ var saved = Object.assign({}, current, { file: { id: msg.id || current.file.id, name: msg.name, common: false, itemType: "text" }, name: msg.name.replace(/\.md$/i, ""),
99
+ revision: msg.revision, savedContent: pending.submittedContent, dirty: laterEdits, newDocument: false,
100
+ savingRequest: current.savingRequest === pending.requestId ? null : current.savingRequest, error: "", conflict: false,
101
+ syncWarning: msg.indexSyncPending ? (msg.syncError || "Saved on disk; Knowledge index synchronization is pending.") : "" });
102
+ var drafts = Object.assign({}, state.drafts);
103
+ delete drafts[pending.documentId];
104
+ drafts[nextId] = saved;
105
+ return Object.assign({}, state, { drafts: drafts,
106
+ tabs: state.tabs.map(function (item) { return item === pending.documentId ? nextId : item; }),
107
+ selected: state.selected === pending.documentId ? nextId : state.selected,
108
+ syncRetry: msg.indexSyncPending ? { names: msg.syncNames || [msg.name], documentId: nextId } : state.syncRetry });
109
+ }
110
+
111
+ export function beginKnowledgeRename(state, id, requestId, name) {
112
+ var draft = state.drafts[id];
113
+ return { state: withDraft(state, id, Object.assign({}, draft, { savingRequest: requestId, error: "" })),
114
+ pending: { type: "knowledge_rename", requestId: requestId, documentId: id, name: name, submittedRevision: draft.revision || null } };
115
+ }
116
+
117
+ export function applyKnowledgeRename(state, pending, msg) {
118
+ var current = state.drafts[pending.documentId];
119
+ if (!current) return state;
120
+ var nextId = documentIdentity({ id: msg.id || current.file.id, name: msg.name, common: false });
121
+ var moved = Object.assign({}, current, { file: { id: msg.id || current.file.id, name: msg.name, common: false, itemType: "text" }, name: msg.name.replace(/\.md$/i, ""),
122
+ content: msg.content || current.content, savedContent: msg.content || current.savedContent, dirty: false,
123
+ revision: msg.revision, savingRequest: current.savingRequest === pending.requestId ? null : current.savingRequest,
124
+ error: msg.linkUpdateFailures && msg.linkUpdateFailures.length ? "Moved, but some linked documents could not be updated." : "",
125
+ syncWarning: msg.indexSyncPending ? (msg.syncError || "Renamed on disk; Knowledge index synchronization is pending.") : "" });
126
+ var drafts = Object.assign({}, state.drafts);
127
+ delete drafts[pending.documentId];
128
+ drafts[nextId] = moved;
129
+ (msg.updatedDocuments || []).forEach(function (updated) {
130
+ var id = documentIdentity({ id: updated.id, name: updated.name, common: false }); var open = drafts[id]; if (!open || id === nextId) return;
131
+ drafts[id] = open.dirty ? Object.assign({}, open, { conflict: true, diskRevision: updated.revision, error: "This document was rewritten during the move. Reload it or deliberately keep your newer draft." }) :
132
+ Object.assign({}, open, { content: updated.content, savedContent: updated.content, revision: updated.revision, dirty: false });
133
+ });
134
+ return Object.assign({}, state, { drafts: drafts,
135
+ tabs: state.tabs.map(function (item) { return item === pending.documentId ? nextId : item; }),
136
+ selected: state.selected === pending.documentId ? nextId : state.selected,
137
+ syncRetry: msg.indexSyncPending ? { names: msg.syncNames || [msg.from, msg.name], documentId: nextId } : state.syncRetry });
138
+ }
139
+
140
+ export function applyKnowledgeDiscard(state, pending, msg) {
141
+ var draft = state.drafts[pending.documentId]; if (!draft) return state;
142
+ if ((draft.version || 0) !== pending.submittedVersion) return withDraft(state, pending.documentId, Object.assign({}, draft, { conflict: true, diskRevision: msg.revision, error: "The disk version loaded, but newer local edits were preserved." }));
143
+ return withDraft(state, pending.documentId, Object.assign({}, draft, { content: msg.content, savedContent: msg.content, revision: msg.revision,
144
+ dirty: false, conflict: false, error: "", draftState: "", draftVersion: 0, cursor: null }));
145
+ }
146
+
147
+ export function beginKnowledgeDelete(state, id, requestId, revision) {
148
+ return { state: state, pending: { type: "knowledge_delete", requestId: requestId, documentId: id, submittedRevision: revision } };
149
+ }
150
+
151
+ export function applyKnowledgeDelete(state, pending, msg) {
152
+ var drafts = Object.assign({}, state.drafts);
153
+ delete drafts[pending.documentId];
154
+ var remaining = state.tabs.filter(function (item) { return item !== pending.documentId; });
155
+ var selected = state.selected === pending.documentId ? remaining[remaining.length - 1] || null : state.selected;
156
+ return Object.assign({}, state, { drafts: drafts, tabs: remaining, selected: selected,
157
+ syncRetry: msg.indexSyncPending ? { names: msg.syncNames || [msg.name], documentId: null } : state.syncRetry,
158
+ error: msg.indexSyncPending ? (msg.syncError || "Deleted on disk; Knowledge index synchronization is pending.") : state.error });
159
+ }
160
+
161
+ export function failKnowledgeRequest(state, pending, msg) {
162
+ if (!pending) return Object.assign({}, state, { loading: false, searching: false, error: msg.error || "Knowledge request failed." });
163
+ if (pending.type === "knowledge_read") {
164
+ var latestReads = Object.assign({}, state.latestReads);
165
+ if (latestReads[pending.documentId] === pending.requestId) delete latestReads[pending.documentId];
166
+ return Object.assign({}, state, { latestReads: latestReads, loading: false, error: msg.error || "Knowledge read failed." });
167
+ }
168
+ var draft = pending.documentId && state.drafts[pending.documentId];
169
+ if (!draft) return Object.assign({}, state, { loading: false, searching: false, error: msg.error || "Knowledge request failed." });
170
+ return withDraft(state, pending.documentId, Object.assign({}, draft, {
171
+ savingRequest: draft.savingRequest === pending.requestId ? null : draft.savingRequest,
172
+ error: msg.error || "Knowledge request failed.", conflict: msg.code === "STALE",
173
+ }));
174
+ }