clay-server 3.8.1 → 4.0.0-beta.10

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 (222) hide show
  1. package/lib/ask-user-mcp-server.js +5 -119
  2. package/lib/background-task-timing.js +105 -0
  3. package/lib/builtin-mates.js +6 -6
  4. package/lib/claude-hook-installer.js +15 -0
  5. package/lib/clay-history-mcp-server.js +62 -297
  6. package/lib/daemon.js +23 -1
  7. package/lib/debate-model-selection.js +119 -0
  8. package/lib/home-debate-tool-policy.js +164 -0
  9. package/lib/home-response-notifications.js +26 -0
  10. package/lib/knowledge-import.js +436 -0
  11. package/lib/knowledge-record-store.js +188 -0
  12. package/lib/knowledge-search.js +224 -0
  13. package/lib/mate-creation-mcp-server.js +55 -0
  14. package/lib/mate-knowledge-mcp-server.js +151 -0
  15. package/lib/mate-knowledge-migration.js +283 -0
  16. package/lib/mate-knowledge-service.js +488 -0
  17. package/lib/mate-knowledge-sync.js +482 -0
  18. package/lib/mate-ready-creation.js +95 -0
  19. package/lib/mates.js +2 -0
  20. package/lib/notes.js +2 -1
  21. package/lib/project-ask-user.js +64 -0
  22. package/lib/project-capsule-catalog.js +101 -0
  23. package/lib/project-connection.js +17 -0
  24. package/lib/project-debate-proposal.js +133 -17
  25. package/lib/project-debate.js +214 -110
  26. package/lib/project-delegated-follow-up.js +84 -0
  27. package/lib/project-delegated-session.js +53 -0
  28. package/lib/project-filesystem.js +7 -9
  29. package/lib/project-knowledge.js +23 -0
  30. package/lib/project-logs-comments.js +137 -0
  31. package/lib/project-logs-mcp-server.js +290 -0
  32. package/lib/project-logs-query.js +167 -0
  33. package/lib/project-logs-root.js +67 -0
  34. package/lib/project-logs-schema.js +259 -0
  35. package/lib/project-logs-service.js +357 -0
  36. package/lib/project-logs-snapshot.js +202 -0
  37. package/lib/project-logs-store.js +498 -0
  38. package/lib/project-logs-versioning.js +128 -0
  39. package/lib/project-logs.js +347 -0
  40. package/lib/project-mate-creation-proposal.js +120 -0
  41. package/lib/project-mate-interaction.js +14 -0
  42. package/lib/project-mate-knowledge.js +110 -0
  43. package/lib/project-memory.js +36 -7
  44. package/lib/project-models.js +157 -32
  45. package/lib/project-session-notes.js +2 -2
  46. package/lib/project-session-pair.js +8 -8
  47. package/lib/project-sessions.js +66 -51
  48. package/lib/project-vendor-login.js +414 -0
  49. package/lib/project-worker-proposal.js +25 -25
  50. package/lib/project-workspace-query.js +144 -0
  51. package/lib/project.js +433 -102
  52. package/lib/public/app.js +109 -48
  53. package/lib/public/css/avatar-imprints.css +0 -1
  54. package/lib/public/css/base.css +4 -0
  55. package/lib/public/css/capsule-ui.css +389 -0
  56. package/lib/public/css/command-palette.css +306 -6
  57. package/lib/public/css/home-capsule-library.css +243 -0
  58. package/lib/public/css/home-capsule-source.css +192 -0
  59. package/lib/public/css/home-debate-live.css +146 -0
  60. package/lib/public/css/home-debate-planning.css +125 -0
  61. package/lib/public/css/home-debates-archive.css +281 -0
  62. package/lib/public/css/home-hub.css +896 -405
  63. package/lib/public/css/home-mate-creation.css +34 -0
  64. package/lib/public/css/home-mate-model-picker.css +131 -0
  65. package/lib/public/css/home-mate-settings.css +344 -0
  66. package/lib/public/css/home-session-actions.css +265 -0
  67. package/lib/public/css/home-sidebar.css +667 -0
  68. package/lib/public/css/icon-strip.css +1 -2
  69. package/lib/public/css/input.css +79 -25
  70. package/lib/public/css/mates.css +7 -34
  71. package/lib/public/css/pane.css +1 -1
  72. package/lib/public/css/playbook.css +0 -80
  73. package/lib/public/css/project-logs.css +234 -0
  74. package/lib/public/css/scheduler.css +1 -1
  75. package/lib/public/css/sticky-notes.css +53 -117
  76. package/lib/public/css/tui-attention.css +0 -44
  77. package/lib/public/css/workspace-assignment.css +45 -0
  78. package/lib/public/fonts/source-serif-4/LICENSE.md +93 -0
  79. package/lib/public/fonts/source-serif-4/SourceSerif4Caption-Semibold.ttf.woff2 +0 -0
  80. package/lib/public/index.html +96 -74
  81. package/lib/public/modules/app-connection.js +100 -5
  82. package/lib/public/modules/app-dm.js +43 -160
  83. package/lib/public/modules/app-home-hub.js +328 -585
  84. package/lib/public/modules/app-message-cards.js +242 -0
  85. package/lib/public/modules/app-message-router.js +84 -0
  86. package/lib/public/modules/app-messages.js +124 -38
  87. package/lib/public/modules/app-notifications.js +8 -119
  88. package/lib/public/modules/app-panels.js +43 -2
  89. package/lib/public/modules/app-projects.js +9 -1
  90. package/lib/public/modules/app-rendering.js +21 -602
  91. package/lib/public/modules/avatar-imprint.js +11 -8
  92. package/lib/public/modules/background-tasks-ui.js +139 -16
  93. package/lib/public/modules/chat-bubble-renderer.js +152 -0
  94. package/lib/public/modules/chat-render-runtime.js +198 -0
  95. package/lib/public/modules/command-palette.js +225 -436
  96. package/lib/public/modules/dm-render.js +82 -0
  97. package/lib/public/modules/home-capsule-creation-intent.js +31 -0
  98. package/lib/public/modules/home-capsule-library.js +146 -0
  99. package/lib/public/modules/home-capsule-source.js +383 -0
  100. package/lib/public/modules/home-chat-identity.js +35 -0
  101. package/lib/public/modules/home-chat-scroll.js +77 -0
  102. package/lib/public/modules/home-chat-stream-state.js +34 -0
  103. package/lib/public/modules/home-composer-focus.js +25 -0
  104. package/lib/public/modules/home-conversations-sheet.js +179 -0
  105. package/lib/public/modules/home-debate-activity.js +48 -0
  106. package/lib/public/modules/home-debate-controls.js +295 -0
  107. package/lib/public/modules/home-debate-launch.js +41 -0
  108. package/lib/public/modules/home-debate-live.js +284 -0
  109. package/lib/public/modules/home-debate-models.js +73 -0
  110. package/lib/public/modules/home-debate-planning.js +335 -0
  111. package/lib/public/modules/home-debates-archive.js +279 -0
  112. package/lib/public/modules/home-dock-resize.js +74 -0
  113. package/lib/public/modules/home-dock.js +446 -0
  114. package/lib/public/modules/home-mate-chat.js +496 -0
  115. package/lib/public/modules/home-mate-creation.js +109 -0
  116. package/lib/public/modules/home-mate-model-picker.js +281 -0
  117. package/lib/public/modules/home-mate-selection.js +38 -0
  118. package/lib/public/modules/home-mate-settings-menu.js +131 -0
  119. package/lib/public/modules/home-mate-settings.js +383 -0
  120. package/lib/public/modules/home-session-actions.js +373 -0
  121. package/lib/public/modules/home-session-model-confirmation.js +13 -0
  122. package/lib/public/modules/home-shell.js +9 -0
  123. package/lib/public/modules/home-sidebar-chat-list.js +63 -0
  124. package/lib/public/modules/home-sidebar.js +165 -0
  125. package/lib/public/modules/home-sub-surface.js +19 -0
  126. package/lib/public/modules/home-surface-boot.js +68 -0
  127. package/lib/public/modules/home-surface.js +141 -0
  128. package/lib/public/modules/home-tools.js +271 -0
  129. package/lib/public/modules/markdown.js +50 -2
  130. package/lib/public/modules/mate-management.js +86 -0
  131. package/lib/public/modules/mate-sidebar.js +0 -8
  132. package/lib/public/modules/mate-wizard.js +0 -7
  133. package/lib/public/modules/mention.js +17 -19
  134. package/lib/public/modules/pane-bridge.js +9 -0
  135. package/lib/public/modules/profile.js +4 -5
  136. package/lib/public/modules/project-logs-ambient.js +238 -0
  137. package/lib/public/modules/project-logs-render.js +359 -0
  138. package/lib/public/modules/project-logs.js +328 -0
  139. package/lib/public/modules/project-settings.js +34 -28
  140. package/lib/public/modules/project-switcher.js +11 -5
  141. package/lib/public/modules/project-workspace-assignment.js +23 -0
  142. package/lib/public/modules/scheduler.js +17 -3
  143. package/lib/public/modules/search-clay-chat.js +402 -0
  144. package/lib/public/modules/server-settings.js +14 -12
  145. package/lib/public/modules/session-actions.js +1 -1
  146. package/lib/public/modules/sidebar-mates.js +56 -552
  147. package/lib/public/modules/sidebar-mobile.js +12 -73
  148. package/lib/public/modules/sidebar-presence.js +37 -0
  149. package/lib/public/modules/sidebar-sessions.js +25 -1
  150. package/lib/public/modules/split-pair-ui.js +13 -13
  151. package/lib/public/modules/split-view.js +7 -0
  152. package/lib/public/modules/sticky-notes.js +106 -53
  153. package/lib/public/modules/tool-input-composition.js +48 -0
  154. package/lib/public/modules/tool-llm-status.js +167 -0
  155. package/lib/public/modules/tool-palette.js +76 -4
  156. package/lib/public/modules/tool-renderer-advanced.js +285 -0
  157. package/lib/public/modules/tool-renderer-chart.js +158 -0
  158. package/lib/public/modules/tool-renderer-semantics.js +35 -0
  159. package/lib/public/modules/tool-renderer.js +464 -0
  160. package/lib/public/modules/tool-runtime.js +309 -0
  161. package/lib/public/modules/tool-ui-evaluator.js +97 -0
  162. package/lib/public/modules/tool-ui-tree.js +21 -0
  163. package/lib/public/modules/tui-attention.js +10 -0
  164. package/lib/public/modules/user-settings.js +16 -23
  165. package/lib/public/modules/vendor-login.js +287 -0
  166. package/lib/public/modules/worker-proposal.js +2 -2
  167. package/lib/public/modules/workspace-assignment-card.js +149 -0
  168. package/lib/public/modules/workspace-assignment-routing.js +4 -0
  169. package/lib/public/style.css +14 -2
  170. package/lib/runtime-env.js +65 -0
  171. package/lib/sdk-bridge.js +120 -32
  172. package/lib/sdk-message-processor.js +34 -13
  173. package/lib/server-home-capsule-creation.js +36 -0
  174. package/lib/server-home-chat-events.js +287 -0
  175. package/lib/server-home-chat.js +518 -0
  176. package/lib/server-home-clay-entry.js +65 -0
  177. package/lib/server-home-clay-session-links.js +26 -0
  178. package/lib/server-home-debate-planning.js +214 -0
  179. package/lib/server-home-debates.js +137 -0
  180. package/lib/server-home-mate-creation.js +261 -0
  181. package/lib/server-home-models.js +241 -0
  182. package/lib/server-home-preferences.js +61 -0
  183. package/lib/server-mates.js +37 -0
  184. package/lib/server-tools.js +377 -0
  185. package/lib/server.js +166 -59
  186. package/lib/session-pair-mcp-server.js +6 -6
  187. package/lib/sessions.js +22 -4
  188. package/lib/tool-capsule-source.js +142 -0
  189. package/lib/tool-control-mcp-server.js +126 -0
  190. package/lib/tool-llm.js +48 -0
  191. package/lib/tool-storage.js +77 -0
  192. package/lib/tool-ui-spec-advanced.js +82 -0
  193. package/lib/tool-ui-spec.js +261 -0
  194. package/lib/tools-registry.js +286 -0
  195. package/lib/users-home-dock-preferences.js +77 -0
  196. package/lib/users-home-surface-preferences.js +99 -0
  197. package/lib/users-preferences.js +4 -7
  198. package/lib/users.js +12 -0
  199. package/lib/whats-new-content.js +3 -3
  200. package/lib/workspace-assignment-service.js +420 -0
  201. package/lib/workspace-query-mcp-server.js +154 -0
  202. package/lib/workspace-query-service.js +492 -0
  203. package/lib/ws-schema.js +107 -12
  204. package/lib/yoke/adapters/acp.js +2 -1
  205. package/lib/yoke/adapters/antigravity.js +2 -1
  206. package/lib/yoke/adapters/claude-worker.js +11 -4
  207. package/lib/yoke/adapters/claude.js +141 -46
  208. package/lib/yoke/adapters/codex.js +79 -11
  209. package/lib/yoke/adapters/kiro.js +2 -1
  210. package/lib/yoke/claude-user-input.js +38 -0
  211. package/lib/yoke/codex-app-server.js +20 -2
  212. package/lib/yoke/codex-background-tasks.js +8 -2
  213. package/lib/yoke/codex-user-input.js +64 -0
  214. package/lib/yoke/complete-once.js +164 -0
  215. package/lib/yoke/index.js +5 -1
  216. package/lib/yoke/interface.js +19 -0
  217. package/lib/yoke/mcp-bridge-server.js +2 -6
  218. package/lib/yoke/user-input.js +254 -0
  219. package/package.json +4 -3
  220. package/lib/public/css/home-chat.css +0 -380
  221. package/lib/public/modules/home-chat.js +0 -438
  222. package/lib/server-clay-home.js +0 -245
