clay-server 5.1.0-beta.1 → 5.1.0-beta.3

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 (231) hide show
  1. package/LICENSES/README.md +4 -0
  2. package/LICENSES/dicebear-avatars.md +16 -0
  3. package/bin/cli.js +9 -91
  4. package/lib/builtin-mates.js +7 -7
  5. package/lib/daemon-project-access.js +7 -1
  6. package/lib/daemon-settings.js +11 -0
  7. package/lib/daemon.js +10 -37
  8. package/lib/dicebear-avatar.js +62 -0
  9. package/lib/knowledge-db-service.js +175 -0
  10. package/lib/knowledge-db-validation.js +0 -0
  11. package/lib/knowledge-document-index.js +49 -0
  12. package/lib/knowledge-draft-store.js +56 -0
  13. package/lib/knowledge-file-store.js +199 -0
  14. package/lib/knowledge-markdown.js +128 -0
  15. package/lib/linear-store.js +35 -8
  16. package/lib/mate-identity-file.js +39 -0
  17. package/lib/mate-knowledge-mcp-server.js +29 -6
  18. package/lib/mate-knowledge-service.js +23 -2
  19. package/lib/mate-knowledge-sync.js +37 -22
  20. package/lib/mate-ready-creation.js +2 -1
  21. package/lib/mate-workspace-color.js +4 -0
  22. package/lib/mates-identity.js +4 -4
  23. package/lib/mates-prompts.js +4 -3
  24. package/lib/mates.js +30 -11
  25. package/lib/os-users.js +5 -16
  26. package/lib/project-connection.js +36 -9
  27. package/lib/project-debate-proposal.js +6 -0
  28. package/lib/project-debate-workspace.js +43 -0
  29. package/lib/project-debate.js +4 -2
  30. package/lib/project-filesystem.js +21 -39
  31. package/lib/project-knowledge.js +315 -136
  32. package/lib/project-mate-creation-proposal.js +1 -0
  33. package/lib/project-mate-interaction.js +7 -6
  34. package/lib/project-server-settings.js +31 -0
  35. package/lib/project-sessions.js +92 -182
  36. package/lib/project-user-knowledge.js +60 -0
  37. package/lib/project.js +62 -21
  38. package/lib/public/app.js +79 -71
  39. package/lib/public/clay-studio-wordmark-bold.svg +20 -0
  40. package/lib/public/css/clay-workspace.css +105 -0
  41. package/lib/public/css/debates-workbench.css +47 -0
  42. package/lib/public/css/home-debate-live.css +26 -0
  43. package/lib/public/css/home-hub.css +3 -1
  44. package/lib/public/css/home-mate-model-picker.css +15 -131
  45. package/lib/public/css/home-mate-settings.css +168 -16
  46. package/lib/public/css/icon-strip.css +249 -32
  47. package/lib/public/css/input.css +3 -1
  48. package/lib/public/css/mate-conversation.css +176 -0
  49. package/lib/public/css/mate-knowledge-workbench.css +118 -0
  50. package/lib/public/css/mate-workspace-color.css +16 -0
  51. package/lib/public/css/mates.css +28 -28
  52. package/lib/public/css/menus.css +3 -0
  53. package/lib/public/css/messages.css +1 -114
  54. package/lib/public/css/mobile-nav.css +16 -16
  55. package/lib/public/css/overlays.css +15 -0
  56. package/lib/public/css/project-logs.css +7 -0
  57. package/lib/public/css/project-mate-creation.css +105 -0
  58. package/lib/public/css/project-settings-modal.css +56 -0
  59. package/lib/public/css/right-workbench.css +3 -3
  60. package/lib/public/css/server-settings-system.css +125 -0
  61. package/lib/public/css/session-folders.css +80 -21
  62. package/lib/public/css/session-github.css +25 -16
  63. package/lib/public/css/settings-ui.css +247 -22
  64. package/lib/public/css/shared-browser.css +7 -3
  65. package/lib/public/css/sidebar.css +183 -107
  66. package/lib/public/css/title-bar.css +156 -1
  67. package/lib/public/css/worker-delegation.css +47 -0
  68. package/lib/public/css/worker-proposal.css +72 -150
  69. package/lib/public/css/you.css +74 -0
  70. package/lib/public/index.html +206 -548
  71. package/lib/public/modules/account-island.js +232 -0
  72. package/lib/public/modules/admin-settings-email.js +197 -0
  73. package/lib/public/modules/admin-settings-invitations.js +183 -0
  74. package/lib/public/modules/admin-settings-projects.js +198 -0
  75. package/lib/public/modules/admin-settings-ui.js +100 -0
  76. package/lib/public/modules/admin-settings-users.js +331 -0
  77. package/lib/public/modules/admin.js +19 -949
  78. package/lib/public/modules/app-cursors.js +19 -43
  79. package/lib/public/modules/app-debate-ui.js +4 -3
  80. package/lib/public/modules/app-dm.js +0 -2
  81. package/lib/public/modules/app-header.js +106 -0
  82. package/lib/public/modules/app-message-router.js +12 -3
  83. package/lib/public/modules/app-messages.js +47 -61
  84. package/lib/public/modules/app-notifications.js +4 -7
  85. package/lib/public/modules/app-projects.js +5 -38
  86. package/lib/public/modules/app-rate-limit.js +70 -12
  87. package/lib/public/modules/app-rendering.js +12 -13
  88. package/lib/public/modules/avatar.js +30 -9
  89. package/lib/public/modules/chat-render-runtime.js +16 -4
  90. package/lib/public/modules/command-palette.js +2 -15
  91. package/lib/public/modules/context-sources.js +27 -18
  92. package/lib/public/modules/cursor-sharing-preference.js +3 -3
  93. package/lib/public/modules/debate-controls.js +299 -0
  94. package/lib/public/modules/debate.js +2 -0
  95. package/lib/public/modules/debates-workbench.js +339 -0
  96. package/lib/public/modules/default-ai.js +88 -65
  97. package/lib/public/modules/header-tui-font.js +10 -20
  98. package/lib/public/modules/home-debate-controls.js +18 -289
  99. package/lib/public/modules/home-mate-avatar-editor.js +228 -0
  100. package/lib/public/modules/home-mate-color-picker.js +66 -0
  101. package/lib/public/modules/home-mate-creation.js +1 -1
  102. package/lib/public/modules/home-mate-instructions.js +90 -0
  103. package/lib/public/modules/home-mate-model-picker.js +80 -271
  104. package/lib/public/modules/home-mate-profile-editor.js +72 -0
  105. package/lib/public/modules/home-mate-settings.js +118 -125
  106. package/lib/public/modules/home-shell.js +3 -0
  107. package/lib/public/modules/home-surface-boot.js +1 -9
  108. package/lib/public/modules/icon-strip-tooltip.js +95 -0
  109. package/lib/public/modules/knowledge-db-edit-state.js +35 -0
  110. package/lib/public/modules/knowledge-db-workbench.js +234 -0
  111. package/lib/public/modules/knowledge-history-state.js +55 -0
  112. package/lib/public/modules/knowledge-markdown-editor.js +57 -0
  113. package/lib/public/modules/knowledge-preview-links.js +70 -0
  114. package/lib/public/modules/knowledge-workbench-shell.js +21 -0
  115. package/lib/public/modules/linear-settings.js +3 -2
  116. package/lib/public/modules/markdown.js +5 -6
  117. package/lib/public/modules/mate-knowledge-workbench-state.js +174 -0
  118. package/lib/public/modules/mate-knowledge-workbench.js +500 -0
  119. package/lib/public/modules/mate-knowledge.js +11 -3
  120. package/lib/public/modules/mate-management.js +54 -10
  121. package/lib/public/modules/mate-sidebar.js +11 -1
  122. package/lib/public/modules/mate-workspace-color.js +33 -0
  123. package/lib/public/modules/mention.js +5 -13
  124. package/lib/public/modules/notification-settings.js +81 -0
  125. package/lib/public/modules/notifications.js +44 -28
  126. package/lib/public/modules/personal-settings-dialog.js +51 -0
  127. package/lib/public/modules/profile.js +66 -24
  128. package/lib/public/modules/project-chat-identity.js +79 -0
  129. package/lib/public/modules/project-debate-planning-workspace.js +250 -0
  130. package/lib/public/modules/project-debate-workspace.js +185 -0
  131. package/lib/public/modules/project-header-identity.js +127 -0
  132. package/lib/public/modules/project-logs-render.js +9 -4
  133. package/lib/public/modules/project-mate-creation-workspace.js +414 -0
  134. package/lib/public/modules/project-mate-navigation.js +238 -0
  135. package/lib/public/modules/project-session-navigation.js +29 -0
  136. package/lib/public/modules/project-settings-environment.js +106 -0
  137. package/lib/public/modules/project-settings.js +72 -628
  138. package/lib/public/modules/project-switcher.js +6 -8
  139. package/lib/public/modules/projects-hub-view.js +5 -6
  140. package/lib/public/modules/projects-hub.js +2 -6
  141. package/lib/public/modules/qrcode.js +27 -8
  142. package/lib/public/modules/search-clay-chat.js +8 -11
  143. package/lib/public/modules/server-settings-controls.js +316 -0
  144. package/lib/public/modules/server-settings-environment.js +194 -0
  145. package/lib/public/modules/server-settings-navigation.js +39 -0
  146. package/lib/public/modules/server-settings-state.js +54 -0
  147. package/lib/public/modules/server-settings.js +116 -788
  148. package/lib/public/modules/server-storage-settings.js +84 -0
  149. package/lib/public/modules/session-activity-tooltip.js +12 -0
  150. package/lib/public/modules/session-create-form.js +86 -14
  151. package/lib/public/modules/session-create.js +50 -7
  152. package/lib/public/modules/session-github.js +2 -1
  153. package/lib/public/modules/session-list-visibility.js +41 -0
  154. package/lib/public/modules/session-presence-ui.js +3 -0
  155. package/lib/public/modules/session-title-marquee.js +51 -0
  156. package/lib/public/modules/settings-env-values.js +34 -0
  157. package/lib/public/modules/settings-select.js +121 -0
  158. package/lib/public/modules/shared-browser.js +22 -12
  159. package/lib/public/modules/sidebar-mates.js +3 -50
  160. package/lib/public/modules/sidebar-mobile.js +63 -60
  161. package/lib/public/modules/sidebar-projects.js +84 -97
  162. package/lib/public/modules/sidebar-session-folders-ui.js +2 -2
  163. package/lib/public/modules/sidebar-session-hierarchy.js +149 -70
  164. package/lib/public/modules/sidebar-sessions.js +49 -50
  165. package/lib/public/modules/sidebar.js +11 -13
  166. package/lib/public/modules/stt-picker.js +14 -5
  167. package/lib/public/modules/terminal-prefs.js +22 -0
  168. package/lib/public/modules/theme.js +88 -52
  169. package/lib/public/modules/thinking-lifecycle.js +7 -6
  170. package/lib/public/modules/tool-palette-order.js +4 -3
  171. package/lib/public/modules/tool-palette.js +13 -3
  172. package/lib/public/modules/tools.js +22 -22
  173. package/lib/public/modules/user-settings-account.js +318 -0
  174. package/lib/public/modules/user-settings-appearance.js +55 -0
  175. package/lib/public/modules/user-settings-editors.js +24 -0
  176. package/lib/public/modules/user-settings-integrations.js +104 -0
  177. package/lib/public/modules/user-settings-layout.js +80 -0
  178. package/lib/public/modules/user-settings-preferences.js +48 -0
  179. package/lib/public/modules/user-settings-profile.js +53 -0
  180. package/lib/public/modules/user-settings-themes.js +38 -0
  181. package/lib/public/modules/user-settings-voice.js +75 -0
  182. package/lib/public/modules/user-settings.js +53 -480
  183. package/lib/public/modules/worker-proposal.js +42 -8
  184. package/lib/public/modules/worker-runtime-picker.js +115 -0
  185. package/lib/public/modules/you-activity.js +121 -0
  186. package/lib/public/modules/you.js +251 -0
  187. package/lib/public/style.css +20 -8
  188. package/lib/public/vendor/codemirror/LICENSE +21 -0
  189. package/lib/public/vendor/codemirror/codemirror.css +344 -0
  190. package/lib/public/vendor/codemirror/codemirror.js +9884 -0
  191. package/lib/public/vendor/codemirror/continuelist.js +101 -0
  192. package/lib/public/vendor/codemirror/markdown.js +886 -0
  193. package/lib/public/vendor/codemirror/show-hint.css +37 -0
  194. package/lib/public/vendor/codemirror/show-hint.js +523 -0
  195. package/lib/sdk-bridge.js +15 -3
  196. package/lib/sdk-message-processor.js +16 -4
  197. package/lib/sdk-quota-snapshot.js +37 -0
  198. package/lib/server-admin.js +11 -0
  199. package/lib/server-appearance-settings.js +71 -0
  200. package/lib/server-home-chat-events.js +1 -1
  201. package/lib/server-home-chat.js +25 -3
  202. package/lib/server-home-debate-planning.js +4 -1
  203. package/lib/server-home-debates.js +2 -0
  204. package/lib/server-home-mate-creation.js +4 -1
  205. package/lib/server-linear.js +14 -8
  206. package/lib/server-mate-instructions.js +44 -0
  207. package/lib/server-mates.js +14 -4
  208. package/lib/server-notification-settings.js +67 -0
  209. package/lib/server-palette.js +1 -1
  210. package/lib/server-settings.js +69 -1
  211. package/lib/server-storage.js +57 -0
  212. package/lib/server-user-knowledge.js +119 -0
  213. package/lib/server.js +31 -3
  214. package/lib/session-visibility.js +7 -2
  215. package/lib/sessions.js +35 -10
  216. package/lib/startup-projects.js +40 -0
  217. package/lib/storage-native-walk.js +85 -0
  218. package/lib/storage-usage.js +144 -0
  219. package/lib/user-knowledge-service.js +167 -0
  220. package/lib/users-permissions.js +7 -0
  221. package/lib/users-preferences.js +0 -74
  222. package/lib/users-project-mate-filter-preferences.js +39 -0
  223. package/lib/users.js +6 -4
  224. package/lib/workspace-query-access.js +4 -1
  225. package/lib/ws-schema.js +52 -4
  226. package/lib/yoke/acp-process-manager.js +2 -2
  227. package/lib/yoke/adapters/codex.js +12 -52
  228. package/lib/yoke/codex-app-server.js +2 -2
  229. package/lib/yoke/codex-model-catalog.js +52 -0
  230. package/lib/yoke/codex-rate-limits.js +26 -0
  231. package/package.json +12 -3
@@ -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
+ }