@agent-native/core 0.7.18 → 0.7.20
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 +1 -1
- package/dist/agent/engine/builder-engine.d.ts.map +1 -1
- package/dist/agent/engine/builder-engine.js +60 -5
- package/dist/agent/engine/builder-engine.js.map +1 -1
- package/dist/agent/loop-settings.d.ts +37 -0
- package/dist/agent/loop-settings.d.ts.map +1 -0
- package/dist/agent/loop-settings.js +127 -0
- package/dist/agent/loop-settings.js.map +1 -0
- package/dist/agent/production-agent.d.ts +8 -0
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +268 -29
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-manager.d.ts.map +1 -1
- package/dist/agent/run-manager.js +76 -3
- package/dist/agent/run-manager.js.map +1 -1
- package/dist/agent/run-store.d.ts +1 -1
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +65 -2
- package/dist/agent/run-store.js.map +1 -1
- package/dist/agent/thread-data-builder.d.ts +3 -0
- package/dist/agent/thread-data-builder.d.ts.map +1 -1
- package/dist/agent/thread-data-builder.js +52 -10
- package/dist/agent/thread-data-builder.js.map +1 -1
- package/dist/agent/tool-search.d.ts +37 -0
- package/dist/agent/tool-search.d.ts.map +1 -0
- package/dist/agent/tool-search.js +201 -0
- package/dist/agent/tool-search.js.map +1 -0
- package/dist/agent/types.d.ts +8 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +57 -11
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/workspacify.d.ts +2 -0
- package/dist/cli/workspacify.d.ts.map +1 -1
- package/dist/cli/workspacify.js +34 -1
- package/dist/cli/workspacify.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +303 -14
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/ConnectBuilderCard.d.ts.map +1 -1
- package/dist/client/ConnectBuilderCard.js +1 -1
- package/dist/client/ConnectBuilderCard.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +16 -24
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/NewWorkspaceAppFlow.d.ts +14 -0
- package/dist/client/NewWorkspaceAppFlow.d.ts.map +1 -0
- package/dist/client/NewWorkspaceAppFlow.js +200 -0
- package/dist/client/NewWorkspaceAppFlow.js.map +1 -0
- package/dist/client/PoweredByBadge.d.ts +10 -1
- package/dist/client/PoweredByBadge.d.ts.map +1 -1
- package/dist/client/PoweredByBadge.js +120 -8
- package/dist/client/PoweredByBadge.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts +8 -0
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +32 -5
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/agent-chat.d.ts.map +1 -1
- package/dist/client/agent-chat.js +15 -3
- package/dist/client/agent-chat.js.map +1 -1
- package/dist/client/analytics.d.ts +1 -1
- package/dist/client/analytics.d.ts.map +1 -1
- package/dist/client/analytics.js +141 -1
- package/dist/client/analytics.js.map +1 -1
- package/dist/client/builder-frame.d.ts +10 -0
- package/dist/client/builder-frame.d.ts.map +1 -0
- package/dist/client/builder-frame.js +94 -0
- package/dist/client/builder-frame.js.map +1 -0
- package/dist/client/composer/MentionPopover.d.ts.map +1 -1
- package/dist/client/composer/MentionPopover.js +5 -1
- package/dist/client/composer/MentionPopover.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +11 -6
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/error-format.d.ts +20 -1
- package/dist/client/error-format.d.ts.map +1 -1
- package/dist/client/error-format.js +53 -5
- package/dist/client/error-format.js.map +1 -1
- package/dist/client/index.d.ts +3 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +3 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/onboarding/OnboardingPanel.d.ts.map +1 -1
- package/dist/client/onboarding/OnboardingPanel.js +88 -6
- package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
- package/dist/client/org/TeamPage.d.ts.map +1 -1
- package/dist/client/org/TeamPage.js +14 -2
- package/dist/client/org/TeamPage.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +145 -9
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/settings/useBuilderStatus.d.ts +13 -0
- package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
- package/dist/client/settings/useBuilderStatus.js +50 -9
- package/dist/client/settings/useBuilderStatus.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts +9 -1
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +95 -8
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/client/tools/ToolsListPage.d.ts.map +1 -1
- package/dist/client/tools/ToolsListPage.js +16 -1
- package/dist/client/tools/ToolsListPage.js.map +1 -1
- package/dist/client/tools/ToolsSidebarSection.d.ts.map +1 -1
- package/dist/client/tools/ToolsSidebarSection.js +63 -8
- package/dist/client/tools/ToolsSidebarSection.js.map +1 -1
- package/dist/client/tools/tool-order.d.ts +7 -0
- package/dist/client/tools/tool-order.d.ts.map +1 -0
- package/dist/client/tools/tool-order.js +47 -0
- package/dist/client/tools/tool-order.js.map +1 -0
- package/dist/client/transcription/BuilderTranscriptionCta.d.ts.map +1 -1
- package/dist/client/transcription/BuilderTranscriptionCta.js +71 -6
- package/dist/client/transcription/BuilderTranscriptionCta.js.map +1 -1
- package/dist/client/use-send-to-agent-chat.d.ts.map +1 -1
- package/dist/client/use-send-to-agent-chat.js +11 -3
- package/dist/client/use-send-to-agent-chat.js.map +1 -1
- package/dist/client/useProductionAgent.d.ts.map +1 -1
- package/dist/client/useProductionAgent.js +1 -1
- package/dist/client/useProductionAgent.js.map +1 -1
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +5 -1
- package/dist/db/client.js.map +1 -1
- package/dist/deploy/build.d.ts +1 -0
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +4 -1
- package/dist/deploy/build.js.map +1 -1
- package/dist/integrations/pending-tasks-retry-job.d.ts.map +1 -1
- package/dist/integrations/pending-tasks-retry-job.js +1 -1
- package/dist/integrations/pending-tasks-retry-job.js.map +1 -1
- package/dist/oauth-tokens/index.d.ts +1 -1
- package/dist/oauth-tokens/index.d.ts.map +1 -1
- package/dist/oauth-tokens/index.js +1 -1
- package/dist/oauth-tokens/index.js.map +1 -1
- package/dist/oauth-tokens/store.d.ts.map +1 -1
- package/dist/oauth-tokens/store.js +6 -0
- package/dist/oauth-tokens/store.js.map +1 -1
- package/dist/observability/store.d.ts.map +1 -1
- package/dist/observability/store.js +19 -19
- package/dist/observability/store.js.map +1 -1
- package/dist/onboarding/default-steps.d.ts.map +1 -1
- package/dist/onboarding/default-steps.js +95 -61
- package/dist/onboarding/default-steps.js.map +1 -1
- package/dist/onboarding/plugin.d.ts.map +1 -1
- package/dist/onboarding/plugin.js +17 -8
- package/dist/onboarding/plugin.js.map +1 -1
- package/dist/org/migrations.js +2 -2
- package/dist/org/migrations.js.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.js +2 -3
- package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
- package/dist/scripts/db/exec.d.ts +2 -1
- package/dist/scripts/db/exec.d.ts.map +1 -1
- package/dist/scripts/db/exec.js +264 -61
- package/dist/scripts/db/exec.js.map +1 -1
- package/dist/scripts/db/schema.d.ts.map +1 -1
- package/dist/scripts/db/schema.js +16 -4
- package/dist/scripts/db/schema.js.map +1 -1
- package/dist/scripts/dev/index.d.ts.map +1 -1
- package/dist/scripts/dev/index.js +36 -11
- package/dist/scripts/dev/index.js.map +1 -1
- package/dist/scripts/manage-agent-loop-settings.d.ts +7 -0
- package/dist/scripts/manage-agent-loop-settings.d.ts.map +1 -0
- package/dist/scripts/manage-agent-loop-settings.js +63 -0
- package/dist/scripts/manage-agent-loop-settings.js.map +1 -0
- package/dist/scripts/runner.d.ts.map +1 -1
- package/dist/scripts/runner.js +11 -0
- package/dist/scripts/runner.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +60 -18
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/app-url.d.ts +5 -4
- package/dist/server/app-url.d.ts.map +1 -1
- package/dist/server/app-url.js +8 -4
- package/dist/server/app-url.js.map +1 -1
- package/dist/server/auth.d.ts +37 -0
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +114 -35
- package/dist/server/auth.js.map +1 -1
- package/dist/server/better-auth-instance.d.ts +15 -0
- package/dist/server/better-auth-instance.d.ts.map +1 -1
- package/dist/server/better-auth-instance.js +131 -5
- package/dist/server/better-auth-instance.js.map +1 -1
- package/dist/server/builder-browser.d.ts +12 -0
- package/dist/server/builder-browser.d.ts.map +1 -1
- package/dist/server/builder-browser.js +36 -4
- package/dist/server/builder-browser.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +350 -53
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/credential-provider.d.ts +21 -3
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +51 -21
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/server/google-oauth.d.ts +3 -0
- package/dist/server/google-oauth.d.ts.map +1 -1
- package/dist/server/google-oauth.js +35 -18
- package/dist/server/google-oauth.js.map +1 -1
- package/dist/server/index.d.ts +4 -3
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +4 -3
- package/dist/server/index.js.map +1 -1
- package/dist/server/schema-prompt.d.ts.map +1 -1
- package/dist/server/schema-prompt.js +2 -1
- package/dist/server/schema-prompt.js.map +1 -1
- package/dist/server/security-headers.d.ts +3 -0
- package/dist/server/security-headers.d.ts.map +1 -1
- package/dist/server/security-headers.js +7 -1
- package/dist/server/security-headers.js.map +1 -1
- package/dist/server/ssr-handler.d.ts.map +1 -1
- package/dist/server/ssr-handler.js +24 -4
- package/dist/server/ssr-handler.js.map +1 -1
- package/dist/server/voice-providers-status.d.ts +7 -0
- package/dist/server/voice-providers-status.d.ts.map +1 -1
- package/dist/server/voice-providers-status.js +1 -0
- package/dist/server/voice-providers-status.js.map +1 -1
- package/dist/templates/default/_gitignore +5 -1
- package/dist/templates/default/app/root.tsx +1 -0
- package/dist/templates/default/public/favicon.svg +3 -3
- package/dist/templates/default/public/icon-180.svg +3 -3
- package/dist/templates/default/public/icon-192.svg +3 -3
- package/dist/templates/default/public/icon-512.svg +3 -3
- package/dist/templates/workspace-core/AGENTS.md +23 -7
- package/dist/templates/workspace-core/package.json +2 -1
- package/dist/templates/workspace-core/src/credentials.ts +22 -11
- package/dist/templates/workspace-root/.env.example +7 -0
- package/dist/templates/workspace-root/README.md +6 -3
- package/dist/templates/workspace-root/_gitignore +3 -0
- package/dist/templates/workspace-root/package.json +3 -1
- package/dist/templates/workspace-root/scripts/workspace-dev.ts +410 -0
- package/dist/tools/actions.d.ts.map +1 -1
- package/dist/tools/actions.js +2 -0
- package/dist/tools/actions.js.map +1 -1
- package/dist/tools/html-shell.d.ts.map +1 -1
- package/dist/tools/html-shell.js +13 -1
- package/dist/tools/html-shell.js.map +1 -1
- package/dist/tools/store.d.ts.map +1 -1
- package/dist/tools/store.js +16 -11
- package/dist/tools/store.js.map +1 -1
- package/dist/tracking/providers.d.ts +1 -0
- package/dist/tracking/providers.d.ts.map +1 -1
- package/dist/tracking/providers.js +72 -0
- package/dist/tracking/providers.js.map +1 -1
- package/dist/vite/action-types-plugin.d.ts.map +1 -1
- package/dist/vite/action-types-plugin.js +106 -9
- package/dist/vite/action-types-plugin.js.map +1 -1
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +67 -2
- package/dist/vite/client.js.map +1 -1
- package/docs/content/authentication.md +17 -13
- package/docs/content/deployment.md +11 -11
- package/docs/content/mcp-clients.md +2 -2
- package/docs/content/onboarding.md +32 -30
- package/docs/content/security.md +1 -1
- package/docs/content/tools.md +4 -0
- package/package.json +2 -2
- package/src/templates/default/_gitignore +5 -1
- package/src/templates/default/app/root.tsx +1 -0
- package/src/templates/default/public/favicon.svg +3 -3
- package/src/templates/default/public/icon-180.svg +3 -3
- package/src/templates/default/public/icon-192.svg +3 -3
- package/src/templates/default/public/icon-512.svg +3 -3
- package/src/templates/workspace-core/AGENTS.md +23 -7
- package/src/templates/workspace-core/package.json +2 -1
- package/src/templates/workspace-core/src/credentials.ts +22 -11
- package/src/templates/workspace-root/.env.example +7 -0
- package/src/templates/workspace-root/README.md +6 -3
- package/src/templates/workspace-root/_gitignore +3 -0
- package/src/templates/workspace-root/package.json +3 -1
- package/src/templates/workspace-root/scripts/workspace-dev.ts +410 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TeamPage.js","sourceRoot":"","sources":["../../../src/client/org/TeamPage.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useState, type ReactNode } from \"react\";\nimport {\n IconBuilding,\n IconUserPlus,\n IconTrash,\n IconCrown,\n IconShieldCheck,\n IconLoader2,\n IconMail,\n IconCheck,\n IconLogin,\n IconPencil,\n IconAt,\n IconX,\n IconKey,\n IconCopy,\n IconRefresh,\n IconEye,\n IconEyeOff,\n IconCloudUpload,\n} from \"@tabler/icons-react\";\nimport { agentNativePath, appBasePath } from \"../api-path.js\";\nimport { DEV_MODE_USER_EMAIL } from \"../dev-mode.js\";\nimport {\n useOrg,\n useOrgMembers,\n useOrgInvitations,\n useCreateOrg,\n useUpdateOrg,\n useInviteMember,\n useAcceptInvitation,\n useRemoveMember,\n useSwitchOrg,\n useSetOrgDomain,\n useSetA2ASecret,\n useSyncA2ASecret,\n type SyncA2ASecretResult,\n} from \"./hooks.js\";\n\nexport interface TeamPageProps {\n /**\n * Optional wrapper around the page contents. Templates pass their own Layout\n * component so the Team page renders inside the template's chrome.\n */\n layout?: (children: ReactNode) => ReactNode;\n /**\n * Title shown at the top of the page. Defaults to \"Team\".\n */\n title?: string;\n /**\n * Description shown on the \"Create an Organization\" card. Defaults to\n * \"Set up a team to collaborate with your colleagues.\"\n */\n createOrgDescription?: string;\n /**\n * Class applied to the outer max-width container. Templates can use this to\n * tweak page width.\n */\n className?: string;\n}\n\nfunction RoleIcon({ role }: { role: string }) {\n if (role === \"owner\")\n return <IconCrown className=\"h-3.5 w-3.5 text-amber-500\" />;\n if (role === \"admin\")\n return <IconShieldCheck className=\"h-3.5 w-3.5 text-blue-500\" />;\n return null;\n}\n\nfunction ErrorText({ error }: { error: unknown }) {\n if (!error) return null;\n return (\n <p className=\"text-xs text-red-500\">\n {error instanceof Error ? error.message : String(error)}\n </p>\n );\n}\n\nfunction PendingInvitationsCard() {\n const { data: org } = useOrg();\n const acceptInvitation = useAcceptInvitation();\n\n if (!org?.pendingInvitations?.length) return null;\n\n return (\n <section className=\"rounded-lg border border-border bg-card p-4 space-y-3\">\n <h3 className=\"text-sm font-medium\">Pending Invitations</h3>\n {org.pendingInvitations.map((inv) => (\n <div\n key={inv.id}\n className=\"flex items-center justify-between rounded-md border border-border p-3\"\n >\n <div>\n <div className=\"text-sm font-medium\">{inv.orgName}</div>\n <div className=\"text-xs text-muted-foreground\">\n Invited by {inv.invitedBy}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => acceptInvitation.mutate(inv.id)}\n disabled={acceptInvitation.isPending}\n className=\"rounded-md bg-green-600 px-3 py-1.5 text-xs font-medium text-white hover:bg-green-700 disabled:opacity-50\"\n >\n {acceptInvitation.isPending ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n \"Accept\"\n )}\n </button>\n </div>\n ))}\n <ErrorText error={acceptInvitation.error} />\n </section>\n );\n}\n\nfunction CreateOrgCard({ description }: { description?: string }) {\n const createOrg = useCreateOrg();\n const [name, setName] = useState(\"\");\n const [showForm, setShowForm] = useState(false);\n\n return (\n <section className=\"rounded-lg border border-border bg-card p-4 space-y-3\">\n <h3 className=\"text-sm font-medium\">Create an Organization</h3>\n <p className=\"text-sm text-muted-foreground\">\n {description || \"Set up a team to collaborate with your colleagues.\"}\n </p>\n {!showForm ? (\n <button\n type=\"button\"\n onClick={() => setShowForm(true)}\n className=\"rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90\"\n >\n Create organization\n </button>\n ) : (\n <div className=\"space-y-2\">\n <input\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"e.g. Acme Inc.\"\n className=\"w-full rounded-md border border-border bg-background px-3 py-2 text-sm focus:outline-none focus:ring-1 focus:ring-foreground\"\n autoFocus\n />\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n disabled={!name.trim() || createOrg.isPending}\n onClick={() =>\n createOrg.mutate(name.trim(), {\n onSuccess: () => {\n setName(\"\");\n setShowForm(false);\n },\n })\n }\n className=\"rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90 disabled:opacity-50\"\n >\n {createOrg.isPending ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n \"Create\"\n )}\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setShowForm(false);\n setName(\"\");\n }}\n className=\"rounded-md border border-border px-3 py-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\"\n >\n Cancel\n </button>\n </div>\n <ErrorText error={createOrg.error} />\n </div>\n )}\n </section>\n );\n}\n\nfunction OrgNameDisplay({ name, canEdit }: { name: string; canEdit: boolean }) {\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState(name);\n const updateOrg = useUpdateOrg();\n\n if (!canEdit) return <div className=\"text-sm font-medium\">{name}</div>;\n\n if (!editing) {\n return (\n <button\n type=\"button\"\n onClick={() => {\n setDraft(name);\n setEditing(true);\n }}\n className=\"group flex items-center gap-1.5 text-sm font-medium hover:text-foreground/80\"\n >\n {name}\n <IconPencil className=\"h-3 w-3 text-muted-foreground opacity-0 group-hover:opacity-100\" />\n </button>\n );\n }\n\n function save() {\n const trimmed = draft.trim();\n if (!trimmed || trimmed === name) {\n setEditing(false);\n return;\n }\n updateOrg.mutate(trimmed, { onSuccess: () => setEditing(false) });\n }\n\n return (\n <div className=\"flex items-center gap-1.5\">\n <input\n type=\"text\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") save();\n if (e.key === \"Escape\") setEditing(false);\n }}\n onBlur={save}\n className=\"rounded border border-border bg-background px-1.5 py-0.5 text-sm font-medium focus:outline-none focus:ring-1 focus:ring-foreground\"\n autoFocus\n />\n <ErrorText error={updateOrg.error} />\n </div>\n );\n}\n\nfunction MembersCard() {\n const { data: org } = useOrg();\n const { data: membersData, isLoading: isLoadingMembers } = useOrgMembers();\n const { data: invitationsData } = useOrgInvitations();\n const inviteMember = useInviteMember();\n const removeMember = useRemoveMember();\n const switchOrg = useSwitchOrg();\n\n const [inviteEmail, setInviteEmail] = useState(\"\");\n const [showInviteForm, setShowInviteForm] = useState(false);\n\n if (!org?.orgId) return null;\n\n const isOwnerOrAdmin = org.role === \"owner\" || org.role === \"admin\";\n const members = membersData?.members ?? [];\n const pendingInvites = invitationsData?.invitations ?? [];\n const hasMultipleOrgs = (org.orgs?.length ?? 0) > 1;\n\n return (\n <section className=\"rounded-lg border border-border bg-card p-4 space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-9 w-9 items-center justify-center rounded-lg bg-blue-600/10\">\n <IconBuilding className=\"h-5 w-5 text-blue-600\" />\n </div>\n <div>\n <OrgNameDisplay name={org.orgName ?? \"\"} canEdit={isOwnerOrAdmin} />\n <div className=\"text-xs text-muted-foreground\">\n {members.length} member{members.length !== 1 ? \"s\" : \"\"} · You are{\" \"}\n {org.role}\n </div>\n </div>\n </div>\n {hasMultipleOrgs && (\n <select\n value={org.orgId ?? \"\"}\n onChange={(e) => switchOrg.mutate(e.target.value || null)}\n disabled={switchOrg.isPending}\n className=\"rounded-md border border-border bg-background px-2.5 py-1.5 text-xs\"\n >\n {org.orgs.map((o) => (\n <option key={o.orgId} value={o.orgId}>\n {o.orgName}\n </option>\n ))}\n </select>\n )}\n </div>\n\n <div className=\"border-t border-border pt-3 space-y-1\">\n <div className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide mb-2\">\n Members\n </div>\n {isLoadingMembers && members.length === 0 && (\n <>\n {[0, 1, 2].map((i) => (\n <div\n key={i}\n className=\"flex items-center justify-between py-1.5 px-2\"\n >\n <div className=\"flex items-center gap-2\">\n <div\n className=\"h-3.5 rounded bg-muted animate-pulse\"\n style={{ width: `${140 + i * 30}px` }}\n />\n <div className=\"h-3.5 w-3.5 rounded bg-muted animate-pulse\" />\n </div>\n </div>\n ))}\n </>\n )}\n {members.map((m) => (\n <div\n key={m.email}\n className=\"flex items-center justify-between py-1.5 px-2 rounded hover:bg-accent/30\"\n >\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">{m.email}</span>\n <RoleIcon role={m.role} />\n {m.email === org.email && (\n <span className=\"rounded border border-border px-1.5 py-0.5 text-[10px] text-muted-foreground\">\n You\n </span>\n )}\n </div>\n {isOwnerOrAdmin && m.email !== org.email && m.role !== \"owner\" && (\n <button\n type=\"button\"\n disabled={removeMember.isPending}\n onClick={() => removeMember.mutate(m.email)}\n className=\"text-muted-foreground hover:text-red-500 disabled:opacity-50\"\n title=\"Remove member\"\n >\n <IconTrash className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </div>\n ))}\n {pendingInvites.map((inv) => (\n <div\n key={inv.id}\n className=\"flex items-center justify-between py-1.5 px-2 opacity-60\"\n >\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">{inv.email}</span>\n <span className=\"rounded border border-border px-1.5 py-0.5 text-[10px] text-muted-foreground\">\n Invited\n </span>\n </div>\n </div>\n ))}\n </div>\n\n {isOwnerOrAdmin && (\n <div className=\"border-t border-border pt-3\">\n {!showInviteForm ? (\n <button\n type=\"button\"\n onClick={() => setShowInviteForm(true)}\n className=\"flex items-center gap-1.5 rounded-md border border-border px-2.5 py-1.5 text-xs font-medium hover:bg-accent/50\"\n >\n <IconUserPlus className=\"h-3.5 w-3.5\" />\n Invite member\n </button>\n ) : (\n <div className=\"space-y-2\">\n <div className=\"flex gap-2\">\n <div className=\"relative flex-1\">\n <IconMail className=\"absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground\" />\n <input\n type=\"email\"\n value={inviteEmail}\n onChange={(e) => setInviteEmail(e.target.value)}\n placeholder=\"colleague@company.com\"\n className=\"w-full rounded-md border border-border bg-background pl-8 pr-3 py-1.5 text-sm focus:outline-none focus:ring-1 focus:ring-foreground\"\n autoFocus\n />\n </div>\n <button\n type=\"button\"\n disabled={!inviteEmail.trim() || inviteMember.isPending}\n onClick={() =>\n inviteMember.mutate(inviteEmail.trim(), {\n onSuccess: () => {\n setInviteEmail(\"\");\n setShowInviteForm(false);\n },\n })\n }\n className=\"rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90 disabled:opacity-50\"\n >\n {inviteMember.isPending ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <span className=\"inline-flex items-center gap-1\">\n <IconCheck className=\"h-3.5 w-3.5\" />\n Send\n </span>\n )}\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setShowInviteForm(false);\n setInviteEmail(\"\");\n }}\n className=\"rounded-md border border-border px-3 py-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\"\n >\n Cancel\n </button>\n </div>\n <p className=\"text-[11px] text-muted-foreground\">\n They'll need to sign in with Google using this exact email\n to accept the invitation.\n </p>\n <ErrorText error={inviteMember.error} />\n </div>\n )}\n </div>\n )}\n\n {isOwnerOrAdmin && <DomainSettingsSection domain={org.allowedDomain} />}\n\n {isOwnerOrAdmin && <A2ASecretSection secret={org.a2aSecret} />}\n\n <ErrorText error={removeMember.error} />\n <ErrorText error={switchOrg.error} />\n </section>\n );\n}\n\nfunction DomainSettingsSection({ domain }: { domain: string | null }) {\n const setOrgDomain = useSetOrgDomain();\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState(domain ?? \"\");\n\n function save() {\n const trimmed = draft.trim().toLowerCase();\n if (trimmed === (domain ?? \"\")) {\n setEditing(false);\n return;\n }\n setOrgDomain.mutate(trimmed || null, {\n onSuccess: () => setEditing(false),\n });\n }\n\n return (\n <div className=\"border-t border-border pt-3 space-y-2\">\n <div className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide\">\n Email domain auto-join\n </div>\n <p className=\"text-[11px] text-muted-foreground\">\n Anyone who signs up with an email from this domain can join your\n organization without an invitation.\n </p>\n {!editing ? (\n <div className=\"flex items-center gap-2\">\n {domain ? (\n <>\n <span className=\"inline-flex items-center gap-1.5 rounded-md border border-border bg-background px-2.5 py-1.5 text-sm\">\n <IconAt className=\"h-3.5 w-3.5 text-muted-foreground\" />\n {domain}\n </span>\n <button\n type=\"button\"\n onClick={() => {\n setDraft(domain);\n setEditing(true);\n }}\n className=\"text-muted-foreground hover:text-foreground\"\n title=\"Edit domain\"\n >\n <IconPencil className=\"h-3.5 w-3.5\" />\n </button>\n <button\n type=\"button\"\n disabled={setOrgDomain.isPending}\n onClick={() => setOrgDomain.mutate(null)}\n className=\"text-muted-foreground hover:text-red-500 disabled:opacity-50\"\n title=\"Remove domain\"\n >\n <IconX className=\"h-3.5 w-3.5\" />\n </button>\n </>\n ) : (\n <button\n type=\"button\"\n onClick={() => {\n setDraft(\"\");\n setEditing(true);\n }}\n className=\"flex items-center gap-1.5 rounded-md border border-border px-2.5 py-1.5 text-xs font-medium hover:bg-accent/50\"\n >\n <IconAt className=\"h-3.5 w-3.5\" />\n Set allowed domain\n </button>\n )}\n </div>\n ) : (\n <div className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") save();\n if (e.key === \"Escape\") setEditing(false);\n }}\n placeholder=\"example.com\"\n className=\"rounded-md border border-border bg-background px-2.5 py-1.5 text-sm focus:outline-none focus:ring-1 focus:ring-foreground\"\n autoFocus\n />\n <button\n type=\"button\"\n disabled={setOrgDomain.isPending}\n onClick={save}\n className=\"rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90 disabled:opacity-50\"\n >\n {setOrgDomain.isPending ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n \"Save\"\n )}\n </button>\n <button\n type=\"button\"\n onClick={() => setEditing(false)}\n className=\"rounded-md border border-border px-3 py-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\"\n >\n Cancel\n </button>\n </div>\n )}\n <ErrorText error={setOrgDomain.error} />\n </div>\n );\n}\n\nfunction A2ASecretSection({ secret }: { secret: string | null | undefined }) {\n const setA2ASecret = useSetA2ASecret();\n const syncA2ASecret = useSyncA2ASecret();\n const [revealed, setRevealed] = useState(false);\n const [copied, setCopied] = useState(false);\n const [pasteMode, setPasteMode] = useState(false);\n const [pasteValue, setPasteValue] = useState(\"\");\n const [syncResult, setSyncResult] = useState<SyncA2ASecretResult | null>(\n null,\n );\n\n function copyToClipboard() {\n if (!secret) return;\n navigator.clipboard.writeText(secret).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n }\n\n // Push the current secret to all connected apps. Optionally pass the\n // PREVIOUS secret as `signSecret` so the receiving apps (which still\n // hold the previous value) can verify the JWT.\n function syncToApps(signSecret?: string) {\n setSyncResult(null);\n syncA2ASecret.mutate(signSecret ? { signSecret } : undefined, {\n onSuccess: (result) => {\n setSyncResult(result);\n },\n });\n }\n\n function regenerate() {\n setA2ASecret.mutate(undefined, {\n onSuccess: (result) => {\n setRevealed(false);\n // Auto-sync the new secret to all connected apps. Sign with the\n // PREVIOUS secret (which peers still hold) so verification on\n // their side succeeds and they accept the new value.\n syncToApps(result.previousSecret ?? undefined);\n },\n });\n }\n\n function saveSecret() {\n const trimmed = pasteValue.trim();\n if (!trimmed) return;\n setA2ASecret.mutate(trimmed, {\n onSuccess: (result) => {\n setPasteMode(false);\n setPasteValue(\"\");\n // Same auto-sync flow as regenerate: peers verify with the\n // previous secret, then update to the new pasted value.\n syncToApps(result.previousSecret ?? undefined);\n },\n });\n }\n\n const masked = secret ? \"****\" + secret.slice(-8) : \"Not set\";\n\n return (\n <div className=\"border-t border-border pt-3 space-y-2\">\n <div className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide\">\n Cross-app authentication\n </div>\n <p className=\"text-[11px] text-muted-foreground\">\n This secret authenticates cross-app delegation (e.g. Dispatch to\n Analytics). All apps in your organization need the same secret.\n </p>\n\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"inline-flex items-center gap-1.5 rounded-md border border-border bg-background px-2.5 py-1.5 text-sm font-mono\">\n <IconKey className=\"h-3.5 w-3.5 text-muted-foreground\" />\n {revealed && secret ? secret : masked}\n </span>\n {secret && (\n <>\n <button\n type=\"button\"\n onClick={() => setRevealed(!revealed)}\n className=\"text-muted-foreground hover:text-foreground\"\n title={revealed ? \"Hide secret\" : \"Reveal secret\"}\n >\n {revealed ? (\n <IconEyeOff className=\"h-3.5 w-3.5\" />\n ) : (\n <IconEye className=\"h-3.5 w-3.5\" />\n )}\n </button>\n <button\n type=\"button\"\n onClick={copyToClipboard}\n className=\"text-muted-foreground hover:text-foreground\"\n title=\"Copy secret\"\n >\n {copied ? (\n <IconCheck className=\"h-3.5 w-3.5 text-green-500\" />\n ) : (\n <IconCopy className=\"h-3.5 w-3.5\" />\n )}\n </button>\n </>\n )}\n <button\n type=\"button\"\n onClick={regenerate}\n disabled={setA2ASecret.isPending || syncA2ASecret.isPending}\n className=\"inline-flex items-center gap-1 rounded-md border border-border px-2.5 py-1.5 text-xs font-medium hover:bg-accent/50 disabled:opacity-50\"\n title=\"Regenerate secret and sync to connected apps\"\n >\n {setA2ASecret.isPending ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <IconRefresh className=\"h-3.5 w-3.5\" />\n )}\n Regenerate\n </button>\n {secret && (\n <button\n type=\"button\"\n onClick={() => syncToApps()}\n disabled={setA2ASecret.isPending || syncA2ASecret.isPending}\n className=\"inline-flex items-center gap-1 rounded-md border border-border px-2.5 py-1.5 text-xs font-medium hover:bg-accent/50 disabled:opacity-50\"\n title=\"Push this secret to every connected app\"\n >\n {syncA2ASecret.isPending ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <IconCloudUpload className=\"h-3.5 w-3.5\" />\n )}\n Sync to apps\n </button>\n )}\n </div>\n\n {syncA2ASecret.isPending && (\n <p className=\"text-[11px] text-muted-foreground\">\n Syncing to connected apps…\n </p>\n )}\n\n {syncResult && !syncA2ASecret.isPending && (\n <div className=\"space-y-1\">\n <p className=\"text-[11px] text-muted-foreground\">\n Synced to {syncResult.succeeded}/{syncResult.total} app\n {syncResult.total === 1 ? \"\" : \"s\"}\n {syncResult.failed > 0 ? ` (${syncResult.failed} failed)` : \"\"}.\n </p>\n {syncResult.failed > 0 && (\n <ul className=\"text-[11px] text-red-500 list-disc pl-5 space-y-0.5\">\n {syncResult.results\n .filter((r) => !r.ok)\n .map((r) => (\n <li key={r.id}>\n {r.name}: {r.error || `HTTP ${r.status ?? \"?\"}`}\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n\n {!pasteMode ? (\n <button\n type=\"button\"\n onClick={() => setPasteMode(true)}\n className=\"flex items-center gap-1.5 rounded-md border border-border px-2.5 py-1.5 text-xs font-medium hover:bg-accent/50\"\n >\n <IconKey className=\"h-3.5 w-3.5\" />\n Paste secret from another app\n </button>\n ) : (\n <div className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n value={pasteValue}\n onChange={(e) => setPasteValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") saveSecret();\n if (e.key === \"Escape\") {\n setPasteMode(false);\n setPasteValue(\"\");\n }\n }}\n placeholder=\"Paste A2A secret\"\n className=\"flex-1 rounded-md border border-border bg-background px-2.5 py-1.5 text-sm font-mono focus:outline-none focus:ring-1 focus:ring-foreground\"\n autoFocus\n />\n <button\n type=\"button\"\n disabled={!pasteValue.trim() || setA2ASecret.isPending}\n onClick={saveSecret}\n className=\"rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90 disabled:opacity-50\"\n >\n {setA2ASecret.isPending ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n \"Save\"\n )}\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setPasteMode(false);\n setPasteValue(\"\");\n }}\n className=\"rounded-md border border-border px-3 py-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\"\n >\n Cancel\n </button>\n </div>\n )}\n\n <ErrorText error={setA2ASecret.error} />\n <ErrorText error={syncA2ASecret.error} />\n </div>\n );\n}\n\nconst MIGRATE_FLAG_KEY = \"an_migrate_from_local\";\n\nfunction LocalModeSignInCard() {\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n async function upgradeToAccount() {\n setIsSubmitting(true);\n setError(null);\n try {\n // Remember that we want to migrate data once the user completes sign-in.\n try {\n localStorage.setItem(MIGRATE_FLAG_KEY, \"1\");\n } catch {\n // localStorage may be unavailable (private mode) — migration just\n // won't auto-run. The user can still sign in.\n }\n const res = await fetch(\n agentNativePath(\"/_agent-native/auth/exit-local-mode\"),\n {\n method: \"POST\",\n },\n );\n if (!res.ok) {\n const body = await res.json().catch(() => ({}));\n throw new Error(body?.error || \"Failed to exit local mode\");\n }\n // Reload with ?signin=1 → auth guard will serve the onboarding page so\n // the user can sign in with Google or create an email/password account.\n // The URL flag is used (rather than a cookie) because third-party iframe\n // contexts (e.g. the Builder.io editor) block SameSite=Lax cookies, so a\n // cookie-only signal would be lost on reload. The localStorage flag\n // survives the reload so TeamPage can migrate data automatically once\n // they're back.\n const url = new URL(window.location.href);\n url.searchParams.set(\"signin\", \"1\");\n window.location.href = url.toString();\n } catch (e: any) {\n setError(e?.message || \"Failed to start sign-in\");\n setIsSubmitting(false);\n }\n }\n\n return (\n <section className=\"rounded-lg border border-border bg-card p-6 space-y-4\">\n <p className=\"text-sm text-muted-foreground\">\n Signed in as <code>local@localhost</code>. Create an account to:\n </p>\n <ul className=\"text-sm text-muted-foreground list-disc pl-5 space-y-1\">\n <li>Sync data across devices</li>\n <li>Invite teammates</li>\n <li>Keep your local data — it migrates automatically</li>\n </ul>\n <button\n type=\"button\"\n onClick={upgradeToAccount}\n disabled={isSubmitting}\n className=\"inline-flex items-center gap-2 rounded-md bg-foreground px-3 py-2 text-xs font-medium text-background hover:opacity-90 disabled:opacity-50\"\n >\n {isSubmitting ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <IconLogin className=\"h-3.5 w-3.5\" />\n )}\n Sign in or create account\n </button>\n {error && <ErrorText error={error} />}\n </section>\n );\n}\n\ninterface MigrationState {\n status: \"idle\" | \"running\" | \"done\" | \"error\";\n coreTables: Record<string, number>;\n appKeys: string[];\n error: string | null;\n}\n\nfunction MigrationStatusCard({ state }: { state: MigrationState }) {\n if (state.status === \"idle\") return null;\n\n const movedCore = Object.entries(state.coreTables);\n\n return (\n <section className=\"rounded-lg border border-border bg-card p-6 space-y-3\">\n <div className=\"flex items-center gap-2\">\n {state.status === \"running\" ? (\n <IconLoader2 className=\"h-4 w-4 animate-spin text-muted-foreground\" />\n ) : state.status === \"done\" ? (\n <IconCheck className=\"h-4 w-4 text-green-500\" />\n ) : (\n <IconTrash className=\"h-4 w-4 text-red-500\" />\n )}\n <h3 className=\"text-sm font-medium\">\n {state.status === \"running\"\n ? \"Migrating your local workspace\"\n : state.status === \"done\"\n ? \"Local workspace migrated\"\n : \"Migration incomplete\"}\n </h3>\n </div>\n\n {state.status === \"running\" && (\n <p className=\"text-sm text-muted-foreground\">\n Moving your local SQL data onto this real account. Keep this page open\n while the upgrade finishes.\n </p>\n )}\n\n {state.status === \"done\" && (\n <>\n <p className=\"text-sm text-muted-foreground\">\n Your local workspace has been attached to this account.\n </p>\n {(movedCore.length > 0 || state.appKeys.length > 0) && (\n <div className=\"rounded-md border border-border p-3 text-xs text-muted-foreground space-y-1\">\n {movedCore.map(([table, count]) => (\n <div key={table}>\n {table}: {count} row{count === 1 ? \"\" : \"s\"}\n </div>\n ))}\n {state.appKeys.length > 0 && (\n <div>\n app settings: {state.appKeys.length} key\n {state.appKeys.length === 1 ? \"\" : \"s\"}\n </div>\n )}\n </div>\n )}\n </>\n )}\n\n {state.status === \"error\" && (\n <p className=\"text-sm text-red-500\">\n {state.error || \"We signed you in, but moving local data failed.\"}\n </p>\n )}\n </section>\n );\n}\n\n/**\n * After the user finishes signing in on the onboarding page and lands back on\n * the Team page, pull across any data that was previously scoped to\n * `local@localhost`. Triggered by a localStorage flag set from\n * `LocalModeSignInCard` so we only migrate when the user explicitly opted in.\n */\nfunction useMigrateLocalDataOnSignIn(\n email: string | undefined,\n): MigrationState {\n const [state, setState] = useState<MigrationState>({\n status: \"idle\",\n coreTables: {},\n appKeys: [],\n error: null,\n });\n\n useEffect(() => {\n if (!email || email === DEV_MODE_USER_EMAIL) return;\n let flag: string | null = null;\n try {\n flag = localStorage.getItem(MIGRATE_FLAG_KEY);\n } catch {\n return;\n }\n if (!flag) return;\n // Clear the flag immediately so a failed request doesn't loop.\n try {\n localStorage.removeItem(MIGRATE_FLAG_KEY);\n } catch {\n // ignore\n }\n let cancelled = false;\n\n (async () => {\n setState({\n status: \"running\",\n coreTables: {},\n appKeys: [],\n error: null,\n });\n\n try {\n const coreRes = await fetch(\n agentNativePath(\"/_agent-native/auth/migrate-local-data\"),\n {\n method: \"POST\",\n credentials: \"include\",\n },\n );\n const coreBody = await coreRes.json().catch(() => ({}));\n if (!coreRes.ok) {\n throw new Error(\n coreBody?.error || \"Failed to migrate local framework data\",\n );\n }\n\n let appKeys: string[] = [];\n try {\n const appRes = await fetch(`${appBasePath()}/api/local-migration`, {\n method: \"POST\",\n credentials: \"include\",\n });\n if (appRes.ok) {\n const appBody = await appRes.json().catch(() => ({}));\n appKeys = Array.isArray(appBody?.keys) ? appBody.keys : [];\n } else if (appRes.status !== 404) {\n const appBody = await appRes.json().catch(() => ({}));\n throw new Error(appBody?.error || \"App-specific migration failed\");\n }\n } catch (err: any) {\n if (!/404/.test(String(err?.message ?? \"\"))) throw err;\n }\n\n if (!cancelled) {\n setState({\n status: \"done\",\n coreTables:\n typeof coreBody?.tables === \"object\" && coreBody.tables\n ? coreBody.tables\n : {},\n appKeys,\n error: null,\n });\n }\n } catch (err: any) {\n if (!cancelled) {\n setState({\n status: \"error\",\n coreTables: {},\n appKeys: [],\n error: err?.message || \"Migration failed\",\n });\n }\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [email]);\n\n return state;\n}\n\n/**\n * Default Team management page. Templates can route directly to this component\n * or wrap it with their own Layout via the `layout` prop.\n */\nexport function TeamPage({\n layout,\n title = \"Team\",\n createOrgDescription,\n className,\n}: TeamPageProps) {\n const { data: org, isLoading } = useOrg();\n const migration = useMigrateLocalDataOnSignIn(org?.email);\n const isMigrating = migration.status === \"running\";\n\n const content = (\n <div className={`space-y-6 max-w-2xl ${className ?? \"\"}`}>\n <h2 className=\"text-2xl font-bold tracking-tight\">{title}</h2>\n\n {isLoading && (\n <section className=\"rounded-lg border border-border bg-card p-6\">\n <div className=\"text-sm text-muted-foreground\">Loading…</div>\n </section>\n )}\n\n {!isLoading && org?.email === DEV_MODE_USER_EMAIL && (\n <LocalModeSignInCard />\n )}\n\n {!isLoading && org?.email !== DEV_MODE_USER_EMAIL && (\n <MigrationStatusCard state={migration} />\n )}\n\n {!isLoading && org?.email !== DEV_MODE_USER_EMAIL && !isMigrating && (\n <>\n <PendingInvitationsCard />\n {!org?.orgId ? (\n <CreateOrgCard description={createOrgDescription} />\n ) : (\n <MembersCard />\n )}\n </>\n )}\n </div>\n );\n\n return layout ? <>{layout(content)}</> : content;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"TeamPage.js","sourceRoot":"","sources":["../../../src/client/org/TeamPage.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useState, type ReactNode } from \"react\";\nimport {\n IconBuilding,\n IconUserPlus,\n IconTrash,\n IconCrown,\n IconShieldCheck,\n IconLoader2,\n IconMail,\n IconCheck,\n IconLogin,\n IconPencil,\n IconAt,\n IconX,\n IconKey,\n IconCopy,\n IconRefresh,\n IconEye,\n IconEyeOff,\n IconCloudUpload,\n} from \"@tabler/icons-react\";\nimport { agentNativePath, appBasePath } from \"../api-path.js\";\nimport { DEV_MODE_USER_EMAIL } from \"../dev-mode.js\";\nimport {\n useOrg,\n useOrgMembers,\n useOrgInvitations,\n useCreateOrg,\n useUpdateOrg,\n useInviteMember,\n useAcceptInvitation,\n useRemoveMember,\n useSwitchOrg,\n useSetOrgDomain,\n useSetA2ASecret,\n useSyncA2ASecret,\n useJoinByDomain,\n type SyncA2ASecretResult,\n} from \"./hooks.js\";\nimport type { DomainMatchOrg } from \"../../org/types.js\";\n\nexport interface TeamPageProps {\n /**\n * Optional wrapper around the page contents. Templates pass their own Layout\n * component so the Team page renders inside the template's chrome.\n */\n layout?: (children: ReactNode) => ReactNode;\n /**\n * Title shown at the top of the page. Defaults to \"Team\".\n */\n title?: string;\n /**\n * Description shown on the \"Create an Organization\" card. Defaults to\n * \"Set up a team to collaborate with your colleagues.\"\n */\n createOrgDescription?: string;\n /**\n * Class applied to the outer max-width container. Templates can use this to\n * tweak page width.\n */\n className?: string;\n}\n\nfunction RoleIcon({ role }: { role: string }) {\n if (role === \"owner\")\n return <IconCrown className=\"h-3.5 w-3.5 text-amber-500\" />;\n if (role === \"admin\")\n return <IconShieldCheck className=\"h-3.5 w-3.5 text-blue-500\" />;\n return null;\n}\n\nfunction ErrorText({ error }: { error: unknown }) {\n if (!error) return null;\n return (\n <p className=\"text-xs text-red-500\">\n {error instanceof Error ? error.message : String(error)}\n </p>\n );\n}\n\nfunction PendingInvitationsCard() {\n const { data: org } = useOrg();\n const acceptInvitation = useAcceptInvitation();\n\n if (!org?.pendingInvitations?.length) return null;\n\n return (\n <section className=\"rounded-lg border border-border bg-card p-4 space-y-3\">\n <h3 className=\"text-sm font-medium\">Pending Invitations</h3>\n {org.pendingInvitations.map((inv) => (\n <div\n key={inv.id}\n className=\"flex items-center justify-between rounded-md border border-border p-3\"\n >\n <div>\n <div className=\"text-sm font-medium\">{inv.orgName}</div>\n <div className=\"text-xs text-muted-foreground\">\n Invited by {inv.invitedBy}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => acceptInvitation.mutate(inv.id)}\n disabled={acceptInvitation.isPending}\n className=\"rounded-md bg-green-600 px-3 py-1.5 text-xs font-medium text-white hover:bg-green-700 disabled:opacity-50\"\n >\n {acceptInvitation.isPending ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n \"Accept\"\n )}\n </button>\n </div>\n ))}\n <ErrorText error={acceptInvitation.error} />\n </section>\n );\n}\n\nfunction JoinByDomainCard({ matches }: { matches: DomainMatchOrg[] }) {\n const joinByDomain = useJoinByDomain();\n const [pendingId, setPendingId] = useState<string | null>(null);\n\n return (\n <section className=\"rounded-lg border border-border bg-card p-4 space-y-3\">\n <h3 className=\"text-sm font-medium\">Join your team</h3>\n <p className=\"text-sm text-muted-foreground\">\n {matches.length === 1\n ? `An organization matching your email domain already exists. Join it to collaborate with your teammates.`\n : `Organizations matching your email domain already exist. Join one to collaborate with your teammates.`}\n </p>\n <div className=\"space-y-2\">\n {matches.map((m) => (\n <div\n key={m.orgId}\n className=\"flex items-center justify-between rounded-md border border-border p-3\"\n >\n <div className=\"flex items-center gap-2.5\">\n <div className=\"flex h-8 w-8 items-center justify-center rounded-md bg-blue-600/10\">\n <IconBuilding className=\"h-4 w-4 text-blue-600\" />\n </div>\n <div className=\"text-sm font-medium\">{m.orgName}</div>\n </div>\n <button\n type=\"button\"\n disabled={joinByDomain.isPending && pendingId === m.orgId}\n onClick={() => {\n setPendingId(m.orgId);\n joinByDomain.mutate(m.orgId, {\n onSettled: () => setPendingId(null),\n });\n }}\n className=\"rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90 disabled:opacity-50\"\n >\n {joinByDomain.isPending && pendingId === m.orgId ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n \"Join\"\n )}\n </button>\n </div>\n ))}\n </div>\n <ErrorText error={joinByDomain.error} />\n </section>\n );\n}\n\nfunction CreateOrgCard({ description }: { description?: string }) {\n const createOrg = useCreateOrg();\n const [name, setName] = useState(\"\");\n const [showForm, setShowForm] = useState(false);\n\n return (\n <section className=\"rounded-lg border border-border bg-card p-4 space-y-3\">\n <h3 className=\"text-sm font-medium\">Create an Organization</h3>\n <p className=\"text-sm text-muted-foreground\">\n {description || \"Set up a team to collaborate with your colleagues.\"}\n </p>\n {!showForm ? (\n <button\n type=\"button\"\n onClick={() => setShowForm(true)}\n className=\"rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90\"\n >\n Create organization\n </button>\n ) : (\n <div className=\"space-y-2\">\n <input\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"e.g. Acme Inc.\"\n className=\"w-full rounded-md border border-border bg-background px-3 py-2 text-sm focus:outline-none focus:ring-1 focus:ring-foreground\"\n autoFocus\n />\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n disabled={!name.trim() || createOrg.isPending}\n onClick={() =>\n createOrg.mutate(name.trim(), {\n onSuccess: () => {\n setName(\"\");\n setShowForm(false);\n },\n })\n }\n className=\"rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90 disabled:opacity-50\"\n >\n {createOrg.isPending ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n \"Create\"\n )}\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setShowForm(false);\n setName(\"\");\n }}\n className=\"rounded-md border border-border px-3 py-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\"\n >\n Cancel\n </button>\n </div>\n <ErrorText error={createOrg.error} />\n </div>\n )}\n </section>\n );\n}\n\nfunction OrgNameDisplay({ name, canEdit }: { name: string; canEdit: boolean }) {\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState(name);\n const updateOrg = useUpdateOrg();\n\n if (!canEdit) return <div className=\"text-sm font-medium\">{name}</div>;\n\n if (!editing) {\n return (\n <button\n type=\"button\"\n onClick={() => {\n setDraft(name);\n setEditing(true);\n }}\n className=\"group flex items-center gap-1.5 text-sm font-medium hover:text-foreground/80\"\n >\n {name}\n <IconPencil className=\"h-3 w-3 text-muted-foreground opacity-0 group-hover:opacity-100\" />\n </button>\n );\n }\n\n function save() {\n const trimmed = draft.trim();\n if (!trimmed || trimmed === name) {\n setEditing(false);\n return;\n }\n updateOrg.mutate(trimmed, { onSuccess: () => setEditing(false) });\n }\n\n return (\n <div className=\"flex items-center gap-1.5\">\n <input\n type=\"text\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") save();\n if (e.key === \"Escape\") setEditing(false);\n }}\n onBlur={save}\n className=\"rounded border border-border bg-background px-1.5 py-0.5 text-sm font-medium focus:outline-none focus:ring-1 focus:ring-foreground\"\n autoFocus\n />\n <ErrorText error={updateOrg.error} />\n </div>\n );\n}\n\nfunction MembersCard() {\n const { data: org } = useOrg();\n const { data: membersData, isLoading: isLoadingMembers } = useOrgMembers();\n const { data: invitationsData } = useOrgInvitations();\n const inviteMember = useInviteMember();\n const removeMember = useRemoveMember();\n const switchOrg = useSwitchOrg();\n\n const [inviteEmail, setInviteEmail] = useState(\"\");\n const [showInviteForm, setShowInviteForm] = useState(false);\n\n if (!org?.orgId) return null;\n\n const isOwnerOrAdmin = org.role === \"owner\" || org.role === \"admin\";\n const members = membersData?.members ?? [];\n const pendingInvites = invitationsData?.invitations ?? [];\n const hasMultipleOrgs = (org.orgs?.length ?? 0) > 1;\n\n return (\n <section className=\"rounded-lg border border-border bg-card p-4 space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-9 w-9 items-center justify-center rounded-lg bg-blue-600/10\">\n <IconBuilding className=\"h-5 w-5 text-blue-600\" />\n </div>\n <div>\n <OrgNameDisplay name={org.orgName ?? \"\"} canEdit={isOwnerOrAdmin} />\n <div className=\"text-xs text-muted-foreground\">\n {members.length} member{members.length !== 1 ? \"s\" : \"\"} · You are{\" \"}\n {org.role}\n </div>\n </div>\n </div>\n {hasMultipleOrgs && (\n <select\n value={org.orgId ?? \"\"}\n onChange={(e) => switchOrg.mutate(e.target.value || null)}\n disabled={switchOrg.isPending}\n className=\"rounded-md border border-border bg-background px-2.5 py-1.5 text-xs\"\n >\n {org.orgs.map((o) => (\n <option key={o.orgId} value={o.orgId}>\n {o.orgName}\n </option>\n ))}\n </select>\n )}\n </div>\n\n <div className=\"border-t border-border pt-3 space-y-1\">\n <div className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide mb-2\">\n Members\n </div>\n {isLoadingMembers && members.length === 0 && (\n <>\n {[0, 1, 2].map((i) => (\n <div\n key={i}\n className=\"flex items-center justify-between py-1.5 px-2\"\n >\n <div className=\"flex items-center gap-2\">\n <div\n className=\"h-3.5 rounded bg-muted animate-pulse\"\n style={{ width: `${140 + i * 30}px` }}\n />\n <div className=\"h-3.5 w-3.5 rounded bg-muted animate-pulse\" />\n </div>\n </div>\n ))}\n </>\n )}\n {members.map((m) => (\n <div\n key={m.email}\n className=\"flex items-center justify-between py-1.5 px-2 rounded hover:bg-accent/30\"\n >\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">{m.email}</span>\n <RoleIcon role={m.role} />\n {m.email === org.email && (\n <span className=\"rounded border border-border px-1.5 py-0.5 text-[10px] text-muted-foreground\">\n You\n </span>\n )}\n </div>\n {isOwnerOrAdmin && m.email !== org.email && m.role !== \"owner\" && (\n <button\n type=\"button\"\n disabled={removeMember.isPending}\n onClick={() => removeMember.mutate(m.email)}\n className=\"text-muted-foreground hover:text-red-500 disabled:opacity-50\"\n title=\"Remove member\"\n >\n <IconTrash className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </div>\n ))}\n {pendingInvites.map((inv) => (\n <div\n key={inv.id}\n className=\"flex items-center justify-between py-1.5 px-2 opacity-60\"\n >\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">{inv.email}</span>\n <span className=\"rounded border border-border px-1.5 py-0.5 text-[10px] text-muted-foreground\">\n Invited\n </span>\n </div>\n </div>\n ))}\n </div>\n\n {isOwnerOrAdmin && (\n <div className=\"border-t border-border pt-3\">\n {!showInviteForm ? (\n <button\n type=\"button\"\n onClick={() => setShowInviteForm(true)}\n className=\"flex items-center gap-1.5 rounded-md border border-border px-2.5 py-1.5 text-xs font-medium hover:bg-accent/50\"\n >\n <IconUserPlus className=\"h-3.5 w-3.5\" />\n Invite member\n </button>\n ) : (\n <div className=\"space-y-2\">\n <div className=\"flex gap-2\">\n <div className=\"relative flex-1\">\n <IconMail className=\"absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground\" />\n <input\n type=\"email\"\n value={inviteEmail}\n onChange={(e) => setInviteEmail(e.target.value)}\n placeholder=\"colleague@company.com\"\n className=\"w-full rounded-md border border-border bg-background pl-8 pr-3 py-1.5 text-sm focus:outline-none focus:ring-1 focus:ring-foreground\"\n autoFocus\n />\n </div>\n <button\n type=\"button\"\n disabled={!inviteEmail.trim() || inviteMember.isPending}\n onClick={() =>\n inviteMember.mutate(inviteEmail.trim(), {\n onSuccess: () => {\n setInviteEmail(\"\");\n setShowInviteForm(false);\n },\n })\n }\n className=\"rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90 disabled:opacity-50\"\n >\n {inviteMember.isPending ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <span className=\"inline-flex items-center gap-1\">\n <IconCheck className=\"h-3.5 w-3.5\" />\n Send\n </span>\n )}\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setShowInviteForm(false);\n setInviteEmail(\"\");\n }}\n className=\"rounded-md border border-border px-3 py-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\"\n >\n Cancel\n </button>\n </div>\n <p className=\"text-[11px] text-muted-foreground\">\n They'll need to sign in with Google using this exact email\n to accept the invitation.\n </p>\n <ErrorText error={inviteMember.error} />\n </div>\n )}\n </div>\n )}\n\n {isOwnerOrAdmin && <DomainSettingsSection domain={org.allowedDomain} />}\n\n {isOwnerOrAdmin && <A2ASecretSection secret={org.a2aSecret} />}\n\n <ErrorText error={removeMember.error} />\n <ErrorText error={switchOrg.error} />\n </section>\n );\n}\n\nfunction DomainSettingsSection({ domain }: { domain: string | null }) {\n const setOrgDomain = useSetOrgDomain();\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState(domain ?? \"\");\n\n function save() {\n const trimmed = draft.trim().toLowerCase();\n if (trimmed === (domain ?? \"\")) {\n setEditing(false);\n return;\n }\n setOrgDomain.mutate(trimmed || null, {\n onSuccess: () => setEditing(false),\n });\n }\n\n return (\n <div className=\"border-t border-border pt-3 space-y-2\">\n <div className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide\">\n Email domain auto-join\n </div>\n <p className=\"text-[11px] text-muted-foreground\">\n Anyone who signs up with an email from this domain can join your\n organization without an invitation.\n </p>\n {!editing ? (\n <div className=\"flex items-center gap-2\">\n {domain ? (\n <>\n <span className=\"inline-flex items-center gap-1.5 rounded-md border border-border bg-background px-2.5 py-1.5 text-sm\">\n <IconAt className=\"h-3.5 w-3.5 text-muted-foreground\" />\n {domain}\n </span>\n <button\n type=\"button\"\n onClick={() => {\n setDraft(domain);\n setEditing(true);\n }}\n className=\"text-muted-foreground hover:text-foreground\"\n title=\"Edit domain\"\n >\n <IconPencil className=\"h-3.5 w-3.5\" />\n </button>\n <button\n type=\"button\"\n disabled={setOrgDomain.isPending}\n onClick={() => setOrgDomain.mutate(null)}\n className=\"text-muted-foreground hover:text-red-500 disabled:opacity-50\"\n title=\"Remove domain\"\n >\n <IconX className=\"h-3.5 w-3.5\" />\n </button>\n </>\n ) : (\n <button\n type=\"button\"\n onClick={() => {\n setDraft(\"\");\n setEditing(true);\n }}\n className=\"flex items-center gap-1.5 rounded-md border border-border px-2.5 py-1.5 text-xs font-medium hover:bg-accent/50\"\n >\n <IconAt className=\"h-3.5 w-3.5\" />\n Set allowed domain\n </button>\n )}\n </div>\n ) : (\n <div className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") save();\n if (e.key === \"Escape\") setEditing(false);\n }}\n placeholder=\"example.com\"\n className=\"rounded-md border border-border bg-background px-2.5 py-1.5 text-sm focus:outline-none focus:ring-1 focus:ring-foreground\"\n autoFocus\n />\n <button\n type=\"button\"\n disabled={setOrgDomain.isPending}\n onClick={save}\n className=\"rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90 disabled:opacity-50\"\n >\n {setOrgDomain.isPending ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n \"Save\"\n )}\n </button>\n <button\n type=\"button\"\n onClick={() => setEditing(false)}\n className=\"rounded-md border border-border px-3 py-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\"\n >\n Cancel\n </button>\n </div>\n )}\n <ErrorText error={setOrgDomain.error} />\n </div>\n );\n}\n\nfunction A2ASecretSection({ secret }: { secret: string | null | undefined }) {\n const setA2ASecret = useSetA2ASecret();\n const syncA2ASecret = useSyncA2ASecret();\n const [revealed, setRevealed] = useState(false);\n const [copied, setCopied] = useState(false);\n const [pasteMode, setPasteMode] = useState(false);\n const [pasteValue, setPasteValue] = useState(\"\");\n const [syncResult, setSyncResult] = useState<SyncA2ASecretResult | null>(\n null,\n );\n\n function copyToClipboard() {\n if (!secret) return;\n navigator.clipboard.writeText(secret).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n }\n\n // Push the current secret to all connected apps. Optionally pass the\n // PREVIOUS secret as `signSecret` so the receiving apps (which still\n // hold the previous value) can verify the JWT.\n function syncToApps(signSecret?: string) {\n setSyncResult(null);\n syncA2ASecret.mutate(signSecret ? { signSecret } : undefined, {\n onSuccess: (result) => {\n setSyncResult(result);\n },\n });\n }\n\n function regenerate() {\n setA2ASecret.mutate(undefined, {\n onSuccess: (result) => {\n setRevealed(false);\n // Auto-sync the new secret to all connected apps. Sign with the\n // PREVIOUS secret (which peers still hold) so verification on\n // their side succeeds and they accept the new value.\n syncToApps(result.previousSecret ?? undefined);\n },\n });\n }\n\n function saveSecret() {\n const trimmed = pasteValue.trim();\n if (!trimmed) return;\n setA2ASecret.mutate(trimmed, {\n onSuccess: (result) => {\n setPasteMode(false);\n setPasteValue(\"\");\n // Same auto-sync flow as regenerate: peers verify with the\n // previous secret, then update to the new pasted value.\n syncToApps(result.previousSecret ?? undefined);\n },\n });\n }\n\n const masked = secret ? \"****\" + secret.slice(-8) : \"Not set\";\n\n return (\n <div className=\"border-t border-border pt-3 space-y-2\">\n <div className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide\">\n Cross-app authentication\n </div>\n <p className=\"text-[11px] text-muted-foreground\">\n This secret authenticates cross-app delegation (e.g. Dispatch to\n Analytics). All apps in your organization need the same secret.\n </p>\n\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"inline-flex items-center gap-1.5 rounded-md border border-border bg-background px-2.5 py-1.5 text-sm font-mono\">\n <IconKey className=\"h-3.5 w-3.5 text-muted-foreground\" />\n {revealed && secret ? secret : masked}\n </span>\n {secret && (\n <>\n <button\n type=\"button\"\n onClick={() => setRevealed(!revealed)}\n className=\"text-muted-foreground hover:text-foreground\"\n title={revealed ? \"Hide secret\" : \"Reveal secret\"}\n >\n {revealed ? (\n <IconEyeOff className=\"h-3.5 w-3.5\" />\n ) : (\n <IconEye className=\"h-3.5 w-3.5\" />\n )}\n </button>\n <button\n type=\"button\"\n onClick={copyToClipboard}\n className=\"text-muted-foreground hover:text-foreground\"\n title=\"Copy secret\"\n >\n {copied ? (\n <IconCheck className=\"h-3.5 w-3.5 text-green-500\" />\n ) : (\n <IconCopy className=\"h-3.5 w-3.5\" />\n )}\n </button>\n </>\n )}\n <button\n type=\"button\"\n onClick={regenerate}\n disabled={setA2ASecret.isPending || syncA2ASecret.isPending}\n className=\"inline-flex items-center gap-1 rounded-md border border-border px-2.5 py-1.5 text-xs font-medium hover:bg-accent/50 disabled:opacity-50\"\n title=\"Regenerate secret and sync to connected apps\"\n >\n {setA2ASecret.isPending ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <IconRefresh className=\"h-3.5 w-3.5\" />\n )}\n Regenerate\n </button>\n {secret && (\n <button\n type=\"button\"\n onClick={() => syncToApps()}\n disabled={setA2ASecret.isPending || syncA2ASecret.isPending}\n className=\"inline-flex items-center gap-1 rounded-md border border-border px-2.5 py-1.5 text-xs font-medium hover:bg-accent/50 disabled:opacity-50\"\n title=\"Push this secret to every connected app\"\n >\n {syncA2ASecret.isPending ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <IconCloudUpload className=\"h-3.5 w-3.5\" />\n )}\n Sync to apps\n </button>\n )}\n </div>\n\n {syncA2ASecret.isPending && (\n <p className=\"text-[11px] text-muted-foreground\">\n Syncing to connected apps…\n </p>\n )}\n\n {syncResult && !syncA2ASecret.isPending && (\n <div className=\"space-y-1\">\n <p className=\"text-[11px] text-muted-foreground\">\n Synced to {syncResult.succeeded}/{syncResult.total} app\n {syncResult.total === 1 ? \"\" : \"s\"}\n {syncResult.failed > 0 ? ` (${syncResult.failed} failed)` : \"\"}.\n </p>\n {syncResult.failed > 0 && (\n <ul className=\"text-[11px] text-red-500 list-disc pl-5 space-y-0.5\">\n {syncResult.results\n .filter((r) => !r.ok)\n .map((r) => (\n <li key={r.id}>\n {r.name}: {r.error || `HTTP ${r.status ?? \"?\"}`}\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n\n {!pasteMode ? (\n <button\n type=\"button\"\n onClick={() => setPasteMode(true)}\n className=\"flex items-center gap-1.5 rounded-md border border-border px-2.5 py-1.5 text-xs font-medium hover:bg-accent/50\"\n >\n <IconKey className=\"h-3.5 w-3.5\" />\n Paste secret from another app\n </button>\n ) : (\n <div className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n value={pasteValue}\n onChange={(e) => setPasteValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") saveSecret();\n if (e.key === \"Escape\") {\n setPasteMode(false);\n setPasteValue(\"\");\n }\n }}\n placeholder=\"Paste A2A secret\"\n className=\"flex-1 rounded-md border border-border bg-background px-2.5 py-1.5 text-sm font-mono focus:outline-none focus:ring-1 focus:ring-foreground\"\n autoFocus\n />\n <button\n type=\"button\"\n disabled={!pasteValue.trim() || setA2ASecret.isPending}\n onClick={saveSecret}\n className=\"rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90 disabled:opacity-50\"\n >\n {setA2ASecret.isPending ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n \"Save\"\n )}\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setPasteMode(false);\n setPasteValue(\"\");\n }}\n className=\"rounded-md border border-border px-3 py-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\"\n >\n Cancel\n </button>\n </div>\n )}\n\n <ErrorText error={setA2ASecret.error} />\n <ErrorText error={syncA2ASecret.error} />\n </div>\n );\n}\n\nconst MIGRATE_FLAG_KEY = \"an_migrate_from_local\";\n\nfunction LocalModeSignInCard() {\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n async function upgradeToAccount() {\n setIsSubmitting(true);\n setError(null);\n try {\n // Remember that we want to migrate data once the user completes sign-in.\n try {\n localStorage.setItem(MIGRATE_FLAG_KEY, \"1\");\n } catch {\n // localStorage may be unavailable (private mode) — migration just\n // won't auto-run. The user can still sign in.\n }\n const res = await fetch(\n agentNativePath(\"/_agent-native/auth/exit-local-mode\"),\n {\n method: \"POST\",\n },\n );\n if (!res.ok) {\n const body = await res.json().catch(() => ({}));\n throw new Error(body?.error || \"Failed to exit local mode\");\n }\n // Reload with ?signin=1 → auth guard will serve the onboarding page so\n // the user can sign in with Google or create an email/password account.\n // The URL flag is used (rather than a cookie) because third-party iframe\n // contexts (e.g. the Builder.io editor) block SameSite=Lax cookies, so a\n // cookie-only signal would be lost on reload. The localStorage flag\n // survives the reload so TeamPage can migrate data automatically once\n // they're back.\n const url = new URL(window.location.href);\n url.searchParams.set(\"signin\", \"1\");\n window.location.href = url.toString();\n } catch (e: any) {\n setError(e?.message || \"Failed to start sign-in\");\n setIsSubmitting(false);\n }\n }\n\n return (\n <section className=\"rounded-lg border border-border bg-card p-6 space-y-4\">\n <p className=\"text-sm text-muted-foreground\">\n Signed in as <code>local@localhost</code>. Create an account to:\n </p>\n <ul className=\"text-sm text-muted-foreground list-disc pl-5 space-y-1\">\n <li>Sync data across devices</li>\n <li>Invite teammates</li>\n <li>Keep your local data — it migrates automatically</li>\n </ul>\n <button\n type=\"button\"\n onClick={upgradeToAccount}\n disabled={isSubmitting}\n className=\"inline-flex items-center gap-2 rounded-md bg-foreground px-3 py-2 text-xs font-medium text-background hover:opacity-90 disabled:opacity-50\"\n >\n {isSubmitting ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <IconLogin className=\"h-3.5 w-3.5\" />\n )}\n Sign in or create account\n </button>\n {error && <ErrorText error={error} />}\n </section>\n );\n}\n\ninterface MigrationState {\n status: \"idle\" | \"running\" | \"done\" | \"error\";\n coreTables: Record<string, number>;\n appKeys: string[];\n error: string | null;\n}\n\nfunction MigrationStatusCard({ state }: { state: MigrationState }) {\n if (state.status === \"idle\") return null;\n\n const movedCore = Object.entries(state.coreTables);\n\n return (\n <section className=\"rounded-lg border border-border bg-card p-6 space-y-3\">\n <div className=\"flex items-center gap-2\">\n {state.status === \"running\" ? (\n <IconLoader2 className=\"h-4 w-4 animate-spin text-muted-foreground\" />\n ) : state.status === \"done\" ? (\n <IconCheck className=\"h-4 w-4 text-green-500\" />\n ) : (\n <IconTrash className=\"h-4 w-4 text-red-500\" />\n )}\n <h3 className=\"text-sm font-medium\">\n {state.status === \"running\"\n ? \"Migrating your local workspace\"\n : state.status === \"done\"\n ? \"Local workspace migrated\"\n : \"Migration incomplete\"}\n </h3>\n </div>\n\n {state.status === \"running\" && (\n <p className=\"text-sm text-muted-foreground\">\n Moving your local SQL data onto this real account. Keep this page open\n while the upgrade finishes.\n </p>\n )}\n\n {state.status === \"done\" && (\n <>\n <p className=\"text-sm text-muted-foreground\">\n Your local workspace has been attached to this account.\n </p>\n {(movedCore.length > 0 || state.appKeys.length > 0) && (\n <div className=\"rounded-md border border-border p-3 text-xs text-muted-foreground space-y-1\">\n {movedCore.map(([table, count]) => (\n <div key={table}>\n {table}: {count} row{count === 1 ? \"\" : \"s\"}\n </div>\n ))}\n {state.appKeys.length > 0 && (\n <div>\n app settings: {state.appKeys.length} key\n {state.appKeys.length === 1 ? \"\" : \"s\"}\n </div>\n )}\n </div>\n )}\n </>\n )}\n\n {state.status === \"error\" && (\n <p className=\"text-sm text-red-500\">\n {state.error || \"We signed you in, but moving local data failed.\"}\n </p>\n )}\n </section>\n );\n}\n\n/**\n * After the user finishes signing in on the onboarding page and lands back on\n * the Team page, pull across any data that was previously scoped to\n * `local@localhost`. Triggered by a localStorage flag set from\n * `LocalModeSignInCard` so we only migrate when the user explicitly opted in.\n */\nfunction useMigrateLocalDataOnSignIn(\n email: string | undefined,\n): MigrationState {\n const [state, setState] = useState<MigrationState>({\n status: \"idle\",\n coreTables: {},\n appKeys: [],\n error: null,\n });\n\n useEffect(() => {\n if (!email || email === DEV_MODE_USER_EMAIL) return;\n let flag: string | null = null;\n try {\n flag = localStorage.getItem(MIGRATE_FLAG_KEY);\n } catch {\n return;\n }\n if (!flag) return;\n // Clear the flag immediately so a failed request doesn't loop.\n try {\n localStorage.removeItem(MIGRATE_FLAG_KEY);\n } catch {\n // ignore\n }\n let cancelled = false;\n\n (async () => {\n setState({\n status: \"running\",\n coreTables: {},\n appKeys: [],\n error: null,\n });\n\n try {\n const coreRes = await fetch(\n agentNativePath(\"/_agent-native/auth/migrate-local-data\"),\n {\n method: \"POST\",\n credentials: \"include\",\n },\n );\n const coreBody = await coreRes.json().catch(() => ({}));\n if (!coreRes.ok) {\n throw new Error(\n coreBody?.error || \"Failed to migrate local framework data\",\n );\n }\n\n let appKeys: string[] = [];\n try {\n const appRes = await fetch(`${appBasePath()}/api/local-migration`, {\n method: \"POST\",\n credentials: \"include\",\n });\n if (appRes.ok) {\n const appBody = await appRes.json().catch(() => ({}));\n appKeys = Array.isArray(appBody?.keys) ? appBody.keys : [];\n } else if (appRes.status !== 404) {\n const appBody = await appRes.json().catch(() => ({}));\n throw new Error(appBody?.error || \"App-specific migration failed\");\n }\n } catch (err: any) {\n if (!/404/.test(String(err?.message ?? \"\"))) throw err;\n }\n\n if (!cancelled) {\n setState({\n status: \"done\",\n coreTables:\n typeof coreBody?.tables === \"object\" && coreBody.tables\n ? coreBody.tables\n : {},\n appKeys,\n error: null,\n });\n }\n } catch (err: any) {\n if (!cancelled) {\n setState({\n status: \"error\",\n coreTables: {},\n appKeys: [],\n error: err?.message || \"Migration failed\",\n });\n }\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [email]);\n\n return state;\n}\n\n/**\n * Default Team management page. Templates can route directly to this component\n * or wrap it with their own Layout via the `layout` prop.\n */\nexport function TeamPage({\n layout,\n title = \"Team\",\n createOrgDescription,\n className,\n}: TeamPageProps) {\n const { data: org, isLoading } = useOrg();\n const migration = useMigrateLocalDataOnSignIn(org?.email);\n const isMigrating = migration.status === \"running\";\n\n const content = (\n <div className={`space-y-6 max-w-2xl ${className ?? \"\"}`}>\n <h2 className=\"text-2xl font-bold tracking-tight\">{title}</h2>\n\n {isLoading && (\n <section className=\"rounded-lg border border-border bg-card p-6\">\n <div className=\"text-sm text-muted-foreground\">Loading…</div>\n </section>\n )}\n\n {!isLoading && org?.email === DEV_MODE_USER_EMAIL && (\n <LocalModeSignInCard />\n )}\n\n {!isLoading && org?.email !== DEV_MODE_USER_EMAIL && (\n <MigrationStatusCard state={migration} />\n )}\n\n {!isLoading && org?.email !== DEV_MODE_USER_EMAIL && !isMigrating && (\n <>\n <PendingInvitationsCard />\n {!org?.orgId ? (\n <>\n {org?.domainMatches && org.domainMatches.length > 0 && (\n <JoinByDomainCard matches={org.domainMatches} />\n )}\n <CreateOrgCard description={createOrgDescription} />\n </>\n ) : (\n <MembersCard />\n )}\n </>\n )}\n </div>\n );\n\n return layout ? <>{layout(content)}</> : content;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsPanel.d.ts","sourceRoot":"","sources":["../../../src/client/settings/SettingsPanel.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SettingsPanel.d.ts","sourceRoot":"","sources":["../../../src/client/settings/SettingsPanel.tsx"],"names":[],"mappings":"AAs7CA,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAeD,wBAAgB,aAAa,CAAC,EAC5B,SAAS,EACT,eAAe,EACf,aAAa,EACb,SAAS,GACV,EAAE,kBAAkB,2CAmSpB"}
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
2
2
|
import { agentNativePath } from "../api-path.js";
|
|
3
3
|
import { Suspense, lazy, useState, useEffect, useCallback, useRef, } from "react";
|
|
4
4
|
import * as SelectPrimitive from "@radix-ui/react-select";
|
|
5
|
-
import { IconChevronDown, IconCheck, IconExternalLink, IconBrain, IconBrowser, IconGitBranch, IconCloud, IconDatabase, IconShield, IconPlugConnected, IconTopologyRing2, IconLoader2, IconUpload, IconCoin, IconMail, IconKey, IconMicrophone, IconBolt, } from "@tabler/icons-react";
|
|
5
|
+
import { IconChevronDown, IconCheck, IconExternalLink, IconBrain, IconBrowser, IconGitBranch, IconCloud, IconDatabase, IconShield, IconPlugConnected, IconTopologyRing2, IconLoader2, IconUpload, IconCoin, IconMail, IconKey, IconMicrophone, IconBolt, IconGauge, } from "@tabler/icons-react";
|
|
6
6
|
import { SettingsSection } from "./SettingsSection.js";
|
|
7
7
|
import { useBuilderStatus } from "./useBuilderStatus.js";
|
|
8
8
|
import { BuilderBMark } from "../builder-mark.js";
|
|
@@ -39,9 +39,15 @@ function SettingsSelect({ label, labelAdornment, value, options, onValueChange,
|
|
|
39
39
|
// refresh inline (no hard reload — that was racing with nitro's env-runner
|
|
40
40
|
// restart and hitting React Router's error boundary).
|
|
41
41
|
function DisconnectBuilderButton() {
|
|
42
|
+
const { status } = useBuilderStatus();
|
|
42
43
|
const [phase, setPhase] = useState("idle");
|
|
43
44
|
const [err, setErr] = useState(null);
|
|
44
45
|
const armedTimerRef = useRef(null);
|
|
46
|
+
// Env-managed: Builder identity comes from the deploy-level
|
|
47
|
+
// BUILDER_PRIVATE_KEY. Disconnection is operator-controlled (rotate / unset
|
|
48
|
+
// the env var); the per-user disconnect endpoint refuses with 409.
|
|
49
|
+
if (status?.envManaged)
|
|
50
|
+
return null;
|
|
45
51
|
const clearArmedTimer = useCallback(() => {
|
|
46
52
|
if (armedTimerRef.current) {
|
|
47
53
|
clearTimeout(armedTimerRef.current);
|
|
@@ -121,9 +127,11 @@ function DisconnectBuilderButton() {
|
|
|
121
127
|
}
|
|
122
128
|
// ─── "Connect Builder.io" card (shared across all sections) ─────────────────
|
|
123
129
|
function UseBuilderCard({ connectUrl, connected, orgName, label = "Connect Builder.io", subtitle = "One click, no API key needed.", dim, }) {
|
|
130
|
+
const { status } = useBuilderStatus();
|
|
131
|
+
const envManaged = !!status?.envManaged;
|
|
124
132
|
const bgClass = dim ? "" : "bg-accent/30";
|
|
125
133
|
if (connected) {
|
|
126
|
-
return (_jsxs("div", { className: `rounded-md border border-border px-2.5 py-2 ${bgClass}`, children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("div", { className: "text-[11px] font-medium text-foreground", children: "Builder.io" }), _jsxs("span", { className: "flex items-center gap-1 text-[10px] text-green-500", children: [_jsx(IconCheck, { size: 10 }), "Connected"] })] }), orgName && (_jsx("p", { className: "text-[10px] text-muted-foreground mt-0.5", children: orgName })), _jsxs("div", { className: "flex items-center gap-2 mt-2.5", children: [connectUrl && (_jsxs("a", { href: connectUrl, target: "_blank", rel: "noopener noreferrer", className: "inline-flex items-center gap-1 rounded border border-border px-2 py-0.5 text-[10px] no-underline text-muted-foreground hover:text-foreground hover:bg-accent/40", children: ["Reconnect", _jsx(IconExternalLink, { size: 10 })] })), _jsx(DisconnectBuilderButton, {})] })] }));
|
|
134
|
+
return (_jsxs("div", { className: `rounded-md border border-border px-2.5 py-2 ${bgClass}`, children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("div", { className: "text-[11px] font-medium text-foreground", children: "Builder.io" }), _jsxs("span", { className: "flex items-center gap-1 text-[10px] text-green-500", children: [_jsx(IconCheck, { size: 10 }), "Connected"] })] }), orgName && (_jsx("p", { className: "text-[10px] text-muted-foreground mt-0.5", children: orgName })), envManaged ? (_jsx("p", { className: "text-[10px] text-muted-foreground mt-1", children: "Managed by deployment \u2014 applied to all users of this app." })) : (_jsxs("div", { className: "flex items-center gap-2 mt-2.5", children: [connectUrl && (_jsxs("a", { href: connectUrl, target: "_blank", rel: "noopener noreferrer", className: "inline-flex items-center gap-1 rounded border border-border px-2 py-0.5 text-[10px] no-underline text-muted-foreground hover:text-foreground hover:bg-accent/40", children: ["Reconnect", _jsx(IconExternalLink, { size: 10 })] })), _jsx(DisconnectBuilderButton, {})] }))] }));
|
|
127
135
|
}
|
|
128
136
|
if (!connectUrl)
|
|
129
137
|
return null;
|
|
@@ -426,7 +434,7 @@ function EmailSectionInner({ open, onToggle, }) {
|
|
|
426
434
|
const [fromAddr, setFromAddr] = useState("");
|
|
427
435
|
const [saving, setSaving] = useState(false);
|
|
428
436
|
const [saved, setSaved] = useState(false);
|
|
429
|
-
const [
|
|
437
|
+
const [emailProvider, setEmailProvider] = useState("resend");
|
|
430
438
|
const [envLoaded, setEnvLoaded] = useState(false);
|
|
431
439
|
useEffect(() => {
|
|
432
440
|
fetch(agentNativePath("/_agent-native/env-status"))
|
|
@@ -439,6 +447,11 @@ function EmailSectionInner({ open, onToggle, }) {
|
|
|
439
447
|
const sendgridConfigured = envKeys.find((k) => k.key === "SENDGRID_API_KEY")?.configured ?? false;
|
|
440
448
|
const fromConfigured = envKeys.find((k) => k.key === "EMAIL_FROM")?.configured ?? false;
|
|
441
449
|
const anyConfigured = resendConfigured || sendgridConfigured;
|
|
450
|
+
useEffect(() => {
|
|
451
|
+
if (sendgridConfigured && !resendConfigured) {
|
|
452
|
+
setEmailProvider("sendgrid");
|
|
453
|
+
}
|
|
454
|
+
}, [resendConfigured, sendgridConfigured]);
|
|
442
455
|
const save = async (vars) => {
|
|
443
456
|
setSaving(true);
|
|
444
457
|
try {
|
|
@@ -477,16 +490,134 @@ function EmailSectionInner({ open, onToggle, }) {
|
|
|
477
490
|
if (vars.length)
|
|
478
491
|
save(vars);
|
|
479
492
|
};
|
|
480
|
-
return (_jsx(SettingsSection, { icon: _jsx(IconMail, { size: 14 }), title: "Email", subtitle: "
|
|
493
|
+
return (_jsx(SettingsSection, { icon: _jsx(IconMail, { size: 14 }), title: "Email", subtitle: "Needed before deploy for password resets, team invitations, and share notifications. Local development can run without it.", connected: !envLoaded ? undefined : anyConfigured, open: open, onToggle: onToggle, children: !envLoaded ? (_jsx(SettingsSkeleton, { lines: 2 })) : (_jsxs("div", { className: "space-y-2", children: [_jsxs("label", { className: "block space-y-1", children: [_jsx("span", { className: "text-[10px] uppercase tracking-wide text-muted-foreground", children: "Provider" }), _jsxs("select", { value: emailProvider, onChange: (e) => setEmailProvider(e.target.value), className: "w-full rounded border border-border bg-background px-2 py-1 text-[11px] text-foreground outline-none focus:ring-1 focus:ring-accent", children: [_jsx("option", { value: "resend", children: "Resend" }), _jsx("option", { value: "sendgrid", children: "SendGrid" })] })] }), emailProvider === "resend" ? (_jsxs(ManualSetupCard, { hint: "Use Resend for transactional email.", docsUrl: "https://resend.com/api-keys", docsLabel: "Get a Resend key", children: [resendConfigured ? (_jsxs("div", { className: "mb-1 flex items-center gap-1.5 text-[10px] text-green-500", children: [_jsx(IconCheck, { size: 10 }), "RESEND_API_KEY configured"] })) : (_jsxs("div", { className: "mb-1 flex gap-1.5", children: [_jsx("input", { type: "password", value: resendKey, onChange: (e) => setResendKey(e.target.value), onKeyDown: (e) => {
|
|
481
494
|
if (e.key === "Enter")
|
|
482
495
|
saveResend();
|
|
483
496
|
}, placeholder: "re_...", className: "flex-1 rounded border border-border bg-background px-2 py-1 text-[11px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent" }), _jsx("button", { onClick: saveResend, disabled: !resendKey.trim() || saving, className: "rounded bg-accent px-2 py-1 text-[10px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40", children: saving ? (_jsx(IconLoader2, { size: 10, className: "animate-spin" })) : saved ? (_jsx(IconCheck, { size: 10 })) : ("Save") })] })), fromConfigured ? (_jsxs("div", { className: "flex items-center gap-1.5 text-[10px] text-green-500", children: [_jsx(IconCheck, { size: 10 }), "EMAIL_FROM configured"] })) : (_jsxs("div", { className: "flex gap-1.5", children: [_jsx("input", { type: "text", value: fromAddr, onChange: (e) => setFromAddr(e.target.value), onKeyDown: (e) => {
|
|
484
497
|
if (e.key === "Enter")
|
|
485
498
|
saveResend();
|
|
486
|
-
}, placeholder: "From address
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
499
|
+
}, placeholder: "From address - e.g. Acme <hi@acme.com>", className: "flex-1 rounded border border-border bg-background px-2 py-1 text-[11px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent" }), !resendConfigured ? null : (_jsx("button", { onClick: saveResend, disabled: !fromAddr.trim() || saving, className: "rounded bg-accent px-2 py-1 text-[10px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40", children: saving ? (_jsx(IconLoader2, { size: 10, className: "animate-spin" })) : saved ? (_jsx(IconCheck, { size: 10 })) : ("Save") }))] }))] })) : (_jsxs(ManualSetupCard, { hint: "Use SendGrid for transactional email. SendGrid requires a verified from address.", docsUrl: "https://app.sendgrid.com/settings/api_keys", docsLabel: "Get a SendGrid key", children: [sendgridConfigured ? (_jsxs("div", { className: "mb-1 flex items-center gap-1.5 text-[10px] text-green-500", children: [_jsx(IconCheck, { size: 10 }), "SENDGRID_API_KEY configured"] })) : (_jsxs("div", { className: "mb-1 flex gap-1.5", children: [_jsx("input", { type: "password", value: sendgridKey, onChange: (e) => setSendgridKey(e.target.value), onKeyDown: (e) => {
|
|
500
|
+
if (e.key === "Enter")
|
|
501
|
+
saveSendgrid();
|
|
502
|
+
}, placeholder: "SG....", className: "flex-1 rounded border border-border bg-background px-2 py-1 text-[11px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent" }), _jsx("button", { onClick: saveSendgrid, disabled: !sendgridKey.trim() || saving, className: "rounded bg-accent px-2 py-1 text-[10px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40", children: saving ? (_jsx(IconLoader2, { size: 10, className: "animate-spin" })) : saved ? (_jsx(IconCheck, { size: 10 })) : ("Save") })] })), fromConfigured ? (_jsxs("div", { className: "flex items-center gap-1.5 text-[10px] text-green-500", children: [_jsx(IconCheck, { size: 10 }), "EMAIL_FROM configured"] })) : (_jsxs("div", { className: "flex gap-1.5", children: [_jsx("input", { type: "text", value: fromAddr, onChange: (e) => setFromAddr(e.target.value), onKeyDown: (e) => {
|
|
503
|
+
if (e.key === "Enter")
|
|
504
|
+
saveSendgrid();
|
|
505
|
+
}, placeholder: "From address - e.g. Acme <hi@acme.com>", className: "flex-1 rounded border border-border bg-background px-2 py-1 text-[11px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent" }), !sendgridConfigured ? null : (_jsx("button", { onClick: saveSendgrid, disabled: !fromAddr.trim() || saving, className: "rounded bg-accent px-2 py-1 text-[10px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40", children: saving ? (_jsx(IconLoader2, { size: 10, className: "animate-spin" })) : saved ? (_jsx(IconCheck, { size: 10 })) : ("Save") }))] }))] }))] })) }));
|
|
506
|
+
}
|
|
507
|
+
function AgentLimitsSectionInner({ open, onToggle, }) {
|
|
508
|
+
const [settings, setSettings] = useState(null);
|
|
509
|
+
const [value, setValue] = useState("");
|
|
510
|
+
const [loading, setLoading] = useState(true);
|
|
511
|
+
const [saving, setSaving] = useState(false);
|
|
512
|
+
const [saved, setSaved] = useState(false);
|
|
513
|
+
const [error, setError] = useState(null);
|
|
514
|
+
const load = useCallback(() => {
|
|
515
|
+
let cancelled = false;
|
|
516
|
+
setLoading(true);
|
|
517
|
+
fetch(agentNativePath("/_agent-native/agent-loop-settings"))
|
|
518
|
+
.then((r) => (r.ok ? r.json() : null))
|
|
519
|
+
.then((data) => {
|
|
520
|
+
if (cancelled || !data)
|
|
521
|
+
return;
|
|
522
|
+
setSettings(data);
|
|
523
|
+
setValue(String(data.maxIterations));
|
|
524
|
+
})
|
|
525
|
+
.catch(() => { })
|
|
526
|
+
.finally(() => {
|
|
527
|
+
if (!cancelled)
|
|
528
|
+
setLoading(false);
|
|
529
|
+
});
|
|
530
|
+
return () => {
|
|
531
|
+
cancelled = true;
|
|
532
|
+
};
|
|
533
|
+
}, []);
|
|
534
|
+
useEffect(() => load(), [load]);
|
|
535
|
+
useEffect(() => {
|
|
536
|
+
const handler = (event) => {
|
|
537
|
+
const detail = event.detail;
|
|
538
|
+
if (!detail?.maxIterations)
|
|
539
|
+
return;
|
|
540
|
+
setSettings(detail);
|
|
541
|
+
setValue(String(detail.maxIterations));
|
|
542
|
+
};
|
|
543
|
+
window.addEventListener("agent-loop-settings:changed", handler);
|
|
544
|
+
return () => window.removeEventListener("agent-loop-settings:changed", handler);
|
|
545
|
+
}, []);
|
|
546
|
+
const numericValue = Number(value);
|
|
547
|
+
const hasPendingChange = !!settings &&
|
|
548
|
+
settings.canUpdate &&
|
|
549
|
+
Number.isInteger(numericValue) &&
|
|
550
|
+
numericValue !== settings.maxIterations;
|
|
551
|
+
const scopeLabel = settings?.scope === "org"
|
|
552
|
+
? settings.orgName
|
|
553
|
+
? `${settings.orgName} organization`
|
|
554
|
+
: "organization"
|
|
555
|
+
: "your account";
|
|
556
|
+
const save = async () => {
|
|
557
|
+
if (!settings?.canUpdate)
|
|
558
|
+
return;
|
|
559
|
+
setSaving(true);
|
|
560
|
+
setSaved(false);
|
|
561
|
+
setError(null);
|
|
562
|
+
try {
|
|
563
|
+
const res = await fetch(agentNativePath("/_agent-native/agent-loop-settings"), {
|
|
564
|
+
method: "PUT",
|
|
565
|
+
headers: { "Content-Type": "application/json" },
|
|
566
|
+
body: JSON.stringify({ maxIterations: numericValue }),
|
|
567
|
+
});
|
|
568
|
+
const body = await res.json().catch(() => ({}));
|
|
569
|
+
if (!res.ok) {
|
|
570
|
+
throw new Error(body?.error ?? `Save failed (${res.status})`);
|
|
571
|
+
}
|
|
572
|
+
setSettings(body);
|
|
573
|
+
setValue(String(body.maxIterations));
|
|
574
|
+
setSaved(true);
|
|
575
|
+
window.dispatchEvent(new CustomEvent("agent-loop-settings:changed", { detail: body }));
|
|
576
|
+
setTimeout(() => setSaved(false), 2000);
|
|
577
|
+
}
|
|
578
|
+
catch (err) {
|
|
579
|
+
setError(err instanceof Error ? err.message : "Save failed");
|
|
580
|
+
}
|
|
581
|
+
finally {
|
|
582
|
+
setSaving(false);
|
|
583
|
+
}
|
|
584
|
+
};
|
|
585
|
+
const reset = async () => {
|
|
586
|
+
if (!settings?.canUpdate)
|
|
587
|
+
return;
|
|
588
|
+
setSaving(true);
|
|
589
|
+
setSaved(false);
|
|
590
|
+
setError(null);
|
|
591
|
+
try {
|
|
592
|
+
const res = await fetch(agentNativePath("/_agent-native/agent-loop-settings"), { method: "DELETE" });
|
|
593
|
+
const body = await res.json().catch(() => ({}));
|
|
594
|
+
if (!res.ok) {
|
|
595
|
+
throw new Error(body?.error ?? `Reset failed (${res.status})`);
|
|
596
|
+
}
|
|
597
|
+
setSettings(body);
|
|
598
|
+
setValue(String(body.maxIterations));
|
|
599
|
+
window.dispatchEvent(new CustomEvent("agent-loop-settings:changed", { detail: body }));
|
|
600
|
+
}
|
|
601
|
+
catch (err) {
|
|
602
|
+
setError(err instanceof Error ? err.message : "Reset failed");
|
|
603
|
+
}
|
|
604
|
+
finally {
|
|
605
|
+
setSaving(false);
|
|
606
|
+
}
|
|
607
|
+
};
|
|
608
|
+
return (_jsx(SettingsSection, { icon: _jsx(IconGauge, { size: 14 }), title: "Agent Limits", subtitle: "Control how long a single agent response can work before pausing.", connected: loading
|
|
609
|
+
? undefined
|
|
610
|
+
: settings
|
|
611
|
+
? settings.maxIterations !== settings.defaultMaxIterations
|
|
612
|
+
: false, open: open, onToggle: onToggle, children: loading ? (_jsx(SettingsSkeleton, { lines: 2 })) : settings ? (_jsx("div", { className: "space-y-2", children: _jsxs("div", { className: "rounded-md border border-border px-2.5 py-2 bg-accent/20", children: [_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsxs("div", { children: [_jsx("p", { className: "text-[11px] font-medium text-foreground", children: "Max iterations" }), _jsxs("p", { className: "mt-0.5 text-[10px] text-muted-foreground", children: ["Applies to ", scopeLabel, ". Default is", " ", settings.defaultMaxIterations.toLocaleString(), "."] })] }), _jsx("span", { className: "rounded-full bg-background px-2 py-0.5 text-[10px] font-medium text-muted-foreground", children: settings.source })] }), _jsxs("div", { className: "mt-2 flex items-center gap-1.5", children: [_jsx("input", { type: "number", min: settings.minMaxIterations, max: settings.maxMaxIterations, value: value, disabled: !settings.canUpdate || saving, onChange: (e) => {
|
|
613
|
+
setValue(e.target.value);
|
|
614
|
+
setError(null);
|
|
615
|
+
}, onKeyDown: (e) => {
|
|
616
|
+
if (e.key === "Enter" && hasPendingChange)
|
|
617
|
+
void save();
|
|
618
|
+
}, className: "h-8 min-w-0 flex-1 rounded border border-border bg-background px-2 text-[11px] text-foreground outline-none focus:ring-1 focus:ring-accent disabled:opacity-60" }), _jsx("button", { type: "button", onClick: save, disabled: !hasPendingChange || saving, className: "inline-flex h-8 items-center gap-1 rounded bg-accent px-2.5 text-[10px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40", children: saving ? (_jsx(IconLoader2, { size: 10, className: "animate-spin" })) : saved ? (_jsx(IconCheck, { size: 10 })) : ("Save") }), _jsx("button", { type: "button", onClick: reset, disabled: !settings.canUpdate ||
|
|
619
|
+
saving ||
|
|
620
|
+
settings.maxIterations === settings.defaultMaxIterations, className: "h-8 rounded border border-border px-2.5 text-[10px] font-medium text-muted-foreground hover:bg-accent/40 hover:text-foreground disabled:opacity-40", children: "Reset" })] }), !settings.canUpdate && (_jsx("p", { className: "mt-2 text-[10px] text-muted-foreground", children: "Only organization owners and admins can change this limit." })), error && (_jsx("p", { className: "mt-2 text-[10px] text-destructive", children: error }))] }) })) : (_jsx("p", { className: "text-[10px] text-muted-foreground", children: "Agent limit settings are unavailable." })) }));
|
|
490
621
|
}
|
|
491
622
|
const environmentOptions = [
|
|
492
623
|
{
|
|
@@ -523,6 +654,11 @@ export function SettingsPanel({ isDevMode, onToggleDevMode, showDevToggle, devAp
|
|
|
523
654
|
const key = hash.slice("secrets:".length);
|
|
524
655
|
setFocusSecretKey(key || undefined);
|
|
525
656
|
}
|
|
657
|
+
else if (hash === "agent-limits" ||
|
|
658
|
+
hash === "limits" ||
|
|
659
|
+
hash === "loop-settings") {
|
|
660
|
+
setOpenSection("limits");
|
|
661
|
+
}
|
|
526
662
|
};
|
|
527
663
|
handleHash();
|
|
528
664
|
window.addEventListener("hashchange", handleHash);
|
|
@@ -532,6 +668,6 @@ export function SettingsPanel({ isDevMode, onToggleDevMode, showDevToggle, devAp
|
|
|
532
668
|
const nextIsDev = next === "development";
|
|
533
669
|
if (nextIsDev !== isDevMode)
|
|
534
670
|
onToggleDevMode();
|
|
535
|
-
} })) })), _jsx(LLMSectionInner, { builderLoading: builderLoading, connectUrl: connectUrl, connected: connected, orgName: orgName, open: openSection === "llm", onToggle: () => toggle("llm") }), _jsx(SettingsSection, { icon: _jsx(IconMicrophone, { size: 14 }), title: "Voice Transcription", subtitle: "How the composer microphone turns your voice into text.", open: openSection === "voice", onToggle: () => toggle("voice"), children: _jsx(VoiceTranscriptionSection, {}) }), _jsx(SettingsSection, { icon: _jsx(IconBolt, { size: 14 }), title: "Automations", subtitle: "Event-triggered and scheduled automations.", open: openSection === "automations", onToggle: () => toggle("automations"), children: _jsx(AutomationsSection, {}) }), _jsx(SettingsSection, { icon: _jsx(IconKey, { size: 14 }), title: "API Keys & Connections", subtitle: "Service credentials and automation keys.", open: openSection === "secrets", onToggle: () => toggle("secrets"), children: _jsx(SecretsSection, { focusKey: focusSecretKey }) }), _jsx(SettingsSection, { icon: _jsx(IconCloud, { size: 14 }), title: "Hosting", subtitle: "Deploy your app to the cloud.", connected: connected, open: openSection === "hosting", onToggle: () => toggle("hosting"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { connectUrl: connectUrl, connected: connected, orgName: orgName }), _jsx(ManualSetupCard, { hint: "Deploy manually to Netlify, Vercel, Cloudflare, or any Nitro-supported target.", docsUrl: "https://www.builder.io/c/docs/agent-native-deployment", dim: connected })] }) }), _jsx(SettingsSection, { icon: _jsx(IconDatabase, { size: 14 }), title: "Database", subtitle: "Connect a cloud database for persistent storage.", connected: connected, open: openSection === "database", onToggle: () => toggle("database"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { connectUrl: connectUrl, connected: connected, orgName: orgName }), _jsx(ManualSetupCard, { hint: "Set DATABASE_URL in your .env to connect Neon, Supabase, Turso, or any Postgres/SQLite database.", docsUrl: "https://www.builder.io/c/docs/agent-native-database", dim: connected })] }) }), _jsx(SettingsSection, { icon: _jsx(IconUpload, { size: 14 }), title: "File uploads", subtitle: "Where user-uploaded files (avatars, chat attachments) are stored.", connected: connected, open: openSection === "uploads", onToggle: () => toggle("uploads"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { connectUrl: connectUrl, connected: connected, orgName: orgName }), _jsx(ManualSetupCard, { hint: "Without a provider, files are stored as base64 in your database. Fine for dev, not recommended for production.", docsUrl: "https://www.builder.io/c/docs/agent-native-file-uploads", dim: connected })] }) }), _jsx(SettingsSection, { icon: _jsx(IconShield, { size: 14 }), title: "Authentication", subtitle: "Set up user authentication and access control.", connected: connected, open: openSection === "auth", onToggle: () => toggle("auth"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { connectUrl: connectUrl, connected: connected, orgName: orgName }), _jsx(ManualSetupCard, { hint: "Configure Better Auth with BETTER_AUTH_SECRET and optional Google/GitHub OAuth providers.", docsUrl: "https://www.builder.io/c/docs/agent-native-authentication", dim: connected })] }) }), _jsx(EmailSectionInner, { open: openSection === "email", onToggle: () => toggle("email") }), _jsx(SettingsSection, { icon: _jsx(IconBrowser, { size: 14 }), title: "Browser Automation", subtitle: "Let agents control a real browser for web tasks.", connected: connected, open: openSection === "browser", onToggle: () => toggle("browser"), children: _jsx(UseBuilderCard, { connectUrl: connectUrl, connected: connected, orgName: orgName }) }), _jsx(SettingsSection, { icon: _jsx(IconGitBranch, { size: 14 }), title: "Background Agent", subtitle: "Make code changes from production mode via Builder.", connected: connected, open: openSection === "background", onToggle: () => toggle("background"), children: _jsx(UseBuilderCard, { connectUrl: connectUrl, connected: connected, orgName: orgName }) }), _jsx(SettingsSection, { icon: _jsx(IconPlugConnected, { size: 14 }), title: "Integrations", subtitle: "Connect messaging platforms and external services.", open: openSection === "integrations", onToggle: () => toggle("integrations"), children: _jsx(Suspense, { fallback: null, children: _jsx(IntegrationsPanel, {}) }) }), _jsx(SettingsSection, { icon: _jsx(IconCoin, { size: 14 }), title: "Usage", subtitle: "Track token consumption and estimated cost \u2014 broken down by chat, automations, and background jobs.", open: openSection === "usage", onToggle: () => toggle("usage"), children: _jsx(UsageSection, {}) }), _jsx(SettingsSection, { icon: _jsx(IconTopologyRing2, { size: 14 }), title: "Connected Agents (A2A)", subtitle: "Manage remote agents connected via the A2A protocol.", open: openSection === "a2a", onToggle: () => toggle("a2a"), children: _jsx(AgentsSection, {}) })] }));
|
|
671
|
+
} })) })), _jsx(LLMSectionInner, { builderLoading: builderLoading, connectUrl: connectUrl, connected: connected, orgName: orgName, open: openSection === "llm", onToggle: () => toggle("llm") }), _jsx(AgentLimitsSectionInner, { open: openSection === "limits", onToggle: () => toggle("limits") }), _jsx(SettingsSection, { icon: _jsx(IconMicrophone, { size: 14 }), title: "Voice Transcription", subtitle: "How the composer microphone turns your voice into text.", open: openSection === "voice", onToggle: () => toggle("voice"), children: _jsx(VoiceTranscriptionSection, {}) }), _jsx(SettingsSection, { icon: _jsx(IconBolt, { size: 14 }), title: "Automations", subtitle: "Event-triggered and scheduled automations.", open: openSection === "automations", onToggle: () => toggle("automations"), children: _jsx(AutomationsSection, {}) }), _jsx(SettingsSection, { icon: _jsx(IconKey, { size: 14 }), title: "API Keys & Connections", subtitle: "Service credentials and automation keys.", open: openSection === "secrets", onToggle: () => toggle("secrets"), children: _jsx(SecretsSection, { focusKey: focusSecretKey }) }), _jsx(SettingsSection, { icon: _jsx(IconCloud, { size: 14 }), title: "Hosting", subtitle: "Deploy your app to the cloud.", connected: connected, open: openSection === "hosting", onToggle: () => toggle("hosting"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { connectUrl: connectUrl, connected: connected, orgName: orgName }), _jsx(ManualSetupCard, { hint: "Deploy manually to Netlify, Vercel, Cloudflare, or any Nitro-supported target.", docsUrl: "https://www.builder.io/c/docs/agent-native-deployment", dim: connected })] }) }), _jsx(SettingsSection, { icon: _jsx(IconDatabase, { size: 14 }), title: "Database", subtitle: "Connect a cloud database for persistent storage.", connected: connected, open: openSection === "database", onToggle: () => toggle("database"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { connectUrl: connectUrl, connected: connected, orgName: orgName }), _jsx(ManualSetupCard, { hint: "Set DATABASE_URL in your .env to connect Neon, Supabase, Turso, or any Postgres/SQLite database.", docsUrl: "https://www.builder.io/c/docs/agent-native-database", dim: connected })] }) }), _jsx(SettingsSection, { icon: _jsx(IconUpload, { size: 14 }), title: "File uploads", subtitle: "Where user-uploaded files (avatars, chat attachments) are stored.", connected: connected, open: openSection === "uploads", onToggle: () => toggle("uploads"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { connectUrl: connectUrl, connected: connected, orgName: orgName }), _jsx(ManualSetupCard, { hint: "Without a provider, files are stored as base64 in your database. Fine for dev, not recommended for production.", docsUrl: "https://www.builder.io/c/docs/agent-native-file-uploads", dim: connected })] }) }), _jsx(SettingsSection, { icon: _jsx(IconShield, { size: 14 }), title: "Authentication", subtitle: "Set up user authentication and access control.", connected: connected, open: openSection === "auth", onToggle: () => toggle("auth"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { connectUrl: connectUrl, connected: connected, orgName: orgName }), _jsx(ManualSetupCard, { hint: "Configure Better Auth with BETTER_AUTH_SECRET and optional Google/GitHub OAuth providers.", docsUrl: "https://www.builder.io/c/docs/agent-native-authentication", dim: connected })] }) }), _jsx(EmailSectionInner, { open: openSection === "email", onToggle: () => toggle("email") }), _jsx(SettingsSection, { icon: _jsx(IconBrowser, { size: 14 }), title: "Browser Automation", subtitle: "Let agents control a real browser for web tasks.", connected: connected, open: openSection === "browser", onToggle: () => toggle("browser"), children: _jsx(UseBuilderCard, { connectUrl: connectUrl, connected: connected, orgName: orgName }) }), _jsx(SettingsSection, { icon: _jsx(IconGitBranch, { size: 14 }), title: "Background Agent", subtitle: "Make code changes from production mode via Builder.", connected: connected, open: openSection === "background", onToggle: () => toggle("background"), children: _jsx(UseBuilderCard, { connectUrl: connectUrl, connected: connected, orgName: orgName }) }), _jsx(SettingsSection, { icon: _jsx(IconPlugConnected, { size: 14 }), title: "Integrations", subtitle: "Connect messaging platforms and external services.", open: openSection === "integrations", onToggle: () => toggle("integrations"), children: _jsx(Suspense, { fallback: null, children: _jsx(IntegrationsPanel, {}) }) }), _jsx(SettingsSection, { icon: _jsx(IconCoin, { size: 14 }), title: "Usage", subtitle: "Track token consumption and estimated cost \u2014 broken down by chat, automations, and background jobs.", open: openSection === "usage", onToggle: () => toggle("usage"), children: _jsx(UsageSection, {}) }), _jsx(SettingsSection, { icon: _jsx(IconTopologyRing2, { size: 14 }), title: "Connected Agents (A2A)", subtitle: "Manage remote agents connected via the A2A protocol.", open: openSection === "a2a", onToggle: () => toggle("a2a"), children: _jsx(AgentsSection, {}) })] }));
|
|
536
672
|
}
|
|
537
673
|
//# sourceMappingURL=SettingsPanel.js.map
|