package/lib/public/app.js CHANGED
@@ -12,7 +12,8 @@ import {
12
12
  } from './modules/sidebar-projects.js';
13
13
  import {
14
14
  renderUserStrip, closeDmUserPicker, setCurrentDmUser,
15
- updateDmBadge, renderSidebarPresence, setMentionActive, clearAllMentionActive
15
+ updateDmBadge, setMentionActive, clearAllMentionActive,
16
+ onMentionActiveChange
16
17
  } from './modules/sidebar-mates.js';
17
18
  import {
18
19
  openMobileSheet, setMobileSheetMateData, refreshMobileChatSheet
@@ -41,27 +42,31 @@ import { initSTT } from './modules/stt.js';
41
42
  import { initProfile, getProfileLang } from './modules/profile.js';
42
43
  import { initUserSettings } from './modules/user-settings.js';
43
44
  import { initToolPalettes } from './modules/tool-palette.js';
45
+ import { initProjectLogs, closeProjectLogs } from './modules/project-logs.js';
44
46
  import { initProjectSwitcher } from './modules/project-switcher.js';
45
47
  import { initSplitView } from './modules/split-view.js';
46
48
  import { initPaneBridge } from './modules/pane-bridge.js';
47
49
  import { initAdmin, checkAdminAccess } from './modules/admin.js';
48
50
  import { initSessionSearch, toggleSearch, closeSearch, isSearchOpen, handleFindInSessionResults, onHistoryPrepended as onSessionSearchHistoryPrepended } from './modules/session-search.js';
49
51
  import { initTooltips, registerTooltip } from './modules/tooltip.js';
50
- import { initMateWizard, openMateWizard, closeMateWizard, handleMateCreated } from './modules/mate-wizard.js';
51
52
  import { initCommandPalette, handlePaletteSessionSwitch, setPaletteVersion } from './modules/command-palette.js';
52
53
  import { initLongPress } from './modules/longpress.js';
53
54
  import { initShellCommand } from './modules/shell-command.js';
54
55
  import { initConnection, connect as _connConnect, setStatus as _connSetStatus, scheduleReconnect as _connScheduleReconnect, cancelReconnect as _connCancelReconnect } from './modules/app-connection.js';
55
56
  import { processMessage as _msgProcessMessage } from './modules/app-messages.js';
56
57
  import { getWs as _getWsRef, setWs as _setWsRef } from './modules/ws-ref.js';
57
- import { initHomeHub, showHomeHub as _hubShowHomeHub, hideHomeHub as _hubHideHomeHub, handleHubSchedules as _hubHandleHubSchedules, renderHomeHub as _hubRenderHomeHub, isHomeHubVisible } from './modules/app-home-hub.js';
58
+ import { initHomeHub, showHomeHub as _hubShowHomeHub, hideHomeHub as _hubHideHomeHub, isHomeHubVisible, renderHomeMateSwitcher, updateHomeIconBadge } from './modules/app-home-hub.js';
59
+ import { initHomeSidebar } from './modules/home-sidebar.js';
60
+ import { openHomeMateAction } from './modules/home-mate-chat.js';
61
+ import { initHomeSurfaceBoot } from './modules/home-surface-boot.js';
62
+ import { rememberHomePrimarySurface } from './modules/home-surface.js';
58
63
  import { initRateLimit, handleRateLimitEvent as _rlHandleRateLimitEvent, updateRateLimitUsage as _rlUpdateRateLimitUsage, addScheduledMessageBubble as _rlAddScheduledMessageBubble, removeScheduledMessageBubble as _rlRemoveScheduledMessageBubble, handleFastModeState as _rlHandleFastModeState, getScheduledMsgEl, resetRateLimitState } from './modules/app-rate-limit.js';
59
64
  import { initCursors, handleRemoteCursorMove as _curHandleRemoteCursorMove, handleRemoteCursorLeave as _curHandleRemoteCursorLeave, handleRemoteSelection as _curHandleRemoteSelection, clearRemoteCursors as _curClearRemoteCursors, initCursorToggle } from './modules/app-cursors.js';
60
65
  import { initFavicon, updateFavicon as _favUpdateFavicon, setSendBtnMode as _favSetSendBtnMode, blinkIO as _favBlinkIO, blinkSessionDot as _favBlinkSessionDot, updateCrossProjectBlink as _favUpdateCrossProjectBlink, startUrgentBlink as _favStartUrgentBlink, stopUrgentBlink as _favStopUrgentBlink, setActivity as _favSetActivity } from './modules/app-favicon.js';
61
66
  import { initHeader, closeSessionInfoPopover as _hdrCloseSessionInfoPopover, updateHistorySentinel as _hdrUpdateHistorySentinel, requestMoreHistory as _hdrRequestMoreHistory, prependOlderHistory as _hdrPrependOlderHistory } from './modules/app-header.js';
62
67
  import { initSessionActions } from './modules/session-actions.js';
63
68
  import { initMisc, flushPendingExtMessages, showImageModal as _miscShowImageModal, closeImageModal as _miscCloseImageModal, showPasteModal as _miscShowPasteModal, closePasteModal as _miscClosePasteModal, showConfirm as _miscShowConfirm, hideConfirm as _miscHideConfirm, showForceChangePinOverlay as _miscShowForceChangePinOverlay, sendExtensionCommand as _miscSendExtensionCommand, handleExtensionResult as _miscHandleExtensionResult } from './modules/app-misc.js';
64
- import { initSkillInstall, requireSkills as _siRequireSkills, requireClayMateInterview as _siRequireClayMateInterview, handleSkillInstallWs as _siHandleSkillInstallWs } from './modules/app-skills-install.js';
69
+ import { initSkillInstall, requireSkills as _siRequireSkills, handleSkillInstallWs as _siHandleSkillInstallWs } from './modules/app-skills-install.js';
65
70
  import { initDebateUi, showDebateConcludeConfirm as _debShowDebateConcludeConfirm, exitDebateConcludeMode as _debExitDebateConcludeMode, handleDebateConcludeSend as _debHandleDebateConcludeSend, showDebateEndedMode as _debShowDebateEndedMode, exitDebateEndedMode as _debExitDebateEndedMode, showDebateUserFloor as _debShowDebateUserFloor, exitDebateFloorMode as _debExitDebateFloorMode, handleDebateFloorSend as _debHandleDebateFloorSend, renderDebateUserFloorDone as _debRenderDebateUserFloorDone, showDebateSticky as _debShowDebateSticky, showDebateBottomBar as _debShowDebateBottomBar, removeDebateBottomBar as _debRemoveDebateBottomBar, sendDebateStickyComment as _debSendDebateStickyComment, updateDebateRound as _debUpdateDebateRound } from './modules/app-debate-ui.js';
66
71
  import { initLoopUi, updateLoopInputVisibility as _loopUpdateLoopInputVisibility, updateLoopButton as _loopUpdateLoopButton, showLoopBanner as _loopShowLoopBanner, updateLoopBanner as _loopUpdateLoopBanner, updateRalphBars as _loopUpdateRalphBars, showRalphCraftingBar as _loopShowRalphCraftingBar, showRalphApprovalBar as _loopShowRalphApprovalBar, updateRalphApprovalStatus as _loopUpdateRalphApprovalStatus, openRalphPreviewModal as _loopOpenRalphPreviewModal, showExecModal as _loopShowExecModal, closeExecModal as _loopCloseExecModal, updateExecModalStatus as _loopUpdateExecModalStatus } from './modules/app-loop-ui.js';
67
72
  import { initBackgroundTasksUi } from './modules/background-tasks-ui.js';
@@ -74,7 +79,7 @@ import { createStore, store } from './modules/store.js';
74
79
  import { initPanels, updateConfigChip as _panUpdateConfigChip, getModelEffortLevels as _panGetModelEffortLevels, accumulateUsage as _panAccumulateUsage, updateUsagePanel as _panUpdateUsagePanel, resetUsage as _panResetUsage, toggleUsagePanel as _panToggleUsagePanel, formatTokens as _panFormatTokens, updateStatusPanel as _panUpdateStatusPanel, requestProcessStats as _panRequestProcessStats, toggleStatusPanel as _panToggleStatusPanel, accumulateContext as _panAccumulateContext, updateContextPanel as _panUpdateContextPanel, resetContext as _panResetContext, resetContextData as _panResetContextData, minimizeContext as _panMinimizeContext, expandContext as _panExpandContext, toggleContextPanel as _panToggleContextPanel, getContextView as _panGetContextView, renderCtxPopover as _panRenderCtxPopover, hideCtxPopover as _panHideCtxPopover, formatBytes as _panFormatBytes, formatUptime as _panFormatUptime, getModelSupportsEffort as _panGetModelSupportsEffort, getSessionUsage, setSessionUsage, getContextData, setContextData, setContextView as _panSetContextView, applyContextView as _panApplyContextView } from './modules/app-panels.js';
75
80
  import { initProjects, updateProjectList as _projUpdateProjectList, renderProjectList as _projRenderProjectList, renderTopbarPresence as _projRenderTopbarPresence, switchProject as _projSwitchProject, resetClientState as _projResetClientState, confirmRemoveProject as _projConfirmRemoveProject, handleRemoveProjectCheckResult as _projHandleRemoveProjectCheckResult, handleRemoveProjectResult as _projHandleRemoveProjectResult, openAddProjectModal as _projOpenAddProjectModal, closeAddProjectModal as _projCloseAddProjectModal, handleBrowseDirResult as _projHandleBrowseDirResult, handleAddProjectResult as _projHandleAddProjectResult, handleCloneProgress as _projHandleCloneProgress, showUpdateAvailable as _projShowUpdateAvailable, getCachedProjects, setCachedProjects, getCachedProjectCount, getCachedRemovedProjects, setCachedRemovedProjects } from './modules/app-projects.js';
76
81
  import { initRendering, addToMessages as _renAddToMessages, scrollToBottom as _renScrollToBottom, forceScrollToBottom as _renForceScrollToBottom, addUserMessage as _renAddUserMessage, getMsgTime as _renGetMsgTime, shouldGroupMessage as _renShouldGroupMessage, ensureAssistantBlock as _renEnsureAssistantBlock, addCopyHandler as _renAddCopyHandler, appendDelta as _renAppendDelta, flushStreamBuffer as _renFlushStreamBuffer, finalizeAssistantBlock as _renFinalizeAssistantBlock, addSystemMessage as _renAddSystemMessage, addConflictMessage as _renAddConflictMessage, addContextOverflowMessage as _renAddContextOverflowMessage, showClaudePreThinking as _renShowClaudePreThinking, showMatePreThinking as _renShowMatePreThinking, removeMatePreThinking as _renRemoveMatePreThinking, showSuggestionChips as _renShowSuggestionChips, hideSuggestionChips as _renHideSuggestionChips, getGhostSuggestion as _renGetGhostSuggestion, getTurnCounter, setTurnCounter, getPrependAnchor, setPrependAnchor, getActivityEl, setActivityEl, getIsUserScrolledUp, setIsUserScrolledUp, getStickyBottom, armStickyBottom, disarmStickyBottom } from './modules/app-rendering.js';
77
- import { initDm, openDm as _dmOpenDm, enterDmMode as _dmEnterDmMode, exitDmMode as _dmExitDmMode, handleMateCreatedInApp as _dmHandleMateCreatedInApp, renderAvailableBuiltins as _dmRenderAvailableBuiltins, buildMateInterviewPrompt as _dmBuildMateInterviewPrompt, updateMateIconStatus as _dmUpdateMateIconStatus, connectMateProject as _dmConnectMateProject, disconnectMateProject as _dmDisconnectMateProject, appendDmMessage as _dmAppendDmMessage, showDmTypingIndicator as _dmShowDmTypingIndicator, handleDmSend as _dmHandleDmSend } from './modules/app-dm.js';
82
+ import { initDm, openDm as _dmOpenDm, enterDmMode as _dmEnterDmMode, exitDmMode as _dmExitDmMode, handleMateCreatedInApp as _dmHandleMateCreatedInApp, buildMateInterviewPrompt as _dmBuildMateInterviewPrompt, updateMateIconStatus as _dmUpdateMateIconStatus, connectMateProject as _dmConnectMateProject, disconnectMateProject as _dmDisconnectMateProject, appendDmMessage as _dmAppendDmMessage, showDmTypingIndicator as _dmShowDmTypingIndicator, handleDmSend as _dmHandleDmSend } from './modules/app-dm.js';
78
83
  import { initMention, handleMentionStart, handleMentionStream, handleMentionDone, handleMentionError, handleMentionActivity, renderMentionUser, renderMentionResponse } from './modules/mention.js';
79
84
  import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateResumed, handleDebateTurn, handleDebateActivity, handleDebateStream, handleDebateTurnDone, handleDebateCommentQueued, handleDebateCommentInjected, handleDebateEnded, handleDebateError, renderDebateStarted, renderDebateTurnDone, renderDebateEnded, renderDebateCommentInjected, renderDebateUserResume, openDebateModal, closeDebateModal, handleDebateBriefReady, renderDebateBriefReady, isDebateActive, resetDebateState, exportDebateAsPdf, renderMcpDebateProposal } from './modules/debate.js';
