clay-server 5.2.0-beta.1 → 5.2.0-beta.11
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/README.md +0 -4
- 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 +1 -239
- package/lib/claude-jsonl-watcher.js +1 -204
- package/lib/clay-control-presentation-binding.js +96 -0
- package/lib/clay-control-presentation.js +128 -0
- package/lib/clay-control-target-projection.js +26 -0
- package/lib/clay-mate-chat-receipts.js +26 -0
- package/lib/clay-mate-chat.js +88 -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 +52 -0
- package/lib/clay-product-control.js +250 -0
- package/lib/clay-project-lifecycle.js +154 -0
- package/lib/clay-project-record-input.js +44 -0
- package/lib/clay-project-records.js +84 -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 +104 -0
- package/lib/clay-skill-install.js +1 -33
- package/lib/clay-vendor-usage.js +44 -0
- package/lib/clay-workspace-controls.js +84 -0
- package/lib/clay-workspace-input.js +17 -0
- package/lib/clay-workspace-receipts.js +26 -0
- package/lib/cli-sessions.js +1 -300
- package/lib/codex-defaults.js +1 -28
- package/lib/context-usage.js +3 -2
- package/lib/contextual-screen-snapshot.js +38 -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 +78 -276
- package/lib/default-ai-runtime.js +4 -8
- package/lib/dm-digest-cursor.js +120 -0
- package/lib/email-mcp-server.js +1 -1
- package/lib/github-star-count.js +147 -0
- package/lib/issues-service.js +29 -15
- package/lib/kiro-defaults.js +1 -22
- package/lib/knowledge-db-import-validation.js +46 -0
- package/lib/knowledge-db-import.js +99 -0
- package/lib/knowledge-db-service.js +24 -33
- package/lib/knowledge-db-storage-nedb-maintenance.js +99 -0
- package/lib/knowledge-db-storage-nedb.js +66 -0
- package/lib/knowledge-db-storage.js +72 -0
- package/lib/knowledge-db-validation.js +0 -0
- 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-context-service.js +138 -0
- package/lib/mate-context-tools.js +21 -0
- package/lib/mate-creation-mcp-server.js +2 -0
- package/lib/mate-knowledge-canonical-access.js +10 -0
- package/lib/mate-knowledge-mate-bound.js +53 -0
- package/lib/mate-knowledge-mcp-server.js +55 -8
- package/lib/mate-knowledge-service.js +16 -34
- package/lib/mate-knowledge-text-tools.js +106 -0
- 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-proxy.js +2 -32
- package/lib/mcp-query-bridge.js +30 -0
- package/lib/mcp-remote-connections.js +74 -20
- package/lib/mcp-source-adapters.js +1 -0
- package/lib/mcp-source-context.js +1 -0
- package/lib/mcp-source-discovery.js +1 -0
- package/lib/mcp-source-plugins.js +1 -0
- package/lib/mcp-source-restrictions.js +1 -0
- package/lib/mcp-tool-policy.js +9 -0
- package/lib/notes-checklist.js +92 -0
- package/lib/notes.js +51 -4
- package/lib/os-user-diagnostics.js +2 -4
- package/lib/os-users.js +24 -70
- package/lib/pane-pending-interactions.js +20 -0
- package/lib/pane-session-activation.js +114 -0
- package/lib/pane-session-transport.js +26 -0
- package/lib/project-admin-overview.js +51 -0
- package/lib/project-ask-user.js +8 -4
- package/lib/project-connection.js +14 -10
- package/lib/project-control-git-view.js +12 -0
- 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 +15 -85
- package/lib/project-full-access.js +23 -2
- package/lib/project-http.js +7 -4
- 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 +40 -62
- package/lib/project-mcp.js +54 -16
- package/lib/project-models.js +14 -31
- package/lib/project-notifications.js +76 -17
- package/lib/project-ownership.js +77 -0
- package/lib/project-pair-result-delivery.js +14 -3
- package/lib/project-pair-usage.js +12 -13
- package/lib/project-pending-message-queue.js +4 -1
- package/lib/project-product-control.js +89 -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 +67 -68
- 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 +27 -7
- package/lib/project-session-github.js +63 -19
- package/lib/project-session-history-actions.js +167 -0
- package/lib/project-session-linear.js +14 -6
- package/lib/project-session-notes.js +40 -11
- package/lib/project-session-pair.js +1 -1
- package/lib/project-session-runtime-actions.js +64 -0
- package/lib/project-session-spawn.js +2 -3
- package/lib/project-session-vendor.js +55 -0
- package/lib/project-sessions.js +160 -290
- package/lib/project-shared-browser.js +78 -17
- package/lib/project-start-protocol.js +29 -0
- package/lib/project-studio-presentation.js +58 -0
- package/lib/project-user-message.js +67 -1
- package/lib/project-vendor-login.js +8 -36
- package/lib/project-workspace-operations.js +126 -0
- package/lib/project-workspace-query.js +19 -2
- package/lib/project.js +181 -45
- package/lib/public/app.js +71 -17
- package/lib/public/appearance-bootstrap.js +16 -0
- package/lib/public/css/clay-tool-activity.css +51 -0
- package/lib/public/css/clay-workspace.css +29 -0
- package/lib/public/css/command-palette.css +12 -33
- package/lib/public/css/contextual-clay.css +240 -0
- package/lib/public/css/filebrowser.css +1 -1
- package/lib/public/css/home-debate-planning.css +2 -0
- package/lib/public/css/home-mate-creation.css +5 -0
- package/lib/public/css/input.css +6 -0
- package/lib/public/css/mate-avatar-gallery.css +12 -0
- package/lib/public/css/mate-conversation.css +10 -5
- package/lib/public/css/mate-loading-scene.css +21 -0
- package/lib/public/css/messages.css +6 -2
- package/lib/public/css/overlays.css +68 -258
- package/lib/public/css/project-admin-overview.css +13 -0
- package/lib/public/css/project-mate-creation.css +5 -6
- package/lib/public/css/project-start.css +108 -0
- package/lib/public/css/projects-hub.css +53 -14
- package/lib/public/css/session-folders.css +11 -0
- package/lib/public/css/session-github.css +46 -1
- package/lib/public/css/settings-shell.css +103 -0
- package/lib/public/css/shared-browser.css +35 -1
- package/lib/public/css/sidebar.css +7 -0
- package/lib/public/css/sticky-notes.css +87 -1
- package/lib/public/css/title-bar.css +79 -0
- package/lib/public/index.html +61 -68
- 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-invitations.js +2 -2
- package/lib/public/modules/admin-settings-projects.js +8 -4
- package/lib/public/modules/admin-settings-ui.js +20 -4
- package/lib/public/modules/admin-settings-users.js +4 -4
- package/lib/public/modules/app-connection.js +11 -1
- package/lib/public/modules/app-favicon.js +18 -9
- package/lib/public/modules/app-header.js +7 -4
- package/lib/public/modules/app-home-hub.js +2 -1
- package/lib/public/modules/app-loop-ui.js +2 -0
- package/lib/public/modules/app-message-router.js +22 -1
- package/lib/public/modules/app-messages.js +125 -19
- package/lib/public/modules/app-misc.js +3 -1
- package/lib/public/modules/app-notifications.js +11 -5
- package/lib/public/modules/app-panels.js +61 -123
- package/lib/public/modules/app-projects.js +14 -407
- package/lib/public/modules/app-rate-limit.js +19 -28
- package/lib/public/modules/app-rendering.js +4 -3
- package/lib/public/modules/avatar.js +15 -41
- package/lib/public/modules/chat-render-runtime.js +20 -0
- package/lib/public/modules/clay-browser-links.js +47 -0
- package/lib/public/modules/clay-control-activity.js +214 -0
- package/lib/public/modules/clay-control-copy.js +36 -0
- package/lib/public/modules/clay-control-detail-targets.js +44 -0
- package/lib/public/modules/clay-control-object-targets.js +52 -0
- package/lib/public/modules/clay-control-target-visibility.js +12 -0
- package/lib/public/modules/clay-control-targets.js +44 -0
- package/lib/public/modules/clay-log-links.js +23 -0
- package/lib/public/modules/clay-navigation-render.js +52 -0
- package/lib/public/modules/clay-owner-navigation.js +33 -0
- package/lib/public/modules/clay-session-links.js +31 -0
- package/lib/public/modules/clay-studio-bridge.js +20 -0
- package/lib/public/modules/clay-studio-document.js +67 -0
- package/lib/public/modules/clay-studio-render.js +146 -0
- package/lib/public/modules/clay-tool-activity.js +140 -0
- package/lib/public/modules/clay-tool-presentation.js +343 -0
- package/lib/public/modules/command-palette.js +162 -40
- package/lib/public/modules/contextual-ask-session.js +26 -0
- package/lib/public/modules/contextual-clay-geometry.js +155 -0
- package/lib/public/modules/contextual-clay-session.js +130 -0
- package/lib/public/modules/contextual-clay-workspace.js +169 -0
- package/lib/public/modules/contextual-clay.js +252 -0
- package/lib/public/modules/contextual-composer.js +91 -0
- package/lib/public/modules/contextual-mate-context.js +117 -0
- package/lib/public/modules/contextual-mate-hint.js +40 -0
- package/lib/public/modules/contextual-mate-identity.js +23 -0
- package/lib/public/modules/contextual-mate-sessions.js +134 -0
- package/lib/public/modules/contextual-search.js +137 -0
- package/lib/public/modules/contextual-session-citations.js +58 -0
- package/lib/public/modules/debate.js +1 -0
- package/lib/public/modules/default-ai.js +11 -3
- package/lib/public/modules/elicitation-form.js +5 -0
- package/lib/public/modules/filebrowser.js +20 -1
- package/lib/public/modules/generation-stop.js +8 -5
- package/lib/public/modules/git-panel.js +3 -1
- package/lib/public/modules/github-star.js +66 -0
- package/lib/public/modules/history-replay-batch.js +13 -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/icon-strip-tooltip.js +2 -1
- package/lib/public/modules/input.js +88 -10
- package/lib/public/modules/issues-render.js +3 -2
- package/lib/public/modules/knowledge-db-workbench.js +4 -4
- package/lib/public/modules/markdown.js +6 -34
- package/lib/public/modules/mate-avatar-catalog.js +97 -0
- package/lib/public/modules/mate-knowledge-workbench.js +1 -1
- package/lib/public/modules/mate-loading-scene.js +17 -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/message-delivery.js +20 -2
- package/lib/public/modules/model-picker.js +2 -0
- package/lib/public/modules/pane-activation.js +214 -0
- package/lib/public/modules/pane-binding.js +82 -0
- package/lib/public/modules/pane-bridge.js +7 -4
- package/lib/public/modules/pane-browser-bridge.js +22 -0
- package/lib/public/modules/pane-file-bridge.js +4 -0
- package/lib/public/modules/pane-issue-bridge.js +4 -1
- package/lib/public/modules/pending-message-queue.js +1 -0
- package/lib/public/modules/permission-control.js +5 -4
- package/lib/public/modules/personal-settings-dialog.js +7 -1
- package/lib/public/modules/product-review.js +26 -0
- package/lib/public/modules/profile.js +12 -241
- 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-chat-identity.js +13 -4
- package/lib/public/modules/project-logs-render.js +3 -0
- package/lib/public/modules/project-mate-creation-workspace.js +13 -4
- package/lib/public/modules/project-mate-navigation.js +144 -22
- package/lib/public/modules/project-session-visibility-settings.js +19 -16
- package/lib/public/modules/project-settings.js +119 -129
- package/lib/public/modules/project-start-dialog.js +130 -0
- package/lib/public/modules/project-start-folder-state.js +78 -0
- package/lib/public/modules/project-start-folder-view.js +190 -0
- package/lib/public/modules/project-start-forms.js +66 -0
- package/lib/public/modules/project-start-path.js +60 -0
- package/lib/public/modules/project-start-state.js +54 -0
- package/lib/public/modules/project-start-submit.js +67 -0
- package/lib/public/modules/projects-hub-view.js +33 -14
- package/lib/public/modules/projects-hub.js +10 -6
- package/lib/public/modules/rewind.js +5 -0
- package/lib/public/modules/scheduled-tasks.js +2 -0
- package/lib/public/modules/scheduler.js +2 -0
- package/lib/public/modules/search-clay-chat.js +5 -440
- package/lib/public/modules/server-settings.js +36 -91
- package/lib/public/modules/session-actions.js +5 -2
- package/lib/public/modules/session-context-menu.js +5 -0
- package/lib/public/modules/session-create-form.js +10 -10
- 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-rich-drafts.js +21 -0
- package/lib/public/modules/session-switch-defer.js +67 -0
- package/lib/public/modules/session-work-primary.js +51 -0
- package/lib/public/modules/settings-defaults.js +27 -28
- package/lib/public/modules/settings-project-target.js +56 -0
- package/lib/public/modules/settings-select.js +1 -1
- package/lib/public/modules/settings-shell-registry.js +88 -0
- package/lib/public/modules/settings-shell-view.js +104 -0
- package/lib/public/modules/settings-shell.js +342 -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 +29 -6
- package/lib/public/modules/sidebar-mobile.js +12 -33
- package/lib/public/modules/sidebar-projects.js +3 -1
- package/lib/public/modules/sidebar-session-folders-ui.js +1 -1
- package/lib/public/modules/sidebar-sessions.js +1 -0
- package/lib/public/modules/split-group-restore.js +68 -0
- package/lib/public/modules/split-pair-ui.js +1 -0
- package/lib/public/modules/split-pane-reconciler.js +15 -0
- package/lib/public/modules/split-pane-renderer.js +87 -6
- package/lib/public/modules/split-session-boundary.js +1 -1
- package/lib/public/modules/split-view.js +60 -68
- 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 +116 -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/stt-controller.js +4 -1
- package/lib/public/modules/stt-recording.js +1 -1
- package/lib/public/modules/stt.js +7 -2
- package/lib/public/modules/terminal.js +9 -0
- package/lib/public/modules/theme.js +18 -3
- package/lib/public/modules/thinking-lifecycle.js +33 -3
- package/lib/public/modules/thinking-view.js +23 -1
- package/lib/public/modules/tools.js +60 -11
- package/lib/public/modules/tui-grab.js +1 -2
- 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 +14 -30
- package/lib/public/modules/user-settings-preferences.js +6 -2
- package/lib/public/modules/user-settings-profile.js +13 -3
- package/lib/public/modules/user-settings.js +18 -84
- package/lib/public/modules/vendor-login-browser.js +5 -3
- package/lib/public/modules/vendor-login.js +2 -2
- package/lib/public/modules/vendor-priority.js +15 -1
- package/lib/public/modules/vendor-usage-format.js +93 -0
- package/lib/public/modules/vendor-usage-list.js +45 -0
- package/lib/public/modules/vendor-usage-model.js +215 -0
- package/lib/public/modules/vendor-usage-overview.js +312 -0
- package/lib/public/modules/wireframe-workbench.js +5 -2
- package/lib/public/muse-avatar.svg +4 -0
- package/lib/public/style.css +14 -6
- package/lib/public/sw.js +3 -1
- package/lib/public/welcome-art/conversation-desk.png +0 -0
- package/lib/public/welcome-art/mate-clay.png +0 -0
- package/lib/public/welcome-art/project-clay.png +0 -0
- package/lib/safe-bash-commands.js +3 -45
- package/lib/scheduled-task-records.js +3 -1
- package/lib/scheduler.js +2 -0
- package/lib/sdk-bridge.js +348 -402
- package/lib/sdk-foreground-admission.js +16 -0
- package/lib/sdk-mcp-descriptors.js +2 -37
- package/lib/sdk-message-processor.js +61 -18
- package/lib/sdk-quota-snapshot.js +21 -3
- package/lib/sdk-response-recovery.js +1 -0
- package/lib/sdk-worker.js +2 -677
- package/lib/server-admin.js +63 -16
- package/lib/server-appearance-settings.js +13 -1
- package/lib/server-contextual-clay-settings.js +40 -0
- package/lib/server-contextual-mate-sessions.js +70 -0
- package/lib/server-dm.js +2 -1
- package/lib/server-github-stars.js +39 -0
- package/lib/server-global-ws.js +26 -32
- package/lib/server-home-chat-events.js +18 -4
- package/lib/server-home-chat.js +22 -20
- package/lib/server-home-clay-entry.js +23 -4
- package/lib/server-home-clay-session-links.js +29 -9
- 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 +118 -0
- package/lib/server-path-access.js +38 -0
- package/lib/server-project-removal.js +22 -0
- package/lib/server-settings.js +6 -1
- package/lib/server.js +167 -43
- package/lib/session-config-transition.js +45 -0
- package/lib/session-folders.js +7 -2
- package/lib/session-fork-history.js +21 -0
- package/lib/session-github.js +9 -2
- package/lib/session-hygiene.js +3 -35
- package/lib/session-notes-mcp-server.js +26 -4
- package/lib/session-notes-writes.js +88 -0
- package/lib/session-permission-mode.js +4 -3
- package/lib/session-skill-scope.js +11 -0
- package/lib/session-visibility.js +25 -10
- package/lib/session-work-primary.js +50 -0
- package/lib/sessions.js +66 -99
- 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 +65 -6
- package/lib/tool-llm.js +1 -1
- package/lib/tui-transcript-index.js +1 -132
- package/lib/users-contextual-clay-preferences.js +31 -0
- package/lib/users-permissions.js +2 -8
- package/lib/users.js +7 -0
- package/lib/vendor-login-browser.js +1 -11
- package/lib/vendor-usage-acp-readers.js +97 -0
- package/lib/vendor-usage-capabilities.js +88 -0
- package/lib/vendor-usage-http-readers.js +214 -0
- package/lib/vendor-usage-metrics.js +47 -0
- package/lib/vendor-usage-native-readers.js +106 -0
- package/lib/vendor-usage-overview.js +406 -0
- package/lib/vendor-usage-service.js +281 -0
- package/lib/workspace-assignment-service.js +25 -0
- package/lib/workspace-query-access.js +4 -1
- package/lib/workspace-query-mcp-server.js +1 -1
- package/lib/workspace-query-service.js +13 -2
- package/lib/ws-request.js +1 -0
- package/lib/ws-schema.js +22 -4
- package/lib/yoke/acp-agent-profiles.js +7 -5
- package/lib/yoke/adapters/antigravity.js +3 -14
- package/lib/yoke/adapters/claude-query-contract.js +9 -0
- package/lib/yoke/adapters/claude.js +66 -50
- package/lib/yoke/adapters/codex-query-contract.js +25 -0
- package/lib/yoke/adapters/codex.js +98 -123
- package/lib/yoke/adapters/kiro.js +3 -1
- package/lib/yoke/adapters/muse-query-contract.js +7 -0
- package/lib/yoke/adapters/muse.js +122 -0
- package/lib/yoke/auth-events.js +17 -0
- package/lib/yoke/claude-hook-installer.js +272 -0
- package/lib/yoke/claude-jsonl-watcher.js +204 -0
- package/lib/yoke/claude-maintenance.js +55 -0
- package/lib/yoke/claude-permission-patterns.js +53 -0
- package/lib/yoke/claude-response-recovery.js +155 -0
- package/lib/yoke/claude-transcript-hygiene.js +34 -0
- package/lib/yoke/claude-worker-startup.js +28 -0
- package/lib/yoke/clay-skill-install.js +33 -0
- package/lib/yoke/cli-sessions.js +300 -0
- package/lib/yoke/codex-app-server.js +7 -12
- package/lib/yoke/codex-dynamic-tool-names.js +80 -0
- package/lib/yoke/codex-idle-recovery.js +81 -1
- package/lib/yoke/codex-model-catalog.js +37 -3
- package/lib/yoke/codex-recovery-admission.js +164 -0
- package/lib/yoke/configuration.js +13 -0
- package/lib/yoke/discovery.js +70 -0
- package/lib/yoke/errors.js +8 -0
- package/lib/yoke/host-environment.js +7 -0
- package/lib/yoke/index.js +9 -51
- package/lib/yoke/interface.js +116 -0
- package/lib/yoke/kiro-acp-server.js +5 -5
- package/lib/yoke/legacy-sessions.js +89 -0
- package/lib/yoke/login-protocol.js +25 -0
- package/lib/yoke/maintenance.js +12 -0
- package/lib/yoke/mcp-proxy.js +32 -0
- package/lib/yoke/mcp-source-adapters.js +91 -0
- package/lib/yoke/mcp-source-context.js +42 -0
- package/lib/yoke/mcp-source-discovery.js +169 -0
- package/lib/yoke/mcp-source-plugins.js +68 -0
- package/lib/yoke/mcp-source-restrictions.js +47 -0
- package/lib/yoke/mcp-tool-policy-normalize.js +28 -0
- package/lib/yoke/model-preferences.js +6 -0
- package/lib/yoke/muse-artifacts.js +36 -0
- package/lib/yoke/muse-controls.js +50 -0
- package/lib/yoke/muse-input.js +64 -0
- package/lib/yoke/muse-items.js +157 -0
- package/lib/yoke/muse-policy.js +52 -0
- package/lib/yoke/muse-query.js +428 -0
- package/lib/yoke/muse-runtime.js +211 -0
- package/lib/yoke/muse-services.js +92 -0
- package/lib/yoke/muse-skills.js +79 -0
- package/lib/yoke/muse-turns.js +71 -0
- package/lib/yoke/options/acp.js +2 -0
- package/lib/yoke/options/antigravity.js +2 -0
- package/lib/yoke/options/claude.js +21 -0
- package/lib/yoke/options/codex-defaults.js +29 -0
- package/lib/yoke/options/codex-settings.js +21 -0
- package/lib/yoke/options/codex.js +6 -0
- package/lib/yoke/options/kiro-defaults.js +22 -0
- package/lib/yoke/options/kiro.js +5 -0
- package/lib/yoke/options/muse.js +5 -0
- package/lib/yoke/provider-contract.js +5 -0
- package/lib/yoke/providers/antigravity-executable.js +8 -0
- package/lib/yoke/providers/claude-executable.js +40 -0
- package/lib/yoke/providers/claude-model-descriptions.js +34 -0
- package/lib/yoke/providers/claude-process.js +97 -0
- package/lib/yoke/providers/claude-provision.js +75 -0
- package/lib/yoke/providers/codex-errors.js +8 -0
- package/lib/yoke/providers/muse-executable.js +17 -0
- package/lib/yoke/provisioning.js +6 -0
- package/lib/yoke/query-options.js +10 -0
- package/lib/yoke/response-recovery.js +41 -0
- package/lib/yoke/sdk-mcp-descriptors.js +37 -0
- package/lib/yoke/sdk-server-factory.js +7 -0
- package/lib/yoke/session-history.js +8 -0
- package/lib/yoke/session-tool-transport.js +34 -13
- package/lib/yoke/settings.js +23 -0
- package/lib/yoke/source-locations.js +4 -0
- package/lib/yoke/title-query.js +18 -7
- package/lib/yoke/tui-transcript-index.js +132 -0
- package/lib/yoke/usage.js +48 -0
- package/lib/yoke/user-input.js +13 -0
- package/lib/yoke/vendor-registry.js +87 -3
- package/package.json +11 -4
- package/lib/public/modules/server-settings-navigation.js +0 -39
|
@@ -4,6 +4,9 @@ import { store } from './store.js';
|
|
|
4
4
|
import { mateAvatarUrl } from './avatar.js';
|
|
5
5
|
import { VENDOR_AVATARS, VENDOR_NAMES } from './chat-render-runtime.js';
|
|
6
6
|
|
|
7
|
+
// A missing or failed profile image must never borrow another speaker's identity.
|
|
8
|
+
var NEUTRAL_AVATAR = 'data:image/svg+xml,' + encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><rect width="32" height="32" rx="8" fill="#888" fill-opacity=".14"/><circle cx="16" cy="12" r="5" fill="#888"/><path d="M6 29a10 10 0 0 1 20 0" fill="#888"/></svg>');
|
|
9
|
+
|
|
7
10
|
function mateById(state, mateId) {
|
|
8
11
|
var mates = state.cachedMatesList || [];
|
|
9
12
|
for (var i = 0; i < mates.length; i++) {
|
|
@@ -24,12 +27,11 @@ export function resolveProjectAssistantIdentity(state, vendor) {
|
|
|
24
27
|
if (mateId) {
|
|
25
28
|
var mate = mateById(state, mateId) || dmTarget;
|
|
26
29
|
var fallbackName = dmTarget && dmTarget.displayName || state.activeSessionMateName || 'Mate';
|
|
27
|
-
var avatarMate = mate || { id: mateId, name: fallbackName, profile: { displayName: fallbackName } };
|
|
28
30
|
return {
|
|
29
31
|
kind: 'mate',
|
|
30
32
|
mateId: mateId,
|
|
31
33
|
name: mateName(mate, fallbackName),
|
|
32
|
-
avatarUrl: mateAvatarUrl(
|
|
34
|
+
avatarUrl: mate ? mateAvatarUrl(mate, 34) : NEUTRAL_AVATAR,
|
|
33
35
|
};
|
|
34
36
|
}
|
|
35
37
|
var vendorId = vendor || state.currentVendor || 'claude';
|
|
@@ -47,9 +49,16 @@ export function getProjectAssistantPlaceholder(state, vendor) {
|
|
|
47
49
|
|
|
48
50
|
export function applyProjectAssistantIdentity(element, identity) {
|
|
49
51
|
if (!element || !identity) return element;
|
|
50
|
-
var avatar = element.querySelector('.dm-bubble-avatar');
|
|
52
|
+
var avatar = element.querySelector('.dm-bubble-avatar') || element.querySelector('.activity-inline-avatar');
|
|
51
53
|
var name = element.querySelector('.dm-bubble-name');
|
|
52
|
-
if (avatar)
|
|
54
|
+
if (avatar) {
|
|
55
|
+
avatar.onerror = identity.kind === 'mate' ? function () { avatar.onerror = null; avatar.src = NEUTRAL_AVATAR; } : null;
|
|
56
|
+
avatar.src = identity.avatarUrl;
|
|
57
|
+
}
|
|
58
|
+
if (element.className.indexOf('activity-inline') >= 0) {
|
|
59
|
+
var activityLabel = element.querySelector('.activity-state-label');
|
|
60
|
+
element.setAttribute('aria-label', identity.name + ' · ' + (activityLabel ? activityLabel.textContent : 'Responding'));
|
|
61
|
+
}
|
|
53
62
|
if (name) name.textContent = identity.name;
|
|
54
63
|
if (identity.kind === 'mate') {
|
|
55
64
|
element.dataset.sessionMateId = identity.mateId;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { store } from './store.js';
|
|
1
2
|
// Project Logs rendering — ledger rows, entry detail, and discussion.
|
|
2
3
|
//
|
|
3
4
|
// Split from project-logs.js so both stay well inside the module size limit.
|
|
@@ -142,6 +143,8 @@ function renderRow(entry, onOpen) {
|
|
|
142
143
|
row.type = "button";
|
|
143
144
|
row.className = "project-log-row";
|
|
144
145
|
row.dataset.ref = entry.ref;
|
|
146
|
+
row.dataset.controlRuntime = store.get("controlRuntimeId") || "";
|
|
147
|
+
row.dataset.controlRevision = String(entry.revisions);
|
|
145
148
|
row.setAttribute("role", "listitem");
|
|
146
149
|
|
|
147
150
|
var head = document.createElement("div");
|
|
@@ -81,6 +81,9 @@ function startMateCreation() {
|
|
|
81
81
|
maybeStartPendingCreation();
|
|
82
82
|
}
|
|
83
83
|
|
|
84
|
+
// Entry for the zero-project welcome: the same Clay-guided flow the add button's Mate choice runs.
|
|
85
|
+
export function startClayMateCreation() { startMateCreation(); }
|
|
86
|
+
|
|
84
87
|
function maybeStartPendingCreation() {
|
|
85
88
|
var state = store.snap();
|
|
86
89
|
if (!state.projectMateCreationPendingStart || !state.connected || state.activeProjectSlug !== 'mate-' + state.projectMateCreationMateId) return;
|
|
@@ -89,11 +92,17 @@ function maybeStartPendingCreation() {
|
|
|
89
92
|
store.set({ projectMateCreationPendingStart: false, projectMateCreationAwaitingHistory: true, projectMateCreationRequestId: requestId });
|
|
90
93
|
}
|
|
91
94
|
|
|
92
|
-
function choiceButton(
|
|
95
|
+
function choiceButton(artwork, title, description) {
|
|
93
96
|
var button = document.createElement('button');
|
|
94
97
|
button.type = 'button';
|
|
95
98
|
button.className = 'project-create-choice-option';
|
|
96
|
-
|
|
99
|
+
var image = document.createElement('img');
|
|
100
|
+
image.src = '/welcome-art/' + artwork + '.png';
|
|
101
|
+
image.alt = '';
|
|
102
|
+
image.width = 1536;
|
|
103
|
+
image.height = 1024;
|
|
104
|
+
image.decoding = 'async';
|
|
105
|
+
button.appendChild(image);
|
|
97
106
|
var copy = document.createElement('span');
|
|
98
107
|
var heading = document.createElement('strong');
|
|
99
108
|
heading.textContent = title;
|
|
@@ -121,9 +130,9 @@ export function openProjectCreateChoice(opener, openProject) {
|
|
|
121
130
|
var title = document.createElement('h2');
|
|
122
131
|
title.id = 'project-create-choice-title';
|
|
123
132
|
title.textContent = 'What would you like to add?';
|
|
124
|
-
var mate = choiceButton('
|
|
133
|
+
var mate = choiceButton('mate-clay', 'Create a Mate', 'A specialist to work alongside you.');
|
|
125
134
|
mate.addEventListener('click', startMateCreation);
|
|
126
|
-
var project = choiceButton('
|
|
135
|
+
var project = choiceButton('project-clay', 'Start a project', 'Work on code or files together.');
|
|
127
136
|
project.addEventListener('click', function () {
|
|
128
137
|
closeChoice(false);
|
|
129
138
|
openProject();
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { contextualMateStamp, contextualMate } from './contextual-mate-identity.js';
|
|
2
|
+
import { finishContextualWorkspace } from './contextual-clay-workspace.js';
|
|
3
|
+
import { initContextualClay, cycleContextualClay, contextualClayMode } from './contextual-clay.js';
|
|
1
4
|
// Existing Mates share the project rail while retaining their conversations.
|
|
2
5
|
import { store } from './store.js';
|
|
3
6
|
import { applyWorkspaceColor } from './mate-workspace-color.js';
|
|
@@ -8,6 +11,9 @@ import { switchProject } from './app-projects.js';
|
|
|
8
11
|
import { closeTerminal } from './terminal.js';
|
|
9
12
|
import { closeFileViewer } from './filebrowser.js';
|
|
10
13
|
import { getActiveMentionMateIds, onMentionActiveChange, bindIconTooltip, hideIconTooltip, showMateCtxMenu } from './sidebar-mates.js';
|
|
14
|
+
import { chooseProjectActivationTarget } from './project-activation.js';
|
|
15
|
+
import { showProjectsHub } from './projects-hub.js';
|
|
16
|
+
import { openProjectSession } from './project-session-navigation.js';
|
|
11
17
|
|
|
12
18
|
var FILTER_MODES = ['all', 'projects', 'mates'];
|
|
13
19
|
var FILTER_LABELS = { all: 'All', projects: 'Projects', mates: 'Mates' };
|
|
@@ -98,14 +104,109 @@ function renderMateHeaderDefault(state) {
|
|
|
98
104
|
renderMateProjectHeader(state, mate);
|
|
99
105
|
}
|
|
100
106
|
|
|
101
|
-
|
|
107
|
+
function ordinaryProjects(state) {
|
|
108
|
+
return (state.projectsHubList || []).filter(function (project) {
|
|
109
|
+
return project && project.slug && project.isMate !== true && project.contentAccess !== false;
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function clayIsActive(state, clay) {
|
|
114
|
+
return !!clay && !state.homeShellVisible && !state.dmMode && state.currentSlug === 'mate-' + clay.id;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export function clayReturnTargetForState(state) {
|
|
118
|
+
var target = state && state.clayReturnTarget;
|
|
119
|
+
var recordedSlug = target && target.projectSlug;
|
|
120
|
+
var candidates = recordedSlug ? [recordedSlug] : [];
|
|
121
|
+
var slug = chooseProjectActivationTarget(ordinaryProjects(state), candidates);
|
|
122
|
+
if (!slug) return null;
|
|
123
|
+
var sameProject = slug === recordedSlug;
|
|
124
|
+
return {
|
|
125
|
+
projectSlug: slug,
|
|
126
|
+
sessionId: sameProject && target && Number.isSafeInteger(Number(target.sessionId)) && Number(target.sessionId) > 0 ? Number(target.sessionId) : null,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export function rememberClayReturnTarget(state) {
|
|
131
|
+
if (!state || state.homeShellVisible || state.dmMode || isMateWorkspace(state) || !state.currentSlug ||
|
|
132
|
+
state.activeProjectSlug !== state.currentSlug || state.sessionActivatedProjectSlug !== state.currentSlug) return;
|
|
133
|
+
var projects = ordinaryProjects(state);
|
|
134
|
+
var found = projects.some(function (project) { return project.slug === state.currentSlug; });
|
|
135
|
+
if (!found) return;
|
|
136
|
+
var target = { projectSlug: state.currentSlug, sessionId: Number.isSafeInteger(Number(state.activeSessionId)) && Number(state.activeSessionId) > 0 ? Number(state.activeSessionId) : null };
|
|
137
|
+
store.set({ clayReturnTarget: target });
|
|
138
|
+
return target;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export function returnFromClay() {
|
|
142
|
+
var handoff = store.get('contextualWorkspace');
|
|
143
|
+
var originalMate = handoff && handoff.returnSlug && handoff.returnSlug.indexOf('mate-') === 0 && contextualMate(handoff.returnSlug.slice(5));
|
|
144
|
+
if (finishContextualWorkspace() === false) return false;
|
|
145
|
+
var state = store.snap();
|
|
146
|
+
var target = originalMate ? { projectSlug: handoff.returnSlug, sessionId: handoff.returnSessionId } : clayReturnTargetForState(state);
|
|
147
|
+
if (!target) {
|
|
148
|
+
store.set({ pendingProjectSessionNavigation: null, clayReturnPendingProjectSlug: null, clayReturnTarget: null });
|
|
149
|
+
showProjectsHub();
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
store.set({ clayReturnTarget: originalMate ? state.clayReturnTarget : null, clayReturnPendingProjectSlug: target.sessionId ? target.projectSlug : null });
|
|
153
|
+
if (target.sessionId) openProjectSession(target.projectSlug, target.sessionId);
|
|
154
|
+
else {
|
|
155
|
+
store.set({ pendingProjectSessionNavigation: null });
|
|
156
|
+
switchProject(target.projectSlug);
|
|
157
|
+
}
|
|
158
|
+
return true;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function updateClayBrand(state) {
|
|
162
|
+
var entry = document.querySelector('.icon-strip-brand');
|
|
163
|
+
if (!entry) return;
|
|
164
|
+
var clay = navigationMates(state.cachedMatesList).find(function (mate) { return mate.builtinKey === 'clay'; });
|
|
165
|
+
var ownPopover = (state.contextualClay || {}).mateId === (clay && clay.id) && contextualClayMode() !== 'closed';
|
|
166
|
+
var active = clayIsActive(state, clay) || ownPopover;
|
|
167
|
+
var speaking = !!(state.youActivity && state.youActivity.active);
|
|
168
|
+
entry.dataset.clayMode = active ? 'mate' : 'project';
|
|
169
|
+
entry.classList.toggle('clay-speaking', speaking);
|
|
170
|
+
var avatar = entry.querySelector('.clay-brand-avatar');
|
|
171
|
+
var logo = entry.querySelector('.clay-brand-logo');
|
|
172
|
+
if (avatar && clay) avatar.src = mateAvatarUrl(clay, 38);
|
|
173
|
+
if (logo) logo.src = 'clay-studio-symbol.png';
|
|
174
|
+
entry.disabled = !clay;
|
|
175
|
+
entry.classList.toggle('active', active);
|
|
176
|
+
entry.setAttribute('aria-label', clay ? (ownPopover && contextualClayMode() === 'popover' ? 'Open Clay workspace' : active ? 'Return to project' : 'Open Clay') : 'Clay is unavailable');
|
|
177
|
+
entry.setAttribute('aria-expanded', String(ownPopover));
|
|
178
|
+
entry.setAttribute('aria-controls', 'contextual-clay');
|
|
179
|
+
if (clayIsActive(state, clay)) entry.setAttribute('aria-current', 'page');
|
|
180
|
+
else entry.removeAttribute('aria-current');
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export function openMateWorkspace(mateId, sessionId) {
|
|
102
184
|
var mate = navigationMates(store.get('cachedMatesList')).find(function (item) { return item.id === mateId; });
|
|
103
|
-
if (!mate) return;
|
|
185
|
+
if (!mate || !contextualMate(mateId)) return;
|
|
186
|
+
if (mate.builtinKey === 'clay' && store.snap) rememberClayReturnTarget(store.snap());
|
|
104
187
|
if (store.get('currentSlug') !== 'mate-' + mateId) {
|
|
105
188
|
closeTerminal();
|
|
106
189
|
closeFileViewer();
|
|
107
190
|
}
|
|
108
|
-
|
|
191
|
+
if (Number.isSafeInteger(sessionId) && sessionId > 0) openProjectSession('mate-' + mateId, sessionId);
|
|
192
|
+
else switchProject('mate-' + mateId);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
export function activateContextualMate(mateId) {
|
|
196
|
+
var mate = contextualMate(mateId);
|
|
197
|
+
if (!mate) return;
|
|
198
|
+
var handoff = store.get('contextualWorkspace');
|
|
199
|
+
if (handoff && handoff.stage !== 'returning') {
|
|
200
|
+
if (handoff.stage !== 'workspace') return;
|
|
201
|
+
var popup = store.get('contextualClay') || {};
|
|
202
|
+
var otherSession = popup.mode === 'popover' && popup.mateId === mateId && popup.sessionId && popup.sessionId !== handoff.sessionId;
|
|
203
|
+
if (handoff.slug === 'mate-' + mateId && !otherSession && !(popup.mode === 'popover' && popup.mateId === mateId)) return returnFromClay();
|
|
204
|
+
cycleContextualClay(mate);
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
if (handoff) { store.set({ contextualMatePending: mateId }); return; }
|
|
208
|
+
rememberClayReturnTarget(store.snap());
|
|
209
|
+
cycleContextualClay(mate);
|
|
109
210
|
}
|
|
110
211
|
|
|
111
212
|
function createMateIcon(mateId) {
|
|
@@ -116,9 +217,10 @@ function createMateIcon(mateId) {
|
|
|
116
217
|
button.innerHTML = '<img class="icon-strip-mate-avatar" alt="" draggable="false"><span class="icon-strip-pill"></span><span class="icon-strip-status"></span><span class="icon-strip-project-badge"></span>';
|
|
117
218
|
button.addEventListener('click', function () {
|
|
118
219
|
hideIconTooltip();
|
|
119
|
-
|
|
220
|
+
activateContextualMate(mateId);
|
|
120
221
|
});
|
|
121
222
|
bindIconTooltip(button, function () {
|
|
223
|
+
if ((store.get('contextualClay') || {}).mode === 'popover' && (store.get('contextualClay') || {}).mateId === mateId) return { text: '' };
|
|
122
224
|
var mate = navigationMates(store.get('cachedMatesList')).find(function (item) { return item.id === mateId; });
|
|
123
225
|
return {
|
|
124
226
|
text: mate ? getHomeMateName(mate) : 'Mate',
|
|
@@ -126,10 +228,14 @@ function createMateIcon(mateId) {
|
|
|
126
228
|
avatarUrl: mate ? mateAvatarUrl(mate, 24) : '',
|
|
127
229
|
};
|
|
128
230
|
});
|
|
129
|
-
|
|
130
|
-
event.preventDefault();
|
|
231
|
+
function openContextMenu(event) {
|
|
232
|
+
event.preventDefault(); event.stopPropagation(); hideIconTooltip();
|
|
131
233
|
var mate = navigationMates(store.get('cachedMatesList')).find(function (item) { return item.id === mateId; });
|
|
132
234
|
if (mate) showMateCtxMenu(button, mate);
|
|
235
|
+
}
|
|
236
|
+
button.addEventListener('contextmenu', openContextMenu);
|
|
237
|
+
button.addEventListener('keydown', function (event) {
|
|
238
|
+
if (event.key === 'ContextMenu' || (event.shiftKey && event.key === 'F10')) openContextMenu(event);
|
|
133
239
|
});
|
|
134
240
|
return button;
|
|
135
241
|
}
|
|
@@ -142,33 +248,30 @@ export function renderProjectMates() {
|
|
|
142
248
|
var clay = navigationMates(state.cachedMatesList).find(function (mate) { return mate.builtinKey === 'clay'; });
|
|
143
249
|
var clayActive = !!clay && !state.homeShellVisible && !state.dmMode && state.currentSlug === 'mate-' + clay.id;
|
|
144
250
|
document.body.classList.toggle('clay-workspace-active', clayActive);
|
|
145
|
-
|
|
146
|
-
if (clayEntry) {
|
|
147
|
-
clayEntry.disabled = !clay;
|
|
148
|
-
clayEntry.classList.toggle('active', clayActive);
|
|
149
|
-
clayEntry.setAttribute('aria-label', clay ? 'Open Clay' : 'Clay is unavailable');
|
|
150
|
-
if (clayActive) clayEntry.setAttribute('aria-current', 'page');
|
|
151
|
-
else clayEntry.removeAttribute('aria-current');
|
|
152
|
-
}
|
|
251
|
+
updateClayBrand(state);
|
|
153
252
|
document.body.classList.toggle('mate-workspace-active', !state.homeShellVisible && isMateWorkspace(state));
|
|
154
253
|
applyWorkspaceColor(mateForWorkspace(state));
|
|
155
254
|
renderMateHeaderDefault(state);
|
|
156
255
|
var mates = navigationMates(state.cachedMatesList).filter(function (mate) {
|
|
157
|
-
return mate.builtinKey !== 'clay';
|
|
256
|
+
return mate.builtinKey !== 'clay' && contextualMate(mate.id);
|
|
158
257
|
});
|
|
159
258
|
var mentionActive = getActiveMentionMateIds();
|
|
160
259
|
var projects = state.projectsHubList || [];
|
|
161
260
|
var unread = state.dmUnread || {};
|
|
162
261
|
var icons = {};
|
|
163
|
-
|
|
262
|
+
document.querySelectorAll('.icon-strip-project-mate[data-mate-id]').forEach(function (button) { icons[button.dataset.mateId] = button; });
|
|
164
263
|
mates.forEach(function (mate) {
|
|
165
264
|
var button = icons[mate.id] || createMateIcon(mate.id);
|
|
166
265
|
delete icons[mate.id];
|
|
266
|
+
button.dataset.controlMateStamp = contextualMateStamp(mate);
|
|
167
267
|
var active = !state.homeShellVisible && !state.dmMode && state.currentSlug === 'mate-' + mate.id;
|
|
168
268
|
var project = projects.find(function (item) { return item.slug === 'mate-' + mate.id; });
|
|
169
269
|
var busy = !!(project && project.isProcessing) || !!mentionActive[mate.id];
|
|
170
270
|
var count = active ? 0 : (unread[mate.id] || 0);
|
|
171
|
-
|
|
271
|
+
var popover = (state.contextualClay || {}).mateId === mate.id && contextualClayMode() === 'popover';
|
|
272
|
+
button.classList.toggle('active', !!active || popover);
|
|
273
|
+
button.setAttribute('aria-expanded', String(popover));
|
|
274
|
+
button.setAttribute('aria-controls', 'contextual-clay');
|
|
172
275
|
button.setAttribute('aria-label', getHomeMateName(mate) + ', Mate' + (busy ? ', working' : '') + (count ? ', ' + count + ' unread' : ''));
|
|
173
276
|
if (active) button.setAttribute('aria-current', 'page');
|
|
174
277
|
else button.removeAttribute('aria-current');
|
|
@@ -186,6 +289,7 @@ export function renderProjectMates() {
|
|
|
186
289
|
Object.keys(icons).forEach(function (id) { icons[id].remove(); });
|
|
187
290
|
var ordered = Array.from(rail.querySelectorAll('[data-mate-id]'));
|
|
188
291
|
mates.forEach(function (mate, index) {
|
|
292
|
+
if (document.querySelector('.contextual-mate-mobile-trigger[data-mate-id="' + CSS.escape(mate.id) + '"]')) return;
|
|
189
293
|
var button = ordered.find(function (item) { return item.dataset.mateId === mate.id; });
|
|
190
294
|
if (ordered[index] === button) return;
|
|
191
295
|
rail.insertBefore(button, ordered[index] || null);
|
|
@@ -213,22 +317,40 @@ export function renderProjectMates() {
|
|
|
213
317
|
}
|
|
214
318
|
|
|
215
319
|
export function initProjectMateNavigation() {
|
|
320
|
+
initContextualClay();
|
|
216
321
|
var clayEntry = document.querySelector('.icon-strip-brand');
|
|
217
322
|
if (clayEntry) {
|
|
218
|
-
clayEntry.addEventListener('click', function () {
|
|
219
|
-
var
|
|
323
|
+
clayEntry.addEventListener('click', function (event) {
|
|
324
|
+
var state = store.snap();
|
|
325
|
+
var clay = navigationMates(state.cachedMatesList).find(function (mate) { return mate.builtinKey === 'clay'; });
|
|
220
326
|
hideIconTooltip();
|
|
221
|
-
if (clay)
|
|
327
|
+
if (!clay) return;
|
|
328
|
+
var popup = state.contextualClay || {};
|
|
329
|
+
if (clayIsActive(state, clay) && !(popup.mode === 'popover' && popup.mateId === clay.id)) returnFromClay();
|
|
330
|
+
else {
|
|
331
|
+
activateContextualMate(clay.id);
|
|
332
|
+
}
|
|
333
|
+
});
|
|
334
|
+
bindIconTooltip(clayEntry, function () {
|
|
335
|
+
var state = store.snap();
|
|
336
|
+
var clay = navigationMates(state.cachedMatesList).find(function (mate) { return mate.builtinKey === 'clay'; });
|
|
337
|
+
if ((state.contextualClay || {}).mateId === (clay && clay.id) && contextualClayMode() === 'popover') return { text: '' };
|
|
338
|
+
return { text: (state.contextualClay || {}).mateId === (clay && clay.id) && contextualClayMode() === 'popover' ? 'Open Clay workspace' : clayIsActive(state, clay) ? 'Return to project' : 'Open Clay', kind: 'mate', avatarUrl: 'clay-studio-symbol.png' };
|
|
222
339
|
});
|
|
223
|
-
bindIconTooltip(clayEntry, { text: 'Clay', kind: 'mate', avatarUrl: 'clay-studio-symbol.png' });
|
|
224
340
|
}
|
|
225
341
|
var knob = document.getElementById('icon-strip-filter-knob');
|
|
226
342
|
if (knob) knob.addEventListener('click', activateProjectMateFilter);
|
|
227
343
|
store.subscribe(function (state, previous) {
|
|
344
|
+
if (state.clayReturnPendingProjectSlug && state.currentSlug !== previous.currentSlug &&
|
|
345
|
+
state.currentSlug !== state.clayReturnPendingProjectSlug) {
|
|
346
|
+
store.set({ pendingProjectSessionNavigation: null, clayReturnPendingProjectSlug: null });
|
|
347
|
+
} else if (state.clayReturnPendingProjectSlug && !state.pendingProjectSessionNavigation && previous.pendingProjectSessionNavigation) {
|
|
348
|
+
store.set({ clayReturnPendingProjectSlug: null });
|
|
349
|
+
}
|
|
228
350
|
if (state.cachedMatesList !== previous.cachedMatesList || state.homeChatMateId !== previous.homeChatMateId ||
|
|
229
351
|
state.homeShellVisible !== previous.homeShellVisible || state.projectsHubList !== previous.projectsHubList ||
|
|
230
352
|
state.dmUnread !== previous.dmUnread || state.currentSlug !== previous.currentSlug ||
|
|
231
|
-
state.dmMode !== previous.dmMode || state.connected !== previous.connected) renderProjectMates();
|
|
353
|
+
state.contextualClay !== previous.contextualClay || state.dmMode !== previous.dmMode || state.connected !== previous.connected || state.activeSessionId !== previous.activeSessionId || state.youActivity !== previous.youActivity) renderProjectMates();
|
|
232
354
|
if (state.projectMateFilterMode !== previous.projectMateFilterMode ||
|
|
233
355
|
state.projectMateFilterTurns !== previous.projectMateFilterTurns) applyProjectMateFilter();
|
|
234
356
|
});
|
|
@@ -27,12 +27,10 @@ function setSelectState(select, value, disabled) {
|
|
|
27
27
|
select.disabled = !!disabled;
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
|
|
30
|
+
// Editable for any authorised selected project: the server re-authorises the
|
|
31
|
+
// exact slug (owner, permission, access, worktree) and echoes it back.
|
|
34
32
|
function isReadOnly(active) {
|
|
35
|
-
return !active || !active.authorized || active.isWorktree
|
|
33
|
+
return !active || !active.authorized || active.isWorktree;
|
|
36
34
|
}
|
|
37
35
|
|
|
38
36
|
function renderActiveState() {
|
|
@@ -40,23 +38,26 @@ function renderActiveState() {
|
|
|
40
38
|
var pending = pendingState();
|
|
41
39
|
var select = selectElement();
|
|
42
40
|
var inheritedHint = document.getElementById("ps-session-visibility-default-inherited-hint");
|
|
43
|
-
var nonCurrentHint = document.getElementById("ps-session-visibility-default-non-current-hint");
|
|
44
41
|
if (inheritedHint) inheritedHint.classList.toggle("hidden", !(active && active.isWorktree));
|
|
45
|
-
if (nonCurrentHint) nonCurrentHint.classList.toggle("hidden", !(active && active.authorized && !active.isWorktree && !isCurrentProject(active)));
|
|
46
42
|
if (!select || !active) return;
|
|
47
|
-
|
|
43
|
+
// One request at a time: a pending change for any project holds the control.
|
|
44
|
+
setSelectState(select, active.effectiveValue, isReadOnly(active) || !!pending);
|
|
48
45
|
}
|
|
49
46
|
|
|
50
|
-
|
|
47
|
+
// The server requires the project owner plus the projectSettings permission.
|
|
48
|
+
// An administrator who is not the owner may see the value but not change it.
|
|
49
|
+
function visibilityAccess(project) {
|
|
51
50
|
var users = store.get('cachedAllUsers') || [];
|
|
52
51
|
var userId = store.get('myUserId');
|
|
53
52
|
var currentUser = null;
|
|
54
53
|
for (var i = 0; i < users.length; i++) {
|
|
55
54
|
if (users[i].id === userId) { currentUser = users[i]; break; }
|
|
56
55
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
56
|
+
var permitted = !store.get('permissions') || store.get('permissions').projectSettings !== false;
|
|
57
|
+
var owner = !!(project && project.projectOwnerId && project.projectOwnerId === userId);
|
|
58
|
+
var admin = !!(currentUser && currentUser.role === "admin");
|
|
59
|
+
var multi = !!(store.get('isMultiUserMode') && project && permitted);
|
|
60
|
+
return { visible: multi && (owner || admin), editable: multi && owner };
|
|
60
61
|
}
|
|
61
62
|
|
|
62
63
|
export function initProjectSessionVisibilitySettings() {
|
|
@@ -80,7 +81,6 @@ export function initProjectSessionVisibilitySettings() {
|
|
|
80
81
|
});
|
|
81
82
|
|
|
82
83
|
store.subscribe(function (state, previous) {
|
|
83
|
-
if (state.currentSlug !== previous.currentSlug) renderActiveState();
|
|
84
84
|
if (state.connected || previous.connected !== true) return;
|
|
85
85
|
var pending = pendingState();
|
|
86
86
|
if (!pending) return;
|
|
@@ -95,10 +95,13 @@ export function initProjectSessionVisibilitySettings() {
|
|
|
95
95
|
export function populateProjectSessionVisibilitySettings(slug, project) {
|
|
96
96
|
var field = document.getElementById("ps-session-visibility-default-field");
|
|
97
97
|
var select = selectElement();
|
|
98
|
-
|
|
98
|
+
var access = visibilityAccess(project);
|
|
99
|
+
if (field) field.style.display = access.visible ? "" : "none";
|
|
100
|
+
var ownerHint = document.getElementById("ps-session-visibility-default-owner-hint");
|
|
101
|
+
if (ownerHint) ownerHint.classList.toggle("hidden", !(access.visible && !access.editable));
|
|
99
102
|
if (!select) return;
|
|
100
103
|
var value = project && project.sessionVisibilityDefault === "shared" ? "shared" : "private";
|
|
101
|
-
var active = { slug: slug || "", effectiveValue: value, isWorktree: !!(project && project.isWorktree), authorized:
|
|
104
|
+
var active = { slug: slug || "", effectiveValue: value, isWorktree: !!(project && project.isWorktree), authorized: access.editable };
|
|
102
105
|
var pending = pendingState();
|
|
103
106
|
setVisibilityState(active, pending);
|
|
104
107
|
renderActiveState();
|
|
@@ -124,7 +127,7 @@ export function handleProjectSessionVisibilityDefault(msg) {
|
|
|
124
127
|
var active = activeState();
|
|
125
128
|
setVisibilityState(active, null);
|
|
126
129
|
var select = selectElement();
|
|
127
|
-
if (!select || !active || active.slug !== msg.slug) return;
|
|
130
|
+
if (!select || !active || active.slug !== msg.slug) { renderActiveState(); return; }
|
|
128
131
|
if (!msg.ok) {
|
|
129
132
|
active = Object.assign({}, active, { effectiveValue: pending.previous });
|
|
130
133
|
setVisibilityState(active, null);
|