clay-server 5.2.0-beta.3 → 5.2.0-beta.5
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.
- package/lib/account-auth-socket.js +1 -0
- package/lib/builtin-mates.js +19 -16
- package/lib/bundled-skills/clay-agent-browser/SKILL.md +6 -2
- package/lib/canonical-clay-record-authority.js +15 -0
- package/lib/canonical-clay-scheduling-authority.js +19 -0
- package/lib/claude-hook-installer.js +28 -0
- package/lib/clay-mate-chat-receipts.js +26 -0
- package/lib/clay-mate-chat.js +87 -0
- package/lib/clay-mate-knowledge-input.js +26 -0
- package/lib/clay-mate-knowledge.js +95 -0
- package/lib/clay-mate-lifecycle.js +95 -0
- package/lib/clay-product-control-input.js +33 -0
- package/lib/clay-product-control-tools.js +51 -0
- package/lib/clay-product-control.js +237 -0
- package/lib/clay-project-lifecycle.js +154 -0
- package/lib/clay-project-record-input.js +44 -0
- package/lib/clay-project-records.js +83 -0
- package/lib/clay-scheduling-input.js +21 -0
- package/lib/clay-scheduling-receipts.js +26 -0
- package/lib/clay-scheduling.js +119 -0
- package/lib/clay-screen-controls.js +96 -0
- package/lib/clay-workspace-controls.js +83 -0
- package/lib/clay-workspace-input.js +17 -0
- package/lib/clay-workspace-receipts.js +26 -0
- package/lib/daemon-project-access.js +11 -0
- package/lib/daemon-project-lifecycle-callbacks.js +15 -0
- package/lib/daemon-project-lifecycle.js +262 -0
- package/lib/daemon-projects.js +1 -1
- package/lib/daemon.js +73 -221
- package/lib/issues-service.js +29 -15
- package/lib/knowledge-db-import.js +5 -4
- package/lib/knowledge-db-service.js +9 -6
- package/lib/knowledge-document-index.js +2 -1
- package/lib/knowledge-file-store.js +7 -1
- package/lib/knowledge-product-operations.js +46 -0
- package/lib/mate-avatar-catalog.js +12 -0
- package/lib/mate-avatar-migration.js +41 -0
- package/lib/mate-creation-mcp-server.js +2 -0
- package/lib/mate-knowledge-canonical-access.js +10 -0
- package/lib/mate-knowledge-service.js +7 -4
- package/lib/mate-lifecycle-service.js +94 -0
- package/lib/mate-message-delivery.js +43 -0
- package/lib/mate-ready-creation.js +9 -1
- package/lib/mate-schedule-input.js +29 -0
- package/lib/mate-schedule-lifecycle.js +151 -0
- package/lib/mate-scheduling.js +103 -0
- package/lib/mates.js +18 -6
- package/lib/mcp-agent-tools.js +117 -0
- package/lib/mcp-connection-store.js +119 -15
- package/lib/mcp-import-credentials.js +31 -0
- package/lib/mcp-local-transport.js +13 -0
- package/lib/mcp-oauth.js +8 -6
- package/lib/mcp-query-bridge.js +30 -0
- package/lib/mcp-remote-connections.js +74 -20
- package/lib/mcp-source-adapters.js +91 -0
- package/lib/mcp-source-context.js +42 -0
- package/lib/mcp-source-discovery.js +169 -0
- package/lib/mcp-source-plugins.js +68 -0
- package/lib/mcp-source-restrictions.js +47 -0
- package/lib/mcp-tool-policy.js +34 -0
- package/lib/notes-checklist.js +50 -0
- package/lib/notes.js +49 -3
- package/lib/os-users.js +20 -5
- package/lib/project-admin-overview.js +51 -0
- package/lib/project-ask-user.js +8 -4
- package/lib/project-debate.js +1 -0
- package/lib/project-delegated-follow-up.js +2 -1
- package/lib/project-directory-claim.js +65 -0
- package/lib/project-file-operations.js +61 -0
- package/lib/project-filesystem.js +13 -87
- package/lib/project-full-access.js +23 -2
- package/lib/project-knowledge.js +32 -18
- package/lib/project-lifecycle-operations.js +98 -0
- package/lib/project-lifecycle-process-witness.js +32 -0
- package/lib/project-lifecycle-runtime.js +50 -0
- package/lib/project-linux-access.js +22 -0
- package/lib/project-logs-canonical-clay.js +27 -0
- package/lib/project-logs-clay-query.js +16 -0
- package/lib/project-logs-schema.js +4 -2
- package/lib/project-logs-service.js +8 -7
- package/lib/project-logs.js +1 -0
- package/lib/project-loop.js +1 -0
- package/lib/project-mate-chat-control.js +55 -0
- package/lib/project-mate-creation-proposal.js +18 -3
- package/lib/project-mate-interaction.js +8 -0
- package/lib/project-mcp.js +54 -16
- package/lib/project-models.js +14 -31
- package/lib/project-notifications.js +74 -16
- package/lib/project-ownership.js +77 -0
- package/lib/project-pair-result-delivery.js +14 -3
- package/lib/project-pending-message-queue.js +1 -0
- package/lib/project-product-control.js +87 -0
- package/lib/project-product-session-queue.js +46 -0
- package/lib/project-push-access.js +28 -0
- package/lib/project-scheduled-message-queue.js +30 -0
- package/lib/project-scheduled-messages.js +63 -64
- package/lib/project-scheduled-task-control.js +83 -0
- package/lib/project-scheduled-tasks.js +13 -2
- package/lib/project-scheduling-access.js +10 -0
- package/lib/project-session-actions.js +65 -0
- package/lib/project-session-delete.js +8 -1
- package/lib/project-session-document.js +8 -3
- package/lib/project-session-github.js +63 -19
- package/lib/project-session-history-actions.js +165 -0
- package/lib/project-session-linear.js +14 -6
- package/lib/project-session-notes.js +7 -3
- package/lib/project-session-runtime-actions.js +63 -0
- package/lib/project-session-vendor.js +54 -0
- package/lib/project-sessions.js +68 -241
- package/lib/project-shared-browser.js +56 -12
- package/lib/project-user-message.js +30 -1
- package/lib/project-workspace-operations.js +126 -0
- package/lib/project-workspace-query.js +9 -2
- package/lib/project.js +144 -37
- package/lib/public/app.js +5 -0
- package/lib/public/appearance-bootstrap.js +14 -0
- package/lib/public/css/clay-tool-activity.css +51 -0
- package/lib/public/css/clay-workspace.css +29 -0
- package/lib/public/css/home-debate-planning.css +2 -0
- package/lib/public/css/home-mate-creation.css +5 -0
- package/lib/public/css/mate-avatar-gallery.css +12 -0
- package/lib/public/css/mate-conversation.css +10 -5
- package/lib/public/css/overlays.css +4 -2
- package/lib/public/css/project-admin-overview.css +13 -0
- package/lib/public/css/session-folders.css +11 -0
- package/lib/public/css/session-github.css +46 -1
- package/lib/public/css/shared-browser.css +35 -1
- package/lib/public/css/sticky-notes.css +61 -1
- package/lib/public/index.html +11 -5
- package/lib/public/mate-avatars/B01.png +0 -0
- package/lib/public/mate-avatars/B02.png +0 -0
- package/lib/public/mate-avatars/B03.png +0 -0
- package/lib/public/mate-avatars/B04.png +0 -0
- package/lib/public/mate-avatars/B05.png +0 -0
- package/lib/public/mate-avatars/B06.png +0 -0
- package/lib/public/mate-avatars/B07.png +0 -0
- package/lib/public/mate-avatars/B08.png +0 -0
- package/lib/public/mate-avatars/B09.png +0 -0
- package/lib/public/mate-avatars/B10.png +0 -0
- package/lib/public/mate-avatars/B11.png +0 -0
- package/lib/public/mate-avatars/B12.png +0 -0
- package/lib/public/mate-avatars/B13.png +0 -0
- package/lib/public/mate-avatars/B14.png +0 -0
- package/lib/public/mate-avatars/B15.png +0 -0
- package/lib/public/mate-avatars/B16.png +0 -0
- package/lib/public/mate-avatars/B17.png +0 -0
- package/lib/public/mate-avatars/B18.png +0 -0
- package/lib/public/mate-avatars/B19.png +0 -0
- package/lib/public/mate-avatars/B20.png +0 -0
- package/lib/public/mate-avatars/B21.png +0 -0
- package/lib/public/mate-avatars/B22.png +0 -0
- package/lib/public/mate-avatars/B23.png +0 -0
- package/lib/public/mate-avatars/B24.png +0 -0
- package/lib/public/mate-avatars/B25.png +0 -0
- package/lib/public/mate-avatars/B26.png +0 -0
- package/lib/public/mate-avatars/B27.png +0 -0
- package/lib/public/mate-avatars/B28.png +0 -0
- package/lib/public/mate-avatars/B29.png +0 -0
- package/lib/public/mate-avatars/B30.png +0 -0
- package/lib/public/mate-avatars/B31.png +0 -0
- package/lib/public/mate-avatars/B32.png +0 -0
- package/lib/public/mate-avatars/B33.png +0 -0
- package/lib/public/mate-avatars/B34.png +0 -0
- package/lib/public/mate-avatars/B35.png +0 -0
- package/lib/public/mate-avatars/B36.png +0 -0
- package/lib/public/mate-avatars/B37.png +0 -0
- package/lib/public/mate-avatars/B38.png +0 -0
- package/lib/public/mate-avatars/B39.png +0 -0
- package/lib/public/mate-avatars/B40.png +0 -0
- package/lib/public/mate-avatars/B41.png +0 -0
- package/lib/public/mate-avatars/B42.png +0 -0
- package/lib/public/mate-avatars/B43.png +0 -0
- package/lib/public/mate-avatars/B44.png +0 -0
- package/lib/public/mate-avatars/B45.png +0 -0
- package/lib/public/mate-avatars/B46.png +0 -0
- package/lib/public/mate-avatars/B47.png +0 -0
- package/lib/public/mate-avatars/B48.png +0 -0
- package/lib/public/mate-avatars/C01.png +0 -0
- package/lib/public/mate-avatars/C02.png +0 -0
- package/lib/public/mate-avatars/C03.png +0 -0
- package/lib/public/mate-avatars/C04.png +0 -0
- package/lib/public/mate-avatars/C05.png +0 -0
- package/lib/public/mate-avatars/C06.png +0 -0
- package/lib/public/mate-avatars/C07.png +0 -0
- package/lib/public/mate-avatars/C08.png +0 -0
- package/lib/public/mate-avatars/C09.png +0 -0
- package/lib/public/mate-avatars/C10.png +0 -0
- package/lib/public/mate-avatars/C11.png +0 -0
- package/lib/public/mate-avatars/C12.png +0 -0
- package/lib/public/mate-avatars/C13.png +0 -0
- package/lib/public/mate-avatars/C14.png +0 -0
- package/lib/public/mate-avatars/C15.png +0 -0
- package/lib/public/mate-avatars/C16.png +0 -0
- package/lib/public/mate-avatars/C17.png +0 -0
- package/lib/public/mate-avatars/C18.png +0 -0
- package/lib/public/mate-avatars/C19.png +0 -0
- package/lib/public/mate-avatars/C20.png +0 -0
- package/lib/public/mate-avatars/C21.png +0 -0
- package/lib/public/mate-avatars/C22.png +0 -0
- package/lib/public/mate-avatars/C23.png +0 -0
- package/lib/public/mate-avatars/C24.png +0 -0
- package/lib/public/mate-avatars/C25.png +0 -0
- package/lib/public/mate-avatars/C26.png +0 -0
- package/lib/public/mate-avatars/C27.png +0 -0
- package/lib/public/mate-avatars/C28.png +0 -0
- package/lib/public/mate-avatars/C29.png +0 -0
- package/lib/public/mate-avatars/C30.png +0 -0
- package/lib/public/mate-avatars/C31.png +0 -0
- package/lib/public/mate-avatars/C32.png +0 -0
- package/lib/public/mate-avatars/C33.png +0 -0
- package/lib/public/mate-avatars/C34.png +0 -0
- package/lib/public/mate-avatars/C35.png +0 -0
- package/lib/public/mate-avatars/C36.png +0 -0
- package/lib/public/mate-avatars/C37.png +0 -0
- package/lib/public/mate-avatars/C38.png +0 -0
- package/lib/public/mate-avatars/C39.png +0 -0
- package/lib/public/mate-avatars/C40.png +0 -0
- package/lib/public/mate-avatars/C41.png +0 -0
- package/lib/public/mate-avatars/C42.png +0 -0
- package/lib/public/mate-avatars/C43.png +0 -0
- package/lib/public/mate-avatars/C44.png +0 -0
- package/lib/public/mate-avatars/C45.png +0 -0
- package/lib/public/mate-avatars/C46.png +0 -0
- package/lib/public/mate-avatars/C47.png +0 -0
- package/lib/public/mate-avatars/C48.png +0 -0
- package/lib/public/mate-avatars/catalog.json +482 -0
- package/lib/public/mate-avatars/lead-clay.png +0 -0
- package/lib/public/modules/admin-settings-projects.js +6 -2
- package/lib/public/modules/app-connection.js +8 -1
- package/lib/public/modules/app-message-router.js +4 -0
- package/lib/public/modules/app-messages.js +31 -5
- package/lib/public/modules/app-projects.js +5 -0
- package/lib/public/modules/app-rendering.js +1 -1
- package/lib/public/modules/avatar.js +15 -41
- package/lib/public/modules/chat-render-runtime.js +10 -1
- package/lib/public/modules/clay-browser-links.js +47 -0
- package/lib/public/modules/clay-log-links.js +1 -1
- package/lib/public/modules/clay-owner-navigation.js +27 -0
- package/lib/public/modules/clay-tool-activity.js +140 -0
- package/lib/public/modules/clay-tool-presentation.js +338 -0
- package/lib/public/modules/command-palette.js +2 -2
- package/lib/public/modules/debate.js +1 -0
- package/lib/public/modules/default-ai.js +11 -3
- package/lib/public/modules/history-replay-batch.js +5 -1
- package/lib/public/modules/home-debate-live.js +2 -0
- package/lib/public/modules/home-debate-planning.js +7 -7
- package/lib/public/modules/home-mate-avatar-editor.js +127 -208
- package/lib/public/modules/home-mate-chat.js +8 -6
- package/lib/public/modules/home-mate-creation.js +73 -1
- package/lib/public/modules/home-mate-settings.js +19 -12
- package/lib/public/modules/markdown.js +4 -0
- package/lib/public/modules/mate-avatar-catalog.js +97 -0
- package/lib/public/modules/mate-management.js +40 -7
- package/lib/public/modules/mcp-connection-view.js +31 -13
- package/lib/public/modules/mcp-discovery-view.js +31 -0
- package/lib/public/modules/mcp-ui.js +23 -4
- package/lib/public/modules/mention.js +3 -0
- package/lib/public/modules/pane-browser-bridge.js +20 -0
- package/lib/public/modules/personal-settings-dialog.js +7 -1
- package/lib/public/modules/profile.js +1 -238
- package/lib/public/modules/project-access-recovery.js +17 -0
- package/lib/public/modules/project-admin-overview.js +21 -0
- package/lib/public/modules/project-mate-navigation.js +99 -14
- package/lib/public/modules/search-clay-chat.js +16 -2
- package/lib/public/modules/session-folder-layout.js +1 -1
- package/lib/public/modules/session-folder-view-menu.js +9 -0
- package/lib/public/modules/session-github.js +85 -14
- package/lib/public/modules/session-work-primary.js +51 -0
- package/lib/public/modules/shared-browser-settings.js +112 -0
- package/lib/public/modules/shared-browser-tabs.js +13 -3
- package/lib/public/modules/shared-browser.js +27 -6
- package/lib/public/modules/sidebar-session-folders-ui.js +1 -1
- package/lib/public/modules/split-view.js +2 -0
- package/lib/public/modules/sticky-note-markdown.js +72 -6
- package/lib/public/modules/sticky-notes-actions.js +30 -0
- package/lib/public/modules/sticky-notes-browser.js +9 -2
- package/lib/public/modules/sticky-notes-card.js +23 -7
- package/lib/public/modules/sticky-notes-checklist.js +71 -0
- package/lib/public/modules/sticky-notes-editor.js +108 -44
- package/lib/public/modules/sticky-notes-shared.js +50 -2
- package/lib/public/modules/sticky-notes-state.js +66 -0
- package/lib/public/modules/sticky-notes.js +34 -51
- package/lib/public/modules/theme.js +8 -1
- package/lib/public/modules/thinking-lifecycle.js +33 -3
- package/lib/public/modules/thinking-view.js +23 -1
- package/lib/public/modules/tools.js +36 -7
- package/lib/public/modules/user-settings-appearance.js +10 -3
- package/lib/public/modules/user-settings-editors.js +1 -1
- package/lib/public/modules/user-settings-layout.js +11 -2
- package/lib/public/modules/user-settings-preferences.js +6 -2
- package/lib/public/modules/user-settings-profile.js +12 -2
- package/lib/public/modules/user-settings.js +3 -2
- package/lib/public/style.css +3 -0
- package/lib/public/sw.js +3 -1
- package/lib/scheduled-task-records.js +3 -1
- package/lib/scheduler.js +2 -0
- package/lib/sdk-bridge.js +228 -23
- package/lib/sdk-message-processor.js +2 -0
- package/lib/sdk-response-recovery.js +155 -0
- package/lib/server-admin.js +63 -16
- package/lib/server-appearance-settings.js +13 -1
- package/lib/server-dm.js +2 -1
- package/lib/server-global-ws.js +10 -20
- package/lib/server-home-chat-events.js +18 -4
- package/lib/server-home-chat.js +12 -16
- package/lib/server-home-mate-creation.js +1 -0
- package/lib/server-home-mcp-consent.js +14 -0
- package/lib/server-mates.js +25 -62
- package/lib/server-owner-ui.js +77 -0
- package/lib/server-path-access.js +38 -0
- package/lib/server-project-removal.js +22 -0
- package/lib/server-settings.js +4 -1
- package/lib/server.js +144 -41
- package/lib/session-config-transition.js +45 -0
- package/lib/session-folders.js +7 -2
- package/lib/session-github.js +9 -2
- package/lib/session-visibility.js +5 -2
- package/lib/session-work-primary.js +50 -0
- package/lib/sessions.js +13 -0
- package/lib/shared-browser-cookie-sync.js +32 -0
- package/lib/shared-browser-cookies.js +79 -0
- package/lib/shared-browser-runtime.js +25 -9
- package/lib/shared-browser-storage-sync.js +43 -0
- package/lib/shared-browser-storage.js +101 -0
- package/lib/shared-browser-tools.js +2 -1
- package/lib/shared-browser-worker.js +46 -10
- package/lib/terminal-manager.js +52 -0
- package/lib/users-permissions.js +2 -8
- package/lib/users.js +4 -0
- package/lib/workspace-query-access.js +4 -1
- package/lib/ws-schema.js +8 -2
- package/lib/yoke/acp-agent-profiles.js +2 -2
- package/lib/yoke/adapters/claude.js +47 -8
- package/lib/yoke/adapters/codex.js +52 -111
- package/lib/yoke/claude-worker-startup.js +28 -0
- package/lib/yoke/codex-idle-recovery.js +81 -1
- package/lib/yoke/codex-recovery-admission.js +164 -0
- package/lib/yoke/session-tool-transport.js +3 -0
- package/package.json +5 -1
package/lib/project.js
CHANGED
|
@@ -46,6 +46,8 @@ var { attachShellCommand } = require("./project-shell-command");
|
|
|
46
46
|
var { attachVendorLogin } = require("./project-vendor-login");
|
|
47
47
|
var { attachConnection } = require("./project-connection");
|
|
48
48
|
var { attachProjectScheduledMessages } = require("./project-scheduled-messages");
|
|
49
|
+
var { attachMateScheduling } = require("./mate-scheduling");
|
|
50
|
+
var { attachMateScheduleLifecycle } = require("./mate-schedule-lifecycle");
|
|
49
51
|
var { attachMcp } = require("./project-mcp");
|
|
50
52
|
var { createSessionSkillCatalog } = require("./yoke/session-skill-catalog");
|
|
51
53
|
var { attachEmail: attachEmailModule } = require("./project-email");
|
|
@@ -229,6 +231,8 @@ function createProjectContext(opts) {
|
|
|
229
231
|
var getScheduleCount = opts.getScheduleCount || function () { return 0; };
|
|
230
232
|
var notifyProcessingChanged = opts.onProcessingChanged || function () {};
|
|
231
233
|
var _scheduledMessages = null;
|
|
234
|
+
var _mateScheduling = null;
|
|
235
|
+
var _mateLifecycle = null;
|
|
232
236
|
var _scheduledTasks = null;
|
|
233
237
|
var _scheduledTaskExecution = null;
|
|
234
238
|
function onProcessingChanged() {
|
|
@@ -348,6 +352,10 @@ function createProjectContext(opts) {
|
|
|
348
352
|
function getRuntimeEnvForSession(session) {
|
|
349
353
|
var linuxUser = (session && session.linuxUser) || getLinuxUserForSession(session);
|
|
350
354
|
var osUserInfo = getOsUserInfoForLinuxUser(linuxUser);
|
|
355
|
+
return resolveOwnerRuntimeEnv(osUserInfo);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
function resolveOwnerRuntimeEnv(osUserInfo) {
|
|
351
359
|
var baseEnv = osUserInfo ? buildUserEnv(osUserInfo) : process.env;
|
|
352
360
|
var shared = typeof opts.onGetSharedEnv === "function" ? opts.onGetSharedEnv() : null;
|
|
353
361
|
var projectEnv = typeof opts.onGetProjectEnv === "function" ? opts.onGetProjectEnv(slug) : null;
|
|
@@ -709,7 +717,22 @@ function createProjectContext(opts) {
|
|
|
709
717
|
|
|
710
718
|
// Personal computer tools use the extension; remote URLs are owner-bound.
|
|
711
719
|
var _mcp = attachMcp({
|
|
712
|
-
sendTo: sendTo, slug: slug, clients: clients,
|
|
720
|
+
sendTo: sendTo, slug: slug, clients: clients, cwd: cwd,
|
|
721
|
+
userInput: function (session) { return _askUser.createHandler(session); },
|
|
722
|
+
runtimeEnvForSession: getRuntimeEnvForSession,
|
|
723
|
+
canDiscoverSession: function (session) { var scope = _requestAccess.fileScope({ _clayUser: session.ownerId && usersModule.findUserById(session.ownerId) }); return !!scope.identity || !scope.projectBound; },
|
|
724
|
+
sessionVendor: function (session) { return session.vendor || sm.defaultVendor || "claude"; },
|
|
725
|
+
runtimeEnv: function (owner, ws) { return resolveOwnerRuntimeEnv(_requestAccess.fileScope(ws).identity); },
|
|
726
|
+
canDiscover: function (ws) { var scope = _requestAccess.fileScope(ws); return !!scope.identity || !scope.projectBound; },
|
|
727
|
+
ownerIdentity: function (owner) {
|
|
728
|
+
if (!osUsers) {
|
|
729
|
+
if (usersModule.isMultiUser() && (usersModule.getAllUsers().length !== 1 || !usersModule.findUserById(owner))) throw new Error('Local MCP requires OS user mapping in a shared installation.');
|
|
730
|
+
return null;
|
|
731
|
+
}
|
|
732
|
+
var user = usersModule.findUserById(owner);
|
|
733
|
+
if (!user || !user.linuxUser) throw new Error('OS user identity is unavailable.');
|
|
734
|
+
return getOsUserInfoForWs({ _clayUser: user });
|
|
735
|
+
},
|
|
713
736
|
root: require("./config").CONFIG_DIR,
|
|
714
737
|
isMultiUser: function () { return usersModule.isMultiUser(); },
|
|
715
738
|
canAccess: function (ws) { return _requestAccess.canAccessProject(ws, slug); },
|
|
@@ -769,7 +792,7 @@ function createProjectContext(opts) {
|
|
|
769
792
|
},
|
|
770
793
|
});
|
|
771
794
|
var _sharedBrowser = attachSharedBrowser({
|
|
772
|
-
slug: slug, isMate: isMate, sm: sm, clients: clients, sendTo: sendTo,
|
|
795
|
+
slug: slug, isMate: isMate, ownerId: projectOwnerId, sm: sm, clients: clients, sendTo: sendTo,
|
|
773
796
|
usersModule: usersModule, requestAccess: _requestAccess, osUsers: osUsers,
|
|
774
797
|
getSessionForWs: getSessionForWs,
|
|
775
798
|
getIdentity: function (session) {
|
|
@@ -780,6 +803,7 @@ function createProjectContext(opts) {
|
|
|
780
803
|
var _sessionDocument = attachSessionDocument({
|
|
781
804
|
cwd: cwd,
|
|
782
805
|
isMate: isMate,
|
|
806
|
+
canUseSession: _sessionNotes.canUseSession,
|
|
783
807
|
sendToSession: sendToSession,
|
|
784
808
|
FS_MAX_SIZE: FS_MAX_SIZE,
|
|
785
809
|
getOsUserInfoForSession: function (session) {
|
|
@@ -799,6 +823,7 @@ function createProjectContext(opts) {
|
|
|
799
823
|
});
|
|
800
824
|
var _workspaceQuery = attachProjectWorkspaceQuery({
|
|
801
825
|
service: opts.workspaceQueryService || null,
|
|
826
|
+
controlService: opts.clayProductControl || null,
|
|
802
827
|
sm: sm,
|
|
803
828
|
projectSlug: slug,
|
|
804
829
|
getProjectOwnerId: function () { return projectOwnerId; },
|
|
@@ -839,7 +864,12 @@ function createProjectContext(opts) {
|
|
|
839
864
|
sendTo: sendTo, getClients: function () { return clients; }, startWork: _issueWork,
|
|
840
865
|
});
|
|
841
866
|
var _sessionGithub = require("./project-session-github").attachSessionGithub({
|
|
842
|
-
cwd: cwd, sm: sm, isMate: isMate, osUsers: osUsers,
|
|
867
|
+
cwd: cwd, sm: sm, isMate: isMate, osUsers: osUsers, projectSlug: slug, sendTo: sendTo,
|
|
868
|
+
userInput: function (session) { return _askUser.createHandler(session); },
|
|
869
|
+
canAccess: function (ws) {
|
|
870
|
+
return !isMate && clients.has(ws) && ws.readyState === 1 && (!usersModule.isMultiUser() ||
|
|
871
|
+
!!(ws._clayUser && usersModule.findUserById(ws._clayUser.id) && opts.canAccessProjectSlug(ws._clayUser.id, slug)));
|
|
872
|
+
},
|
|
843
873
|
canUse: function (session) {
|
|
844
874
|
if (session.hidden || session.delegated || session._pairDelegation || session._delegatedBy || require("./session-provenance").isWorker(session)) return false;
|
|
845
875
|
if (!usersModule.isMultiUser()) return true;
|
|
@@ -858,9 +888,10 @@ function createProjectContext(opts) {
|
|
|
858
888
|
});
|
|
859
889
|
var _sessionLinear = require("./project-session-linear").attachSessionLinear({
|
|
860
890
|
sm: sm, isMate: isMate, storage: opts.linearStorage, projectSlug: slug,
|
|
891
|
+
userInput: function (session) { return _askUser.createHandler(session); },
|
|
861
892
|
isMultiUser: usersModule.isMultiUser, sendTo: sendTo,
|
|
862
893
|
canAccess: function (ws) {
|
|
863
|
-
return
|
|
894
|
+
return clients.has(ws) && ws.readyState === 1 && (!usersModule.isMultiUser() ||
|
|
864
895
|
!!(ws._clayUser && usersModule.findUserById(ws._clayUser.id) && opts.canAccessProjectSlug(ws._clayUser.id, slug)));
|
|
865
896
|
},
|
|
866
897
|
startWork: require('./project-linear-launch').attachLinearLaunch({
|
|
@@ -1021,6 +1052,7 @@ function createProjectContext(opts) {
|
|
|
1021
1052
|
persistSession: function (session) { return sm.saveSessionFile(session); },
|
|
1022
1053
|
getVendorModelCatalog: function (ws, vendor) { return _models.getVendorCatalog(ws, vendor); },
|
|
1023
1054
|
createReadyMate: opts.createReadyMate,
|
|
1055
|
+
isLive: function (session) { return sm.sessions.get(session.localId) === session; },
|
|
1024
1056
|
});
|
|
1025
1057
|
var _askUser = attachAskUser({
|
|
1026
1058
|
record: function (session, event) { sm.sendAndRecord(session, event); },
|
|
@@ -1055,14 +1087,12 @@ function createProjectContext(opts) {
|
|
|
1055
1087
|
}
|
|
1056
1088
|
}
|
|
1057
1089
|
|
|
1058
|
-
// Shared sticky-note memory
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
console.error("[project] Failed to create session notes MCP server:", e.message);
|
|
1065
|
-
}
|
|
1090
|
+
// Shared sticky-note memory is available in both owner-private projects and Mates.
|
|
1091
|
+
try {
|
|
1092
|
+
var sessionNotesMcpConfig = _sessionNotes.createMcpServer(adapter);
|
|
1093
|
+
if (sessionNotesMcpConfig) servers[sessionNotesMcpConfig.name || "clay-notes"] = sessionNotesMcpConfig;
|
|
1094
|
+
} catch (e) {
|
|
1095
|
+
console.error("[project] Failed to create session notes MCP server:", e.message);
|
|
1066
1096
|
}
|
|
1067
1097
|
|
|
1068
1098
|
// Project Logs. Project sessions get the project-scoped set; Mate projects
|
|
@@ -1107,13 +1137,11 @@ function createProjectContext(opts) {
|
|
|
1107
1137
|
if (sharedBrowserConfig) servers["clay-shared-browser"] = sharedBrowserConfig;
|
|
1108
1138
|
|
|
1109
1139
|
// Explicit agent signal for user-requested Markdown presentation.
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
console.error("[project] Failed to create session document MCP server:", e.message);
|
|
1116
|
-
}
|
|
1140
|
+
try {
|
|
1141
|
+
var sessionDocumentMcpConfig = _sessionDocument.createMcpServer(adapter);
|
|
1142
|
+
if (sessionDocumentMcpConfig) servers[sessionDocumentMcpConfig.name || "clay-documents"] = sessionDocumentMcpConfig;
|
|
1143
|
+
} catch (e) {
|
|
1144
|
+
console.error("[project] Failed to create session document MCP server:", e.message);
|
|
1117
1145
|
}
|
|
1118
1146
|
|
|
1119
1147
|
// Debate MCP server (available to both mates and main project)
|
|
@@ -1383,6 +1411,7 @@ function createProjectContext(opts) {
|
|
|
1383
1411
|
|
|
1384
1412
|
// --- SDK bridge ---
|
|
1385
1413
|
sdk = createSDKBridge({
|
|
1414
|
+
isLifecycleExecutionPaused: function () { return !!(opts.getProjectAccess && opts.getProjectAccess().lifecycleExecutionPaused); },
|
|
1386
1415
|
cwd: cwd,
|
|
1387
1416
|
slug: slug,
|
|
1388
1417
|
sessionManager: sm,
|
|
@@ -1458,6 +1487,7 @@ function createProjectContext(opts) {
|
|
|
1458
1487
|
_sessionGithub.getSystemPrompt(session),
|
|
1459
1488
|
_sessionLinear.getSystemPrompt(session),
|
|
1460
1489
|
_scheduledTasks ? _scheduledTasks.getSystemPrompt(session) : "",
|
|
1490
|
+
_mateScheduling ? _mateScheduling.getSystemPrompt(session) : "",
|
|
1461
1491
|
_mateKnowledge.getSystemPrompt(session),
|
|
1462
1492
|
_userKnowledge.getSystemPrompt(session),
|
|
1463
1493
|
_autonomousRun ? _autonomousRun.getSystemPrompt(session) : "",
|
|
@@ -1487,6 +1517,7 @@ function createProjectContext(opts) {
|
|
|
1487
1517
|
.concat(opts.userKnowledgeService ? _userKnowledge.getDynamicToolDefs(session) : [])
|
|
1488
1518
|
.concat(_loopInterview ? _loopInterview.getToolDefs(session) : [])
|
|
1489
1519
|
.concat(_scheduledTasks ? _scheduledTasks.getToolDefs(session) : [])
|
|
1520
|
+
.concat(_mateScheduling ? _mateScheduling.getToolDefs(session) : [])
|
|
1490
1521
|
.concat(_scheduledTaskExecution ? _scheduledTaskExecution.getToolDefs(session) : [])
|
|
1491
1522
|
.concat(_autonomousRun ? _autonomousRun.getToolDefs(session) : []);
|
|
1492
1523
|
},
|
|
@@ -1542,6 +1573,8 @@ function createProjectContext(opts) {
|
|
|
1542
1573
|
|
|
1543
1574
|
_scheduledMessages = attachProjectScheduledMessages({
|
|
1544
1575
|
scheduler: opts.durableScheduler,
|
|
1576
|
+
mateLifecycle: function () { return _mateLifecycle; },
|
|
1577
|
+
deferRehydrate: isMate,
|
|
1545
1578
|
slug: slug,
|
|
1546
1579
|
isMate: isMate,
|
|
1547
1580
|
osUsers: osUsers,
|
|
@@ -1564,6 +1597,32 @@ function createProjectContext(opts) {
|
|
|
1564
1597
|
consumePendingMessage: function (session) { return _userMessage && _userMessage.consumePendingMessage(session); },
|
|
1565
1598
|
});
|
|
1566
1599
|
|
|
1600
|
+
var _schedulingAccess = require('./project-scheduling-access').attachSchedulingAccess({ osUsers: osUsers, getLinuxUser: getLinuxUserForSession, resolveLinuxUser: getOsUserInfoForLinuxUser });
|
|
1601
|
+
_mateLifecycle = attachMateScheduleLifecycle({
|
|
1602
|
+
sm: sm, scheduler: opts.durableScheduler, slug: slug,
|
|
1603
|
+
owner: function (session) { return _mateScheduling.owner(session); },
|
|
1604
|
+
authorize: function (session, control) { return control ? _mateScheduling.authorizeControl(session, control) : _mateScheduling.authorize(session); },
|
|
1605
|
+
authorizeRuntime: function (session) { return _mateScheduling.authorizeLifecycle(session); },
|
|
1606
|
+
schedule: function () { return _scheduledMessages.schedule.apply(null, arguments); },
|
|
1607
|
+
queueItem: function (session, job) { return _scheduledMessages.queueItem(session, job); },
|
|
1608
|
+
cancelJob: function (session, job) {
|
|
1609
|
+
return _scheduledMessages.cancel(session, { id: job.ownerId }, null, "cancelled_by_mate", { jobId: job.id, revision: job.payload.revision });
|
|
1610
|
+
},
|
|
1611
|
+
});
|
|
1612
|
+
_mateScheduling = attachMateScheduling({
|
|
1613
|
+
isMate: isMate, isHostAgent: isHostAgent, projectOwnerId: projectOwnerId, slug: slug, mateId: opts.mateId,
|
|
1614
|
+
sm: sm, users: usersModule, lifecycle: _mateLifecycle,
|
|
1615
|
+
authorizeAccess: function (session, ownerId) { _schedulingAccess.ownerIdentity(session); return _scheduledMessages.authorize(session, ownerId); },
|
|
1616
|
+
userInput: function (session) { return _askUser.createHandler(session); },
|
|
1617
|
+
});
|
|
1618
|
+
if (isMate) {
|
|
1619
|
+
sm.sessions.forEach(function (session) {
|
|
1620
|
+
try { _mateLifecycle.reconcile(session); }
|
|
1621
|
+
catch (error) { console.error("[mate-schedules] Recovery failed:", error.message); }
|
|
1622
|
+
});
|
|
1623
|
+
_scheduledMessages.rehydrate();
|
|
1624
|
+
}
|
|
1625
|
+
|
|
1567
1626
|
// --- Loop engine (delegated to project-loop.js) ---
|
|
1568
1627
|
// --- Notification center (global singleton from server.js) ---
|
|
1569
1628
|
var _notifications = opts.notificationsModule || null;
|
|
@@ -1645,6 +1704,7 @@ function createProjectContext(opts) {
|
|
|
1645
1704
|
cwd: cwd,
|
|
1646
1705
|
projectSlug: slug,
|
|
1647
1706
|
projectTitle: title || project,
|
|
1707
|
+
validateOwnerIdentity: _schedulingAccess.ownerIdentity,
|
|
1648
1708
|
isMate: isMate,
|
|
1649
1709
|
sm: sm,
|
|
1650
1710
|
sdk: sdk,
|
|
@@ -1743,8 +1803,8 @@ function createProjectContext(opts) {
|
|
|
1743
1803
|
}
|
|
1744
1804
|
|
|
1745
1805
|
// --- Schedule / cancel a message (used by WS handler and auto-continue) ---
|
|
1746
|
-
function scheduleMessage(session, text, resetsAt, actorUser, targetWs, attachments, requestId, transportAccountId) {
|
|
1747
|
-
return _scheduledMessages ? _scheduledMessages.schedule(session, text, resetsAt, actorUser, targetWs, attachments, requestId, transportAccountId) : null;
|
|
1806
|
+
function scheduleMessage(session, text, resetsAt, actorUser, targetWs, attachments, requestId, transportAccountId, options) {
|
|
1807
|
+
return _scheduledMessages ? _scheduledMessages.schedule(session, text, resetsAt, actorUser, targetWs, attachments, requestId, transportAccountId, options) : null;
|
|
1748
1808
|
}
|
|
1749
1809
|
|
|
1750
1810
|
function cancelScheduledMessage(session, actorUser, targetWs, correlation) {
|
|
@@ -1778,7 +1838,7 @@ function createProjectContext(opts) {
|
|
|
1778
1838
|
}
|
|
1779
1839
|
|
|
1780
1840
|
// --- DM messages (delegated to server-level handler) ---
|
|
1781
|
-
if (msg.type === "home_debate_question_response" || msg.type === "home_debate_control" || msg.type === "home_mate_creation_question_response" || msg.type === "default_ai_get" || msg.type === "default_ai_catalog_get" || msg.type === "default_ai_set" || msg.type === "default_vendor_get" || msg.type === "default_vendor_set" || msg.type === "context_view_get" || msg.type === "context_view_set" || msg.type === "cursor_sharing_get" || msg.type === "cursor_sharing_set") {
|
|
1841
|
+
if (msg.type === "home_mate_question_response" || msg.type === "clay_ui_ready" || msg.type === "clay_navigation_claim" || msg.type === "clay_navigation_ack" || msg.type === "home_debate_question_response" || msg.type === "home_debate_control" || msg.type === "home_mate_creation_question_response" || msg.type === "default_ai_get" || msg.type === "default_ai_catalog_get" || msg.type === "default_ai_set" || msg.type === "default_vendor_get" || msg.type === "default_vendor_set" || msg.type === "context_view_get" || msg.type === "context_view_set" || msg.type === "cursor_sharing_get" || msg.type === "cursor_sharing_set") {
|
|
1782
1842
|
if (typeof opts.onDmMessage === "function") opts.onDmMessage(ws, msg, slug);
|
|
1783
1843
|
return;
|
|
1784
1844
|
}
|
|
@@ -2074,6 +2134,8 @@ function createProjectContext(opts) {
|
|
|
2074
2134
|
});
|
|
2075
2135
|
sm.setSessionHydrator(_sessionSkillCatalog.hydrate);
|
|
2076
2136
|
var _sessions = attachSessions({
|
|
2137
|
+
adapters: adapters,
|
|
2138
|
+
isPendingQueuePaused: function (session) { return _pendingMessageQueue.isPaused(session); },
|
|
2077
2139
|
cwd: cwd,
|
|
2078
2140
|
slug: slug,
|
|
2079
2141
|
isMate: isMate,
|
|
@@ -2147,6 +2209,26 @@ function createProjectContext(opts) {
|
|
|
2147
2209
|
_notifications: _notifications,
|
|
2148
2210
|
_projectLogs: _projectLogs,
|
|
2149
2211
|
});
|
|
2212
|
+
var _productControl = require("./project-product-control").attachProjectProductControl({
|
|
2213
|
+
sm: sm, users: usersModule, clients: clients, slug: slug, isMate: isMate, osUsers: osUsers,
|
|
2214
|
+
getProjectAccess: opts.getProjectAccess || function () { return { visibility: "public", ownerId: projectOwnerId || null }; },
|
|
2215
|
+
userInput: function (session) { return _askUser.createHandler(session); },
|
|
2216
|
+
actions: _sessions.sessionActions, history: _sessions.sessionHistoryActions, selectModel: function (session, model, options) { return _models.selectSessionModel(session, model, null, options); },
|
|
2217
|
+
isDriverOperatedSession: function (session) { return _sessionPair.workerPermission.isDriverOperated(session); },
|
|
2218
|
+
deletePlan: _sessions.deleteProductControlPlan,
|
|
2219
|
+
queue: _pendingMessageQueue,
|
|
2220
|
+
requestQueueDrain: function (session) { if (_userMessage) _userMessage.consumePendingMessage(session); },
|
|
2221
|
+
vendor: _sessions.sessionVendorActions,
|
|
2222
|
+
runtime: _sessions.sessionRuntimeActions,
|
|
2223
|
+
});
|
|
2224
|
+
var _mateChatControl = require('./project-mate-chat-control').attachMateChatControl({
|
|
2225
|
+
sm: sm, sdk: sdk, isMate: isMate, osUsers: osUsers, getLinuxUser: getLinuxUserForSession,
|
|
2226
|
+
users: usersModule, getAccess: opts.getProjectAccess || function () { return { isMate: isMate, ownerId: projectOwnerId || null, visibility: 'private' }; },
|
|
2227
|
+
actions: _sessions.sessionActions, vendor: _sessions.sessionVendorActions,
|
|
2228
|
+
selectModel: function (session, model, options) { return _models.selectSessionModel(session, model, null, options); },
|
|
2229
|
+
});
|
|
2230
|
+
|
|
2231
|
+
|
|
2150
2232
|
|
|
2151
2233
|
var _models = attachModels({
|
|
2152
2234
|
cwd: cwd,
|
|
@@ -2193,6 +2275,7 @@ function createProjectContext(opts) {
|
|
|
2193
2275
|
});
|
|
2194
2276
|
var _delegatedFollowUp = attachDelegatedFollowUp({
|
|
2195
2277
|
sm: sm,
|
|
2278
|
+
isPendingQueuePaused: function (session) { return _pendingMessageQueue.isPaused(session); },
|
|
2196
2279
|
getSdk: function () { return sdk; },
|
|
2197
2280
|
getLinuxUserForSession: getLinuxUserForSession,
|
|
2198
2281
|
onProcessingChanged: onProcessingChanged,
|
|
@@ -2207,6 +2290,12 @@ function createProjectContext(opts) {
|
|
|
2207
2290
|
|
|
2208
2291
|
// --- User message handler (delegated to project-user-message.js) ---
|
|
2209
2292
|
var _userMessage = attachUserMessage({
|
|
2293
|
+
isLifecycleExecutionPaused: function () { return !!(opts.getProjectAccess && opts.getProjectAccess().lifecycleExecutionPaused); },
|
|
2294
|
+
resumeLifecycleProject: function (ws) {
|
|
2295
|
+
if (!opts.getProjectAccess || !opts.getProjectAccess().lifecycleExecutionPaused) return true;
|
|
2296
|
+
if (!clients.has(ws) || !ws._clayUser || !opts.resumeLifecycleProject) throw new Error('The current owner must explicitly resume recovered project execution.');
|
|
2297
|
+
return opts.resumeLifecycleProject(ws._clayUser.id);
|
|
2298
|
+
},
|
|
2210
2299
|
// Exact live pair state decides whether a session is Driver-operated; the
|
|
2211
2300
|
// handler never infers the role from the message.
|
|
2212
2301
|
isDriverOperatedSession: function (session) {
|
|
@@ -2329,6 +2418,13 @@ function createProjectContext(opts) {
|
|
|
2329
2418
|
FS_MAX_SIZE: FS_VIEWER_MAX_SIZE,
|
|
2330
2419
|
});
|
|
2331
2420
|
|
|
2421
|
+
var _workspaceOperations = require('./project-workspace-operations').attachWorkspaceOperations({
|
|
2422
|
+
cwd: cwd, isMate: isMate, osUsers: osUsers, users: usersModule, tm: tm,
|
|
2423
|
+
getAccess: opts.getProjectAccess || function () { return { ownerId: projectOwnerId || null, visibility: 'private' }; },
|
|
2424
|
+
files: function () { return _filesystem.productOperations; },
|
|
2425
|
+
publishTerminals: function () { send({ type: 'term_list', terminals: tm.list() }); },
|
|
2426
|
+
});
|
|
2427
|
+
|
|
2332
2428
|
// --- MCP bridge handler for Codex and session-bound Kiro tools ---
|
|
2333
2429
|
// Provides list_tools and call_tool operations over HTTP for mcp-bridge-server.js.
|
|
2334
2430
|
// The normal Codex bridge excludes local MCP servers it manages natively;
|
|
@@ -2336,6 +2432,8 @@ function createProjectContext(opts) {
|
|
|
2336
2432
|
function getMcpBridgeHandler(sessionId, sessionOnly, queryGeneration) {
|
|
2337
2433
|
var boundSession = Number.isInteger(sessionId) ? sm.sessions.get(sessionId) : null;
|
|
2338
2434
|
var queryToolBridge = createSessionQueryToolBridge({ session: boundSession, sdk: sdk });
|
|
2435
|
+
var externalQueryBridge = require('./mcp-query-bridge').createQueryBridge({ valid: sessionQueryValid,
|
|
2436
|
+
getServers: function () { return _mcp.getMcpServers(boundSession, sessionQueryValid()); } });
|
|
2339
2437
|
function sessionQueryValid() {
|
|
2340
2438
|
return !!boundSession
|
|
2341
2439
|
&& Number.isInteger(queryGeneration)
|
|
@@ -2460,7 +2558,7 @@ function createProjectContext(opts) {
|
|
|
2460
2558
|
}
|
|
2461
2559
|
}
|
|
2462
2560
|
|
|
2463
|
-
if (sessionOnly) return Promise.resolve(tools);
|
|
2561
|
+
if (sessionOnly) return Promise.resolve(tools.concat(externalQueryBridge.list()));
|
|
2464
2562
|
|
|
2465
2563
|
// In-app MCP servers (debate, browser, email).
|
|
2466
2564
|
// Use getLocalMcpServers() so clay-browser is hidden unless the
|
|
@@ -2480,7 +2578,7 @@ function createProjectContext(opts) {
|
|
|
2480
2578
|
}
|
|
2481
2579
|
|
|
2482
2580
|
// Personal computer and remote URL connections.
|
|
2483
|
-
var remoteServers = _mcp.getMcpServers(boundSession);
|
|
2581
|
+
var remoteServers = sessionQueryValid() ? _mcp.getMcpServers(boundSession, sessionQueryValid()) : {};
|
|
2484
2582
|
if (remoteServers) {
|
|
2485
2583
|
var remoteNames = Object.keys(remoteServers);
|
|
2486
2584
|
for (var ri = 0; ri < remoteNames.length; ri++) {
|
|
@@ -2578,7 +2676,7 @@ function createProjectContext(opts) {
|
|
|
2578
2676
|
if (serverName === "clay-sessions" || serverName === "clay-notes" || serverName === "clay-handoff" || serverName === "clay-documents" || serverName === "clay-shared-browser" || serverName === "clay-debate" || serverName === "clay-mate-creation" || serverName === "clay-workspace" || serverName === "clay-history" || serverName === "clay-github" || serverName === "clay-linear" || serverName === "clay-issues" || serverName === "clay-logs" || serverName === "clay-knowledge" || serverName === "clay-you") {
|
|
2579
2677
|
return Promise.reject(new Error("Session-bound tool requires a valid Clay session: " + serverName + "/" + toolName));
|
|
2580
2678
|
}
|
|
2581
|
-
if (sessionOnly) return
|
|
2679
|
+
if (sessionOnly) return externalQueryBridge.call(serverName, toolName, args);
|
|
2582
2680
|
// Try in-app servers first (gated by extension connectivity for clay-browser).
|
|
2583
2681
|
var localMcp = getLocalMcpServers(boundSession);
|
|
2584
2682
|
if (localMcp && localMcp[serverName]) {
|
|
@@ -2590,17 +2688,7 @@ function createProjectContext(opts) {
|
|
|
2590
2688
|
}
|
|
2591
2689
|
}
|
|
2592
2690
|
}
|
|
2593
|
-
|
|
2594
|
-
var remoteServers = _mcp.getMcpServers(boundSession);
|
|
2595
|
-
if (remoteServers && remoteServers[serverName]) {
|
|
2596
|
-
var rServer = remoteServers[serverName];
|
|
2597
|
-
if (rServer.instance && rServer.instance._registeredTools && rServer.instance._registeredTools[toolName]) {
|
|
2598
|
-
var rHandler = rServer.instance._registeredTools[toolName].handler;
|
|
2599
|
-
if (typeof rHandler === "function") {
|
|
2600
|
-
return Promise.resolve(rHandler(args));
|
|
2601
|
-
}
|
|
2602
|
-
}
|
|
2603
|
-
}
|
|
2691
|
+
if (externalQueryBridge.list().some(function (tool) { return tool.server === serverName && tool.name === toolName; })) return externalQueryBridge.call(serverName, toolName, args);
|
|
2604
2692
|
return Promise.reject(new Error("Tool not found: " + serverName + "/" + toolName));
|
|
2605
2693
|
},
|
|
2606
2694
|
};
|
|
@@ -2766,6 +2854,7 @@ function createProjectContext(opts) {
|
|
|
2766
2854
|
return false;
|
|
2767
2855
|
}));
|
|
2768
2856
|
} catch (err) {
|
|
2857
|
+
shutdowns.push(Promise.resolve(false));
|
|
2769
2858
|
console.error("[project] " + vendor + " shutdown threw for " + slug + ":", err && err.message ? err.message : err);
|
|
2770
2859
|
}
|
|
2771
2860
|
});
|
|
@@ -2909,15 +2998,32 @@ function createProjectContext(opts) {
|
|
|
2909
2998
|
},
|
|
2910
2999
|
getYouLinuxUser: getLinuxUserForSession,
|
|
2911
3000
|
getStatus: getStatus,
|
|
3001
|
+
bindMateSchedule: function (session, intent, id) {
|
|
3002
|
+
return _mateLifecycle.create(session, require("./mate-schedule-input").normalize(intent), id);
|
|
3003
|
+
},
|
|
3004
|
+
cancelMateSchedule: function (session, record) { return _mateLifecycle.cancel(session, record); },
|
|
2912
3005
|
getSessionManager: function () { return sm; },
|
|
2913
3006
|
createDelegatedSession: _delegatedSession.createDelegatedSession,
|
|
3007
|
+
refreshEnvironmentRuntime: function () { return sdk.refreshEnvironmentRuntime(); },
|
|
3008
|
+
getWorkspaceProductOperations: function () { return isMate ? null : _workspaceOperations; },
|
|
3009
|
+
getMateChatControl: function () { return isMate ? _mateChatControl : null; },
|
|
3010
|
+
getMateScheduleControl: function () { return isMate ? _mateLifecycle : null; },
|
|
3011
|
+
getScheduledTaskControl: function () { return _scheduledTasks.productControl; },
|
|
3012
|
+
notifyIssueUpdate: _issues.notify,
|
|
3013
|
+
notifyLogUpdate: _projectLogs.broadcastUpdate,
|
|
3014
|
+
requestProductControlReview: _productControl.requestProductControlReview,
|
|
3015
|
+
applyProductSessionAction: _productControl.applyProductSessionAction,
|
|
3016
|
+
inspectProductSessionQueue: _productControl.inspectProductSessionQueue,
|
|
3017
|
+
inspectProductSessionRuntime: _sessions.sessionRuntimeActions.inspect,
|
|
3018
|
+
inspectMateLifecycleRuntime: _sessions.sessionRuntimeActions.inspectLifecycle,
|
|
2914
3019
|
inspectDelegatedFollowUp: _delegatedFollowUp.inspectDelegatedFollowUp,
|
|
2915
3020
|
dispatchDelegatedFollowUp: _delegatedFollowUp.dispatchDelegatedFollowUp,
|
|
2916
3021
|
deliverCapsuleTurn: _capsuleTurn.deliverCapsuleTurn,
|
|
2917
3022
|
unregisterHomeDebateClient: function (ws) { homeDebateClients.delete(ws); },
|
|
2918
3023
|
handleHomeDebateProposalResponse: function (ws, msg, session) { return _debateProposal.handleHomeMessage(ws, msg, session); },
|
|
2919
3024
|
handleHomeMateCreationProposalResponse: function (ws, msg, session) { return _mateCreationProposal.handleHomeMessage(ws, msg, session); },
|
|
2920
|
-
|
|
3025
|
+
registerMcpConsentViewer: _mcp.registerConsentViewer,
|
|
3026
|
+
handleHomeAskUserResponse: function (msg, session, ws) { return _sessions.respondToAskUser(session, msg, ws); },
|
|
2921
3027
|
handleHomePermissionResponse: function (ws, msg, session) { return _sessions.respondToHomePermission(ws, msg, session); },
|
|
2922
3028
|
stopHomeSession: function (session) { return _sessions.stopHomeSession(session); },
|
|
2923
3029
|
handleHomeDebateControl: function (ws, msg, session) { return _debate.handleHomeControl(ws, msg, session); },
|
|
@@ -2926,6 +3032,7 @@ function createProjectContext(opts) {
|
|
|
2926
3032
|
getMemoryState: _memory.readMemoryState,
|
|
2927
3033
|
listKnowledgeFiles: _knowledge.listKnowledgeFiles,
|
|
2928
3034
|
getKnowledgeDbService: function () { return _knowledge.databases; },
|
|
3035
|
+
getKnowledgeProductOperations: function () { return _knowledge.productOperations; },
|
|
2929
3036
|
refreshCapsuleCatalog: _capsuleCatalog.refreshSessions,
|
|
2930
3037
|
getNotificationsModule: function () { return _notifications; },
|
|
2931
3038
|
refreshVendorAuth: _vendorLogin.refreshVendorAuth,
|
package/lib/public/app.js
CHANGED
|
@@ -285,6 +285,8 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
|
|
|
285
285
|
mcpConnections: { screen: "list", servers: [], search: "", loaded: false },
|
|
286
286
|
sharedBrowserOpen: false,
|
|
287
287
|
sharedBrowserUi: {},
|
|
288
|
+
sharedBrowserSettings: {},
|
|
289
|
+
browserLinksBound: false,
|
|
288
290
|
// session / routing
|
|
289
291
|
basePath: basePath,
|
|
290
292
|
wsPath: wsPath,
|
|
@@ -324,9 +326,12 @@ import { initDebate, handleDebatePreparing, handleDebateStarted, handleDebateRes
|
|
|
324
326
|
githubWorkSessions: [],
|
|
325
327
|
githubWorkProject: null,
|
|
326
328
|
githubWorkRefresh: null,
|
|
329
|
+
workPrimaryPending: null,
|
|
327
330
|
activeProjectSlug: null,
|
|
328
331
|
activeProjectMateId: null,
|
|
329
332
|
activeProjectMateName: '',
|
|
333
|
+
clayReturnTarget: null,
|
|
334
|
+
clayReturnPendingProjectSlug: null,
|
|
330
335
|
activeSessionMateId: null,
|
|
331
336
|
activeSessionMateName: '',
|
|
332
337
|
sessionActivatedProjectSlug: null,
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
(function () {
|
|
2
|
+
var root = document.documentElement;
|
|
3
|
+
var light = window.matchMedia && window.matchMedia("(prefers-color-scheme: light)").matches;
|
|
4
|
+
var seed = window.__clayAppearanceSeed;
|
|
5
|
+
|
|
6
|
+
function applyMode(mode) {
|
|
7
|
+
if (mode !== "light" && mode !== "dark") return;
|
|
8
|
+
root.classList.toggle("light-theme", mode === "light");
|
|
9
|
+
root.classList.toggle("dark-theme", mode !== "light");
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
var savedMode = seed && seed.configured && (seed.mode === "light" || seed.mode === "dark") ? seed.mode : null;
|
|
13
|
+
applyMode(savedMode || (light ? "light" : "dark"));
|
|
14
|
+
}());
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/* Keep internal activity in the established compact tool disclosure rows. */
|
|
2
|
+
.clay-tool-activity .tool-name {
|
|
3
|
+
flex-shrink: 1;
|
|
4
|
+
min-width: 0;
|
|
5
|
+
overflow: hidden;
|
|
6
|
+
text-overflow: ellipsis;
|
|
7
|
+
white-space: nowrap;
|
|
8
|
+
}
|
|
9
|
+
.clay-tool-activity .tool-desc {
|
|
10
|
+
font-family: var(--font-ui);
|
|
11
|
+
flex: 0 1 auto;
|
|
12
|
+
}
|
|
13
|
+
.clay-tool-activity .tool-status-icon { margin-left: auto; }
|
|
14
|
+
.clay-tool-activity .tool-subtitle { display: none; }
|
|
15
|
+
.tool-header[role="button"]:focus-visible,
|
|
16
|
+
.tool-group-header[role="button"]:focus-visible {
|
|
17
|
+
outline: 2px solid var(--accent);
|
|
18
|
+
outline-offset: 2px;
|
|
19
|
+
}
|
|
20
|
+
.clay-tool-activity[data-activity-phase="running"] .tool-bullet {
|
|
21
|
+
animation: pulse 1.5s ease-in-out infinite;
|
|
22
|
+
}
|
|
23
|
+
.clay-tool-activity[data-activity-phase="pending"] .tool-bullet,
|
|
24
|
+
.tool-group[data-activity-phase="pending"] .tool-group-bullet {
|
|
25
|
+
background: var(--text-muted);
|
|
26
|
+
animation: none;
|
|
27
|
+
}
|
|
28
|
+
.clay-tool-activity[data-activity-phase="error"] .tool-name,
|
|
29
|
+
.clay-tool-activity[data-activity-phase="cancelled"] .tool-name,
|
|
30
|
+
.tool-group[data-activity-phase="error"] .tool-group-label { color: var(--error); }
|
|
31
|
+
.clay-tool-technical-name,
|
|
32
|
+
.clay-tool-evidence-label {
|
|
33
|
+
padding: 8px 14px 0;
|
|
34
|
+
color: var(--text-muted);
|
|
35
|
+
font-size: 12px;
|
|
36
|
+
overflow-wrap: anywhere;
|
|
37
|
+
}
|
|
38
|
+
.clay-tool-technical-name { font-family: "Roboto Mono", monospace; }
|
|
39
|
+
.clay-tool-evidence-label { font-weight: 600; }
|
|
40
|
+
@media (prefers-reduced-motion: reduce) {
|
|
41
|
+
.clay-tool-activity .tool-bullet { animation: none; }
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
@media (max-width: 600px) {
|
|
45
|
+
.clay-tool-activity .tool-name {
|
|
46
|
+
white-space: normal;
|
|
47
|
+
overflow-wrap: anywhere;
|
|
48
|
+
line-height: 1.4;
|
|
49
|
+
}
|
|
50
|
+
.clay-tool-activity .tool-desc { max-width: 35%; }
|
|
51
|
+
}
|
|
@@ -4,6 +4,35 @@
|
|
|
4
4
|
padding: 0;
|
|
5
5
|
cursor: pointer;
|
|
6
6
|
}
|
|
7
|
+
.clay-brand-flip {
|
|
8
|
+
position: relative;
|
|
9
|
+
display: block;
|
|
10
|
+
width: 38px;
|
|
11
|
+
height: 38px;
|
|
12
|
+
transform-style: preserve-3d;
|
|
13
|
+
transition: transform 220ms cubic-bezier(.2,.75,.25,1);
|
|
14
|
+
}
|
|
15
|
+
.clay-brand-face {
|
|
16
|
+
position: absolute;
|
|
17
|
+
inset: 0;
|
|
18
|
+
width: 38px;
|
|
19
|
+
height: 38px;
|
|
20
|
+
object-fit: contain;
|
|
21
|
+
backface-visibility: hidden;
|
|
22
|
+
transition: opacity 120ms ease;
|
|
23
|
+
}
|
|
24
|
+
.clay-brand-avatar { transform: rotateY(180deg); border-radius: 11px; }
|
|
25
|
+
.icon-strip-brand[data-clay-mode="mate"] .clay-brand-flip { transform: rotateY(180deg); }
|
|
26
|
+
.icon-strip-brand:hover .clay-brand-flip,
|
|
27
|
+
.icon-strip-brand:focus-visible .clay-brand-flip,
|
|
28
|
+
.icon-strip-brand.clay-speaking[data-clay-mode="project"] .clay-brand-flip { transform: rotateY(180deg); }
|
|
29
|
+
.icon-strip-brand[data-clay-mode="mate"]:hover .clay-brand-flip,
|
|
30
|
+
.icon-strip-brand[data-clay-mode="mate"]:focus-visible .clay-brand-flip { transform: rotateY(0deg); }
|
|
31
|
+
.icon-strip-brand.clay-speaking[data-clay-mode="mate"] .clay-brand-flip { transform: rotateY(180deg); }
|
|
32
|
+
.icon-strip-brand.clay-speaking .clay-brand-face { transition-duration: 80ms; }
|
|
33
|
+
@media (prefers-reduced-motion: reduce) {
|
|
34
|
+
.clay-brand-flip, .clay-brand-face { transition: none; }
|
|
35
|
+
}
|
|
7
36
|
.icon-strip-brand:hover::before {
|
|
8
37
|
background: var(--bg-alt);
|
|
9
38
|
box-shadow: 0 1px 2px rgba(var(--shadow-rgb), 0.08);
|
|
@@ -87,6 +87,8 @@
|
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
.home-debate-question-text { margin: 0 0 14px; font-size: 15px; }
|
|
90
|
+
.mcp-import-consent .home-debate-question-text,
|
|
91
|
+
.mcp-import-consent .ask-user-question-text { white-space: pre-line; font-size: 13px; line-height: 1.6; }
|
|
90
92
|
.home-debate-question-form { display: grid; gap: 8px; }
|
|
91
93
|
.home-debate-question-option {
|
|
92
94
|
display: grid;
|
|
@@ -32,3 +32,8 @@
|
|
|
32
32
|
.home-mate-proposal-facts dd + dt { margin-top: 7px; }
|
|
33
33
|
.home-mate-proposal-actions button { flex: 1; }
|
|
34
34
|
}
|
|
35
|
+
|
|
36
|
+
.home-mate-proposal-schedule-details { margin-top: 2px; color: var(--text-dimmer); }
|
|
37
|
+
.home-mate-proposal-schedule-details summary { width: fit-content; padding-block: 3px; cursor: pointer; font-weight: 400; }
|
|
38
|
+
.home-mate-proposal-schedule-details summary:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
|
|
39
|
+
.home-mate-proposal-schedule-details[open] > div { padding-top: 3px; color: var(--text-muted); }
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/* Coin-size portraits in an explicit, compact visual catalog. */
|
|
2
|
+
.home-mate-avatar-selection { display: flex; align-items: center; gap: 10px; margin-bottom: 14px; }
|
|
3
|
+
.home-mate-avatar-selection p { color: var(--text-secondary); font-size: 12px; }
|
|
4
|
+
.home-mate-avatar-editor h4 { margin: 16px 0 8px; font-size: 13px; color: var(--text); }
|
|
5
|
+
.home-mate-avatar-choices { grid-template-columns: repeat(auto-fill, minmax(54px, 1fr)); gap: 5px; }
|
|
6
|
+
.home-mate-avatar-choice img { width: 42px; height: 42px; }
|
|
7
|
+
.home-mate-avatar-choice[aria-pressed="true"] { border: 2px solid var(--brand-indigo); padding: 4px 2px 5px; }
|
|
8
|
+
.home-mate-avatar-choice:disabled { cursor: default; opacity: .65; }
|
|
9
|
+
.home-mate-avatar-actions { position: sticky; bottom: 0; padding: 10px 0; background: var(--bg); z-index: 1; }
|
|
10
|
+
.home-mate-avatar-actions button.primary { background: var(--brand-indigo); color: white; border-color: var(--brand-indigo); }
|
|
11
|
+
@media (pointer: coarse) { .home-mate-avatar-choice { min-height: 62px; } }
|
|
12
|
+
.home-mate-avatar-actions .home-mate-avatar-status { flex: 0 0 100%; margin: 0; padding-top: 0; }
|
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
/* Restore the Home conversation's reading measure inside Mate projects.
|
|
2
2
|
The existing project renderer, queue and composer still own behavior. */
|
|
3
|
-
body.mate-workspace-active {
|
|
4
|
-
|
|
3
|
+
body.mate-workspace-active {
|
|
4
|
+
--mate-content-width: 860px;
|
|
5
|
+
--content-width: var(--mate-content-width);
|
|
6
|
+
}
|
|
7
|
+
body.mate-workspace-active #messages {
|
|
8
|
+
padding-inline: max(12px, calc((100% - var(--mate-content-width)) / 2));
|
|
9
|
+
}
|
|
5
10
|
body.mate-workspace-active #messages > .msg-assistant,
|
|
6
11
|
body.mate-workspace-active #messages > .msg-user {
|
|
7
12
|
width: 100%;
|
|
8
|
-
max-width:
|
|
13
|
+
max-width: var(--mate-content-width);
|
|
9
14
|
box-sizing: border-box;
|
|
10
15
|
margin: 0 auto 12px;
|
|
11
16
|
padding: 4px 20px;
|
|
@@ -66,7 +71,7 @@ body.mate-workspace-active .msg-user:not(.msg-user-other):not(.msg-user-delegate
|
|
|
66
71
|
|
|
67
72
|
/* One writing row, with secondary tools and model selection underneath.
|
|
68
73
|
Display contents preserves the live controls and their event handlers. */
|
|
69
|
-
body.mate-workspace-active #input-wrapper { max-width:
|
|
74
|
+
body.mate-workspace-active #input-wrapper { max-width: var(--mate-content-width); }
|
|
70
75
|
body.mate-workspace-active #input-row,
|
|
71
76
|
body.mate-workspace-active #input-row:focus-within {
|
|
72
77
|
display: grid;
|
|
@@ -144,7 +149,7 @@ body.mate-workspace-active #messages > .mate-thinking,
|
|
|
144
149
|
body.mate-workspace-active #messages > .mate-permission,
|
|
145
150
|
body.mate-workspace-active #messages > .mate-ask-user {
|
|
146
151
|
box-sizing: border-box;
|
|
147
|
-
max-width:
|
|
152
|
+
max-width: var(--mate-content-width);
|
|
148
153
|
margin: 0 auto 12px;
|
|
149
154
|
padding: 4px 20px;
|
|
150
155
|
gap: 9px;
|
|
@@ -1360,8 +1360,10 @@ button.top-bar-pill.pill-accent:hover { background: color-mix(in srgb, var(--acc
|
|
|
1360
1360
|
.connect-wordmark {
|
|
1361
1361
|
display: block;
|
|
1362
1362
|
width: clamp(142px, 15vw, 184px);
|
|
1363
|
-
|
|
1364
|
-
|
|
1363
|
+
aspect-ratio: 4742 / 1156;
|
|
1364
|
+
background: var(--text-muted);
|
|
1365
|
+
-webkit-mask: url("../clay-studio-wordmark-bold.svg") center / contain no-repeat;
|
|
1366
|
+
mask: url("../clay-studio-wordmark-bold.svg") center / contain no-repeat;
|
|
1365
1367
|
}
|
|
1366
1368
|
|
|
1367
1369
|
#connect-overlay-msg {
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
.project-admin-overview { overflow: auto; padding: 8px; }
|
|
2
|
+
.project-admin-canvas { width: 100%; min-height: 100%; padding: 24px; border: 1px solid var(--border); border-radius: 8px; background: var(--bg); }
|
|
3
|
+
.project-admin-canvas h1 { font-size: 20px; margin: 0 0 16px; }
|
|
4
|
+
.project-admin-canvas h2 { font-size: 16px; }
|
|
5
|
+
.project-admin-canvas [role="tablist"] { display: flex; gap: 4px; border-bottom: 1px solid var(--border); padding-bottom: 8px; }
|
|
6
|
+
.project-admin-canvas [role="tab"] { height: 32px; padding: 0 12px; border: 1px solid var(--border); border-radius: 8px; color: inherit; background: transparent; cursor: pointer; }
|
|
7
|
+
.project-admin-canvas [aria-selected="true"] { background: #5857fc; color: white; }
|
|
8
|
+
.project-admin-canvas :focus-visible { outline: 2px solid #5857fc; outline-offset: 2px; }
|
|
9
|
+
.project-admin-canvas dl { display: grid; grid-template-columns: 110px 1fr; gap: 12px; margin: 24px 0; font-size: 13px; }
|
|
10
|
+
.project-admin-canvas dd { margin: 0; }
|
|
11
|
+
.project-admin-canvas p { max-width: 640px; line-height: 1.6; font-size: 14px; }
|
|
12
|
+
.project-admin-secondary { opacity: .65; }
|
|
13
|
+
@media (max-width: 600px) { .project-admin-canvas { padding: 16px; } }
|