80
85
 
@@ -85,8 +90,10 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
85
90
  if (!Number.isSafeInteger(paneSessionId) || paneSessionId < 1) paneSessionId = null;
86
91
  if (paneMode) document.body.classList.add("pane-mode");
87
92
  var slugMatch = location.pathname.match(/^\/p\/([a-z0-9_-]+)/);
88
- var basePath = slugMatch ? "/p/" + slugMatch[1] + "/" : "/";
89
- var wsPath = slugMatch ? "/p/" + slugMatch[1] + "/ws" : "/ws";
93
+ var homeProjectSlug = document.body.dataset.homeProjectSlug || null;
94
+ var connectionSlug = slugMatch ? slugMatch[1] : homeProjectSlug;
95
+ var basePath = connectionSlug ? "/p/" + connectionSlug + "/" : "/";
96
+ var wsPath = connectionSlug ? "/p/" + connectionSlug + "/ws" : "/ws";
90
97
  if (paneMode) {
91
98
  wsPath += "?pane=1";
92
99
  if (paneSessionId) wsPath += "&session=" + paneSessionId;
@@ -129,17 +136,18 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
129
136
 
130
137
 
131
138
  // --- Home Hub (delegated to app-home-hub.js) ---
132
- function showHomeHub() { _hubShowHomeHub(); }
139
+ function showHomeHub(fromHistory) { _hubShowHomeHub(fromHistory); }
133
140
  function hideHomeHub() { _hubHideHomeHub(); }
134
- function handleHubSchedules(msg) { _hubHandleHubSchedules(msg); }
135
- function renderHomeHub(projects) { _hubRenderHomeHub(projects); }
141
+ function startClayMateCreation() {
142
+ showHomeHub();
143
+ openHomeMateAction("mate");
144
+ }
136
145
 
137
146
  // --- DM (delegated to app-dm.js) ---
138
147
  function openDm(userId) { _dmOpenDm(userId); }
139
148
  function enterDmMode(key, targetUser, messages) { _dmEnterDmMode(key, targetUser, messages); }
140
149
  function exitDmMode(skipProjectSwitch) { _dmExitDmMode(skipProjectSwitch); }
141
150
  function handleMateCreatedInApp(mate, msg) { _dmHandleMateCreatedInApp(mate, msg); }
142
- function renderAvailableBuiltins(builtins) { _dmRenderAvailableBuiltins(builtins); }
143
151
  function buildMateInterviewPrompt(mate) { return _dmBuildMateInterviewPrompt(mate); }
144
152
  function updateMateIconStatus(msg) { _dmUpdateMateIconStatus(msg); }
145
153
  function connectMateProject(slug) { _dmConnectMateProject(slug); }
@@ -156,7 +164,7 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
156
164
  var projectHintDismiss = $("project-hint-dismiss");
157
165
  // cachedProjects, cachedProjectCount, cachedRemovedProjects -> modules/app-projects.js
158
166
  // currentProjectOwnerId -> store
159
- var currentSlug = slugMatch ? slugMatch[1] : null; // kept for pre-store init
167
+ var currentSlug = connectionSlug || null; // kept for pre-store init
160
168
 
161
169
  // updateProjectList, renderTopbarPresence, renderProjectList -> modules/app-projects.js
162
170
  function updateProjectList(msg) { _projUpdateProjectList(msg); }
@@ -184,18 +192,6 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
184
192
 
185
193
  document.addEventListener("keydown", function (e) {
186
194
  if (e.key === "Escape") {
187
- if (isHomeHubVisible() && store.get('currentSlug')) {
188
- hideHomeHub();
189
- if (document.documentElement.classList.contains("pwa-standalone")) {
190
- history.replaceState(null, "", "/p/" + store.get('currentSlug') + "/");
191
- } else {
192
- history.pushState(null, "", "/p/" + store.get('currentSlug') + "/");
193
- }
194
- var homeIcon = document.querySelector(".icon-strip-home");
195
- if (homeIcon) homeIcon.classList.remove("active");
196
- renderProjectList();
197
- return;
198
- }
199
195
  closeImageModal();
200
196
  }
201
197
  });
@@ -302,13 +298,63 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
302
298
  isHeadlessMode: false,
303
299
  savedMainSlug: null,
304
300
  connected: false,
301
+ homeChatMateId: null,
302
+ homeChatSessionId: null,
303
+ homeChatSessionModel: null,
304
+ homeChatSessionVendor: null,
305
+ homeChatSessionModelLoading: false,
306
+ homeMateSessions: {},
307
+ homeActiveSessionByMate: {},
308
+ homePreferredMateId: null,
309
+ homeSidebarCollapsed: false,
310
+ homeChatScope: "all",
311
+ homeSubSurface: "chat",
312
+ homeDebatesStatus: "idle",
313
+ homeDebates: [],
314
+ homeDebatesRequestId: null,
315
+ homeDebatesError: "",
316
+ homeSurfaceLoaded: false,
317
+ homePrimarySurface: null,
318
+ homeSurfaceProjectSlug: null,
319
+ homeSurfaceIntent: null,
320
+ homeSurfaceBootResolved: false,
321
+ homeSurfaceRestoreRequested: false,
322
+ dockActiveToolId: null,
323
+ dockOpen: false,
324
+ homeDockPreferenceLoaded: false,
325
+ dockFocus: false,
326
+ dockLibraryOpen: false,
327
+ dockBackstageOpen: false,
328
+ dockWidth: null,
329
+ dockHasActivity: false,
330
+ dockActivityToolId: null,
331
+ projectLogsOpen: false,
332
+ projectLogsWide: false,
333
+ projectLogsFullscreen: false,
334
+ projectLogsEntries: [],
335
+ projectLogsSelectedRef: null,
336
+ projectLogsView: 'list',
337
+ projectLogsCategory: '',
338
+ projectLogsListScroll: 0,
339
+ projectLogsListRequestId: null,
340
+ projectLogsReadRequestId: null,
341
+ projectLogsCommentRequestId: null,
342
+ projectLogsCommentStatusEl: null,
343
+ projectLogsUnread: 0,
344
+ projectLogsSeenRevisions: {},
345
+ projectLogsPreview: false,
346
+ projectLogsPinned: false,
347
+ installedTools: [],
348
+ homeToolRegistryLoaded: false,
349
+ toolScanErrors: [],
350
+
305
351
  // dm
306
352
  dmTargetUser: null,
307
353
  dmKey: null,
308
354
  cachedMatesList: [],
309
355
  cachedDmFavorites: [],
310
356
  cachedAvailableBuiltins: [],
311
- matesEnabled: false,
357
+ projectMateDmsEnabled: false,
312
358
  returningFromMateDm: false,
313
359
  pendingMateInterview: null,
314
360
  pendingTermCommand: null,
@@ -438,7 +484,7 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
438
484
  get projectOwnerId() { return store.get('currentProjectOwnerId'); },
439
485
  get ownerLocked() { return store.get('ownerLocked'); },
440
486
  openDm: function (userId) { openDm(userId); },
441
- openMateWizard: function () { requireClayMateInterview(function () { openMateWizard(); }); },
487
+ openMateWizard: function () { startClayMateCreation(); },
442
488
  openAddProjectModal: function () { openAddProjectModal(); },
443
489
  sendWs: function (msg) { var _ws = _getWsRef(); if (_ws && _ws.readyState === 1) _ws.send(JSON.stringify(msg)); },
444
490
  onDmRemoveUser: function (userId) { var dr = Object.assign({}, store.get('dmRemovedUsers')); dr[userId] = true; store.set({ dmRemovedUsers: dr }); },
@@ -451,20 +497,15 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
451
497
  // buttons exist in the DOM when sidebar.js (and later terminal.js /
452
498
  // mcp-ui.js / etc.) attach click handlers by ID.
453
499
  initToolPalettes();
500
+ initProjectLogs();
454
501
  initSidebar(sidebarCtx);
455
502
  var wsGetter = function () { return _getWsRef(); };
456
503
  initMateSidebar(wsGetter);
457
504
  initMateKnowledge(wsGetter);
458
505
  initMateMemory(wsGetter, { onShow: function () { hideKnowledge(); hideNotes(); } });
459
- initMateWizard(
460
- function (msg) { var _ws = _getWsRef(); if (_ws && _ws.readyState === 1) _ws.send(JSON.stringify(msg)); },
461
- function (mate) { handleMateCreatedInApp(mate); }
462
- );
463
-
464
506
  initCommandPalette({
465
507
  switchProject: function (slug) { switchProject(slug); },
466
508
  currentSlug: function () { return store.get('currentSlug'); },
467
- projectList: function () { return getCachedProjects() || []; },
468
509
  matesList: function () { return store.get('cachedMatesList') || []; },
469
510
  availableBuiltins: function () { return store.get('cachedAvailableBuiltins') || []; },
470
511
  allUsers: function () { return store.get('cachedAllUsers') || []; },
@@ -486,7 +527,7 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
486
527
  openDm: function (userId) { openDm(userId); },
487
528
  runAction: function (action) {
488
529
  switch (action) {
489
- case "createMate": openMateWizard(); break;
530
+ case "createMate": startClayMateCreation(); break;
490
531
  case "openSettings":
491
532
  var sb = document.getElementById("server-settings-btn");
492
533
  if (sb) sb.click();
@@ -741,6 +782,12 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
741
782
  window.addEventListener("popstate", function () {
742
783
  var m = location.pathname.match(/^\/p\/([a-z0-9_-]+)/);
743
784
  var newSlug = m ? m[1] : null;
785
+ if (!newSlug) {
786
+ showHomeHub(true);
787
+ return;
788
+ }
789
+ rememberHomePrimarySurface("project", newSlug);
790
+ if (isHomeHubVisible()) hideHomeHub();
744
791
  if (newSlug && newSlug !== store.get('currentSlug')) {
745
792
  resetFileBrowser();
746
793
  closeArchive();
@@ -847,7 +894,10 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
847
894
  addCopyHandler: addCopyHandler,
848
895
  matesList: function () { return store.get('cachedMatesList') || []; },
849
896
  availableBuiltins: function () { return store.get('cachedAvailableBuiltins') || []; },
850
- currentMateId: function () { return (store.get('dmTargetUser') && store.get('dmTargetUser').isMate) ? store.get('dmTargetUser').id : null; },
897
+ currentMateId: function () {
898
+ if (store.get('dmTargetUser') && store.get('dmTargetUser').isMate) return store.get('dmTargetUser').id;
899
+ return store.get('homeChatMateId') || null;
900
+ },
851
901
  requireSkills: requireSkills,
852
902
  showDebateEndedMode: function (msg) { showDebateEndedMode(msg); },
853
903
  });
@@ -880,9 +930,8 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
880
930
  fetch("/api/me").then(function (r) { return r.json(); }).then(function (d) {
881
931
  if (d.multiUser) {
882
932
  store.set({ isMultiUserMode: true });
883
- // Body class lets CSS treat single-user / multi-user differently for
884
- // the Mates UI gate: single-user collapses the whole mate section,
885
- // multi-user keeps it visible (still hosts other users' avatars).
933
+ // The shared strip also hosts other users in multi-user deployments;
934
+ // the project Mate DM preference therefore hides only Mate shortcuts.
886
935
  if (document.body) document.body.classList.add('is-multi-user');
887
936
  }
888
937
  if (d.user && d.user.id) { store.set({ myUserId: d.user.id }); }
@@ -923,10 +972,8 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
923
972
  if (msBtn) msBtn.style.display = "none";
924
973
  }
925
974
  if (!_perms.scheduledTasks) {
926
- var schBtn = document.getElementById("scheduler-btn");
975
+ var schBtn = document.getElementById("home-scheduler-btn");
927
976
  if (schBtn) schBtn.style.display = "none";
928
- var mateSchBtn = document.getElementById("mate-scheduler-btn");
929
- if (mateSchBtn) mateSchBtn.style.display = "none";
930
977
  }
931
978
  if (!_perms.createProject) {
932
979
  var addProjBtn = document.getElementById("icon-strip-add");
@@ -1066,6 +1113,7 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
1066
1113
  var stickyNotesSidebarBtn = $("sticky-notes-sidebar-btn");
1067
1114
  if (stickyNotesSidebarBtn) {
1068
1115
  stickyNotesSidebarBtn.addEventListener("click", function () {
1116
+ closeProjectLogs();
1069
1117
  if (isSchedulerOpen()) closeScheduler();
1070
1118
  if (isArchiveOpen()) closeArchive();
1071
1119
  showNotes();
@@ -1078,6 +1126,7 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
1078
1126
  if (stickyNotesBadge) {
1079
1127
  stickyNotesBadge.addEventListener("click", function (e) {
1080
1128
  e.stopPropagation();
1129
+ closeProjectLogs();
1081
1130
  if (isSchedulerOpen()) closeScheduler();
1082
1131
  if (isArchiveOpen()) {
1083
1132
  closeArchive();
@@ -1091,9 +1140,9 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
1091
1140
  var fileBrowserBtn = $("file-browser-btn");
1092
1141
  var gitSidebarBtn = $("git-sidebar-btn");
1093
1142
  var terminalSidebarBtn = $("terminal-sidebar-btn");
1094
- if (fileBrowserBtn) fileBrowserBtn.addEventListener("click", function () { if (isArchiveOpen()) closeArchive(); if (isSchedulerOpen()) closeScheduler(); });
1095
- if (gitSidebarBtn) gitSidebarBtn.addEventListener("click", function () { if (isArchiveOpen()) closeArchive(); if (isSchedulerOpen()) closeScheduler(); });
1096
- if (terminalSidebarBtn) terminalSidebarBtn.addEventListener("click", function () { if (isArchiveOpen()) closeArchive(); if (isSchedulerOpen()) closeScheduler(); });
1143
+ if (fileBrowserBtn) fileBrowserBtn.addEventListener("click", function () { closeProjectLogs(); if (isArchiveOpen()) closeArchive(); if (isSchedulerOpen()) closeScheduler(); });
1144
+ if (gitSidebarBtn) gitSidebarBtn.addEventListener("click", function () { closeProjectLogs(); if (isArchiveOpen()) closeArchive(); if (isSchedulerOpen()) closeScheduler(); });
1145
+ if (terminalSidebarBtn) terminalSidebarBtn.addEventListener("click", function () { closeProjectLogs(); if (isArchiveOpen()) closeArchive(); if (isSchedulerOpen()) closeScheduler(); });
1097
1146
 
1098
1147
  // --- Ralph Loop UI (delegated to app-loop-ui.js + app-loop-wizard.js) ---
1099
1148
  function updateLoopInputVisibility(loop) { _loopUpdateLoopInputVisibility(loop); }
@@ -1118,7 +1167,6 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
1118
1167
  // --- Skill install dialog (delegated to app-skills-install.js) ---
1119
1168
  // knownInstalledSkills, pendingSkillInstalls -> modules/app-skills-install.js
1120
1169
  function requireSkills(opts, cb) { _siRequireSkills(opts, cb); }
1121
- function requireClayMateInterview(cb) { _siRequireClayMateInterview(cb); }
1122
1170
  function handleSkillInstallWs(msg) { _siHandleSkillInstallWs(msg); }
1123
1171
 
1124
1172
 
@@ -1210,6 +1258,21 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
1210
1258
 
1211
1259
  // --- Home Hub module ---
1212
1260
  initHomeHub();
1261
+ initHomeSidebar();
1262
+ initHomeSurfaceBoot();
1263
+
1264
+ // Mates live on the home hub now, so keep that pane and the C button
1265
+ // badge in sync with the mate list, unread DMs, and mention activity.
1266
+ store.subscribe(function (state, prev) {
1267
+ if (state.cachedMatesList !== prev.cachedMatesList || state.dmUnread !== prev.dmUnread) {
1268
+ renderHomeMateSwitcher();
1269
+ updateHomeIconBadge();
1270
+ }
1271
+ });
1272
+ onMentionActiveChange(function () {
1273
+ renderHomeMateSwitcher();
1274
+ });
1275
+ updateHomeIconBadge();
1213
1276
 
1214
1277
  // --- DM module ---
1215
1278
  initDm();
@@ -1222,11 +1285,9 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
1222
1285
  // --- Init ---
1223
1286
  lucide.createIcons();
1224
1287
  connect();
1225
- if (!store.get('currentSlug')) {
1226
- showHomeHub();
1227
- } else if (location.hash === "#scheduler") {
1288
+ if (slugMatch && location.hash === "#scheduler") {
1228
1289
  // Restore scheduler view after refresh
1229
1290
  setTimeout(function () { openSchedulerToTab("calendar"); }, 500);
1230
- } else {
1291
+ } else if (slugMatch) {
1231
1292
  inputEl.focus();
1232
1293
  }
@@ -13,7 +13,6 @@
13
13
  .dm-picker-mates-marquee-avatar,
14
14
  .dm-user-picker-avatar,
15
15
  .home-chat-avatar,
16
- .home-hub-mate-avatar,
17
16
  .icon-strip-me-avatar,
18
17
  .icon-strip-user-avatar,
19
18
  .input-mention-chip-avatar,
@@ -95,6 +95,10 @@ img.emoji {
95
95
  --brand-paper: #f2f2ef;
96
96
  --brand-indigo: #5857fc;
97
97
  --brand-green: #07e5a3;
98
+ --brand-gold: #e0b45b;
99
+ --brand-blue: #8aa7ff;
100
+ --brand-coral: #ff7479;
101
+ --brand-clay: #d69a7d;
98
102
  --font-weight-body: 400;
99
103
  --font-weight-ui: 500;
100
104
  --font-weight-heading: 600;