@agent-native/core 0.117.1 → 0.117.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +10 -0
- package/corpus/core/package.json +2 -1
- package/corpus/core/src/cli/context-xray-local.ts +1 -1
- package/corpus/core/src/client/extensions/ExtensionViewer.tsx +4 -4
- package/corpus/core/src/client/extensions/ExtensionsSidebarSection.tsx +11 -11
- package/corpus/core/src/client/extensions/agent-native-extension-runtime.ts +1 -1
- package/corpus/core/src/client/extensions/delete-extension.ts +2 -2
- package/corpus/core/src/client/org/OrgSwitcher.tsx +25 -1
- package/corpus/core/src/client/settings/SettingsPanel.tsx +102 -10
- package/corpus/core/src/client/sharing/ShareButton.tsx +7 -6
- package/corpus/core/src/db/client.ts +13 -10
- package/corpus/core/src/extensions/actions.ts +13 -5
- package/corpus/core/src/extensions/local.ts +1 -0
- package/corpus/core/src/extensions/routes.ts +10 -5
- package/corpus/core/src/extensions/schema.ts +5 -0
- package/corpus/core/src/extensions/slots/store.ts +14 -4
- package/corpus/core/src/extensions/store.ts +55 -19
- package/corpus/core/src/extensions/theme.ts +1 -1
- package/corpus/core/src/file-upload/registry.ts +9 -0
- package/corpus/core/src/index.browser.ts +5 -0
- package/corpus/core/src/index.ts +1 -0
- package/corpus/core/src/localization/default-messages.ts +23 -6
- package/corpus/core/src/server/action-discovery.ts +8 -0
- package/corpus/core/src/server/better-auth-instance.ts +7 -2
- package/corpus/core/src/server/email-template.ts +18 -0
- package/corpus/core/src/server/email-templates.ts +3 -0
- package/corpus/core/src/server/email.ts +40 -4
- package/corpus/core/src/sharing/actions/share-resource.ts +1 -0
- package/corpus/core/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
- package/corpus/core/src/templates/default/app/global.css +1 -1
- package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +6 -6
- package/corpus/core/src/templates/default/app/i18n/de-DE.ts +6 -6
- package/corpus/core/src/templates/default/app/i18n/en-US.ts +6 -6
- package/corpus/core/src/templates/default/app/i18n/es-ES.ts +6 -6
- package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +6 -6
- package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +6 -6
- package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +6 -6
- package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +6 -6
- package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +6 -6
- package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +7 -7
- package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +7 -7
- package/corpus/core/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
- package/corpus/core/src/user-profile/actions/get-user-profile.ts +16 -0
- package/corpus/core/src/user-profile/actions/update-user-profile.ts +24 -0
- package/corpus/core/src/user-profile/index.ts +5 -0
- package/corpus/core/src/user-profile/shared.ts +14 -0
- package/corpus/core/src/user-profile/store.ts +50 -0
- package/corpus/templates/analytics/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
- package/corpus/templates/assets/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
- package/corpus/templates/assets/app/components/layout/Sidebar.tsx +2 -2
- package/corpus/templates/assets/app/global.css +1 -1
- package/corpus/templates/assets/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
- package/corpus/templates/brain/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
- package/corpus/templates/brain/app/global.css +2 -2
- package/corpus/templates/brain/app/lib/brain.ts +2 -2
- package/corpus/templates/brain/app/root.tsx +2 -2
- package/corpus/templates/brain/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
- package/corpus/templates/calendar/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
- package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +6 -2
- package/corpus/templates/calendar/app/global.css +1 -1
- package/corpus/templates/calendar/app/root.tsx +2 -2
- package/corpus/templates/calendar/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
- package/corpus/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
- package/corpus/templates/chat/app/components/layout/Sidebar.tsx +2 -2
- package/corpus/templates/chat/app/global.css +1 -1
- package/corpus/templates/chat/app/root.tsx +2 -2
- package/corpus/templates/chat/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
- package/corpus/templates/clips/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
- package/corpus/templates/clips/actions/export-to-brain.ts +1 -1
- package/corpus/templates/clips/actions/invite-member.ts +1 -0
- package/corpus/templates/clips/app/components/library/library-layout.tsx +2 -2
- package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +20 -11
- package/corpus/templates/clips/app/global.css +1 -1
- package/corpus/templates/clips/app/root.tsx +7 -2
- package/corpus/templates/clips/app/routes/record.tsx +2 -88
- package/corpus/templates/clips/changelog/2026-07-22-builder-connected-recordings-start-resumable-upload-sessions.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-22-clip-thumbnails-now-come-from-the-recording-instead-of-the-p.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-22-clips-emails-now-render-the-agent-native-logo-in-gmail-and-o.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-22-dismissed-zoom-and-teams-meeting-note-prompts-now-stay-dismi.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-22-quieter-permissions-and-rewind-controls.md +6 -0
- package/corpus/templates/clips/desktop/src/app.tsx +86 -52
- package/corpus/templates/clips/desktop/src/lib/meeting-notification-dismissal.ts +31 -0
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +4 -167
- package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +10 -1
- package/corpus/templates/clips/desktop/src/styles.css +98 -36
- package/corpus/templates/clips/desktop/src-tauri/src/adhoc_meetings_watcher.rs +67 -4
- package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +1 -1
- package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +51 -0
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +5 -1
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +0 -189
- package/corpus/templates/clips/desktop/src-tauri/src/notifications.rs +62 -0
- package/corpus/templates/clips/server/plugins/db.ts +6 -2
- package/corpus/templates/content/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +3 -3
- package/corpus/templates/content/app/global.css +1 -1
- package/corpus/templates/content/app/root.tsx +2 -2
- package/corpus/templates/content/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
- package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
- package/corpus/templates/crm/app/global.css +1 -1
- package/corpus/templates/design/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
- package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +19 -1
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +12 -1
- package/corpus/templates/design/app/components/design/EditPanel.tsx +177 -52
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +179 -59
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +74 -27
- package/corpus/templates/design/app/components/design/multi-screen/types.ts +2 -0
- package/corpus/templates/design/app/components/layout/Sidebar.tsx +2 -2
- package/corpus/templates/design/app/global.css +1 -1
- package/corpus/templates/design/app/hooks/use-navigation-state.ts +6 -5
- package/corpus/templates/design/app/root.tsx +2 -2
- package/corpus/templates/design/changelog/2026-07-22-design-owners-can-keep-editing-their-designs-after-switching.md +6 -0
- package/corpus/templates/design/changelog/2026-07-22-inspector-tabs-keep-their-text-labels-at-narrow-widths.md +6 -0
- package/corpus/templates/design/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
- package/corpus/templates/design/changelog/2026-07-22-narrow-breakpoint-previews-keep-their-device-labels-readable.md +6 -0
- package/corpus/templates/design/changelog/2026-07-22-removed-the-draft-status-chip-from-the-design-editor.md +6 -0
- package/corpus/templates/design/changelog/2026-07-22-responsive-breakpoint-controls-stay-within-narrow-sidebars.md +6 -0
- package/corpus/templates/design/changelog/2026-07-22-responsive-peers-now-use-a-softer-selection-highlight-withou.md +6 -0
- package/corpus/templates/design/changelog/2026-07-22-rotate-from-context-menu.md +6 -0
- package/corpus/templates/design/changelog/2026-07-22-the-selection-outline-now-stays-attached-while-moving-screen.md +6 -0
- package/corpus/templates/design/changelog/2026-07-22-view-only-designs-now-support-figma-style-layer-inspection-w.md +6 -0
- package/corpus/templates/design/server/db/index.ts +4 -0
- package/corpus/templates/dispatch/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
- package/corpus/templates/dispatch/app/dispatch-extensions.tsx +2 -2
- package/corpus/templates/dispatch/app/global.css +1 -1
- package/corpus/templates/dispatch/app/root.tsx +2 -2
- package/corpus/templates/dispatch/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
- package/corpus/templates/forms/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
- package/corpus/templates/forms/app/components/layout/Layout.tsx +1 -1
- package/corpus/templates/forms/app/components/layout/Sidebar.tsx +3 -3
- package/corpus/templates/forms/app/global.css +1 -1
- package/corpus/templates/forms/app/hooks/use-forms.ts +55 -2
- package/corpus/templates/forms/app/i18n/en-US.ts +2 -0
- package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +3 -3
- package/corpus/templates/forms/app/pages/FormsListPage.tsx +23 -6
- package/corpus/templates/forms/app/root.tsx +2 -2
- package/corpus/templates/forms/changelog/2026-07-22-forms-now-archive-with-optimistic-feedback.md +6 -0
- package/corpus/templates/forms/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
- package/corpus/templates/forms/server/plugins/agent-chat.ts +1 -1
- package/corpus/templates/macros/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
- package/corpus/templates/macros/app/components/layout/AppLayout.tsx +2 -2
- package/corpus/templates/macros/app/root.tsx +2 -2
- package/corpus/templates/macros/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
- package/corpus/templates/mail/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
- package/corpus/templates/mail/app/components/layout/AppLayout.tsx +3 -3
- package/corpus/templates/mail/app/components/layout/CommandPalette.tsx +2 -2
- package/corpus/templates/mail/app/global.css +1 -1
- package/corpus/templates/mail/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
- package/corpus/templates/plan/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
- package/corpus/templates/plan/app/components/layout/Sidebar.tsx +2 -2
- package/corpus/templates/plan/app/global.css +1 -1
- package/corpus/templates/plan/app/root.tsx +2 -2
- package/corpus/templates/plan/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
- package/corpus/templates/slides/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
- package/corpus/templates/slides/app/components/layout/Sidebar.tsx +2 -2
- package/corpus/templates/slides/app/root.tsx +2 -2
- package/corpus/templates/slides/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-22-slides-no-longer-fail-intermittently-on-fresh-server-instances.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-22-uploaded-screenshots-can-now-be-analyzed-and-recreated-as-ed.md +6 -0
- package/corpus/templates/slides/server/lib/chat-attachments.ts +7 -3
- package/corpus/templates/slides/server/plugins/db.ts +44 -17
- package/corpus/templates/tasks/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
- package/corpus/templates/tasks/app/global.css +1 -1
- package/dist/cli/context-xray-local.js +1 -1
- package/dist/cli/context-xray-local.js.map +1 -1
- package/dist/client/extensions/ExtensionViewer.js +2 -2
- package/dist/client/extensions/ExtensionViewer.js.map +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.js +11 -11
- package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
- package/dist/client/extensions/agent-native-extension-runtime.js +1 -1
- package/dist/client/extensions/agent-native-extension-runtime.js.map +1 -1
- package/dist/client/extensions/delete-extension.d.ts +1 -1
- package/dist/client/extensions/delete-extension.d.ts.map +1 -1
- package/dist/client/extensions/delete-extension.js +1 -1
- package/dist/client/extensions/delete-extension.js.map +1 -1
- package/dist/client/org/OrgSwitcher.d.ts +3 -1
- package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
- package/dist/client/org/OrgSwitcher.js +12 -4
- package/dist/client/org/OrgSwitcher.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +37 -4
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/sharing/ShareButton.d.ts +3 -4
- package/dist/client/sharing/ShareButton.d.ts.map +1 -1
- package/dist/client/sharing/ShareButton.js +3 -2
- package/dist/client/sharing/ShareButton.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/db/client.d.ts +7 -7
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +13 -10
- package/dist/db/client.js.map +1 -1
- package/dist/extensions/actions.d.ts.map +1 -1
- package/dist/extensions/actions.js +8 -5
- package/dist/extensions/actions.js.map +1 -1
- package/dist/extensions/local.d.ts.map +1 -1
- package/dist/extensions/local.js +1 -0
- package/dist/extensions/local.js.map +1 -1
- package/dist/extensions/routes.d.ts.map +1 -1
- package/dist/extensions/routes.js +9 -4
- package/dist/extensions/routes.js.map +1 -1
- package/dist/extensions/schema.d.ts +23 -2
- package/dist/extensions/schema.d.ts.map +1 -1
- package/dist/extensions/schema.js +5 -0
- package/dist/extensions/schema.js.map +1 -1
- package/dist/extensions/slots/store.d.ts +1 -1
- package/dist/extensions/slots/store.d.ts.map +1 -1
- package/dist/extensions/slots/store.js +4 -4
- package/dist/extensions/slots/store.js.map +1 -1
- package/dist/extensions/store.d.ts +1 -0
- package/dist/extensions/store.d.ts.map +1 -1
- package/dist/extensions/store.js +38 -21
- package/dist/extensions/store.js.map +1 -1
- package/dist/extensions/theme.js +1 -1
- package/dist/extensions/theme.js.map +1 -1
- package/dist/file-upload/registry.d.ts.map +1 -1
- package/dist/file-upload/registry.js +9 -0
- package/dist/file-upload/registry.js.map +1 -1
- package/dist/index.browser.d.ts +1 -0
- package/dist/index.browser.d.ts.map +1 -1
- package/dist/index.browser.js +1 -0
- package/dist/index.browser.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/localization/default-messages.d.ts +16 -0
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +22 -6
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/provider-api/actions/custom-provider-registration.d.ts +7 -7
- package/dist/provider-api/actions/provider-api.d.ts +11 -11
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/dist/secrets/routes.d.ts +6 -6
- package/dist/server/action-discovery.d.ts.map +1 -1
- package/dist/server/action-discovery.js +8 -0
- package/dist/server/action-discovery.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/better-auth-instance.d.ts +7 -2
- package/dist/server/better-auth-instance.d.ts.map +1 -1
- package/dist/server/better-auth-instance.js.map +1 -1
- package/dist/server/email-template.d.ts +3 -0
- package/dist/server/email-template.d.ts.map +1 -1
- package/dist/server/email-template.js +13 -0
- package/dist/server/email-template.js.map +1 -1
- package/dist/server/email-templates.d.ts.map +1 -1
- package/dist/server/email-templates.js +3 -0
- package/dist/server/email-templates.js.map +1 -1
- package/dist/server/email.d.ts.map +1 -1
- package/dist/server/email.js +27 -4
- package/dist/server/email.js.map +1 -1
- package/dist/sharing/actions/share-resource.js +1 -0
- package/dist/sharing/actions/share-resource.js.map +1 -1
- package/dist/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
- package/dist/templates/chat/app/components/layout/Sidebar.tsx +2 -2
- package/dist/templates/chat/app/global.css +1 -1
- package/dist/templates/chat/app/root.tsx +2 -2
- package/dist/templates/chat/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
- package/dist/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
- package/dist/templates/default/app/global.css +1 -1
- package/dist/templates/default/app/i18n/ar-SA.ts +6 -6
- package/dist/templates/default/app/i18n/de-DE.ts +6 -6
- package/dist/templates/default/app/i18n/en-US.ts +6 -6
- package/dist/templates/default/app/i18n/es-ES.ts +6 -6
- package/dist/templates/default/app/i18n/fr-FR.ts +6 -6
- package/dist/templates/default/app/i18n/hi-IN.ts +6 -6
- package/dist/templates/default/app/i18n/ja-JP.ts +6 -6
- package/dist/templates/default/app/i18n/ko-KR.ts +6 -6
- package/dist/templates/default/app/i18n/pt-BR.ts +6 -6
- package/dist/templates/default/app/i18n/zh-CN.ts +7 -7
- package/dist/templates/default/app/i18n/zh-TW.ts +7 -7
- package/dist/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
- package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
- package/dist/user-profile/actions/get-user-profile.d.ts +4 -0
- package/dist/user-profile/actions/get-user-profile.d.ts.map +1 -0
- package/dist/user-profile/actions/get-user-profile.js +14 -0
- package/dist/user-profile/actions/get-user-profile.js.map +1 -0
- package/dist/user-profile/actions/update-user-profile.d.ts +6 -0
- package/dist/user-profile/actions/update-user-profile.d.ts.map +1 -0
- package/dist/user-profile/actions/update-user-profile.js +20 -0
- package/dist/user-profile/actions/update-user-profile.js.map +1 -0
- package/dist/user-profile/index.d.ts +2 -0
- package/dist/user-profile/index.d.ts.map +1 -0
- package/dist/user-profile/index.js +2 -0
- package/dist/user-profile/index.js.map +1 -0
- package/dist/user-profile/shared.d.ts +7 -0
- package/dist/user-profile/shared.d.ts.map +1 -0
- package/dist/user-profile/shared.js +6 -0
- package/dist/user-profile/shared.js.map +1 -0
- package/dist/user-profile/store.d.ts +4 -0
- package/dist/user-profile/store.d.ts.map +1 -0
- package/dist/user-profile/store.js +38 -0
- package/dist/user-profile/store.js.map +1 -0
- package/package.json +2 -1
- package/src/cli/context-xray-local.ts +1 -1
- package/src/client/extensions/ExtensionViewer.tsx +4 -4
- package/src/client/extensions/ExtensionsSidebarSection.tsx +11 -11
- package/src/client/extensions/agent-native-extension-runtime.ts +1 -1
- package/src/client/extensions/delete-extension.ts +2 -2
- package/src/client/org/OrgSwitcher.tsx +25 -1
- package/src/client/settings/SettingsPanel.tsx +102 -10
- package/src/client/sharing/ShareButton.tsx +7 -6
- package/src/db/client.ts +13 -10
- package/src/extensions/actions.ts +13 -5
- package/src/extensions/local.ts +1 -0
- package/src/extensions/routes.ts +10 -5
- package/src/extensions/schema.ts +5 -0
- package/src/extensions/slots/store.ts +14 -4
- package/src/extensions/store.ts +55 -19
- package/src/extensions/theme.ts +1 -1
- package/src/file-upload/registry.ts +9 -0
- package/src/index.browser.ts +5 -0
- package/src/index.ts +1 -0
- package/src/localization/default-messages.ts +23 -6
- package/src/server/action-discovery.ts +8 -0
- package/src/server/better-auth-instance.ts +7 -2
- package/src/server/email-template.ts +18 -0
- package/src/server/email-templates.ts +3 -0
- package/src/server/email.ts +40 -4
- package/src/sharing/actions/share-resource.ts +1 -0
- package/src/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
- package/src/templates/chat/app/components/layout/Sidebar.tsx +2 -2
- package/src/templates/chat/app/global.css +1 -1
- package/src/templates/chat/app/root.tsx +2 -2
- package/src/templates/chat/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
- package/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
- package/src/templates/default/app/global.css +1 -1
- package/src/templates/default/app/i18n/ar-SA.ts +6 -6
- package/src/templates/default/app/i18n/de-DE.ts +6 -6
- package/src/templates/default/app/i18n/en-US.ts +6 -6
- package/src/templates/default/app/i18n/es-ES.ts +6 -6
- package/src/templates/default/app/i18n/fr-FR.ts +6 -6
- package/src/templates/default/app/i18n/hi-IN.ts +6 -6
- package/src/templates/default/app/i18n/ja-JP.ts +6 -6
- package/src/templates/default/app/i18n/ko-KR.ts +6 -6
- package/src/templates/default/app/i18n/pt-BR.ts +6 -6
- package/src/templates/default/app/i18n/zh-CN.ts +7 -7
- package/src/templates/default/app/i18n/zh-TW.ts +7 -7
- package/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
- package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
- package/src/user-profile/actions/get-user-profile.ts +16 -0
- package/src/user-profile/actions/update-user-profile.ts +24 -0
- package/src/user-profile/index.ts +5 -0
- package/src/user-profile/shared.ts +14 -0
- package/src/user-profile/store.ts +50 -0
|
@@ -353,24 +353,24 @@ const messages = {
|
|
|
353
353
|
hideEveryone: "Esconda-se de todos",
|
|
354
354
|
localFileDescription:
|
|
355
355
|
"This extension is backed by {{entryPath}}. Edit or remove it from the workspace.",
|
|
356
|
-
deleteQuestion: "
|
|
356
|
+
deleteQuestion: "Arquivar {{name}}?",
|
|
357
357
|
removeQuestion: "Remove {{name}}?",
|
|
358
358
|
hideForYouDescription:
|
|
359
359
|
"Isso o oculta da sua lista de extensões sem excluí-lo para mais ninguém.",
|
|
360
360
|
removeEverywhereDescription:
|
|
361
|
-
"Isso o
|
|
361
|
+
"Isso o arquiva em todos os lugares em que é compartilhado.",
|
|
362
362
|
cancel: "Cancelar",
|
|
363
363
|
remove: "Remover",
|
|
364
364
|
removing: "Removendo...",
|
|
365
|
-
delete: "
|
|
366
|
-
deleting: "
|
|
365
|
+
delete: "Arquivar",
|
|
366
|
+
deleting: "Arquivando...",
|
|
367
367
|
openFullView: "Abrir visualização completa",
|
|
368
368
|
removeFromWidgetArea: "Remover desta área de widget",
|
|
369
|
-
deleteExtensionEllipsis: "
|
|
369
|
+
deleteExtensionEllipsis: "Arquivar extensão...",
|
|
370
370
|
removeFromMyListEllipsis: "Remover da minha lista...",
|
|
371
371
|
removeFromWidgetAreaForMe: "Remove from this widget area (for me)",
|
|
372
372
|
deleteEverywhereConfirmation:
|
|
373
|
-
"Isso
|
|
373
|
+
"Isso arquiva a extensão em todos os lugares, para todas as pessoas com quem ela é compartilhada.",
|
|
374
374
|
addWidget: "Adicionar widget",
|
|
375
375
|
loading: "Carregando...",
|
|
376
376
|
noWidgetsAvailable: "Ainda não há widgets disponíveis para este slot.",
|
|
@@ -330,22 +330,22 @@ const messages = {
|
|
|
330
330
|
hideEveryone: "向所有人隐藏",
|
|
331
331
|
localFileDescription:
|
|
332
332
|
"This extension is backed by {{entryPath}}. Edit or remove it from the workspace.",
|
|
333
|
-
deleteQuestion: "
|
|
333
|
+
deleteQuestion: "要归档 {{name}} 吗?",
|
|
334
334
|
removeQuestion: "Remove {{name}}?",
|
|
335
335
|
hideForYouDescription:
|
|
336
336
|
"这会将其从您的扩展列表中隐藏,而不会为其他任何人删除它。",
|
|
337
|
-
removeEverywhereDescription: "
|
|
337
|
+
removeEverywhereDescription: "这会在共享的所有地方归档它。",
|
|
338
338
|
cancel: "取消",
|
|
339
339
|
remove: "移除",
|
|
340
|
-
removing: "
|
|
341
|
-
delete: "
|
|
342
|
-
deleting: "
|
|
340
|
+
removing: "正在移除...",
|
|
341
|
+
delete: "归档",
|
|
342
|
+
deleting: "正在归档...",
|
|
343
343
|
openFullView: "打开全视图",
|
|
344
344
|
removeFromWidgetArea: "从此小部件区域中删除",
|
|
345
|
-
deleteExtensionEllipsis: "
|
|
345
|
+
deleteExtensionEllipsis: "归档扩展...",
|
|
346
346
|
removeFromMyListEllipsis: "从我的列表中删除...",
|
|
347
347
|
removeFromWidgetAreaForMe: "Remove from this widget area (for me)",
|
|
348
|
-
deleteEverywhereConfirmation: "
|
|
348
|
+
deleteEverywhereConfirmation: "这会为所有与之共享的人归档该扩展程序。",
|
|
349
349
|
addWidget: "添加小部件",
|
|
350
350
|
loading: "正在加载...",
|
|
351
351
|
noWidgetsAvailable: "此插槽尚无可用的小部件。",
|
|
@@ -330,22 +330,22 @@ const messages = {
|
|
|
330
330
|
hideEveryone: "向所有人隱藏",
|
|
331
331
|
localFileDescription:
|
|
332
332
|
"此擴充功能由 {{entryPath}} 支援。請從工作區編輯或移除它。",
|
|
333
|
-
deleteQuestion: "
|
|
333
|
+
deleteQuestion: "要封存 {{name}} 嗎?",
|
|
334
334
|
removeQuestion: "要移除 {{name}} 嗎?",
|
|
335
335
|
hideForYouDescription:
|
|
336
336
|
"這會將其從您的擴充功能清單中隱藏,而不會為其他任何人刪除它。",
|
|
337
|
-
removeEverywhereDescription: "
|
|
337
|
+
removeEverywhereDescription: "這會在共用的所有地方封存它。",
|
|
338
338
|
cancel: "取消",
|
|
339
339
|
remove: "移除",
|
|
340
|
-
removing: "
|
|
341
|
-
delete: "
|
|
342
|
-
deleting: "
|
|
340
|
+
removing: "正在移除...",
|
|
341
|
+
delete: "封存",
|
|
342
|
+
deleting: "正在封存...",
|
|
343
343
|
openFullView: "開啟全檢視",
|
|
344
344
|
removeFromWidgetArea: "從此小工具區域中刪除",
|
|
345
|
-
deleteExtensionEllipsis: "
|
|
345
|
+
deleteExtensionEllipsis: "封存擴充功能...",
|
|
346
346
|
removeFromMyListEllipsis: "從我的清單中刪除...",
|
|
347
347
|
removeFromWidgetAreaForMe: "從這個小工具區域移除(只套用於我)",
|
|
348
|
-
deleteEverywhereConfirmation: "
|
|
348
|
+
deleteEverywhereConfirmation: "這會為所有與之共用的人封存該擴充功能。",
|
|
349
349
|
addWidget: "新增小工具",
|
|
350
350
|
loading: "正在載入...",
|
|
351
351
|
noWidgetsAvailable: "此插槽尚無可用的小工具。",
|
|
@@ -59,6 +59,12 @@ quick controls and deep links such as:
|
|
|
59
59
|
- `/settings/usage`
|
|
60
60
|
- `/settings/apps/:appId`
|
|
61
61
|
|
|
62
|
+
The shared Account section is the canonical profile surface at
|
|
63
|
+
`/settings#account`. It owns the editable display name and existing avatar
|
|
64
|
+
control through the authenticated `get-user-profile` and `update-user-profile`
|
|
65
|
+
actions. Shared workspace chrome such as `OrgSwitcher` should link to this
|
|
66
|
+
surface rather than creating an app-local profile page.
|
|
67
|
+
|
|
62
68
|
When adding a new API key, OAuth grant, provider connection, model selector, app
|
|
63
69
|
preference, notification preference, or usage/billing surface, register it as a
|
|
64
70
|
settings tab or app settings panel first. Only add sidebar UI when it is needed
|
|
@@ -59,6 +59,12 @@ quick controls and deep links such as:
|
|
|
59
59
|
- `/settings/usage`
|
|
60
60
|
- `/settings/apps/:appId`
|
|
61
61
|
|
|
62
|
+
The shared Account section is the canonical profile surface at
|
|
63
|
+
`/settings#account`. It owns the editable display name and existing avatar
|
|
64
|
+
control through the authenticated `get-user-profile` and `update-user-profile`
|
|
65
|
+
actions. Shared workspace chrome such as `OrgSwitcher` should link to this
|
|
66
|
+
surface rather than creating an app-local profile page.
|
|
67
|
+
|
|
62
68
|
When adding a new API key, OAuth grant, provider connection, model selector, app
|
|
63
69
|
preference, notification preference, or usage/billing surface, register it as a
|
|
64
70
|
settings tab or app settings panel first. Only add sidebar UI when it is needed
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-user-profile.d.ts","sourceRoot":"","sources":["../../../src/user-profile/actions/get-user-profile.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { defineAction } from "../../action.js";
|
|
3
|
+
import { getUserProfile } from "../store.js";
|
|
4
|
+
export default defineAction({
|
|
5
|
+
description: "Get the current user's profile, including the display name used across Agent-Native apps.",
|
|
6
|
+
schema: z.object({}),
|
|
7
|
+
http: { method: "GET" },
|
|
8
|
+
run: async (_args, ctx) => {
|
|
9
|
+
if (!ctx?.userEmail)
|
|
10
|
+
throw new Error("Not authenticated.");
|
|
11
|
+
return getUserProfile(ctx.userEmail);
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=get-user-profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-user-profile.js","sourceRoot":"","sources":["../../../src/user-profile/actions/get-user-profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,eAAe,YAAY,CAAC;IAC1B,WAAW,EACT,2FAA2F;IAC7F,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACpB,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;IACvB,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAwB,EAAE;QAC9C,IAAI,CAAC,GAAG,EAAE,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC3D,OAAO,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;CACF,CAAC,CAAC","sourcesContent":["import { z } from \"zod\";\n\nimport { defineAction } from \"../../action.js\";\nimport type { UserProfile } from \"../shared.js\";\nimport { getUserProfile } from \"../store.js\";\n\nexport default defineAction({\n description:\n \"Get the current user's profile, including the display name used across Agent-Native apps.\",\n schema: z.object({}),\n http: { method: \"GET\" },\n run: async (_args, ctx): Promise<UserProfile> => {\n if (!ctx?.userEmail) throw new Error(\"Not authenticated.\");\n return getUserProfile(ctx.userEmail);\n },\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-user-profile.d.ts","sourceRoot":"","sources":["../../../src/user-profile/actions/update-user-profile.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { defineAction } from "../../action.js";
|
|
3
|
+
import { updateUserProfile } from "../store.js";
|
|
4
|
+
export default defineAction({
|
|
5
|
+
description: "Update the current user's display name used across Agent-Native apps. Do not change the user's email address with this action.",
|
|
6
|
+
schema: z.object({
|
|
7
|
+
name: z
|
|
8
|
+
.string()
|
|
9
|
+
.trim()
|
|
10
|
+
.min(1)
|
|
11
|
+
.max(120)
|
|
12
|
+
.describe("The display name to use when referring to the signed-in user."),
|
|
13
|
+
}),
|
|
14
|
+
run: async ({ name }, ctx) => {
|
|
15
|
+
if (!ctx?.userEmail)
|
|
16
|
+
throw new Error("Not authenticated.");
|
|
17
|
+
return updateUserProfile(ctx.userEmail, name);
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=update-user-profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-user-profile.js","sourceRoot":"","sources":["../../../src/user-profile/actions/update-user-profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,eAAe,YAAY,CAAC;IAC1B,WAAW,EACT,gIAAgI;IAClI,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,IAAI,EAAE,CAAC;aACJ,MAAM,EAAE;aACR,IAAI,EAAE;aACN,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,GAAG,CAAC;aACR,QAAQ,CACP,+DAA+D,CAChE;KACJ,CAAC;IACF,GAAG,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAwB,EAAE;QACjD,IAAI,CAAC,GAAG,EAAE,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC3D,OAAO,iBAAiB,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC;CACF,CAAC,CAAC","sourcesContent":["import { z } from \"zod\";\n\nimport { defineAction } from \"../../action.js\";\nimport type { UserProfile } from \"../shared.js\";\nimport { updateUserProfile } from \"../store.js\";\n\nexport default defineAction({\n description:\n \"Update the current user's display name used across Agent-Native apps. Do not change the user's email address with this action.\",\n schema: z.object({\n name: z\n .string()\n .trim()\n .min(1)\n .max(120)\n .describe(\n \"The display name to use when referring to the signed-in user.\",\n ),\n }),\n run: async ({ name }, ctx): Promise<UserProfile> => {\n if (!ctx?.userEmail) throw new Error(\"Not authenticated.\");\n return updateUserProfile(ctx.userEmail, name);\n },\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/user-profile/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,KAAK,WAAW,GACjB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/user-profile/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,wBAAwB,GAEzB,MAAM,aAAa,CAAC","sourcesContent":["export {\n normalizeUserProfileName,\n USER_PROFILE_SETTING_KEY,\n type UserProfile,\n} from \"./shared.js\";\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const USER_PROFILE_SETTING_KEY = "user-profile";
|
|
2
|
+
export interface UserProfile {
|
|
3
|
+
email: string;
|
|
4
|
+
name: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function normalizeUserProfileName(value: string | null | undefined, email: string): string;
|
|
7
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/user-profile/shared.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,wBAAwB,iBAAiB,CAAC;AAEvD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAChC,KAAK,EAAE,MAAM,GACZ,MAAM,CAGR"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/user-profile/shared.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,wBAAwB,GAAG,cAAc,CAAC;AAOvD,MAAM,UAAU,wBAAwB,CACtC,KAAgC,EAChC,KAAa;IAEb,MAAM,IAAI,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IAC3B,OAAO,IAAI,IAAI,KAAK,CAAC;AACvB,CAAC","sourcesContent":["export const USER_PROFILE_SETTING_KEY = \"user-profile\";\n\nexport interface UserProfile {\n email: string;\n name: string;\n}\n\nexport function normalizeUserProfileName(\n value: string | null | undefined,\n email: string,\n): string {\n const name = value?.trim();\n return name || email;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/user-profile/store.ts"],"names":[],"mappings":"AAKA,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AASrB,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAUxE;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,WAAW,CAAC,CAgBtB"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { getBetterAuthInternalAdapter, getBetterAuthSync, } from "../server/better-auth-instance.js";
|
|
2
|
+
import { getUserSetting, putUserSetting } from "../settings/user-settings.js";
|
|
3
|
+
import { normalizeUserProfileName, USER_PROFILE_SETTING_KEY, } from "./shared.js";
|
|
4
|
+
async function getAuthUser(email) {
|
|
5
|
+
if (!getBetterAuthSync())
|
|
6
|
+
return null;
|
|
7
|
+
const adapter = await getBetterAuthInternalAdapter().catch(() => undefined);
|
|
8
|
+
if (!adapter)
|
|
9
|
+
return null;
|
|
10
|
+
return adapter.findUserByEmail(email, { includeAccounts: false });
|
|
11
|
+
}
|
|
12
|
+
export async function getUserProfile(email) {
|
|
13
|
+
const stored = await getUserSetting(email, USER_PROFILE_SETTING_KEY);
|
|
14
|
+
const authUser = await getAuthUser(email);
|
|
15
|
+
const authName = authUser?.user.name;
|
|
16
|
+
const storedName = typeof stored?.name === "string" ? stored.name : null;
|
|
17
|
+
return {
|
|
18
|
+
email,
|
|
19
|
+
name: normalizeUserProfileName(storedName ?? authName, email),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export async function updateUserProfile(email, name) {
|
|
23
|
+
const normalizedName = normalizeUserProfileName(name, email);
|
|
24
|
+
const authUser = await getAuthUser(email);
|
|
25
|
+
const adapter = authUser
|
|
26
|
+
? await getBetterAuthInternalAdapter().catch(() => undefined)
|
|
27
|
+
: undefined;
|
|
28
|
+
if (authUser?.user.id && adapter?.updateUser) {
|
|
29
|
+
await adapter.updateUser(authUser.user.id, { name: normalizedName });
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
await putUserSetting(email, USER_PROFILE_SETTING_KEY, {
|
|
33
|
+
name: normalizedName,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
return { email, name: normalizedName };
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/user-profile/store.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,4BAA4B,EAC5B,iBAAiB,GAClB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EACL,wBAAwB,EACxB,wBAAwB,GAEzB,MAAM,aAAa,CAAC;AAErB,KAAK,UAAU,WAAW,CAAC,KAAa;IACtC,IAAI,CAAC,iBAAiB,EAAE;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,OAAO,GAAG,MAAM,4BAA4B,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC5E,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO,OAAO,CAAC,eAAe,CAAC,KAAK,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAa;IAChD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC;IACrC,MAAM,UAAU,GAAG,OAAO,MAAM,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAEzE,OAAO;QACL,KAAK;QACL,IAAI,EAAE,wBAAwB,CAAC,UAAU,IAAI,QAAQ,EAAE,KAAK,CAAC;KAC9D,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAa,EACb,IAAY;IAEZ,MAAM,cAAc,GAAG,wBAAwB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,QAAQ;QACtB,CAAC,CAAC,MAAM,4BAA4B,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;QAC7D,CAAC,CAAC,SAAS,CAAC;IAEd,IAAI,QAAQ,EAAE,IAAI,CAAC,EAAE,IAAI,OAAO,EAAE,UAAU,EAAE,CAAC;QAC7C,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;IACvE,CAAC;SAAM,CAAC;QACN,MAAM,cAAc,CAAC,KAAK,EAAE,wBAAwB,EAAE;YACpD,IAAI,EAAE,cAAc;SACrB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;AACzC,CAAC","sourcesContent":["import {\n getBetterAuthInternalAdapter,\n getBetterAuthSync,\n} from \"../server/better-auth-instance.js\";\nimport { getUserSetting, putUserSetting } from \"../settings/user-settings.js\";\nimport {\n normalizeUserProfileName,\n USER_PROFILE_SETTING_KEY,\n type UserProfile,\n} from \"./shared.js\";\n\nasync function getAuthUser(email: string) {\n if (!getBetterAuthSync()) return null;\n const adapter = await getBetterAuthInternalAdapter().catch(() => undefined);\n if (!adapter) return null;\n return adapter.findUserByEmail(email, { includeAccounts: false });\n}\n\nexport async function getUserProfile(email: string): Promise<UserProfile> {\n const stored = await getUserSetting(email, USER_PROFILE_SETTING_KEY);\n const authUser = await getAuthUser(email);\n const authName = authUser?.user.name;\n const storedName = typeof stored?.name === \"string\" ? stored.name : null;\n\n return {\n email,\n name: normalizeUserProfileName(storedName ?? authName, email),\n };\n}\n\nexport async function updateUserProfile(\n email: string,\n name: string,\n): Promise<UserProfile> {\n const normalizedName = normalizeUserProfileName(name, email);\n const authUser = await getAuthUser(email);\n const adapter = authUser\n ? await getBetterAuthInternalAdapter().catch(() => undefined)\n : undefined;\n\n if (authUser?.user.id && adapter?.updateUser) {\n await adapter.updateUser(authUser.user.id, { name: normalizedName });\n } else {\n await putUserSetting(email, USER_PROFILE_SETTING_KEY, {\n name: normalizedName,\n });\n }\n\n return { email, name: normalizedName };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-native/core",
|
|
3
|
-
"version": "0.117.
|
|
3
|
+
"version": "0.117.2",
|
|
4
4
|
"description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
|
|
5
5
|
"homepage": "https://github.com/BuilderIO/agent-native#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -162,6 +162,7 @@
|
|
|
162
162
|
},
|
|
163
163
|
"./application-state": "./dist/application-state/index.js",
|
|
164
164
|
"./settings": "./dist/settings/index.js",
|
|
165
|
+
"./user-profile": "./dist/user-profile/index.js",
|
|
165
166
|
"./feature-flags": "./dist/feature-flags/index.js",
|
|
166
167
|
"./feature-flags/registry": "./dist/feature-flags/registry.js",
|
|
167
168
|
"./feature-flags/actions/get-feature-flags": "./dist/feature-flags/actions/get-feature-flags.js",
|
|
@@ -1933,7 +1933,7 @@ function renderHtml(sessions, args) {
|
|
|
1933
1933
|
return "<!doctype html><html><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"><title>Context X-Ray</title><style>" +
|
|
1934
1934
|
"@import url(\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap\");" +
|
|
1935
1935
|
":root{--background:0 0% 100%;--foreground:220 10% 10%;--card:0 0% 100%;--muted:220 10% 95%;--muted-foreground:220 5% 45%;--accent:220 10% 92%;--border:220 10% 90%;--ring:220 10% 55%;--destructive:0 84% 60%;--radius:.5rem;--shadow:0 1px 2px rgba(16,24,40,.06);}" +
|
|
1936
|
-
"@media(prefers-color-scheme:dark){:root{--background:220 10% 7%;--foreground:220 8% 92%;--card:220 9% 9%;--muted:220 8% 15%;--muted-foreground:220 6% 64%;--accent:220 8% 17%;--border:220 8% 18%;--ring:220 8% 54%;--destructive:0
|
|
1936
|
+
"@media(prefers-color-scheme:dark){:root{--background:220 10% 7%;--foreground:220 8% 92%;--card:220 9% 9%;--muted:220 8% 15%;--muted-foreground:220 6% 64%;--accent:220 8% 17%;--border:220 8% 18%;--ring:220 8% 54%;--destructive:0 84% 60%;--shadow:none;}}" +
|
|
1937
1937
|
"*{box-sizing:border-box}html{background:hsl(var(--background))}body{margin:0;background:hsl(var(--background));color:hsl(var(--foreground));font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;font-feature-settings:\"cv02\",\"cv03\",\"cv04\",\"cv11\";line-height:1.45}button{font:inherit;color:inherit}main{max-width:1180px;margin:0 auto;padding:20px 18px 44px}.topbar{border-bottom:1px solid hsl(var(--border));background:hsl(var(--background));position:sticky;top:0;z-index:10}.topbar-inner{max-width:1180px;margin:0 auto;padding:14px 18px;display:flex;align-items:center;justify-content:space-between;gap:16px}.title-row{display:flex;align-items:center;gap:9px}.logo-dot{width:10px;height:10px;border-radius:999px;background:#38bdf8;box-shadow:0 0 0 4px rgba(56,189,248,.12)}h1{font-size:20px;line-height:1.1;margin:0;font-weight:650;letter-spacing:0}h2{font-size:15px;line-height:1.2;margin:0;font-weight:650}h3{font-size:14px;line-height:1.3;margin:0;font-weight:600}p{margin:0}.muted,.eyebrow,.meta,.empty{color:hsl(var(--muted-foreground))}.eyebrow{text-transform:uppercase;letter-spacing:.08em;font-size:11px;font-weight:650}.meta{font-size:12px}.tabs{display:inline-flex;align-items:center;gap:2px;border:1px solid hsl(var(--border));background:hsl(var(--muted)/.35);border-radius:8px;padding:2px}.tab{border:0;background:transparent;border-radius:6px;padding:6px 10px;font-size:12px;line-height:1.1;cursor:pointer}.tab:hover{background:hsl(var(--accent)/.5)}.tab.active{background:hsl(var(--background));box-shadow:var(--shadow)}.stats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin:18px 0}.card{background:hsl(var(--card));border:1px solid hsl(var(--border));border-radius:8px;padding:14px;box-shadow:var(--shadow)}.stat-value{display:block;font-size:28px;line-height:1.1;font-weight:700;margin-top:6px}.panel{display:none}.panel.active{display:block}.grid{display:grid;grid-template-columns:minmax(0,1.35fr) minmax(280px,.8fr);gap:14px;align-items:start}.grid.equal{grid-template-columns:repeat(2,minmax(0,1fr))}.section-head{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;margin-bottom:12px}.bar{display:flex;overflow:hidden;height:10px;border-radius:999px;background:hsl(var(--muted));margin:10px 0 12px}.bar span{display:block;min-width:2px}.table{width:100%;border-collapse:collapse;font-size:12px}.table th{text-align:left;color:hsl(var(--muted-foreground));font-weight:600;border-bottom:1px solid hsl(var(--border));padding:7px 8px}.table td{border-bottom:1px solid hsl(var(--border));padding:8px;vertical-align:top}.table th:last-child,.table td:last-child{text-align:right}.row-button{width:100%;display:grid;grid-template-columns:minmax(0,1fr) 74px 70px;gap:10px;align-items:center;text-align:left;border:1px solid transparent;background:transparent;border-radius:6px;padding:8px;cursor:pointer}.row-button:hover,.row-button.active{border-color:hsl(var(--border));background:hsl(var(--accent)/.35)}.row-title{font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row-meta{font-size:12px;color:hsl(var(--muted-foreground));text-align:right}.badge-list{display:flex;flex-wrap:wrap;gap:6px}.badge{display:inline-flex;align-items:center;gap:5px;border:1px solid hsl(var(--border));border-radius:999px;padding:3px 7px;font-size:11px;background:hsl(var(--background));max-width:100%}.badge .dot{width:7px;height:7px;border-radius:999px;flex:0 0 auto}.tips{margin:0;padding-left:20px}.tips li{margin:0 0 8px}.detail{min-height:228px}.detail-list{display:grid;gap:8px;margin-top:10px}.sample{border:1px solid hsl(var(--border));border-radius:8px;padding:10px;background:hsl(var(--muted)/.22)}.sample-top{display:flex;justify-content:space-between;gap:10px;margin-bottom:5px;font-size:11px;color:hsl(var(--muted-foreground))}.sample p{font-size:12px;color:hsl(var(--foreground));overflow-wrap:anywhere}.session-card{border:1px solid hsl(var(--border));border-radius:8px;background:hsl(var(--card));margin-bottom:10px;overflow:hidden}.session-card summary{list-style:none;display:flex;justify-content:space-between;gap:14px;cursor:pointer;padding:13px 14px}.session-card summary::-webkit-details-marker{display:none}.session-body{border-top:1px solid hsl(var(--border));padding:12px 14px}.session-title{font-size:13px;font-weight:650;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.session-path{font-size:12px;color:hsl(var(--muted-foreground));margin-top:3px;overflow-wrap:anywhere}.token-big{font-size:20px;font-weight:700;white-space:nowrap}.mini-label{margin:10px 0 6px;font-size:11px;text-transform:uppercase;letter-spacing:.08em;font-weight:650;color:hsl(var(--muted-foreground))}.footer{margin-top:20px;color:hsl(var(--muted-foreground));font-size:12px}.hidden{display:none!important}@media(max-width:840px){.topbar-inner{align-items:flex-start;flex-direction:column}.stats,.grid,.grid.equal{grid-template-columns:1fr}.tabs{width:100%;overflow:auto}.tab{white-space:nowrap}.row-button{grid-template-columns:minmax(0,1fr) 64px 58px}.session-card summary{align-items:flex-start;flex-direction:column}}" +
|
|
1938
1938
|
"</style></head><body><header class=\"topbar\"><div class=\"topbar-inner\"><div><div class=\"title-row\"><span class=\"logo-dot\"></span><h1>Context X-Ray</h1></div><p class=\"meta\">Generated " + escapeHtml(report.generatedLabel) + " · mode=" + escapeHtml(report.mode) + " · source=" + escapeHtml(report.source) + " · since=" + escapeHtml(report.since) + "</p></div><nav class=\"tabs\" aria-label=\"Report views\"><button class=\"tab active\" data-tab=\"overview\">Overview</button><button class=\"tab\" data-tab=\"tools\">Tool Calls</button><button class=\"tab\" data-tab=\"mcp\">MCP</button><button class=\"tab\" data-tab=\"metadata\">Metadata</button><button class=\"tab\" data-tab=\"sessions\">Sessions</button></nav></div></header><main><section class=\"stats\" id=\"stats\"></section><section class=\"panel active\" id=\"panel-overview\"></section><section class=\"panel\" id=\"panel-tools\"></section><section class=\"panel\" id=\"panel-mcp\"></section><section class=\"panel\" id=\"panel-metadata\"></section><section class=\"panel\" id=\"panel-sessions\"></section><p class=\"footer\">Reads local transcript and MCP config files only. No transcript content is uploaded.</p></main><script type=\"application/json\" id=\"xray-data\">" + jsonScript(report) + "</script><script>" +
|
|
1939
1939
|
"(function(){var report=JSON.parse(document.getElementById('xray-data').textContent);var cats=['user','assistant','tool_call','tool_output','reasoning','instructions','attachment','metadata','other'];var labels={user:'User asks',assistant:'Assistant text',tool_call:'Tool calls',tool_output:'Tool output',reasoning:'Reasoning',instructions:'Instructions/context',attachment:'Attachments',metadata:'Metadata',other:'Other'};var colors={user:'#8ba8ff',assistant:'#55b982',tool_call:'#f0a85b',tool_output:'#e06b73',reasoning:'#a77be8',instructions:'#6ac3d5',attachment:'#d6a85a',metadata:'#9aa3ad',other:'#c3c8ce'};function esc(v){return String(v||'').replace(/[&<>\"']/g,function(ch){return {'&':'&','<':'<','>':'>','\"':'"',\"'\":'''}[ch];});}function fmt(n){n=Number(n)||0;if(n>=1000000)return(n/1000000).toFixed(1)+'m';if(n>=1000)return(n/1000).toFixed(1)+'k';return String(n);}function tok(chars){chars=Number(chars)||0;return chars>0?Math.max(1,Math.ceil(chars/4)):0;}function pc(part,total){return total>0?Math.max(0,Math.min(100,(part/total)*100)):0;}function totalCounter(counter){return Object.keys(counter||{}).reduce(function(sum,key){return sum+(Number(counter[key])||0);},0);}function bar(counter){var total=totalCounter(counter);if(!total)return'<div class=\"bar\"></div>';return'<div class=\"bar\">'+cats.map(function(cat){var value=counter[cat]||0;if(!value)return'';return'<span title=\"'+esc(labels[cat])+'\" style=\"width:'+Math.max(1,pc(value,total)).toFixed(2)+'%;background:'+colors[cat]+'\"></span>';}).join('')+'</div>';}function metric(label,value){return'<article class=\"card\"><div class=\"eyebrow\">'+esc(label)+'</div><span class=\"stat-value\">'+esc(value)+'</span></article>';}function tableRows(entries,kind){if(!entries||!entries.length)return'<tr><td>None detected</td><td></td></tr>';return entries.map(function(entry){var value=entry[1];var shown=kind==='chars'?fmt(tok(value)):(kind==='tokens'?fmt(value):String(value));return'<tr><td>'+esc(entry[0])+'</td><td>'+esc(shown)+'</td></tr>';}).join('');}function toolToken(name){var found=(report.toolTokens||[]).filter(function(entry){return entry[0]===name;})[0];return found?found[1]:0;}function renderStats(){var counts=report.sourceCounts||{};document.getElementById('stats').innerHTML=metric('Sessions',report.sessionCount)+metric('Observed/estimated tokens',fmt(report.totalTokens))+metric('Codex',counts.codex||0)+metric('Claude',counts.claude||0);}function renderOverview(){var categoryTotal=totalCounter(report.categories);var categoryRows=cats.map(function(cat){var chars=(report.categories||{})[cat]||0;if(!chars)return'';return'<tr><td><span class=\"badge\"><span class=\"dot\" style=\"background:'+colors[cat]+'\"></span>'+esc(labels[cat])+'</span></td><td>'+fmt(tok(chars))+'</td><td>'+pc(chars,categoryTotal).toFixed(0)+'%</td></tr>';}).join('');document.getElementById('panel-overview').innerHTML='<div class=\"grid\"><section class=\"card\"><div class=\"section-head\"><div><h2>Where The Context Is Going</h2><p class=\"meta\">Approximate contribution by transcript bucket.</p></div></div>'+bar(report.categories)+'<table class=\"table\"><tbody>'+categoryRows+'</tbody></table></section><section class=\"card\"><div class=\"section-head\"><div><h2>Warnings And Optimizations</h2><p class=\"meta\">Promptable changes you control.</p></div></div><ol class=\"tips\">'+(report.recommendations||[]).map(function(tip){return'<li>'+esc(tip)+'</li>';}).join('')+'</ol></section></div><div class=\"grid equal\" style=\"margin-top:14px\"><section class=\"card\"><h2>Top Paths</h2><table class=\"table\"><tbody>'+tableRows(report.paths,'count')+'</tbody></table></section><section class=\"card\"><h2>Metadata Types</h2><table class=\"table\"><tbody>'+tableRows(report.metadata,'chars')+'</tbody></table></section></div>';}function renderTools(){var rows=(report.tools||[]).map(function(entry,index){var name=entry[0];var count=entry[1];return'<button class=\"row-button'+(index===0?' active':'')+'\" data-tool=\"'+esc(name)+'\"><span><span class=\"row-title\">'+esc(name)+'</span><span class=\"meta\">Click to inspect sampled calls</span></span><span class=\"row-meta\">x'+count+'</span><span class=\"row-meta\">'+fmt(toolToken(name))+' tok</span></button>';}).join('')||'<div class=\"empty\">No tool calls detected in these sessions.</div>';document.getElementById('panel-tools').innerHTML='<div class=\"grid\"><section class=\"card\"><div class=\"section-head\"><div><h2>Tool Calls</h2><p class=\"meta\">Calls are clickable; samples are capped so the report stays light.</p></div></div><div>'+rows+'</div></section><aside class=\"card detail\" id=\"tool-detail\"></aside></div>';Array.prototype.forEach.call(document.querySelectorAll('[data-tool]'),function(btn){btn.addEventListener('click',function(){Array.prototype.forEach.call(document.querySelectorAll('[data-tool]'),function(item){item.classList.remove('active');});btn.classList.add('active');renderToolDetail(btn.getAttribute('data-tool'));});});if((report.tools||[]).length)renderToolDetail(report.tools[0][0]);else document.getElementById('tool-detail').innerHTML='<h2>Tool Detail</h2><p class=\"empty\">Nothing to inspect yet.</p>';}function renderToolDetail(name){var events=(report.toolEvents||[]).filter(function(event){return event.tool===name;}).slice(0,30);document.getElementById('tool-detail').innerHTML='<div class=\"section-head\"><div><h2>'+esc(name)+'</h2><p class=\"meta\">'+events.length+' sampled call'+(events.length===1?'':'s')+'</p></div></div><div class=\"detail-list\">'+(events.map(function(event){return'<article class=\"sample\"><div class=\"sample-top\"><span>'+esc(event.source)+' · '+esc(event.sessionTitle||event.sessionId)+'</span><span>'+fmt(event.tokens||0)+' tok</span></div><p>'+esc(event.preview||'No preview captured.')+'</p></article>';}).join('')||'<p class=\"empty\">No sampled call payloads for this tool.</p>')+'</div>';}function renderMcp(){var servers=report.mcpServers||[];var usage=report.mcpUsage||[];var configured=servers.map(function(server){return'<button class=\"row-button\" data-mcp=\"'+esc(server.name)+'\"><span><span class=\"row-title\">'+esc(server.name)+'</span><span class=\"meta\">'+esc(server.source)+' · '+esc(server.target)+'</span></span><span class=\"row-meta\">config</span><span class=\"row-meta\"></span></button>';}).join('')||'<div class=\"empty\">No MCP server config found in the common local config files.</div>';var detected=usage.map(function(entry,index){return'<button class=\"row-button'+(!servers.length&&index===0?' active':'')+'\" data-mcp=\"'+esc(entry[0])+'\"><span><span class=\"row-title\">'+esc(entry[0])+'</span><span class=\"meta\">Detected from mcp__server__tool style names</span></span><span class=\"row-meta\">x'+entry[1]+'</span><span class=\"row-meta\"></span></button>';}).join('')||'<div class=\"empty\">No MCP-prefixed tool calls detected in the selected sessions.</div>';document.getElementById('panel-mcp').innerHTML='<div class=\"grid\"><section class=\"card\"><div class=\"section-head\"><div><h2>MCP Servers</h2><p class=\"meta\">Configured locally plus inferred calls from transcripts.</p></div></div><div class=\"mini-label\">Configured</div>'+configured+'<div class=\"mini-label\">Detected usage</div>'+detected+'</section><aside class=\"card detail\" id=\"mcp-detail\"></aside></div>';Array.prototype.forEach.call(document.querySelectorAll('[data-mcp]'),function(btn){btn.addEventListener('click',function(){Array.prototype.forEach.call(document.querySelectorAll('[data-mcp]'),function(item){item.classList.remove('active');});btn.classList.add('active');renderMcpDetail(btn.getAttribute('data-mcp'));});});if(usage.length)renderMcpDetail(usage[0][0]);else if(servers.length)renderMcpDetail(servers[0].name);else document.getElementById('mcp-detail').innerHTML='<h2>MCP Detail</h2><p class=\"empty\">Install or run sessions with MCP tools to see usage here.</p>';}function renderMcpDetail(name){var server=(report.mcpServers||[]).filter(function(item){return item.name===name;})[0];var tools=(report.mcpTools||[]).filter(function(entry){return entry[0].indexOf(name+' / ')===0;});var events=(report.toolEvents||[]).filter(function(event){return event.mcpServer===name;}).slice(0,25);document.getElementById('mcp-detail').innerHTML='<div class=\"section-head\"><div><h2>'+esc(name)+'</h2><p class=\"meta\">'+(server?esc(server.source+' · '+server.target):'Detected from tool call names')+'</p></div></div><div class=\"mini-label\">Tools</div><table class=\"table\"><tbody>'+tableRows(tools,'count')+'</tbody></table><div class=\"mini-label\">Sample calls</div><div class=\"detail-list\">'+(events.map(function(event){return'<article class=\"sample\"><div class=\"sample-top\"><span>'+esc(event.mcpTool||event.tool)+'</span><span>'+fmt(event.tokens||0)+' tok</span></div><p>'+esc(event.preview||'No preview captured.')+'</p></article>';}).join('')||'<p class=\"empty\">No sampled MCP calls for this server in the selected sessions.</p>')+'</div>';}function renderMetadata(){var rows=(report.metadata||[]).map(function(entry,index){return'<button class=\"row-button'+(index===0?' active':'')+'\" data-meta=\"'+esc(entry[0])+'\"><span><span class=\"row-title\">'+esc(entry[0])+'</span><span class=\"meta\">Click to inspect sampled records</span></span><span class=\"row-meta\">'+fmt(tok(entry[1]))+' tok</span><span class=\"row-meta\">'+fmt(entry[1])+' ch</span></button>';}).join('')||'<div class=\"empty\">No metadata-heavy records detected.</div>';document.getElementById('panel-metadata').innerHTML='<div class=\"grid\"><section class=\"card\"><div class=\"section-head\"><div><h2>Metadata</h2><p class=\"meta\">Breakdown by transcript record type.</p></div></div>'+rows+'</section><aside class=\"card detail\" id=\"metadata-detail\"></aside></div>';Array.prototype.forEach.call(document.querySelectorAll('[data-meta]'),function(btn){btn.addEventListener('click',function(){Array.prototype.forEach.call(document.querySelectorAll('[data-meta]'),function(item){item.classList.remove('active');});btn.classList.add('active');renderMetadataDetail(btn.getAttribute('data-meta'));});});if((report.metadata||[]).length)renderMetadataDetail(report.metadata[0][0]);else document.getElementById('metadata-detail').innerHTML='<h2>Metadata Detail</h2><p class=\"empty\">Nothing to inspect yet.</p>';}function renderMetadataDetail(type){var events=(report.metadataEvents||[]).filter(function(event){return event.type===type;}).slice(0,30);document.getElementById('metadata-detail').innerHTML='<div class=\"section-head\"><div><h2>'+esc(type)+'</h2><p class=\"meta\">'+events.length+' sampled record'+(events.length===1?'':'s')+'</p></div></div><div class=\"detail-list\">'+(events.map(function(event){return'<article class=\"sample\"><div class=\"sample-top\"><span>'+esc(event.source)+' · '+esc(event.sessionTitle||event.sessionId)+'</span><span>'+fmt(event.tokens||0)+' tok</span></div><p>'+esc(event.preview||'No preview captured.')+'</p></article>';}).join('')||'<p class=\"empty\">No sampled records for this metadata type.</p>')+'</div>';}function renderSessions(){document.getElementById('panel-sessions').innerHTML=(report.sessions||[]).map(function(session,index){var catRows=Object.keys(session.categories||{}).sort(function(a,b){return session.categories[b]-session.categories[a];}).map(function(cat){var chars=session.categories[cat];return'<tr><td>'+esc(labels[cat]||cat)+'</td><td>'+fmt(tok(chars))+'</td><td>'+pc(chars,session.totalChars||0).toFixed(0)+'%</td></tr>';}).join('');var tools=(session.tools?Object.keys(session.tools):[]).sort(function(a,b){return session.tools[b]-session.tools[a];}).slice(0,8).map(function(name){return'<span class=\"badge\">'+esc(name)+' x'+session.tools[name]+'</span>';}).join('')||'<span class=\"empty\">none detected</span>';var paths=(session.paths?Object.keys(session.paths):[]).sort(function(a,b){return session.paths[b]-session.paths[a];}).slice(0,8).map(function(name){return'<span class=\"badge\">'+esc(name)+' x'+session.paths[name]+'</span>';}).join('')||'<span class=\"empty\">none detected</span>';return'<details class=\"session-card\"'+(index===0?' open':'')+'><summary><span><span class=\"eyebrow\">'+esc(session.source)+' · '+esc(session.updatedAt||'unknown time')+'</span><span class=\"session-title\">'+esc(session.title||session.sessionId)+'</span><span class=\"session-path\">'+esc(session.cwd||session.path)+'</span></span><span class=\"token-big\">'+fmt(session.tokens)+'</span></summary><div class=\"session-body\">'+bar(session.categories)+'<div class=\"grid equal\"><div><div class=\"mini-label\">Buckets</div><table class=\"table\"><tbody>'+catRows+'</tbody></table></div><div><div class=\"mini-label\">Frequent tools</div><div class=\"badge-list\">'+tools+'</div><div class=\"mini-label\">Repeated paths</div><div class=\"badge-list\">'+paths+'</div></div></div></div></details>';}).join('')||'<section class=\"card\"><p class=\"empty\">No matching sessions found.</p></section>';}function activate(name){Array.prototype.forEach.call(document.querySelectorAll('.tab'),function(tab){tab.classList.toggle('active',tab.getAttribute('data-tab')===name);});Array.prototype.forEach.call(document.querySelectorAll('.panel'),function(panel){panel.classList.toggle('active',panel.id==='panel-'+name);});if(location.hash!=='#'+name)history.replaceState(null,'','#'+name);}Array.prototype.forEach.call(document.querySelectorAll('.tab'),function(tab){tab.addEventListener('click',function(){activate(tab.getAttribute('data-tab'));});});renderStats();renderOverview();renderTools();renderMcp();renderMetadata();renderSessions();var initial=(location.hash||'#overview').slice(1);if(document.getElementById('panel-'+initial))activate(initial);})();" +
|
|
@@ -1463,7 +1463,7 @@ function ToolMoreMenu({
|
|
|
1463
1463
|
<span>
|
|
1464
1464
|
{canDelete === false
|
|
1465
1465
|
? "Remove from my list..."
|
|
1466
|
-
: "
|
|
1466
|
+
: "Archive extension..."}
|
|
1467
1467
|
</span>
|
|
1468
1468
|
</button>
|
|
1469
1469
|
</div>
|
|
@@ -1472,11 +1472,11 @@ function ToolMoreMenu({
|
|
|
1472
1472
|
) : (
|
|
1473
1473
|
<div className="flex flex-col gap-2 p-3">
|
|
1474
1474
|
<p className="text-[12px]">
|
|
1475
|
-
{canDelete === false ? "Remove " : "
|
|
1475
|
+
{canDelete === false ? "Remove " : "Archive "}
|
|
1476
1476
|
<span className="font-medium">{toolName}</span>?
|
|
1477
1477
|
{canDelete === false
|
|
1478
1478
|
? " This hides it from your Extensions list without deleting it for anyone else."
|
|
1479
|
-
: " This
|
|
1479
|
+
: " This archives the extension everywhere, for everyone it's shared with."}
|
|
1480
1480
|
</p>
|
|
1481
1481
|
<div className="flex justify-end gap-1">
|
|
1482
1482
|
<button
|
|
@@ -1491,7 +1491,7 @@ function ToolMoreMenu({
|
|
|
1491
1491
|
onClick={deleteExtension}
|
|
1492
1492
|
className="rounded-md bg-destructive px-2 py-1 text-[12px] text-destructive-foreground hover:bg-destructive/90 cursor-pointer"
|
|
1493
1493
|
>
|
|
1494
|
-
{canDelete === false ? "Remove" : "
|
|
1494
|
+
{canDelete === false ? "Remove" : "Archive"}
|
|
1495
1495
|
</button>
|
|
1496
1496
|
</div>
|
|
1497
1497
|
</div>
|
|
@@ -149,7 +149,7 @@ const EXTENSIONS_COPY: Record<LocaleCode, ExtensionsCopy> = {
|
|
|
149
149
|
unhideForEveryone: "Unhide for everyone",
|
|
150
150
|
hideFromEveryone: "Hide from everyone",
|
|
151
151
|
removeFromMyList: "Remove from my list",
|
|
152
|
-
delete: "
|
|
152
|
+
delete: "Archive",
|
|
153
153
|
showLess: "show less",
|
|
154
154
|
showMore: "show more",
|
|
155
155
|
loadError: "Couldn't load extensions.",
|
|
@@ -182,7 +182,7 @@ const EXTENSIONS_COPY: Record<LocaleCode, ExtensionsCopy> = {
|
|
|
182
182
|
unhideForEveryone: "对所有人取消隐藏",
|
|
183
183
|
hideFromEveryone: "对所有人隐藏",
|
|
184
184
|
removeFromMyList: "从我的列表中移除",
|
|
185
|
-
delete: "
|
|
185
|
+
delete: "归档",
|
|
186
186
|
showLess: "收起",
|
|
187
187
|
showMore: "显示更多",
|
|
188
188
|
loadError: "无法加载扩展。",
|
|
@@ -216,7 +216,7 @@ const EXTENSIONS_COPY: Record<LocaleCode, ExtensionsCopy> = {
|
|
|
216
216
|
unhideForEveryone: "對所有人取消隱藏",
|
|
217
217
|
hideFromEveryone: "對所有人隱藏",
|
|
218
218
|
removeFromMyList: "從我的清單移除",
|
|
219
|
-
delete: "
|
|
219
|
+
delete: "封存",
|
|
220
220
|
showLess: "顯示較少",
|
|
221
221
|
showMore: "顯示更多",
|
|
222
222
|
loadError: "無法載入擴充功能。",
|
|
@@ -250,7 +250,7 @@ const EXTENSIONS_COPY: Record<LocaleCode, ExtensionsCopy> = {
|
|
|
250
250
|
unhideForEveryone: "Mostrar para todos",
|
|
251
251
|
hideFromEveryone: "Ocultar para todos",
|
|
252
252
|
removeFromMyList: "Quitar de mi lista",
|
|
253
|
-
delete: "
|
|
253
|
+
delete: "Archivar",
|
|
254
254
|
showLess: "mostrar menos",
|
|
255
255
|
showMore: "mostrar más",
|
|
256
256
|
loadError: "No se pudieron cargar las extensiones.",
|
|
@@ -284,7 +284,7 @@ const EXTENSIONS_COPY: Record<LocaleCode, ExtensionsCopy> = {
|
|
|
284
284
|
unhideForEveryone: "Afficher pour tout le monde",
|
|
285
285
|
hideFromEveryone: "Masquer pour tout le monde",
|
|
286
286
|
removeFromMyList: "Retirer de ma liste",
|
|
287
|
-
delete: "
|
|
287
|
+
delete: "Archiver",
|
|
288
288
|
showLess: "afficher moins",
|
|
289
289
|
showMore: "afficher plus",
|
|
290
290
|
loadError: "Impossible de charger les extensions.",
|
|
@@ -318,7 +318,7 @@ const EXTENSIONS_COPY: Record<LocaleCode, ExtensionsCopy> = {
|
|
|
318
318
|
unhideForEveryone: "Für alle einblenden",
|
|
319
319
|
hideFromEveryone: "Für alle ausblenden",
|
|
320
320
|
removeFromMyList: "Aus meiner Liste entfernen",
|
|
321
|
-
delete: "
|
|
321
|
+
delete: "Archivieren",
|
|
322
322
|
showLess: "weniger anzeigen",
|
|
323
323
|
showMore: "mehr anzeigen",
|
|
324
324
|
loadError: "Erweiterungen konnten nicht geladen werden.",
|
|
@@ -352,7 +352,7 @@ const EXTENSIONS_COPY: Record<LocaleCode, ExtensionsCopy> = {
|
|
|
352
352
|
unhideForEveryone: "全員に表示",
|
|
353
353
|
hideFromEveryone: "全員に非表示",
|
|
354
354
|
removeFromMyList: "自分のリストから削除",
|
|
355
|
-
delete: "
|
|
355
|
+
delete: "アーカイブ",
|
|
356
356
|
showLess: "少なく表示",
|
|
357
357
|
showMore: "さらに表示",
|
|
358
358
|
loadError: "拡張機能を読み込めませんでした。",
|
|
@@ -386,7 +386,7 @@ const EXTENSIONS_COPY: Record<LocaleCode, ExtensionsCopy> = {
|
|
|
386
386
|
unhideForEveryone: "모두에게 표시",
|
|
387
387
|
hideFromEveryone: "모두에게 숨기기",
|
|
388
388
|
removeFromMyList: "내 목록에서 제거",
|
|
389
|
-
delete: "
|
|
389
|
+
delete: "보관",
|
|
390
390
|
showLess: "덜 보기",
|
|
391
391
|
showMore: "더 보기",
|
|
392
392
|
loadError: "확장 프로그램을 불러올 수 없습니다.",
|
|
@@ -420,7 +420,7 @@ const EXTENSIONS_COPY: Record<LocaleCode, ExtensionsCopy> = {
|
|
|
420
420
|
unhideForEveryone: "Mostrar para todos",
|
|
421
421
|
hideFromEveryone: "Ocultar para todos",
|
|
422
422
|
removeFromMyList: "Remover da minha lista",
|
|
423
|
-
delete: "
|
|
423
|
+
delete: "Arquivar",
|
|
424
424
|
showLess: "mostrar menos",
|
|
425
425
|
showMore: "mostrar mais",
|
|
426
426
|
loadError: "Não foi possível carregar as extensões.",
|
|
@@ -454,7 +454,7 @@ const EXTENSIONS_COPY: Record<LocaleCode, ExtensionsCopy> = {
|
|
|
454
454
|
unhideForEveryone: "सभी के लिए दिखाएं",
|
|
455
455
|
hideFromEveryone: "सभी से छिपाएं",
|
|
456
456
|
removeFromMyList: "मेरी सूची से हटाएं",
|
|
457
|
-
delete: "
|
|
457
|
+
delete: "संग्रहित करें",
|
|
458
458
|
showLess: "कम दिखाएं",
|
|
459
459
|
showMore: "और दिखाएं",
|
|
460
460
|
loadError: "एक्सटेंशन लोड नहीं हो सके।",
|
|
@@ -488,7 +488,7 @@ const EXTENSIONS_COPY: Record<LocaleCode, ExtensionsCopy> = {
|
|
|
488
488
|
unhideForEveryone: "إظهار للجميع",
|
|
489
489
|
hideFromEveryone: "إخفاء عن الجميع",
|
|
490
490
|
removeFromMyList: "إزالة من قائمتي",
|
|
491
|
-
delete: "
|
|
491
|
+
delete: "أرشفة",
|
|
492
492
|
showLess: "إظهار أقل",
|
|
493
493
|
showMore: "إظهار المزيد",
|
|
494
494
|
loadError: "تعذر تحميل الإضافات.",
|
|
@@ -127,7 +127,7 @@ const defaultThemeCss = `
|
|
|
127
127
|
--border: 217.2 32.6% 17.5%;
|
|
128
128
|
--primary: 217.2 91.2% 59.8%;
|
|
129
129
|
--primary-foreground: 222.2 47.4% 11.2%;
|
|
130
|
-
--destructive: 0
|
|
130
|
+
--destructive: 0 84% 60%;
|
|
131
131
|
--destructive-foreground: 210 40% 98%;
|
|
132
132
|
}
|
|
133
133
|
html, body {
|
|
@@ -7,7 +7,7 @@ export interface ExtensionDeleteTarget {
|
|
|
7
7
|
canDelete?: boolean | null;
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
export type ExtensionDeleteResult = { mode: "
|
|
10
|
+
export type ExtensionDeleteResult = { mode: "archived" | "hidden" };
|
|
11
11
|
|
|
12
12
|
async function readErrorMessage(
|
|
13
13
|
res: Response,
|
|
@@ -55,7 +55,7 @@ export async function deleteOrHideExtension(
|
|
|
55
55
|
agentNativePath(`/_agent-native/extensions/${extension.id}`),
|
|
56
56
|
{ method: "DELETE" },
|
|
57
57
|
);
|
|
58
|
-
if (res.ok) return { mode: "
|
|
58
|
+
if (res.ok) return { mode: "archived" };
|
|
59
59
|
|
|
60
60
|
if (res.status === 403) {
|
|
61
61
|
return hideExtensionForCurrentUser(extension.id);
|
|
@@ -31,6 +31,7 @@ import {
|
|
|
31
31
|
IconSettings,
|
|
32
32
|
IconStack2,
|
|
33
33
|
IconUser,
|
|
34
|
+
IconUserCircle,
|
|
34
35
|
IconUserPlus,
|
|
35
36
|
IconUsers,
|
|
36
37
|
IconUsersGroup,
|
|
@@ -40,6 +41,8 @@ import { useState } from "react";
|
|
|
40
41
|
import { useNavigate } from "react-router";
|
|
41
42
|
|
|
42
43
|
import { agentNativePath } from "../api-path.js";
|
|
44
|
+
import { useT } from "../i18n.js";
|
|
45
|
+
import { useSession } from "../use-session.js";
|
|
43
46
|
import {
|
|
44
47
|
useOrg,
|
|
45
48
|
useSwitchOrg,
|
|
@@ -68,6 +71,8 @@ export interface OrgSwitcherProps {
|
|
|
68
71
|
* the in-sidebar settings panel.
|
|
69
72
|
*/
|
|
70
73
|
settingsPath?: string | null;
|
|
74
|
+
/** Path to navigate to when the user clicks "Profile". Defaults to the shared Account settings section. */
|
|
75
|
+
profilePath?: string | null;
|
|
71
76
|
}
|
|
72
77
|
|
|
73
78
|
function personalLabelFromEmail(email: string | null | undefined): string {
|
|
@@ -100,6 +105,7 @@ const SWITCHER_BUTTON_CLASS =
|
|
|
100
105
|
"flex w-full items-center gap-2 rounded-md border border-border/70 px-2.5 py-1.5 text-xs font-medium text-muted-foreground hover:bg-accent/50 hover:text-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-60 cursor-pointer";
|
|
101
106
|
|
|
102
107
|
const DEFAULT_ORGANIZATION_SETTINGS_PATH = "/settings#organization";
|
|
108
|
+
const DEFAULT_PROFILE_PATH = "/settings#account";
|
|
103
109
|
|
|
104
110
|
const APP_ICON_MAP: Record<string, typeof IconApps> = {
|
|
105
111
|
Mail: IconMail,
|
|
@@ -307,8 +313,11 @@ export function OrgSwitcher({
|
|
|
307
313
|
hideWhenSingle,
|
|
308
314
|
reserveSpace,
|
|
309
315
|
settingsPath = DEFAULT_ORGANIZATION_SETTINGS_PATH,
|
|
316
|
+
profilePath = DEFAULT_PROFILE_PATH,
|
|
310
317
|
}: OrgSwitcherProps) {
|
|
311
318
|
const { data: org, isLoading } = useOrg();
|
|
319
|
+
const { session } = useSession();
|
|
320
|
+
const t = useT();
|
|
312
321
|
const switchOrg = useSwitchOrg();
|
|
313
322
|
const createOrg = useCreateOrg();
|
|
314
323
|
const inviteMember = useInviteMember();
|
|
@@ -377,7 +386,7 @@ export function OrgSwitcher({
|
|
|
377
386
|
const canInvite =
|
|
378
387
|
!!org.orgId && (org.role === "owner" || org.role === "admin");
|
|
379
388
|
|
|
380
|
-
const personalLabel = personalLabelFromEmail(org.email);
|
|
389
|
+
const personalLabel = session?.name || personalLabelFromEmail(org.email);
|
|
381
390
|
const inOrg = !!org.orgId;
|
|
382
391
|
const buttonLabel = org.orgName ?? "Personal";
|
|
383
392
|
const ButtonIcon = inOrg ? IconUsersGroup : IconUser;
|
|
@@ -546,6 +555,21 @@ export function OrgSwitcher({
|
|
|
546
555
|
dispatchAllAppsHref={appLinks.dispatchAllAppsHref}
|
|
547
556
|
onNavigate={() => setOpen(false)}
|
|
548
557
|
/>
|
|
558
|
+
{profilePath && (
|
|
559
|
+
<button
|
|
560
|
+
type="button"
|
|
561
|
+
onClick={() => {
|
|
562
|
+
setOpen(false);
|
|
563
|
+
navigate(profilePath);
|
|
564
|
+
}}
|
|
565
|
+
className={`${ITEM_CLASS} cursor-pointer`}
|
|
566
|
+
>
|
|
567
|
+
<IconUserCircle className="h-3.5 w-3.5 shrink-0 text-muted-foreground" />
|
|
568
|
+
<span className="flex-1 text-start">
|
|
569
|
+
{t("settings.profileMenuItem")}
|
|
570
|
+
</span>
|
|
571
|
+
</button>
|
|
572
|
+
)}
|
|
549
573
|
{inOrg && (
|
|
550
574
|
<button
|
|
551
575
|
type="button"
|